Migration of Freestyle to Blender 2.5 codebase (continued):

- proper Freestyle initialization, with support for undo/redo
- re-added FreestyleStyleConfig data structure
- Freestyle Python interpreter updated

This commit should compile without errors. More work is necessary to complete the migration:
- add Freestyle in the UI
- set up RNA support
This commit is contained in:
Maxime Curioni 2009-09-28 03:56:31 +00:00
parent 1ff038397f
commit 002ac28643
21 changed files with 132 additions and 91 deletions

@ -9,6 +9,7 @@ SConscript(['avi/SConscript',
'blenpluginapi/SConscript',
'gpu/SConscript',
'editors/SConscript',
'freestyle/SConscript',
'imbuf/SConscript',
'imbuf/intern/cineon/SConscript',
'makesdna/SConscript',
@ -32,6 +33,3 @@ if env['WITH_BF_OPENEXR']:
if env['WITH_BF_QUICKTIME']:
SConscript (['quicktime/SConscript'])
if env['WITH_BF_FREESTYLE']:
SConscript (['freestyle/SConscript'])

@ -30,7 +30,7 @@ SET(INC
. ../../../intern/guardedalloc ../../../intern/memutil ../editors/include ../blenlib ../makesdna
../render/extern/include ../../../intern/decimation/extern
../imbuf ../avi ../../../intern/elbeem/extern ../../../intern/opennl/extern
../../../intern/iksolver/extern ../blenloader
../../../intern/iksolver/extern ../blenloader ../freestyle
../nodes ../../../extern/glew/include ../gpu ../makesrna ../../../intern/smoke/extern
../../../intern/bsp/extern ../blenfont
../../../intern/audaspace/intern

@ -6,7 +6,7 @@ sources = env.Glob('intern/*.c')
incs = '. #/intern/guardedalloc #/intern/memutil ../editors/include ../blenlib ../blenfont ../makesdna'
incs += ' ../render/extern/include #/intern/decimation/extern ../makesrna'
incs += ' ../imbuf ../avi #/intern/elbeem/extern ../nodes'
incs += ' #/intern/iksolver/extern ../blenloader'
incs += ' #/intern/iksolver/extern ../blenloader ../freestyle'
incs += ' #/extern/bullet2/src'
incs += ' #/intern/opennl/extern #/intern/bsp/extern'
incs += ' ../gpu #/extern/glew/include'

@ -93,6 +93,8 @@
#include "BKE_utildefines.h" // O_BINARY FALSE
#include "FRS_freestyle.h"
Global G;
UserDef U;
ListBase WMlist= {NULL, NULL};
@ -630,6 +632,8 @@ void BKE_write_undo(bContext *C, char *name)
void BKE_undo_step(bContext *C, int step)
{
FRS_initialize(C);
if(step==0) {
read_undosave(C, curundo);
}

@ -11,6 +11,8 @@ extern "C" {
#include "DNA_listBase.h"
#include "DNA_scene_types.h"
#include "BKE_context.h"
extern short freestyle_is_initialized;
extern float freestyle_viewpoint[3];
@ -26,8 +28,8 @@ extern "C" {
extern float* freestyle_dkr_epsilon;
// Rendering
void FRS_initialize();
void FRS_add_Freestyle(struct Render* re);
void FRS_initialize(bContext* C);
void FRS_add_Freestyle( struct Render* re);
void FRS_exit();
// Panel configuration

@ -6,7 +6,7 @@ sources = []
defs = []
incs = ''
incs += '../blenkernel ../blenloader ../blenlib ../imbuf ../makesdna ../python '
incs += '../blenkernel ../blenloader ../blenlib ../imbuf ../makesdna ../makesrna ../python '
incs += '../render/extern/include ../render/intern/include ../include ../src'
incs += ' #/extern/glew/include #/intern/guardedalloc'
incs += ' ' + env['BF_PYTHON_INC']
@ -67,7 +67,7 @@ env.BlenderLib (libname="bf_freestyle",
sources=sources,
includes=Split(incs),
defines=defs,
libtype=['blender'],
libtype=['core'],
priority = [25]
)

@ -25,7 +25,7 @@
using namespace std;
extern "C" {
#include "api2_2x/EXPP_interface.h"
#include "BLI_util.h"
}
namespace Config {
@ -33,7 +33,7 @@ Path* Path::_pInstance = 0;
Path::Path() {
// get the root directory
//soc
setRootDir( bpy_gethome(1) );
setRootDir( BLI_gethome_folder("scripts") );
_pInstance = this;
}

@ -656,7 +656,7 @@ void Controller::DrawStrokes()
}
Render* Controller::RenderStrokes(Render *re) {
BlenderStrokeRenderer* blenderRenderer = new BlenderStrokeRenderer;
BlenderStrokeRenderer* blenderRenderer = new BlenderStrokeRenderer(re);
_Canvas->Render( blenderRenderer );
Render* freestyle_render = blenderRenderer->RenderScene(re);
delete blenderRenderer;

@ -17,9 +17,8 @@ extern "C" {
#include "DNA_camera_types.h"
#include "DNA_freestyle_types.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BLI_blenlib.h"
#include "BIF_renderwin.h"
#include "BPY_extern.h"
#include "renderpipeline.h"
@ -33,6 +32,7 @@ extern "C" {
static Config::Path *pathconfig = NULL;
static Controller *controller = NULL;
static AppView *view = NULL;
static Scene *current_scene = NULL;
// camera information
float freestyle_viewpoint[3];
@ -55,7 +55,7 @@ extern "C" {
// Initialization
//=======================================================
void FRS_initialize(){
void FRS_initialize(bContext* C){
if( !freestyle_is_initialized ) {
@ -69,7 +69,11 @@ extern "C" {
freestyle_is_initialized = 1;
}
FRS_select_layer( (SceneRenderLayer*) BLI_findlink(&G.scene->r.layers, G.scene->r.actlay) );
current_scene = CTX_data_scene(C);
if( !current_scene )
current_scene = (Scene*) CTX_data_main(C)->scene.first;
FRS_select_layer( (SceneRenderLayer*) BLI_findlink(&current_scene->r.layers, current_scene->r.actlay) );
}
@ -212,7 +216,7 @@ extern "C" {
init_view(re);
init_camera(re);
for(srl= (SceneRenderLayer *)G.scene->r.layers.first; srl; srl= srl->next) {
for(srl= (SceneRenderLayer *)current_scene->r.layers.first; srl; srl= srl->next) {
if( !(srl->layflag & SCE_LAY_DISABLE) &&
srl->layflag & SCE_LAY_FRS &&
displayed_layer_count(srl) > 0 )
@ -277,7 +281,7 @@ extern "C" {
freestyle_dkr_epsilon = &config->dkr_epsilon;
freestyle_current_layer = srl;
G.scene->freestyle_current_layer_number = BLI_findindex(&G.scene->r.layers, freestyle_current_layer);
current_scene->freestyle_current_layer_number = BLI_findindex(&current_scene->r.layers, freestyle_current_layer);
}
void FRS_add_module()

@ -66,7 +66,7 @@ void BlenderFileLoader::insertShapeNode(ObjectRen *obr, int id)
// M allows to recover world coordinates from camera coordinates
// M => obr->ob->imat * obr->obmat (multiplication from left to right)
float M[4][4];
MTC_Mat4MulMat4(M, obr->ob->imat, obr->ob->obmat);
Mat4MulMat4(M, obr->ob->imat, obr->ob->obmat);
// We compute a normal per vertex and manages the smoothing of the shape:
// Lib3dsVector *normalL=(Lib3dsVector*)malloc(3*sizeof(Lib3dsVector)*mesh->faces);
@ -128,7 +128,7 @@ void BlenderFileLoader::insertShapeNode(ObjectRen *obr, int id)
pvtmp[1] = obr->vertnodes[0].vert->co[1];
pvtmp[2] = obr->vertnodes[0].vert->co[2];
MTC_Mat4MulVecfl( M, pvtmp);
Mat4MulVecfl( M, pvtmp);
minBBox[0] = pvtmp[0];
maxBBox[0] = pvtmp[0];
@ -197,7 +197,7 @@ void BlenderFileLoader::insertShapeNode(ObjectRen *obr, int id)
//lib3ds_vector_transform(pv, M, mesh->pointL[f->points[i]].pos); //fills the cells of the pv array
for(j=0; j<3; j++)
pv[j] = fv[i]->co[j];
MTC_Mat4MulVecfl( M, pv);
Mat4MulVecfl( M, pv);
for(j=0; j<3; j++) // we parse the xyz coordinates of the vertex i
{
@ -234,8 +234,8 @@ void BlenderFileLoader::insertShapeNode(ObjectRen *obr, int id)
vec02[2] = pv_ptr[2][2] - pv_ptr[0][2];
float n[3];
MTC_cross3Float(n, vec01, vec02);
MTC_normalize3DF(n);
Crossf(n, vec01, vec02);
Normalize(n);
for(i=0; i<3; ++i) {
for(j=0; j<3; ++j) {
@ -277,7 +277,7 @@ void BlenderFileLoader::insertShapeNode(ObjectRen *obr, int id)
//lib3ds_vector_transform(pv, M, mesh->pointL[f->points[i]].pos); //fills the cells of the pv array
for(j=0; j<3; j++)
pv[j] = fv[i]->co[j];
MTC_Mat4MulVecfl( M, pv);
Mat4MulVecfl( M, pv);
for(j=0; j<3; j++) // we parse the xyz coordinates of the vertex i
{
@ -314,8 +314,8 @@ void BlenderFileLoader::insertShapeNode(ObjectRen *obr, int id)
vec02[2] = pv_ptr[2][2] - pv_ptr[0][2];
float n[3];
MTC_cross3Float(n, vec01, vec02);
MTC_normalize3DF(n);
Crossf(n, vec01, vec02);
Normalize(n);
for(i=0; i<3; ++i) {
for(j=0; j<3; ++j) {

@ -24,8 +24,7 @@ extern "C" {
#include "BKE_mesh.h"
#include "BKE_scene.h"
#include "MTC_matrixops.h"
#include "MTC_vectorops.h"
#include "BLI_arithb.h"
#ifdef __cplusplus
}

@ -17,10 +17,6 @@ extern "C" {
#include "DNA_meshdata_types.h"
#include "DNA_screen_types.h"
#include "BIF_drawscene.h"
#include "BIF_renderwin.h"
#include "BIF_writeimage.h"
#include "BKE_customdata.h"
#include "BKE_global.h"
#include "BKE_library.h" /* free_libblock */
@ -28,9 +24,6 @@ extern "C" {
#include "BKE_main.h" /* struct Main */
#include "BKE_object.h"
#include "BKE_scene.h"
#include "BSE_sequence.h" /* to clear_scene_in_allseqs */
#include "BSE_node.h" /* to clear_scene_in_nodes */
#include "BSE_edit.h" /* countall */
#include "RE_pipeline.h"
@ -39,9 +32,7 @@ extern "C" {
#endif
BlenderStrokeRenderer::BlenderStrokeRenderer()
BlenderStrokeRenderer::BlenderStrokeRenderer(Render* re)
:StrokeRenderer(){
// TEMPORARY - need a texture manager
@ -49,23 +40,23 @@ BlenderStrokeRenderer::BlenderStrokeRenderer()
_textureManager->load();
// Scene.New("FreestyleStrokes")
old_scene = G.scene;
old_scene = re->scene;
objects.first = objects.last = NULL;
ListBase lb;
scene = add_scene("freestyle_strokes");
lb = scene->r.layers;
scene->r= old_scene->r;
scene->r.layers= lb;
set_scene_bg( scene );
freestyle_scene = add_scene("freestyle_strokes");
lb = freestyle_scene->r.layers;
freestyle_scene->r= old_scene->r;
freestyle_scene->r.layers= lb;
set_scene_bg( freestyle_scene );
// image dimensions
float width = scene->r.xsch;
float height = scene->r.ysch;
float width = freestyle_scene->r.xsch;
float height = freestyle_scene->r.ysch;
// Camera
Object* object_camera = add_object(OB_CAMERA);
Object* object_camera = add_object(freestyle_scene, OB_CAMERA);
Camera* camera = (Camera *) object_camera->data;
camera->type = CAM_ORTHO;
@ -75,7 +66,7 @@ BlenderStrokeRenderer::BlenderStrokeRenderer()
object_camera->loc[1] = 0.5 * height;
object_camera->loc[2] = 1.0;
scene->camera = object_camera;
freestyle_scene->camera = object_camera;
store_object(object_camera);
@ -94,7 +85,7 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer(){
}
// release scene
free_libblock( &G.main->scene, scene );
free_libblock( &G.main->scene, freestyle_scene );
// release objects and data blocks
LinkData *link = (LinkData *)objects.first;
@ -154,7 +145,7 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{
++s){
// me = Mesh.New()
Object* object_mesh = add_object(OB_MESH);
Object* object_mesh = add_object(freestyle_scene, OB_MESH);
Mesh* mesh = (Mesh *) object_mesh->data;
MEM_freeN(mesh->bb);
mesh->bb= NULL;
@ -270,13 +261,13 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{
}
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;
freestyle_scene->r.mode &= ~( R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR );
freestyle_scene->r.scemode &= ~( R_SINGLE_LAYER );
freestyle_scene->r.planes = R_PLANES32;
freestyle_scene->r.imtype = R_PNG;
Render* freestyle_render = RE_NewRender(scene->id.name);
Render* freestyle_render = RE_NewRender(freestyle_scene->id.name);
RE_BlenderFrame( freestyle_render, scene, 1);
RE_BlenderFrame( freestyle_render, freestyle_scene, 1);
return freestyle_render;
}

@ -23,7 +23,7 @@ extern "C" {
class LIB_STROKE_EXPORT BlenderStrokeRenderer : public StrokeRenderer
{
public:
BlenderStrokeRenderer();
BlenderStrokeRenderer(Render *re);
virtual ~BlenderStrokeRenderer();
/*! Renders a stroke rep */
@ -33,8 +33,8 @@ public:
Render* RenderScene(Render *re);
protected:
Scene* scene;
Scene* old_scene;
Scene* freestyle_scene;
Material* material;
ListBase objects;

@ -68,9 +68,9 @@ public:
}
Operators::reset();
int errorCode;
if( (errorCode = _inter->interpretFile(_file_name)) ) {
cerr << "Error: interpretation failed with code " << errorCode << endl;
if( _inter->interpretFile(_file_name) ) {
cerr << "Error: interpretation failed" << endl;
return NULL;
}

@ -42,8 +42,6 @@ class LIB_SYSTEM_EXPORT Interpreter
virtual ~Interpreter() {}; //soc
virtual int interpretCmd(const string& cmd) = 0;
virtual int interpretFile(const string& filename) = 0;
virtual string getLanguage() const { return _language; }

@ -37,12 +37,14 @@
//soc
extern "C" {
#include "MEM_guardedalloc.h"
#include "BKE_main.h"
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_report.h"
#include "BKE_text.h"
#include "BKE_library.h"
#include "BPY_extern.h"
#include "BIF_drawtext.h"
}
class LIB_SYSTEM_EXPORT PythonInterpreter : public Interpreter
@ -58,35 +60,32 @@ class LIB_SYSTEM_EXPORT PythonInterpreter : public Interpreter
//Py_Finalize();
}
int interpretCmd(const string& cmd) {
initPath();
char* c_cmd = strdup(cmd.c_str());
int err = PyRun_SimpleString(c_cmd);
free(c_cmd);
return err;
}
int interpretFile(const string& filename) {
initPath();
bContext* C = CTX_create();
ReportList* reports = (ReportList*) MEM_mallocN(sizeof(ReportList), "freestyleExecutionReportList");
initPath(C);
BKE_reports_init(reports, RPT_ERROR);
char *fn = const_cast<char*>(filename.c_str());
struct Text *text = add_text( fn );
if (text == NULL) {
cout << "\nError in PythonInterpreter::interpretFile:" << endl;
cout << "couldn't create Blender text from" << fn << endl;
}
int status = BPY_txt_do_python_Text(text);
// cleaning up
unlink_text(text);
free_libblock(&G.main->text, text);
int status = BPY_run_python_script( C, fn, NULL, reports);
if (status != 1) {
cout << "\nError executing Python script from PythonInterpreter::interpretFile:" << endl;
cout << fn << " (at line " << BPY_Err_getLinenumber() << ")" << endl;
return BPY_Err_getLinenumber();
cout << "\nError executing Python script from PythonInterpreter::interpretFile" << endl;
cout << "File: " << fn << endl;
cout << "Errors: " << endl;
BKE_reports_print(reports, RPT_ERROR);
return 1;
}
// cleaning up
CTX_free( C );
BKE_reports_clear(reports);
if ((reports->flag & RPT_FREE) == 0)
{
MEM_freeN(reports);
}
return 0;
@ -111,7 +110,7 @@ class LIB_SYSTEM_EXPORT PythonInterpreter : public Interpreter
private:
static void initPath() {
static void initPath(bContext* C) {
if (_initialized)
return;
@ -130,10 +129,10 @@ private:
}
}
BPY_txt_do_python_Text(text);
BPY_run_python_script( C, NULL, text, NULL);
// cleaning up
unlink_text(text);
unlink_text(G.main, text);
free_libblock(&G.main->text, text);
//PyRun_SimpleString("from Freestyle import *");

@ -0,0 +1,28 @@
#ifndef DNA_FREESTYLE_TYPES_H
#define DNA_FREESTYLE_TYPES_H
#include "DNA_listBase.h"
typedef struct FreestyleModuleConfig {
struct FreestyleModuleConfig *next, *prev;
char module_path[256];
short is_displayed;
short pad[3];
} FreestyleModuleConfig;
typedef struct FreestyleConfig {
ListBase modules;
int flags;
float sphere_radius;
float dkr_epsilon;
int pad;
} FreestyleConfig;
#endif

@ -37,6 +37,7 @@ extern "C" {
#include "DNA_vec_types.h"
#include "DNA_listBase.h"
#include "DNA_ID.h"
#include "DNA_freestyle_types.h"
struct Object;
struct World;
@ -128,6 +129,9 @@ typedef struct SceneRenderLayer {
int passflag; /* pass_xor has to be after passflag */
int pass_xor;
struct FreestyleConfig freestyleConfig;
} SceneRenderLayer;
/* srl->layflag */
@ -137,6 +141,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
@ -727,6 +732,11 @@ typedef struct Scene {
/* Grease Pencil */
struct bGPdata *gpd;
/* Freestyle */
short freestyle_current_layer_number;
short pad[3];
} Scene;
@ -770,6 +780,7 @@ typedef struct Scene {
#define R_NO_OVERWRITE 0x400000 /* skip existing files */
#define R_TOUCH 0x800000 /* touch files before rendering */
#define R_SIMPLIFY 0x1000000
#define R_EDGE_FRS 0x2000000 /* R_EDGE for Freestyle */
/* displaymode */

@ -133,6 +133,7 @@ char *includefiles[] = {
"DNA_anim_types.h",
"DNA_boid_types.h",
"DNA_smoke_types.h",
"DNA_freestyle_types.h",
// empty string to indicate end of includefiles
""
@ -1159,4 +1160,5 @@ int main(int argc, char ** argv)
#include "DNA_anim_types.h"
#include "DNA_boid_types.h"
#include "DNA_smoke_types.h"
#include "DNA_freestyle_types.h"
/* end of list */

@ -262,6 +262,8 @@ void WM_read_file(bContext *C, char *name, ReportList *reports)
writeBlog();
}
FRS_initialize(C);
// XXX undo_editmode_clear();
BKE_reset_undo();
BKE_write_undo(C, "original"); /* save current state */
@ -321,6 +323,8 @@ int WM_read_homefile(bContext *C, wmOperator *op)
strcpy(G.sce, scestr); /* restore */
wm_init_userdef();
FRS_initialize(C);
/* When loading factory settings, the reset solid OpenGL lights need to be applied. */
GPU_default_lights();

@ -821,6 +821,7 @@ int main(int argc, char **argv)
if (G.background) {
int retval = BKE_read_file(C, argv[a], NULL, NULL);
FRS_initialize(C);
/*we successfully loaded a blend file, get sure that
pointcache works */