diff options
Diffstat (limited to 'source/blender')
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(); - } - } |