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:
authorMaxime Curioni <maxime.curioni@gmail.com>2008-07-04 11:59:19 +0400
committerMaxime Curioni <maxime.curioni@gmail.com>2008-07-04 11:59:19 +0400
commit5bee0c9a82cf08205da50b529e51021645225314 (patch)
tree37784006e253b3385a5d005db2772065e990bae6
parentffb07fcfb3dc1228b0bdc411c286a1244daeed26 (diff)
soc-2008-mxcurioni: foundations for Freestyle as a render layer - new UI buttons and mode flags, Freestyle API refactoring, modified pipeline to incorporate the new render layer. Compared to previously, the layer functionality is available when selecting 'Blender Internal' as the rendering engine. Freestyle's result is not available in the layer yet. I need to integrate OpenGL offscreen rendering properly (with framebuffer objects) to reach that goal.
-rw-r--r--source/blender/freestyle/FRS_freestyle.h (renamed from source/blender/freestyle/FST_freestyle.h)3
-rw-r--r--source/blender/freestyle/intern/app_blender/api.cpp67
-rw-r--r--source/blender/makesdna/DNA_scene_types.h2
-rw-r--r--source/blender/python/api2_2x/sceneRender.c4
-rw-r--r--source/blender/render/intern/source/pipeline.c20
-rw-r--r--source/blender/src/buttons_scene.c9
6 files changed, 74 insertions, 31 deletions
diff --git a/source/blender/freestyle/FST_freestyle.h b/source/blender/freestyle/FRS_freestyle.h
index 1f516078258..060ccf6961a 100644
--- a/source/blender/freestyle/FST_freestyle.h
+++ b/source/blender/freestyle/FRS_freestyle.h
@@ -5,7 +5,8 @@
extern "C" {
#endif
- void FRS_execute(Render* re);
+ void FRS_prepare(Render* re);
+ void FRS_execute(Render* re, int render_in_layer);
#ifdef __cplusplus
}
diff --git a/source/blender/freestyle/intern/app_blender/api.cpp b/source/blender/freestyle/intern/app_blender/api.cpp
index 96edf7fcdba..4ca13000ccb 100644
--- a/source/blender/freestyle/intern/app_blender/api.cpp
+++ b/source/blender/freestyle/intern/app_blender/api.cpp
@@ -27,11 +27,16 @@ using namespace std;
extern "C" {
#endif
+ static Config::Path *pathconfig = NULL;
static Controller *controller = NULL;
static AppGLWidget *view = NULL;
+
void FRS_initialize(){
+ if( pathconfig == NULL )
+ pathconfig = new Config::Path;
+
if( controller == NULL )
controller = new Controller;
@@ -41,20 +46,14 @@ extern "C" {
controller->SetView(view);
}
- void FRS_execute(Render* re) {
-
- // instanciation
- Config::Path pathconfig;
- FRS_initialize();
-
- // initialize view dimensions
- unsigned int width = re->winx;
- unsigned int height = re->winy;
- view->setWidth(width);
- view->setHeight(height);
- view->_camera->setScreenWidthAndHeight(width, height);
-
- // initialize camera
+
+ void FRS_init_view(Render* re){
+ view->setWidth( re->winx );
+ view->setHeight( re->winy );
+ view->_camera->setScreenWidthAndHeight( re->winx, re->winy);
+ }
+
+ void FRS_init_camera(Render* re){
Object* maincam_obj = re->scene->camera;
Camera *cam = (Camera*) maincam_obj->data;
@@ -62,22 +61,23 @@ extern "C" {
view->_camera->setType(AppGLWidget_Camera::PERSPECTIVE);
view->_camera->setHorizontalFieldOfView( M_PI / 180.0f * cam->angle );
}
- else if (cam->type == CAM_ORTHO){
- view->_camera->setType(AppGLWidget_Camera::ORTHOGRAPHIC);
- // view->_camera->setFocusDistance does not seem to work
- // integrate cam->ortho_scale parameter
- }
+ // else if (cam->type == CAM_ORTHO){
+ // view->_camera->setType(AppGLWidget_Camera::ORTHOGRAPHIC);
+ // // view->_camera->setFocusDistance does not seem to work
+ // // integrate cam->ortho_scale parameter
+ // }
Vec camPosition(maincam_obj->obmat[3][0], maincam_obj->obmat[3][1], maincam_obj->obmat[3][2]);
Vec camUp( re->viewmat[0][1], re->viewmat[1][1], re->viewmat[2][1]);
Vec camDirection( -re->viewmat[0][2], -re->viewmat[1][2], -re->viewmat[2][2]);
view->_camera->setPosition(camPosition);
view->_camera->setUpVector(camUp);
- view->_camera->setViewDirection(camDirection);
+ view->_camera->setViewDirection(camDirection);
+ }
-
+ void FRS_scene_3ds_export(Render* re) {
// export scene to 3ds format
- string script_3ds_export = pathconfig.getProjectDir() +
+ string script_3ds_export = pathconfig->getProjectDir() +
Config::DIR_SEP + "python" +
Config::DIR_SEP + "3ds_export.py";
BPY_run_python_script( const_cast<char *>(script_3ds_export.c_str()) );
@@ -94,9 +94,20 @@ extern "C" {
cout << "Cannot find" << exported_3ds_file << endl;
return;
}
+ }
+
+ void FRS_prepare(Render* re) {
+ FRS_initialize();
+
+ FRS_init_view(re);
+ FRS_init_camera(re);
+ FRS_scene_3ds_export(re);
+ }
+
+ void FRS_render(Render* re) {
// add style module
- string style_module = pathconfig.getProjectDir() +
+ string style_module = pathconfig->getProjectDir() +
Config::DIR_SEP + "style_modules" +
Config::DIR_SEP + "contour.py";
controller->InsertStyleModule( 0, const_cast<char *>(style_module.c_str()) );
@@ -114,12 +125,20 @@ extern "C" {
// copy result into render window
RenderResult rres;
RE_GetResultImage(re, &rres);
- view->readPixels(0,0,width,height,AppGLWidget::RGBA, rres.rectf );
+ view->readPixels(0, 0, re->winx, re->winy, AppGLWidget::RGBA, rres.rectf );
re->result->renlay = render_get_active_layer(re, re->result);
re->display_draw(re->result, NULL);
controller->CloseFile();
}
+
+ void FRS_execute(Render* re, bool render_in_layer) {
+
+ //if(render_in_layer)
+ // set-up offscreen rendering
+
+ FRS_render(re);
+ }
#ifdef __cplusplus
}
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 59a7ee69527..0b224a24d4d 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -134,6 +134,7 @@ typedef struct SceneRenderLayer {
#define SCE_LAY_EDGE 8
#define SCE_LAY_SKY 16
#define SCE_LAY_STRAND 32
+#define SCE_LAY_FRS 64
/* flags between 32 and 0x8000 are set to 1 already, for future options */
#define SCE_LAY_ALL_Z 0x8000
@@ -571,6 +572,7 @@ typedef struct Scene {
#define R_ORTHO 0x0008
#define R_ENVMAP 0x0010
#define R_EDGE 0x0020
+#define R_EDGE_FRS 0x2000000 // will replace R_EDGE
#define R_FIELDS 0x0040
#define R_FIELDSTILL 0x0080
#define R_RADIO 0x0100
diff --git a/source/blender/python/api2_2x/sceneRender.c b/source/blender/python/api2_2x/sceneRender.c
index 2174c435405..a6f35bf4d5d 100644
--- a/source/blender/python/api2_2x/sceneRender.c
+++ b/source/blender/python/api2_2x/sceneRender.c
@@ -3487,6 +3487,10 @@ static PyGetSetDef BPy_RenderLayer_getseters[] = {
(getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
"Render Edge-enhance in this Layer (only works for Solid faces)",
(void *)SCE_LAY_EDGE},
+ {"enableFreestyle",
+ (getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
+ "Render Freestyle in this Layer",
+ (void *)SCE_LAY_FRS},
{"enableSky",
(getter)RenderLayer_getLayflagBits, (setter)RenderLayer_setLayflagBits,
"Render Sky or backbuffer in this Layer",
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 5b2c7114fe3..8403d237f8f 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -70,7 +70,7 @@
#endif /* disable yafray */
-#include "FST_freestyle.h"
+#include "FRS_freestyle.h"
/* internal */
@@ -1621,7 +1621,7 @@ void RE_TileProcessor(Render *re, int firsttile, int threaded)
static void do_render_3d(Render *re)
{
-
+ RenderLayer *rl;
// re->cfra= cfra; /* <- unused! */
/* make render verts/faces/halos/lamps */
@@ -1632,6 +1632,17 @@ static void do_render_3d(Render *re)
threaded_tile_processor(re);
+ /* Freestyle */
+ if( re->r.mode & R_EDGE_FRS ) {
+ for(rl = re->result->layers.first; rl; rl= rl->next) {
+ if(rl->layflag & SCE_LAY_FRS) {
+ printf("Freestyle as a render layer\n");
+ FRS_prepare(re);
+ FRS_execute(re,1);
+ }
+ }
+ }
+
/* do left-over 3d post effects (flares) */
if(re->flag & R_HALO)
if(!re->test_break())
@@ -2208,9 +2219,12 @@ static void freestyleRender(Render *re)
Mat4Invert(mat, re->scene->camera->obmat);
RE_SetView(re, mat);
+ // Freestyle initialization
+ FRS_prepare(re);
+
// run Freestyle
re->i.starttime = PIL_check_seconds_timer();
- FRS_execute(re);
+ FRS_execute(re, 0);
re->i.lastframetime = PIL_check_seconds_timer()- re->i.starttime;
re->stats_draw(&re->i);
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index 78b6abb5773..198f853393d 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -2108,7 +2108,8 @@ static void render_panel_output(void)
/* Toon shading buttons */
uiBlockBeginAlign(block);
uiDefButBitI(block, TOG, R_EDGE, B_NOP,"Edge", 115, 89, 60, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable Toon Edge-enhance");
- uiDefBlockBut(block, edge_render_menu, NULL, "Edge Settings", 175, 89, 135, 20, "Display Edge settings");
+ uiDefBlockBut(block, edge_render_menu, NULL, "Edge Settings", 175, 89, 75, 20, "Display Edge settings");
+ uiDefButBitI(block, TOG, R_EDGE_FRS, B_NOP,"Freestyle", 250, 89, 60, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable Freestyle");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
@@ -3384,8 +3385,10 @@ static void render_panel_layers(void)
uiDefButBitI(block, TOG, SCE_LAY_HALO, B_NOP,"Halo", 95, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Halos in this Layer (on top of Solid)");
uiDefButBitI(block, TOG, SCE_LAY_ZTRA, B_NOP,"Ztra", 135, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Z-Transparent faces in this Layer (On top of Solid and Halos)");
uiDefButBitI(block, TOG, SCE_LAY_SKY, B_NOP,"Sky", 175, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Sky or backbuffer in this Layer");
- uiDefButBitI(block, TOG, SCE_LAY_EDGE, B_NOP,"Edge", 215, 85, 45, 20, &srl->layflag, 0, 0, 0, 0, "Render Edge-enhance in this Layer (only works for Solid faces)");
- uiDefButBitI(block, TOG, SCE_LAY_STRAND, B_NOP,"Strand",260, 85, 50, 20, &srl->layflag, 0, 0, 0, 0, "Render Strands in this Layer");
+ uiDefButBitI(block, TOG, SCE_LAY_EDGE, B_NOP,"Edge", 215, 85, 25, 20, &srl->layflag, 0, 0, 0, 0, "Render Edge-enhance in this Layer (only works for Solid faces)");
+ uiDefButBitI(block, TOG, SCE_LAY_FRS, B_NOP,"FrSt", 240, 85, 30, 20, &srl->layflag, 0, 0, 0, 0, "Render Freestyle in this Layer");
+ uiDefButBitI(block, TOG, SCE_LAY_STRAND, B_NOP,"Strand",270, 85, 40, 20, &srl->layflag, 0, 0, 0, 0, "Render Strands in this Layer");
+
uiDefIDPoinBut(block, test_grouppoin_but, ID_GR, B_SET_PASS, "Light:", 50, 65, 130, 20, &(srl->light_override), "Name of Group to use as Lamps instead");
uiDefIDPoinBut(block, test_matpoin_but, ID_MA, B_SET_PASS, "Mat:", 180, 65, 130, 20, &(srl->mat_override), "Name of Material to use as Materials instead");