[Bf-blender-cvs] [c52ab0fff61] cycles_procedural_api: fix detection of needed tesselation

Kévin Dietrich noreply at git.blender.org
Mon Oct 26 23:27:06 CET 2020


Commit: c52ab0fff61cac4156a70fddc256a128271897f8
Author: Kévin Dietrich
Date:   Wed Oct 21 15:33:38 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rBc52ab0fff61cac4156a70fddc256a128271897f8

fix detection of needed tesselation

===================================================================

M	intern/cycles/render/geometry.cpp
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/render/mesh_subdivision.cpp

===================================================================

diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index 72c52a5fb1e..e9e11d82adb 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -1401,7 +1401,7 @@ void GeometryManager::device_update(Device *device,
         }
 
         /* Test if we need tessellation. */
-        if (mesh->subdivision_type != Mesh::SUBDIVISION_NONE && mesh->get_subd_params() && (mesh->verts_is_modified() || mesh->subd_dicing_rate_is_modified() || mesh->subd_max_level_is_modified())) {
+        if (mesh->need_tesselation()) {
           total_tess_needed++;
         }
 
@@ -1437,7 +1437,7 @@ void GeometryManager::device_update(Device *device,
       }
 
       Mesh *mesh = static_cast<Mesh *>(geom);
-      if (mesh->subdivision_type != Mesh::SUBDIVISION_NONE && mesh->get_subd_params() && (mesh->verts_is_modified() || mesh->subd_dicing_rate_is_modified() || mesh->subd_max_level_is_modified())) {
+      if (mesh->need_tesselation()) {
         string msg = "Tessellating ";
         if (mesh->name == "")
           msg += string_printf("%u/%u", (uint)(i + 1), (uint)total_tess_needed);
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 7b4c4797700..6a4429169a1 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -176,6 +176,12 @@ SubdParams *Mesh::get_subd_params()
   return subd_params;
 }
 
+bool Mesh::need_tesselation()
+{
+  return get_subd_params() && (verts_is_modified() || subd_dicing_rate_is_modified() ||
+                               subd_objecttoworld_is_modified() || subd_max_level_is_modified());
+}
+
 Mesh::Mesh(const NodeType *node_type, Type geom_type_)
     : Geometry(node_type, geom_type_), subd_attributes(this, ATTR_PRIM_SUBD)
 {
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 762c16810f7..56abd18755c 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -130,6 +130,8 @@ class Mesh : public Geometry {
     return s;
   }
 
+  bool need_tesselation();
+
   enum SubdivisionType {
     SUBDIVISION_NONE,
     SUBDIVISION_LINEAR,
diff --git a/intern/cycles/render/mesh_subdivision.cpp b/intern/cycles/render/mesh_subdivision.cpp
index 40c9f03a853..7408ee2dbdf 100644
--- a/intern/cycles/render/mesh_subdivision.cpp
+++ b/intern/cycles/render/mesh_subdivision.cpp
@@ -371,6 +371,10 @@ struct OsdPatch : Patch {
 
 void Mesh::tessellate(DiagSplit *split)
 {
+  /* reset the number of subdivision vertices, in case the Mesh was not cleared
+   * between calls or data updates */
+  num_subd_verts = 0;
+
 #ifdef WITH_OPENSUBDIV
   OsdData osd_data;
   bool need_packed_patch_table = false;



More information about the Bf-blender-cvs mailing list