From f75d87bd765fa8d961311eccf979c30665c3d037 Mon Sep 17 00:00:00 2001 From: Tamito Kajiyama Date: Fri, 27 Jun 2014 00:40:41 +0900 Subject: Initial implementation of Cycles materials for Freestyle stroke rendering. --- .../freestyle/intern/application/Controller.cpp | 3 +- .../freestyle/intern/application/Controller.h | 1 + .../blender_interface/BlenderStrokeRenderer.cpp | 73 +++++++++++++++++++++- .../blender_interface/BlenderStrokeRenderer.h | 14 ++--- 4 files changed, 80 insertions(+), 11 deletions(-) (limited to 'source/blender/freestyle') diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp index 176199600ac..8f57bbefa54 100644 --- a/source/blender/freestyle/intern/application/Controller.cpp +++ b/source/blender/freestyle/intern/application/Controller.cpp @@ -210,6 +210,7 @@ void Controller::setContext(bContext *C) { PythonInterpreter *py_inter = dynamic_cast(_inter); py_inter->setContext(C); + _context = C; } int Controller::LoadMesh(Render *re, SceneRenderLayer *srl) @@ -850,7 +851,7 @@ void Controller::ResetRenderCount() Render *Controller::RenderStrokes(Render *re, bool render) { _Chrono.start(); - BlenderStrokeRenderer *blenderRenderer = new BlenderStrokeRenderer(re, ++_render_count); + BlenderStrokeRenderer *blenderRenderer = new BlenderStrokeRenderer(_context, re, ++_render_count); if (render) _Canvas->Render(blenderRenderer); real d = _Chrono.stop(); diff --git a/source/blender/freestyle/intern/application/Controller.h b/source/blender/freestyle/intern/application/Controller.h index f5e50347d0f..a653f4a63f5 100644 --- a/source/blender/freestyle/intern/application/Controller.h +++ b/source/blender/freestyle/intern/application/Controller.h @@ -217,6 +217,7 @@ private: real _EPSILON; real _bboxDiag; + bContext *_context; int _render_count; //AppStyleWindow *_pStyleWindow; diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index f232dfb75aa..a047fb160bf 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -32,35 +32,43 @@ extern "C" { #include "DNA_camera_types.h" #include "DNA_listBase.h" +#include "DNA_material_types.h" #include "DNA_meshdata_types.h" #include "DNA_mesh_types.h" #include "DNA_object_types.h" #include "DNA_screen_types.h" +#include "DNA_scene_types.h" #include "BKE_customdata.h" #include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_library.h" /* free_libblock */ -#include "BKE_main.h" /* struct Main */ #include "BKE_material.h" #include "BKE_mesh.h" +#include "BKE_node.h" #include "BKE_object.h" #include "BKE_scene.h" #include "BLI_utildefines.h" #include "RE_pipeline.h" + +#include "C:\bf-blender\blender.git\source\blender\nodes\NOD_shader.h" +#include "C:\bf-blender\blender.git\source\blender\makesrna\RNA_access.h" + +#include "render_types.h" } #include namespace Freestyle { -BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : StrokeRenderer() +BlenderStrokeRenderer::BlenderStrokeRenderer(bContext *C, Render *re, int render_count) : StrokeRenderer() { freestyle_bmain = re->freestyle_bmain; // for stroke mesh generation + _context = C; _width = re->winx; _height = re->winy; @@ -72,6 +80,7 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str freestyle_scene->r.cfra = old_scene->r.cfra; freestyle_scene->r.mode = old_scene->r.mode & ~(R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR | R_BORDER); + freestyle_scene->r.mode |= R_PERSISTENT_DATA; // for nested Cycles sessions freestyle_scene->r.xsch = re->rectx; // old_scene->r.xsch freestyle_scene->r.ysch = re->recty; // old_scene->r.ysch freestyle_scene->r.xasp = 1.0f; // old_scene->r.xasp; @@ -98,7 +107,7 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str freestyle_scene->r.filtertype = old_scene->r.filtertype; freestyle_scene->r.gauss = old_scene->r.gauss; freestyle_scene->r.dither_intensity = old_scene->r.dither_intensity; - strcpy(freestyle_scene->r.engine, "BLENDER_RENDER"); // old_scene->r.engine + BLI_strncpy(freestyle_scene->r.engine, old_scene->r.engine, sizeof(freestyle_scene->r.engine)); freestyle_scene->r.im_format.planes = R_IMF_PLANES_RGBA; freestyle_scene->r.im_format.imtype = R_IMF_IMTYPE_PNG; BKE_scene_disable_color_management(freestyle_scene); @@ -254,6 +263,64 @@ void BlenderStrokeRenderer::RenderStrokeRep(StrokeRep *iStrokeRep) const } a++; } + + if (strcmp(freestyle_scene->r.engine, "CYCLES") == 0) { + bNodeTree *ntree; + bNodeSocket *fromsock, *tosock; + + BLI_assert(BKE_scene_use_new_shading_nodes(freestyle_scene)); + + ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); + ma->nodetree = ntree; + ma->use_nodes = 1; + + bNode *input_attribute = nodeAddStaticNode(_context, ntree, SH_NODE_ATTRIBUTE); + input_attribute->locx = 0.0f; + input_attribute->locy = 0.0f; + NodeShaderAttribute *storage = (NodeShaderAttribute *)input_attribute->storage; + BLI_strncpy(storage->name, "Col", sizeof(storage->name)); + + bNode *shader_emission = nodeAddStaticNode(_context, ntree, SH_NODE_EMISSION); + shader_emission->locx = 200.0f; + shader_emission->locy = 0.0f; + + bNode *input_light_path = nodeAddStaticNode(_context, ntree, SH_NODE_LIGHT_PATH); + input_light_path->locx = 200.0f; + input_light_path->locy = 300.0f; + + bNode *shader_mix = nodeAddStaticNode(_context, ntree, SH_NODE_MIX_SHADER); + shader_mix->locx = 400.0f; + shader_mix->locy = 100.0f; + + bNode *output_material = nodeAddStaticNode(_context, ntree, SH_NODE_OUTPUT_MATERIAL); + output_material->locx = 600.0f; + output_material->locy = 100.0f; + + fromsock = (bNodeSocket *)BLI_findlink(&input_attribute->outputs, 0); + tosock = (bNodeSocket *)BLI_findlink(&shader_emission->inputs, 0); + nodeAddLink(ntree, input_attribute, fromsock, shader_emission, tosock); + + fromsock = (bNodeSocket *)BLI_findlink(&shader_emission->outputs, 0); + tosock = (bNodeSocket *)BLI_findlink(&shader_mix->inputs, 2); + nodeAddLink(ntree, shader_emission, fromsock, shader_mix, tosock); + + fromsock = (bNodeSocket *)BLI_findlink(&input_light_path->outputs, 0); + tosock = (bNodeSocket *)BLI_findlink(&shader_mix->inputs, 0); + nodeAddLink(ntree, input_light_path, fromsock, shader_mix, tosock); + + fromsock = (bNodeSocket *)BLI_findlink(&shader_mix->outputs, 0); + tosock = (bNodeSocket *)BLI_findlink(&output_material->inputs, 0); + nodeAddLink(ntree, shader_mix, fromsock, output_material, tosock); + + nodeSetActive(ntree, shader_mix); + ntreeUpdateTree(freestyle_bmain, ntree); + + PointerRNA scene_ptr; + RNA_pointer_create(NULL, &RNA_Scene, freestyle_scene, &scene_ptr); + PointerRNA cycles_ptr = RNA_pointer_get(&scene_ptr, "cycles"); + RNA_boolean_set(&cycles_ptr, "film_transparent", 1); + } + iStrokeRep->setMaterial(ma); } diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h index 0025d48e77f..3ea5f4de18d 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h @@ -29,12 +29,11 @@ #include "../system/FreestyleConfig.h" extern "C" { -#include "DNA_material_types.h" -#include "DNA_scene_types.h" - -#include "BKE_main.h" - -#include "render_types.h" +struct Main; +struct Object; +struct Render; +struct Scene; +struct bContext; } namespace Freestyle { @@ -42,7 +41,7 @@ namespace Freestyle { class BlenderStrokeRenderer : public StrokeRenderer { public: - BlenderStrokeRenderer(Render *re, int render_count); + BlenderStrokeRenderer(bContext *C, Render *re, int render_count); virtual ~BlenderStrokeRenderer(); /*! Renders a stroke rep */ @@ -57,6 +56,7 @@ protected: Main *freestyle_bmain; Scene *old_scene; Scene *freestyle_scene; + bContext *_context; float _width, _height; float _z, _z_delta; unsigned int _mesh_id; -- cgit v1.2.3