From ae57c4692aa82df2ffb6080ecfb9874e3f4da07b Mon Sep 17 00:00:00 2001 From: Brian Sidebotham Date: Mon, 13 Apr 2015 21:56:15 +0100 Subject: [PATCH] Move S3D_MESH* to smart pointer to fix CID 108646 --- 3d-viewer/3d_mesh_model.cpp | 23 ++++----- 3d-viewer/3d_mesh_model.h | 13 ++++-- 3d-viewer/modelparsers.h | 17 +++---- 3d-viewer/vrml_v1_modelparser.cpp | 12 ++--- 3d-viewer/vrml_v2_modelparser.cpp | 78 +++++++++++++++---------------- 3d-viewer/vrmlmodelparser.cpp | 8 ---- 3d-viewer/x3dmodelparser.cpp | 12 +---- 7 files changed, 74 insertions(+), 89 deletions(-) diff --git a/3d-viewer/3d_mesh_model.cpp b/3d-viewer/3d_mesh_model.cpp index 6fc8bd52fa..8bd02fe26f 100644 --- a/3d-viewer/3d_mesh_model.cpp +++ b/3d-viewer/3d_mesh_model.cpp @@ -68,13 +68,6 @@ 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( ) { if( !m_BBox.IsInitialized() ) calcBBoxAllChilds(); - + return m_BBox; } @@ -100,7 +93,7 @@ void S3D_MESH::calcBBoxAllChilds( ) // Calc transformation matrix glm::mat4 fullTransformMatrix; glm::mat4 translationMatrix = glm::translate( glm::mat4(), m_translation ); - + if( m_rotation[3] != 0.0f ) { glm::mat4 rotationMatrix = glm::rotate( translationMatrix, glm::radians( m_rotation[3] ), @@ -110,7 +103,7 @@ void S3D_MESH::calcBBoxAllChilds( ) else fullTransformMatrix = glm::scale( translationMatrix, m_scale ); - + // Apply transformation m_BBox.Set( S3D_VERTEX( fullTransformMatrix * glm::vec4( tmpBBox.Min(), 1.0f ) ), S3D_VERTEX( fullTransformMatrix * glm::vec4( tmpBBox.Max(), 1.0f ) ) ); @@ -243,7 +236,7 @@ void S3D_MESH::openGL_Render( bool aIsRenderingJustNonTransparentObjects, if ( m_MaterialIndex.size() > idx ) { bool isTransparent = m_Materials->SetOpenGLMaterial( m_MaterialIndex[idx], useMaterial ); - + if( isTransparent && aIsRenderingJustNonTransparentObjects ) continue; @@ -652,7 +645,7 @@ void S3D_MESH::calcPerFaceNormals() l, (unsigned int)m_CoordIndex[idx].size()) ); */ - + if( ( cross_prod.x > cross_prod.y ) && ( cross_prod.x > cross_prod.z ) ) { cross_prod.x = 0.0f; @@ -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++ ) { glm::vec3 initVertexFaceNormal = m_PerFaceNormalsRaw_X_PerFaceSquaredArea[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++ ) @@ -722,7 +715,7 @@ void S3D_MESH::calcPerPointNormals() } } - + #ifdef USE_OPENMP #pragma omp parallel for #endif /* USE_OPENMP */ @@ -732,7 +725,7 @@ void S3D_MESH::calcPerPointNormals() { // n = face A facet normal std::vector< glm::vec3 >& face_A_normals = m_PerFaceVertexNormals[each_face_A_idx]; - + // loop through all vertices // 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++ ) diff --git a/3d-viewer/3d_mesh_model.h b/3d-viewer/3d_mesh_model.h index 856a0c6341..7223e17752 100644 --- a/3d-viewer/3d_mesh_model.h +++ b/3d-viewer/3d_mesh_model.h @@ -24,12 +24,14 @@ /** * @file 3d_mesh_model.h - * @brief + * @brief */ #ifndef __3D_MESH_MODEL_H__ #define __3D_MESH_MODEL_H__ +#include +#include #include #define GLM_FORCE_RADIANS #include @@ -37,9 +39,14 @@ #include "3d_material.h" #include "CBBox.h" - class S3D_MESH; +/** A smart pointer to an S3D_MESH object */ +typedef boost::shared_ptr S3D_MESH_PTR; + +/** A container of smar S3D_MESH object pointers */ +typedef std::vector S3D_MESH_PTRS; + class S3D_MESH { public: @@ -60,7 +67,7 @@ public: std::vector< S3D_VERTEX > m_PerFaceNormalsNormalized; std::vector< S3D_VERTEX > m_PerVertexNormalsNormalized; std::vector< int > m_MaterialIndex; - std::vector< S3D_MESH * > childs; + S3D_MESH_PTRS childs; S3D_VERTEX m_translation; glm::vec4 m_rotation; diff --git a/3d-viewer/modelparsers.h b/3d-viewer/modelparsers.h index 176f918431..8e591882bc 100644 --- a/3d-viewer/modelparsers.h +++ b/3d-viewer/modelparsers.h @@ -30,6 +30,7 @@ #define MODELPARSERS_H #include +#include #include #include #include <3d_mesh_model.h> @@ -71,11 +72,11 @@ public: * @param aFilename = the full file name of the file to load * @return true if as succeeded */ - virtual bool Load( const wxString& aFilename ) { + virtual bool Load( const wxString& aFilename ) { return false; }; - std::vector< S3D_MESH* > childs; + S3D_MESH_PTRS childs; private: S3D_MASTER* master; @@ -127,7 +128,7 @@ public: private: wxString m_Filename; - S3D_MESH* m_model; + S3D_MESH_PTR m_model; std::vector< wxString > vrml_materials; std::vector< wxString > vrml_points; @@ -143,7 +144,7 @@ private: 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 @@ -164,7 +165,7 @@ public: * @param aTransformationModel a model with translation, rotation and scale to apply to default root * @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 @@ -174,7 +175,7 @@ public: wxString VRML2_representation(); private: - int loadFileModel( S3D_MESH *transformationModel ); + int loadFileModel( S3D_MESH_PTR transformationModel ); int read_Transform(); int read_DEF(); int read_DEF_Coordinate(); @@ -211,7 +212,7 @@ private: bool m_normalPerVertex; 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; wxFileName m_Filename; VRML2_COORDINATE_MAP m_defCoordinateMap; @@ -266,7 +267,7 @@ private: bool m_normalPerVertex; bool colorPerVertex; - S3D_MESH* m_model; + S3D_MESH_PTR m_model; FILE* m_file; wxString m_Filename; S3D_MODEL_PARSER* m_ModelParser; diff --git a/3d-viewer/vrml_v1_modelparser.cpp b/3d-viewer/vrml_v1_modelparser.cpp index 52aca1ebfc..4879691379 100644 --- a/3d-viewer/vrml_v1_modelparser.cpp +++ b/3d-viewer/vrml_v1_modelparser.cpp @@ -51,7 +51,7 @@ VRML1_MODEL_PARSER::VRML1_MODEL_PARSER( S3D_MODEL_PARSER* aModelParser ) { m_ModelParser = aModelParser; m_Master = m_ModelParser->GetMaster(); - m_model = NULL; + m_model.reset(); m_file = NULL; m_normalPerVertex = true; colorPerVertex = true; @@ -88,7 +88,7 @@ bool VRML1_MODEL_PARSER::Load( const wxString& aFilename ) if( strcmp( text, "Separator" ) == 0 ) { - m_model = new S3D_MESH(); + m_model.reset( new S3D_MESH() ); m_ModelParser->childs.push_back( m_model ); read_separator(); } @@ -122,18 +122,18 @@ int VRML1_MODEL_PARSER::read_separator() } 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 = new_mesh_model; + m_model.reset( new_mesh_model.get() ); // recursive read_separator(); - m_model = parent; + m_model.reset( parent.get() ); } else if( ( *text != '}' ) ) { diff --git a/3d-viewer/vrml_v2_modelparser.cpp b/3d-viewer/vrml_v2_modelparser.cpp index 8d26130e5b..55acb0bff3 100644 --- a/3d-viewer/vrml_v2_modelparser.cpp +++ b/3d-viewer/vrml_v2_modelparser.cpp @@ -54,7 +54,7 @@ VRML2_MODEL_PARSER::VRML2_MODEL_PARSER( S3D_MODEL_PARSER* aModelParser ) { m_ModelParser = aModelParser; m_Master = m_ModelParser->GetMaster(); - m_model = NULL; + m_model.reset(); m_file = NULL; m_normalPerVertex = true; colorPerVertex = true; @@ -98,7 +98,7 @@ bool VRML2_MODEL_PARSER::Load( const wxString& aFilename ) // Switch the locale to standard C (needed to print floating point numbers) LOCALE_IO toggle; - loadFileModel( NULL ); + loadFileModel( S3D_MESH_PTR() ); fclose( m_file ); @@ -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 ) { @@ -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]; @@ -156,9 +156,9 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) 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 ) { @@ -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)) && (m_model->childs.size() == 0) ) { - delete m_model; + m_model.reset(); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) ); } else { - if( aTransformationModel ) + if( aTransformationModel.get() != NULL ) { m_model->m_translation = aTransformationModel->m_translation; m_model->m_rotation = aTransformationModel->m_rotation; @@ -187,14 +187,14 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) } else { - delete m_model; + m_model.reset(); } } 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 ) { @@ -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)) && (m_model->childs.size() == 0) ) { - delete m_model; + m_model.reset(); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) ); } else { - if( aTransformationModel ) + if( aTransformationModel.get() != NULL ) { m_model->m_translation = aTransformationModel->m_translation; m_model->m_rotation = aTransformationModel->m_rotation; @@ -223,14 +223,14 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) } else { - delete m_model; + m_model.reset(); } } 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 ) { @@ -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)) && (m_model->childs.size() == 0) ) { - delete m_model; + m_model.reset(); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "loadFileModel: skipping model with no points or childs" ) ); } else { - if( aTransformationModel ) + if( aTransformationModel.get() != NULL ) { m_model->m_translation = aTransformationModel->m_translation; m_model->m_rotation = aTransformationModel->m_rotation; @@ -261,7 +261,7 @@ int VRML2_MODEL_PARSER::loadFileModel( S3D_MESH *aTransformationModel ) } else { - delete m_model; + m_model.reset(); } } } @@ -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 ) { 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)) && @@ -326,9 +326,9 @@ int VRML2_MODEL_PARSER::read_Transform() 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 ) { @@ -337,7 +337,7 @@ int VRML2_MODEL_PARSER::read_Transform() if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.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" ) ); } else @@ -352,7 +352,7 @@ int VRML2_MODEL_PARSER::read_Transform() } else { - delete m_model; + m_model.reset(); } } else if( strcmp( text, "translation" ) == 0 ) @@ -463,14 +463,14 @@ int VRML2_MODEL_PARSER::read_Transform() else if( strcmp( text, "Shape" ) == 0 ) { // 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 m_model = new_mesh_model; - S3D_MESH* save_ptr = m_model; + S3D_MESH_PTR save_ptr = m_model; if( read_Shape() == 0 ) { @@ -481,7 +481,7 @@ int VRML2_MODEL_PARSER::read_Transform() if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.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" ) ); } else @@ -496,14 +496,14 @@ int VRML2_MODEL_PARSER::read_Transform() } else { - delete m_model; + m_model.reset(); wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "read_Transform: Shape, discard child." ) ); } } else { - delete m_model; + m_model.reset(); } m_model = parent; @@ -540,7 +540,7 @@ int VRML2_MODEL_PARSER::read_Transform() return -1; } - S3D_MESH* ptrModel = groupIt->second; + S3D_MESH_PTR ptrModel( groupIt->second ); if( ((ptrModel->m_Point.size() == 0) || (ptrModel->m_CoordIndex.size() == 0)) && (ptrModel->childs.size() == 0) ) @@ -778,14 +778,14 @@ int VRML2_MODEL_PARSER::read_DEF() wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "Shape" ) ); // 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 m_model = new_mesh_model; - S3D_MESH* save_ptr = m_model; + S3D_MESH_PTR save_ptr = m_model; if( read_Shape() == 0 ) { @@ -794,7 +794,7 @@ int VRML2_MODEL_PARSER::read_DEF() if( ((m_model->m_Point.size() == 0) || (m_model->m_CoordIndex.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" ) ); } else @@ -809,7 +809,7 @@ int VRML2_MODEL_PARSER::read_DEF() } else { - delete m_model; + m_model.reset(); } m_model = parent; @@ -824,9 +824,9 @@ int VRML2_MODEL_PARSER::read_DEF() wxLogTrace( traceVrmlV2Parser, m_debugSpacer + wxT( "Group %s" ), tagName ); // 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 m_model = new_mesh_model; @@ -848,7 +848,7 @@ int VRML2_MODEL_PARSER::read_DEF() } else { - delete m_model; + m_model.reset(); } // Restore current model pointer diff --git a/3d-viewer/vrmlmodelparser.cpp b/3d-viewer/vrmlmodelparser.cpp index f9aeac5bdf..db86d1e276 100644 --- a/3d-viewer/vrmlmodelparser.cpp +++ b/3d-viewer/vrmlmodelparser.cpp @@ -45,14 +45,6 @@ VRML_MODEL_PARSER::VRML_MODEL_PARSER( S3D_MASTER* aMaster ) : 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 ) diff --git a/3d-viewer/x3dmodelparser.cpp b/3d-viewer/x3dmodelparser.cpp index 780d228f35..82bc60c1cd 100644 --- a/3d-viewer/x3dmodelparser.cpp +++ b/3d-viewer/x3dmodelparser.cpp @@ -52,20 +52,12 @@ static const wxChar* traceX3DParser = wxT( "KI_TRACE_X3D_PARSER" ); X3D_MODEL_PARSER::X3D_MODEL_PARSER( S3D_MASTER* aMaster ) : S3D_MODEL_PARSER( aMaster ) { - m_model = NULL; + m_model.reset(); } 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 ) node_it != transforms.end(); node_it++ ) { - m_model = new S3D_MESH(); + m_model.reset( new S3D_MESH() ); childs.push_back( m_model ); readTransform( *node_it );