Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2014-07-19 18:42:15 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2014-08-12 05:10:38 +0400
commit6f60ca3cd4da210c740bafec64718923dd9784fb (patch)
tree9669db1eaf9b13699ae549d8e3237e5667a4beb2 /source/blender/freestyle/intern
parent7b1234be1cd7c531e002d18b4cfbfa52ae7c65f7 (diff)
Freestyle: Caching of auto-generated materials from line style shader nodes.
Diffstat (limited to 'source/blender/freestyle/intern')
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp27
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h3
2 files changed, 28 insertions, 2 deletions
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;