From 6f60ca3cd4da210c740bafec64718923dd9784fb Mon Sep 17 00:00:00 2001 From: Tamito Kajiyama Date: Sat, 19 Jul 2014 23:42:15 +0900 Subject: Freestyle: Caching of auto-generated materials from line style shader nodes. --- .../blender_interface/BlenderStrokeRenderer.cpp | 27 ++++++++++++++++++++-- .../blender_interface/BlenderStrokeRenderer.h | 3 +++ 2 files changed, 28 insertions(+), 2 deletions(-) (limited to 'source/blender/freestyle') diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index e7554417417..5d4a2adad81 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 609909a8b26..32adc3e2cf1 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; -- cgit v1.2.3