[Bf-blender-cvs] [d5fe3929812] cycles_procedural_api: split Shader::need_update_geometry into different boolean flags

Kévin Dietrich noreply at git.blender.org
Fri Oct 9 17:56:03 CEST 2020


Commit: d5fe3929812b4d112549badeded3724efac01aab
Author: Kévin Dietrich
Date:   Thu Oct 8 06:32:19 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rBd5fe3929812b4d112549badeded3724efac01aab

split Shader::need_update_geometry into different boolean flags

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

M	intern/cycles/blender/blender_geometry.cpp
M	intern/cycles/render/film.cpp
M	intern/cycles/render/geometry.cpp
M	intern/cycles/render/shader.cpp
M	intern/cycles/render/shader.h

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

diff --git a/intern/cycles/blender/blender_geometry.cpp b/intern/cycles/blender/blender_geometry.cpp
index 41dfa090d96..e4f0d4da86c 100644
--- a/intern/cycles/blender/blender_geometry.cpp
+++ b/intern/cycles/blender/blender_geometry.cpp
@@ -115,7 +115,7 @@ Geometry *BlenderSync::sync_geometry(BL::Depsgraph &b_depsgraph,
 
       foreach (Node *node, geom->get_used_shaders()) {
         Shader *shader = static_cast<Shader *>(node);
-        if (shader->need_update_geometry) {
+        if (shader->need_update_geometry()) {
           attribute_recalc = true;
         }
       }
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index 5c3778f6ae5..a3c3a13cafd 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -691,7 +691,7 @@ void Film::tag_passes_update(Scene *scene, const vector<Pass> &passes_, bool upd
     scene->geometry_manager->tag_update(scene);
 
     foreach (Shader *shader, scene->shaders)
-      shader->need_update_geometry = true;
+      shader->need_update_uvs = true;
   }
   else if (Pass::contains(scene->passes, PASS_MOTION) != Pass::contains(passes_, PASS_MOTION)) {
     scene->geometry_manager->tag_update(scene);
diff --git a/intern/cycles/render/geometry.cpp b/intern/cycles/render/geometry.cpp
index 12f2e16ca54..262e1b90a74 100644
--- a/intern/cycles/render/geometry.cpp
+++ b/intern/cycles/render/geometry.cpp
@@ -1257,8 +1257,20 @@ void GeometryManager::device_update(Device *device,
     foreach (Geometry *geom, scene->geometry) {
       foreach (Node *node, geom->get_used_shaders()) {
         Shader *shader = static_cast<Shader *>(node);
-        if (shader->need_update_geometry)
+        if (shader->need_update_uvs) {
+          // todo: attributes
           geom->tag_modified();
+        }
+
+        if (shader->need_update_attribute) {
+          // todo: attributes
+          geom->tag_modified();
+        }
+
+        if (shader->need_update_displacement) {
+          // todo: tag all displacement related sockets as modified
+          geom->tag_modified();
+        }
       }
 
       if (geom->is_modified() &&
@@ -1447,7 +1459,9 @@ void GeometryManager::device_update(Device *device,
   }
 
   foreach (Shader *shader, scene->shaders) {
-    shader->need_update_geometry = false;
+    shader->need_update_uvs = false;
+    shader->need_update_attribute = false;
+    shader->need_update_displacement = false;
   }
 
   Scene::MotionType need_motion = scene->need_motion();
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index cf49dedc426..ce95c179ea1 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -218,7 +218,9 @@ Shader::Shader() : Node(node_type)
   id = -1;
   used = false;
 
-  need_update_geometry = true;
+  need_update_uvs = true;
+  need_update_attribute = true;
+  need_update_displacement = true;
 }
 
 Shader::~Shader()
@@ -291,7 +293,7 @@ void Shader::set_graph(ShaderGraph *graph_)
     const char *new_hash = (graph_) ? graph_->displacement_hash.c_str() : "";
 
     if (strcmp(old_hash, new_hash) != 0) {
-      need_update_geometry = true;
+      need_update_displacement = true;
     }
   }
 
@@ -354,7 +356,7 @@ void Shader::tag_update(Scene *scene)
   /* compare if the attributes changed, mesh manager will check
    * need_update_geometry, update the relevant meshes and clear it. */
   if (attributes.modified(prev_attributes)) {
-    need_update_geometry = true;
+    need_update_attribute = true;
     scene->geometry_manager->need_update = true;
   }
 
@@ -375,6 +377,11 @@ void Shader::tag_used(Scene *scene)
   }
 }
 
+bool Shader::need_update_geometry() const
+{
+  return need_update_uvs || need_update_attribute || need_update_displacement;
+}
+
 /* Shader Manager */
 
 ShaderManager::ShaderManager()
diff --git a/intern/cycles/render/shader.h b/intern/cycles/render/shader.h
index f8f455a12f3..19bffadbfe8 100644
--- a/intern/cycles/render/shader.h
+++ b/intern/cycles/render/shader.h
@@ -100,7 +100,9 @@ class Shader : public Node {
   float prev_volume_step_rate;
 
   /* synchronization */
-  bool need_update_geometry;
+  bool need_update_uvs;
+  bool need_update_attribute;
+  bool need_update_displacement ;
 
   /* If the shader has only volume components, the surface is assumed to
    * be transparent.
@@ -152,6 +154,8 @@ class Shader : public Node {
   void set_graph(ShaderGraph *graph);
   void tag_update(Scene *scene);
   void tag_used(Scene *scene);
+
+  bool need_update_geometry() const;
 };
 
 /* Shader Manager virtual base class



More information about the Bf-blender-cvs mailing list