Uh, longpost. The opposite of a double post, I guess.
MrAdults, your description of Vertex Arrays includes a VertHdr, which has WORD
unknown[2] and int
numVerts. That
unknown, in my experience, contains the vertex format.
Now, I say this with a little hesitation, because you specifically said that "the vertices actually have nothing to do with the PSP GPU format". But
unknown seems to correspond directly to
VTYPE from Yet Another PSP Doc. And in these non-Dissidia GMOs, I've seen nothing of "shared vertex data", as the weights and normals were right there in the vertex array.
If this isn't the case for Dissidia's GMOs, then I suppose I'm not helping you much. But at some point I think we will have to decide whether the QhimmWiki page should document only Dissidia's GMO files, or whether it will document
the GMO file format, one that is used in a number of PSP games.
(These games include: Castlevania: Dracula X Chronicles, Jeanne D'Arc, Gitaroo Man Lives!, and Exit. And it's somewhat possible to transplant GMO files from one game into another, with very, uh, interesting results!)
====
Warning! Everything I've found is from other PSP games (mostly Gitaroo Man Lives), so despite being the same file format, it might contradict in a few places and will certainly contain stuff that Dissidia's GMOs don't have.
Also, I have a weird convention for documenting file formats (it seems everyone and their grandma has their own way of doing it), and I'm not very good at explaining things. Once someone starts putting stuff in the QhimmWiki article, I'll join in and try to follow whatever convention is being used there.
0x000B - "Shared Vertex Data"? Well, you did say it was purely speculative. Nope, from what I've seen in other games, this is an Animation.
- There is a 0x80B1 chunk which (I think) has the animations start and end frames as float32s, e.g. (0.0, 32.0).
- Then a 0x80B2 chunk with a float32 value, no idea what it does.
- Then a great many 0x80B3 chunks, each one linking a Bone to one or more"Animation Nodes" (more on that later). Each contains:
[list=1]
- 4 bytes: reference to a bone [XX 02 10 04] where XX is the bone (starting at 0)
- 4 bytes: Animation Node type, so far I've seen:
- 0x47 = Position/Rotation/Scale matrices
- 0x48 = Rotations with quaternions
- 0x4B = XYZ positions
- 4 bytes: uh, 0
- 4 bytes: reference to an Animation Node [XX 00 0C 00], where XX is the Animation Node (starting at 0). The Animation Nodes are subchunks of this Animation.
To use both quaternion rotations and XYZ positions, there would be two 0x80B3 chunks-- both would have the same bone, but each would link to a different Animation Node.
- Then come the Animation Node subchunks themselves.
0x000C - "Animation Node" (or a better name if you have one)
(Oh crap, I really hope Dissidia GMOs contain this kind of Chunk, because I didn't see it on your page.)
As I mentioned before, these are subchunks of an Animation. They contain entries that I will call "frames" (or, again, a better name if you have one). A frame contains a time (or, uh, something that looks like a time), and also contains either a Position-Rotation-Scale matrix, a quaternion for rotation, or a XYZ position. (Or perhaps some other method of animation.)