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:
-rw-r--r--source/blender/freestyle/FRS_freestyle.h7
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/AppCanvas.cpp262
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/AppCanvas.h9
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/AppGLWidget.cpp54
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/AppGLWidget.h55
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/Controller.cpp77
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/Controller.h9
-rw-r--r--source/blender/freestyle/intern/app_blender/api.cpp104
-rwxr-xr-xsource/blender/freestyle/intern/rendering/GLStrokeRenderer.cpp1
-rw-r--r--source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp270
-rw-r--r--source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h46
-rwxr-xr-xsource/blender/freestyle/intern/stroke/Canvas.cpp19
-rwxr-xr-xsource/blender/freestyle/intern/stroke/Operators.cpp2
-rwxr-xr-xsource/blender/freestyle/intern/system/PythonInterpreter.h2
-rw-r--r--source/blender/makesdna/DNA_scene_types.h1
-rw-r--r--source/blender/python/api2_2x/sceneRender.c3
-rw-r--r--source/blender/render/intern/include/render_types.h3
-rw-r--r--source/blender/render/intern/source/convertblender.c9
-rw-r--r--source/blender/render/intern/source/pipeline.c47
-rw-r--r--source/blender/render/intern/source/rendercore.c32
-rw-r--r--source/blender/src/buttons_scene.c12
21 files changed, 539 insertions, 485 deletions
diff --git a/source/blender/freestyle/FRS_freestyle.h b/source/blender/freestyle/FRS_freestyle.h
index 09672ae14fd..42ca18b7351 100644
--- a/source/blender/freestyle/FRS_freestyle.h
+++ b/source/blender/freestyle/FRS_freestyle.h
@@ -13,9 +13,14 @@ extern "C" {
extern float freestyle_sphere_radius;
extern float freestyle_dkr_epsilon;
+ extern float freestyle_viewpoint[3];
+ extern float freestyle_mv[4][4];
+ extern float freestyle_proj[4][4];
+ extern int freestyle_viewport[4];
+
void FRS_initialize();
void FRS_prepare(Render* re);
- void FRS_render_GL(Render* re);
+ void FRS_render_Blender(Render* re);
#ifdef __cplusplus
}
diff --git a/source/blender/freestyle/intern/app_blender/AppCanvas.cpp b/source/blender/freestyle/intern/app_blender/AppCanvas.cpp
index 12a7004cd86..ccd6a771dc7 100755
--- a/source/blender/freestyle/intern/app_blender/AppCanvas.cpp
+++ b/source/blender/freestyle/intern/app_blender/AppCanvas.cpp
@@ -80,283 +80,59 @@ BBox<Vec3r> AppCanvas::scene3DBBox() const
void AppCanvas::preDraw()
{
Canvas::preDraw();
-
- _pViewer->prepareCanvas();
- glClearColor(0,0,0,0);
- glClear(GL_COLOR_BUFFER_BIT);
- glDisable(GL_LIGHTING);
- glPolygonMode(GL_FRONT, GL_FILL);
- glShadeModel(GL_SMOOTH);
- glDisable(GL_DEPTH_TEST);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
}
void AppCanvas::init()
{
- static bool firsttime = true;
- if (firsttime) {
-
- GLenum err = glewInit();
- if (GLEW_OK != err)
- {
- cerr << "Error: problem occurred while initializing GLEW" << endl;
- }
- cout << "GLEW initialized: ";
-
- if(glBlendEquation) {
- cout << "using glBlendEquation" << endl;
- } else if(glBlendEquationEXT) {
- cout << "using glBlendEquationEXT" << endl;
- } else {
- _basic = true;
- cout << "glBlendEquation or glBlendEquationEXT unavailable on this hardware -> switching to strokes basic rendering mode" << endl;
- }
- firsttime=false;
- }
-
- _Renderer = new GLStrokeRenderer;
- if(!StrokeRenderer::loadTextures())
- {
- cerr << "unable to load stroke textures" << endl;
- return;
- }
+ // static bool firsttime = true;
+ // if (firsttime) {
+ //
+ // _Renderer = new BlenderStrokeRenderer;
+ // if(!StrokeRenderer::loadTextures())
+ // {
+ // cerr << "unable to load stroke textures" << endl;
+ // return;
+ // }
+ // }
}
void AppCanvas::postDraw()
{
- //inverse frame buffer
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
- _pViewer->releaseCanvas();
-
- Canvas::postDraw();
+ Canvas::postDraw();
}
void AppCanvas::Erase()
{
Canvas::Erase();
- //_pViewer->clear();
}
+// Abstract
+
#include "../image/GaussianFilter.h"
void AppCanvas::readColorPixels(int x,int y,int w, int h, RGBImage& oImage) const
{
//static unsigned number = 0;
float *rgb = new float[3*w*h];
- _pViewer->readPixels(x,y,w,h,AppGLWidget::RGB,rgb);
+ //_pViewer->readPixels(x,y,w,h,AppGLWidget::RGB,rgb);
oImage.setArray(rgb, width(), height(), w,h, x, y, false);
- // FIXME
- // QImage qtmp(w, h, 32);
- // for(unsigned py=0;py<h;++py){
- // for(unsigned px=0;px<w;++px){
- // int r = (int)255*(oImage.getR(x+px,y+py));
- // int g = (int)255*(oImage.getG(x+px,y+py));
- // int b = (int)255*(oImage.getB(x+px,y+py));
- // qtmp.setPixel(px,py,qRgb(r,g,b));
- // }
- // }
- // qtmp.save("densityQuery"+QString::number(number)+".png", "PNG");
- // if(number == 1090){
- // RGBImage img;
- // float *rgbtmp = new float[3*width()*height()];
- // _pViewer->readPixels(0,0,width(),height(),AppGLWidget::RGB,rgbtmp);
- // img.setArray(rgbtmp, width(), height(), width(), height(), 0, 0, false);
- // QImage qtmp(width(), height(), 32);
- // for(unsigned py=0;py<height();++py){
- // for(unsigned px=0;px<width();++px){
- // int r = (int)255*(img.getR(px,py));
- // int g = (int)255*(img.getG(px,py));
- // int b = (int)255*(img.getB(px,py));
- // qtmp.setPixel(px,height()-1-py,qRgb(r,g,b));
- // }
- // }
- // qtmp.save("densityQuery"+QString::number(number)+".png", "PNG");
- //
- // GaussianFilter filter;
- // filter.setSigma(4.0);
- // int bound = filter.getBound();
- // QImage qtmp2(width(), height(), 32);
- // for(int py2=0;py2<height();++py2){
- // for(int px2=0;px2<width();++px2){
- // if( (px2-bound < 0) || (px2+bound>width())
- // || (py2-bound < 0) || (py2+bound>height()))
- // continue;
- // int g = 255*filter.getSmoothedPixel<RGBImage>(&img, px2,py2);
- // qtmp2.setPixel(px2,height()-1-py2,qRgb(g,g,g));
- // }
- // }
- // qtmp2.save("blurredCausalDensity"+QString::number(number)+".png", "PNG");
- // }
- // cout << number << endl;
- // ++number;
}
void AppCanvas::readDepthPixels(int x,int y,int w, int h, GrayImage& oImage) const
{
float *rgb = new float[w*h];
- _pViewer->readPixels(x,y,w,h,AppGLWidget::DEPTH,rgb);
+ //_pViewer->readPixels(x,y,w,h,AppGLWidget::DEPTH,rgb);
oImage.setArray(rgb, width(), height(), w,h, x, y, false);
}
-void AppCanvas::update()
-{
-// static int counter = 0;
-// char fileName[100] = "framebuffer";
-// char number[10];
-//
- _pViewer->updateGL();
- //_pViewer->swapBuffers();
- //QImage fb = _pViewer->grabFrameBuffer();
- // sprintf(number, "%3d", counter);
- // strcat(fileName, number);
- // strcat(fileName, ".bmp");
- // fb.save(fileName, "BMP");
- //counter++;
-}
-
-void AppCanvas::Render(const StrokeRenderer *iRenderer)
-{
- if(_basic){
- RenderBasic(iRenderer);
- return;
- }
-
- glClearColor(1,1,1,1);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glDisable(GL_LIGHTING);
- glPolygonMode(GL_FRONT, GL_FILL);
- glShadeModel(GL_SMOOTH);
-
- if(_pViewer->draw3DsceneEnabled())
- {
- glClearColor(1,1,1,0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- glEnable(GL_LIGHTING);
- glEnable(GL_DEPTH_TEST);
- _pViewer->set3DContext();
- _pViewer->DrawScene(_pViewer->glRenderer());
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_LIGHTING);
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- }
-
-
- glDisable(GL_DEPTH_TEST);
- FRS_glBlendEquation(GL_ADD);
-
- glBlendFunc(GL_DST_COLOR, GL_ZERO);
-
- glPushAttrib(GL_COLOR_BUFFER_BIT);
- FRS_glBlendEquation(GL_FUNC_SUBTRACT);
- glBlendFunc(GL_ONE, GL_ONE);
-
- glDisable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glColor4f(1,1,1,1);
- glBegin(GL_TRIANGLE_STRIP);
- {
- glVertex2f(0, 0);
- glVertex2f(2048, 0);
- glVertex2f(0, 2048);
- glVertex2f(2048, 2048);
- }
- glEnd();
- glPopAttrib();
-
- glDisable(GL_DEPTH_TEST);
- FRS_glBlendEquation(GL_ADD);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
-
- glEnable(GL_TEXTURE_2D);
-
- Canvas::Render(iRenderer);
- //
- glPushAttrib(GL_COLOR_BUFFER_BIT);
- FRS_glBlendEquation(GL_FUNC_SUBTRACT);
- glBlendFunc(GL_ONE, GL_ONE);
-
- glDisable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glColor3f(1,1,1);
- glBegin(GL_TRIANGLE_STRIP);
- {
- glVertex2f(0, 0);
- glVertex2f(2048, 0);
- glVertex2f(0, 2048);
- glVertex2f(2048, 2048);
- }
- glEnd();
- glPopAttrib();
-
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
-}
-
-void AppCanvas::RenderBasic(const StrokeRenderer *iRenderer)
-{
- glClearColor(1,1,1,1);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glDisable(GL_LIGHTING);
- glPolygonMode(GL_FRONT, GL_FILL);
- glShadeModel(GL_SMOOTH);
-
- if(_pViewer->draw3DsceneEnabled())
- {
- glClearColor(1,1,1,0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
-
- glEnable(GL_LIGHTING);
- glEnable(GL_DEPTH_TEST);
- _pViewer->set3DContext();
- _pViewer->DrawScene(_pViewer->glRenderer());
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_LIGHTING);
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
- }
-
- glBlendFunc(GL_DST_COLOR, GL_ZERO);
-
- glDisable(GL_DEPTH_TEST);
- glPushAttrib(GL_COLOR_BUFFER_BIT);
- glEnable(GL_BLEND);
- glPopAttrib();
-
- glDisable(GL_DEPTH_TEST);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
-
- glEnable(GL_TEXTURE_2D);
- Canvas::RenderBasic(iRenderer);
-
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_BLEND);
-}
-
-
void AppCanvas::RenderStroke(Stroke *iStroke) {
if(_basic)
iStroke->RenderBasic(_Renderer);
else
iStroke->Render(_Renderer);
-
- if(_pViewer->getRecordFlag()){
- _pViewer->saveSnapshot(true);
- }
}
+
+
+void AppCanvas::update() {}
+
diff --git a/source/blender/freestyle/intern/app_blender/AppCanvas.h b/source/blender/freestyle/intern/app_blender/AppCanvas.h
index c61c8044c10..7990cf84cc6 100755
--- a/source/blender/freestyle/intern/app_blender/AppCanvas.h
+++ b/source/blender/freestyle/intern/app_blender/AppCanvas.h
@@ -33,13 +33,10 @@ public:
virtual BBox<Vec3r> scene3DBBox() const ;
- /*! update the canvas (display) */
- virtual void update() ;
+ // abstract
+ virtual void RenderStroke(Stroke*);
+ virtual void update();
- /*! Renders the created strokes */
- virtual void Render(const StrokeRenderer *iRenderer);
- virtual void RenderBasic(const StrokeRenderer *iRenderer);
- virtual void RenderStroke(Stroke *iStroke) ;
/*! accessors */
virtual int width() const ;
diff --git a/source/blender/freestyle/intern/app_blender/AppGLWidget.cpp b/source/blender/freestyle/intern/app_blender/AppGLWidget.cpp
index deba79e38ba..4181d653d7c 100755
--- a/source/blender/freestyle/intern/app_blender/AppGLWidget.cpp
+++ b/source/blender/freestyle/intern/app_blender/AppGLWidget.cpp
@@ -34,6 +34,7 @@
#include "../scene_graph/NodeShape.h"
#include "../scene_graph/VertexRep.h"
#include "AppConfig.h"
+#include "AppCanvas.h"
#include "../system/StringUtils.h"
@@ -203,7 +204,6 @@ AppGLWidget::~AppGLWidget()
_pDebugRenderer = NULL;
}
- makeCurrent();
//saveToFile(filename);
}
@@ -285,11 +285,6 @@ void AppGLWidget::init()
//glEnable(GL_BLEND);
NodeLight *light = new NodeLight;
_Light.AddChild(light);
-
- // Change QGLViewer's default shortcut for snapshots
- //setShortcut(QGLViewer::SAVE_SCREENSHOT, Qt::CTRL + Qt::Key_W);
- // setShortcutKey (QGLViewer::SAVE_SCREENSHOT, Key_W);
- // setShortcutStateKey(QGLViewer::SAVE_SCREENSHOT, ControlButton);
cout << "Renderer (GL) : " << glGetString(GL_RENDERER) << endl
<< "Vendor (GL) : " << glGetString(GL_VENDOR) << endl << endl;
@@ -326,9 +321,6 @@ void AppGLWidget::draw()
Draw2DScene(_pGLRenderer);
set3DContext();
}
- if(_record){
- saveSnapshot(true);
- }
}
void AppGLWidget::DrawScene(SceneVisitor *iRenderer)
@@ -409,41 +401,6 @@ void AppGLWidget::DrawScene(SceneVisitor *iRenderer)
glPopAttrib();
}
-void AppGLWidget::prepareCanvas()
-{
- makeCurrent();
- glPushAttrib(GL_ALL_ATTRIB_BITS);
-
- // if(_frontBufferFlag){
- // if(_backBufferFlag)
- // glDrawBuffer(GL_FRONT_AND_BACK);
- // else
- // glDrawBuffer(GL_FRONT);
- // }
- // else if(_backBufferFlag)
- // glDrawBuffer(GL_BACK);
- //glDrawBuffer( workingBuffer ); //soc
-
- // Projection Matrix
- //==================
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- glOrtho(0,width(), 0, height(), -1.0, 1.0);
-
- //Modelview Matrix
- //================
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-}
-
-void AppGLWidget::releaseCanvas()
-{
- makeCurrent();
- //glDrawBuffer( workingBuffer ); //soc
- glPopAttrib();
-}
-
#if 1 // FRS_antialiasing
void AppGLWidget::init_jit(int osa)
@@ -518,6 +475,7 @@ void AppGLWidget::Draw2DScene(SceneVisitor *iRenderer)
glAccum(GL_RETURN, 1.0);
}
#endif
+
}
glLoadIdentity();
@@ -670,13 +628,7 @@ bool AppGLWidget::getBackBufferFlag() {
// COPIED FROM LIBQGLVIEWER
//*******************************
- // inherited
- //Updates the display. Do not call draw() directly, use this method instead.
- void AppGLWidget::updateGL() {}
-
- //Makes this widget's rendering context the current OpenGL rendering context. Useful with several viewers
- void AppGLWidget::makeCurrent() { }
+ // inherited
// not-inherited
void AppGLWidget::setStateFileName(const string& name) { stateFileName_ = name; };
- void AppGLWidget::saveSnapshot(bool b) {}
diff --git a/source/blender/freestyle/intern/app_blender/AppGLWidget.h b/source/blender/freestyle/intern/app_blender/AppGLWidget.h
index e52c0e18319..5a4988d9158 100755
--- a/source/blender/freestyle/intern/app_blender/AppGLWidget.h
+++ b/source/blender/freestyle/intern/app_blender/AppGLWidget.h
@@ -47,6 +47,8 @@ using namespace std;
# include "../rendering/GLDebugRenderer.h"
//# include <QGLViewer/qglviewer.h>
+# include "../stroke/BlenderStrokeRenderer.h"
+
//soc
#include "AppGLWidget_camera.h"
@@ -81,12 +83,8 @@ public:
inline unsigned int height() { return _height; }
inline void setWidth( unsigned int width ) { _width = width; }
inline void setHeight( unsigned int height ) { _height = height; }
-
- void updateGL();
- void makeCurrent();
// not-inherited
- void saveSnapshot(bool b);
void setStateFileName(const string& name);
@@ -157,20 +155,20 @@ public:
{
_SilhouetteRootNode->AddChild(iSilhouette);
//ToggleSilhouette(true);
- updateGL();
+
}
inline void Add2DSilhouette(NodeGroup *iSilhouette)
{
//_pFENode->AddChild(iSilhouette);
//ToggleSilhouette(true);
- updateGL();
+
}
inline void Add2DVisibleSilhouette(NodeGroup *iVSilhouette)
{
//_pVisibleSilhouetteNode->AddChild(iVSilhouette);
- updateGL();
+
}
inline void setDebug(NodeGroup* iDebug)
@@ -187,7 +185,7 @@ public:
inline void AddDebug(NodeGroup* iDebug)
{
_DebugRootNode->AddChild(iDebug);
- updateGL();
+
}
inline void DetachModel(Node *iModel)
@@ -215,7 +213,7 @@ public:
//_p2DNode.DetachChildren();
//_pFENode->DetachChildren();
//_pVisibleSilhouetteNode->DetachChildren();
- updateGL();
+
}
inline void DetachSilhouette()
@@ -224,20 +222,20 @@ public:
//_pFENode->DetachChildren();
//_pVisibleSilhouetteNode->DetachChildren();
_p2DSelectionNode->destroy();
- //updateGL(); //FIXME
+ // //FIXME
}
inline void DetachVisibleSilhouette()
{
//_pVisibleSilhouetteNode->DetachChildren();
_p2DSelectionNode->destroy();
- updateGL();
+
}
inline void DetachDebug()
{
_DebugRootNode->DetachChildren();
- updateGL();
+
}
void setMainWindow(QMainWindow *iMainWindow) ;
@@ -252,31 +250,26 @@ public:
inline void RetriveModelViewMatrix(float *p)
{
- makeCurrent();
glGetFloatv(GL_MODELVIEW_MATRIX, p);
}
inline void RetriveModelViewMatrix(real *p)
{
- makeCurrent();
glGetDoublev(GL_MODELVIEW_MATRIX, p);
}
inline void RetrieveProjectionMatrix(float *p)
{
- makeCurrent();
glGetFloatv(GL_PROJECTION_MATRIX, p);
}
inline void RetrieveProjectionMatrix(real *p)
{
- makeCurrent();
glGetDoublev(GL_PROJECTION_MATRIX, p);
}
inline void RetrieveViewport(int *p)
{
- makeCurrent();
glGetIntegerv(GL_VIEWPORT,(GLint *)p);
}
@@ -316,7 +309,7 @@ public:
inline void ToggleSilhouette(bool enabled)
{
_fedges = enabled;
- updateGL();
+
}
// Reinit the renderers which need to be informed
@@ -326,7 +319,7 @@ public:
inline void setSelectedFEdge(FEdge* iFEdge) { _pDebugRenderer->setSelectedFEdge(iFEdge); }
inline GLDebugRenderer* debugRenderer() { return _pDebugRenderer; }
- inline void toggle3D() { _Draw3DScene == true ? _Draw3DScene = false : _Draw3DScene = true; updateGL();}
+ inline void toggle3D() { _Draw3DScene == true ? _Draw3DScene = false : _Draw3DScene = true; }
/*! glReadPixels */
typedef enum{
@@ -341,7 +334,7 @@ public:
PixelFormat format,
float *pixels)
{
- makeCurrent();
+
//glReadBuffer(GL_FRONT); //in reality: glReadBuffer and glDrawBuffer are both set to GL_BACK
//glReadBuffer(GL_BACK);
GLenum glformat;
@@ -362,31 +355,13 @@ public:
glReadPixels(x,y,width, height, glformat, GL_FLOAT, (GLfloat*)pixels);
}
- void clear() { makeCurrent(); glClear(GL_COLOR_BUFFER_BIT ); }
-
- void prepareCanvas();
- void releaseCanvas();
+ void clear() { glClear(GL_COLOR_BUFFER_BIT ); }
typedef enum {
FRONT,
BACK
} GLBuffer;
- // void setReadPixelsBuffer(int iBuffer)
- // {
- // makeCurrent();
- // switch(iBuffer)
- // {
- // case FRONT:
- // glReadBuffer(GL_FRONT);
- // break;
- // case BACK:
- // glReadBuffer(GL_BACK);
- // break;
- // default:
- // break;
- // }
- // }
BBox<Vec3r> scene3DBBox() const { return _ModelRootNode->bbox(); }
@@ -508,7 +483,7 @@ protected:
GLBBoxRenderer *_pBBoxRenderer;
GLMonoColorRenderer *_pMonoColorRenderer;
GLDebugRenderer *_pDebugRenderer;
-
+
QMainWindow *_pMainWindow;
Chronometer _Chrono;
diff --git a/source/blender/freestyle/intern/app_blender/Controller.cpp b/source/blender/freestyle/intern/app_blender/Controller.cpp
index 3e9bf347c74..6fa31cdd03d 100755
--- a/source/blender/freestyle/intern/app_blender/Controller.cpp
+++ b/source/blender/freestyle/intern/app_blender/Controller.cpp
@@ -48,23 +48,18 @@
#include "Controller.h"
#include "../view_map/ViewMap.h"
#include "../winged_edge/Curvature.h"
-//#include "QGLBasicWidget.h"
-//#include <qimage.h>
#include "../image/Image.h"
#include "../view_map/SteerableViewMap.h"
#include "../stroke/PSStrokeRenderer.h"
#include "../stroke/TextStrokeRenderer.h"
#include "../stroke/StyleModule.h"
-#ifndef WIN32
-//# include "GLXOffscreenBuffer.h"
-//# include "GLXOffscreenBuffer.h"
-#endif
-
#include "../system/StringUtils.h"
#include "../scene_graph/BlenderFileLoader.h"
+#include "../../FRS_freestyle.h"
+
Controller::Controller()
{
@@ -252,8 +247,6 @@ int Controller::LoadMesh(Render *re)
// delete ws_builder;
// ws_builder = 0;
// }
- _pView->updateGL();
-
//soc QFileInfo qfi(iFileName);
//soc string basename((const char*)qfi.fileName().toAscii().data());
@@ -341,17 +334,7 @@ void Controller::CloseFile()
_Grid.clear();
_SceneNumFaces = 0;
_minEdgeSize = DBL_MAX;
- // _pView2D->DetachScene();
- // if(NULL != _SRoot)
- // {
- // int ref = _SRoot->destroy();
- // if(0 == ref)
- // {
- // //_SRoot->addRef();
- // delete _SRoot;
- // _SRoot = NULL;
- // }
- // }
+
}
// static const streamsize buffer_size = 512 * 1024;
@@ -597,18 +580,25 @@ void Controller::ComputeViewMap()
// we need to perform all these operations while the
// 3D context is on.
_pView->set3DContext();
- float src[3] = { 0, 0, 0 };
- float vp_tmp[3] = { 0, 0, 0 };
- _pView->_camera->getWorldCoordinatesOf(src, vp_tmp);
- Vec3r vp(vp_tmp[0], vp_tmp[1], vp_tmp[2]);
-
- real mv[4][4];
- _pView->RetriveModelViewMatrix((real *)mv);
- // retrieve the projection matrix:
- real proj[4][4];
- _pView->RetrieveProjectionMatrix((real *)proj);
- int viewport[4];
- _pView->RetrieveViewport(viewport);
+ Vec3r vp( freestyle_viewpoint[0], freestyle_viewpoint[1], freestyle_viewpoint[2]);
+
+ real mv[4][4];
+ for( int i= 0; i < 4; i++)
+ for( int j= 0; j < 4; j++)
+ mv[i][j] = freestyle_mv[i][j];
+
+
+ real proj[4][4];
+ for( int i= 0; i < 4; i++)
+ for( int j= 0; j < 4; j++)
+ proj[i][j] = freestyle_proj[i][j];
+
+
+ int viewport[4];
+ for( int i= 0; i < 4; i++)
+ viewport[i] = freestyle_viewport[i];
+
+
real focalLength = _pView->GetFocalLength();
// Flag the WXEdge structure for silhouette edge detection:
@@ -632,7 +622,14 @@ void Controller::ComputeViewMap()
vmBuilder.setEnableQI(_EnableQI);
vmBuilder.setViewpoint(Vec3r(vp));
- vmBuilder.setTransform(mv, proj, viewport, focalLength, _pView->GetAspect(), _pView->GetFovyRadian());
+cout << "focalLength: " << focalLength << endl;
+cout << "aspect: " << _pView->GetAspect() << endl;
+cout << "fovyradian: " << _pView->GetFovyRadian() << endl;
+
+cout << "znear: " << _pView->znear() << endl;
+cout << "zfar: " << _pView->zfar() << endl;
+
+ vmBuilder.setTransform( mv, proj,viewport, focalLength, _pView->GetAspect(), _pView->GetFovyRadian());
vmBuilder.setFrustum(_pView->znear(), _pView->zfar());
vmBuilder.setGrid(&_Grid);
@@ -843,10 +840,17 @@ void Controller::DrawStrokes()
_Chrono.start();
_Canvas->Draw();
real d = _Chrono.stop();
- cout << "Strokes drawing : " << d << endl;
+ cout << "Strokes generation : " << d << endl;
resetModified();
}
+void Controller::RenderBlender(Render *re) {
+ BlenderStrokeRenderer* blenderRenderer = new BlenderStrokeRenderer;
+ _Canvas->Render( blenderRenderer );
+ blenderRenderer->RenderScene(re);
+ blenderRenderer->Close();
+}
+
void Controller::InsertStyleModule(unsigned index, const char *iFileName)
{
// QFileInfo fi(iFileName);
@@ -898,7 +902,6 @@ void Controller::SwapStyleModules(unsigned i1, unsigned i2)
void Controller::toggleLayer(unsigned index, bool iDisplay)
{
_Canvas->setVisible(index, iDisplay);
- _pView->updateGL();
}
void Controller::setModified(unsigned index, bool iMod)
@@ -917,10 +920,6 @@ void Controller::updateCausalStyleModules(unsigned index) {
}
}
-void Controller::saveSnapshot(bool b) {
- _pView->saveSnapshot(b);
-}
-
void Controller::resetModified(bool iMod)
{
//_pStyleWindow->resetModified(iMod);
diff --git a/source/blender/freestyle/intern/app_blender/Controller.h b/source/blender/freestyle/intern/app_blender/Controller.h
index a5b0d6c3fa8..76aa071ddd3 100755
--- a/source/blender/freestyle/intern/app_blender/Controller.h
+++ b/source/blender/freestyle/intern/app_blender/Controller.h
@@ -50,6 +50,7 @@ class ViewEdge;
class AppCanvas;
class InteractiveShader;
class Shader;
+class StrokeRenderer;
#ifdef __cplusplus
extern "C" {
@@ -81,7 +82,8 @@ public:
void ComputeSteerableViewMap();
void saveSteerableViewMapImages();
void toggleEdgeTesselationNature(Nature::EdgeNature iNature);
- void DrawStrokes();
+ void RenderBlender(Render *re);
+ void DrawStrokes();
void SwapStyleModules(unsigned i1, unsigned i2);
void InsertStyleModule(unsigned index, const char *iFileName);
void AddStyleModule(const char *iFileName);
@@ -92,7 +94,6 @@ public:
void setModified(unsigned index, bool iMod);
void resetModified(bool iMod=false);
void updateCausalStyleModules(unsigned index);
- void saveSnapshot(bool b = false);
void displayDensityCurves(int x, int y);
@@ -150,6 +151,9 @@ private:
// Current directories
//ConfigIO* _current_dirs;
+ // Canvas
+ AppCanvas *_Canvas;
+
//View
// 3D
AppGLWidget *_pView;
@@ -199,7 +203,6 @@ private:
real _EPSILON;
real _bboxDiag;
- AppCanvas *_Canvas;
//AppStyleWindow *_pStyleWindow;
//AppOptionsWindow *_pOptionsWindow;
diff --git a/source/blender/freestyle/intern/app_blender/api.cpp b/source/blender/freestyle/intern/app_blender/api.cpp
index d15f1ca9d38..9ac8dfe989a 100644
--- a/source/blender/freestyle/intern/app_blender/api.cpp
+++ b/source/blender/freestyle/intern/app_blender/api.cpp
@@ -9,8 +9,10 @@ extern "C" {
#endif
#include "../../FRS_freestyle.h"
+#include "AppCanvas.h"
#include "DNA_camera_types.h"
+#include "DNA_scene_types.h"
#include "render_types.h"
#include "renderpipeline.h"
@@ -37,6 +39,11 @@ extern "C" {
int freestyle_flags;
float freestyle_sphere_radius = 1.0;
float freestyle_dkr_epsilon = 0.001;
+
+ float freestyle_viewpoint[3];
+ float freestyle_mv[4][4];
+ float freestyle_proj[4][4];
+ int freestyle_viewport[4];
void FRS_initialize(){
@@ -60,9 +67,16 @@ extern "C" {
void FRS_init_view(Render* re){
- view->setWidth( re->winx );
- view->setHeight( re->winy );
- view->_camera->setScreenWidthAndHeight( re->winx, re->winy);
+ int width = re->scene->r.xsch;
+ int height = re->scene->r.ysch;
+
+ freestyle_viewport[0] = freestyle_viewport[1] = 0;
+ freestyle_viewport[2] = width;
+ freestyle_viewport[3] = height;
+
+ view->setWidth( width );
+ view->setHeight( height );
+ view->_camera->setScreenWidthAndHeight( width , height );
}
void FRS_init_camera(Render* re){
@@ -73,18 +87,47 @@ 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);
+
+ freestyle_viewpoint[0] = maincam_obj->obmat[3][0];
+ 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_proj[i][j] = re->winmat[i][j];
}
@@ -117,28 +160,39 @@ extern "C" {
// compute view map
controller->ComputeViewMap();
-
- // build strokes
- controller->DrawStrokes();
}
- void FRS_render_GL(Render* re) {
-
- cout << "Rendering Freestyle with OpenGL" << endl;
+ // void FRS_render_GL(Render* re) {
+ //
+ //
+ // // build strokes
+ // controller->DrawStrokes();
+ //
+ // cout << "Rendering Freestyle with OpenGL" << endl;
+ //
+ // // render strokes
+ // view->workingBuffer = GL_BACK;
+ // view->draw();
+ //
+ // // display result
+ // RenderResult rres;
+ // RE_GetResultImage(re, &rres);
+ // 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_render_Blender(Render* re) {
- // render strokes
- view->workingBuffer = GL_BACK;
- view->draw();
+ // build strokes
+ controller->DrawStrokes();
- // display result
- RenderResult rres;
- RE_GetResultImage(re, &rres);
- 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);
-
+ cout << "Rendering Freestyle with Blender's internal renderer" << endl;
+ controller->RenderBlender(re);
controller->CloseFile();
- }
+ }
#ifdef __cplusplus
}
diff --git a/source/blender/freestyle/intern/rendering/GLStrokeRenderer.cpp b/source/blender/freestyle/intern/rendering/GLStrokeRenderer.cpp
index 0213b5450ab..e29dd5cad8f 100755
--- a/source/blender/freestyle/intern/rendering/GLStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/rendering/GLStrokeRenderer.cpp
@@ -121,6 +121,7 @@ void GLStrokeRenderer::RenderStrokeRep(StrokeRep *iStrokeRep) const
for(Strip::vertex_container::iterator v=vertices.begin(), vend=vertices.end();
v!=vend;
++v){
+
StrokeVertexRep * svRep = (*v);
Vec3r color = svRep->color();
real alpha = svRep->alpha();
diff --git a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
new file mode 100644
index 00000000000..59f54ce3881
--- /dev/null
+++ b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp
@@ -0,0 +1,270 @@
+# include "BlenderStrokeRenderer.h"
+# include "Canvas.h"
+# include "../app_blender/AppConfig.h"
+
+# include "../rendering/GLStrokeRenderer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_camera_types.h"
+#include "DNA_customdata_types.h"
+#include "DNA_listBase.h"
+#include "DNA_mesh_types.h"
+#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 */
+#include "BKE_material.h"
+#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"
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+
+BlenderStrokeRenderer::BlenderStrokeRenderer()
+:StrokeRenderer(){
+
+ // TEMPORARY - need a texture manager
+ _textureManager = new GLTextureManager;
+ _textureManager->load();
+
+ // Scene.New("FreestyleStrokes")
+ old_scene = G.scene;
+
+ ListBase lb;
+ scene = add_scene("freestyle_strokes_scene ");
+ lb = scene->r.layers;
+ scene->r= old_scene->r;
+ scene->r.layers= lb;
+ set_scene( scene ); // scene.makeCurrent()
+
+ // image dimensions
+ float width = scene->r.xsch;
+ float height = scene->r.ysch;
+
+ // Camera
+ object_camera = add_object(OB_CAMERA);
+
+ Camera* camera = (Camera *) object_camera->data;
+ camera->type = CAM_ORTHO;
+ camera->ortho_scale = max(width,height);
+
+ object_camera->loc[0] = 0.5 * width;
+ object_camera->loc[1] = 0.5 * height;
+ object_camera->loc[2] = 1.0;
+
+ scene->camera = object_camera;
+
+ // Material
+ material = add_material("stroke_material");
+ material->mode |= MA_VERTEXCOLP;
+ material->mode |= MA_SHLESS;
+}
+
+BlenderStrokeRenderer::~BlenderStrokeRenderer(){
+
+ if(0 != _textureManager)
+ {
+ delete _textureManager;
+ _textureManager = 0;
+ }
+
+ // DEALLOCATE STRUCTURE
+
+ // Scene* scene;
+ // Object* object_camera;
+ // Material* material;
+
+ // Scene* old_scene;
+
+}
+
+void BlenderStrokeRenderer::RenderStrokeRep(StrokeRep *iStrokeRep) const{
+ RenderStrokeRepBasic(iStrokeRep);
+}
+
+void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{
+
+ ////////////////////
+ // Build up scene
+ ////////////////////
+
+ vector<Strip*>& strips = iStrokeRep->getStrips();
+ Strip::vertex_container::iterator v[3];
+ StrokeVertexRep *svRep[3];
+ Vec3r color[3];
+ unsigned int face_index;
+
+ for(vector<Strip*>::iterator s=strips.begin(), send=strips.end();
+ s!=send;
+ ++s){
+
+ // me = Mesh.New()
+ Object* object_mesh = add_object(OB_MESH);
+ Mesh* mesh = (Mesh *) object_mesh->data;
+ MEM_freeN(mesh->bb);
+ mesh->bb= NULL;
+ mesh->id.us = 0;
+
+ // me.materials = [mat]
+ mesh->mat = ( Material ** ) MEM_mallocN( 1 * sizeof( Material * ), "MaterialList" );
+ mesh->mat[0] = material;
+ mesh->totcol = 1;
+ test_object_materials( (ID*) mesh );
+
+ int strip_vertex_count = (*s)->sizeStrip();
+
+ // vertices allocation
+ mesh->totvert = strip_vertex_count;
+ mesh->mvert = (MVert*) CustomData_add_layer( &mesh->vdata, CD_MVERT, CD_CALLOC, NULL, mesh->totvert);
+
+ // faces allocation
+ mesh->totface = strip_vertex_count - 2;
+ mesh->mface = (MFace*) CustomData_add_layer( &mesh->fdata, CD_MFACE, CD_CALLOC, NULL, mesh->totface);
+
+ // colors allocation - me.vertexColors = True
+ mesh->mcol = (MCol *) CustomData_add_layer( &mesh->fdata, CD_MCOL, CD_CALLOC, NULL, mesh->totface );
+
+ ////////////////////
+ // Data copy
+ ////////////////////
+
+ MVert* vertices = mesh->mvert;
+ MFace* faces = mesh->mface;
+ MCol* colors = mesh->mcol;
+
+ Strip::vertex_container& strip_vertices = (*s)->vertices();
+ v[0] = strip_vertices.begin();
+ v[1] = v[0]; ++(v[1]);
+ v[2] = v[1]; ++(v[2]);
+
+ // first vertex
+ svRep[0] = *(v[0]);
+ vertices->co[0] = svRep[0]->point2d()[0];
+ vertices->co[1] = svRep[0]->point2d()[1];
+ vertices->co[2] = 0.0;
+ ++vertices;
+
+ // second vertex
+ svRep[1] = *(v[1]);
+ vertices->co[0] = svRep[1]->point2d()[0];
+ vertices->co[1] = svRep[1]->point2d()[1];
+ vertices->co[2] = 0.0;
+ ++vertices;
+
+ // iterating over subsequent vertices: each vertex adds a new face
+ face_index = 0;
+
+ while( v[2] != strip_vertices.end() )
+ {
+ // INPUT
+ svRep[0] = *(v[0]);
+ svRep[1] = *(v[1]);
+ svRep[2] = *(v[2]);
+
+ color[0] = svRep[0]->color();
+ color[1] = svRep[1]->color();
+ color[2] = svRep[2]->color();
+
+ // vertex
+ vertices->co[0] = svRep[2]->point2d()[0];
+ vertices->co[1] = svRep[2]->point2d()[1];
+ vertices->co[2] = 0.0;
+
+ // faces
+ faces->v1 = face_index;
+ faces->v2 = face_index + 1;
+ faces->v3 = face_index + 2;
+ faces->v4 = 0;
+
+ // colors
+ // red and blue are swapped - cf DNA_meshdata_types.h : MCol
+ colors->r = (short)(255.0f*(color[0])[2]);
+ colors->g = (short)(255.0f*(color[0])[1]);
+ colors->b = (short)(255.0f*(color[0])[0]);
+ colors->a = (short)(255.0f*svRep[0]->alpha());
+ ++colors;
+
+ colors->r = (short)(255.0f*(color[1])[2]);
+ colors->g = (short)(255.0f*(color[1])[1]);
+ colors->b = (short)(255.0f*(color[1])[0]);
+ colors->a = (short)(255.0f*svRep[1]->alpha());
+ ++colors;
+
+ colors->r = (short)(255.0f*(color[2])[2]);
+ colors->g = (short)(255.0f*(color[2])[1]);
+ colors->b = (short)(255.0f*(color[2])[0]);
+ colors->a = (short)(255.0f*svRep[2]->alpha());
+ ++colors;
+
+ // ITERATION
+ ++v[0]; ++v[1]; ++v[2];
+ ++faces; ++vertices; ++colors;
+ ++face_index;
+
+ } // loop over strip vertices
+
+ } // loop over strips
+
+}
+
+void BlenderStrokeRenderer::RenderScene( Render *re ) {
+ scene->r.mode &= ~( R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR );
+ scene->r.planes = R_PLANES32;
+ scene->r.imtype = R_PNG;
+
+ re->freestyle_render = RE_NewRender(scene->id.name);
+ RE_BlenderFrame( re->freestyle_render, scene, 1);
+
+ // char filepath[255];
+ // BLI_strncpy( filepath, "/Users/mx/Desktop/", sizeof(filepath) );
+ // strcat(filepath, "frs_result");
+ // BIF_save_rendered_image(filepath);
+}
+
+void BlenderStrokeRenderer::Close() {
+
+ Scene *sce;
+ bScreen *sc;
+
+ // from header_info.c
+ /* check all sets */
+ for( sce= (Scene*) G.main->scene.first; sce; sce= (Scene*)sce->id.next) {
+ if(sce->set == scene) sce->set= 0;
+ }
+
+ /* check all sequences */
+ clear_scene_in_allseqs(scene);
+
+ /* check render layer nodes in other scenes */
+ clear_scene_in_nodes(scene);
+
+ for (sc= (bScreen*)G.main->screen.first; sc; sc= (bScreen*)sc->id.next ) {
+ if(sc->scene == scene) sc->scene= G.scene;
+ }
+
+ free_libblock( &G.main->scene, scene );
+ set_scene( old_scene );
+ countall();
+}
+
diff --git a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h
new file mode 100644
index 00000000000..9f7d2d4cd19
--- /dev/null
+++ b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.h
@@ -0,0 +1,46 @@
+#ifndef BLENDERSTROKERENDERER_H
+# define BLENDERSTROKERENDERER_H
+
+# include "../system/FreestyleConfig.h"
+# include "StrokeRenderer.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "render_types.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+class LIB_STROKE_EXPORT BlenderStrokeRenderer : public StrokeRenderer
+{
+public:
+ BlenderStrokeRenderer();
+ virtual ~BlenderStrokeRenderer();
+
+ /*! Renders a stroke rep */
+ virtual void RenderStrokeRep(StrokeRep *iStrokeRep) const;
+ virtual void RenderStrokeRepBasic(StrokeRep *iStrokeRep) const;
+
+ void RenderScene(Render *re);
+ void Close();
+
+protected:
+ Scene* scene;
+ Scene* old_scene;
+
+ Object* object_camera;
+ Material* material;
+
+};
+
+#endif // BLENDERSTROKERENDERER_H
+
diff --git a/source/blender/freestyle/intern/stroke/Canvas.cpp b/source/blender/freestyle/intern/stroke/Canvas.cpp
index acfbdc1fc26..84411c20970 100755
--- a/source/blender/freestyle/intern/stroke/Canvas.cpp
+++ b/source/blender/freestyle/intern/stroke/Canvas.cpp
@@ -108,31 +108,12 @@ void Canvas::Draw()
for(unsigned i = 0; i < _StyleModules.size(); i++) {
_current_sm = _StyleModules[i];
- if (!_StyleModules[i]->getModified())
- {
-
- if (_StyleModules[i]->getDrawable() && _Layers[i]) {
- if (_basic)
- _Layers[i]->RenderBasic(_Renderer);
- else
- _Layers[i]->Render(_Renderer);
- }
- continue;
-
- }
if (i < _Layers.size() && _Layers[i])
delete _Layers[i];
_Layers[i] = _StyleModules[i]->execute();
- if (_StyleModules[i]->getDrawable() && _Layers[i]) {
- if (_basic)
- _Layers[i]->RenderBasic(_Renderer);
- else
- _Layers[i]->Render(_Renderer);
- }
-
timestamp->increment();
}
postDraw();
diff --git a/source/blender/freestyle/intern/stroke/Operators.cpp b/source/blender/freestyle/intern/stroke/Operators.cpp
index ebc3aa3174c..391b21a9555 100755
--- a/source/blender/freestyle/intern/stroke/Operators.cpp
+++ b/source/blender/freestyle/intern/stroke/Operators.cpp
@@ -834,7 +834,7 @@ void Operators::create(UnaryPredicate1D& pred, vector<StrokeShader*> shaders) {
Stroke* stroke = createStroke(**it);
if (stroke) {
applyShading(*stroke, shaders);
- canvas->RenderStroke(stroke);
+ //canvas->RenderStroke(stroke);
_current_strokes_set.push_back(stroke);
}
}
diff --git a/source/blender/freestyle/intern/system/PythonInterpreter.h b/source/blender/freestyle/intern/system/PythonInterpreter.h
index e042eaa2f44..64b5c5488d0 100755
--- a/source/blender/freestyle/intern/system/PythonInterpreter.h
+++ b/source/blender/freestyle/intern/system/PythonInterpreter.h
@@ -108,7 +108,7 @@ private:
vector<string> pathnames;
StringUtils::getPathName(_path, "", pathnames);
- struct Text *text = add_empty_text("tmp_initpath.txt");
+ struct Text *text = add_empty_text("tmp_freestyle_initpath.txt");
string cmd = "import sys\n";
txt_insert_buf(text, const_cast<char*>(cmd.c_str()));
diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h
index 395372d894a..266340c9101 100644
--- a/source/blender/makesdna/DNA_scene_types.h
+++ b/source/blender/makesdna/DNA_scene_types.h
@@ -625,7 +625,6 @@ typedef struct Scene {
/* yafray: renderer flag (not only exclusive to yafray) */
#define R_INTERN 0
#define R_YAFRAY 1
-#define R_FREESTYLE 2
/* scemode (int now) */
#define R_DOSEQ 0x0001
diff --git a/source/blender/python/api2_2x/sceneRender.c b/source/blender/python/api2_2x/sceneRender.c
index 8f28557c449..47d55bcd85d 100644
--- a/source/blender/python/api2_2x/sceneRender.c
+++ b/source/blender/python/api2_2x/sceneRender.c
@@ -994,8 +994,6 @@ static int RenderData_setRenderer( BPy_RenderData * self, PyObject * value )
self->renderContext->renderer = R_INTERN;
else if( type == R_YAFRAY )
self->renderContext->renderer = R_YAFRAY;
- else if( type == R_FREESTYLE )
- self->renderContext->renderer = R_FREESTYLE;
else
return EXPP_ReturnIntError( PyExc_ValueError,
"expected constant INTERNAL or YAFRAY" );
@@ -3873,7 +3871,6 @@ PyObject *Render_Init( void )
PyModule_AddIntConstant( submodule, "INTERNAL", R_INTERN );
PyModule_AddIntConstant( submodule, "YAFRAY", R_YAFRAY );
- PyModule_AddIntConstant( submodule, "FREESTYLE", R_FREESTYLE );
PyModule_AddIntConstant( submodule, "AVIRAW", R_AVIRAW );
PyModule_AddIntConstant( submodule, "AVIJPEG", R_AVIJPEG );
PyModule_AddIntConstant( submodule, "AVICODEC", R_AVICODEC );
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 1768b052b54..5ea1a8ee98c 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -198,6 +198,9 @@ struct Render
ListBase *sss_points;
struct Material *sss_mat;
+ /* Freestyle */
+ struct Render* freestyle_render;
+
ListBase customdata_names;
struct Object *excludeob;
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 1a387ad7466..9bf74d4d012 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -4427,6 +4427,8 @@ void RE_Database_Free(Render *re)
free_occ(re);
free_strand_surface(re);
+ if( re->freestyle_render ) RE_FreeRender(re->freestyle_render);
+
re->totvlak=re->totvert=re->totstrand=re->totlamp=re->tothalo= 0;
re->i.convertdone= 0;
@@ -4874,6 +4876,13 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view)
if((re->r.mode & R_SSS) && !re->test_break())
if(re->r.renderer==R_INTERN)
make_sss_tree(re);
+
+ /* Freestyle */
+ if((re->r.mode & R_EDGE_FRS ) && !re->test_break())
+ if(re->r.renderer==R_INTERN) {
+ FRS_prepare(re);
+ FRS_render_Blender(re);
+ }
}
if(re->test_break())
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index ebaef19062e..673bea87d6c 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1630,18 +1630,12 @@ static void do_render_3d(Render *re)
else
RE_Database_FromScene(re, re->scene, 1);
- /* Freestyle */
- if( re->r.mode & R_EDGE_FRS ) {
- FRS_prepare(re);
- }
-
threaded_tile_processor(re);
/* do left-over 3d post effects (flares) */
if(re->flag & R_HALO)
if(!re->test_break())
add_halo_flare(re);
-
/* free all render verts etc */
RE_Database_Free(re);
@@ -2198,36 +2192,6 @@ static void do_render_composite_fields_blur_3d(Render *re)
re->display_draw(re->result, NULL);
}
-static void freestyleRender(Render *re)
-{
- // init render result
- RE_FreeRenderResult(re->result);
- re->result = new_render_result(re, &re->disprect, 0, RR_USEMEM);
-
- // set camera
- RE_SetCamera(re, re->scene->camera);
-
- // set up render database
- if(render_scene_needs_vector(re))
- RE_Database_FromScene_Vectors(re, re->scene);
- else
- RE_Database_FromScene(re, re->scene, 1);
-
- // used to reobtain ogl context after RE_Database_FromScene call
- re->display_clear(re->result);
-
- // Freestyle initialization
- FRS_prepare(re);
-
- // run Freestyle
- re->i.starttime = PIL_check_seconds_timer();
- FRS_render_GL(re);
- re->i.lastframetime = PIL_check_seconds_timer()- re->i.starttime;
- re->stats_draw(&re->i);
-
- RE_Database_Free(re);
-}
-
#ifndef DISABLE_YAFRAY
/* yafray: main yafray render/export call */
static void yafrayRender(Render *re)
@@ -2269,7 +2233,7 @@ static void yafrayRender(Render *re)
re->rectx= re->winx;
re->recty= re->winy;
- rres= new_render_result(re, &re->disprect, 0, RR_USEMEM);
+ rres = new_render_result(re, &re->disprect, 0, RR_USEMEM);
merge_render_result(rres, re->result);
RE_FreeRenderResult(re->result);
@@ -2322,15 +2286,10 @@ static void do_render_all_options(Render *re)
#ifndef DISABLE_YAFRAY
if(re->r.renderer==R_YAFRAY)
yafrayRender(re);
- else if(re->r.renderer==R_FREESTYLE)
- freestyleRender(re);
else
do_render_composite_fields_blur_3d(re);
#else
- if(re->r.renderer==R_FREESTYLE)
- freestyleRender(re);
- else
- do_render_composite_fields_blur_3d(re);
+ do_render_composite_fields_blur_3d(re);
#endif
}
@@ -2449,7 +2408,7 @@ static int is_rendering_allowed(Render *re)
}
/* renderer */
- if(!ELEM3(re->r.renderer, R_INTERN, R_YAFRAY, R_FREESTYLE)) {
+ if(!ELEM(re->r.renderer, R_INTERN, R_YAFRAY)) {
re->error("Unknown render engine set");
return 0;
}
diff --git a/source/blender/render/intern/source/rendercore.c b/source/blender/render/intern/source/rendercore.c
index 1eb42bca569..7b810c142d6 100644
--- a/source/blender/render/intern/source/rendercore.c
+++ b/source/blender/render/intern/source/rendercore.c
@@ -901,6 +901,30 @@ static void addps(ListBase *lb, intptr_t *rd, int obi, int facenr, int z, int ma
ps->shadfac= 0;
}
+
+
+static void freestyle_enhance_add(RenderPart *pa, float *rectf)
+{
+ int x, y;
+ float* freestyle;
+
+ RenderLayer* rl= render_get_active_layer( R.freestyle_render, R.freestyle_render->result );
+ if( rl->rectf == NULL)
+ return;
+
+
+ for( x = pa->disprect.xmin + pa->crop; x < pa->disprect.xmax - pa->crop; x++) {
+ for( y = pa->disprect.ymin + pa->crop; y < pa->disprect.ymax - pa->crop; y++) {
+
+ freestyle = rl->rectf + 4 * (R.recty * x + y);
+ if( freestyle[3] > 0.0)
+ addAlphaOverFloat(rectf, freestyle);
+ rectf += 4;
+
+ }
+ }
+}
+
static void edge_enhance_add(RenderPart *pa, float *rectf, float *arect)
{
float addcol[4];
@@ -1219,6 +1243,10 @@ void zbufshadeDA_tile(RenderPart *pa)
if(R.r.mode & R_EDGE)
edge_enhance_add(pa, rl->rectf, edgerect);
+ if(rl->layflag & SCE_LAY_FRS)
+ if(R.r.mode & R_EDGE_FRS)
+ freestyle_enhance_add(pa, rl->rectf);
+
if(rl->passflag & SCE_PASS_VECTOR)
reset_sky_speed(pa, rl);
@@ -1383,6 +1411,10 @@ void zbufshade_tile(RenderPart *pa)
edge_enhance_add(pa, rl->rectf, edgerect);
}
+ if(rl->layflag & SCE_LAY_FRS)
+ if(R.r.mode & R_EDGE_FRS)
+ freestyle_enhance_add(pa, rl->rectf);
+
if(rl->passflag & SCE_PASS_VECTOR)
reset_sky_speed(pa, rl);
diff --git a/source/blender/src/buttons_scene.c b/source/blender/src/buttons_scene.c
index e69095ee5ca..c7eba65d5fe 100644
--- a/source/blender/src/buttons_scene.c
+++ b/source/blender/src/buttons_scene.c
@@ -2175,7 +2175,7 @@ static void render_panel_output(void)
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, 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");
+ uiDefButBitI(block, TOG, R_EDGE_FRS, B_SWITCHRENDER,"Freestyle", 250, 89, 60, 20, &G.scene->r.mode, 0, 0, 0, 0, "Enable Freestyle");
uiBlockEndAlign(block);
uiBlockBeginAlign(block);
@@ -2276,10 +2276,10 @@ static void render_panel_render(void)
uiDefBut(block, BUT,B_DORENDER,"RENDER", 369, 164, 191,37, 0, 0, 0, 0, 0, "Render the current frame (F12)");
#ifndef DISABLE_YAFRAY
/* yafray: on request, render engine menu is back again, and moved to Render panel */
- uiDefButS(block, MENU, B_SWITCHRENDER, "Rendering Engine %t|Blender Internal %x0|YafRay %x1|Freestyle %x2",
+ uiDefButS(block, MENU, B_SWITCHRENDER, "Rendering Engine %t|Blender Internal %x0|YafRay %x1",
369, 142, 191, 20, &G.scene->r.renderer, 0, 0, 0, 0, "Choose rendering engine");
#else
- uiDefButS(block, MENU, B_SWITCHRENDER, "Rendering Engine %t|Blender Internal %x0|Freestyle %x1",
+ uiDefButS(block, MENU, B_SWITCHRENDER, "Rendering Engine %t|Blender Internal %x0",
369, 142, 191, 20, &G.scene->r.renderer, 0, 0, 0, 0, "Choose rendering engine");
#endif /* disable yafray */
@@ -3316,8 +3316,6 @@ static void render_panel_freestyle()
uiDefButBitI(block, TOG, FREESTYLE_SUGGESTIVE_CONTOURS_FLAG, B_NOP, "Suggestive Contours", 10, 130, 150, 20, &freestyle_flags, 0, 0, 0, 0, "Compute suggestive contours");
uiDefButF(block, NUM, B_NOP, "kr Derivative Epsilon", 10,110,300,20, &freestyle_dkr_epsilon, 0.0f, 10.0f, 0.1, 3, "Suggestive contour kr derivative epsilon");
uiBlockEndAlign(block);
-
-
}
static void layer_copy_func(void *lay_v, void *lay_p)
@@ -3538,10 +3536,8 @@ void render_panels()
}
#endif
- if (G.scene->r.renderer==R_FREESTYLE) {
+ if( G.scene->r.mode & R_EDGE_FRS )
render_panel_freestyle();
- }
-
}