[Bf-blender-cvs] [86270b60dbe] blender2.8: Subsurf: Evaluate all UV layers
Sergey Sharybin
noreply at git.blender.org
Wed Aug 1 18:43:39 CEST 2018
Commit: 86270b60dbeab29b4dc7dd9b596bcf0d533639d0
Author: Sergey Sharybin
Date: Wed Aug 1 18:31:05 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB86270b60dbeab29b4dc7dd9b596bcf0d533639d0
Subsurf: Evaluate all UV layers
Before that it was only first UV layer which was properly evaluated,
the rest were ignored. Now all layers are being properly handled.
===================================================================
M intern/opensubdiv/internal/opensubdiv_evaluator.cc
M intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
M intern/opensubdiv/internal/opensubdiv_evaluator_internal.h
M intern/opensubdiv/internal/opensubdiv_util.h
M intern/opensubdiv/opensubdiv_evaluator_capi.h
M source/blender/blenkernel/BKE_subdiv.h
M source/blender/blenkernel/intern/subdiv_converter_mesh.c
M source/blender/blenkernel/intern/subdiv_eval.c
M source/blender/blenkernel/intern/subdiv_mesh.c
===================================================================
diff --git a/intern/opensubdiv/internal/opensubdiv_evaluator.cc b/intern/opensubdiv/internal/opensubdiv_evaluator.cc
index 29d42a903ba..49b8626448b 100644
--- a/intern/opensubdiv/internal/opensubdiv_evaluator.cc
+++ b/intern/opensubdiv/internal/opensubdiv_evaluator.cc
@@ -42,9 +42,11 @@ void setVaryingData(OpenSubdiv_Evaluator* evaluator,
}
void setFaceVaryingData(OpenSubdiv_Evaluator* evaluator,
+ const int face_varying_channel,
const float* face_varying_data,
const int start_vertex_index, const int num_vertices) {
- evaluator->internal->eval_output->setFaceVaryingData(face_varying_data,
+ evaluator->internal->eval_output->setFaceVaryingData(face_varying_channel,
+ face_varying_data,
start_vertex_index,
num_vertices);
}
@@ -78,12 +80,14 @@ void setVaryingDataFromBuffer(OpenSubdiv_Evaluator* evaluator,
}
void setFaceVaryingDataFromBuffer(OpenSubdiv_Evaluator* evaluator,
+ const int face_varying_channel,
const void* buffer,
const int start_offset,
const int stride,
const int start_vertex_index,
const int num_vertices) {
evaluator->internal->eval_output->setFaceVaryingDataFromBuffer(
+ face_varying_channel,
buffer,
start_offset,
stride,
@@ -114,12 +118,12 @@ void evaluateVarying(OpenSubdiv_Evaluator* evaluator,
}
void evaluateFaceVarying(OpenSubdiv_Evaluator* evaluator,
+ const int face_varying_channel,
const int ptex_face_index,
float face_u, float face_v,
float face_varying[2]) {
- evaluator->internal->eval_output->evaluateFaceVarying(ptex_face_index,
- face_u, face_v,
- face_varying);
+ evaluator->internal->eval_output->evaluateFaceVarying(
+ face_varying_channel, ptex_face_index, face_u, face_v, face_varying);
}
void assignFunctionPointers(OpenSubdiv_Evaluator* evaluator) {
diff --git a/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc b/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
index d593518405f..31e68492587 100644
--- a/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
+++ b/intern/opensubdiv/internal/opensubdiv_evaluator_internal.cc
@@ -39,6 +39,7 @@
#include "MEM_guardedalloc.h"
#include "internal/opensubdiv_topology_refiner_internal.h"
+#include "internal/opensubdiv_util.h"
#include "opensubdiv_topology_refiner_capi.h"
using OpenSubdiv::Osd::BufferDescriptor;
@@ -147,6 +148,106 @@ class StackAllocatedBuffer {
float data_[element_size * num_vertices];
};
+template <typename EVAL_VERTEX_BUFFER,
+ typename STENCIL_TABLE,
+ typename PATCH_TABLE,
+ typename EVALUATOR,
+ typename DEVICE_CONTEXT = void>
+class FaceVaryingVolatileEval {
+ public:
+ typedef OpenSubdiv::Osd::EvaluatorCacheT<EVALUATOR> EvaluatorCache;
+
+ 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)
+ : face_varying_channel_(face_varying_channel),
+ src_face_varying_desc_(0, face_varying_width, face_varying_width),
+ patch_table_(patch_table),
+ evaluator_cache_(evaluator_cache),
+ device_context_(device_context) {
+ using OpenSubdiv::Osd::convertToCompatibleStencilTable;
+ num_coarse_face_varying_vertices_ =
+ face_varying_stencils->GetNumControlVertices();
+ const int num_total_face_varying_vertices =
+ face_varying_stencils->GetNumControlVertices() +
+ face_varying_stencils->GetNumStencils();
+ src_face_varying_data_ =
+ EVAL_VERTEX_BUFFER::Create(2,
+ num_total_face_varying_vertices,
+ device_context);
+ face_varying_stencils_ = convertToCompatibleStencilTable<STENCIL_TABLE>(
+ face_varying_stencils, device_context_);
+ }
+
+ ~FaceVaryingVolatileEval() {
+ delete src_face_varying_data_;
+ delete face_varying_stencils_;
+ }
+
+ void updateData(const float* src, int start_vertex, int num_vertices) {
+ src_face_varying_data_->UpdateData(src,
+ start_vertex,
+ num_vertices,
+ device_context_);
+ }
+
+ void refine() {
+ BufferDescriptor dst_face_varying_desc = src_face_varying_desc_;
+ dst_face_varying_desc.offset += num_coarse_face_varying_vertices_ *
+ src_face_varying_desc_.stride;
+ const EVALUATOR* eval_instance = OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(
+ evaluator_cache_,
+ src_face_varying_desc_,
+ dst_face_varying_desc,
+ device_context_);
+ EVALUATOR::EvalStencils(src_face_varying_data_, src_face_varying_desc_,
+ src_face_varying_data_, dst_face_varying_desc,
+ face_varying_stencils_,
+ eval_instance,
+ device_context_);
+ }
+
+ void evalPatch(const PatchCoord& patch_coord, float face_varying[2]) {
+ StackAllocatedBuffer<2, 1> face_varying_data;
+ BufferDescriptor face_varying_desc(0, 2, 2);
+ SinglePatchCoordBuffer patch_coord_buffer(patch_coord);
+ const EVALUATOR* eval_instance =
+ OpenSubdiv::Osd::GetEvaluator<EVALUATOR>(evaluator_cache_,
+ src_face_varying_desc_,
+ face_varying_desc,
+ device_context_);
+ EVALUATOR::EvalPatchesFaceVarying(
+ src_face_varying_data_, src_face_varying_desc_,
+ &face_varying_data, face_varying_desc,
+ patch_coord_buffer.GetNumVertices(),
+ &patch_coord_buffer,
+ patch_table_,
+ face_varying_channel_,
+ eval_instance,
+ device_context_);
+ const float* refined_face_varying = face_varying_data.BindCpuBuffer();
+ memcpy(face_varying, refined_face_varying, sizeof(float) * 2);
+ }
+
+ protected:
+ int face_varying_channel_;
+
+ BufferDescriptor src_face_varying_desc_;
+
+ int num_coarse_face_varying_vertices_;
+ EVAL_VERTEX_BUFFER* src_face_varying_data_;
+ const STENCIL_TABLE* face_varying_stencils_;
+
+ // NOTE: We reference this, do not own it.
+ PATCH_TABLE* patch_table_;
+
+ EvaluatorCache* evaluator_cache_;
+ DEVICE_CONTEXT* device_context_;
+};
+
// Volatile evaluator which can be used from threads.
//
// TODO(sergey): Make it possible to evaluate coordinates in chunks.
@@ -162,19 +263,22 @@ template <typename SRC_VERTEX_BUFFER,
class VolatileEvalOutput {
public:
typedef OpenSubdiv::Osd::EvaluatorCacheT<EVALUATOR> EvaluatorCache;
-
- VolatileEvalOutput(const StencilTable* vertex_stencils,
- const StencilTable* varying_stencils,
- const StencilTable* face_varying_stencils,
- const int face_varying_channel,
- const int face_varying_width,
- const PatchTable* patch_table,
- EvaluatorCache* evaluator_cache = NULL,
- DEVICE_CONTEXT* device_context = NULL)
+ typedef FaceVaryingVolatileEval<EVAL_VERTEX_BUFFER,
+ STENCIL_TABLE,
+ PATCH_TABLE,
+ EVALUATOR,
+ DEVICE_CONTEXT> FaceVaryingEval;
+
+ VolatileEvalOutput(
+ const StencilTable* vertex_stencils,
+ const StencilTable* varying_stencils,
+ const 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_desc_(0, 3, 3),
src_varying_desc_(0, 3, 3),
- src_face_varying_desc_(0, face_varying_width, face_varying_width),
- face_varying_channel_(face_varying_channel),
face_varying_width_(face_varying_width),
evaluator_cache_(evaluator_cache),
device_context_(device_context) {
@@ -193,33 +297,31 @@ class VolatileEvalOutput {
vertex_stencils, device_context_);
varying_stencils_ = convertToCompatibleStencilTable<STENCIL_TABLE>(
varying_stencils, device_context_);
- if (face_varying_stencils != NULL) {
- num_coarse_face_varying_vertices_ =
- face_varying_stencils->GetNumControlVertices();
- const int num_total_face_varying_vertices =
- face_varying_stencils->GetNumControlVertices() +
- face_varying_stencils->GetNumStencils();
- src_face_varying_data_ =
- EVAL_VERTEX_BUFFER::Create(2,
- num_total_face_varying_vertices,
- device_context_);
- face_varying_stencils_ = convertToCompatibleStencilTable<STENCIL_TABLE>(
- face_varying_stencils, device_context_);
- } else {
- num_coarse_face_varying_vertices_ = 0;
- src_face_varying_data_ = NULL;
- face_varying_stencils_ = NULL;
+ // Create evaluators for every face varying channel.
+ face_varying_evaluators.reserve(all_face_varying_stencils.size());
+ int face_varying_channel = 0;
+ foreach (const StencilTable* face_varying_stencils,
+ all_face_varying_stencils) {
+ face_varying_evaluators.push_back(
+ new FaceVaryingEval(face
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list