mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-03 16:49:54 +00:00
More test output: NiSkinInstance and NiSkinData
This commit is contained in:
parent
b4eefb6ca3
commit
ef69584793
5 changed files with 109 additions and 16 deletions
56
nif/data.h
56
nif/data.h
|
@ -321,29 +321,57 @@ struct NiVisData : Record
|
||||||
|
|
||||||
struct NiSkinData : Record
|
struct NiSkinData : Record
|
||||||
{
|
{
|
||||||
|
// This is to make sure the structs are packed, ie. that the
|
||||||
|
// compiler doesn't mess them up with extra alignment bytes.
|
||||||
|
#pragma pack(push)
|
||||||
|
#pragma pack(1)
|
||||||
|
|
||||||
|
struct BoneTrafo
|
||||||
|
{
|
||||||
|
Matrix rotation; // Rotation offset from bone?
|
||||||
|
Vector trans; // Translation
|
||||||
|
float scale; // Probably scale (always 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
struct VertWeight
|
||||||
|
{
|
||||||
|
short vertex;
|
||||||
|
float weight;
|
||||||
|
};
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
struct BoneInfo
|
||||||
|
{
|
||||||
|
const BoneTrafo *trafo;
|
||||||
|
const Vector4 *unknown;
|
||||||
|
SliceArray<VertWeight> weights;
|
||||||
|
};
|
||||||
|
|
||||||
|
const BoneTrafo *trafo;
|
||||||
|
std::vector<BoneInfo> bones;
|
||||||
|
|
||||||
void read(NIFFile *nif)
|
void read(NIFFile *nif)
|
||||||
{
|
{
|
||||||
// Not really decoded fully.
|
assert(sizeof(BoneTrafo) == 4*(9+3+1));
|
||||||
nif->getMatrix(); // global skin rotation?
|
assert(sizeof(VertWeight) == 6);
|
||||||
nif->getVector(); // skin translation
|
|
||||||
nif->getFloat(); // probably scale (always 1)
|
|
||||||
|
|
||||||
int bones = nif->getInt();
|
trafo = nif->getPtr<BoneTrafo>();
|
||||||
|
|
||||||
|
int boneNum = nif->getInt();
|
||||||
nif->getInt(); // -1
|
nif->getInt(); // -1
|
||||||
|
|
||||||
for(int i=0;i<bones;i++)
|
bones.resize(boneNum);
|
||||||
{
|
|
||||||
nif->getMatrix(); // skin rotation offset from this bone
|
|
||||||
nif->getVector(); // translation
|
|
||||||
nif->getFloat(); // scale
|
|
||||||
|
|
||||||
nif->getVector4();
|
for(int i=0;i<boneNum;i++)
|
||||||
|
{
|
||||||
|
BoneInfo &bi = bones[i];
|
||||||
|
|
||||||
|
bi.trafo = nif->getPtr<BoneTrafo>();
|
||||||
|
bi.unknown = nif->getVector4();
|
||||||
|
|
||||||
// Number of vertex weights
|
// Number of vertex weights
|
||||||
int count = nif->getShort();
|
int count = nif->getShort();
|
||||||
|
bi.weights = nif->getArrayLen<VertWeight>(count);
|
||||||
// Each weight is a vertex index (short) and a weight (float)
|
|
||||||
nif->skip(count*6);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -135,7 +135,7 @@ void NIFFile::parse()
|
||||||
else if(rec == "NiPixelData") { r = new NiPixelData; r->recType = RC_NiPixelData; }
|
else if(rec == "NiPixelData") { r = new NiPixelData; r->recType = RC_NiPixelData; }
|
||||||
else if(rec == "NiMorphData") { r = new NiMorphData; r->recType = RC_NiMorphData; }
|
else if(rec == "NiMorphData") { r = new NiMorphData; r->recType = RC_NiMorphData; }
|
||||||
else if(rec == "NiKeyframeData") { r = new NiKeyframeData; r->recType = RC_NiKeyframeData; }
|
else if(rec == "NiKeyframeData") { r = new NiKeyframeData; r->recType = RC_NiKeyframeData; }
|
||||||
else if(rec == "NiSkinData") { r = new NiSkinData; r->recType = RC_NiSkindata; }
|
else if(rec == "NiSkinData") { r = new NiSkinData; r->recType = RC_NiSkinData; }
|
||||||
else if(rec == "NiUVData") { r = new NiUVData; r->recType = RC_NiUVData; }
|
else if(rec == "NiUVData") { r = new NiUVData; r->recType = RC_NiUVData; }
|
||||||
else if(rec == "NiPosData") { r = new NiPosData; r->recType = RC_NiPosData; }
|
else if(rec == "NiPosData") { r = new NiPosData; r->recType = RC_NiPosData; }
|
||||||
else if(rec == "NiRotatingParticlesData") { r = new NiRotatingParticlesData; r->recType = RC_NiRotatingParticlesData; }
|
else if(rec == "NiRotatingParticlesData") { r = new NiRotatingParticlesData; r->recType = RC_NiRotatingParticlesData; }
|
||||||
|
|
|
@ -72,7 +72,7 @@ enum RecordType
|
||||||
RC_NiPixelData,
|
RC_NiPixelData,
|
||||||
RC_NiMorphData,
|
RC_NiMorphData,
|
||||||
RC_NiKeyframeData,
|
RC_NiKeyframeData,
|
||||||
RC_NiSkindata,
|
RC_NiSkinData,
|
||||||
RC_NiUVData,
|
RC_NiUVData,
|
||||||
RC_NiPosData,
|
RC_NiPosData,
|
||||||
RC_NiRotatingParticlesData,
|
RC_NiRotatingParticlesData,
|
||||||
|
|
1
nif/tests/.gitignore
vendored
1
nif/tests/.gitignore
vendored
|
@ -2,3 +2,4 @@ niftool
|
||||||
*_test
|
*_test
|
||||||
*.nif
|
*.nif
|
||||||
*.kf
|
*.kf
|
||||||
|
output.txt
|
||||||
|
|
|
@ -8,11 +8,15 @@
|
||||||
#include "../../mangle/stream/servers/file_stream.h"
|
#include "../../mangle/stream/servers/file_stream.h"
|
||||||
#include "../node.h"
|
#include "../node.h"
|
||||||
#include "../controller.h"
|
#include "../controller.h"
|
||||||
|
#include "../data.h"
|
||||||
|
|
||||||
using namespace Mangle::Stream;
|
using namespace Mangle::Stream;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace Nif;
|
using namespace Nif;
|
||||||
|
|
||||||
|
// Display very verbose information
|
||||||
|
bool verbose = false;
|
||||||
|
|
||||||
void doVector(const Vector *vec)
|
void doVector(const Vector *vec)
|
||||||
{
|
{
|
||||||
cout << "["
|
cout << "["
|
||||||
|
@ -21,6 +25,15 @@ void doVector(const Vector *vec)
|
||||||
<< vec->array[2] << "]\n";
|
<< vec->array[2] << "]\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void doVector4(const Vector4 *vec)
|
||||||
|
{
|
||||||
|
cout << "["
|
||||||
|
<< vec->array[0] << ","
|
||||||
|
<< vec->array[1] << ","
|
||||||
|
<< vec->array[2] << ","
|
||||||
|
<< vec->array[3] << "]\n";
|
||||||
|
}
|
||||||
|
|
||||||
void doMatrix(const Matrix *mat)
|
void doMatrix(const Matrix *mat)
|
||||||
{
|
{
|
||||||
cout << "Matrix:\n";
|
cout << "Matrix:\n";
|
||||||
|
@ -79,6 +92,54 @@ void doNode(Node *n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void doNiTriShape(NiTriShape *n)
|
||||||
|
{
|
||||||
|
doNode(n);
|
||||||
|
|
||||||
|
cout << "Shape data: " << n->data.getIndex() << endl;
|
||||||
|
cout << "Skin instance: " << n->skin.getIndex() << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void doNiSkinData(NiSkinData *n)
|
||||||
|
{
|
||||||
|
int c = n->bones.size();
|
||||||
|
|
||||||
|
cout << "Global transformation:\n";
|
||||||
|
doMatrix(&n->trafo->rotation);
|
||||||
|
doVector(&n->trafo->trans);
|
||||||
|
cout << "Scale: " << n->trafo->scale << endl;
|
||||||
|
|
||||||
|
cout << "Bone number: " << c << endl;
|
||||||
|
for(int i=0; i<c; i++)
|
||||||
|
{
|
||||||
|
NiSkinData::BoneInfo &bi = n->bones[i];
|
||||||
|
|
||||||
|
cout << "-- Bone " << i << ":\n";
|
||||||
|
doMatrix(&bi.trafo->rotation);
|
||||||
|
doVector(&bi.trafo->trans);
|
||||||
|
cout << "Scale: " << bi.trafo->scale << endl;
|
||||||
|
cout << "Unknown: "; doVector4(bi.unknown);
|
||||||
|
cout << "Weight number: " << bi.weights.length << endl;
|
||||||
|
|
||||||
|
if(verbose)
|
||||||
|
for(int j=0; j<bi.weights.length; j++)
|
||||||
|
{
|
||||||
|
const NiSkinData::VertWeight &w = bi.weights.ptr[j];
|
||||||
|
cout << " vert:" << w.vertex << " weight:" << w.weight << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void doNiSkinInstance(NiSkinInstance *n)
|
||||||
|
{
|
||||||
|
cout << "Data: " << n->data.getIndex() << endl;
|
||||||
|
cout << "Root: " << n->root.getIndex() << endl;
|
||||||
|
cout << "Bones:";
|
||||||
|
for(int i=0; i<n->bones.length(); i++)
|
||||||
|
cout << " " << n->bones.getIndex(i);
|
||||||
|
cout << endl;
|
||||||
|
}
|
||||||
|
|
||||||
void doNiNode(NiNode *n)
|
void doNiNode(NiNode *n)
|
||||||
{
|
{
|
||||||
doNode(n);
|
doNode(n);
|
||||||
|
@ -148,6 +209,9 @@ int main(int argc, char **args)
|
||||||
switch(r->recType)
|
switch(r->recType)
|
||||||
{
|
{
|
||||||
case RC_NiNode: doNiNode((NiNode*)r); break;
|
case RC_NiNode: doNiNode((NiNode*)r); break;
|
||||||
|
case RC_NiSkinData: doNiSkinData((NiSkinData*)r); break;
|
||||||
|
case RC_NiSkinInstance: doNiSkinInstance((NiSkinInstance*)r); break;
|
||||||
|
case RC_NiTriShape: doNiTriShape((NiTriShape*)r); break;
|
||||||
case RC_NiStringExtraData: doNiStringExtraData((NiStringExtraData*)r); break;
|
case RC_NiStringExtraData: doNiStringExtraData((NiStringExtraData*)r); break;
|
||||||
case RC_NiSequenceStreamHelper: doNamed((Named*)r); break;
|
case RC_NiSequenceStreamHelper: doNamed((Named*)r); break;
|
||||||
case RC_NiTextKeyExtraData: doNiTextKeyExtraData((NiTextKeyExtraData*)r); break;
|
case RC_NiTextKeyExtraData: doNiTextKeyExtraData((NiTextKeyExtraData*)r); break;
|
||||||
|
|
Loading…
Reference in a new issue