8#ifndef OPENSUBDIV3_OSD_MESH_H
9#define OPENSUBDIV3_OSD_MESH_H
11#include "../version.h"
25struct ID3D11DeviceContext;
28namespace OPENSUBDIV_VERSION {
50template <
class PATCH_TABLE>
66 int startVertex,
int numVerts) = 0;
69 int startVertex,
int numVerts) = 0;
85 int level,
bool adaptive,
86 bool singleCreasePatch) {
121template <
typename STENCIL_TABLE,
typename SRC_STENCIL_TABLE,
122 typename DEVICE_CONTEXT>
125 SRC_STENCIL_TABLE
const *table, DEVICE_CONTEXT *context) {
126 if (! table)
return NULL;
127 return STENCIL_TABLE::Create(table, context);
136 if (! table)
return NULL;
146 if (! table)
return NULL;
156 if (! table)
return NULL;
168template <
typename EVALUATOR>
172 for(
typename Evaluators::iterator it = _evaluators.begin();
173 it != _evaluators.end(); ++it) {
174 delete it->evaluator;
210 template <
typename DEVICE_CONTEXT>
213 DEVICE_CONTEXT *deviceContext) {
223 template <
typename DEVICE_CONTEXT>
228 DEVICE_CONTEXT *deviceContext) {
237 template <
typename DEVICE_CONTEXT>
245 DEVICE_CONTEXT *deviceContext) {
247 for(
typename Evaluators::iterator it = _evaluators.begin();
248 it != _evaluators.end(); ++it) {
249 if (isEqual(srcDesc, it->srcDesc) &&
250 isEqual(dstDesc, it->dstDesc) &&
251 isEqual(duDesc, it->duDesc) &&
252 isEqual(dvDesc, it->dvDesc) &&
253 isEqual(duuDesc, it->duuDesc) &&
254 isEqual(duvDesc, it->duvDesc) &&
255 isEqual(dvvDesc, it->dvvDesc)) {
256 return it->evaluator;
259 EVALUATOR *e = EVALUATOR::Create(srcDesc, dstDesc,
261 duuDesc, duvDesc, dvvDesc,
263 _evaluators.push_back(
Entry(srcDesc, dstDesc,
265 duuDesc, duvDesc, dvvDesc, e));
277 return (offsetA == offsetB &&
288template <
typename EVALUATOR>
293 template <
typename C>
static yes &chk(
typename C::Instantiatable *t=0);
294 template <
typename C>
static no &chk(...);
295 static bool const value =
sizeof(chk<EVALUATOR>(0)) ==
sizeof(yes);
297template <
bool C,
typename T=
void>
298struct enable_if {
typedef T type; };
300struct enable_if<false, T> { };
305template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
306static EVALUATOR *GetEvaluator(
307 EvaluatorCacheT<EVALUATOR> *cache,
308 BufferDescriptor
const &srcDesc,
309 BufferDescriptor
const &dstDesc,
310 BufferDescriptor
const &duDesc,
311 BufferDescriptor
const &dvDesc,
312 BufferDescriptor
const &duuDesc,
313 BufferDescriptor
const &duvDesc,
314 BufferDescriptor
const &dvvDesc,
315 DEVICE_CONTEXT deviceContext,
316 typename enable_if<instantiatable<EVALUATOR>::value,
void>::type*t=0) {
318 if (cache == NULL)
return NULL;
319 return cache->GetEvaluator(srcDesc, dstDesc,
320 duDesc, dvDesc, duuDesc, duvDesc, dvvDesc,
324template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
325static EVALUATOR *GetEvaluator(
326 EvaluatorCacheT<EVALUATOR> *cache,
327 BufferDescriptor
const &srcDesc,
328 BufferDescriptor
const &dstDesc,
329 BufferDescriptor
const &duDesc,
330 BufferDescriptor
const &dvDesc,
331 DEVICE_CONTEXT deviceContext,
332 typename enable_if<instantiatable<EVALUATOR>::value,
void>::type*t=0) {
334 if (cache == NULL)
return NULL;
335 return cache->GetEvaluator(srcDesc, dstDesc, duDesc, dvDesc, deviceContext);
338template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
339static EVALUATOR *GetEvaluator(
340 EvaluatorCacheT<EVALUATOR> *cache,
341 BufferDescriptor
const &srcDesc,
342 BufferDescriptor
const &dstDesc,
343 DEVICE_CONTEXT deviceContext,
344 typename enable_if<instantiatable<EVALUATOR>::value,
void>::type*t=0) {
346 if (cache == NULL)
return NULL;
347 return cache->GetEvaluator(srcDesc, dstDesc,
354template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
355static EVALUATOR *GetEvaluator(
356 EvaluatorCacheT<EVALUATOR> *,
357 BufferDescriptor
const &,
358 BufferDescriptor
const &,
359 BufferDescriptor
const &,
360 BufferDescriptor
const &,
361 BufferDescriptor
const &,
362 BufferDescriptor
const &,
363 BufferDescriptor
const &,
365 typename enable_if<!instantiatable<EVALUATOR>::value,
void>::type*t=0) {
370template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
371static EVALUATOR *GetEvaluator(
372 EvaluatorCacheT<EVALUATOR> *,
373 BufferDescriptor
const &,
374 BufferDescriptor
const &,
375 BufferDescriptor
const &,
376 BufferDescriptor
const &,
378 typename enable_if<!instantiatable<EVALUATOR>::value,
void>::type*t=0) {
383template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
384static EVALUATOR *GetEvaluator(
385 EvaluatorCacheT<EVALUATOR> *,
386 BufferDescriptor
const &,
387 BufferDescriptor
const &,
389 typename enable_if<!instantiatable<EVALUATOR>::value,
void>::type*t=0) {
396template <
typename VERTEX_BUFFER,
397 typename STENCIL_TABLE,
399 typename PATCH_TABLE,
400 typename DEVICE_CONTEXT =
void>
412 int numVertexElements,
413 int numVaryingElements,
420 _farPatchTable(NULL),
424 _varyingBuffer(NULL),
425 _vertexStencilTable(NULL),
426 _varyingStencilTable(NULL),
427 _evaluatorCache(evaluatorCache),
429 _deviceContext(deviceContext) {
434 *_refiner, level, bits);
436 int vertexBufferStride = numVertexElements +
438 int varyingBufferStride =
441 initializeContext(numVertexElements,
445 initializeVertexBuffers(_numVertices,
447 varyingBufferStride);
454 numVertexElements, numVaryingElements, vertexBufferStride);
457 0, numVaryingElements, varyingBufferStride);
463 delete _farPatchTable;
464 delete _vertexBuffer;
465 delete _varyingBuffer;
466 delete _vertexStencilTable;
467 delete _varyingStencilTable;
473 int startVertex,
int numVerts) {
474 _vertexBuffer->UpdateData(vertexData, startVertex, numVerts,
479 int startVertex,
int numVerts) {
480 _varyingBuffer->UpdateData(varyingData, startVertex, numVerts,
495 Evaluator const *instance = GetEvaluator<Evaluator>(
496 _evaluatorCache, srcDesc, dstDesc,
499 Evaluator::EvalStencils(_vertexBuffer, srcDesc,
500 _vertexBuffer, dstDesc,
502 instance, _deviceContext);
504 if (_varyingDesc.
length > 0) {
507 vDstDesc.
offset += numControlVertices * vDstDesc.
stride;
509 instance = GetEvaluator<Evaluator>(
510 _evaluatorCache, vSrcDesc, vDstDesc,
513 if (_varyingBuffer) {
515 Evaluator::EvalStencils(_varyingBuffer, vSrcDesc,
516 _varyingBuffer, vDstDesc,
517 _varyingStencilTable,
518 instance, _deviceContext);
521 Evaluator::EvalStencils(_vertexBuffer, vSrcDesc,
522 _vertexBuffer, vDstDesc,
523 _varyingStencilTable,
524 instance, _deviceContext);
530 Evaluator::Synchronize(_deviceContext);
538 return _farPatchTable;
546 return _vertexBuffer->BindVBO(_deviceContext);
550 return _varyingBuffer->BindVBO(_deviceContext);
554 return _vertexBuffer;
558 return _varyingBuffer;
566 void initializeContext(
int numVertexElements,
567 int numVaryingElements,
571 Far::StencilTableFactory::Options options;
572 options.generateOffsets =
true;
573 options.generateIntermediateLevels =
579 if (numVertexElements>0) {
585 if (numVaryingElements>0) {
587 options.interpolationMode =
604 poptions.SetEndCapType(
606 poptions.shareEndCapPatchPoints =
true;
608 poptions.SetEndCapType(
611 poptions.SetEndCapType(
613 poptions.shareEndCapPatchPoints =
true;
615 poptions.SetEndCapType(
624 if (Far::StencilTable
const *vertexStencilsWithLocalPoints =
629 delete vertexStencils;
630 vertexStencils = vertexStencilsWithLocalPoints;
632 if (varyingStencils) {
633 if (Far::StencilTable
const *varyingStencilsWithLocalPoints =
638 delete varyingStencils;
639 varyingStencils = varyingStencilsWithLocalPoints;
645 _patchTable = PatchTable::Create(_farPatchTable, _deviceContext);
652 _vertexStencilTable =
654 vertexStencils, _deviceContext);
655 _varyingStencilTable =
657 varyingStencils, _deviceContext);
660 delete vertexStencils;
661 delete varyingStencils;
664 void initializeVertexBuffers(
int numVertices,
665 int numVertexElements,
666 int numVaryingElements) {
668 if (numVertexElements) {
669 _vertexBuffer = VertexBuffer::Create(numVertexElements,
670 numVertices, _deviceContext);
673 if (numVaryingElements) {
674 _varyingBuffer = VertexBuffer::Create(numVaryingElements,
675 numVertices, _deviceContext);
679 Far::TopologyRefiner * _refiner;
680 Far::PatchTable * _farPatchTable;
688 BufferDescriptor _vertexDesc;
689 BufferDescriptor _varyingDesc;
702using namespace OPENSUBDIV_VERSION;
STENCIL_TABLE const * convertToCompatibleStencilTable(SRC_STENCIL_TABLE const *table, DEVICE_CONTEXT *context)
@ MeshEndCapBilinearBasis
@ MeshUseSingleCreasePatch
@ MeshEndCapLegacyGregory
@ MeshUseSmoothCornerPatch
Far::StencilTable const * convertToCompatibleStencilTable< Far::StencilTable, Far::StencilTable, void >(Far::StencilTable const *table, void *)
Far::LimitStencilTable const * convertToCompatibleStencilTable< Far::LimitStencilTable, Far::LimitStencilTable, void >(Far::LimitStencilTable const *table, void *)
std::bitset< NUM_MESH_BITS > MeshBitset
Far::StencilTable const * convertToCompatibleStencilTable< Far::StencilTable, Far::StencilTable, ID3D11DeviceContext >(Far::StencilTable const *table, ID3D11DeviceContext *)
Container for arrays of parametric patches.
int GetMaxValence() const
Returns max vertex valence.
StencilTable const * GetLocalPointStencilTable() const
Returns the stencil table to compute local point vertex values.
StencilTable const * GetLocalPointVaryingStencilTable() const
Returns the stencil table to compute local point varying values.
static PatchTable * Create(TopologyRefiner const &refiner, Options options=Options(), ConstIndexArray selectedFaces=ConstIndexArray())
Instantiates a PatchTable from a client-provided TopologyRefiner.
Public options for the PatchTable factory.
@ ENDCAP_LEGACY_GREGORY
legacy option for 2.x style Gregory patches (Catmark only)
@ ENDCAP_GREGORY_BASIS
use Gregory patches (highest quality, recommended default)
@ ENDCAP_BILINEAR_BASIS
use linear patches (simple quads or tris)
@ ENDCAP_BSPLINE_BASIS
use BSpline-like patches (same patch type as regular)
int GetNumControlVertices() const
Returns the number of control vertices indexed in the table.
int GetNumStencils() const
Returns the number of stencils in the table.
Stencil table class wrapping the template for compatibility.
Limit stencil table class wrapping the template for compatibility.
static StencilTable const * Create(TopologyRefiner const &refiner, Options options=Options())
static StencilTable const * AppendLocalPointStencilTable(TopologyRefiner const &refiner, StencilTable const *baseStencilTable, StencilTable const *localPointStencilTable, bool factorize=true)
int GetNumVertices() const
Return the number of vertices in this level.
Stores topology data for a specified set of refinement options.
bool IsUniform() const
Returns true if uniform refinement has been applied.
int GetNumFVarChannels() const
Returns the number of face-varying channels in the tables.
void RefineUniform(UniformOptions options)
Refine the topology uniformly.
TopologyLevel const & GetLevel(int level) const
Returns a handle to access data specific to a particular level.
void RefineAdaptive(AdaptiveOptions options, ConstIndexArray selectedFaces=ConstIndexArray())
Feature Adaptive topology refinement.
Uniform refinement options.
unsigned int fullTopologyInLastLevel
Adaptive refinement options.
unsigned int useSingleCreasePatch
unsigned int useInfSharpPatch
unsigned int considerFVarChannels
BufferDescriptor is a struct which describes buffer elements in interleaved data buffers....
int stride
stride to the next element
int length
number or length of the data
int offset
offset to desired element data
virtual Far::PatchTable const * GetFarPatchTable() const =0
static void refineMesh(Far::TopologyRefiner &refiner, int level, MeshBitset bits)
virtual int GetMaxValence() const =0
PatchTable::VertexBufferBinding VertexBufferBinding
virtual int GetNumVertices() const =0
virtual void UpdateVaryingBuffer(float const *varyingData, int startVertex, int numVerts)=0
static void refineMesh(Far::TopologyRefiner &refiner, int level, bool adaptive, bool singleCreasePatch)
virtual void UpdateVertexBuffer(float const *vertexData, int startVertex, int numVerts)=0
virtual PatchTable * GetPatchTable() const =0
virtual VertexBufferBinding BindVertexBuffer()=0
virtual VertexBufferBinding BindVaryingBuffer()=0
virtual void Synchronize()=0
EVALUATOR * GetEvaluator(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, DEVICE_CONTEXT *deviceContext)
std::vector< Entry > Evaluators
EVALUATOR * GetEvaluator(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, BufferDescriptor const &duuDesc, BufferDescriptor const &duvDesc, BufferDescriptor const &dvvDesc, DEVICE_CONTEXT *deviceContext)
EVALUATOR * GetEvaluator(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, DEVICE_CONTEXT *deviceContext)
Entry(BufferDescriptor const &srcDescArg, BufferDescriptor const &dstDescArg, BufferDescriptor const &duDescArg, BufferDescriptor const &dvDescArg, BufferDescriptor const &duuDescArg, BufferDescriptor const &duvDescArg, BufferDescriptor const &dvvDescArg, EVALUATOR *evalArg)
Entry(BufferDescriptor const &srcDescArg, BufferDescriptor const &dstDescArg, BufferDescriptor const &duDescArg, BufferDescriptor const &dvDescArg, EVALUATOR *evalArg)
virtual Far::TopologyRefiner const * GetTopologyRefiner() const
virtual VertexBuffer * GetVertexBuffer()
STENCIL_TABLE StencilTable
PatchTable::VertexBufferBinding VertexBufferBinding
virtual void UpdateVaryingBuffer(float const *varyingData, int startVertex, int numVerts)
virtual VertexBuffer * GetVaryingBuffer()
virtual VertexBufferBinding BindVertexBuffer()
virtual int GetNumVertices() const
Mesh(Far::TopologyRefiner *refiner, int numVertexElements, int numVaryingElements, int level, MeshBitset bits=MeshBitset(), EvaluatorCache *evaluatorCache=NULL, DeviceContext *deviceContext=NULL)
virtual VertexBufferBinding BindVaryingBuffer()
virtual void UpdateVertexBuffer(float const *vertexData, int startVertex, int numVerts)
virtual void Synchronize()
virtual PatchTable * GetPatchTable() const
virtual Far::PatchTable const * GetFarPatchTable() const
EvaluatorCacheT< Evaluator > EvaluatorCache
VERTEX_BUFFER VertexBuffer
DEVICE_CONTEXT DeviceContext
virtual int GetMaxValence() const