Use the record index for finding the NiTriShape instead of the name

actorid
Chris Robinson 12 years ago
parent 660d73fd88
commit b23fcb260c

@ -206,7 +206,7 @@ void NIFFile::parse()
fail("Unsupported NIF version"); fail("Unsupported NIF version");
// Number of records // Number of records
int recNum = getInt(); size_t recNum = getInt();
records.resize(recNum); records.resize(recNum);
/* The format for 10.0.1.0 seems to be a bit different. After the /* The format for 10.0.1.0 seems to be a bit different. After the
@ -218,7 +218,7 @@ void NIFFile::parse()
we do not support or plan to support other versions yet. we do not support or plan to support other versions yet.
*/ */
for(int i=0;i<recNum;i++) for(size_t i = 0;i < recNum;i++)
{ {
std::string rec = getString(); std::string rec = getString();
//cout << i << ": " << rec.toString() << endl; //cout << i << ": " << rec.toString() << endl;
@ -330,7 +330,7 @@ void NIFFile::parse()
*/ */
// Once parsing is done, do post-processing. // Once parsing is done, do post-processing.
for(int i=0; i<recNum; i++) for(size_t i=0; i<recNum; i++)
records[i]->post(this); records[i]->post(this);
} }

@ -146,7 +146,7 @@ public:
} }
/// Number of records /// Number of records
int numRecords() { return records.size(); } size_t numRecords() { return records.size(); }
/************************************************* /*************************************************
Parser functions Parser functions

@ -695,9 +695,10 @@ class NIFMeshLoader : Ogre::ManualResourceLoader
{ {
std::string mName; std::string mName;
std::string mGroup; std::string mGroup;
std::string mShapeName; size_t mShapeIndex;
std::string mMaterialName;
std::string mSkelName; std::string mSkelName;
std::string mMaterialName;
std::string mShapeName;
void warn(const std::string &msg) void warn(const std::string &msg)
{ {
@ -805,7 +806,8 @@ class NIFMeshLoader : Ogre::ManualResourceLoader
Ogre::VertexDeclaration *decl; Ogre::VertexDeclaration *decl;
int nextBuf = 0; int nextBuf = 0;
Ogre::SubMesh *sub = mesh->createSubMesh(shape->name); Ogre::SubMesh *sub = ((mShapeName.length() > 0) ? mesh->createSubMesh(mShapeName) :
mesh->createSubMesh());
// Add vertices // Add vertices
sub->useSharedVertices = false; sub->useSharedVertices = false;
@ -912,13 +914,13 @@ class NIFMeshLoader : Ogre::ManualResourceLoader
bool findTriShape(Ogre::Mesh *mesh, Nif::Node const *node) bool findTriShape(Ogre::Mesh *mesh, Nif::Node const *node)
{ {
if(node->recType == Nif::RC_NiTriShape && mShapeName == node->name) if(node->recType == Nif::RC_NiTriShape && mShapeIndex == node->recIndex)
{ {
handleNiTriShape(mesh, dynamic_cast<Nif::NiTriShape const *>(node)); handleNiTriShape(mesh, dynamic_cast<const Nif::NiTriShape*>(node));
return true; return true;
} }
Nif::NiNode const *ninode = dynamic_cast<Nif::NiNode const *>(node); const Nif::NiNode *ninode = dynamic_cast<const Nif::NiNode*>(node);
if(ninode) if(ninode)
{ {
Nif::NodeList const &children = ninode->children; Nif::NodeList const &children = ninode->children;
@ -942,7 +944,7 @@ public:
NIFMeshLoader() NIFMeshLoader()
{ } { }
NIFMeshLoader(const std::string &name, const std::string &group, const std::string skelName) NIFMeshLoader(const std::string &name, const std::string &group, const std::string skelName)
: mName(name), mGroup(group), mSkelName(skelName) : mName(name), mGroup(group), mShapeIndex(~(size_t)0), mSkelName(skelName)
{ } { }
virtual void loadResource(Ogre::Resource *resource) virtual void loadResource(Ogre::Resource *resource)
@ -950,15 +952,14 @@ public:
Ogre::Mesh *mesh = dynamic_cast<Ogre::Mesh*>(resource); Ogre::Mesh *mesh = dynamic_cast<Ogre::Mesh*>(resource);
assert(mesh && "Attempting to load a mesh into a non-mesh resource!"); assert(mesh && "Attempting to load a mesh into a non-mesh resource!");
if(!mShapeName.length()) Nif::NIFFile::ptr nif = Nif::NIFFile::create(mName);
if(mShapeIndex >= nif->numRecords())
{ {
if(mSkelName.length() > 0) mesh->setSkeletonName(mSkelName);
mesh->setSkeletonName(mSkelName);
return; return;
} }
Nif::NIFFile::ptr nif = Nif::NIFFile::create (mName); Nif::Node const *node = dynamic_cast<const Nif::Node*>(nif->getRecord(mShapeIndex));
Nif::Node const *node = dynamic_cast<Nif::Node const *>(nif->getRecord(0));
findTriShape(mesh, node); findTriShape(mesh, node);
} }
@ -999,9 +1000,12 @@ public:
if(node->recType == Nif::RC_NiTriShape) if(node->recType == Nif::RC_NiTriShape)
{ {
const Nif::NiTriShape *shape = dynamic_cast<const Nif::NiTriShape*>(node); const Nif::NiTriShape *shape = dynamic_cast<const Nif::NiTriShape*>(node);
mShapeName = shape->name;
Ogre::MeshManager &meshMgr = Ogre::MeshManager::getSingleton(); Ogre::MeshManager &meshMgr = Ogre::MeshManager::getSingleton();
std::string fullname = mName+"@shape="+shape->name; std::string fullname = mName+"@index="+Ogre::StringConverter::toString(shape->recIndex);
if(mShapeName.length() > 0)
fullname += "@shape="+mShapeName;
if(mSkelName.length() > 0 && mName != mSkelName) if(mSkelName.length() > 0 && mName != mSkelName)
fullname += "@skel="+mSkelName; fullname += "@skel="+mSkelName;
@ -1013,7 +1017,7 @@ public:
*loader = *this; *loader = *this;
if(!(flags&0x01)) // Not hidden if(!(flags&0x01)) // Not hidden
{ {
loader->mShapeName = shape->name; loader->mShapeIndex = shape->recIndex;
loader->mMaterialName = NIFMaterialLoader::getMaterial(shape, fullname, mGroup); loader->mMaterialName = NIFMaterialLoader::getMaterial(shape, fullname, mGroup);
} }

Loading…
Cancel
Save