diff options
-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.cpp | 67 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 2 | ||||
-rw-r--r-- | source/blender/python/api2_2x/sceneRender.c | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 20 | ||||
-rw-r--r-- | source/blender/src/buttons_scene.c | 9 |
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"); |