mirror of
https://github.com/OpenMW/openmw.git
synced 2025-04-12 21:06:43 +00:00
Use unique_ptr to store btCollisionShape in BulletShape
This commit is contained in:
parent
80e3623d9a
commit
b905dd17c3
6 changed files with 55 additions and 60 deletions
|
@ -117,7 +117,7 @@ namespace
|
||||||
osg::ref_ptr<const Resource::BulletShapeInstance> makeBulletShapeInstance(std::unique_ptr<T>&& shape)
|
osg::ref_ptr<const Resource::BulletShapeInstance> makeBulletShapeInstance(std::unique_ptr<T>&& shape)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<Resource::BulletShape> bulletShape(new Resource::BulletShape);
|
osg::ref_ptr<Resource::BulletShape> bulletShape(new Resource::BulletShape);
|
||||||
bulletShape->mCollisionShape = std::move(shape).release();
|
bulletShape->mCollisionShape.reset(std::move(shape).release());
|
||||||
return new Resource::BulletShapeInstance(bulletShape);
|
return new Resource::BulletShapeInstance(bulletShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -466,7 +466,7 @@ namespace
|
||||||
}};
|
}};
|
||||||
std::unique_ptr<btHeightfieldTerrainShape> shapePtr = makeSquareHeightfieldTerrainShape(heightfieldData);
|
std::unique_ptr<btHeightfieldTerrainShape> shapePtr = makeSquareHeightfieldTerrainShape(heightfieldData);
|
||||||
shapePtr->setLocalScaling(btVector3(128, 128, 1));
|
shapePtr->setLocalScaling(btVector3(128, 128, 1));
|
||||||
bulletShape->mCollisionShape = shapePtr.release();
|
bulletShape->mCollisionShape.reset(shapePtr.release());
|
||||||
|
|
||||||
std::array<btScalar, 5 * 5> heightfieldDataAvoid {{
|
std::array<btScalar, 5 * 5> heightfieldDataAvoid {{
|
||||||
-25, -25, -25, -25, -25,
|
-25, -25, -25, -25, -25,
|
||||||
|
@ -477,7 +477,7 @@ namespace
|
||||||
}};
|
}};
|
||||||
std::unique_ptr<btHeightfieldTerrainShape> shapeAvoidPtr = makeSquareHeightfieldTerrainShape(heightfieldDataAvoid);
|
std::unique_ptr<btHeightfieldTerrainShape> shapeAvoidPtr = makeSquareHeightfieldTerrainShape(heightfieldDataAvoid);
|
||||||
shapeAvoidPtr->setLocalScaling(btVector3(128, 128, 1));
|
shapeAvoidPtr->setLocalScaling(btVector3(128, 128, 1));
|
||||||
bulletShape->mAvoidCollisionShape = shapeAvoidPtr.release();
|
bulletShape->mAvoidCollisionShape.reset(shapeAvoidPtr.release());
|
||||||
|
|
||||||
osg::ref_ptr<const Resource::BulletShapeInstance> instance(new Resource::BulletShapeInstance(bulletShape));
|
osg::ref_ptr<const Resource::BulletShapeInstance> instance(new Resource::BulletShapeInstance(bulletShape));
|
||||||
|
|
||||||
|
|
|
@ -160,8 +160,8 @@ namespace Resource
|
||||||
{
|
{
|
||||||
static bool operator ==(const Resource::BulletShape& lhs, const Resource::BulletShape& rhs)
|
static bool operator ==(const Resource::BulletShape& lhs, const Resource::BulletShape& rhs)
|
||||||
{
|
{
|
||||||
return compareObjects(lhs.mCollisionShape, rhs.mCollisionShape)
|
return compareObjects(lhs.mCollisionShape.get(), rhs.mCollisionShape.get())
|
||||||
&& compareObjects(lhs.mAvoidCollisionShape, rhs.mAvoidCollisionShape)
|
&& compareObjects(lhs.mAvoidCollisionShape.get(), rhs.mAvoidCollisionShape.get())
|
||||||
&& lhs.mCollisionBox.mExtents == rhs.mCollisionBox.mExtents
|
&& lhs.mCollisionBox.mExtents == rhs.mCollisionBox.mExtents
|
||||||
&& lhs.mCollisionBox.mCenter == rhs.mCollisionBox.mCenter
|
&& lhs.mCollisionBox.mCenter == rhs.mCollisionBox.mCenter
|
||||||
&& lhs.mAnimatedShapes == rhs.mAnimatedShapes;
|
&& lhs.mAnimatedShapes == rhs.mAnimatedShapes;
|
||||||
|
@ -170,8 +170,8 @@ namespace Resource
|
||||||
static std::ostream& operator <<(std::ostream& stream, const Resource::BulletShape& value)
|
static std::ostream& operator <<(std::ostream& stream, const Resource::BulletShape& value)
|
||||||
{
|
{
|
||||||
return stream << "Resource::BulletShape {"
|
return stream << "Resource::BulletShape {"
|
||||||
<< value.mCollisionShape << ", "
|
<< value.mCollisionShape.get() << ", "
|
||||||
<< value.mAvoidCollisionShape << ", "
|
<< value.mAvoidCollisionShape.get() << ", "
|
||||||
<< "osg::Vec3f {" << value.mCollisionBox.mExtents << "}" << ", "
|
<< "osg::Vec3f {" << value.mCollisionBox.mExtents << "}" << ", "
|
||||||
<< "osg::Vec3f {" << value.mCollisionBox.mCenter << "}" << ", "
|
<< "osg::Vec3f {" << value.mCollisionBox.mCenter << "}" << ", "
|
||||||
<< value.mAnimatedShapes
|
<< value.mAnimatedShapes
|
||||||
|
@ -446,7 +446,7 @@ namespace
|
||||||
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(1, 2, 3)));
|
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(1, 2, 3)));
|
||||||
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
||||||
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-1, -2, -3)), box.release());
|
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-1, -2, -3)), box.release());
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -471,7 +471,7 @@ namespace
|
||||||
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(1, 2, 3)));
|
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(1, 2, 3)));
|
||||||
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
||||||
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-1, -2, -3)), box.release());
|
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-1, -2, -3)), box.release());
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -501,7 +501,7 @@ namespace
|
||||||
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(1, 2, 3)));
|
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(1, 2, 3)));
|
||||||
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
||||||
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-1, -2, -3)), box.release());
|
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-1, -2, -3)), box.release());
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -536,7 +536,7 @@ namespace
|
||||||
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(1, 2, 3)));
|
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(1, 2, 3)));
|
||||||
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
||||||
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-1, -2, -3)), box.release());
|
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-1, -2, -3)), box.release());
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -571,7 +571,7 @@ namespace
|
||||||
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(4, 5, 6)));
|
std::unique_ptr<btBoxShape> box(new btBoxShape(btVector3(4, 5, 6)));
|
||||||
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
||||||
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-4, -5, -6)), box.release());
|
shape->addChildShape(btTransform(btMatrix3x3::getIdentity(), btVector3(-4, -5, -6)), box.release());
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -605,7 +605,7 @@ namespace
|
||||||
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
||||||
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = new Resource::TriangleMeshShape(triangles.release(), true);
|
expected.mCollisionShape.reset(new Resource::TriangleMeshShape(triangles.release(), true));
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -641,7 +641,7 @@ namespace
|
||||||
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
||||||
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = new Resource::TriangleMeshShape(triangles.release(), true);
|
expected.mCollisionShape.reset(new Resource::TriangleMeshShape(triangles.release(), true));
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -659,7 +659,7 @@ namespace
|
||||||
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
||||||
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = new Resource::TriangleMeshShape(triangles.release(), true);
|
expected.mCollisionShape.reset(new Resource::TriangleMeshShape(triangles.release(), true));
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -680,7 +680,7 @@ namespace
|
||||||
triangles->addTriangle(btVector3(0, 0, 1), btVector3(1, 0, 1), btVector3(1, 1, 1));
|
triangles->addTriangle(btVector3(0, 0, 1), btVector3(1, 0, 1), btVector3(1, 1, 1));
|
||||||
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = new Resource::TriangleMeshShape(triangles.release(), true);
|
expected.mCollisionShape.reset(new Resource::TriangleMeshShape(triangles.release(), true));
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -698,7 +698,7 @@ namespace
|
||||||
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
||||||
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = new Resource::TriangleMeshShape(triangles.release(), true);
|
expected.mCollisionShape.reset(new Resource::TriangleMeshShape(triangles.release(), true));
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -720,7 +720,7 @@ namespace
|
||||||
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
||||||
shape->addChildShape(mResultTransform, mesh.release());
|
shape->addChildShape(mResultTransform, mesh.release());
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
expected.mAnimatedShapes = {{-1, 0}};
|
expected.mAnimatedShapes = {{-1, 0}};
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
|
@ -746,7 +746,7 @@ namespace
|
||||||
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
||||||
shape->addChildShape(mResultTransform2, mesh.release());
|
shape->addChildShape(mResultTransform2, mesh.release());
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
expected.mAnimatedShapes = {{-1, 0}};
|
expected.mAnimatedShapes = {{-1, 0}};
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
|
@ -784,7 +784,7 @@ namespace
|
||||||
shape->addChildShape(mResultTransform, mesh.release());
|
shape->addChildShape(mResultTransform, mesh.release());
|
||||||
shape->addChildShape(mResultTransform, mesh2.release());
|
shape->addChildShape(mResultTransform, mesh2.release());
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
expected.mAnimatedShapes = {{-1, 0}};
|
expected.mAnimatedShapes = {{-1, 0}};
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
|
@ -813,7 +813,7 @@ namespace
|
||||||
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
std::unique_ptr<btCompoundShape> shape(new btCompoundShape);
|
||||||
shape->addChildShape(mResultTransform2, mesh.release());
|
shape->addChildShape(mResultTransform2, mesh.release());
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
expected.mAnimatedShapes = {{-1, 0}};
|
expected.mAnimatedShapes = {{-1, 0}};
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
|
@ -854,7 +854,7 @@ namespace
|
||||||
shape->addChildShape(mResultTransform2, mesh2.release());
|
shape->addChildShape(mResultTransform2, mesh2.release());
|
||||||
shape->addChildShape(btTransform::getIdentity(), mesh.release());
|
shape->addChildShape(btTransform::getIdentity(), mesh.release());
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = shape.release();
|
expected.mCollisionShape.reset(shape.release());
|
||||||
expected.mAnimatedShapes = {{-1, 0}};
|
expected.mAnimatedShapes = {{-1, 0}};
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
|
@ -873,7 +873,7 @@ namespace
|
||||||
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
||||||
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mAvoidCollisionShape = new Resource::TriangleMeshShape(triangles.release(), false);
|
expected.mAvoidCollisionShape.reset(new Resource::TriangleMeshShape(triangles.release(), false));
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
@ -979,7 +979,7 @@ namespace
|
||||||
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
std::unique_ptr<btTriangleMesh> triangles(new btTriangleMesh(false));
|
||||||
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
triangles->addTriangle(btVector3(0, 0, 0), btVector3(1, 0, 0), btVector3(1, 1, 0));
|
||||||
Resource::BulletShape expected;
|
Resource::BulletShape expected;
|
||||||
expected.mCollisionShape = new Resource::TriangleMeshShape(triangles.release(), true);
|
expected.mCollisionShape.reset(new Resource::TriangleMeshShape(triangles.release(), true));
|
||||||
|
|
||||||
EXPECT_EQ(*result, expected);
|
EXPECT_EQ(*result, expected);
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,7 +152,7 @@ osg::ref_ptr<Resource::BulletShape> BulletNifLoader::load(const Nif::File& nif)
|
||||||
compound->addChildShape(transform, boxShape.get());
|
compound->addChildShape(transform, boxShape.get());
|
||||||
boxShape.release();
|
boxShape.release();
|
||||||
|
|
||||||
mShape->mCollisionShape = compound.release();
|
mShape->mCollisionShape.reset(compound.release());
|
||||||
return mShape;
|
return mShape;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,17 +179,17 @@ osg::ref_ptr<Resource::BulletShape> BulletNifLoader::load(const Nif::File& nif)
|
||||||
child.release();
|
child.release();
|
||||||
mStaticMesh.release();
|
mStaticMesh.release();
|
||||||
}
|
}
|
||||||
mShape->mCollisionShape = mCompoundShape.release();
|
mShape->mCollisionShape.reset(mCompoundShape.release());
|
||||||
}
|
}
|
||||||
else if (mStaticMesh)
|
else if (mStaticMesh)
|
||||||
{
|
{
|
||||||
mShape->mCollisionShape = new Resource::TriangleMeshShape(mStaticMesh.get(), true);
|
mShape->mCollisionShape.reset(new Resource::TriangleMeshShape(mStaticMesh.get(), true));
|
||||||
mStaticMesh.release();
|
mStaticMesh.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mAvoidStaticMesh)
|
if (mAvoidStaticMesh)
|
||||||
{
|
{
|
||||||
mShape->mAvoidCollisionShape = new Resource::TriangleMeshShape(mAvoidStaticMesh.get(), false);
|
mShape->mAvoidCollisionShape.reset(new Resource::TriangleMeshShape(mAvoidStaticMesh.get(), false));
|
||||||
mAvoidStaticMesh.release();
|
mAvoidStaticMesh.release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace Resource
|
||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
btCollisionShape* duplicateCollisionShape(const btCollisionShape *shape)
|
CollisionShapePtr duplicateCollisionShape(const btCollisionShape *shape)
|
||||||
{
|
{
|
||||||
if (shape == nullptr)
|
if (shape == nullptr)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -20,13 +20,13 @@ namespace
|
||||||
if (shape->isCompound())
|
if (shape->isCompound())
|
||||||
{
|
{
|
||||||
const btCompoundShape *comp = static_cast<const btCompoundShape*>(shape);
|
const btCompoundShape *comp = static_cast<const btCompoundShape*>(shape);
|
||||||
btCompoundShape* newShape = new btCompoundShape;
|
std::unique_ptr<btCompoundShape, DeleteCollisionShape> newShape(new btCompoundShape);
|
||||||
|
|
||||||
for (int i = 0, n = comp->getNumChildShapes(); i < n; ++i)
|
for (int i = 0, n = comp->getNumChildShapes(); i < n; ++i)
|
||||||
{
|
{
|
||||||
btCollisionShape* child = duplicateCollisionShape(comp->getChildShape(i));
|
auto child = duplicateCollisionShape(comp->getChildShape(i));
|
||||||
const btTransform& trans = comp->getChildTransform(i);
|
const btTransform& trans = comp->getChildTransform(i);
|
||||||
newShape->addChildShape(trans, child);
|
newShape->addChildShape(trans, child.release());
|
||||||
}
|
}
|
||||||
|
|
||||||
return newShape;
|
return newShape;
|
||||||
|
@ -35,17 +35,17 @@ namespace
|
||||||
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE)
|
||||||
{
|
{
|
||||||
const btBvhTriangleMeshShape* trishape = static_cast<const btBvhTriangleMeshShape*>(shape);
|
const btBvhTriangleMeshShape* trishape = static_cast<const btBvhTriangleMeshShape*>(shape);
|
||||||
return new btScaledBvhTriangleMeshShape(const_cast<btBvhTriangleMeshShape*>(trishape), btVector3(1.f, 1.f, 1.f));
|
return CollisionShapePtr(new btScaledBvhTriangleMeshShape(const_cast<btBvhTriangleMeshShape*>(trishape), btVector3(1.f, 1.f, 1.f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shape->getShapeType() == BOX_SHAPE_PROXYTYPE)
|
if (shape->getShapeType() == BOX_SHAPE_PROXYTYPE)
|
||||||
{
|
{
|
||||||
const btBoxShape* boxshape = static_cast<const btBoxShape*>(shape);
|
const btBoxShape* boxshape = static_cast<const btBoxShape*>(shape);
|
||||||
return new btBoxShape(*boxshape);
|
return CollisionShapePtr(new btBoxShape(*boxshape));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (shape->getShapeType() == TERRAIN_SHAPE_PROXYTYPE)
|
if (shape->getShapeType() == TERRAIN_SHAPE_PROXYTYPE)
|
||||||
return new btHeightfieldTerrainShape(static_cast<const btHeightfieldTerrainShape&>(*shape));
|
return CollisionShapePtr(new btHeightfieldTerrainShape(static_cast<const btHeightfieldTerrainShape&>(*shape)));
|
||||||
|
|
||||||
throw std::logic_error(std::string("Unhandled Bullet shape duplication: ") + shape->getName());
|
throw std::logic_error(std::string("Unhandled Bullet shape duplication: ") + shape->getName());
|
||||||
}
|
}
|
||||||
|
@ -64,37 +64,27 @@ namespace
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BulletShape::BulletShape()
|
void DeleteCollisionShape::operator()(btCollisionShape* shape) const
|
||||||
: mCollisionShape(nullptr)
|
|
||||||
, mAvoidCollisionShape(nullptr)
|
|
||||||
{
|
{
|
||||||
|
deleteShape(shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
BulletShape::BulletShape(const BulletShape ©, const osg::CopyOp ©op)
|
BulletShape::BulletShape(const BulletShape ©, const osg::CopyOp ©op)
|
||||||
: mCollisionShape(duplicateCollisionShape(copy.mCollisionShape))
|
: mCollisionShape(duplicateCollisionShape(copy.mCollisionShape.get()))
|
||||||
, mAvoidCollisionShape(duplicateCollisionShape(copy.mAvoidCollisionShape))
|
, mAvoidCollisionShape(duplicateCollisionShape(copy.mAvoidCollisionShape.get()))
|
||||||
, mCollisionBox(copy.mCollisionBox)
|
, mCollisionBox(copy.mCollisionBox)
|
||||||
, mAnimatedShapes(copy.mAnimatedShapes)
|
, mAnimatedShapes(copy.mAnimatedShapes)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
BulletShape::~BulletShape()
|
|
||||||
{
|
|
||||||
if (mAvoidCollisionShape != nullptr)
|
|
||||||
deleteShape(mAvoidCollisionShape);
|
|
||||||
if (mCollisionShape != nullptr)
|
|
||||||
deleteShape(mCollisionShape);
|
|
||||||
}
|
|
||||||
|
|
||||||
btCollisionShape *BulletShape::getCollisionShape() const
|
btCollisionShape *BulletShape::getCollisionShape() const
|
||||||
{
|
{
|
||||||
return mCollisionShape;
|
return mCollisionShape.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
btCollisionShape *BulletShape::getAvoidCollisionShape() const
|
btCollisionShape *BulletShape::getAvoidCollisionShape() const
|
||||||
{
|
{
|
||||||
return mAvoidCollisionShape;
|
return mAvoidCollisionShape.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BulletShape::setLocalScaling(const btVector3& scale)
|
void BulletShape::setLocalScaling(const btVector3& scale)
|
||||||
|
@ -116,13 +106,12 @@ osg::ref_ptr<BulletShapeInstance> BulletShape::makeInstance() const
|
||||||
}
|
}
|
||||||
|
|
||||||
BulletShapeInstance::BulletShapeInstance(osg::ref_ptr<const BulletShape> source)
|
BulletShapeInstance::BulletShapeInstance(osg::ref_ptr<const BulletShape> source)
|
||||||
: BulletShape()
|
: mSource(source)
|
||||||
, mSource(source)
|
|
||||||
{
|
{
|
||||||
mCollisionBox = source->mCollisionBox;
|
mCollisionBox = source->mCollisionBox;
|
||||||
mAnimatedShapes = source->mAnimatedShapes;
|
mAnimatedShapes = source->mAnimatedShapes;
|
||||||
mCollisionShape = duplicateCollisionShape(source->mCollisionShape);
|
mCollisionShape = duplicateCollisionShape(source->mCollisionShape.get());
|
||||||
mAvoidCollisionShape = duplicateCollisionShape(source->mAvoidCollisionShape);
|
mAvoidCollisionShape = duplicateCollisionShape(source->mAvoidCollisionShape.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define OPENMW_COMPONENTS_RESOURCE_BULLETSHAPE_H
|
#define OPENMW_COMPONENTS_RESOURCE_BULLETSHAPE_H
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include <osg/Object>
|
#include <osg/Object>
|
||||||
#include <osg/ref_ptr>
|
#include <osg/ref_ptr>
|
||||||
|
@ -13,19 +14,24 @@ class btCollisionShape;
|
||||||
|
|
||||||
namespace Resource
|
namespace Resource
|
||||||
{
|
{
|
||||||
|
struct DeleteCollisionShape
|
||||||
|
{
|
||||||
|
void operator()(btCollisionShape* shape) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
using CollisionShapePtr = std::unique_ptr<btCollisionShape, DeleteCollisionShape>;
|
||||||
|
|
||||||
class BulletShapeInstance;
|
class BulletShapeInstance;
|
||||||
class BulletShape : public osg::Object
|
class BulletShape : public osg::Object
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BulletShape();
|
BulletShape() = default;
|
||||||
BulletShape(const BulletShape& copy, const osg::CopyOp& copyop);
|
BulletShape(const BulletShape& copy, const osg::CopyOp& copyop);
|
||||||
virtual ~BulletShape();
|
|
||||||
|
|
||||||
META_Object(Resource, BulletShape)
|
META_Object(Resource, BulletShape)
|
||||||
|
|
||||||
btCollisionShape* mCollisionShape;
|
CollisionShapePtr mCollisionShape;
|
||||||
btCollisionShape* mAvoidCollisionShape;
|
CollisionShapePtr mAvoidCollisionShape;
|
||||||
|
|
||||||
struct CollisionBox
|
struct CollisionBox
|
||||||
{
|
{
|
||||||
|
|
|
@ -92,7 +92,7 @@ public:
|
||||||
shape->mCollisionBox.mCenter = osg::Vec3f( (aabbMax[0] + aabbMin[0]) / 2.0f,
|
shape->mCollisionBox.mCenter = osg::Vec3f( (aabbMax[0] + aabbMin[0]) / 2.0f,
|
||||||
(aabbMax[1] + aabbMin[1]) / 2.0f,
|
(aabbMax[1] + aabbMin[1]) / 2.0f,
|
||||||
(aabbMax[2] + aabbMin[2]) / 2.0f );
|
(aabbMax[2] + aabbMin[2]) / 2.0f );
|
||||||
shape->mCollisionShape = triangleMeshShape;
|
shape->mCollisionShape.reset(triangleMeshShape);
|
||||||
|
|
||||||
return shape;
|
return shape;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue