[Bf-blender-cvs] [dbd8733] cycles_memory_experiments: Cycles: Replace name-based node matching with type-based

Sergey Sharybin noreply at git.blender.org
Mon Apr 20 13:38:03 CEST 2015


Commit: dbd873380f5865c0c8d200f4866c2b470842a0c3
Author: Sergey Sharybin
Date:   Mon Apr 20 15:29:27 2015 +0500
Branches: cycles_memory_experiments
https://developer.blender.org/rBdbd873380f5865c0c8d200f4866c2b470842a0c3

Cycles: Replace name-based node matching with type-based

This commit replaces name-based node matching in the mesh device update
with check of special type. It is more robust approach for adding new
nodes which could use image slots for storage. it's also adds updates
of environment texture nodes used in bump shader (this was missing in
the original image sync reshuffle commit).

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

M	intern/cycles/render/graph.h
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h

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

diff --git a/intern/cycles/render/graph.h b/intern/cycles/render/graph.h
index b39b3da..301938a 100644
--- a/intern/cycles/render/graph.h
+++ b/intern/cycles/render/graph.h
@@ -81,6 +81,7 @@ enum ShaderNodeSpecialType {
 	SHADER_SPECIAL_TYPE_GEOMETRY,
 	SHADER_SPECIAL_TYPE_SCRIPT,
 	SHADER_SPECIAL_TYPE_BACKGROUND,
+	SHADER_SPECIAL_TYPE_IMAGE_SLOT,
 };
 
 /* Enum
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 06c34b7..3fabe01 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -1170,31 +1170,30 @@ void MeshManager::device_update_displacement_images(Device *device,
 		if(mesh->need_update) {
 			foreach(uint shader_index, mesh->used_shaders) {
 				Shader *shader = scene->shaders[shader_index];
-				if(shader->graph_bump) {
-					foreach(ShaderNode* node, shader->graph_bump->nodes) {
-						int slot = -1;
-						if(node->name == "image_texture") {
-							slot = ((ImageTextureNode *)node)->slot;
-						}
-						if(slot != -1) {
-							if(device->info.pack_images) {
-								/* If device requires packed images we need to
-								 * update all images now, even if they're not
-								 * used for displacement.
-								 */
-								image_manager->device_update(device,
-								                             dscene,
-								                             progress);
-								return;
-							}
-							pool.push(function_bind(&ImageManager::device_update_slot,
-							                        image_manager,
-							                        device,
-							                        dscene,
-							                        slot,
-							                        &progress));
-						}
+				if(shader->graph_bump == NULL) {
+					continue;
+				}
+				foreach(ShaderNode* node, shader->graph_bump->nodes) {
+					if(node->special_type != SHADER_SPECIAL_TYPE_IMAGE_SLOT) {
+						continue;
+					}
+					if(device->info.pack_images) {
+						/* If device requires packed images we need to update all
+						 * images now, even if they're not used for displacement.
+						 */
+						image_manager->device_update(device,
+						                             dscene,
+						                             progress);
+						return;
 					}
+					ImageSlotNode *image_node = static_cast<ImageSlotNode*>(node);
+					assert(image_node->slot != -1);
+					pool.push(function_bind(&ImageManager::device_update_slot,
+					                        image_manager,
+					                        device,
+					                        dscene,
+					                        image_node->slot,
+					                        &progress));
 				}
 			}
 		}
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 40bb82c..747bafc 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -186,7 +186,7 @@ ShaderEnum ImageTextureNode::color_space_enum = color_space_init();
 ShaderEnum ImageTextureNode::projection_enum = image_projection_init();
 
 ImageTextureNode::ImageTextureNode()
-: TextureNode("image_texture")
+: ImageSlotTextureNode("image_texture")
 {
 	image_manager = NULL;
 	slot = -1;
@@ -380,7 +380,7 @@ ShaderEnum EnvironmentTextureNode::color_space_enum = color_space_init();
 ShaderEnum EnvironmentTextureNode::projection_enum = env_projection_init();
 
 EnvironmentTextureNode::EnvironmentTextureNode()
-: TextureNode("environment_texture")
+: ImageSlotTextureNode("environment_texture")
 {
 	image_manager = NULL;
 	slot = -1;
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 0ec0fce..ee98477 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -55,13 +55,28 @@ public:
 
 /* Nodes */
 
+/* Any node which uses image manager's slot should be a subclass of this one. */
+class ImageSlotNode : public ShaderNode {
+public:
+	ImageSlotNode(const char *name_) : ShaderNode(name_) {
+		special_type = SHADER_SPECIAL_TYPE_IMAGE_SLOT;
+	}
+	int slot;
+};
+
 class TextureNode : public ShaderNode {
 public:
 	TextureNode(const char *name_) : ShaderNode(name_) {}
 	TextureMapping tex_mapping;
 };
 
-class ImageTextureNode : public TextureNode {
+class ImageSlotTextureNode : public ImageSlotNode {
+public:
+	ImageSlotTextureNode(const char *name_) : ImageSlotNode(name_) {}
+	TextureMapping tex_mapping;
+};
+
+class ImageTextureNode : public ImageSlotTextureNode {
 public:
 	SHADER_NODE_NO_CLONE_CLASS(ImageTextureNode)
 	~ImageTextureNode();
@@ -69,7 +84,6 @@ public:
 	void attributes(Shader *shader, AttributeRequestSet *attributes);
 
 	ImageManager *image_manager;
-	int slot;
 	int is_float;
 	bool is_linear;
 	bool use_alpha;
@@ -85,7 +99,7 @@ public:
 	static ShaderEnum projection_enum;
 };
 
-class EnvironmentTextureNode : public TextureNode {
+class EnvironmentTextureNode : public ImageSlotTextureNode {
 public:
 	SHADER_NODE_NO_CLONE_CLASS(EnvironmentTextureNode)
 	~EnvironmentTextureNode();
@@ -93,7 +107,6 @@ public:
 	void attributes(Shader *shader, AttributeRequestSet *attributes);
 
 	ImageManager *image_manager;
-	int slot;
 	int is_float;
 	bool is_linear;
 	bool use_alpha;




More information about the Bf-blender-cvs mailing list