Commit ae57c469 authored by Brian Sidebotham's avatar Brian Sidebotham

Move S3D_MESH* to smart pointer to fix CID 108646

parent c519eea1
...@@ -68,13 +68,6 @@ S3D_MESH::S3D_MESH() ...@@ -68,13 +68,6 @@ S3D_MESH::S3D_MESH()
S3D_MESH::~S3D_MESH() S3D_MESH::~S3D_MESH()
{ {
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
if( childs[idx] )
{
delete childs[idx];
}
}
} }
...@@ -82,7 +75,7 @@ CBBOX &S3D_MESH::getBBox( ) ...@@ -82,7 +75,7 @@ CBBOX &S3D_MESH::getBBox( )
{ {
if( !m_BBox.IsInitialized() ) if( !m_BBox.IsInitialized() )
calcBBoxAllChilds(); calcBBoxAllChilds();
return m_BBox; return m_BBox;
} }
...@@ -100,7 +93,7 @@ void S3D_MESH::calcBBoxAllChilds( ) ...@@ -100,7 +93,7 @@ void S3D_MESH::calcBBoxAllChilds( )
// Calc transformation matrix // Calc transformation matrix
glm::mat4 fullTransformMatrix; glm::mat4 fullTransformMatrix;
glm::mat4 translationMatrix = glm::translate( glm::mat4(), m_translation ); glm::mat4 translationMatrix = glm::translate( glm::mat4(), m_translation );
if( m_rotation[3] != 0.0f ) if( m_rotation[3] != 0.0f )
{ {
glm::mat4 rotationMatrix = glm::rotate( translationMatrix, glm::radians( m_rotation[3] ), glm::mat4 rotationMatrix = glm::rotate( translationMatrix, glm::radians( m_rotation[3] ),
...@@ -110,7 +103,7 @@ void S3D_MESH::calcBBoxAllChilds( ) ...@@ -110,7 +103,7 @@ void S3D_MESH::calcBBoxAllChilds( )
else else
fullTransformMatrix = glm::scale( translationMatrix, m_scale ); fullTransformMatrix = glm::scale( translationMatrix, m_scale );
// Apply transformation // Apply transformation
m_BBox.Set( S3D_VERTEX( fullTransformMatrix * glm::vec4( tmpBBox.Min(), 1.0f ) ), m_BBox.Set( S3D_VERTEX( fullTransformMatrix * glm::vec4( tmpBBox.Min(), 1.0f ) ),
S3D_VERTEX( fullTransformMatrix * glm::vec4( tmpBBox.Max(), 1.0f ) ) ); S3D_VERTEX( fullTransformMatrix * glm::vec4( tmpBBox.Max(), 1.0f ) ) );
...@@ -243,7 +236,7 @@ void S3D_MESH::openGL_Render( bool aIsRenderingJustNonTransparentObjects, ...@@ -243,7 +236,7 @@ void S3D_MESH::openGL_Render( bool aIsRenderingJustNonTransparentObjects,
if ( m_MaterialIndex.size() > idx ) if ( m_MaterialIndex.size() > idx )
{ {
bool isTransparent = m_Materials->SetOpenGLMaterial( m_MaterialIndex[idx], useMaterial ); bool isTransparent = m_Materials->SetOpenGLMaterial( m_MaterialIndex[idx], useMaterial );
if( isTransparent && aIsRenderingJustNonTransparentObjects ) if( isTransparent && aIsRenderingJustNonTransparentObjects )
continue; continue;
...@@ -652,7 +645,7 @@ void S3D_MESH::calcPerFaceNormals() ...@@ -652,7 +645,7 @@ void S3D_MESH::calcPerFaceNormals()
l, l,
(unsigned int)m_CoordIndex[idx].size()) ); (unsigned int)m_CoordIndex[idx].size()) );
*/ */
if( ( cross_prod.x > cross_prod.y ) && ( cross_prod.x > cross_prod.z ) ) if( ( cross_prod.x > cross_prod.y ) && ( cross_prod.x > cross_prod.z ) )
{ {
cross_prod.x = 0.0f; cross_prod.x = 0.0f;
...@@ -713,7 +706,7 @@ void S3D_MESH::calcPerPointNormals() ...@@ -713,7 +706,7 @@ void S3D_MESH::calcPerPointNormals()
for( unsigned int each_face_A_idx = 0; each_face_A_idx < m_CoordIndex.size(); each_face_A_idx++ ) for( unsigned int each_face_A_idx = 0; each_face_A_idx < m_CoordIndex.size(); each_face_A_idx++ )
{ {
glm::vec3 initVertexFaceNormal = m_PerFaceNormalsRaw_X_PerFaceSquaredArea[each_face_A_idx]; glm::vec3 initVertexFaceNormal = m_PerFaceNormalsRaw_X_PerFaceSquaredArea[each_face_A_idx];
std::vector< glm::vec3 >& face_A_normals = m_PerFaceVertexNormals[each_face_A_idx]; std::vector< glm::vec3 >& face_A_normals = m_PerFaceVertexNormals[each_face_A_idx];
for( unsigned int each_vert_A_idx = 0; each_vert_A_idx < m_CoordIndex[each_face_A_idx].size(); each_vert_A_idx++ ) for( unsigned int each_vert_A_idx = 0; each_vert_A_idx < m_CoordIndex[each_face_A_idx].size(); each_vert_A_idx++ )
...@@ -722,7 +715,7 @@ void S3D_MESH::calcPerPointNormals() ...@@ -722,7 +715,7 @@ void S3D_MESH::calcPerPointNormals()
} }
} }
#ifdef USE_OPENMP #ifdef USE_OPENMP
#pragma omp parallel for #pragma omp parallel for
#endif /* USE_OPENMP */ #endif /* USE_OPENMP */
...@@ -732,7 +725,7 @@ void S3D_MESH::calcPerPointNormals() ...@@ -732,7 +725,7 @@ void S3D_MESH::calcPerPointNormals()
{ {
// n = face A facet normal // n = face A facet normal
std::vector< glm::vec3 >& face_A_normals = m_PerFaceVertexNormals[each_face_A_idx]; std::vector< glm::vec3 >& face_A_normals = m_PerFaceVertexNormals[each_face_A_idx];
// loop through all vertices // loop through all vertices
// for each vert in face A // for each vert in face A
for( unsigned int each_vert_A_idx = 0; each_vert_A_idx < m_CoordIndex[each_face_A_idx].size(); each_vert_A_idx++ ) for( unsigned int each_vert_A_idx = 0; each_vert_A_idx < m_CoordIndex[each_face_A_idx].size(); each_vert_A_idx++ )
......
...@@ -24,12 +24,14 @@ ...@@ -24,12 +24,14 @@
/** /**
* @file 3d_mesh_model.h * @file 3d_mesh_model.h
* @brief * @brief
*/ */
#ifndef __3D_MESH_MODEL_H__ #ifndef __3D_MESH_MODEL_H__
#define __3D_MESH_MODEL_H__ #define __3D_MESH_MODEL_H__
#include <memory>
#include <boost/shared_ptr.hpp>
#include <vector> #include <vector>
#define GLM_FORCE_RADIANS #define GLM_FORCE_RADIANS
#include <gal/opengl/glm/glm.hpp> #include <gal/opengl/glm/glm.hpp>
...@@ -37,9 +39,14 @@ ...@@ -37,9 +39,14 @@
#include "3d_material.h" #include "3d_material.h"
#include "CBBox.h" #include "CBBox.h"
class S3D_MESH; class S3D_MESH;
/** A smart pointer to an S3D_MESH object */
typedef boost::shared_ptr<S3D_MESH> S3D_MESH_PTR;
/** A container of smar S3D_MESH object pointers */
typedef std::vector<S3D_MESH_PTR> S3D_MESH_PTRS;
class S3D_MESH class S3D_MESH
{ {
public: public:
...@@ -60,7 +67,7 @@ public: ...@@ -60,7 +67,7 @@ public:
std::vector< S3D_VERTEX > m_PerFaceNormalsNormalized; std::vector< S3D_VERTEX > m_PerFaceNormalsNormalized;
std::vector< S3D_VERTEX > m_PerVertexNormalsNormalized; std::vector< S3D_VERTEX > m_PerVertexNormalsNormalized;
std::vector< int > m_MaterialIndex; std::vector< int > m_MaterialIndex;
std::vector< S3D_MESH * > childs; S3D_MESH_PTRS childs;
S3D_VERTEX m_translation; S3D_VERTEX m_translation;
glm::vec4 m_rotation; glm::vec4 m_rotation;
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#define MODELPARSERS_H #define MODELPARSERS_H
#include <map> #include <map>
#include <memory>
#include <vector> #include <vector>
#include <wx/string.h> #include <wx/string.h>
#include <3d_mesh_model.h> #include <3d_mesh_model.h>
...@@ -71,11 +72,11 @@ public: ...@@ -71,11 +72,11 @@ public:
* @param aFilename = the full file name of the file to load * @param aFilename = the full file name of the file to load
* @return true if as succeeded * @return true if as succeeded
*/ */
virtual bool Load( const wxString& aFilename ) { virtual bool Load( const wxString& aFilename ) {
return false; return false;
}; };
std::vector< S3D_MESH* > childs; S3D_MESH_PTRS childs;
private: private:
S3D_MASTER* master; S3D_MASTER* master;
...@@ -127,7 +128,7 @@ public: ...@@ -127,7 +128,7 @@ public:
private: private:
wxString m_Filename; wxString m_Filename;
S3D_MESH* m_model; S3D_MESH_PTR m_model;
std::vector< wxString > vrml_materials; std::vector< wxString > vrml_materials;
std::vector< wxString > vrml_points; std::vector< wxString > vrml_points;
...@@ -143,7 +144,7 @@ private: ...@@ -143,7 +144,7 @@ private:
typedef std::map< std::string, std::vector< glm::vec3 > > VRML2_COORDINATE_MAP; typedef std::map< std::string, std::vector< glm::vec3 > > VRML2_COORDINATE_MAP;
typedef std::map< std::string, S3D_MESH* > VRML2_DEF_GROUP_MAP; typedef std::map< std::string, S3D_MESH_PTR > VRML2_DEF_GROUP_MAP;
/** /**
* class VRML2_MODEL_PARSER * class VRML2_MODEL_PARSER
...@@ -164,7 +165,7 @@ public: ...@@ -164,7 +165,7 @@ public:
* @param aTransformationModel a model with translation, rotation and scale to apply to default root * @param aTransformationModel a model with translation, rotation and scale to apply to default root
* @return bool - true if finnished with success * @return bool - true if finnished with success
*/ */
bool Load( const wxString& aFilename, S3D_MESH *aTransformationModel ); bool Load( const wxString& aFilename, S3D_MESH_PTR aTransformationModel );
/** /**
* Return string representing VRML2 file in vrml2 format * Return string representing VRML2 file in vrml2 format
...@@ -174,7 +175,7 @@ public: ...@@ -174,7 +175,7 @@ public:
wxString VRML2_representation(); wxString VRML2_representation();
private: private:
int loadFileModel( S3D_MESH *transformationModel ); int loadFileModel( S3D_MESH_PTR transformationModel );
int read_Transform(); int read_Transform();
int read_DEF(); int read_DEF();
int read_DEF_Coordinate(); int read_DEF_Coordinate();
...@@ -211,7 +212,7 @@ private: ...@@ -211,7 +212,7 @@ private:
bool m_normalPerVertex; bool m_normalPerVertex;
bool colorPerVertex; bool colorPerVertex;
S3D_MESH* m_model; ///< It stores the current model that the parsing is adding data S3D_MESH_PTR m_model; ///< It stores the current model that the parsing is adding data
FILE* m_file; FILE* m_file;
wxFileName m_Filename; wxFileName m_Filename;
VRML2_COORDINATE_MAP m_defCoordinateMap; VRML2_COORDINATE_MAP m_defCoordinateMap;
...@@ -266,7 +267,7 @@ private: ...@@ -266,7 +267,7 @@ private:
bool m_normalPerVertex; bool m_normalPerVertex;
bool colorPerVertex; bool colorPerVertex;
S3D_MESH* m_model; S3D_MESH_PTR m_model;
FILE* m_file; FILE* m_file;
wxString m_Filename; wxString m_Filename;
S3D_MODEL_PARSER* m_ModelParser; S3D_MODEL_PARSER* m_ModelParser;
......
...@@ -51,7 +51,7 @@ VRML1_MODEL_PARSER::VRML1_MODEL_PARSER( S3D_MODEL_PARSER* aModelParser ) ...@@ -51,7 +51,7 @@ VRML1_MODEL_PARSER::VRML1_MODEL_PARSER( S3D_MODEL_PARSER* aModelParser )
{ {
m_ModelParser = aModelParser; m_ModelParser = aModelParser;
m_Master = m_ModelParser->GetMaster(); m_Master = m_ModelParser->GetMaster();
m_model = NULL; m_model.reset();
m_file = NULL; m_file = NULL;
m_normalPerVertex = true; m_normalPerVertex = true;
colorPerVertex = true; colorPerVertex = true;
...@@ -88,7 +88,7 @@ bool VRML1_MODEL_PARSER::Load( const wxString& aFilename ) ...@@ -88,7 +88,7 @@ bool VRML1_MODEL_PARSER::Load( const wxString& aFilename )
if( strcmp( text, "Separator" ) == 0 ) if( strcmp( text, "Separator" ) == 0 )
{ {
m_model = new S3D_MESH(); m_model.reset( new S3D_MESH() );
m_ModelParser->childs.push_back( m_model ); m_ModelParser->childs.push_back( m_model );
read_separator(); read_separator();
} }
...@@ -122,18 +122,18 @@ int VRML1_MODEL_PARSER::read_separator() ...@@ -122,18 +122,18 @@ int VRML1_MODEL_PARSER::read_separator()
} }
else if( strcmp( text, "Separator" ) == 0 ) else if( strcmp( text, "Separator" ) == 0 )
{ {
S3D_MESH* parent = m_model; S3D_MESH_PTR parent( m_model.get() );
S3D_MESH* new_mesh_model = new S3D_MESH(); S3D_MESH_PTR new_mesh_model( new S3D_MESH() );
m_model->childs.push_back( new_mesh_model ); m_model->childs.push_back( new_mesh_model );
m_model = new_mesh_model; m_model.reset( new_mesh_model.get() );
// recursive // recursive
read_separator(); read_separator();
m_model = parent; m_model.reset( parent.get() );
} }
else if( ( *text != '}' ) ) else if( ( *text != '}' ) )
{ {
......
...@@ -54,7 +54,7 @@ VRML2_MODEL_PARSER::VRML2_MODEL_PARSER( S3D_MODEL_PARSER* aModelParser ) ...@@ -54,7 +54,7 @@ VRML2_MODEL_PARSER::VRML2_MODEL_PARSER( S3D_MODEL_PARSER* aModelParser )
{ {
m_ModelParser = aModelParser; m_ModelParser = aModelParser;
m_Master = m_ModelParser->GetMaster(); m_Master = m_ModelParser->GetMaster();
m_model = NULL; m_model.reset();
m_file = NULL; m_file = NULL;
m_normalPerVertex = true; m_normalPerVertex = true;
colorPerVertex = true; colorPerVertex = true;
...@@ -98,7 +98,7 @@ bool VRML2_MODEL_PARSER::Load( const wxString& aFilename ) ...@@ -98,7 +98,7 @@ bool VRML2_MODEL_PARSER::Load( const wxString& aFilename )
// Switch the locale to standard C (needed to print floating point numbers) // Switch the locale to standard C (needed to print floating point numbers)
LOCALE_IO toggle; LOCALE_IO toggle;
loadFileModel( NULL ); loadFileModel( S3D_MESH_PTR() );
fclose( m_file ); fclose( m_file );
...@@ -107,7 +107,7 @@ bool VRML2_MODEL_PARSER::Load( const wxString& aFilename ) ...@@ -107,7 +107,7 @@ bool VRML2_MODEL_PARSER::Load( const wxString& aFilename )
} }
bool VRML2_MODEL_PARSER::Load( const wxString& aFilename, S3D_MESH *aTransformationModel ) bool VRML2_MODEL_PARSER::Load( const wxString& aFilename, S3D_MESH_PTR aTransformationModel )
{ {
if( aTransformationModel ) if( aTransformationModel )
{ {
...@@ -141,7 +141,7 @@ bool VRML2_MODEL_PARSER::Load( const wxString& aFilename, S3D_MESH *aTransformat ...@@ -141,7 +141,7 @@ bool VRML2_MODEL_PARSER::Load( const wxString& aFilename, S3D_MESH *aTransformat
} }
int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH_PTR aTransformationModel )
{ {
char text[BUFLINE_SIZE]; char text[BUFLINE_SIZE];
...@@ -156,9 +156,9 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) ...@@ -156,9 +156,9 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel )
if( strcmp( text, "Transform" ) == 0 ) if( strcmp( text, "Transform" ) == 0 )
{ {
m_model = new S3D_MESH(); m_model.reset( new S3D_MESH() );
S3D_MESH* save_ptr = m_model; S3D_MESH_PTR save_ptr( m_model );
if( read_Transform() == 0 ) if( read_Transform() == 0 )
{ {
...@@ -167,12 +167,12 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) ...@@ -167,12 +167,12 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel )
if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) && if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) &&
(m_model->childs.size() == 0) ) (m_model->childs.size() == 0) )
{ {
delete m_model; m_model.reset();
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) );
} }
else else
{ {
if( aTransformationModel ) if( aTransformationModel.get() != NULL )
{ {
m_model->m_translation = aTransformationModel->m_translation; m_model->m_translation = aTransformationModel->m_translation;
m_model->m_rotation = aTransformationModel->m_rotation; m_model->m_rotation = aTransformationModel->m_rotation;
...@@ -187,14 +187,14 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) ...@@ -187,14 +187,14 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel )
} }
else else
{ {
delete m_model; m_model.reset();
} }
} }
else if( strcmp( text, "DEF" ) == 0 ) else if( strcmp( text, "DEF" ) == 0 )
{ {
m_model = new S3D_MESH(); m_model.reset( new S3D_MESH() );
S3D_MESH* save_ptr = m_model; S3D_MESH_PTR save_ptr( m_model );
if( read_DEF() == 0 ) if( read_DEF() == 0 )
{ {
...@@ -203,12 +203,12 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) ...@@ -203,12 +203,12 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel )
if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) && if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) &&
(m_model->childs.size() == 0) ) (m_model->childs.size() == 0) )
{ {
delete m_model; m_model.reset();
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) );
} }
else else
{ {
if( aTransformationModel ) if( aTransformationModel.get() != NULL )
{ {
m_model->m_translation = aTransformationModel->m_translation; m_model->m_translation = aTransformationModel->m_translation;
m_model->m_rotation = aTransformationModel->m_rotation; m_model->m_rotation = aTransformationModel->m_rotation;
...@@ -223,14 +223,14 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) ...@@ -223,14 +223,14 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel )
} }
else else
{ {
delete m_model; m_model.reset();
} }
} }
else if( strcmp( text, "Shape" ) == 0 ) else if( strcmp( text, "Shape" ) == 0 )
{ {
m_model = new S3D_MESH(); m_model.reset( new S3D_MESH() );
S3D_MESH* save_ptr = m_model; S3D_MESH_PTR save_ptr = m_model;
if( read_Shape() == 0 ) if( read_Shape() == 0 )
{ {
...@@ -239,12 +239,12 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) ...@@ -239,12 +239,12 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel )
if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) && if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) &&
(m_model->childs.size() == 0) ) (m_model->childs.size() == 0) )
{ {
delete m_model; m_model.reset();
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) );
} }
else else
{ {
if( aTransformationModel ) if( aTransformationModel.get() != NULL )
{ {
m_model->m_translation = aTransformationModel->m_translation; m_model->m_translation = aTransformationModel->m_translation;
m_model->m_rotation = aTransformationModel->m_rotation; m_model->m_rotation = aTransformationModel->m_rotation;
...@@ -261,7 +261,7 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) ...@@ -261,7 +261,7 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel )
} }
else else
{ {
delete m_model; m_model.reset();
} }
} }
} }
...@@ -279,7 +279,7 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) ...@@ -279,7 +279,7 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel )
for( VRML2_DEF_GROUP_MAP::iterator groupIt = m_defGroupMap.begin(); groupIt!=m_defGroupMap.end(); ++groupIt ) for( VRML2_DEF_GROUP_MAP::iterator groupIt = m_defGroupMap.begin(); groupIt!=m_defGroupMap.end(); ++groupIt )
{ {
wxString groupName = groupIt->first; wxString groupName = groupIt->first;
S3D_MESH* ptrModel = groupIt->second; S3D_MESH_PTR ptrModel( groupIt->second );
if( ((ptrModel->m_Point.size() == 0) || (ptrModel->m_CoordIndex.size() == 0)) && if( ((ptrModel->m_Point.size() == 0) || (ptrModel->m_CoordIndex.size() == 0)) &&
...@@ -326,9 +326,9 @@ int VRML2_MODEL_PARSER::read_Transform() ...@@ -326,9 +326,9 @@ int VRML2_MODEL_PARSER::read_Transform()
if( strcmp( text, "Transform" ) == 0 ) if( strcmp( text, "Transform" ) == 0 )
{ {
m_model = new S3D_MESH(); m_model.reset( new S3D_MESH() );
S3D_MESH* save_ptr = m_model; S3D_MESH_PTR save_ptr( m_model );
if( read_Transform() == 0 ) if( read_Transform() == 0 )
{ {
...@@ -337,7 +337,7 @@ int VRML2_MODEL_PARSER::read_Transform() ...@@ -337,7 +337,7 @@ int VRML2_MODEL_PARSER::read_Transform()
if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) && if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) &&
(m_model->childs.size() == 0) ) (m_model->childs.size() == 0) )
{ {
delete m_model; m_model.reset();
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_Transform: skipping model with no points or childs" ) ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_Transform: skipping model with no points or childs" ) );
} }
else else
...@@ -352,7 +352,7 @@ int VRML2_MODEL_PARSER::read_Transform() ...@@ -352,7 +352,7 @@ int VRML2_MODEL_PARSER::read_Transform()
} }
else else
{ {
delete m_model; m_model.reset();
} }
} }
else if( strcmp( text, "translation" ) == 0 ) else if( strcmp( text, "translation" ) == 0 )
...@@ -463,14 +463,14 @@ int VRML2_MODEL_PARSER::read_Transform() ...@@ -463,14 +463,14 @@ int VRML2_MODEL_PARSER::read_Transform()
else if( strcmp( text, "Shape" ) == 0 ) else if( strcmp( text, "Shape" ) == 0 )
{ {
// Save the pointer // Save the pointer
S3D_MESH* parent = m_model; S3D_MESH_PTR parent( m_model );
S3D_MESH* new_mesh_model = new S3D_MESH(); S3D_MESH_PTR new_mesh_model( new S3D_MESH() );
// Assign the current pointer // Assign the current pointer
m_model = new_mesh_model; m_model = new_mesh_model;
S3D_MESH* save_ptr = m_model; S3D_MESH_PTR save_ptr = m_model;
if( read_Shape() == 0 ) if( read_Shape() == 0 )
{ {
...@@ -481,7 +481,7 @@ int VRML2_MODEL_PARSER::read_Transform() ...@@ -481,7 +481,7 @@ int VRML2_MODEL_PARSER::read_Transform()
if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) && if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) &&
(m_model->childs.size() == 0) ) (m_model->childs.size() == 0) )
{ {
delete m_model; m_model.reset();
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_Transform: Shape, skipping model with no points or childs" ) ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_Transform: Shape, skipping model with no points or childs" ) );
} }
else else
...@@ -496,14 +496,14 @@ int VRML2_MODEL_PARSER::read_Transform() ...@@ -496,14 +496,14 @@ int VRML2_MODEL_PARSER::read_Transform()
} }
else else
{ {
delete m_model; m_model.reset();
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_Transform: Shape, discard child." ) ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_Transform: Shape, discard child." ) );
} }
} }
else else
{ {
delete m_model; m_model.reset();
} }
m_model = parent; m_model = parent;
...@@ -540,7 +540,7 @@ int VRML2_MODEL_PARSER::read_Transform() ...@@ -540,7 +540,7 @@ int VRML2_MODEL_PARSER::read_Transform()
return -1; return -1;
} }
S3D_MESH* ptrModel = groupIt->second; S3D_MESH_PTR ptrModel( groupIt->second );
if( ((ptrModel->m_Point.size() == 0) || (ptrModel->m_CoordIndex.size() == 0)) && if( ((ptrModel->m_Point.size() == 0) || (ptrModel->m_CoordIndex.size() == 0)) &&
(ptrModel->childs.size() == 0) ) (ptrModel->childs.size() == 0) )
...@@ -778,14 +778,14 @@ int VRML2_MODEL_PARSER::read_DEF() ...@@ -778,14 +778,14 @@ int VRML2_MODEL_PARSER::read_DEF()
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "Shape" ) ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "Shape" ) );
// Save the pointer // Save the pointer
S3D_MESH* parent = m_model; S3D_MESH_PTR parent = m_model;
S3D_MESH* new_mesh_model = new S3D_MESH(); S3D_MESH_PTR new_mesh_model( new S3D_MESH() );
// Assign the current pointer // Assign the current pointer
m_model = new_mesh_model; m_model = new_mesh_model;
S3D_MESH* save_ptr = m_model; S3D_MESH_PTR save_ptr = m_model;
if( read_Shape() == 0 ) if( read_Shape() == 0 )
{ {
...@@ -794,7 +794,7 @@ int VRML2_MODEL_PARSER::read_DEF() ...@@ -794,7 +794,7 @@ int VRML2_MODEL_PARSER::read_DEF()
if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) && if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.size() == 0)) &&
(m_model->childs.size() == 0) ) (m_model->childs.size() == 0) )
{ {
delete m_model; m_model.reset();
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_DEF: Shape, skipping model with no points or childs" ) ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_DEF: Shape, skipping model with no points or childs" ) );
} }
else else
...@@ -809,7 +809,7 @@ int VRML2_MODEL_PARSER::read_DEF() ...@@ -809,7 +809,7 @@ int VRML2_MODEL_PARSER::read_DEF()
} }
else else
{ {
delete m_model; m_model.reset();
} }
m_model = parent; m_model = parent;
...@@ -824,9 +824,9 @@ int VRML2_MODEL_PARSER::read_DEF() ...@@ -824,9 +824,9 @@ int VRML2_MODEL_PARSER::read_DEF()
wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "Group %s" ), tagName ); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "Group %s" ), tagName );
// Save the pointer // Save the pointer
S3D_MESH* parent = m_model; S3D_MESH_PTR parent = m_model;
S3D_MESH* new_mesh_model = new S3D_MESH(); S3D_MESH_PTR new_mesh_model( new S3D_MESH() );
// Assign the current pointer // Assign the current pointer
m_model = new_mesh_model; m_model = new_mesh_model;
...@@ -848,7 +848,7 @@ int VRML2_MODEL_PARSER::read_DEF() ...@@ -848,7 +848,7 @@ int VRML2_MODEL_PARSER::read_DEF()
} }
else else
{ {
delete m_model; m_model.reset();
} }
// Restore current model pointer // Restore current model pointer
......
...@@ -45,14 +45,6 @@ VRML_MODEL_PARSER::VRML_MODEL_PARSER( S3D_MASTER* aMaster ) : ...@@ -45,14 +45,6 @@ VRML_MODEL_PARSER::VRML_MODEL_PARSER( S3D_MASTER* aMaster ) :
VRML_MODEL_PARSER::~VRML_MODEL_PARSER() VRML_MODEL_PARSER::~VRML_MODEL_PARSER()
{ {
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
if( childs[idx] )
{
delete childs[idx];
childs[idx] = 0;
}
}
} }
bool VRML_MODEL_PARSER::Load( const wxString& aFilename ) bool VRML_MODEL_PARSER::Load( const wxString& aFilename )
......
...@@ -52,20 +52,12 @@ static const wxChar* traceX3DParser = wxT( "KI_TRACE_X3D_PARSER" ); ...@@ -52,20 +52,12 @@ static const wxChar* traceX3DParser = wxT( "KI_TRACE_X3D_PARSER" );
X3D_MODEL_PARSER::X3D_MODEL_PARSER( S3D_MASTER* aMaster ) : X3D_MODEL_PARSER::X3D_MODEL_PARSER( S3D_MASTER* aMaster ) :
S3D_MODEL_PARSER( aMaster ) S3D_MODEL_PARSER( aMaster )
{ {
m_model = NULL; m_model.reset();
} }
X3D_MODEL_PARSER::~X3D_MODEL_PARSER() X3D_MODEL_PARSER::~X3D_MODEL_PARSER()
{ {
for( unsigned int idx = 0; idx < childs.size(); idx++ )
{
if( childs[idx] )
{
delete childs[idx];
childs[idx] = 0;
}
}
} }
...@@ -102,7 +94,7 @@ bool X3D_MODEL_PARSER::Load( const wxString& aFilename ) ...@@ -102,7 +94,7 @@ bool X3D_MODEL_PARSER::Load( const wxString& aFilename )
node_it != transforms.end(); node_it != transforms.end();
node_it++ ) node_it++ )
{ {
m_model = new S3D_MESH(); m_model.reset( new S3D_MESH() );
childs.push_back( m_model ); childs.push_back( m_model );
readTransform( *node_it ); readTransform( *node_it );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment