7#ifndef OPENSUBDIV_EVAL_OUTPUT_H_
8#define OPENSUBDIV_EVAL_OUTPUT_H_
10#include <opensubdiv/osd/cpuPatchTable.h>
11#include <opensubdiv/osd/glPatchTable.h>
12#include <opensubdiv/osd/mesh.h>
13#include <opensubdiv/osd/types.h>
19using OpenSubdiv::Far::PatchTable;
20using OpenSubdiv::Far::StencilTable;
21using OpenSubdiv::Osd::BufferDescriptor;
22using OpenSubdiv::Osd::CpuPatchTable;
23using OpenSubdiv::Osd::GLPatchTable;
24using OpenSubdiv::Osd::PatchCoord;
35 virtual void updateData(
const float *src,
int start_vertex,
int num_vertices) = 0;
39 virtual void updateVertexData(
const float *src,
int start_vertex,
int num_vertices) = 0;
44 int num_vertices) = 0;
50 const int num_patch_coords,
55 const int num_patch_coords,
62 const int num_patch_coords,
67 const int num_patch_coords,
68 float *vertex_data) = 0;
71 const PatchCoord *patch_coord,
72 const int num_patch_coords,
73 float face_varying[2]) = 0;
167template<
typename EVAL_VERTEX_BUFFER,
168 typename STENCIL_TABLE,
169 typename PATCH_TABLE,
171 typename DEVICE_CONTEXT =
void>
177 const StencilTable *face_varying_stencils,
178 int face_varying_width,
179 PATCH_TABLE *patch_table,
181 DEVICE_CONTEXT *device_context =
NULL)
188 using OpenSubdiv::Osd::convertToCompatibleStencilTable;
190 const int num_total_face_varying_vertices = face_varying_stencils->GetNumControlVertices() +
191 face_varying_stencils->GetNumStencils();
193 2, num_total_face_varying_vertices, device_context);
204 void updateData(
const float *src,
int start_vertex,
int num_vertices)
214 const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
221 dst_face_varying_desc,
228 void evalPatches(
const PatchCoord *patch_coord,
const int num_patch_coords,
float *face_varying)
231 BufferDescriptor face_varying_desc(0, 2, 2);
233 const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
236 BufferDescriptor src_desc = get_src_varying_desc();
257 BufferDescriptor src_desc = get_src_varying_desc();
258 return src_desc.offset;
267 BufferDescriptor get_src_varying_desc()
const
305template<
typename SRC_VERTEX_BUFFER,
306 typename EVAL_VERTEX_BUFFER,
307 typename STENCIL_TABLE,
308 typename PATCH_TABLE,
310 typename DEVICE_CONTEXT =
void>
322 const StencilTable *varying_stencils,
323 const std::vector<const StencilTable *> &all_face_varying_stencils,
324 const int face_varying_width,
325 const PatchTable *patch_table,
327 DEVICE_CONTEXT *device_context =
NULL)
328 : src_vertex_data_(
NULL),
330 src_varying_desc_(0, 3, 3),
331 src_vertex_data_desc_(0, 0, 0),
332 face_varying_width_(face_varying_width),
333 evaluator_cache_(evaluator_cache),
334 device_context_(device_context)
337 int num_total_vertices = vertex_stencils->GetNumControlVertices() +
338 vertex_stencils->GetNumStencils();
339 num_coarse_vertices_ = vertex_stencils->GetNumControlVertices();
340 using OpenSubdiv::Osd::convertToCompatibleStencilTable;
341 src_data_ = SRC_VERTEX_BUFFER::Create(3, num_total_vertices, device_context_);
342 src_varying_data_ = SRC_VERTEX_BUFFER::Create(3, num_total_vertices, device_context_);
343 patch_table_ = PATCH_TABLE::Create(patch_table, device_context_);
344 vertex_stencils_ = convertToCompatibleStencilTable<STENCIL_TABLE>(vertex_stencils,
346 varying_stencils_ = convertToCompatibleStencilTable<STENCIL_TABLE>(varying_stencils,
350 face_varying_evaluators_.reserve(all_face_varying_stencils.size());
351 int face_varying_channel = 0;
352 for (
const StencilTable *face_varying_stencils : all_face_varying_stencils) {
353 face_varying_evaluators_.push_back(
new FaceVaryingEval(face_varying_channel,
354 face_varying_stencils,
359 ++face_varying_channel;
366 delete src_varying_data_;
367 delete src_vertex_data_;
369 delete vertex_stencils_;
370 delete varying_stencils_;
371 for (
FaceVaryingEval *face_varying_evaluator : face_varying_evaluators_) {
372 delete face_varying_evaluator;
379 if (settings->num_vertex_data != src_vertex_data_desc_.length) {
380 delete src_vertex_data_;
381 if (settings->num_vertex_data > 0) {
382 src_vertex_data_ = SRC_VERTEX_BUFFER::Create(
383 settings->num_vertex_data, src_data_->GetNumVertices(), device_context_);
386 src_vertex_data_ =
NULL;
388 src_vertex_data_desc_ = BufferDescriptor(
389 0, settings->num_vertex_data, settings->num_vertex_data);
395 void updateData(
const float *src,
int start_vertex,
int num_vertices)
override
397 src_data_->UpdateData(src, start_vertex, num_vertices, device_context_);
402 src_varying_data_->UpdateData(src, start_vertex, num_vertices, device_context_);
407 src_vertex_data_->UpdateData(src, start_vertex, num_vertices, device_context_);
413 int num_vertices)
override
415 assert(face_varying_channel >= 0);
416 assert(face_varying_channel < face_varying_evaluators_.size());
417 face_varying_evaluators_[face_varying_channel]->updateData(src, start_vertex, num_vertices);
429 return face_varying_evaluators_.size() != 0;
434 return src_vertex_data_ !=
nullptr;
440 BufferDescriptor dst_desc = src_desc_;
441 dst_desc.offset += num_coarse_vertices_ * src_desc_.stride;
442 const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
443 evaluator_cache_, src_desc_, dst_desc, device_context_);
444 EVALUATOR::EvalStencils(src_data_,
453 if (src_vertex_data_) {
454 BufferDescriptor dst_vertex_data_desc = src_vertex_data_desc_;
455 dst_vertex_data_desc.offset += num_coarse_vertices_ * src_vertex_data_desc_.stride;
456 const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
457 evaluator_cache_, src_vertex_data_desc_, dst_vertex_data_desc, device_context_);
458 EVALUATOR::EvalStencils(src_vertex_data_,
459 src_vertex_data_desc_,
461 dst_vertex_data_desc,
469 BufferDescriptor dst_varying_desc = src_varying_desc_;
470 dst_varying_desc.offset += num_coarse_vertices_ * src_varying_desc_.stride;
471 eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
472 evaluator_cache_, src_varying_desc_, dst_varying_desc, device_context_);
473 EVALUATOR::EvalStencils(src_varying_data_,
483 for (
FaceVaryingEval *face_varying_evaluator : face_varying_evaluators_) {
484 face_varying_evaluator->refine();
490 void evalPatches(
const PatchCoord *patch_coord,
const int num_patch_coords,
float *
P)
override
494 BufferDescriptor P_desc(0, 3, 3);
496 const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
497 evaluator_cache_, src_desc_, P_desc, device_context_);
498 EVALUATOR::EvalPatches(src_data_,
511 const int num_patch_coords,
514 float *dPdv)
override
521 BufferDescriptor P_desc(0, 3, 3);
522 BufferDescriptor dpDu_desc(0, 3, 3), pPdv_desc(0, 3, 3);
524 const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
525 evaluator_cache_, src_desc_, P_desc, dpDu_desc, pPdv_desc, device_context_);
526 EVALUATOR::EvalPatches(src_data_,
543 const int num_patch_coords,
544 float *varying)
override
547 BufferDescriptor varying_desc(3, 3, 6);
549 const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
550 evaluator_cache_, src_varying_desc_, varying_desc, device_context_);
551 EVALUATOR::EvalPatchesVarying(src_varying_data_,
564 const int num_patch_coords,
565 float *data)
override
568 BufferDescriptor vertex_desc(0, src_vertex_data_desc_.length, src_vertex_data_desc_.length);
570 const EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
571 evaluator_cache_, src_vertex_data_desc_, vertex_desc, device_context_);
572 EVALUATOR::EvalPatches(src_vertex_data_,
573 src_vertex_data_desc_,
584 const PatchCoord *patch_coord,
585 const int num_patch_coords,
586 float face_varying[2])
override
588 assert(face_varying_channel >= 0);
589 assert(face_varying_channel < face_varying_evaluators_.size());
590 face_varying_evaluators_[face_varying_channel]->evalPatches(
591 patch_coord, num_patch_coords, face_varying);
601 return src_vertex_data_;
611 return face_varying_evaluators_[face_varying_channel]->getSrcBuffer();
616 return face_varying_evaluators_[face_varying_channel]->getFVarSrcBufferOffset();
621 return face_varying_evaluators_[face_varying_channel]->getPatchTable();
625 SRC_VERTEX_BUFFER *src_data_;
626 SRC_VERTEX_BUFFER *src_varying_data_;
627 SRC_VERTEX_BUFFER *src_vertex_data_;
628 PATCH_TABLE *patch_table_;
629 BufferDescriptor src_desc_;
630 BufferDescriptor src_varying_desc_;
631 BufferDescriptor src_vertex_data_desc_;
633 int num_coarse_vertices_;
635 const STENCIL_TABLE *vertex_stencils_;
636 const STENCIL_TABLE *varying_stencils_;
638 int face_varying_width_;
639 std::vector<FaceVaryingEval *> face_varying_evaluators_;
642 DEVICE_CONTEXT *device_context_;
ConstPatchCoordWrapperBuffer(const PatchCoord *data, int num_vertices)
virtual void wrapPatchIndexBuffer(OpenSubdiv_Buffer *)
virtual void evalPatches(const PatchCoord *patch_coord, const int num_patch_coords, float *P)=0
virtual void fillFVarPatchArraysBuffer(const int, OpenSubdiv_Buffer *)
virtual ~EvalOutput()=default
virtual void evalPatchesVertexData(const PatchCoord *patch_coord, const int num_patch_coords, float *vertex_data)=0
virtual void evalPatchesWithDerivatives(const PatchCoord *patch_coord, const int num_patch_coords, float *P, float *dPdu, float *dPdv)=0
virtual void wrapPatchParamBuffer(OpenSubdiv_Buffer *)
virtual void wrapFVarPatchParamBuffer(const int, OpenSubdiv_Buffer *)
virtual void wrapFVarPatchIndexBuffer(const int, OpenSubdiv_Buffer *)
virtual void wrapSrcVertexDataBuffer(OpenSubdiv_Buffer *)
virtual bool hasVertexData() const
virtual void updateVertexData(const float *src, int start_vertex, int num_vertices)=0
virtual void fillPatchArraysBuffer(OpenSubdiv_Buffer *)
virtual void updateData(const float *src, int start_vertex, int num_vertices)=0
virtual void evalPatchesVarying(const PatchCoord *patch_coord, const int num_patch_coords, float *varying)=0
virtual void updateSettings(const OpenSubdiv_EvaluatorSettings *settings)=0
virtual void updateFaceVaryingData(const int face_varying_channel, const float *src, int start_vertex, int num_vertices)=0
virtual void evalPatchesFaceVarying(const int face_varying_channel, const PatchCoord *patch_coord, const int num_patch_coords, float face_varying[2])=0
virtual void wrapFVarSrcBuffer(const int, OpenSubdiv_Buffer *)
virtual void wrapSrcBuffer(OpenSubdiv_Buffer *)
virtual void updateVaryingData(const float *src, int start_vertex, int num_vertices)=0
int getFVarSrcBufferOffset() const
~FaceVaryingVolatileEval()
BufferDescriptor src_face_varying_desc_
EVAL_VERTEX_BUFFER * getSrcBuffer() const
void updateData(const float *src, int start_vertex, int num_vertices)
PATCH_TABLE * getPatchTable() const
DEVICE_CONTEXT * device_context_
EvaluatorCache * evaluator_cache_
OpenSubdiv::Osd::EvaluatorCacheT< EVALUATOR > EvaluatorCache
int face_varying_channel_
PATCH_TABLE * patch_table_
FaceVaryingVolatileEval(int face_varying_channel, const StencilTable *face_varying_stencils, int face_varying_width, PATCH_TABLE *patch_table, EvaluatorCache *evaluator_cache=NULL, DEVICE_CONTEXT *device_context=NULL)
const STENCIL_TABLE * face_varying_stencils_
void evalPatches(const PatchCoord *patch_coord, const int num_patch_coords, float *face_varying)
EVAL_VERTEX_BUFFER * src_face_varying_data_
int num_coarse_face_varying_vertices_
RawDataWrapperBuffer(T *data)
RawDataWrapperVertexBuffer(T *data, int num_vertices)
OpenSubdiv::Osd::EvaluatorCacheT< EVALUATOR > EvaluatorCache
PATCH_TABLE * getFVarPatchTable(const int face_varying_channel) const
void updateVaryingData(const float *src, int start_vertex, int num_vertices) override
void evalPatches(const PatchCoord *patch_coord, const int num_patch_coords, float *P) override
FaceVaryingVolatileEval< EVAL_VERTEX_BUFFER, STENCIL_TABLE, PATCH_TABLE, EVALUATOR, DEVICE_CONTEXT > FaceVaryingEval
PATCH_TABLE * getPatchTable() const
bool hasVaryingData() const
bool hasVertexData() const override
void updateVertexData(const float *src, int start_vertex, int num_vertices) override
int getFVarSrcBufferOffset(const int face_varying_channel) const
void evalPatchesVarying(const PatchCoord *patch_coord, const int num_patch_coords, float *varying) override
void evalPatchesVertexData(const PatchCoord *patch_coord, const int num_patch_coords, float *data) override
void updateFaceVaryingData(const int face_varying_channel, const float *src, int start_vertex, int num_vertices) override
SRC_VERTEX_BUFFER * getSrcBuffer() const
SRC_VERTEX_BUFFER * getSrcVertexDataBuffer() const
void updateSettings(const OpenSubdiv_EvaluatorSettings *settings) override
void evalPatchesWithDerivatives(const PatchCoord *patch_coord, const int num_patch_coords, float *P, float *dPdu, float *dPdv) override
bool hasFaceVaryingData() const
void evalPatchesFaceVarying(const int face_varying_channel, const PatchCoord *patch_coord, const int num_patch_coords, float face_varying[2]) override
~VolatileEvalOutput() override
void updateData(const float *src, int start_vertex, int num_vertices) override
VolatileEvalOutput(const StencilTable *vertex_stencils, const StencilTable *varying_stencils, const std::vector< const StencilTable * > &all_face_varying_stencils, const int face_varying_width, const PatchTable *patch_table, EvaluatorCache *evaluator_cache=NULL, DEVICE_CONTEXT *device_context=NULL)
SRC_VERTEX_BUFFER * getFVarSrcBuffer(const int face_varying_channel) const
bool is_adaptive(const CpuPatchTable *patch_table)