]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_psk.h
added PSK model support (UnrealTournament 2003/2004 ActorX format)
[xonotic/darkplaces.git] / model_psk.h
diff --git a/model_psk.h b/model_psk.h
new file mode 100644 (file)
index 0000000..480386f
--- /dev/null
@@ -0,0 +1,117 @@
+
+#ifndef MODEL_PSK_H
+#define MODEL_PSK_H
+
+typedef struct pskchunk_s
+{
+       // id is one of the following:
+       // .psk:
+       // ACTRHEAD (recordsize = 0, numrecords = 0)
+       // PNTS0000 (recordsize = 12, pskpnts_t)
+       // VTXW0000 (recordsize = 16, pskvtxw_t)
+       // FACE0000 (recordsize = 12, pskface_t)
+       // MATT0000 (recordsize = 88, pskmatt_t)
+       // REFSKELT (recordsize = 120, pskboneinfo_t)
+       // RAWWEIGHTS (recordsize = 12, pskrawweights_t)
+       // .psa:
+       // ANIMHEAD (recordsize = 0, numrecords = 0)
+       // BONENAMES (recordsize = 120, pskboneinfo_t)
+       // ANIMINFO (recordsize = 168, pskaniminfo_t)
+       // ANIMKEYS (recordsize = 32, pskanimkeys_t)
+       char id[20];
+       // in .psk always 0x1e83b9
+       // in .psa always 0x2e
+       int version;
+       int recordsize;
+       int numrecords;
+}
+pskchunk_t;
+
+typedef struct pskpnts_s
+{
+       float origin[3];
+}
+pskpnts_t;
+
+typedef struct pskvtxw_s
+{
+       unsigned short pntsindex; // index into PNTS0000 chunk
+       unsigned char unknown1[2]; // seems to be garbage
+       float texcoord[2];
+       unsigned char mattindex; // index into MATT0000 chunk
+       unsigned char unknown2; // always 0?
+       unsigned char unknown3[2]; // seems to be garbage
+}
+pskvtxw_t;
+
+typedef struct pskface_s
+{
+       unsigned short vtxwindex[3]; // triangle
+       unsigned char mattindex; // index into MATT0000 chunk
+       unsigned char unknown; // seems to be garbage
+       unsigned int group; // faces seem to be grouped, possibly for smoothing?
+}
+pskface_t;
+
+typedef struct pskmatt_s
+{
+       char name[64];
+       int unknown[6]; // observed 0 0 0 0 5 0
+}
+pskmatt_t;
+
+typedef struct pskpose_s
+{
+       float quat[4];
+       float origin[3];
+       float unknown; // probably a float, always seems to be 0
+       float size[3];
+}
+pskpose_t;
+
+typedef struct pskboneinfo_s
+{
+       char name[64];
+       int unknown1;
+       int numchildren;
+       int parent; // root bones have 0 here
+       pskpose_t basepose;
+}
+pskboneinfo_t;
+
+typedef struct pskrawweights_s
+{
+       float weight;
+       int pntsindex;
+       int boneindex;
+}
+pskrawweights_t;
+
+typedef struct pskaniminfo_s
+{
+       char name[64];
+       char group[64];
+       int numbones;
+       int unknown1;
+       int unknown2;
+       int unknown3;
+       float unknown4;
+       float playtime; // not really needed
+       float fps; // frames per second
+       int unknown5;
+       int firstframe;
+       int numframes;
+       // firstanimkeys = (firstframe + frameindex) * numbones
+}
+pskaniminfo_t;
+
+typedef struct pskanimkeys_s
+{
+       float origin[3];
+       float quat[4];
+       float frametime;
+}
+pskanimkeys_t;
+
+#endif
+