1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-04-16 08:42:23 +00:00

Modernize NiTriStripsData

This commit is contained in:
Alexei Kotov 2023-09-03 17:41:52 +03:00
parent fda6b0b4f8
commit eba0ab444b
5 changed files with 19 additions and 20 deletions

View File

@ -338,7 +338,7 @@ namespace
mNiTriStripsData.vertices mNiTriStripsData.vertices
= { osg::Vec3f(0, 0, 0), osg::Vec3f(1, 0, 0), osg::Vec3f(1, 1, 0), osg::Vec3f(0, 1, 0) }; = { osg::Vec3f(0, 0, 0), osg::Vec3f(1, 0, 0), osg::Vec3f(1, 1, 0), osg::Vec3f(0, 1, 0) };
mNiTriStripsData.mNumTriangles = 2; mNiTriStripsData.mNumTriangles = 2;
mNiTriStripsData.strips = { { 0, 1, 2, 3 } }; mNiTriStripsData.mStrips = { { 0, 1, 2, 3 } };
mNiTriStrips.data = Nif::NiGeometryDataPtr(&mNiTriStripsData); mNiTriStrips.data = Nif::NiGeometryDataPtr(&mNiTriStripsData);
} }
}; };
@ -1260,7 +1260,7 @@ namespace
TEST_F(TestBulletNifLoader, should_ignore_tri_strips_data_with_empty_strips) TEST_F(TestBulletNifLoader, should_ignore_tri_strips_data_with_empty_strips)
{ {
mNiTriStripsData.strips.clear(); mNiTriStripsData.mStrips.clear();
Nif::NIFFile file("test.nif"); Nif::NIFFile file("test.nif");
file.mRoots.push_back(&mNiTriStrips); file.mRoots.push_back(&mNiTriStrips);
@ -1275,7 +1275,7 @@ namespace
TEST_F(TestBulletNifLoader, for_static_mesh_should_ignore_tri_strips_data_with_less_than_3_strips) TEST_F(TestBulletNifLoader, for_static_mesh_should_ignore_tri_strips_data_with_less_than_3_strips)
{ {
mNiTriStripsData.strips.front() = { 0, 1 }; mNiTriStripsData.mStrips.front() = { 0, 1 };
Nif::NIFFile file("test.nif"); Nif::NIFFile file("test.nif");
file.mRoots.push_back(&mNiTriStrips); file.mRoots.push_back(&mNiTriStrips);
@ -1293,7 +1293,7 @@ namespace
mNiTriShape.parents.push_back(&mNiNode); mNiTriShape.parents.push_back(&mNiNode);
mNiNode.children = Nif::NodeList(std::vector<Nif::NodePtr>({ Nif::NodePtr(&mNiTriShape) })); mNiNode.children = Nif::NodeList(std::vector<Nif::NodePtr>({ Nif::NodePtr(&mNiTriShape) }));
mNiNode.recType = Nif::RC_AvoidNode; mNiNode.recType = Nif::RC_AvoidNode;
mNiTriStripsData.strips.front() = { 0, 1 }; mNiTriStripsData.mStrips.front() = { 0, 1 };
Nif::NIFFile file("test.nif"); Nif::NIFFile file("test.nif");
file.mRoots.push_back(&mNiTriStrips); file.mRoots.push_back(&mNiTriStrips);
@ -1308,7 +1308,7 @@ namespace
TEST_F(TestBulletNifLoader, for_animated_mesh_should_ignore_tri_strips_data_with_less_than_3_strips) TEST_F(TestBulletNifLoader, for_animated_mesh_should_ignore_tri_strips_data_with_less_than_3_strips)
{ {
mNiTriStripsData.strips.front() = { 0, 1 }; mNiTriStripsData.mStrips.front() = { 0, 1 };
mNiTriStrips.parents.push_back(&mNiNode); mNiTriStrips.parents.push_back(&mNiNode);
mNiNode.children = Nif::NodeList(std::vector<Nif::NodePtr>({ Nif::NodePtr(&mNiTriStrips) })); mNiNode.children = Nif::NodeList(std::vector<Nif::NodePtr>({ Nif::NodePtr(&mNiTriStrips) }));
@ -1325,7 +1325,7 @@ namespace
TEST_F(TestBulletNifLoader, should_not_add_static_mesh_with_no_triangles_to_compound_shape) TEST_F(TestBulletNifLoader, should_not_add_static_mesh_with_no_triangles_to_compound_shape)
{ {
mNiTriStripsData.strips.front() = { 0, 1 }; mNiTriStripsData.mStrips.front() = { 0, 1 };
mNiTriShape.parents.push_back(&mNiNode); mNiTriShape.parents.push_back(&mNiNode);
mNiNode.children = Nif::NodeList(std::vector<Nif::NodePtr>({ Nif::NodePtr(&mNiTriShape) })); mNiNode.children = Nif::NodeList(std::vector<Nif::NodePtr>({ Nif::NodePtr(&mNiTriShape) }));

View File

@ -1,10 +1,11 @@
#include "data.hpp" #include "data.hpp"
#include <components/debug/debuglog.hpp>
#include "exception.hpp" #include "exception.hpp"
#include "nifkey.hpp" #include "nifkey.hpp"
#include "node.hpp" #include "node.hpp"
#include <components/debug/debuglog.hpp>
namespace Nif namespace Nif
{ {
void NiGeometryData::read(NIFStream* nif) void NiGeometryData::read(NIFStream* nif)
@ -117,22 +118,20 @@ namespace Nif
{ {
NiTriBasedGeomData::read(nif); NiTriBasedGeomData::read(nif);
// Number of triangle strips uint16_t numStrips;
int numStrips = nif->getUShort(); nif->read(numStrips);
std::vector<uint16_t> lengths;
std::vector<unsigned short> lengths;
nif->readVector(lengths, numStrips); nif->readVector(lengths, numStrips);
// "Has Strips" flag. Exceptionally useful.
bool hasStrips = true; bool hasStrips = true;
if (nif->getVersion() > NIFFile::NIFVersion::VER_OB_OLD) if (nif->getVersion() > NIFFile::NIFVersion::VER_OB_OLD)
hasStrips = nif->getBoolean(); nif->read(hasStrips);
if (!hasStrips || !numStrips) if (!hasStrips || !numStrips)
return; return;
strips.resize(numStrips); mStrips.resize(numStrips);
for (int i = 0; i < numStrips; i++) for (int i = 0; i < numStrips; i++)
nif->readVector(strips[i], lengths[i]); nif->readVector(mStrips[i], lengths[i]);
} }
void NiLinesData::read(NIFStream* nif) void NiLinesData::read(NIFStream* nif)

View File

@ -63,7 +63,7 @@ namespace Nif
struct NiTriStripsData : public NiTriBasedGeomData struct NiTriStripsData : public NiTriBasedGeomData
{ {
// Triangle strips, series of vertex indices. // Triangle strips, series of vertex indices.
std::vector<std::vector<unsigned short>> strips; std::vector<std::vector<unsigned short>> mStrips;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };

View File

@ -54,7 +54,7 @@ namespace
void fillTriangleMesh(btTriangleMesh& mesh, const Nif::NiTriStripsData& data) void fillTriangleMesh(btTriangleMesh& mesh, const Nif::NiTriStripsData& data)
{ {
prepareTriangleMesh(mesh, data); prepareTriangleMesh(mesh, data);
for (const std::vector<unsigned short>& strip : data.strips) for (const std::vector<unsigned short>& strip : data.mStrips)
{ {
if (strip.size() < 3) if (strip.size() < 3)
continue; continue;
@ -99,7 +99,7 @@ namespace
return {}; return {};
auto data = static_cast<const Nif::NiTriStripsData*>(geometry.data.getPtr()); auto data = static_cast<const Nif::NiTriStripsData*>(geometry.data.getPtr());
if (data->strips.empty()) if (data->mStrips.empty())
return {}; return {};
return function(static_cast<const Nif::NiTriStripsData&>(*data)); return function(static_cast<const Nif::NiTriStripsData&>(*data));

View File

@ -1442,7 +1442,7 @@ namespace NifOsg
return; return;
auto data = static_cast<const Nif::NiTriStripsData*>(niGeometryData); auto data = static_cast<const Nif::NiTriStripsData*>(niGeometryData);
bool hasGeometry = false; bool hasGeometry = false;
for (const std::vector<unsigned short>& strip : data->strips) for (const std::vector<unsigned short>& strip : data->mStrips)
{ {
if (strip.size() < 3) if (strip.size() < 3)
continue; continue;