diff options
Diffstat (limited to 'intern/opensubdiv')
8 files changed, 84 insertions, 20 deletions
diff --git a/intern/opensubdiv/internal/evaluator/eval_output.h b/intern/opensubdiv/internal/evaluator/eval_output.h index 57a9fab490f..e8480e8d816 100644 --- a/intern/opensubdiv/internal/evaluator/eval_output.h +++ b/intern/opensubdiv/internal/evaluator/eval_output.h @@ -107,6 +107,10 @@ class EvalOutputAPI::EvalOutput { { } + virtual void wrapSrcVertexDataBuffer(OpenSubdiv_Buffer * /*src_buffer*/) + { + } + virtual void fillFVarPatchArraysBuffer(const int /*face_varying_channel*/, OpenSubdiv_Buffer * /*patch_arrays_buffer*/) { @@ -126,6 +130,11 @@ class EvalOutputAPI::EvalOutput { OpenSubdiv_Buffer * /*src_buffer*/) { } + + virtual bool hasVertexData() const + { + return false; + } }; namespace { @@ -367,15 +376,15 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { device_context_); // Create evaluators for every face varying channel. - face_varying_evaluators.reserve(all_face_varying_stencils.size()); + face_varying_evaluators_.reserve(all_face_varying_stencils.size()); int face_varying_channel = 0; for (const StencilTable *face_varying_stencils : all_face_varying_stencils) { - face_varying_evaluators.push_back(new FaceVaryingEval(face_varying_channel, - face_varying_stencils, - face_varying_width, - patch_table_, - evaluator_cache_, - device_context_)); + face_varying_evaluators_.push_back(new FaceVaryingEval(face_varying_channel, + face_varying_stencils, + face_varying_width, + patch_table_, + evaluator_cache_, + device_context_)); ++face_varying_channel; } } @@ -388,7 +397,7 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { delete patch_table_; delete vertex_stencils_; delete varying_stencils_; - for (FaceVaryingEval *face_varying_evaluator : face_varying_evaluators) { + for (FaceVaryingEval *face_varying_evaluator : face_varying_evaluators_) { delete face_varying_evaluator; } } @@ -433,8 +442,8 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { int num_vertices) override { assert(face_varying_channel >= 0); - assert(face_varying_channel < face_varying_evaluators.size()); - face_varying_evaluators[face_varying_channel]->updateData(src, start_vertex, num_vertices); + assert(face_varying_channel < face_varying_evaluators_.size()); + face_varying_evaluators_[face_varying_channel]->updateData(src, start_vertex, num_vertices); } bool hasVaryingData() const @@ -446,7 +455,12 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { bool hasFaceVaryingData() const { - return face_varying_evaluators.size() != 0; + return face_varying_evaluators_.size() != 0; + } + + bool hasVertexData() const override + { + return src_vertex_data_ != nullptr; } void refine() override @@ -495,7 +509,7 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { } // Evaluate face-varying data. if (hasFaceVaryingData()) { - for (FaceVaryingEval *face_varying_evaluator : face_varying_evaluators) { + for (FaceVaryingEval *face_varying_evaluator : face_varying_evaluators_) { face_varying_evaluator->refine(); } } @@ -601,8 +615,8 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { float face_varying[2]) override { assert(face_varying_channel >= 0); - assert(face_varying_channel < face_varying_evaluators.size()); - face_varying_evaluators[face_varying_channel]->evalPatches( + assert(face_varying_channel < face_varying_evaluators_.size()); + face_varying_evaluators_[face_varying_channel]->evalPatches( patch_coord, num_patch_coords, face_varying); } @@ -611,6 +625,11 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { return src_data_; } + SRC_VERTEX_BUFFER *getSrcVertexDataBuffer() const + { + return src_vertex_data_; + } + PATCH_TABLE *getPatchTable() const { return patch_table_; @@ -618,17 +637,17 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { SRC_VERTEX_BUFFER *getFVarSrcBuffer(const int face_varying_channel) const { - return face_varying_evaluators[face_varying_channel]->getSrcBuffer(); + return face_varying_evaluators_[face_varying_channel]->getSrcBuffer(); } int getFVarSrcBufferOffset(const int face_varying_channel) const { - return face_varying_evaluators[face_varying_channel]->getFVarSrcBufferOffset(); + return face_varying_evaluators_[face_varying_channel]->getFVarSrcBufferOffset(); } PATCH_TABLE *getFVarPatchTable(const int face_varying_channel) const { - return face_varying_evaluators[face_varying_channel]->getPatchTable(); + return face_varying_evaluators_[face_varying_channel]->getPatchTable(); } private: @@ -646,7 +665,7 @@ class VolatileEvalOutput : public EvalOutputAPI::EvalOutput { const STENCIL_TABLE *varying_stencils_; int face_varying_width_; - vector<FaceVaryingEval *> face_varying_evaluators; + vector<FaceVaryingEval *> face_varying_evaluators_; EvaluatorCache *evaluator_cache_; DEVICE_CONTEXT *device_context_; diff --git a/intern/opensubdiv/internal/evaluator/eval_output_cpu.h b/intern/opensubdiv/internal/evaluator/eval_output_cpu.h index 58bae7a322e..42aa052863a 100644 --- a/intern/opensubdiv/internal/evaluator/eval_output_cpu.h +++ b/intern/opensubdiv/internal/evaluator/eval_output_cpu.h @@ -32,7 +32,7 @@ using OpenSubdiv::Osd::CpuVertexBuffer; namespace blender { namespace opensubdiv { -// Note: Define as a class instead of typedef to make it possible +// NOTE: Define as a class instead of typedef to make it possible // to have anonymous class in opensubdiv_evaluator_internal.h class CpuEvalOutput : public VolatileEvalOutput<CpuVertexBuffer, CpuVertexBuffer, diff --git a/intern/opensubdiv/internal/evaluator/eval_output_gpu.cc b/intern/opensubdiv/internal/evaluator/eval_output_gpu.cc index b352ed2c014..b85272008e6 100644 --- a/intern/opensubdiv/internal/evaluator/eval_output_gpu.cc +++ b/intern/opensubdiv/internal/evaluator/eval_output_gpu.cc @@ -84,6 +84,12 @@ void GpuEvalOutput::wrapSrcBuffer(OpenSubdiv_Buffer *src_buffer) src_buffer->wrap_device_handle(src_buffer, vertex_buffer->BindVBO()); } +void GpuEvalOutput::wrapSrcVertexDataBuffer(OpenSubdiv_Buffer *src_buffer) +{ + GLVertexBuffer *vertex_buffer = getSrcVertexDataBuffer(); + src_buffer->wrap_device_handle(src_buffer, vertex_buffer->BindVBO()); +} + void GpuEvalOutput::fillFVarPatchArraysBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_arrays_buffer) { diff --git a/intern/opensubdiv/internal/evaluator/eval_output_gpu.h b/intern/opensubdiv/internal/evaluator/eval_output_gpu.h index dc137e4322e..e65bd51cac0 100644 --- a/intern/opensubdiv/internal/evaluator/eval_output_gpu.h +++ b/intern/opensubdiv/internal/evaluator/eval_output_gpu.h @@ -51,6 +51,8 @@ class GpuEvalOutput : public VolatileEvalOutput<GLVertexBuffer, void wrapSrcBuffer(OpenSubdiv_Buffer *src_buffer) override; + void wrapSrcVertexDataBuffer(OpenSubdiv_Buffer *src_buffer) override; + void fillFVarPatchArraysBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_arrays_buffer) override; diff --git a/intern/opensubdiv/internal/evaluator/evaluator_capi.cc b/intern/opensubdiv/internal/evaluator/evaluator_capi.cc index b8d603ec380..7f30e0e5660 100644 --- a/intern/opensubdiv/internal/evaluator/evaluator_capi.cc +++ b/intern/opensubdiv/internal/evaluator/evaluator_capi.cc @@ -197,6 +197,12 @@ void wrapSrcBuffer(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buf evaluator->impl->eval_output->wrapSrcBuffer(src_buffer); } +void wrapSrcVertexDataBuffer(struct OpenSubdiv_Evaluator *evaluator, + struct OpenSubdiv_Buffer *src_buffer) +{ + evaluator->impl->eval_output->wrapSrcVertexDataBuffer(src_buffer); +} + void fillFVarPatchArraysBuffer(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, struct OpenSubdiv_Buffer *patch_array_buffer) @@ -226,6 +232,11 @@ void wrapFVarSrcBuffer(struct OpenSubdiv_Evaluator *evaluator, evaluator->impl->eval_output->wrapFVarSrcBuffer(face_varying_channel, src_buffer); } +bool hasVertexData(struct OpenSubdiv_Evaluator *evaluator) +{ + return evaluator->impl->eval_output->hasVertexData(); +} + void assignFunctionPointers(OpenSubdiv_Evaluator *evaluator) { evaluator->setSettings = setSettings; @@ -254,11 +265,14 @@ void assignFunctionPointers(OpenSubdiv_Evaluator *evaluator) evaluator->wrapPatchIndexBuffer = wrapPatchIndexBuffer; evaluator->wrapPatchParamBuffer = wrapPatchParamBuffer; evaluator->wrapSrcBuffer = wrapSrcBuffer; + evaluator->wrapSrcVertexDataBuffer = wrapSrcVertexDataBuffer; evaluator->fillFVarPatchArraysBuffer = fillFVarPatchArraysBuffer; evaluator->wrapFVarPatchIndexBuffer = wrapFVarPatchIndexBuffer; evaluator->wrapFVarPatchParamBuffer = wrapFVarPatchParamBuffer; evaluator->wrapFVarSrcBuffer = wrapFVarSrcBuffer; + + evaluator->hasVertexData = hasVertexData; } } // namespace diff --git a/intern/opensubdiv/internal/evaluator/evaluator_impl.cc b/intern/opensubdiv/internal/evaluator/evaluator_impl.cc index 0b8baa754d4..49a59c44be8 100644 --- a/intern/opensubdiv/internal/evaluator/evaluator_impl.cc +++ b/intern/opensubdiv/internal/evaluator/evaluator_impl.cc @@ -388,6 +388,11 @@ void EvalOutputAPI::wrapSrcBuffer(OpenSubdiv_Buffer *src_buffer) implementation_->wrapSrcBuffer(src_buffer); } +void EvalOutputAPI::wrapSrcVertexDataBuffer(OpenSubdiv_Buffer *src_buffer) +{ + implementation_->wrapSrcVertexDataBuffer(src_buffer); +} + void EvalOutputAPI::fillFVarPatchArraysBuffer(const int face_varying_channel, OpenSubdiv_Buffer *patch_arrays_buffer) { @@ -412,6 +417,11 @@ void EvalOutputAPI::wrapFVarSrcBuffer(const int face_varying_channel, implementation_->wrapFVarSrcBuffer(face_varying_channel, src_buffer); } +bool EvalOutputAPI::hasVertexData() const +{ + return implementation_->hasVertexData(); +} + } // namespace opensubdiv } // namespace blender @@ -569,7 +579,7 @@ OpenSubdiv_EvaluatorImpl *openSubdiv_createEvaluatorInternal( evaluator_descr->eval_output = new blender::opensubdiv::EvalOutputAPI(eval_output, patch_map); evaluator_descr->patch_map = patch_map; evaluator_descr->patch_table = patch_table; - // TOOD(sergey): Look into whether we've got duplicated stencils arrays. + // TODO(sergey): Look into whether we've got duplicated stencils arrays. delete vertex_stencils; delete varying_stencils; for (const StencilTable *table : all_face_varying_stencils) { diff --git a/intern/opensubdiv/internal/evaluator/evaluator_impl.h b/intern/opensubdiv/internal/evaluator/evaluator_impl.h index dbd786c8524..a7e3d5dff59 100644 --- a/intern/opensubdiv/internal/evaluator/evaluator_impl.h +++ b/intern/opensubdiv/internal/evaluator/evaluator_impl.h @@ -166,6 +166,9 @@ class EvalOutputAPI { // Wrap the buffer used by OpenSubDiv for the source data with the given buffer. void wrapSrcBuffer(OpenSubdiv_Buffer *src_buffer); + // Wrap the buffer used by OpenSubDiv for the extra source data with the given buffer. + void wrapSrcVertexDataBuffer(OpenSubdiv_Buffer *src_buffer); + // Copy the patch arrays buffer used by OpenSubDiv for the face varying channel with the given // buffer. void fillFVarPatchArraysBuffer(const int face_varying_channel, @@ -184,6 +187,9 @@ class EvalOutputAPI { // Wrap thebuffer used by OpenSubDiv for the face varying channel with the given buffer. void wrapFVarSrcBuffer(const int face_varying_channel, OpenSubdiv_Buffer *src_buffer); + // Return true if source vertex data has been set. + bool hasVertexData() const; + protected: PatchMap *patch_map_; EvalOutput *implementation_; diff --git a/intern/opensubdiv/opensubdiv_evaluator_capi.h b/intern/opensubdiv/opensubdiv_evaluator_capi.h index 7dcf85cca8d..6d94141e755 100644 --- a/intern/opensubdiv/opensubdiv_evaluator_capi.h +++ b/intern/opensubdiv/opensubdiv_evaluator_capi.h @@ -204,6 +204,10 @@ typedef struct OpenSubdiv_Evaluator { void (*wrapSrcBuffer)(struct OpenSubdiv_Evaluator *evaluator, struct OpenSubdiv_Buffer *src_buffer); + // Fill the given buffer with data from the evaluator's extra source buffer. + void (*wrapSrcVertexDataBuffer)(struct OpenSubdiv_Evaluator *evaluator, + struct OpenSubdiv_Buffer *src_buffer); + // Fill the given buffer with data from the evaluator's face varying patch array buffer. void (*fillFVarPatchArraysBuffer)(struct OpenSubdiv_Evaluator *evaluator, const int face_varying_channel, @@ -224,6 +228,9 @@ typedef struct OpenSubdiv_Evaluator { const int face_varying_channel, struct OpenSubdiv_Buffer *src_buffer); + // Return true if the evaluator has source vertex data set. + bool (*hasVertexData)(struct OpenSubdiv_Evaluator *evaluator); + // Implementation of the evaluator. struct OpenSubdiv_EvaluatorImpl *impl; |