Added: #1440 Extended parser for CTrackViewNode

--HG--
branch : build_pipeline_v3
hg/feature/build_pipeline_v3
kaetemi 12 years ago
parent 028c5381d1
commit f5d2048f7c

@ -59,12 +59,15 @@ namespace BUILTIN {
#define PMB_REFERENCES_2034_CHUNK_ID 0x2034 #define PMB_REFERENCES_2034_CHUNK_ID 0x2034
#define PMB_REFERENCES_2035_CHUNK_ID 0x2035 #define PMB_REFERENCES_2035_CHUNK_ID 0x2035
#define PMB_204B_EQUALS_2E_CHUNK_ID 0x204B #define PMB_204B_EQUALS_2E_CHUNK_ID 0x204B
#define PMB_UNKNOWN2045_CHUNK_ID 0x2045
#define PMB_UNKNOWN2047_CHUNK_ID 0x2047
#define PMB_UNKNOWN21B0_CHUNK_ID 0x21B0
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
CReferenceMaker::CReferenceMaker(CScene *scene) : CAnimatable(scene), m_ReferenceMap(false), m_References2035Value0(0) CReferenceMaker::CReferenceMaker(CScene *scene) : CAnimatable(scene), m_ReferenceMap(false), m_204B_Equals_2E(NULL), m_References2035Value0(0), m_Unknown2045(NULL), m_Unknown2047(NULL), m_Unknown21B0(NULL)
{ {
} }
@ -75,6 +78,12 @@ CReferenceMaker::~CReferenceMaker()
{ {
delete m_204B_Equals_2E; delete m_204B_Equals_2E;
m_204B_Equals_2E = NULL; m_204B_Equals_2E = NULL;
delete m_Unknown2045;
m_Unknown2045 = NULL;
delete m_Unknown2047;
m_Unknown2047 = NULL;
delete m_Unknown21B0;
m_Unknown21B0 = NULL;
} }
} }
@ -132,6 +141,10 @@ void CReferenceMaker::parse(uint16 version)
setReference(index, referenceMaker); setReference(index, referenceMaker);
} }
} }
m_Unknown2045 = static_cast<CStorageRaw *>(getChunk(PMB_UNKNOWN2045_CHUNK_ID)); // not sure if this is part of maker or target
m_Unknown2047 = static_cast<CStorageRaw *>(getChunk(PMB_UNKNOWN2047_CHUNK_ID)); // not sure if this is part of maker or target
m_Unknown21B0 = static_cast<CStorageRaw *>(getChunk(PMB_UNKNOWN21B0_CHUNK_ID)); // not sure if this is part of maker or target
} }
} }
@ -178,6 +191,9 @@ void CReferenceMaker::build(uint16 version)
m_ArchivedChunks.push_back(references2035); m_ArchivedChunks.push_back(references2035);
} }
if (m_204B_Equals_2E) putChunk(PMB_204B_EQUALS_2E_CHUNK_ID, m_204B_Equals_2E); if (m_204B_Equals_2E) putChunk(PMB_204B_EQUALS_2E_CHUNK_ID, m_204B_Equals_2E);
if (m_Unknown2045) putChunk(PMB_UNKNOWN2045_CHUNK_ID, m_Unknown2045);
if (m_Unknown2047) putChunk(PMB_UNKNOWN2047_CHUNK_ID, m_Unknown2047);
if (m_Unknown21B0) putChunk(PMB_UNKNOWN21B0_CHUNK_ID, m_Unknown21B0);
} }
void CReferenceMaker::disown() void CReferenceMaker::disown()
@ -186,6 +202,9 @@ void CReferenceMaker::disown()
m_ReferenceMap = false; m_ReferenceMap = false;
m_References2035Value0 = 0; m_References2035Value0 = 0;
m_204B_Equals_2E = NULL; m_204B_Equals_2E = NULL;
m_Unknown2045 = NULL;
m_Unknown2047 = NULL;
m_Unknown21B0 = NULL;
CAnimatable::disown(); CAnimatable::disown();
} }
@ -240,6 +259,21 @@ void CReferenceMaker::toStringLocal(std::ostream &ostream, const std::string &pa
ostream << "\n" << pad << "0x204B Equals 0x2E (46): "; ostream << "\n" << pad << "0x204B Equals 0x2E (46): ";
m_204B_Equals_2E->toString(ostream, pad + "\t"); m_204B_Equals_2E->toString(ostream, pad + "\t");
} }
if (m_Unknown2045)
{
ostream << "\n" << pad << "Unknown 0x2045: ";
m_Unknown2045->toString(ostream, pad + "\t");
}
if (m_Unknown2047)
{
ostream << "\n" << pad << "Unknown 0x2047: ";
m_Unknown2047->toString(ostream, pad + "\t");
}
if (m_Unknown21B0)
{
ostream << "\n" << pad << "Unknown 0x21B0: ";
m_Unknown21B0->toString(ostream, pad + "\t");
}
} }
CReferenceMaker *CReferenceMaker::getReference(uint index) const CReferenceMaker *CReferenceMaker::getReference(uint index) const
@ -269,6 +303,8 @@ IStorageObject *CReferenceMaker::createChunkById(uint16 id, bool container)
return new CStorageArray<sint32>(); return new CStorageArray<sint32>();
case PMB_204B_EQUALS_2E_CHUNK_ID: case PMB_204B_EQUALS_2E_CHUNK_ID:
return new CStorageValue<uint8>(); return new CStorageValue<uint8>();
case PMB_UNKNOWN21B0_CHUNK_ID:
return new CStorageRaw();
} }
return CAnimatable::createChunkById(id, container); return CAnimatable::createChunkById(id, container);
} }

@ -90,6 +90,10 @@ private:
/// Unknown value /// Unknown value
uint32 m_References2035Value0; uint32 m_References2035Value0;
CStorageRaw *m_Unknown2045;
CStorageRaw *m_Unknown2047;
CStorageRaw *m_Unknown21B0;
}; /* class CReferenceMaker */ }; /* class CReferenceMaker */
typedef CSceneClassDesc<CReferenceMaker> CReferenceMakerClassDesc; typedef CSceneClassDesc<CReferenceMaker> CReferenceMakerClassDesc;

@ -29,6 +29,7 @@
#include "track_view_node.h" #include "track_view_node.h"
// STL includes // STL includes
#include <iomanip>
// NeL includes // NeL includes
// #include <nel/misc/debug.h> // #include <nel/misc/debug.h>
@ -49,7 +50,7 @@ namespace BUILTIN {
#define PMB_TVNODE_IDENTIFIER_CHUNK_ID 0x0120 #define PMB_TVNODE_IDENTIFIER_CHUNK_ID 0x0120
#define PMB_TVNODE_INTEGER0130_CHUNK_ID 0x0130 /* type? */ #define PMB_TVNODE_INTEGER0130_CHUNK_ID 0x0130 /* type? */
CTrackViewNode::CTrackViewNode(CScene *scene) : CReferenceTarget(scene) CTrackViewNode::CTrackViewNode(CScene *scene) : CReferenceTarget(scene), m_Empty0140(NULL), m_Empty0150(NULL)
{ {
} }
@ -68,6 +69,33 @@ const CTrackViewNodeClassDesc TrackViewNodeClassDesc(&DllPluginDescBuiltin);
void CTrackViewNode::parse(uint16 version) void CTrackViewNode::parse(uint16 version)
{ {
CReferenceTarget::parse(version); CReferenceTarget::parse(version);
if (!m_ChunksOwnsPointers)
{
// Read unknown chunks
m_Empty0140 = static_cast<CStorageRaw *>(getChunk(PMB_TVNODE_EMPTY0140_CHUNK_ID));
if (m_Empty0140) nlassert(m_Empty0140->Value.empty());
m_Empty0150 = static_cast<CStorageRaw *>(getChunk(PMB_TVNODE_EMPTY0150_CHUNK_ID));
if (m_Empty0150) nlassert(m_Empty0140->Value.empty());
// Read child nodes
for (std::vector<TChild>::size_type i = 0; i < m_Children.size(); ++i)
{
CStorageValue<ucstring> *displayName = static_cast<CStorageValue<ucstring> *>(getChunk(PMB_TVNODE_DISPLAYNAME_CHUNK_ID));
nlassert(displayName);
m_ArchivedChunks.push_back(displayName);
m_Children[i].DisplayName = displayName->Value;
CStorageValue<NLMISC::CClassId> *identifier = static_cast<CStorageValue<NLMISC::CClassId> *>(getChunk(PMB_TVNODE_IDENTIFIER_CHUNK_ID));
nlassert(identifier);
m_ArchivedChunks.push_back(identifier);
m_Children[i].Identifier = identifier->Value;
CStorageValue<sint32> *integer0130 = static_cast<CStorageValue<sint32> *>(getChunk(PMB_TVNODE_INTEGER0130_CHUNK_ID));
nlassert(integer0130);
m_ArchivedChunks.push_back(integer0130);
m_Children[i].Integer0130 = integer0130->Value;
}
}
} }
void CTrackViewNode::clean() void CTrackViewNode::clean()
@ -78,6 +106,29 @@ void CTrackViewNode::clean()
void CTrackViewNode::build(uint16 version) void CTrackViewNode::build(uint16 version)
{ {
CReferenceTarget::build(version); CReferenceTarget::build(version);
// Write unknown chunks
if (m_Empty0140) putChunk(PMB_TVNODE_EMPTY0140_CHUNK_ID, m_Empty0140);
if (m_Empty0150) putChunk(PMB_TVNODE_EMPTY0150_CHUNK_ID, m_Empty0150);
// Write child nodes
for (std::vector<TChild>::size_type i = 0; i < m_Children.size(); ++i)
{
CStorageValue<ucstring> *displayName = new CStorageValue<ucstring>();
displayName->Value = m_Children[i].DisplayName;
m_ArchivedChunks.push_back(displayName);
putChunk(PMB_TVNODE_DISPLAYNAME_CHUNK_ID, displayName);
CStorageValue<NLMISC::CClassId> *identifier = new CStorageValue<NLMISC::CClassId>();
identifier->Value = m_Children[i].Identifier;
m_ArchivedChunks.push_back(identifier);
putChunk(PMB_TVNODE_IDENTIFIER_CHUNK_ID, identifier);
CStorageValue<sint32> *integer0130 = new CStorageValue<sint32>();
integer0130->Value = m_Children[i].Integer0130;
m_ArchivedChunks.push_back(integer0130);
putChunk(PMB_TVNODE_INTEGER0130_CHUNK_ID, integer0130);
}
} }
void CTrackViewNode::disown() void CTrackViewNode::disown()
@ -104,25 +155,43 @@ const ISceneClassDesc *CTrackViewNode::classDesc() const
void CTrackViewNode::toStringLocal(std::ostream &ostream, const std::string &pad) const void CTrackViewNode::toStringLocal(std::ostream &ostream, const std::string &pad) const
{ {
CReferenceTarget::toStringLocal(ostream, pad); CReferenceTarget::toStringLocal(ostream, pad);
if (m_Empty0140) ostream << "\n" << pad << "Empty 0x0140 ";
if (m_Empty0150) ostream << "\n" << pad << "Empty 0x0150 ";
// std::string padpad = pad + "\t";
for (std::vector<TChild>::size_type i = 0; i < m_Children.size(); ++i)
{
CReferenceMaker *referenceMaker = m_Children[i].Reference;
nlassert(referenceMaker);
ostream << "\n" << pad << i << ": <ptr=0x";
{
std::stringstream ss;
ss << std::hex << std::setfill('0');
ss << std::setw(16) << (uint64)(void *)referenceMaker;
ostream << ss.str();
}
ostream << "> ";
ostream << "(" << ucstring(referenceMaker->classDesc()->displayName()).toUtf8() << ", " << referenceMaker->classDesc()->classId().toString() << ") ";
ostream << "(" << m_Children[i].DisplayName.toUtf8() << ", " << m_Children[i].Identifier.toString() << ", " << m_Children[i].Integer0130 << ") ";
}
} }
/*
CReferenceMaker *CTrackViewNode::getReference(uint index) const CReferenceMaker *CTrackViewNode::getReference(uint index) const
{ {
if (m_References.size() <= index) return NULL; if (m_Children.size() <= index) return NULL;
return m_References[index]; return m_Children[index].Reference;
} }
void CTrackViewNode::setReference(uint index, CReferenceMaker *reference) void CTrackViewNode::setReference(uint index, CReferenceMaker *reference)
{ {
if (m_References.size() <= index) m_References.resize(index + 1); if (m_Children.size() <= index) m_Children.resize(index + 1);
m_References[index] = reference; m_Children[index].Reference = reference;
} }
uint CTrackViewNode::nbReferences() const uint CTrackViewNode::nbReferences() const
{ {
return m_References.size(); return m_Children.size();
} }
*/
IStorageObject *CTrackViewNode::createChunkById(uint16 id, bool container) IStorageObject *CTrackViewNode::createChunkById(uint16 id, bool container)
{ {
switch (id) switch (id)

@ -51,6 +51,7 @@ class CTrackViewNode : public CReferenceTarget
public: public:
struct TChild struct TChild
{ {
TChild() : Integer0130(0) { }
NLMISC::CRefPtr<CReferenceMaker> Reference; NLMISC::CRefPtr<CReferenceMaker> Reference;
ucstring DisplayName; ucstring DisplayName;
NLMISC::CClassId Identifier; NLMISC::CClassId Identifier;
@ -77,9 +78,9 @@ public:
virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "") const; virtual void toStringLocal(std::ostream &ostream, const std::string &pad = "") const;
// reference maker // reference maker
/*virtual CReferenceMaker *getReference(uint index) const; virtual CReferenceMaker *getReference(uint index) const;
virtual void setReference(uint index, CReferenceMaker *reference); virtual void setReference(uint index, CReferenceMaker *reference);
virtual uint nbReferences() const;*/ virtual uint nbReferences() const;
// read access // read access
inline const std::vector<TChild> &children() const { return m_Children; } inline const std::vector<TChild> &children() const { return m_Children; }

@ -31,8 +31,8 @@
#include "../max/builtin/storage/app_data.h" #include "../max/builtin/storage/app_data.h"
#include "../max/builtin/builtin.h" #include "../max/builtin/builtin.h"
//static const char *filename = "/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max"; static const char *filename = "/srv/work/database/interfaces/anims_max/cp_fy_hof_species.max";
static const char *filename = "/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max"; //static const char *filename = "/home/kaetemi/source/minimax/GE_Acc_MikotoBaniere.max";
//static const char *filename = "/home/kaetemi/3dsMax/scenes/test2008.max"; //static const char *filename = "/home/kaetemi/3dsMax/scenes/test2008.max";
//static const char *filename = "/home/kaetemi/3dsMax/scenes/teapot_test_scene.max"; //static const char *filename = "/home/kaetemi/3dsMax/scenes/teapot_test_scene.max";
static const char *streamname = "Scene"; static const char *streamname = "Scene";

Loading…
Cancel
Save