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:
Diffstat (limited to 'source/blender/freestyle')
-rw-r--r--source/blender/freestyle/CMakeLists.txt2
-rw-r--r--source/blender/freestyle/FRS_freestyle.h15
-rw-r--r--source/blender/freestyle/FRS_freestyle_config.h17
-rw-r--r--source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp155
-rwxr-xr-xsource/blender/freestyle/intern/geometry/GeomUtils.cpp18
-rwxr-xr-xsource/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp9
-rwxr-xr-xsource/blender/freestyle/intern/view_map/SilhouetteGeomEngine.h1
7 files changed, 93 insertions, 124 deletions
diff --git a/source/blender/freestyle/CMakeLists.txt b/source/blender/freestyle/CMakeLists.txt
index 0b78a4b7726..eb2569c4649 100644
--- a/source/blender/freestyle/CMakeLists.txt
+++ b/source/blender/freestyle/CMakeLists.txt
@@ -29,7 +29,7 @@ FILE(GLOB_RECURSE SRC *.cpp)
SET(INC
../blenkernel ../blenloader ../blenlib ../imbuf ../makesdna ../python
../render/extern/include ../render/intern/include ../include ../src
- ../../../extern/glew/include ../../../intern/guardedalloc
+ ../../../extern/glew/include ../../../intern/guardedalloc ../freestyle
${PYTHON_INC}
${PNG_INC}
)
diff --git a/source/blender/freestyle/FRS_freestyle.h b/source/blender/freestyle/FRS_freestyle.h
index d3ab042f84b..cc52685663c 100644
--- a/source/blender/freestyle/FRS_freestyle.h
+++ b/source/blender/freestyle/FRS_freestyle.h
@@ -8,13 +8,8 @@
extern "C" {
#endif
- typedef struct StyleModuleConf {
- struct StyleModuleConf *next, *prev;
-
- char module_path[255];
- short is_displayed;
- } StyleModuleConf;
-
+ #include "DNA_listBase.h"
+ #include "DNA_scene_types.h"
extern short freestyle_is_initialized;
@@ -22,8 +17,7 @@ extern "C" {
extern float freestyle_mv[4][4];
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;
@@ -32,13 +26,12 @@ extern "C" {
extern float* freestyle_dkr_epsilon;
// Rendering
- void FRS_initialize();
+ void FRS_initialize( short select_layer );
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);
diff --git a/source/blender/freestyle/FRS_freestyle_config.h b/source/blender/freestyle/FRS_freestyle_config.h
new file mode 100644
index 00000000000..22ccd320e7e
--- /dev/null
+++ b/source/blender/freestyle/FRS_freestyle_config.h
@@ -0,0 +1,17 @@
+#ifndef FRS_FREESTYLE_CONFIG_H
+#define FRS_FREESTYLE_CONFIG_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ #include "DNA_scene_types.h"
+
+ void FRS_add_freestyle_config( SceneRenderLayer* srl );
+ void FRS_free_freestyle_config( SceneRenderLayer* srl );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif \ No newline at end of file
diff --git a/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp b/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp
index 34e6e31a177..cb0182850cb 100644
--- a/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp
+++ b/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp
@@ -15,19 +15,18 @@ extern "C" {
#include "MEM_guardedalloc.h"
#include "DNA_camera_types.h"
-#include "DNA_listBase.h"
-#include "DNA_scene_types.h"
+#include "DNA_freestyle_types.h"
#include "BKE_global.h"
#include "BLI_blenlib.h"
#include "BIF_renderwin.h"
#include "BPY_extern.h"
-#include "render_types.h"
#include "renderpipeline.h"
#include "pixelblending.h"
#include "../../FRS_freestyle.h"
+#include "../../FRS_freestyle_config.h"
// Freestyle configuration
short freestyle_is_initialized = 0;
@@ -42,7 +41,6 @@ extern "C" {
int freestyle_viewport[4];
// Panel configuration
- short freestyle_current_layer_number = 0;
char* freestyle_current_module_path = NULL;
SceneRenderLayer* freestyle_current_layer = NULL;
@@ -51,31 +49,13 @@ extern "C" {
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(){
+ void FRS_initialize( short select_layer ){
if( !freestyle_is_initialized ) {
@@ -83,27 +63,21 @@ extern "C" {
controller = new Controller;
view = new AppView;
controller->setView(view);
-
- } else {
-
- delete panelConfig;
-
- }
-
- 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) );
+ default_module_path = pathconfig->getProjectDir() + Config::DIR_SEP + "style_modules" + Config::DIR_SEP + "contour.py";
- freestyle_is_initialized = 1;
+ freestyle_is_initialized = 1;
+ }
+
+ if( select_layer )
+ FRS_select_layer( (SceneRenderLayer*) BLI_findlink(&G.scene->r.layers, G.scene->r.actlay) );
}
-
+
void FRS_exit() {
delete pathconfig;
delete controller;
delete view;
- delete panelConfig;
}
//=======================================================
@@ -130,26 +104,6 @@ extern "C" {
freestyle_viewpoint[1] = maincam_obj->obmat[3][1];
freestyle_viewpoint[2] = maincam_obj->obmat[3][2];
- // freestyle_mv[0][0] = maincam_obj->obmat[0][0];
- // freestyle_mv[0][1] = maincam_obj->obmat[1][0];
- // freestyle_mv[0][2] = maincam_obj->obmat[2][0];
- // freestyle_mv[0][3] = 0.0;
- //
- // freestyle_mv[1][0] = maincam_obj->obmat[0][1];
- // freestyle_mv[1][1] = maincam_obj->obmat[1][1];
- // freestyle_mv[1][2] = maincam_obj->obmat[2][1];
- // freestyle_mv[1][3] = 0.0;
- //
- // freestyle_mv[2][0] = re->viewmat[2][0];
- // freestyle_mv[2][1] = re->viewmat[2][1];
- // freestyle_mv[2][2] = re->viewmat[2][2];
- // freestyle_mv[2][3] = 0.0;
- //
- // freestyle_mv[3][0] = re->viewmat[3][0];
- // freestyle_mv[3][1] = re->viewmat[3][1];
- // freestyle_mv[3][2] = re->viewmat[3][2];
- // freestyle_mv[3][3] = 1.0;
-
for( int i = 0; i < 4; i++ )
for( int j = 0; j < 4; j++ )
freestyle_mv[i][j] = re->viewmat[i][j];
@@ -157,13 +111,11 @@ extern "C" {
for( int i = 0; i < 4; i++ )
for( int j = 0; j < 4; j++ )
freestyle_proj[i][j] = re->winmat[i][j];
-
- //f(cam && (re->r.mode & R_ORTHO)) {
}
void prepare(Render* re, SceneRenderLayer* srl ) {
-
+
// clear canvas
controller->Clear();
@@ -172,10 +124,14 @@ extern "C" {
return;
// add style modules
+ FreestyleConfig* config = &srl->freestyleConfig;
+
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 ) {
+
+
+ for( FreestyleModuleConfig* module_conf = (FreestyleModuleConfig *)config->modules.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 );
@@ -186,10 +142,10 @@ extern "C" {
cout << endl;
// set parameters
- 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]);
+ controller->setSphereRadius( config->sphere_radius );
+ controller->setComputeRidgesAndValleysFlag( (config->flags & FREESTYLE_RIDGES_AND_VALLEYS_FLAG) ? true : false);
+ controller->setComputeSuggestiveContoursFlag( (config->flags & FREESTYLE_SUGGESTIVE_CONTOURS_FLAG) ? true : false);
+ controller->setSuggestiveContourKrDerivativeEpsilon( config->dkr_epsilon ) ;
cout << "Sphere radius : " << controller->getSphereRadius() << endl;
cout << "Redges and valleys : " << (controller->getComputeRidgesAndValleysFlag() ? "enabled" : "disabled") << endl;
@@ -236,11 +192,8 @@ extern "C" {
int displayed_layer_count( SceneRenderLayer* srl ) {
int count = 0;
-
- if( panelConfig->layers.find(srl) == panelConfig->layers.end() )
- return 0;
- for( StyleModuleConf* module_conf = (StyleModuleConf *)panelConfig->modules[srl]->first; module_conf; module_conf = module_conf->next ) {
+ for( FreestyleModuleConfig* module_conf = (FreestyleModuleConfig *)srl->freestyleConfig.modules.first; module_conf; module_conf = module_conf->next ) {
if( module_conf->is_displayed )
count++;
}
@@ -257,6 +210,7 @@ extern "C" {
cout << "# Freestyle" << endl;
cout << "#===============================================================" << endl;
+ FRS_initialize( 0 );
init_view(re);
init_camera(re);
@@ -300,50 +254,37 @@ extern "C" {
// 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);
- }
+ void FRS_add_freestyle_config( SceneRenderLayer* srl )
+ {
+ FreestyleConfig* config = &srl->freestyleConfig;
- 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);
+ config->modules.first = config->modules.last = NULL;
+ config->flags = 0;
+ config->sphere_radius = 1.0;
+ config->dkr_epsilon = 0.001;
+ }
+
+ void FRS_free_freestyle_config( SceneRenderLayer* srl )
+ {
+ BLI_freelistN( &srl->freestyleConfig.modules );
}
- 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];
+ void FRS_select_layer( SceneRenderLayer* srl )
+ {
+ FreestyleConfig* config = &srl->freestyleConfig;
- panelConfig->modules.erase(srl);
- panelConfig->flags.erase(srl);
- panelConfig->sphere_radius.erase(srl);
- panelConfig->dkr_epsilon.erase(srl);
+ freestyle_modules = &config->modules;
+ freestyle_flags = &config->flags;
+ freestyle_sphere_radius = &config->sphere_radius;
+ freestyle_dkr_epsilon = &config->dkr_epsilon;
- if( !isDestructor )
- panelConfig->layers.erase(srl);
+ freestyle_current_layer = srl;
+ G.scene->freestyle_current_layer_number = BLI_findindex(&G.scene->r.layers, freestyle_current_layer);
}
void FRS_add_module()
{
- StyleModuleConf* module_conf = (StyleModuleConf*) MEM_callocN( sizeof(StyleModuleConf), "style module configuration");
+ FreestyleModuleConfig* module_conf = (FreestyleModuleConfig*) MEM_callocN( sizeof(FreestyleModuleConfig), "style module configuration");
BLI_addtail(freestyle_modules, (void*) module_conf);
strcpy( module_conf->module_path, default_module_path.c_str() );
@@ -352,14 +293,14 @@ extern "C" {
void FRS_delete_module(void *module_index_ptr, void *unused)
{
- StyleModuleConf* module_conf = (StyleModuleConf*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
+ FreestyleModuleConfig* module_conf = (FreestyleModuleConfig*) 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);
+ FreestyleModuleConfig* module_conf = (FreestyleModuleConfig*) 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);
@@ -367,7 +308,7 @@ extern "C" {
void FRS_move_down_module(void *module_index_ptr, void *unused)
{
- StyleModuleConf* module_conf = (StyleModuleConf*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
+ FreestyleModuleConfig* module_conf = (FreestyleModuleConfig*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
BLI_remlink(freestyle_modules, module_conf);
BLI_insertlink(freestyle_modules, module_conf->next, module_conf);
@@ -375,7 +316,7 @@ extern "C" {
void FRS_set_module_path(void *module_index_ptr, void *unused)
{
- StyleModuleConf* module_conf = (StyleModuleConf*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
+ FreestyleModuleConfig* module_conf = (FreestyleModuleConfig*) BLI_findlink(freestyle_modules, (intptr_t)module_index_ptr);
freestyle_current_module_path = module_conf->module_path;
}
diff --git a/source/blender/freestyle/intern/geometry/GeomUtils.cpp b/source/blender/freestyle/intern/geometry/GeomUtils.cpp
index fd36e81ca77..88aafeed598 100755
--- a/source/blender/freestyle/intern/geometry/GeomUtils.cpp
+++ b/source/blender/freestyle/intern/geometry/GeomUtils.cpp
@@ -619,11 +619,21 @@ namespace GeomUtils {
void fromRetinaToCamera(const Vec3r& p,
Vec3r& q,
- real z,
+ real focal,
const real projection_matrix[4][4]) {
- q[0] = (-p[0] * z) / projection_matrix[0][0];
- q[1] = (-p[1] * z) / projection_matrix[1][1];
- q[2] = z;
+
+ if( projection_matrix[3][3] == 0.0 ) // perspective
+ {
+ q[0] = (-p[0] * focal) / projection_matrix[0][0];
+ q[1] = (-p[1] * focal) / projection_matrix[1][1];
+ q[2] = focal;
+ }
+ else // orthogonal
+ {
+ q[0] = p[0] / projection_matrix[0][0];
+ q[1] = p[1] / projection_matrix[1][1];
+ q[2] = focal;
+ }
}
void fromCameraToWorld(const Vec3r& p,
diff --git a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp
index 33c1115e94f..ecb0a4979f0 100755
--- a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp
+++ b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.cpp
@@ -52,7 +52,8 @@ real SilhouetteGeomEngine::_glModelViewMatrix[4][4] = {{1,0,0,0},
{0,0,0,1}};
real SilhouetteGeomEngine::_znear = 0.0;
real SilhouetteGeomEngine::_zfar = 100.0;
-
+bool SilhouetteGeomEngine::_isOrthographicProjection = false;
+
SilhouetteGeomEngine * SilhouetteGeomEngine::_pInstance = 0;
void SilhouetteGeomEngine::setTransform(const real iModelViewMatrix[4][4], const real iProjectionMatrix[4][4], const int iViewport[4], real iFocal)
@@ -91,6 +92,8 @@ void SilhouetteGeomEngine::setTransform(const real iModelViewMatrix[4][4], const
_viewport[i] = iViewport[i];
}
_Focal = iFocal;
+
+ _isOrthographicProjection = (iProjectionMatrix[3][3] != 0.0);
}
void SilhouetteGeomEngine::setFrustum(real iZNear, real iZFar)
@@ -146,6 +149,10 @@ void SilhouetteGeomEngine::ProjectSilhouette(SVertex* ioVertex)
real SilhouetteGeomEngine::ImageToWorldParameter(FEdge *fe, real t)
{
+
+ if( _isOrthographicProjection )
+ return t;
+
// we need to compute for each parameter t the corresponding
// parameter T which gives the intersection in 3D.
//currentEdge = (*fe);
diff --git a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.h b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.h
index 9638d26986f..5bd89f8a162 100755
--- a/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.h
+++ b/source/blender/freestyle/intern/view_map/SilhouetteGeomEngine.h
@@ -59,6 +59,7 @@ private:
static real _glProjectionMatrix[4][4]; // GL style (column major) projection matrix
static real _glModelViewMatrix[4][4]; // GL style (column major) model view matrix
+static bool _isOrthographicProjection;
static SilhouetteGeomEngine *_pInstance;