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-06-26 19:40:41 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2014-08-12 05:10:06 +0400
commitf75d87bd765fa8d961311eccf979c30665c3d037 (patch)
treea6c5efca08c48e34b60d57a00ffa0904e9afc211 /source/blender/freestyle/intern
parentf70e1ad2fbf93b4b5b90ab915edaa187a2ce8fd7 (diff)
Initial implementation of Cycles materials for Freestyle stroke rendering.
Diffstat (limited to 'source/blender/freestyle/intern')
-rw-r--r--source/blender/freestyle/intern/application/Controller.cpp3
-rw-r--r--source/blender/freestyle/intern/application/Controller.h1
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp73
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h14
4 files changed, 80 insertions, 11 deletions
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<PythonInterpreter*>(_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 <limits.h>
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;