25 #ifndef OPENSUBDIV3_OSD_MESH_H 26 #define OPENSUBDIV3_OSD_MESH_H 28 #include "../version.h" 35 #include "../far/topologyRefiner.h" 36 #include "../far/patchTableFactory.h" 37 #include "../far/stencilTable.h" 38 #include "../far/stencilTableFactory.h" 40 #include "../osd/bufferDescriptor.h" 42 struct ID3D11DeviceContext;
45 namespace OPENSUBDIV_VERSION {
66 template <
class PATCH_TABLE>
82 int startVertex,
int numVerts) = 0;
85 int startVertex,
int numVerts) = 0;
101 int level,
bool adaptive,
102 bool singleCreasePatch) {
137 template <
typename STENCIL_TABLE,
typename SRC_STENCIL_TABLE,
138 typename DEVICE_CONTEXT>
139 STENCIL_TABLE
const *
141 SRC_STENCIL_TABLE
const *table, DEVICE_CONTEXT *context) {
142 if (! table)
return NULL;
143 return STENCIL_TABLE::Create(table, context);
148 convertToCompatibleStencilTable<Far::StencilTable, Far::StencilTable, void>(
152 if (! table)
return NULL;
158 convertToCompatibleStencilTable<Far::LimitStencilTable, Far::LimitStencilTable, void>(
162 if (! table)
return NULL;
168 convertToCompatibleStencilTable<Far::StencilTable, Far::StencilTable, ID3D11DeviceContext>(
172 if (! table)
return NULL;
184 template <
typename EVALUATOR>
188 for(
typename Evaluators::iterator it = _evaluators.begin();
189 it != _evaluators.end(); ++it) {
190 delete it->evaluator;
226 template <
typename DEVICE_CONTEXT>
229 DEVICE_CONTEXT *deviceContext) {
239 template <
typename DEVICE_CONTEXT>
244 DEVICE_CONTEXT *deviceContext) {
253 template <
typename DEVICE_CONTEXT>
261 DEVICE_CONTEXT *deviceContext) {
263 for(
typename Evaluators::iterator it = _evaluators.begin();
264 it != _evaluators.end(); ++it) {
265 if (isEqual(srcDesc, it->srcDesc) &&
266 isEqual(dstDesc, it->dstDesc) &&
267 isEqual(duDesc, it->duDesc) &&
268 isEqual(dvDesc, it->dvDesc) &&
269 isEqual(duuDesc, it->duuDesc) &&
270 isEqual(duvDesc, it->duvDesc) &&
271 isEqual(dvvDesc, it->dvvDesc)) {
272 return it->evaluator;
275 EVALUATOR *e = EVALUATOR::Create(srcDesc, dstDesc,
277 duuDesc, duvDesc, dvvDesc,
279 _evaluators.push_back(
Entry(srcDesc, dstDesc,
281 duuDesc, duvDesc, dvvDesc, e));
293 return (offsetA == offsetB &&
304 template <
typename EVALUATOR>
305 struct instantiatable
309 template <
typename C>
static yes &chk(
typename C::Instantiatable *t=0);
310 template <
typename C>
static no &chk(...);
311 static bool const value =
sizeof(chk<EVALUATOR>(0)) ==
sizeof(yes);
313 template <
bool C,
typename T=
void>
314 struct enable_if {
typedef T type; };
315 template <
typename T>
316 struct enable_if<false, T> { };
321 template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
322 static EVALUATOR *GetEvaluator(
323 EvaluatorCacheT<EVALUATOR> *cache,
324 BufferDescriptor
const &srcDesc,
325 BufferDescriptor
const &dstDesc,
326 BufferDescriptor
const &duDesc,
327 BufferDescriptor
const &dvDesc,
328 BufferDescriptor
const &duuDesc,
329 BufferDescriptor
const &duvDesc,
330 BufferDescriptor
const &dvvDesc,
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,
336 duDesc, dvDesc, duuDesc, duvDesc, dvvDesc,
340 template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
341 static EVALUATOR *GetEvaluator(
342 EvaluatorCacheT<EVALUATOR> *cache,
343 BufferDescriptor
const &srcDesc,
344 BufferDescriptor
const &dstDesc,
345 BufferDescriptor
const &duDesc,
346 BufferDescriptor
const &dvDesc,
347 DEVICE_CONTEXT deviceContext,
348 typename enable_if<instantiatable<EVALUATOR>::value,
void>::type*t=0) {
350 if (cache == NULL)
return NULL;
351 return cache->GetEvaluator(srcDesc, dstDesc, duDesc, dvDesc, deviceContext);
354 template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
355 static EVALUATOR *GetEvaluator(
356 EvaluatorCacheT<EVALUATOR> *cache,
357 BufferDescriptor
const &srcDesc,
358 BufferDescriptor
const &dstDesc,
359 DEVICE_CONTEXT deviceContext,
360 typename enable_if<instantiatable<EVALUATOR>::value,
void>::type*t=0) {
362 if (cache == NULL)
return NULL;
363 return cache->GetEvaluator(srcDesc, dstDesc,
370 template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
371 static EVALUATOR *GetEvaluator(
372 EvaluatorCacheT<EVALUATOR> *,
373 BufferDescriptor
const &,
374 BufferDescriptor
const &,
375 BufferDescriptor
const &,
376 BufferDescriptor
const &,
377 BufferDescriptor
const &,
378 BufferDescriptor
const &,
379 BufferDescriptor
const &,
381 typename enable_if<!instantiatable<EVALUATOR>::value,
void>::type*t=0) {
386 template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
387 static EVALUATOR *GetEvaluator(
388 EvaluatorCacheT<EVALUATOR> *,
389 BufferDescriptor
const &,
390 BufferDescriptor
const &,
391 BufferDescriptor
const &,
392 BufferDescriptor
const &,
394 typename enable_if<!instantiatable<EVALUATOR>::value,
void>::type*t=0) {
399 template <
typename EVALUATOR,
typename DEVICE_CONTEXT>
400 static EVALUATOR *GetEvaluator(
401 EvaluatorCacheT<EVALUATOR> *,
402 BufferDescriptor
const &,
403 BufferDescriptor
const &,
405 typename enable_if<!instantiatable<EVALUATOR>::value,
void>::type*t=0) {
412 template <
typename VERTEX_BUFFER,
413 typename STENCIL_TABLE,
415 typename PATCH_TABLE,
416 typename DEVICE_CONTEXT =
void>
428 int numVertexElements,
429 int numVaryingElements,
436 _farPatchTable(NULL),
440 _varyingBuffer(NULL),
441 _vertexStencilTable(NULL),
442 _varyingStencilTable(NULL),
443 _evaluatorCache(evaluatorCache),
445 _deviceContext(deviceContext) {
450 *_refiner, level, bits);
452 int vertexBufferStride = numVertexElements +
454 int varyingBufferStride =
457 initializeContext(numVertexElements,
461 initializeVertexBuffers(_numVertices,
463 varyingBufferStride);
470 numVertexElements, numVaryingElements, vertexBufferStride);
473 0, numVaryingElements, varyingBufferStride);
479 delete _farPatchTable;
480 delete _vertexBuffer;
481 delete _varyingBuffer;
482 delete _vertexStencilTable;
483 delete _varyingStencilTable;
489 int startVertex,
int numVerts) {
490 _vertexBuffer->UpdateData(vertexData, startVertex, numVerts,
495 int startVertex,
int numVerts) {
496 _varyingBuffer->UpdateData(varyingData, startVertex, numVerts,
511 Evaluator const *instance = GetEvaluator<Evaluator>(
512 _evaluatorCache, srcDesc, dstDesc,
515 Evaluator::EvalStencils(_vertexBuffer, srcDesc,
516 _vertexBuffer, dstDesc,
518 instance, _deviceContext);
520 if (_varyingDesc.
length > 0) {
523 vDstDesc.
offset += numControlVertices * vDstDesc.
stride;
525 instance = GetEvaluator<Evaluator>(
526 _evaluatorCache, vSrcDesc, vDstDesc,
529 if (_varyingBuffer) {
531 Evaluator::EvalStencils(_varyingBuffer, vSrcDesc,
532 _varyingBuffer, vDstDesc,
533 _varyingStencilTable,
534 instance, _deviceContext);
537 Evaluator::EvalStencils(_vertexBuffer, vSrcDesc,
538 _vertexBuffer, vDstDesc,
539 _varyingStencilTable,
540 instance, _deviceContext);
546 Evaluator::Synchronize(_deviceContext);
554 return _farPatchTable;
562 return _vertexBuffer->BindVBO(_deviceContext);
566 return _varyingBuffer->BindVBO(_deviceContext);
570 return _vertexBuffer;
574 return _varyingBuffer;
582 void initializeContext(
int numVertexElements,
583 int numVaryingElements,
595 if (numVertexElements>0) {
601 if (numVaryingElements>0) {
618 poptions.SetEndCapType(
621 poptions.SetEndCapType(
625 poptions.shareEndCapPatchPoints =
true;
627 poptions.SetEndCapType(
636 if (Far::StencilTable
const *vertexStencilsWithLocalPoints =
641 delete vertexStencils;
642 vertexStencils = vertexStencilsWithLocalPoints;
644 if (varyingStencils) {
645 if (Far::StencilTable
const *varyingStencilsWithLocalPoints =
650 delete varyingStencils;
651 varyingStencils = varyingStencilsWithLocalPoints;
657 _patchTable = PatchTable::Create(_farPatchTable, _deviceContext);
664 _vertexStencilTable =
665 convertToCompatibleStencilTable<StencilTable>(
666 vertexStencils, _deviceContext);
667 _varyingStencilTable =
668 convertToCompatibleStencilTable<StencilTable>(
669 varyingStencils, _deviceContext);
672 delete vertexStencils;
673 delete varyingStencils;
676 void initializeVertexBuffers(
int numVertices,
677 int numVertexElements,
678 int numVaryingElements) {
680 if (numVertexElements) {
681 _vertexBuffer = VertexBuffer::Create(numVertexElements,
682 numVertices, _deviceContext);
685 if (numVaryingElements) {
686 _varyingBuffer = VertexBuffer::Create(numVaryingElements,
687 numVertices, _deviceContext);
691 Far::TopologyRefiner * _refiner;
692 Far::PatchTable * _farPatchTable;
700 BufferDescriptor _vertexDesc;
701 BufferDescriptor _varyingDesc;
714 using namespace OPENSUBDIV_VERSION;
718 #endif // OPENSUBDIV3_OSD_MESH_H int GetNumVertices() const
Return the number of vertices in this level.
virtual VertexBufferBinding BindVaryingBuffer()=0
Entry(BufferDescriptor const &srcDescArg, BufferDescriptor const &dstDescArg, BufferDescriptor const &duDescArg, BufferDescriptor const &dvDescArg, BufferDescriptor const &duuDescArg, BufferDescriptor const &duvDescArg, BufferDescriptor const &dvvDescArg, EVALUATOR *evalArg)
use legacy (2.x) Gregory patches (4 cp + valence table) as end-caps
virtual int GetNumVertices() const
Adaptive refinement options.
static PatchTable * Create(TopologyRefiner const &refiner, Options options=Options())
Instantiates a PatchTable from a client-provided TopologyRefiner.
EvaluatorCacheT< Evaluator > EvaluatorCache
Mesh(Far::TopologyRefiner *refiner, int numVertexElements, int numVaryingElements, int level, MeshBitset bits=MeshBitset(), EvaluatorCache *evaluatorCache=NULL, DeviceContext *deviceContext=NULL)
virtual PatchTable * GetPatchTable() const =0
static void refineMesh(Far::TopologyRefiner &refiner, int level, bool adaptive, bool singleCreasePatch)
Public options for the PatchTable factory.
PatchTable::VertexBufferBinding VertexBufferBinding
int GetNumControlVertices() const
Returns the number of control vertices indexed in the table.
int GetNumStencils() const
Returns the number of stencils in the table.
virtual VertexBuffer * GetVertexBuffer()
DEVICE_CONTEXT DeviceContext
void RefineAdaptive(AdaptiveOptions options)
Feature Adaptive topology refinement (restricted to scheme Catmark)
Container for arrays of parametric patches.
std::vector< Entry > Evaluators
virtual int GetMaxValence() const =0
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)
virtual VertexBufferBinding BindVertexBuffer()=0
int GetNumFVarChannels() const
Returns the number of face-varying channels in the tables.
unsigned int interpolationMode
interpolation mode
static StencilTable const * Create(TopologyRefiner const &refiner, Options options=Options())
Instantiates StencilTable from TopologyRefiner that have been refined uniformly or adaptively...
use BSpline basis patches (16 cp) as end-caps
virtual Far::TopologyRefiner const * GetTopologyRefiner() const
EVALUATOR * GetEvaluator(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, BufferDescriptor const &duDesc, BufferDescriptor const &dvDesc, DEVICE_CONTEXT *deviceContext)
int length
number or length of the data
Uniform refinement options.
virtual int GetNumVertices() const =0
virtual Far::PatchTable const * GetFarPatchTable() const =0
EVALUATOR * GetEvaluator(BufferDescriptor const &srcDesc, BufferDescriptor const &dstDesc, DEVICE_CONTEXT *deviceContext)
virtual VertexBufferBinding BindVaryingBuffer()
virtual VertexBuffer * GetVaryingBuffer()
virtual void Synchronize()=0
unsigned int considerFVarChannels
int offset
offset to desired element data
virtual VertexBufferBinding BindVertexBuffer()
unsigned int fullTopologyInLastLevel
Stores topology data for a specified set of refinement options.
TopologyLevel const & GetLevel(int level) const
Returns a handle to access data specific to a particular level.
Entry(BufferDescriptor const &srcDescArg, BufferDescriptor const &dstDescArg, BufferDescriptor const &duDescArg, BufferDescriptor const &dvDescArg, EVALUATOR *evalArg)
unsigned int generateIntermediateLevels
vertices at all levels or highest only
virtual void Synchronize()
StencilTable const * GetLocalPointVaryingStencilTable() const
Returns the stencil table to compute local point varying values.
VERTEX_BUFFER VertexBuffer
unsigned int useInfSharpPatch
int stride
stride to the next element
void RefineUniform(UniformOptions options)
Refine the topology uniformly.
static void refineMesh(Far::TopologyRefiner &refiner, int level, MeshBitset bits)
BufferDescriptor is a struct which describes buffer elements in interleaved data buffers. Almost all Osd Evaluator APIs take BufferDescriptors along with device-specific buffer objects.
int GetMaxValence() const
Returns max vertex valence.
STENCIL_TABLE const * convertToCompatibleStencilTable(SRC_STENCIL_TABLE const *table, DEVICE_CONTEXT *context)
StencilTable const * GetLocalPointStencilTable() const
Returns the stencil table to compute local point vertex values.
virtual void UpdateVertexBuffer(float const *vertexData, int startVertex, int numVerts)
Table of subdivision stencils.
static StencilTable const * AppendLocalPointStencilTable(TopologyRefiner const &refiner, StencilTable const *baseStencilTable, StencilTable const *localPointStencilTable, bool factorize=true)
Utility function for stencil splicing for local point stencils.
std::bitset< NUM_MESH_BITS > MeshBitset
virtual void UpdateVaryingBuffer(float const *varyingData, int startVertex, int numVerts)=0
unsigned int useSingleCreasePatch
virtual int GetMaxValence() const
Table of limit subdivision stencils.
use Gregory basis patches (20 cp) as end-caps
virtual void UpdateVertexBuffer(float const *vertexData, int startVertex, int numVerts)=0
PatchTable::VertexBufferBinding VertexBufferBinding
bool IsUniform() const
Returns true if uniform refinement has been applied.
STENCIL_TABLE StencilTable
virtual Far::PatchTable const * GetFarPatchTable() const
unsigned int generateOffsets
populate optional "_offsets" field
virtual PatchTable * GetPatchTable() const
virtual void UpdateVaryingBuffer(float const *varyingData, int startVertex, int numVerts)