[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