Fix for [#36374] Read unitialized memory in Freestyle.

A variable keeping a bounding box was referenced after it was flagged as empty.
This commit is contained in:
2013-08-24 11:42:00 +00:00
parent af1c274be7
commit 248e3d74a0
3 changed files with 10 additions and 2 deletions

View File

@@ -290,6 +290,8 @@ int Controller::LoadMesh(Render *re, SceneRenderLayer *srl)
_ListOfModels.push_back("Blender_models"); _ListOfModels.push_back("Blender_models");
_Scene3dBBox = _RootNode->bbox();
_bboxDiag = (_RootNode->bbox().getMax() - _RootNode->bbox().getMin()).norm(); _bboxDiag = (_RootNode->bbox().getMax() - _RootNode->bbox().getMin()).norm();
if (G.debug & G_DEBUG_FREESTYLE) { if (G.debug & G_DEBUG_FREESTYLE) {
cout << "Triangles nb : " << _SceneNumFaces << endl; cout << "Triangles nb : " << _SceneNumFaces << endl;
@@ -339,6 +341,7 @@ void Controller::DeleteWingedEdge()
// clears the grid // clears the grid
_Grid.clear(); _Grid.clear();
_Scene3dBBox.clear();
_SceneNumFaces = 0; _SceneNumFaces = 0;
_minEdgeSize = DBL_MAX; _minEdgeSize = DBL_MAX;
} }
@@ -540,8 +543,8 @@ void Controller::ComputeViewMap()
} }
_Chrono.start(); _Chrono.start();
// Build View Map // Build View Map
_ViewMap = vmBuilder.BuildViewMap(*_winged_edge, _VisibilityAlgo, _EPSILON, _RootNode->bbox(), _SceneNumFaces); _ViewMap = vmBuilder.BuildViewMap(*_winged_edge, _VisibilityAlgo, _EPSILON, _Scene3dBBox, _SceneNumFaces);
_ViewMap->setScene3dBBox(_RootNode->bbox()); _ViewMap->setScene3dBBox(_Scene3dBBox);
if (G.debug & G_DEBUG_FREESTYLE) { if (G.debug & G_DEBUG_FREESTYLE) {
printf("ViewMap edge count : %i\n", _ViewMap->viewedges_size()); printf("ViewMap edge count : %i\n", _ViewMap->viewedges_size());

View File

@@ -211,6 +211,7 @@ private:
FastGrid _Grid; FastGrid _Grid;
//HashGrid _Grid; //HashGrid _Grid;
BBox<Vec3r> _Scene3dBBox;
unsigned int _SceneNumFaces; unsigned int _SceneNumFaces;
real _minEdgeSize; real _minEdgeSize;
real _EPSILON; real _EPSILON;

View File

@@ -28,6 +28,8 @@
* \date 22/05/2003 * \date 22/05/2003
*/ */
#include "BLI_utildefines.h"
#ifdef WITH_CXX_GUARDEDALLOC #ifdef WITH_CXX_GUARDEDALLOC
#include "MEM_guardedalloc.h" #include "MEM_guardedalloc.h"
#endif #endif
@@ -95,6 +97,7 @@ public:
inline BBox<Point>& operator=(const BBox<Point>& b) inline BBox<Point>& operator=(const BBox<Point>& b)
{ {
BLI_assert(!b.empty());
_min = b.getMin(); _min = b.getMin();
_max = b.getMax(); _max = b.getMax();
_empty = false; _empty = false;
@@ -103,6 +106,7 @@ public:
inline BBox<Point>& operator+=(const BBox<Point>& b) inline BBox<Point>& operator+=(const BBox<Point>& b)
{ {
BLI_assert(!b.empty());
if (_empty) { if (_empty) {
_min = b.getMin(); _min = b.getMin();
_max = b.getMax(); _max = b.getMax();