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:
-rw-r--r--source/blender/freestyle/FRS_freestyle.h35
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/Controller.cpp9
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/Controller.h7
-rw-r--r--source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp300
-rw-r--r--source/blender/freestyle/intern/scene_graph/BlenderFileLoader.cpp20
-rw-r--r--source/blender/freestyle/intern/scene_graph/BlenderFileLoader.h3
-rw-r--r--source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp12
-rw-r--r--source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h2
-rwxr-xr-xsource/blender/freestyle/intern/stroke/Canvas.cpp6
-rwxr-xr-xsource/blender/freestyle/intern/stroke/Canvas.h1
-rw-r--r--source/blender/include/butspace.h5
-rw-r--r--source/blender/render/intern/include/render_types.h3
-rw-r--r--source/blender/render/intern/source/convertblender.c5
-rw-r--r--source/blender/render/intern/source/rendercore.c44
-rw-r--r--source/blender/src/buttons_scene.c131
-rw-r--r--source/blender/src/usiblender.c2
16 files changed, 389 insertions, 196 deletions
diff --git a/source/blender/freestyle/FRS_freestyle.h b/source/blender/freestyle/FRS_freestyle.h
index 3bc6e092f02..7151471a561 100644
--- a/source/blender/freestyle/FRS_freestyle.h
+++ b/source/blender/freestyle/FRS_freestyle.h
@@ -8,10 +8,15 @@
extern "C" {
#endif
- extern char style_module[255];
- extern int freestyle_flags;
- extern float freestyle_sphere_radius;
- extern float freestyle_dkr_epsilon;
+ typedef struct StyleModuleConf {
+ struct StyleModuleConf *next, *prev;
+
+ char module_path[255];
+ short is_displayed;
+ } StyleModuleConf;
+
+
+ extern short freestyle_is_initialized;
extern float freestyle_fovyradian;
extern float freestyle_viewpoint[3];
@@ -19,11 +24,27 @@ extern "C" {
extern float freestyle_proj[4][4];
extern int freestyle_viewport[4];
+ extern short freestyle_current_layer_number;
+ extern char* freestyle_current_module_path;
+ extern SceneRenderLayer* freestyle_current_layer;
+ extern ListBase* freestyle_modules;
+ extern int* freestyle_flags;
+ extern float* freestyle_sphere_radius;
+ extern float* freestyle_dkr_epsilon;
+
+ // Rendering
void FRS_initialize();
- void FRS_prepare(Render* re);
- void FRS_render_Blender(Render* re);
- void FRS_composite_result(Render* re, SceneRenderLayer* srl);
void FRS_add_Freestyle(Render* re);
+ void FRS_exit();
+
+ // Panel configuration
+ void FRS_select_layer( SceneRenderLayer* srl );
+ void FRS_delete_layer( SceneRenderLayer* srl, short isDestructor );
+ void FRS_add_module();
+ void FRS_delete_module(void *module_index_ptr, void *unused);
+ void FRS_move_up_module(void *module_index_ptr, void *unused);
+ void FRS_move_down_module(void *module_index_ptr, void *unused);
+ void FRS_set_module_path(void *module_index_ptr, void *unused);
#ifdef __cplusplus
}
diff --git a/source/blender/freestyle/intern/app_blender/Controller.cpp b/source/blender/freestyle/intern/app_blender/Controller.cpp
index 8c00dd9b3f3..f960b749ce6 100755
--- a/source/blender/freestyle/intern/app_blender/Controller.cpp
+++ b/source/blender/freestyle/intern/app_blender/Controller.cpp
@@ -175,10 +175,10 @@ void Controller::setView(AppView *iView)
_Canvas->setViewer(_pView);
}
-int Controller::LoadMesh(Render *re)
+int Controller::LoadMesh(Render *re, SceneRenderLayer* srl)
{
- BlenderFileLoader loader(re);
+ BlenderFileLoader loader(re, srl);
_Chrono.start();
@@ -640,11 +640,12 @@ void Controller::DrawStrokes()
resetModified();
}
-void Controller::RenderBlender(Render *re) {
+Render* Controller::RenderStrokes(Render *re) {
BlenderStrokeRenderer* blenderRenderer = new BlenderStrokeRenderer;
_Canvas->Render( blenderRenderer );
- blenderRenderer->RenderScene(re);
+ Render* freestyle_render = blenderRenderer->RenderScene(re);
blenderRenderer->Close();
+ return freestyle_render;
}
void Controller::InsertStyleModule(unsigned index, const char *iFileName)
diff --git a/source/blender/freestyle/intern/app_blender/Controller.h b/source/blender/freestyle/intern/app_blender/Controller.h
index 84c50061d7c..46d08d0c686 100755
--- a/source/blender/freestyle/intern/app_blender/Controller.h
+++ b/source/blender/freestyle/intern/app_blender/Controller.h
@@ -57,6 +57,7 @@ extern "C" {
#endif
#include "render_types.h"
+ #include "DNA_scene_types.h"
#ifdef __cplusplus
}
@@ -73,15 +74,15 @@ public:
//soc
void init_options();
- int LoadMesh( Render *re );
+ int LoadMesh( Render *re, SceneRenderLayer* srl );
int Load3DSFile(const char *iFileName);
void CloseFile();
void ComputeViewMap();
void ComputeSteerableViewMap();
void saveSteerableViewMapImages();
void toggleEdgeTesselationNature(Nature::EdgeNature iNature);
- void RenderBlender(Render *re);
- void DrawStrokes();
+ void DrawStrokes();
+ Render* RenderStrokes(Render *re);
void SwapStyleModules(unsigned i1, unsigned i2);
void InsertStyleModule(unsigned index, const char *iFileName);
void AddStyleModule(const char *iFileName);
diff --git a/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp b/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp
index af9210205bd..74414fbc844 100644
--- a/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp
+++ b/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp
@@ -4,70 +4,108 @@
#include "AppCanvas.h"
#include <iostream>
+#include <map>
+#include <set>
+using namespace std;
#ifdef __cplusplus
extern "C" {
#endif
-#include "../../FRS_freestyle.h"
+#include "MEM_guardedalloc.h"
#include "DNA_camera_types.h"
+#include "DNA_listBase.h"
#include "DNA_scene_types.h"
-#include "render_types.h"
-#include "renderpipeline.h"
-#include "pixelblending.h"
-
+#include "BKE_global.h"
#include "BLI_blenlib.h"
#include "BIF_renderwin.h"
#include "BPY_extern.h"
-#ifdef __cplusplus
-}
-#endif
-
-using namespace std;
+#include "render_types.h"
+#include "renderpipeline.h"
+#include "pixelblending.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
+#include "../../FRS_freestyle.h"
+ // Freestyle configuration
+ short freestyle_is_initialized = 0;
static Config::Path *pathconfig = NULL;
static Controller *controller = NULL;
static AppView *view = NULL;
- char style_module[255] = "";
- int freestyle_flags;
- float freestyle_sphere_radius = 1.0;
- float freestyle_dkr_epsilon = 0.001;
-
+ // camera information
float freestyle_viewpoint[3];
float freestyle_mv[4][4];
float freestyle_proj[4][4];
int freestyle_viewport[4];
+
+ // Panel configuration
+ short freestyle_current_layer_number = 0;
+ char* freestyle_current_module_path = NULL;
+ SceneRenderLayer* freestyle_current_layer = NULL;
+
+ ListBase* freestyle_modules;
+ int* freestyle_flags;
+ float* freestyle_sphere_radius;
+ float* freestyle_dkr_epsilon;
+
+ class FreestylePanelConfigurationData {
+ public:
+ set<SceneRenderLayer*> layers;
+ map<SceneRenderLayer*, ListBase*> modules;
+ map<SceneRenderLayer*, int*> flags;
+ map<SceneRenderLayer*, float*> sphere_radius;
+ map<SceneRenderLayer*, float*> dkr_epsilon;
+
+ FreestylePanelConfigurationData() {}
+ ~FreestylePanelConfigurationData() {
+ set<SceneRenderLayer*>::iterator it;
+
+ for( it=layers.begin(); it!=layers.end(); it++)
+ FRS_delete_layer( *it, 1 );
+ }
+ };
+ static FreestylePanelConfigurationData* panelConfig;
+
+ string default_module_path;
+
+ //=======================================================
+ // Initialization
+ //=======================================================
void FRS_initialize(){
- if( pathconfig == NULL )
+ if( !freestyle_is_initialized ) {
+
pathconfig = new Config::Path;
-
- if( controller == NULL )
controller = new Controller;
-
- if( view == NULL ) {
view = new AppView;
controller->setView(view);
+
+ panelConfig = new FreestylePanelConfigurationData;
+
+ default_module_path = pathconfig->getProjectDir() + Config::DIR_SEP + "style_modules" + Config::DIR_SEP + "contour.py";
+ FRS_select_layer( (SceneRenderLayer*) BLI_findlink(&G.scene->r.layers, G.scene->r.actlay) );
+
+ freestyle_is_initialized = 1;
}
- if( strlen(style_module) == 0 ){
- string path( pathconfig->getProjectDir() + Config::DIR_SEP + "style_modules" + Config::DIR_SEP + "contour.py" );
- strcpy( style_module, path.c_str() );
- }
-
+ }
+
+ void FRS_exit() {
+ delete pathconfig;
+ delete controller;
+ delete view;
+ delete panelConfig;
}
+ //=======================================================
+ // Rendering
+ //=======================================================
- void FRS_init_view(Render* re){
+ void init_view(Render* re){
int width = re->scene->r.xsch;
int height = re->scene->r.ysch;
@@ -79,7 +117,7 @@ extern "C" {
view->setHeight( height );
}
- void FRS_init_camera(Render* re){
+ void init_camera(Render* re){
Object* maincam_obj = re->scene->camera;
Camera *cam = (Camera*) maincam_obj->data;
@@ -115,29 +153,34 @@ extern "C" {
}
- void FRS_prepare(Render* re) {
+ void prepare(Render* re, SceneRenderLayer* srl ) {
- // init
- FRS_initialize();
- FRS_init_view(re);
- FRS_init_camera(re);
+ // clear canvas
controller->Clear();
// load mesh
- if( controller->LoadMesh(re) ) // returns if scene cannot be loaded or if empty
+ if( controller->LoadMesh(re, srl) ) // returns if scene cannot be loaded or if empty
return;
- // add style module
- cout << "\n=== Rendering options ===" << endl;
- cout << "Module: " << style_module << endl;
- controller->InsertStyleModule( 0, style_module );
- controller->toggleLayer(0, true);
+ // add style modules
+ cout << "\n=== Rendering options ===" << endl;
+ cout << "Modules :"<< endl;
+ int layer_count = 0;
+ for( StyleModuleConf* module_conf = (StyleModuleConf *)panelConfig->modules[srl]->first; module_conf; module_conf = module_conf->next ) {
+ if( module_conf->is_displayed ) {
+ cout << " " << layer_count+1 << ": " << module_conf->module_path << endl;
+ controller->InsertStyleModule( layer_count, module_conf->module_path );
+ controller->toggleLayer(layer_count, true);
+ layer_count++;
+ }
+ }
+ cout << endl;
// set parameters
- controller->setSphereRadius(freestyle_sphere_radius);
- controller->setComputeRidgesAndValleysFlag((freestyle_flags & FREESTYLE_RIDGES_AND_VALLEYS_FLAG) ? true : false);
- controller->setComputeSuggestiveContoursFlag((freestyle_flags & FREESTYLE_SUGGESTIVE_CONTOURS_FLAG) ? true : false);
- controller->setSuggestiveContourKrDerivativeEpsilon(freestyle_dkr_epsilon);
+ controller->setSphereRadius(*panelConfig->sphere_radius[srl]);
+ controller->setComputeRidgesAndValleysFlag((*panelConfig->flags[srl] & FREESTYLE_RIDGES_AND_VALLEYS_FLAG) ? true : false);
+ controller->setComputeSuggestiveContoursFlag((*panelConfig->flags[srl] & FREESTYLE_SUGGESTIVE_CONTOURS_FLAG) ? true : false);
+ controller->setSuggestiveContourKrDerivativeEpsilon(*panelConfig->dkr_epsilon[srl]);
cout << "Sphere radius : " << controller->getSphereRadius() << endl;
cout << "Redges and valleys : " << (controller->getComputeRidgesAndValleysFlag() ? "enabled" : "disabled") << endl;
@@ -148,33 +191,17 @@ extern "C" {
controller->ComputeViewMap();
}
- void FRS_render_Blender(Render* re) {
-
- if( controller->_ViewMap ) {
- cout << "\n=== Rendering Freestyle with Blender's internal renderer ===" << endl;
-
- // build strokes
- controller->DrawStrokes();
-
- controller->RenderBlender(re);
- controller->CloseFile();
- } else {
- cout << "Freestyle cannot be used because the view map is not available" << endl;
- }
- cout << "\n###################################################################" << endl;
- }
-
- void FRS_composite_result(Render* re, SceneRenderLayer* srl)
+ void composite_result(Render* re, SceneRenderLayer* srl, Render* freestyle_render)
{
RenderLayer *rl;
float *src, *dest, *pixSrc, *pixDest;
int x, y, rectx, recty;
- if( re->freestyle_render == NULL || re->freestyle_render->result == NULL )
+ if( freestyle_render == NULL || freestyle_render->result == NULL )
return;
- rl = render_get_active_layer( re->freestyle_render, re->freestyle_render->result );
+ rl = render_get_active_layer( freestyle_render, freestyle_render->result );
if( !rl || rl->rectf == NULL) { cout << "Cannot find Freestyle result image" << endl; return; }
src = rl->rectf;
@@ -198,21 +225,150 @@ extern "C" {
}
+ int displayed_layer_count( SceneRenderLayer* srl ) {
+ int count = 0;
+
+ for( StyleModuleConf* module_conf = (StyleModuleConf *)panelConfig->modules[srl]->first; module_conf; module_conf = module_conf->next ) {
+ if( module_conf->is_displayed )
+ count++;
+ }
+ return count;
+ }
+
void FRS_add_Freestyle(Render* re) {
- SceneRenderLayer *srl, *freestyle_srl = NULL;
- for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl && (freestyle_srl == NULL); srl= srl->next) {
- if(srl->layflag & SCE_LAY_FRS) {
- if (!freestyle_srl) freestyle_srl = srl;
+ SceneRenderLayer *srl;
+ Render* freestyle_render = NULL;
+
+ // init
+ cout << "\n#===============================================================" << endl;
+ cout << "# Freestyle" << endl;
+ cout << "#===============================================================" << endl;
+
+ FRS_initialize();
+ init_view(re);
+ init_camera(re);
+
+ for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl; srl= srl->next) {
+ if( !(srl->layflag & SCE_LAY_DISABLE) &&
+ srl->layflag & SCE_LAY_FRS &&
+ displayed_layer_count(srl) > 0 )
+ {
+ cout << "\n----------------------------------------------------------" << endl;
+ cout << "| "<< srl->name << endl;
+ cout << "----------------------------------------------------------" << endl;
+
+ // prepare Freestyle:
+ // - clear canvas
+ // - load mesh
+ // - add style modules
+ // - set parameters
+ // - compute view map
+ prepare(re, srl);
+
+ // render and composite Freestyle result
+ if( controller->_ViewMap ) {
+
+ // render strokes
+ controller->DrawStrokes();
+ freestyle_render = controller->RenderStrokes(re);
+ controller->CloseFile();
+
+ // composite result
+ composite_result(re, srl, freestyle_render);
+
+ // free resources
+ RE_FreeRender(freestyle_render);
+ }
}
}
- if( freestyle_srl ) {
- FRS_prepare(re);
- FRS_render_Blender(re);
- FRS_composite_result(re, freestyle_srl);
+ }
+
+ //=======================================================
+ // Freestyle Panel Configuration
+ //=======================================================
+
+ void FRS_select_layer( SceneRenderLayer* srl )
+ {
+ if( panelConfig->layers.find(srl) == panelConfig->layers.end() )
+ {
+ panelConfig->layers.insert(srl);
+
+ panelConfig->modules[srl] = new ListBase;
+ panelConfig->modules[srl]->first = panelConfig->modules[srl]->last = NULL;
+
+ panelConfig->flags[srl] = new int(0);
+ panelConfig->sphere_radius[srl] = new float(1.0);
+ panelConfig->dkr_epsilon[srl] = new float(0.001);
}
+
+ freestyle_modules = panelConfig->modules[srl];
+ freestyle_flags = panelConfig->flags[srl];
+ freestyle_sphere_radius = panelConfig->sphere_radius[srl];
+ freestyle_dkr_epsilon = panelConfig->dkr_epsilon[srl];
+
+ freestyle_current_layer = srl;
+ freestyle_current_layer_number = BLI_findindex(&G.scene->r.layers, freestyle_current_layer);
}
+
+ void FRS_delete_layer( SceneRenderLayer* srl, short isDestructor )
+ {
+ BLI_freelistN( panelConfig->modules[srl] );
+ delete panelConfig->modules[srl];
+
+ delete panelConfig->flags[srl];
+ delete panelConfig->sphere_radius[srl];
+ delete panelConfig->dkr_epsilon[srl];
+
+ panelConfig->modules.erase(srl);
+ panelConfig->flags.erase(srl);
+ panelConfig->sphere_radius.erase(srl);
+ panelConfig->dkr_epsilon.erase(srl);
+
+ if( !isDestructor )
+ panelConfig->layers.erase(srl);
+ }
+
+ void FRS_add_module()
+ {
+ StyleModuleConf* module_conf = (StyleModuleConf*) MEM_callocN( sizeof(StyleModuleConf), "style module configuration");
+ BLI_addtail(freestyle_modules, (void*) module_conf);
+
+ strcpy( module_conf->module_path, default_module_path.c_str() );
+ module_conf->is_displayed = 1;
+ }
+
+ void FRS_delete_module(void *module_index_ptr, void *unused)
+ {
+ StyleModuleConf* module_conf = (StyleModuleConf*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
+
+ BLI_freelinkN( freestyle_modules, module_conf);
+ }
+
+ void FRS_move_up_module(void *module_index_ptr, void *unused)
+ {
+ StyleModuleConf* module_conf = (StyleModuleConf*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
+
+ BLI_remlink(freestyle_modules, module_conf);
+ BLI_insertlink(freestyle_modules, module_conf->prev->prev, module_conf);
+ }
+
+ void FRS_move_down_module(void *module_index_ptr, void *unused)
+ {
+ StyleModuleConf* module_conf = (StyleModuleConf*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
+
+ BLI_remlink(freestyle_modules, module_conf);
+ BLI_insertlink(freestyle_modules, module_conf->next, module_conf);
+ }
+
+ void FRS_set_module_path(void *module_index_ptr, void *unused)
+ {
+ StyleModuleConf* module_conf = (StyleModuleConf*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
+ freestyle_current_module_path = module_conf->module_path;
+ }
+
+
#ifdef __cplusplus
}
diff --git a/source/blender/freestyle/intern/scene_graph/BlenderFileLoader.cpp b/source/blender/freestyle/intern/scene_graph/BlenderFileLoader.cpp
index d1713254ce7..4dc92755ad9 100644
--- a/source/blender/freestyle/intern/scene_graph/BlenderFileLoader.cpp
+++ b/source/blender/freestyle/intern/scene_graph/BlenderFileLoader.cpp
@@ -1,8 +1,9 @@
#include "BlenderFileLoader.h"
-BlenderFileLoader::BlenderFileLoader(Render *re)
+BlenderFileLoader::BlenderFileLoader(Render *re, SceneRenderLayer* srl)
{
_re = re;
+ _srl = srl;
_Scene = NULL;
_numFacesRead = 0;
_minEdgeSize = DBL_MAX;
@@ -19,28 +20,13 @@ NodeGroup* BlenderFileLoader::Load()
ObjectRen *obr;
cout << "\n=== Importing triangular meshes into Blender ===" << endl;
-
- SceneRenderLayer *srl, *active_srl = NULL;
- int count = 0;
- for(srl= (SceneRenderLayer *)_re->scene->r.layers.first; srl; srl= srl->next) {
- if(srl->layflag & SCE_LAY_FRS) {
- if (!active_srl) active_srl = srl;
- count++;
- }
- }
- if (count > 1) {
- cout << "Warning: Freestyle is enabled in the following " << count << " scene render layers:" << endl;
- for(srl= (SceneRenderLayer *)_re->scene->r.layers.first; srl; srl= srl->next)
- if(srl->layflag & SCE_LAY_FRS)
- cout << " \"" << srl->name << "\"" << ((active_srl == srl) ? " (only this is taken into account)" : "") << endl;
- }
// creation of the scene root node
_Scene = new NodeGroup;
int id = 0;
for(obi= (ObjectInstanceRen *) _re->instancetable.first; obi; obi=obi->next) {
- if (!(obi->lay & _re->scene->lay & active_srl->lay))
+ if (!(obi->lay & _re->scene->lay & _srl->lay))
continue;
obr= obi->obr;
diff --git a/source/blender/freestyle/intern/scene_graph/BlenderFileLoader.h b/source/blender/freestyle/intern/scene_graph/BlenderFileLoader.h
index 8202c0e4716..ea5d9cb1a52 100644
--- a/source/blender/freestyle/intern/scene_graph/BlenderFileLoader.h
+++ b/source/blender/freestyle/intern/scene_graph/BlenderFileLoader.h
@@ -38,7 +38,7 @@ class LIB_SCENE_GRAPH_EXPORT BlenderFileLoader
{
public:
/*! Builds a MaxFileLoader */
- BlenderFileLoader(Render *re);
+ BlenderFileLoader(Render *re, SceneRenderLayer* srl);
virtual ~BlenderFileLoader();
/*! Loads the 3D scene and returns a pointer to the scene root node */
@@ -55,6 +55,7 @@ protected:
protected:
Render* _re;
+ SceneRenderLayer* _srl;
NodeGroup* _Scene;
unsigned _numFacesRead;
real _minEdgeSize;
diff --git a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
index 286d23c619b..6dc45300b9d 100644
--- a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
@@ -228,20 +228,16 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{
}
-void BlenderStrokeRenderer::RenderScene( Render *re ) {
+Render* BlenderStrokeRenderer::RenderScene( Render *re ) {
scene->r.mode &= ~( R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR );
scene->r.scemode &= ~( R_SINGLE_LAYER );
scene->r.planes = R_PLANES32;
scene->r.imtype = R_PNG;
- re->freestyle_render = RE_NewRender(scene->id.name);
+ Render* freestyle_render = RE_NewRender(scene->id.name);
- RE_BlenderFrame( re->freestyle_render, scene, 1);
-
- // char filepath[255];
- // BLI_strncpy( filepath, "/Users/mx/Desktop/", sizeof(filepath) );
- // strcat(filepath, "frs_result");
- // BIF_save_rendered_image(filepath);
+ RE_BlenderFrame( freestyle_render, scene, 1);
+ return freestyle_render;
}
void BlenderStrokeRenderer::Close() {
diff --git a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h
index 9f7d2d4cd19..03f365525ed 100644
--- a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h
+++ b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h
@@ -30,7 +30,7 @@ public:
virtual void RenderStrokeRep(StrokeRep *iStrokeRep) const;
virtual void RenderStrokeRepBasic(StrokeRep *iStrokeRep) const;
- void RenderScene(Render *re);
+ Render* RenderScene(Render *re);
void Close();
protected:
diff --git a/source/blender/freestyle/intern/stroke/Canvas.cpp b/source/blender/freestyle/intern/stroke/Canvas.cpp
index 10a704c304a..7be2b54a036 100755
--- a/source/blender/freestyle/intern/stroke/Canvas.cpp
+++ b/source/blender/freestyle/intern/stroke/Canvas.cpp
@@ -171,6 +171,12 @@ void Canvas::Erase()
stroke_count = 0;
}
+void Canvas::PushBackStyleModule(StyleModule *iStyleModule) {
+ StrokeLayer* layer = new StrokeLayer();
+ _StyleModules.push_back(iStyleModule);
+ _Layers.push_back(layer);
+}
+
void Canvas::InsertStyleModule(unsigned index, StyleModule *iStyleModule) {
unsigned size = _StyleModules.size();
StrokeLayer* layer = new StrokeLayer();
diff --git a/source/blender/freestyle/intern/stroke/Canvas.h b/source/blender/freestyle/intern/stroke/Canvas.h
index b61e70099a8..707455c87f6 100755
--- a/source/blender/freestyle/intern/stroke/Canvas.h
+++ b/source/blender/freestyle/intern/stroke/Canvas.h
@@ -180,6 +180,7 @@ public:
/*! modifiers */
inline void setSelectedFEdge(FEdge *iFEdge) {_SelectedFEdge = iFEdge;}
/*! inserts a shader at pos index+1 */
+ void PushBackStyleModule(StyleModule *iStyleModule);
void InsertStyleModule(unsigned index, StyleModule *iStyleModule);
void RemoveStyleModule(unsigned index);
void SwapStyleModules(unsigned i1, unsigned i2);
diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h
index 1e437083e85..b9e63513ad9 100644
--- a/source/blender/include/butspace.h
+++ b/source/blender/include/butspace.h
@@ -314,7 +314,6 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_FS_PIC 1601
#define B_FS_BACKBUF 1602
-#define B_FS_FRS 1603
#define B_FS_FTYPE 1604 /* FTYPE is no more */
#define B_DORENDER 1605
#define B_DOANIM 1606
@@ -361,6 +360,10 @@ void curvemap_buttons(struct uiBlock *block, struct CurveMapping *cumap, char la
#define B_ADD_FFMPEG_VIDEO_OPTION 1647
#define B_ADD_FFMPEG_AUDIO_OPTION 1648
+#define B_FRS_SELECT_RENDER_LAYER 1649
+#define B_FRS_ADD_MODULE 1650
+#define B_FRS_SELECT_MODULE_FILE 1651
+
#define B_SEQ_BUT_PLUGIN 1691
#define B_SEQ_BUT_RELOAD 1692
#define B_SEQ_BUT_EFFECT 1693
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 5ea1a8ee98c..1768b052b54 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -198,9 +198,6 @@ struct Render
ListBase *sss_points;
struct Material *sss_mat;
- /* Freestyle */
- struct Render* freestyle_render;
-
ListBase customdata_names;
struct Object *excludeob;
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 8313019024d..9c1167e6d7c 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -4427,11 +4427,6 @@ void RE_Database_Free(Render *re)
free_occ(re);
free_strand_surface(re);
- if( re->freestyle_render ) {
- RE_FreeRender(re->freestyle_render);
- re->freestyle_render = NULL;
- }
-
re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->i.convertdone= 0;
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 46fcd99a6e6..1dfc6780205 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -901,42 +901,6 @@ static void addps(ListBase *lb, intptr_t *rd, int obi, int facenr, int z, int ma
ps->shadfac= 0;
}
-static void freestyle_enhance_add(RenderPart *pa, RenderLayer *rl)
-{
- RenderLayer *freestyle_rl;
- RenderLayer *rlpp[RE_MAX_OSA];
- int totsample;
- int x, y, od;
- float* freestyle;
-
- if( R.freestyle_render == NULL || R.freestyle_render->result == NULL )
- return;
-
- freestyle_rl = render_get_active_layer( R.freestyle_render, R.freestyle_render->result );
- if( freestyle_rl->rectf == NULL)
- return;
-
- totsample= get_sample_layers(pa, rl, rlpp);
- od = 0;
-
- for( y = pa->disprect.ymin; y < pa->disprect.ymax; y++) {
- for( x = pa->disprect.xmin; x < pa->disprect.xmax; x++, od++) {
- int sample;
-
- if( x < 0 || y < 0 || x > R.rectx - 1 || y > R.recty - 1 )
- continue;
-
- freestyle = freestyle_rl->rectf + 4 * (R.rectx * y + x);
- if( freestyle[3] > 0.0) {
- for( sample = 0; sample < totsample; sample++) {
- float *rgbrect = rlpp[sample]->rectf + 4*od;
- addAlphaOverFloat(rgbrect, freestyle);
- }
- }
- }
- }
-}
-
static void edge_enhance_add(RenderPart *pa, float *rectf, float *arect)
{
float addcol[4];
@@ -1254,10 +1218,6 @@ void zbufshadeDA_tile(RenderPart *pa)
if(rl->layflag & SCE_LAY_EDGE)
if(R.r.mode & R_EDGE)
edge_enhance_add(pa, rl->rectf, edgerect);
-
- if(rl->layflag & SCE_LAY_FRS)
- if(R.r.mode & R_EDGE_FRS)
- freestyle_enhance_add(pa, rl);
if(rl->passflag & SCE_PASS_VECTOR)
reset_sky_speed(pa, rl);
@@ -1423,10 +1383,6 @@ void zbufshade_tile(RenderPart *pa)
edge_enhance_add(pa, rl->rectf, edgerect);
}
- if(rl->layflag & SCE_LAY_FRS)
- if(R.r.mode & R_EDGE_FRS)
- freestyle_enhance_add(pa, rl);
-
if(rl->passflag & SCE_PASS_VECTOR)
reset_sky_speed(pa, rl);
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index c7eba65d5fe..f1e98653000 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -1358,6 +1358,12 @@ void do_sequencer_panels(unsigned short event)
/* ************************* SCENE *********************** */
+static void freestyle_set_style_module_name(char *name)
+{
+ strcpy(freestyle_current_module_path, name);
+ allqueue(REDRAWBUTSSCENE, 0);
+ BIF_undo_push("Change style module");
+}
static void output_pic(char *name)
{
@@ -1380,15 +1386,6 @@ static void backbuf_pic(char *name)
BIF_undo_push("Change background picture");
}
-static void freestyle_module(char *name)
-{
- strcpy(style_module, name);
- allqueue(REDRAWBUTSSCENE, 0);
- BIF_undo_push("Change style module");
-}
-
-
-
static void run_playanim(char *file)
{
extern char bprogname[]; /* usiblender.c */
@@ -1488,14 +1485,7 @@ void do_render_panels(unsigned short event)
activate_imageselect(FILE_SPECIAL, "SELECT BACKBUF PICTURE", G.scene->r.backbuf, backbuf_pic);
else
activate_fileselect(FILE_SPECIAL, "SELECT BACKBUF PICTURE", G.scene->r.backbuf, backbuf_pic);
- break;
-
- case B_FS_FRS:
- sa= closest_bigger_area();
- areawinset(sa->win);
- activate_fileselect(FILE_SPECIAL, "SELECT STYLE MODULE", style_module, freestyle_module);
- break;
-
+ break;
case B_PR_PAL:
G.scene->r.xsch= 720;
@@ -1752,6 +1742,23 @@ void do_render_panels(unsigned short event)
allqueue(REDRAWBUTSSCENE, 0);
break;
#endif
+
+ case B_FRS_SELECT_RENDER_LAYER:
+ FRS_select_layer( BLI_findlink(&G.scene->r.layers, freestyle_current_layer_number ) );
+ allqueue(REDRAWBUTSSCENE, 0);
+ break;
+
+ case B_FRS_ADD_MODULE:
+ FRS_add_module();
+ allqueue(REDRAWBUTSSCENE, 0);
+ break;
+
+ case B_FRS_SELECT_MODULE_FILE:
+ sa= closest_bigger_area();
+ areawinset(sa->win);
+ activate_fileselect(FILE_SPECIAL, "SELECT STYLE MODULE", freestyle_current_module_path, freestyle_set_style_module_name);
+ break;
+
}
}
@@ -3297,25 +3304,80 @@ static void render_panel_yafrayGlobal()
#endif /* disable yafray stuff */
static void render_panel_freestyle()
-{
+{
uiBlock *block;
+
+ SceneRenderLayer *srl;
+ int len;
+ short a, nr;
+ char *str;
+
+ uiBut *bt;
+ int module_list_y;
+ StyleModuleConf* module_conf;
+ int module_number, last_module_number;
+
+ // initialization
+ FRS_initialize();
- if( strlen(style_module) == 0 )
- FRS_initialize();
-
- block= uiNewBlock(&curarea->uiblocks, "render_panel_freestyle", UI_EMBOSS, UI_HELV, curarea->win);
+ // block
+ block = uiNewBlock(&curarea->uiblocks, "render_panel_freestyle", UI_EMBOSS, UI_HELV, curarea->win);
uiNewPanelTabbed("Render", "Render");
if(uiNewPanel(curarea, block, "Freestyle", "Render", 320, 0, 318, 204)==0) return;
-
+
+ // menu
+ len = 32 + 32*BLI_countlist(&G.scene->r.layers);
+ str = MEM_callocN(len, "menu layers");
+ a = strlen(str);
+ for(nr=0, srl= G.scene->r.layers.first; srl; srl= srl->next, nr++) {
+ a+= sprintf(str+a, "|%s %%i%d %%x%d", srl->name, ICON_BLANK1, nr);
+ }
+
+ uiDefBut(block, LABEL, 0, "Render Layer:", 10,210,100,20, NULL, 0, 0, 0, 0, "");
+ uiDefButS(block, MENU, B_FRS_SELECT_RENDER_LAYER, str, 110,210,200,20, &freestyle_current_layer_number, 0, 0, 0, 0, "Settings for current Render Layer");
+ MEM_freeN(str);
+
// label to force a boundbox for buttons not to be centered
uiBlockBeginAlign(block);
- uiDefIconBut(block, BUT, B_FS_FRS, ICON_FILESEL, 10, 190, 20, 20, 0, 0, 0, 0, 0, "Open Fileselect to get style module");
- uiDefBut(block, TEX,0,"", 31, 190, 279, 20, style_module, 0.0,79.0, 0, 0, "Style module path name");
- uiDefButF(block, NUM, B_NOP, "Sphere Radius", 10,170,300,20, &freestyle_sphere_radius, 0.0f, 100.0f, 10, 2, "Sphere radius (x mean edge size)");
- uiDefButBitI(block, TOG, FREESTYLE_RIDGES_AND_VALLEYS_FLAG, B_NOP, "Ridges and Valleys", 10, 150, 150, 20, &freestyle_flags, 0, 0, 0, 0, "Compute ridges and valleys");
- uiDefButBitI(block, TOG, FREESTYLE_SUGGESTIVE_CONTOURS_FLAG, B_NOP, "Suggestive Contours", 10, 130, 150, 20, &freestyle_flags, 0, 0, 0, 0, "Compute suggestive contours");
- uiDefButF(block, NUM, B_NOP, "kr Derivative Epsilon", 10,110,300,20, &freestyle_dkr_epsilon, 0.0f, 10.0f, 0.1, 3, "Suggestive contour kr derivative epsilon");
+ uiDefButF(block, NUM, B_NOP, "Sphere Radius", 10,180,300,20, freestyle_sphere_radius, 0.0f, 100.0f, 10, 2, "Sphere radius (x mean edge size)");
+ uiDefButBitI(block, TOG, FREESTYLE_RIDGES_AND_VALLEYS_FLAG, B_NOP, "Ridges and Valleys", 10, 160, 150, 20, freestyle_flags, 0, 0, 0, 0, "Compute ridges and valleys");
+ uiDefButBitI(block, TOG, FREESTYLE_SUGGESTIVE_CONTOURS_FLAG, B_NOP, "Suggestive Contours", 10, 140, 150, 20, freestyle_flags, 0, 0, 0, 0, "Compute suggestive contours");
+ uiDefButF(block, NUM, B_NOP, "kr Derivative Epsilon", 10,120,300,20, freestyle_dkr_epsilon, 0.0f, 10.0f, 0.1, 3, "Suggestive contour kr derivative epsilon");
uiBlockEndAlign(block);
+
+ module_list_y = 90;
+ module_number = 0;
+ last_module_number = BLI_countlist( freestyle_modules ) - 1;
+
+ for( module_conf = freestyle_modules->first; module_conf; module_conf = module_conf->next, module_list_y -= 20, module_number++ )
+ {
+ uiDefIconButS(block, ICONTOG, B_NOP, ICON_CHECKBOX_HLT-1, 10, module_list_y, 20, 20, &(module_conf->is_displayed), 0.0, 0.0, 0, 0, "Disable or enable this style module");
+ bt = uiDefIconBut(block, BUT, B_FRS_SELECT_MODULE_FILE, ICON_FILESEL, 30, module_list_y, 20, 20, 0, 0, 0, 0, 0, "Open Fileselect to get style module");
+ uiButSetFunc(bt, FRS_set_module_path, (void *)(intptr_t)module_number, NULL);
+
+ uiDefBut(block,TEX, 0, "", 50, module_list_y, 215, 20, module_conf->module_path, 0.0,79.0, 0, 0, "Style module path name");
+
+ bt = uiDefIconBut(block, BUT, B_REDR, VICON_X, 265, module_list_y, 20, 20, NULL, 0.0, 0.0, 0.0, 0.0, "Delete this style module");
+ uiButSetFunc(bt, FRS_delete_module, (void *)(intptr_t)module_number, NULL);
+
+ uiBlockSetEmboss(block, UI_EMBOSSN);
+
+ if( module_number != 0 ) {
+ bt = uiDefIconBut(block, BUT, B_REDR, VICON_MOVE_UP, 288, module_list_y + 2, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Move this style module up");
+ uiButSetFunc(bt, FRS_move_up_module, (void *)(intptr_t)module_number, NULL);
+ }
+
+ if( module_number != last_module_number ) {
+ bt = uiDefIconBut(block, BUT, B_REDR, VICON_MOVE_DOWN, 304, module_list_y + 2, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Move this style module down");
+ uiButSetFunc(bt, FRS_move_down_module, (void *)(intptr_t)module_number, NULL);
+ }
+
+ uiBlockSetCol(block, TH_AUTO);
+ uiBlockSetEmboss(block, UI_EMBOSS);
+ }
+
+ uiDefBut(block, BUT, B_FRS_ADD_MODULE, "Add style module", 10, module_list_y, 150, 20, 0, 0, 0, 0, 0, "Add new style module");
+
}
static void layer_copy_func(void *lay_v, void *lay_p)
@@ -3338,9 +3400,18 @@ static void delete_scene_layer_func(void *srl_v, void *act_i)
if(BLI_countlist(&G.scene->r.layers)>1) {
intptr_t act= (intptr_t)act_i;
+ int deleted_layer = G.scene->r.actlay;
+ FRS_delete_layer( BLI_findlink(&G.scene->r.layers, deleted_layer), 0 );
+
BLI_remlink(&G.scene->r.layers, srl_v);
MEM_freeN(srl_v);
- G.scene->r.actlay= 0;
+ G.scene->r.actlay = 0;
+
+ if( deleted_layer == freestyle_current_layer_number ) {
+ FRS_select_layer( BLI_findlink(&G.scene->r.layers, G.scene->r.actlay) );
+ } else {
+ freestyle_current_layer_number = BLI_findindex(&G.scene->r.layers, freestyle_current_layer);
+ }
if(G.scene->nodetree) {
bNode *node;
diff --git a/source/blender/src/usiblender.c b/source/blender/src/usiblender.c
index 16c26336b89..c889fad1caf 100644
--- a/source/blender/src/usiblender.c
+++ b/source/blender/src/usiblender.c
@@ -1175,6 +1175,8 @@ void exit_usiblender(void)
quicktime_exit();
#endif
+ FRS_exit();
+
/* undo free stuff */
undo_editmode_clear();
undo_imagepaint_clear();