--- /dev/null
+
+#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
+