mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-05-29 05:35:07 +02:00
cleanup ShapeFactory implementation
This commit is contained in:
parent
d45febf1db
commit
137fccbd91
2 changed files with 35 additions and 44 deletions
|
@ -16,6 +16,40 @@
|
||||||
#include "ShapeFactory.h"
|
#include "ShapeFactory.h"
|
||||||
#include "BulletUtil.h"
|
#include "BulletUtil.h"
|
||||||
|
|
||||||
|
|
||||||
|
class StaticMeshShape : public btBvhTriangleMeshShape {
|
||||||
|
public:
|
||||||
|
StaticMeshShape() = delete;
|
||||||
|
|
||||||
|
StaticMeshShape(btTriangleIndexVertexArray* dataArray)
|
||||||
|
: btBvhTriangleMeshShape(dataArray, true), _dataArray(dataArray) {
|
||||||
|
assert(_dataArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
~StaticMeshShape() {
|
||||||
|
assert(_dataArray);
|
||||||
|
IndexedMeshArray& meshes = _dataArray->getIndexedMeshArray();
|
||||||
|
for (int32_t i = 0; i < meshes.size(); ++i) {
|
||||||
|
btIndexedMesh mesh = meshes[i];
|
||||||
|
mesh.m_numTriangles = 0;
|
||||||
|
delete [] mesh.m_triangleIndexBase;
|
||||||
|
mesh.m_triangleIndexBase = nullptr;
|
||||||
|
mesh.m_numVertices = 0;
|
||||||
|
delete [] mesh.m_vertexBase;
|
||||||
|
mesh.m_vertexBase = nullptr;
|
||||||
|
}
|
||||||
|
meshes.clear();
|
||||||
|
delete _dataArray;
|
||||||
|
_dataArray = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// the StaticMeshShape owns its vertex/index data
|
||||||
|
btTriangleIndexVertexArray* _dataArray;
|
||||||
|
};
|
||||||
|
|
||||||
|
// the dataArray must be created before we create the StaticMeshShape
|
||||||
|
|
||||||
// These are the same normalized directions used by the btShapeHull class.
|
// These are the same normalized directions used by the btShapeHull class.
|
||||||
// 12 points for the face centers of a dodecahedron plus another 30 points
|
// 12 points for the face centers of a dodecahedron plus another 30 points
|
||||||
// for the midpoints the edges, for a total of 42.
|
// for the midpoints the edges, for a total of 42.
|
||||||
|
@ -230,23 +264,6 @@ btTriangleIndexVertexArray* createStaticMeshArray(const ShapeInfo& info) {
|
||||||
return dataArray;
|
return dataArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
// util method
|
|
||||||
void deleteStaticMeshArray(btTriangleIndexVertexArray* dataArray) {
|
|
||||||
assert(dataArray);
|
|
||||||
IndexedMeshArray& meshes = dataArray->getIndexedMeshArray();
|
|
||||||
for (int32_t i = 0; i < meshes.size(); ++i) {
|
|
||||||
btIndexedMesh mesh = meshes[i];
|
|
||||||
mesh.m_numTriangles = 0;
|
|
||||||
delete [] mesh.m_triangleIndexBase;
|
|
||||||
mesh.m_triangleIndexBase = nullptr;
|
|
||||||
mesh.m_numVertices = 0;
|
|
||||||
delete [] mesh.m_vertexBase;
|
|
||||||
mesh.m_vertexBase = nullptr;
|
|
||||||
}
|
|
||||||
meshes.clear();
|
|
||||||
delete dataArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
const btCollisionShape* ShapeFactory::createShapeFromInfo(const ShapeInfo& info) {
|
const btCollisionShape* ShapeFactory::createShapeFromInfo(const ShapeInfo& info) {
|
||||||
btCollisionShape* shape = NULL;
|
btCollisionShape* shape = NULL;
|
||||||
int type = info.getType();
|
int type = info.getType();
|
||||||
|
@ -431,7 +448,6 @@ void ShapeFactory::deleteShape(const btCollisionShape* shape) {
|
||||||
assert(shape);
|
assert(shape);
|
||||||
// ShapeFactory is responsible for deleting all shapes, even the const ones that are stored
|
// ShapeFactory is responsible for deleting all shapes, even the const ones that are stored
|
||||||
// in the ShapeManager, so we must cast to non-const here when deleting.
|
// in the ShapeManager, so we must cast to non-const here when deleting.
|
||||||
// so we cast to non-const here when deleting memory.
|
|
||||||
btCollisionShape* nonConstShape = const_cast<btCollisionShape*>(shape);
|
btCollisionShape* nonConstShape = const_cast<btCollisionShape*>(shape);
|
||||||
if (nonConstShape->getShapeType() == (int)COMPOUND_SHAPE_PROXYTYPE) {
|
if (nonConstShape->getShapeType() == (int)COMPOUND_SHAPE_PROXYTYPE) {
|
||||||
btCompoundShape* compoundShape = static_cast<btCompoundShape*>(nonConstShape);
|
btCompoundShape* compoundShape = static_cast<btCompoundShape*>(nonConstShape);
|
||||||
|
@ -448,14 +464,3 @@ void ShapeFactory::deleteShape(const btCollisionShape* shape) {
|
||||||
}
|
}
|
||||||
delete nonConstShape;
|
delete nonConstShape;
|
||||||
}
|
}
|
||||||
|
|
||||||
// the dataArray must be created before we create the StaticMeshShape
|
|
||||||
ShapeFactory::StaticMeshShape::StaticMeshShape(btTriangleIndexVertexArray* dataArray)
|
|
||||||
: btBvhTriangleMeshShape(dataArray, true), _dataArray(dataArray) {
|
|
||||||
assert(dataArray);
|
|
||||||
}
|
|
||||||
|
|
||||||
ShapeFactory::StaticMeshShape::~StaticMeshShape() {
|
|
||||||
deleteStaticMeshArray(_dataArray);
|
|
||||||
_dataArray = nullptr;
|
|
||||||
}
|
|
||||||
|
|
|
@ -17,25 +17,11 @@
|
||||||
|
|
||||||
#include <ShapeInfo.h>
|
#include <ShapeInfo.h>
|
||||||
|
|
||||||
// translates between ShapeInfo and btShape
|
// The ShapeFactory assembles and correctly disassembles btCollisionShapes.
|
||||||
|
|
||||||
namespace ShapeFactory {
|
namespace ShapeFactory {
|
||||||
const btCollisionShape* createShapeFromInfo(const ShapeInfo& info);
|
const btCollisionShape* createShapeFromInfo(const ShapeInfo& info);
|
||||||
void deleteShape(const btCollisionShape* shape);
|
void deleteShape(const btCollisionShape* shape);
|
||||||
|
|
||||||
//btTriangleIndexVertexArray* createStaticMeshArray(const ShapeInfo& info);
|
|
||||||
//void deleteStaticMeshArray(btTriangleIndexVertexArray* dataArray);
|
|
||||||
|
|
||||||
class StaticMeshShape : public btBvhTriangleMeshShape {
|
|
||||||
public:
|
|
||||||
StaticMeshShape() = delete;
|
|
||||||
StaticMeshShape(btTriangleIndexVertexArray* dataArray);
|
|
||||||
~StaticMeshShape();
|
|
||||||
|
|
||||||
private:
|
|
||||||
// the StaticMeshShape owns its vertex/index data
|
|
||||||
btTriangleIndexVertexArray* _dataArray;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_ShapeFactory_h
|
#endif // hifi_ShapeFactory_h
|
||||||
|
|
Loading…
Reference in a new issue