7#ifndef OPENSUBDIV_EVAL_OUTPUT_H_
8#define OPENSUBDIV_EVAL_OUTPUT_H_
10#include <opensubdiv/osd/cpuPatchTable.h>
11#include <opensubdiv/osd/mesh.h>
12#include <opensubdiv/osd/types.h>
19using OpenSubdiv::Far::PatchTable;
20using OpenSubdiv::Far::StencilTable;
21using OpenSubdiv::Osd::BufferDescriptor;
22using OpenSubdiv::Osd::CpuPatchTable;
23using OpenSubdiv::Osd::PatchCoord;
34 virtual void updateData(
const float *src,
int start_vertex,
int num_vertices) = 0;
38 virtual void updateVertexData(
const float *src,
int start_vertex,
int num_vertices) = 0;
43 int num_vertices) = 0;
49 const int num_patch_coords,
54 const int num_patch_coords,
61 const int num_patch_coords,
66 const int num_patch_coords,
67 float *vertex_data) = 0;
71 const int num_patch_coords,
72 float face_varying[2]) = 0;
185template<
typename EVAL_VERTEX_BUFFER,
186 typename STENCIL_TABLE,
187 typename PATCH_TABLE,
189 typename DEVICE_CONTEXT =
void>
195 const StencilTable *face_varying_stencils,
196 int face_varying_width,
197 PATCH_TABLE *patch_table,
199 DEVICE_CONTEXT *device_context = NULL)
206 using OpenSubdiv::Osd::convertToCompatibleStencilTable;
208 const int num_total_face_varying_vertices = face_varying_stencils->GetNumControlVertices() +
209 face_varying_stencils->GetNumStencils();
211 2, num_total_face_varying_vertices, device_context);
222 void updateData(
const float *src,
int start_vertex,
int num_vertices)
232 EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
239 dst_face_varying_desc,
249 BufferDescriptor face_varying_desc(0, 2, 2);
251 EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
254 BufferDescriptor src_desc = get_src_varying_desc();
275 BufferDescriptor src_desc = get_src_varying_desc();
276 return src_desc.offset;
285 BufferDescriptor get_src_varying_desc()
const
323template<
typename SRC_VERTEX_BUFFER,
324 typename EVAL_VERTEX_BUFFER,
325 typename STENCIL_TABLE,
326 typename PATCH_TABLE,
328 typename DEVICE_CONTEXT =
void>
339 const StencilTable *varying_stencils,
340 const std::vector<const StencilTable *> &all_face_varying_stencils,
341 const int face_varying_width,
342 const PatchTable *patch_table,
344 DEVICE_CONTEXT *device_context = NULL)
345 : src_vertex_data_(NULL),
347 src_varying_desc_(0, 3, 3),
348 src_vertex_data_desc_(0, 0, 0),
349 face_varying_width_(face_varying_width),
350 evaluator_cache_(evaluator_cache),
351 device_context_(device_context)
354 int num_total_vertices = vertex_stencils->GetNumControlVertices() +
355 vertex_stencils->GetNumStencils();
356 num_coarse_vertices_ = vertex_stencils->GetNumControlVertices();
357 using OpenSubdiv::Osd::convertToCompatibleStencilTable;
358 src_data_ = SRC_VERTEX_BUFFER::Create(3, num_total_vertices, device_context_);
359 src_varying_data_ = SRC_VERTEX_BUFFER::Create(3, num_total_vertices, device_context_);
360 patch_table_ = PATCH_TABLE::Create(patch_table, device_context_);
361 vertex_stencils_ = convertToCompatibleStencilTable<STENCIL_TABLE>(vertex_stencils,
363 varying_stencils_ = convertToCompatibleStencilTable<STENCIL_TABLE>(varying_stencils,
367 face_varying_evaluators_.reserve(all_face_varying_stencils.size());
368 int face_varying_channel = 0;
369 for (
const StencilTable *face_varying_stencils : all_face_varying_stencils) {
370 face_varying_evaluators_.push_back(
new FaceVaryingEval(face_varying_channel,
371 face_varying_stencils,
376 ++face_varying_channel;
383 delete src_varying_data_;
384 delete src_vertex_data_;
386 delete vertex_stencils_;
387 delete varying_stencils_;
388 for (
FaceVaryingEval *face_varying_evaluator : face_varying_evaluators_) {
389 delete face_varying_evaluator;
397 delete src_vertex_data_;
399 src_vertex_data_ = SRC_VERTEX_BUFFER::Create(
400 settings->
num_vertex_data, src_data_->GetNumVertices(), device_context_);
403 src_vertex_data_ = NULL;
405 src_vertex_data_desc_ = BufferDescriptor(
412 void updateData(
const float *src,
int start_vertex,
int num_vertices)
override
414 src_data_->UpdateData(src, start_vertex, num_vertices, device_context_);
419 src_varying_data_->UpdateData(src, start_vertex, num_vertices, device_context_);
424 src_vertex_data_->UpdateData(src, start_vertex, num_vertices, device_context_);
430 int num_vertices)
override
432 assert(face_varying_channel >= 0);
433 assert(face_varying_channel < face_varying_evaluators_.size());
434 face_varying_evaluators_[face_varying_channel]->updateData(src, start_vertex, num_vertices);
446 return face_varying_evaluators_.size() != 0;
451 return src_vertex_data_ !=
nullptr;
457 BufferDescriptor dst_desc = src_desc_;
458 dst_desc.offset += num_coarse_vertices_ * src_desc_.stride;
459 EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
460 evaluator_cache_, src_desc_, dst_desc, device_context_);
461 EVALUATOR::EvalStencils(src_data_,
470 if (src_vertex_data_) {
471 BufferDescriptor dst_vertex_data_desc = src_vertex_data_desc_;
472 dst_vertex_data_desc.offset += num_coarse_vertices_ * src_vertex_data_desc_.stride;
473 EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
474 evaluator_cache_, src_vertex_data_desc_, dst_vertex_data_desc, device_context_);
475 EVALUATOR::EvalStencils(src_vertex_data_,
476 src_vertex_data_desc_,
478 dst_vertex_data_desc,
486 BufferDescriptor dst_varying_desc = src_varying_desc_;
487 dst_varying_desc.offset += num_coarse_vertices_ * src_varying_desc_.stride;
488 eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
489 evaluator_cache_, src_varying_desc_, dst_varying_desc, device_context_);
490 EVALUATOR::EvalStencils(src_varying_data_,
500 for (
FaceVaryingEval *face_varying_evaluator : face_varying_evaluators_) {
501 face_varying_evaluator->refine();
511 BufferDescriptor P_desc(0, 3, 3);
513 EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
514 evaluator_cache_, src_desc_, P_desc, device_context_);
515 EVALUATOR::EvalPatches(src_data_,
528 const int num_patch_coords,
531 float *dPdv)
override
538 BufferDescriptor P_desc(0, 3, 3);
539 BufferDescriptor dpDu_desc(0, 3, 3), pPdv_desc(0, 3, 3);
541 EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
542 evaluator_cache_, src_desc_, P_desc, dpDu_desc, pPdv_desc, device_context_);
543 EVALUATOR::EvalPatches(src_data_,
560 const int num_patch_coords,
561 float *varying)
override
564 BufferDescriptor varying_desc(3, 3, 6);
566 EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
567 evaluator_cache_, src_varying_desc_, varying_desc, device_context_);
568 EVALUATOR::EvalPatchesVarying(src_varying_data_,
581 const int num_patch_coords,
582 float *
data)
override
585 BufferDescriptor vertex_desc(0, src_vertex_data_desc_.length, src_vertex_data_desc_.length);
587 EVALUATOR *eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
588 evaluator_cache_, src_vertex_data_desc_, vertex_desc, device_context_);
589 EVALUATOR::EvalPatches(src_vertex_data_,
590 src_vertex_data_desc_,
602 const int num_patch_coords,
603 float face_varying[2])
override
605 assert(face_varying_channel >= 0);
606 assert(face_varying_channel < face_varying_evaluators_.size());
607 face_varying_evaluators_[face_varying_channel]->evalPatches(
608 patch_coord, num_patch_coords, face_varying);
618 return src_vertex_data_;
628 return face_varying_evaluators_[face_varying_channel]->getSrcBuffer();
633 return face_varying_evaluators_[face_varying_channel]->get_face_varying_source_offset();
638 return face_varying_evaluators_[face_varying_channel]->getPatchTable();
642 SRC_VERTEX_BUFFER *src_data_;
643 SRC_VERTEX_BUFFER *src_varying_data_;
644 SRC_VERTEX_BUFFER *src_vertex_data_;
645 PATCH_TABLE *patch_table_;
646 BufferDescriptor src_desc_;
647 BufferDescriptor src_varying_desc_;
648 BufferDescriptor src_vertex_data_desc_;
650 int num_coarse_vertices_;
652 const STENCIL_TABLE *vertex_stencils_;
653 const STENCIL_TABLE *varying_stencils_;
655 int face_varying_width_;
656 std::vector<FaceVaryingEval *> face_varying_evaluators_;
659 DEVICE_CONTEXT *device_context_;
BMesh const char void * data
ConstPatchCoordWrapperBuffer(const PatchCoord *data, int num_vertices)
virtual gpu::StorageBuf * get_face_varying_patch_param_buf(const int)
virtual void evalPatches(const PatchCoord *patch_coord, const int num_patch_coords, float *P)=0
virtual gpu::VertBuf * get_face_varying_source_buf(const int)
virtual int get_face_varying_source_offset(const int) const
virtual ~EvalOutput()=default
virtual void evalPatchesVertexData(const PatchCoord *patch_coord, const int num_patch_coords, float *vertex_data)=0
virtual gpu::StorageBuf * get_face_varying_patch_index_buf(const int)
virtual gpu::StorageBuf * get_patch_index_buf()
virtual void evalPatchesWithDerivatives(const PatchCoord *patch_coord, const int num_patch_coords, float *P, float *dPdu, float *dPdv)=0
virtual bool hasVertexData() const
virtual void updateVertexData(const float *src, int start_vertex, int num_vertices)=0
virtual gpu::StorageBuf * create_face_varying_patch_array_buf(const int)
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 gpu::StorageBuf * get_patch_param_buf()
virtual void updateFaceVaryingData(const int face_varying_channel, const float *src, int start_vertex, int num_vertices)=0
virtual gpu::VertBuf * get_source_buf()
virtual gpu::VertBuf * get_source_data_buf()
virtual void evalPatchesFaceVarying(const int face_varying_channel, const PatchCoord *patch_coord, const int num_patch_coords, float face_varying[2])=0
virtual gpu::StorageBuf * create_patch_arrays_buf()
virtual void updateVaryingData(const float *src, int start_vertex, int num_vertices)=0
~FaceVaryingVolatileEval()
BufferDescriptor src_face_varying_desc_
EVAL_VERTEX_BUFFER * getSrcBuffer() const
int get_face_varying_source_offset() const
void updateData(const float *src, int start_vertex, int num_vertices)
PATCH_TABLE * getPatchTable() const
DEVICE_CONTEXT * device_context_
EvaluatorCache * evaluator_cache_
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_
OpenSubdiv::Osd::EvaluatorCacheT< EVALUATOR > EvaluatorCache
RawDataWrapperBuffer(T *data)
gpu::VertBuf * get_vertex_buffer()
RawDataWrapperVertexBuffer(T *data, int num_vertices)
int get_face_varying_source_offset(const int face_varying_channel) const override
FaceVaryingVolatileEval< EVAL_VERTEX_BUFFER, STENCIL_TABLE, PATCH_TABLE, EVALUATOR, DEVICE_CONTEXT > FaceVaryingEval
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
OpenSubdiv::Osd::EvaluatorCacheT< EVALUATOR > EvaluatorCache
PATCH_TABLE * getPatchTable() const
bool hasVaryingData() const
bool hasVertexData() const override
void updateVertexData(const float *src, int start_vertex, int num_vertices) override
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
#define assert(assertion)
bool is_adaptive(const CpuPatchTable *patch_table)