mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-26 09:35:28 +00:00
Refactor NiBoundingVolume
This commit is contained in:
parent
5b0bc97db0
commit
deb051639e
@ -415,9 +415,9 @@ namespace
|
|||||||
TestBulletNifLoader, for_root_nif_node_with_bounding_box_should_return_shape_with_compound_shape_and_box_inside)
|
TestBulletNifLoader, for_root_nif_node_with_bounding_box_should_return_shape_with_compound_shape_and_box_inside)
|
||||||
{
|
{
|
||||||
mNode.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
mNode.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
||||||
mNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNode.mBounds.box.extents = osg::Vec3f(1, 2, 3);
|
mNode.mBounds.mBox.mExtents = osg::Vec3f(1, 2, 3);
|
||||||
mNode.mBounds.box.center = osg::Vec3f(-1, -2, -3);
|
mNode.mBounds.mBox.mCenter = osg::Vec3f(-1, -2, -3);
|
||||||
|
|
||||||
Nif::NIFFile file("test.nif");
|
Nif::NIFFile file("test.nif");
|
||||||
file.mRoots.push_back(&mNode);
|
file.mRoots.push_back(&mNode);
|
||||||
@ -439,9 +439,9 @@ namespace
|
|||||||
TEST_F(TestBulletNifLoader, for_child_nif_node_with_bounding_box)
|
TEST_F(TestBulletNifLoader, for_child_nif_node_with_bounding_box)
|
||||||
{
|
{
|
||||||
mNode.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
mNode.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
||||||
mNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNode.mBounds.box.extents = osg::Vec3f(1, 2, 3);
|
mNode.mBounds.mBox.mExtents = osg::Vec3f(1, 2, 3);
|
||||||
mNode.mBounds.box.center = osg::Vec3f(-1, -2, -3);
|
mNode.mBounds.mBox.mCenter = osg::Vec3f(-1, -2, -3);
|
||||||
mNode.mParents.push_back(&mNiNode);
|
mNode.mParents.push_back(&mNiNode);
|
||||||
mNiNode.mChildren = Nif::NiAVObjectList{ Nif::NiAVObjectPtr(&mNode) };
|
mNiNode.mChildren = Nif::NiAVObjectList{ Nif::NiAVObjectPtr(&mNode) };
|
||||||
|
|
||||||
@ -466,14 +466,14 @@ namespace
|
|||||||
for_root_and_child_nif_node_with_bounding_box_but_root_without_flag_should_use_child_bounds)
|
for_root_and_child_nif_node_with_bounding_box_but_root_without_flag_should_use_child_bounds)
|
||||||
{
|
{
|
||||||
mNode.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
mNode.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
||||||
mNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNode.mBounds.box.extents = osg::Vec3f(1, 2, 3);
|
mNode.mBounds.mBox.mExtents = osg::Vec3f(1, 2, 3);
|
||||||
mNode.mBounds.box.center = osg::Vec3f(-1, -2, -3);
|
mNode.mBounds.mBox.mCenter = osg::Vec3f(-1, -2, -3);
|
||||||
mNode.mParents.push_back(&mNiNode);
|
mNode.mParents.push_back(&mNiNode);
|
||||||
|
|
||||||
mNiNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNiNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNiNode.mBounds.box.extents = osg::Vec3f(4, 5, 6);
|
mNiNode.mBounds.mBox.mExtents = osg::Vec3f(4, 5, 6);
|
||||||
mNiNode.mBounds.box.center = osg::Vec3f(-4, -5, -6);
|
mNiNode.mBounds.mBox.mCenter = osg::Vec3f(-4, -5, -6);
|
||||||
mNiNode.mChildren = Nif::NiAVObjectList{ Nif::NiAVObjectPtr(&mNode) };
|
mNiNode.mChildren = Nif::NiAVObjectList{ Nif::NiAVObjectPtr(&mNode) };
|
||||||
|
|
||||||
Nif::NIFFile file("test.nif");
|
Nif::NIFFile file("test.nif");
|
||||||
@ -497,19 +497,19 @@ namespace
|
|||||||
for_root_and_two_children_where_both_with_bounds_but_only_first_with_flag_should_use_first_bounds)
|
for_root_and_two_children_where_both_with_bounds_but_only_first_with_flag_should_use_first_bounds)
|
||||||
{
|
{
|
||||||
mNode.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
mNode.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
||||||
mNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNode.mBounds.box.extents = osg::Vec3f(1, 2, 3);
|
mNode.mBounds.mBox.mExtents = osg::Vec3f(1, 2, 3);
|
||||||
mNode.mBounds.box.center = osg::Vec3f(-1, -2, -3);
|
mNode.mBounds.mBox.mCenter = osg::Vec3f(-1, -2, -3);
|
||||||
mNode.mParents.push_back(&mNiNode);
|
mNode.mParents.push_back(&mNiNode);
|
||||||
|
|
||||||
mNode2.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNode2.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNode2.mBounds.box.extents = osg::Vec3f(4, 5, 6);
|
mNode2.mBounds.mBox.mExtents = osg::Vec3f(4, 5, 6);
|
||||||
mNode2.mBounds.box.center = osg::Vec3f(-4, -5, -6);
|
mNode2.mBounds.mBox.mCenter = osg::Vec3f(-4, -5, -6);
|
||||||
mNode2.mParents.push_back(&mNiNode);
|
mNode2.mParents.push_back(&mNiNode);
|
||||||
|
|
||||||
mNiNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNiNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNiNode.mBounds.box.extents = osg::Vec3f(7, 8, 9);
|
mNiNode.mBounds.mBox.mExtents = osg::Vec3f(7, 8, 9);
|
||||||
mNiNode.mBounds.box.center = osg::Vec3f(-7, -8, -9);
|
mNiNode.mBounds.mBox.mCenter = osg::Vec3f(-7, -8, -9);
|
||||||
mNiNode.mChildren = Nif::NiAVObjectList{ Nif::NiAVObjectPtr(&mNode), Nif::NiAVObjectPtr(&mNode2) };
|
mNiNode.mChildren = Nif::NiAVObjectList{ Nif::NiAVObjectPtr(&mNode), Nif::NiAVObjectPtr(&mNode2) };
|
||||||
|
|
||||||
Nif::NIFFile file("test.nif");
|
Nif::NIFFile file("test.nif");
|
||||||
@ -532,20 +532,20 @@ namespace
|
|||||||
TEST_F(TestBulletNifLoader,
|
TEST_F(TestBulletNifLoader,
|
||||||
for_root_and_two_children_where_both_with_bounds_but_only_second_with_flag_should_use_second_bounds)
|
for_root_and_two_children_where_both_with_bounds_but_only_second_with_flag_should_use_second_bounds)
|
||||||
{
|
{
|
||||||
mNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNode.mBounds.box.extents = osg::Vec3f(1, 2, 3);
|
mNode.mBounds.mBox.mExtents = osg::Vec3f(1, 2, 3);
|
||||||
mNode.mBounds.box.center = osg::Vec3f(-1, -2, -3);
|
mNode.mBounds.mBox.mCenter = osg::Vec3f(-1, -2, -3);
|
||||||
mNode.mParents.push_back(&mNiNode);
|
mNode.mParents.push_back(&mNiNode);
|
||||||
|
|
||||||
mNode2.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
mNode2.mFlags |= Nif::NiAVObject::Flag_BBoxCollision;
|
||||||
mNode2.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNode2.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNode2.mBounds.box.extents = osg::Vec3f(4, 5, 6);
|
mNode2.mBounds.mBox.mExtents = osg::Vec3f(4, 5, 6);
|
||||||
mNode2.mBounds.box.center = osg::Vec3f(-4, -5, -6);
|
mNode2.mBounds.mBox.mCenter = osg::Vec3f(-4, -5, -6);
|
||||||
mNode2.mParents.push_back(&mNiNode);
|
mNode2.mParents.push_back(&mNiNode);
|
||||||
|
|
||||||
mNiNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNiNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNiNode.mBounds.box.extents = osg::Vec3f(7, 8, 9);
|
mNiNode.mBounds.mBox.mExtents = osg::Vec3f(7, 8, 9);
|
||||||
mNiNode.mBounds.box.center = osg::Vec3f(-7, -8, -9);
|
mNiNode.mBounds.mBox.mCenter = osg::Vec3f(-7, -8, -9);
|
||||||
mNiNode.mChildren = Nif::NiAVObjectList{ Nif::NiAVObjectPtr(&mNode), Nif::NiAVObjectPtr(&mNode2) };
|
mNiNode.mChildren = Nif::NiAVObjectList{ Nif::NiAVObjectPtr(&mNode), Nif::NiAVObjectPtr(&mNode2) };
|
||||||
|
|
||||||
Nif::NIFFile file("test.nif");
|
Nif::NIFFile file("test.nif");
|
||||||
@ -568,9 +568,9 @@ namespace
|
|||||||
TEST_F(TestBulletNifLoader,
|
TEST_F(TestBulletNifLoader,
|
||||||
for_root_nif_node_with_bounds_but_without_flag_should_return_shape_with_bounds_but_with_null_collision_shape)
|
for_root_nif_node_with_bounds_but_without_flag_should_return_shape_with_bounds_but_with_null_collision_shape)
|
||||||
{
|
{
|
||||||
mNode.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNode.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNode.mBounds.box.extents = osg::Vec3f(1, 2, 3);
|
mNode.mBounds.mBox.mExtents = osg::Vec3f(1, 2, 3);
|
||||||
mNode.mBounds.box.center = osg::Vec3f(-1, -2, -3);
|
mNode.mBounds.mBox.mCenter = osg::Vec3f(-1, -2, -3);
|
||||||
|
|
||||||
Nif::NIFFile file("test.nif");
|
Nif::NIFFile file("test.nif");
|
||||||
file.mRoots.push_back(&mNode);
|
file.mRoots.push_back(&mNode);
|
||||||
@ -608,9 +608,9 @@ namespace
|
|||||||
TEST_F(TestBulletNifLoader,
|
TEST_F(TestBulletNifLoader,
|
||||||
for_tri_shape_root_node_with_bounds_should_return_static_shape_with_bounds_but_with_null_collision_shape)
|
for_tri_shape_root_node_with_bounds_should_return_static_shape_with_bounds_but_with_null_collision_shape)
|
||||||
{
|
{
|
||||||
mNiTriShape.mBounds.type = Nif::NiBoundingVolume::Type::BOX_BV;
|
mNiTriShape.mBounds.mType = Nif::NiBoundingVolume::Type::BOX_BV;
|
||||||
mNiTriShape.mBounds.box.extents = osg::Vec3f(1, 2, 3);
|
mNiTriShape.mBounds.mBox.mExtents = osg::Vec3f(1, 2, 3);
|
||||||
mNiTriShape.mBounds.box.center = osg::Vec3f(-1, -2, -3);
|
mNiTriShape.mBounds.mBox.mCenter = osg::Vec3f(-1, -2, -3);
|
||||||
|
|
||||||
Nif::NIFFile file("test.nif");
|
Nif::NIFFile file("test.nif");
|
||||||
file.mRoots.push_back(&mNiTriShape);
|
file.mRoots.push_back(&mNiTriShape);
|
||||||
|
@ -14,8 +14,8 @@ namespace Nif
|
|||||||
|
|
||||||
void NiBoundingVolume::read(NIFStream* nif)
|
void NiBoundingVolume::read(NIFStream* nif)
|
||||||
{
|
{
|
||||||
nif->read(type);
|
nif->read(mType);
|
||||||
switch (type)
|
switch (mType)
|
||||||
{
|
{
|
||||||
case BASE_BV:
|
case BASE_BV:
|
||||||
break;
|
break;
|
||||||
@ -26,9 +26,9 @@ namespace Nif
|
|||||||
}
|
}
|
||||||
case BOX_BV:
|
case BOX_BV:
|
||||||
{
|
{
|
||||||
nif->read(box.center);
|
nif->read(mBox.mCenter);
|
||||||
nif->read(box.axes);
|
nif->read(mBox.mAxes);
|
||||||
nif->read(box.extents);
|
nif->read(mBox.mExtents);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CAPSULE_BV:
|
case CAPSULE_BV:
|
||||||
@ -69,7 +69,7 @@ namespace Nif
|
|||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
throw Nif::Exception(
|
throw Nif::Exception(
|
||||||
"Unhandled NiBoundingVolume type: " + std::to_string(type), nif->getFile().getFilename());
|
"Unhandled NiBoundingVolume type: " + std::to_string(mType), nif->getFile().getFilename());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,9 +28,9 @@ namespace Nif
|
|||||||
|
|
||||||
struct NiBoxBV
|
struct NiBoxBV
|
||||||
{
|
{
|
||||||
osg::Vec3f center;
|
osg::Vec3f mCenter;
|
||||||
Matrix3 axes;
|
Matrix3 mAxes;
|
||||||
osg::Vec3f extents;
|
osg::Vec3f mExtents;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NiCapsuleBV
|
struct NiCapsuleBV
|
||||||
@ -51,9 +51,9 @@ namespace Nif
|
|||||||
osg::Vec3f mOrigin;
|
osg::Vec3f mOrigin;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint32_t type{ BASE_BV };
|
uint32_t mType{ BASE_BV };
|
||||||
osg::BoundingSpheref mSphere;
|
osg::BoundingSpheref mSphere;
|
||||||
NiBoxBV box;
|
NiBoxBV mBox;
|
||||||
NiCapsuleBV mCapsule;
|
NiCapsuleBV mCapsule;
|
||||||
NiLozengeBV mLozenge;
|
NiLozengeBV mLozenge;
|
||||||
std::vector<NiBoundingVolume> mChildren;
|
std::vector<NiBoundingVolume> mChildren;
|
||||||
|
@ -181,7 +181,7 @@ namespace NifBullet
|
|||||||
bool hasCollisionShape = false;
|
bool hasCollisionShape = false;
|
||||||
if (colNode != nullptr)
|
if (colNode != nullptr)
|
||||||
{
|
{
|
||||||
if (colNode->mBounds.type == Nif::NiBoundingVolume::Type::BASE_BV && !colNode->mChildren.empty())
|
if (colNode->mBounds.mType == Nif::NiBoundingVolume::Type::BASE_BV && !colNode->mChildren.empty())
|
||||||
hasCollisionShape = true;
|
hasCollisionShape = true;
|
||||||
else
|
else
|
||||||
mShape->mVisualCollisionType = Resource::VisualCollisionType::Camera;
|
mShape->mVisualCollisionType = Resource::VisualCollisionType::Camera;
|
||||||
@ -205,14 +205,14 @@ namespace NifBullet
|
|||||||
// Return: use bounding box for collision?
|
// Return: use bounding box for collision?
|
||||||
bool BulletNifLoader::findBoundingBox(const Nif::NiAVObject& node, const std::string& filename)
|
bool BulletNifLoader::findBoundingBox(const Nif::NiAVObject& node, const std::string& filename)
|
||||||
{
|
{
|
||||||
unsigned int type = node.mBounds.type;
|
unsigned int type = node.mBounds.mType;
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case Nif::NiBoundingVolume::Type::BASE_BV:
|
case Nif::NiBoundingVolume::Type::BASE_BV:
|
||||||
break;
|
break;
|
||||||
case Nif::NiBoundingVolume::Type::BOX_BV:
|
case Nif::NiBoundingVolume::Type::BOX_BV:
|
||||||
mShape->mCollisionBox.mExtents = node.mBounds.box.extents;
|
mShape->mCollisionBox.mExtents = node.mBounds.mBox.mExtents;
|
||||||
mShape->mCollisionBox.mCenter = node.mBounds.box.center;
|
mShape->mCollisionBox.mCenter = node.mBounds.mBox.mCenter;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
@ -335,7 +335,7 @@ namespace NifBullet
|
|||||||
// NOTE: a trishape with bounds, but no BBoxCollision flag should NOT go through handleNiTriShape!
|
// NOTE: a trishape with bounds, but no BBoxCollision flag should NOT go through handleNiTriShape!
|
||||||
// It must be ignored completely.
|
// It must be ignored completely.
|
||||||
// (occurs in tr_ex_imp_wall_arch_04.nif)
|
// (occurs in tr_ex_imp_wall_arch_04.nif)
|
||||||
if (node.mBounds.type == Nif::NiBoundingVolume::Type::BASE_BV
|
if (node.mBounds.mType == Nif::NiBoundingVolume::Type::BASE_BV
|
||||||
&& (node.recType == Nif::RC_NiTriShape || node.recType == Nif::RC_NiTriStrips
|
&& (node.recType == Nif::RC_NiTriShape || node.recType == Nif::RC_NiTriStrips
|
||||||
|| node.recType == Nif::RC_BSLODTriShape))
|
|| node.recType == Nif::RC_BSLODTriShape))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user