Better handling of the ESC key during Freestyle rendering.

This commit is meant to improve the response of the ESC key for stopping Freestyle rendering
throughout the rendering process.  The rendering with Freestyle consists of several steps
including: (1) mesh data loading, (2) winged edge construction, (3) silhouette edge detection,
(4) view map construction, and (5) stroke drawing.  All these steps have been extended to
frequently check if the ESC key is pressed, so that users can abort time-consuming rendering
at any point of time.
This commit is contained in:
Tamito Kajiyama 2012-07-16 23:29:12 +00:00
parent 9d2a957a0d
commit 5a581c1fd1
13 changed files with 142 additions and 6 deletions

@ -93,6 +93,7 @@ Controller::Controller()
_winged_edge = NULL; _winged_edge = NULL;
_pView = NULL; _pView = NULL;
_pRenderMonitor = NULL;
_edgeTesselationNature = (Nature::SILHOUETTE | Nature::BORDER | Nature::CREASE); _edgeTesselationNature = (Nature::SILHOUETTE | Nature::BORDER | Nature::CREASE);
@ -181,6 +182,11 @@ void Controller::setView(AppView *iView)
_Canvas->setViewer(_pView); _Canvas->setViewer(_pView);
} }
void Controller::setRenderMonitor(RenderMonitor *iRenderMonitor)
{
_pRenderMonitor = iRenderMonitor;
}
void Controller::setPassDiffuse(float *buf, int width, int height) void Controller::setPassDiffuse(float *buf, int width, int height)
{ {
AppCanvas *app_canvas = dynamic_cast<AppCanvas *>(_Canvas); AppCanvas *app_canvas = dynamic_cast<AppCanvas *>(_Canvas);
@ -207,6 +213,8 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer* srl)
BlenderFileLoader loader(re, srl); BlenderFileLoader loader(re, srl);
loader.setRenderMonitor(_pRenderMonitor);
_Chrono.start(); _Chrono.start();
NodeGroup *blenderScene = loader.Load(); NodeGroup *blenderScene = loader.Load();
@ -242,11 +250,15 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer* srl)
_pView->setModel(_RootNode); _pView->setModel(_RootNode);
//_pView->FitBBox(); //_pView->FitBBox();
if (_pRenderMonitor->testBreak())
return 0;
_Chrono.start(); _Chrono.start();
WXEdgeBuilder wx_builder; WXEdgeBuilder wx_builder;
wx_builder.setRenderMonitor(_pRenderMonitor);
blenderScene->accept(wx_builder); blenderScene->accept(wx_builder);
_winged_edge = wx_builder.getWingedEdge(); _winged_edge = wx_builder.getWingedEdge();
@ -465,11 +477,15 @@ void Controller::ComputeViewMap()
edgeDetector.setCreaseAngle(_creaseAngle); edgeDetector.setCreaseAngle(_creaseAngle);
edgeDetector.setSphereRadius(_sphereRadius); edgeDetector.setSphereRadius(_sphereRadius);
edgeDetector.setSuggestiveContourKrDerivativeEpsilon(_suggestiveContourKrDerivativeEpsilon); edgeDetector.setSuggestiveContourKrDerivativeEpsilon(_suggestiveContourKrDerivativeEpsilon);
edgeDetector.setRenderMonitor(_pRenderMonitor);
edgeDetector.processShapes(*_winged_edge); edgeDetector.processShapes(*_winged_edge);
real duration = _Chrono.stop(); real duration = _Chrono.stop();
printf("Feature lines : %lf\n", duration); printf("Feature lines : %lf\n", duration);
if (_pRenderMonitor->testBreak())
return;
// Builds the view map structure from the flagged WSEdge structure: // Builds the view map structure from the flagged WSEdge structure:
//---------------------------------------------------------- //----------------------------------------------------------
ViewMapBuilder vmBuilder; ViewMapBuilder vmBuilder;
@ -478,6 +494,7 @@ void Controller::ComputeViewMap()
vmBuilder.setTransform( mv, proj,viewport, _pView->GetFocalLength(), _pView->GetAspect(), _pView->GetFovyRadian()); vmBuilder.setTransform( mv, proj,viewport, _pView->GetFocalLength(), _pView->GetAspect(), _pView->GetFovyRadian());
vmBuilder.setFrustum(_pView->znear(), _pView->zfar()); vmBuilder.setFrustum(_pView->znear(), _pView->zfar());
vmBuilder.setGrid(&_Grid); vmBuilder.setGrid(&_Grid);
vmBuilder.setRenderMonitor(_pRenderMonitor);
// Builds a tesselated form of the silhouette for display purpose: // Builds a tesselated form of the silhouette for display purpose:
//--------------------------------------------------------------- //---------------------------------------------------------------

@ -38,6 +38,7 @@
# include "../system/ProgressBar.h" # include "../system/ProgressBar.h"
# include "../system/Precision.h" # include "../system/Precision.h"
# include "../system/Interpreter.h" # include "../system/Interpreter.h"
# include "../system/RenderMonitor.h"
# include "../view_map/FEdgeXDetector.h" # include "../view_map/FEdgeXDetector.h"
class AppView; class AppView;
@ -69,6 +70,7 @@ public:
~Controller() ; ~Controller() ;
void setView(AppView *iView); void setView(AppView *iView);
void setRenderMonitor(RenderMonitor *iRenderMonitor);
void setPassDiffuse(float *buf, int width, int height); void setPassDiffuse(float *buf, int width, int height);
void setPassZ(float *buf, int width, int height); void setPassZ(float *buf, int width, int height);
void setContext(bContext *C); void setContext(bContext *C);
@ -177,6 +179,8 @@ private:
//Viewer2DWindow *_pView2DWindow; //Viewer2DWindow *_pView2DWindow;
//Viewer2D *_pView2D; //Viewer2D *_pView2D;
RenderMonitor *_pRenderMonitor;
//Model //Model
// Drawing Structure // Drawing Structure
NodeGroup *_RootNode; NodeGroup *_RootNode;

@ -40,6 +40,8 @@ NodeGroup* BlenderFileLoader::Load()
int id = 0; int id = 0;
for(obi= (ObjectInstanceRen *) _re->instancetable.first; obi; obi=obi->next) { for(obi= (ObjectInstanceRen *) _re->instancetable.first; obi; obi=obi->next) {
if (_pRenderMonitor && _pRenderMonitor->testBreak())
break;
if (!(obi->lay & _srl->lay)) if (!(obi->lay & _srl->lay))
continue; continue;
char *name = obi->ob->id.name; char *name = obi->ob->id.name;

@ -5,6 +5,7 @@
# include <float.h> # include <float.h>
# include "../system/FreestyleConfig.h" # include "../system/FreestyleConfig.h"
# include "../system/RenderMonitor.h"
# include "../scene_graph/NodeGroup.h" # include "../scene_graph/NodeGroup.h"
# include "../scene_graph/NodeTransform.h" # include "../scene_graph/NodeTransform.h"
# include "../scene_graph/NodeShape.h" # include "../scene_graph/NodeShape.h"
@ -64,6 +65,9 @@ public:
/*! Gets the smallest edge size read */ /*! Gets the smallest edge size read */
inline real minEdgeSize() {return _minEdgeSize;} inline real minEdgeSize() {return _minEdgeSize;}
/*! Modifiers */
inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {_pRenderMonitor = iRenderMonitor;}
protected: protected:
void insertShapeNode(ObjectInstanceRen *obi, int id); void insertShapeNode(ObjectInstanceRen *obi, int id);
int testDegenerateTriangle(float v1[3], float v2[3], float v3[3]); int testDegenerateTriangle(float v1[3], float v2[3], float v3[3]);
@ -93,6 +97,8 @@ protected:
float _viewplane_bottom; float _viewplane_bottom;
float _viewplane_top; float _viewplane_top;
float _z_near, _z_far; float _z_near, _z_far;
RenderMonitor *_pRenderMonitor;
}; };
#endif // BLENDER_FILE_LOADER_H #endif // BLENDER_FILE_LOADER_H

@ -463,6 +463,9 @@ extern "C" {
Render* freestyle_render = NULL; Render* freestyle_render = NULL;
RenderMonitor monitor(re);
controller->setRenderMonitor(&monitor);
cout << "\n----------------------------------------------------------" << endl; cout << "\n----------------------------------------------------------" << endl;
cout << "| " << (re->scene->id.name+2) << "|" << srl->name << endl; cout << "| " << (re->scene->id.name+2) << "|" << srl->name << endl;
cout << "----------------------------------------------------------" << endl; cout << "----------------------------------------------------------" << endl;
@ -476,6 +479,7 @@ extern "C" {
if( re->test_break(re->tbh) ) { if( re->test_break(re->tbh) ) {
controller->CloseFile(); controller->CloseFile();
cout << "Break" << endl;
return NULL; return NULL;
} }

@ -0,0 +1,47 @@
//
// Copyright (C) : Please refer to the COPYRIGHT file distributed
// with this source distribution.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef RENDERMONITOR_H
#define RENDERMONITOR_H
extern "C" {
#include "render_types.h"
}
class RenderMonitor
{
public:
inline RenderMonitor(Render *re) {
_re = re;
}
virtual ~RenderMonitor() {}
inline bool testBreak() {
return _re && _re->test_break(_re->tbh);
}
protected:
Render *_re;
};
#endif // RENDERMONITOR_H

@ -42,6 +42,8 @@ void FEdgeXDetector::processShapes(WingedEdge& we) {
for(vector<WShape*>::const_iterator it = wshapes.begin(); for(vector<WShape*>::const_iterator it = wshapes.begin();
it != wshapes.end(); it != wshapes.end();
it++){ it++){
if (_pRenderMonitor && _pRenderMonitor->testBreak())
break;
wxs = dynamic_cast<WXShape*>(*it); wxs = dynamic_cast<WXShape*>(*it);
wxs->bbox(Min, Max); wxs->bbox(Min, Max);
_bbox_diagonal = (Max-Min).norm(); _bbox_diagonal = (Max-Min).norm();

@ -38,6 +38,7 @@
# include "../winged_edge/WXEdge.h" # include "../winged_edge/WXEdge.h"
# include "../winged_edge/Curvature.h" # include "../winged_edge/Curvature.h"
# include "../system/ProgressBar.h" # include "../system/ProgressBar.h"
# include "../system/RenderMonitor.h"
using namespace Geometry; using namespace Geometry;
@ -50,6 +51,7 @@ public:
FEdgeXDetector() { FEdgeXDetector() {
_pProgressBar = 0; _pProgressBar = 0;
_pRenderMonitor = 0;
_computeViewIndependant = true; _computeViewIndependant = true;
_bbox_diagonal = 1.0; _bbox_diagonal = 1.0;
_meanEdgeSize = 0; _meanEdgeSize = 0;
@ -165,6 +167,8 @@ public:
inline void setProgressBar(ProgressBar *iProgressBar) {_pProgressBar = iProgressBar;} inline void setProgressBar(ProgressBar *iProgressBar) {_pProgressBar = iProgressBar;}
inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {_pRenderMonitor = iRenderMonitor;}
protected: protected:
Vec3r _Viewpoint; Vec3r _Viewpoint;
@ -193,6 +197,7 @@ protected:
real _kr_derivative_epsilon; real _kr_derivative_epsilon;
ProgressBar *_pProgressBar; ProgressBar *_pProgressBar;
RenderMonitor *_pRenderMonitor;
}; };
#endif // FEDGEDXETECTOR_H #endif // FEDGEDXETECTOR_H

@ -378,7 +378,7 @@ cout << "\t\tIs occluder" << endl;
// a QI of 22 because 3 out of 6 occluders have QI <= 22. // a QI of 22 because 3 out of 6 occluders have QI <= 22.
template <typename G, typename I> template <typename G, typename I>
static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilon) static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilon, RenderMonitor *iRenderMonitor)
{ {
vector<ViewEdge*>& vedges = ioViewMap->ViewEdges(); vector<ViewEdge*>& vedges = ioViewMap->ViewEdges();
@ -391,6 +391,8 @@ static void computeCumulativeVisibility(ViewMap *ioViewMap, G& grid, real epsilo
unsigned maxIndex, maxCard; unsigned maxIndex, maxCard;
unsigned qiMajority; unsigned qiMajority;
for(vector<ViewEdge*>::iterator ve=vedges.begin(), veend=vedges.end(); ve!=veend; ve++) { for(vector<ViewEdge*>::iterator ve=vedges.begin(), veend=vedges.end(); ve!=veend; ve++) {
if (iRenderMonitor && iRenderMonitor->testBreak())
break;
#if logging > 0 #if logging > 0
cout << "Processing ViewEdge " << (*ve)->getId() << endl; cout << "Processing ViewEdge " << (*ve)->getId() << endl;
#endif #endif
@ -538,7 +540,7 @@ cout << "\tConclusion: QI = " << maxIndex << ", " << (*ve)->occluders_size() <<
} }
template <typename G, typename I> template <typename G, typename I>
static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon) static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon, RenderMonitor *iRenderMonitor)
{ {
vector<ViewEdge*>& vedges = ioViewMap->ViewEdges(); vector<ViewEdge*>& vedges = ioViewMap->ViewEdges();
@ -551,6 +553,8 @@ static void computeDetailedVisibility(ViewMap *ioViewMap, G& grid, real epsilon)
unsigned maxIndex, maxCard; unsigned maxIndex, maxCard;
unsigned qiMajority; unsigned qiMajority;
for(vector<ViewEdge*>::iterator ve=vedges.begin(), veend=vedges.end(); ve!=veend; ve++) { for(vector<ViewEdge*>::iterator ve=vedges.begin(), veend=vedges.end(); ve!=veend; ve++) {
if (iRenderMonitor && iRenderMonitor->testBreak())
break;
#if logging > 0 #if logging > 0
cout << "Processing ViewEdge " << (*ve)->getId() << endl; cout << "Processing ViewEdge " << (*ve)->getId() << endl;
#endif #endif
@ -1115,6 +1119,9 @@ void ViewMapBuilder::computeInitialViewEdges(WingedEdge& we)
for (vector<WShape*>::const_iterator it = wshapes.begin(); for (vector<WShape*>::const_iterator it = wshapes.begin();
it != wshapes.end(); it != wshapes.end();
it++) { it++) {
if (_pRenderMonitor && _pRenderMonitor->testBreak())
break;
// create the embedding // create the embedding
psShape = new SShape; psShape = new SShape;
psShape->setId((*it)->GetId()); psShape->setId((*it)->GetId());
@ -1151,6 +1158,8 @@ void ViewMapBuilder::computeCusps(ViewMap *ioViewMap){
for(; for(;
ve!=veend; ve!=veend;
++ve){ ++ve){
if (_pRenderMonitor && _pRenderMonitor->testBreak())
break;
if((!((*ve)->getNature() & Nature::SILHOUETTE)) || (!((*ve)->fedgeA()->isSmooth()))) if((!((*ve)->getNature() & Nature::SILHOUETTE)) || (!((*ve)->fedgeA()->isSmooth())))
continue; continue;
FEdge *fe = (*ve)->fedgeA(); FEdge *fe = (*ve)->fedgeA();
@ -1236,10 +1245,10 @@ void ViewMapBuilder::ComputeCumulativeVisibility(ViewMap *ioViewMap,
if ( _orthographicProjection ) { if ( _orthographicProjection ) {
BoxGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); BoxGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI);
computeCumulativeVisibility<BoxGrid, BoxGrid::Iterator>(ioViewMap, grid, epsilon); computeCumulativeVisibility<BoxGrid, BoxGrid::Iterator>(ioViewMap, grid, epsilon, _pRenderMonitor);
} else { } else {
SphericalGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); SphericalGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI);
computeCumulativeVisibility<SphericalGrid, SphericalGrid::Iterator>(ioViewMap, grid, epsilon); computeCumulativeVisibility<SphericalGrid, SphericalGrid::Iterator>(ioViewMap, grid, epsilon, _pRenderMonitor);
} }
} }
@ -1265,10 +1274,10 @@ void ViewMapBuilder::ComputeDetailedVisibility(ViewMap *ioViewMap,
if ( _orthographicProjection ) { if ( _orthographicProjection ) {
BoxGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); BoxGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI);
computeDetailedVisibility<BoxGrid, BoxGrid::Iterator>(ioViewMap, grid, epsilon); computeDetailedVisibility<BoxGrid, BoxGrid::Iterator>(ioViewMap, grid, epsilon, _pRenderMonitor);
} else { } else {
SphericalGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI); SphericalGrid grid(*source, *density, ioViewMap, _viewpoint, _EnableQI);
computeDetailedVisibility<SphericalGrid, SphericalGrid::Iterator>(ioViewMap, grid, epsilon); computeDetailedVisibility<SphericalGrid, SphericalGrid::Iterator>(ioViewMap, grid, epsilon, _pRenderMonitor);
} }
} }
@ -1378,6 +1387,8 @@ void ViewMapBuilder::ComputeRayCastingVisibility(ViewMap *ioViewMap, real epsilo
ve!=veend; ve!=veend;
ve++) ve++)
{ {
if (_pRenderMonitor && _pRenderMonitor->testBreak())
break;
#if logging > 0 #if logging > 0
cout << "Processing ViewEdge " << (*ve)->getId() << endl; cout << "Processing ViewEdge " << (*ve)->getId() << endl;
#endif #endif
@ -1525,6 +1536,9 @@ void ViewMapBuilder::ComputeFastRayCastingVisibility(ViewMap *ioViewMap, real ep
ve!=veend; ve!=veend;
ve++) ve++)
{ {
if (_pRenderMonitor && _pRenderMonitor->testBreak())
break;
festart = (*ve)->fedgeA(); festart = (*ve)->fedgeA();
fe = (*ve)->fedgeA(); fe = (*ve)->fedgeA();
qiMajority = 1; qiMajority = 1;
@ -1653,6 +1667,9 @@ void ViewMapBuilder::ComputeVeryFastRayCastingVisibility(ViewMap *ioViewMap, rea
ve!=veend; ve!=veend;
ve++) ve++)
{ {
if (_pRenderMonitor && _pRenderMonitor->testBreak())
break;
set<ViewShape*> occluders; set<ViewShape*> occluders;
fe = (*ve)->fedgeA(); fe = (*ve)->fedgeA();
@ -2136,6 +2153,9 @@ void ViewMapBuilder::ComputeSweepLineIntersections(ViewMap *ioViewMap, real epsi
sv!=svend; sv!=svend;
sv++) sv++)
{ {
if (_pRenderMonitor && _pRenderMonitor->testBreak())
break;
const vector<FEdge*>& vedges = (*sv)->fedges(); const vector<FEdge*>& vedges = (*sv)->fedges();
for(vector<FEdge*>::const_iterator sve=vedges.begin(), sveend=vedges.end(); for(vector<FEdge*>::const_iterator sve=vedges.begin(), sveend=vedges.end();
@ -2159,6 +2179,19 @@ void ViewMapBuilder::ComputeSweepLineIntersections(ViewMap *ioViewMap, real epsi
vsegments.clear(); vsegments.clear();
} }
if (_pRenderMonitor && _pRenderMonitor->testBreak()) {
// delete segments
if(!segments.empty()){
vector<segment* >::iterator s, send;
for(s=segments.begin(),send=segments.end();
s!=send;
s++){
delete *s;
}
}
return;
}
// reset userdata: // reset userdata:
for(fe=ioEdges.begin(), fend=ioEdges.end(); for(fe=ioEdges.begin(), fend=ioEdges.end();
fe!=fend; fe!=fend;

@ -40,6 +40,7 @@
# include "../geometry/GeomUtils.h" # include "../geometry/GeomUtils.h"
# include "../geometry/Grid.h" # include "../geometry/Grid.h"
# include "../system/ProgressBar.h" # include "../system/ProgressBar.h"
# include "../system/RenderMonitor.h"
# include "../geometry/SweepLine.h" # include "../geometry/SweepLine.h"
# include "ViewMap.h" # include "ViewMap.h"
# include "SilhouetteGeomEngine.h" # include "SilhouetteGeomEngine.h"
@ -58,6 +59,7 @@ private:
ViewMap * _ViewMap; // result ViewMap * _ViewMap; // result
//SilhouetteGeomEngine _GeomEngine; //SilhouetteGeomEngine _GeomEngine;
ProgressBar *_pProgressBar; ProgressBar *_pProgressBar;
RenderMonitor *_pRenderMonitor;
Vec3r _viewpoint; Vec3r _viewpoint;
bool _orthographicProjection; bool _orthographicProjection;
Grid* _Grid; Grid* _Grid;
@ -91,6 +93,7 @@ public:
inline ViewMapBuilder() inline ViewMapBuilder()
{ {
_pProgressBar = 0; _pProgressBar = 0;
_pRenderMonitor = 0;
_Grid = 0; _Grid = 0;
_currentId = 1; _currentId = 1;
_currentFId = 0; _currentFId = 0;
@ -185,6 +188,7 @@ public:
/*! Modifiers */ /*! Modifiers */
inline void setProgressBar(ProgressBar *iProgressBar) {_pProgressBar = iProgressBar;} inline void setProgressBar(ProgressBar *iProgressBar) {_pProgressBar = iProgressBar;}
inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {_pRenderMonitor = iRenderMonitor;}
inline void setEnableQI(bool iBool) {_EnableQI = iBool;} inline void setEnableQI(bool iBool) {_EnableQI = iBool;}
protected: protected:

@ -23,6 +23,8 @@
void WXEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet& ifs) void WXEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet& ifs)
{ {
if (_pRenderMonitor && _pRenderMonitor->testBreak())
return;
WXShape *shape = new WXShape; WXShape *shape = new WXShape;
buildWShape(*shape, ifs); buildWShape(*shape, ifs);
shape->setId(ifs.getId().getFirst()); shape->setId(ifs.getId().getFirst());

@ -26,6 +26,8 @@
using namespace std; using namespace std;
void WingedEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet& ifs) { void WingedEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet& ifs) {
if (_pRenderMonitor && _pRenderMonitor->testBreak())
return;
WShape *shape = new WShape; WShape *shape = new WShape;
buildWShape(*shape, ifs); buildWShape(*shape, ifs);
shape->setId(ifs.getId().getFirst()); shape->setId(ifs.getId().getFirst());

@ -33,6 +33,7 @@
# define WINGED_EDGE_BUILDER_H # define WINGED_EDGE_BUILDER_H
# include "../system/FreestyleConfig.h" # include "../system/FreestyleConfig.h"
# include "../system/RenderMonitor.h"
# include "../scene_graph/SceneVisitor.h" # include "../scene_graph/SceneVisitor.h"
# include "WEdge.h" # include "WEdge.h"
# include "../scene_graph/IndexedFaceSet.h" # include "../scene_graph/IndexedFaceSet.h"
@ -47,6 +48,7 @@ class LIB_WINGED_EDGE_EXPORT WingedEdgeBuilder : public SceneVisitor
_current_frs_material = NULL; _current_frs_material = NULL;
_current_matrix = NULL; _current_matrix = NULL;
_winged_edge = new WingedEdge; // Not deleted by the destructor _winged_edge = new WingedEdge; // Not deleted by the destructor
_pRenderMonitor = NULL;
} }
virtual ~WingedEdgeBuilder() { virtual ~WingedEdgeBuilder() {
@ -101,6 +103,10 @@ class LIB_WINGED_EDGE_EXPORT WingedEdgeBuilder : public SceneVisitor
// _current_matrix = matrix; // _current_matrix = matrix;
// } // }
inline void setRenderMonitor(RenderMonitor *iRenderMonitor) {
_pRenderMonitor = iRenderMonitor;
}
protected: protected:
virtual void buildWShape(WShape& shape, IndexedFaceSet& ifs); virtual void buildWShape(WShape& shape, IndexedFaceSet& ifs);
@ -108,6 +114,8 @@ class LIB_WINGED_EDGE_EXPORT WingedEdgeBuilder : public SceneVisitor
const real *vertices, const real *vertices,
unsigned vsize); unsigned vsize);
RenderMonitor *_pRenderMonitor;
private: private:
void buildTriangleStrip(const real *vertices, void buildTriangleStrip(const real *vertices,