1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
#include "AppGLWidget.h"
#include "Controller.h"
#include "AppConfig.h"
#include <iostream>
#ifdef __cplusplus
extern "C" {
#endif
#include "DNA_camera_types.h"
#include "render_types.h"
#include "renderpipeline.h"
#include "BLI_blenlib.h"
#include "BPY_extern.h"
#ifdef __cplusplus
}
#endif
using namespace std;
#ifdef __cplusplus
extern "C" {
#endif
static Controller *controller = NULL;
static AppGLWidget *view = NULL;
void FRS_initialize(){
if( controller == NULL )
controller = new Controller;
if( view == NULL )
view = new AppGLWidget;
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
Object* maincam_obj = re->scene->camera;
Camera *cam = (Camera*) maincam_obj->data;
if(cam->type == CAM_PERSP){
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
}
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);
// export scene to 3ds format
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()) );
// load 3ds scene
char btempdir[255];
BLI_where_is_temp(btempdir,1);
string exported_3ds_file = btempdir;
exported_3ds_file += Config::DIR_SEP + "tmp_scene_freestyle.3ds";
if( BLI_exists( const_cast<char *>(exported_3ds_file.c_str()) ) ) {
controller->Load3DSFile( exported_3ds_file.c_str() );
}
else {
cout << "Cannot find" << exported_3ds_file << endl;
return;
}
// add style module
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()) );
controller->toggleLayer(0, true);
// compute view map
controller->ComputeViewMap();
// build strokes
controller->DrawStrokes();
// render final result
view->draw();
// copy result into render window
RenderResult rres;
RE_GetResultImage(re, &rres);
view->readPixels(0,0,width,height,AppGLWidget::RGBA, rres.rectf );
re->result->renlay = render_get_active_layer(re, re->result);
re->display_draw(re->result, NULL);
controller->CloseFile();
}
#ifdef __cplusplus
}
#endif
|