[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