[Bf-blender-cvs] [6f60ca3] master: Freestyle: Caching of auto-generated materials from line style shader nodes.

Tamito Kajiyama noreply at git.blender.org
Tue Aug 12 03:18:01 CEST 2014


Commit: 6f60ca3cd4da210c740bafec64718923dd9784fb
Author: Tamito Kajiyama
Date:   Sat Jul 19 23:42:15 2014 +0900
Branches: master
https://developer.blender.org/rB6f60ca3cd4da210c740bafec64718923dd9784fb

Freestyle: Caching of auto-generated materials from line style shader nodes.

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

M	source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
M	source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h

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

diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
index e755441..5d4a2ad 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
@@ -52,6 +52,7 @@ extern "C" {
 #include "BKE_object.h"
 #include "BKE_scene.h"
 
+#include "BLI_ghash.h"
 #include "BLI_listbase.h"
 #include "BLI_utildefines.h"
 
@@ -142,6 +143,15 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(bContext *C, Render *re, int render
 
 	// Reset serial mesh ID (used for BlenderStrokeRenderer::NewMesh())
 	_mesh_id = 0xffffffff;
+
+	// Check if the rendering engine uses new shading nodes
+	_use_shading_nodes = BKE_scene_use_new_shading_nodes(freestyle_scene);
+
+	// Create a bNodeTree-to-Material hash table
+	if (_use_shading_nodes)
+		_nodetree_hash = BLI_ghash_ptr_new("BlenderStrokeRenderer::_nodetree_hash");
+	else
+		_nodetree_hash = NULL;
 }
 
 BlenderStrokeRenderer::~BlenderStrokeRenderer()
@@ -199,6 +209,9 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer()
 		lnk = lnk->next;
 		BKE_libblock_free(freestyle_bmain, ma);
 	}
+
+	if (_use_shading_nodes)
+		BLI_ghash_free(_nodetree_hash, NULL, NULL);
 }
 
 float BlenderStrokeRenderer::get_stroke_vertex_z(void) const
@@ -358,8 +371,18 @@ Material* BlenderStrokeRenderer::GetStrokeShader(bContext *C, Main *bmain, bNode
 
 void BlenderStrokeRenderer::RenderStrokeRep(StrokeRep *iStrokeRep) const
 {
-	if (BKE_scene_use_new_shading_nodes(freestyle_scene)) {
-		Material *ma = BlenderStrokeRenderer::GetStrokeShader(_context, freestyle_bmain, iStrokeRep->getNodeTree());
+	if (_use_shading_nodes) {
+		bNodeTree *nt = iStrokeRep->getNodeTree();
+		Material *ma = (Material *)BLI_ghash_lookup(_nodetree_hash, nt);
+		if (!ma) {
+			ma = BlenderStrokeRenderer::GetStrokeShader(_context, freestyle_bmain, nt);
+			BLI_ghash_insert(_nodetree_hash, nt, ma);
+#if 0
+			if (G.debug & G_DEBUG_FREESTYLE) {
+				printf("Material '%s' created using ShaderNodeTree '%s'\n", ma->id.name+2, nt->id.name+2);
+			}
+#endif
+		}
 
 		if (strcmp(freestyle_scene->r.engine, "CYCLES") == 0) {
 			PointerRNA scene_ptr;
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
index 609909a..32adc3e 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
@@ -29,6 +29,7 @@
 #include "../system/FreestyleConfig.h"
 
 extern "C" {
+struct GHash;
 struct Main;
 struct Material;
 struct Object;
@@ -64,6 +65,8 @@ protected:
 	float _width, _height;
 	float _z, _z_delta;
 	unsigned int _mesh_id;
+	bool _use_shading_nodes;
+	struct GHash *_nodetree_hash;
 
 	float get_stroke_vertex_z(void) const;
 	unsigned int get_stroke_mesh_id(void) const;




More information about the Bf-blender-cvs mailing list