What Makes PSP Skins Different (and Why We Can't Make Our Own for XML2)

Started by BaconWizard17, November 28, 2020, 03:04PM

Previous topic - Next topic
As far as we know, the PSP versions of XML2, MUA1, and MUA2 run on Vicarious Visions Alchemy version 3.5. XML2 PSP and MUA1 PSP were developed by Vicarious Visions, and MUA2 PSP was developed by n-Space. XML2 PSP was the first game to use this new version of Alchemy, and as such has a few quirks. While MUA1 and MUA2 PSP can handle assets from earlier engines (such as PS2 skins or custom models), XML2 can only handle assets from other PSP games in the series. (To my knowledge, this only pertains to animated assets; XML2 PSP theoretically can handle static IGB files from other games).

I decided to do some investigation with Alchemy Finalizer v5 to see what makes PSP assets different from other assets. My goal was to see if there was any way to make PS2 skins or even custom models work on XML2 PSP, which hasn't worked so far. What I found is that there are several key distinctions. PS2 skins, XML2 PSP skins, and MUA1 PSP skins all have unique attributes found in finalizer, and currently we cannot replicate them.

Within Finalizer, all the differences can be found in the "_skinList" portion. It varies a bit for each skin, especially for those with segments, but here's the general gist of the differences (this is looking at skins without segments or outlines to simplify the analysis):

In both formats, in the "_skinList", there is "igSkin("X")", where X is the skin name. Within this is "_skinnedGraph: igBlendMatrixSelect("X")". In PS2 skins, the X has the skin name again, but in the PSP skins, that field is left blank (so it just says ("")). Interestingly, XML2 skins of all platforms have an "_bound: igAABox" under this, but all MUA1 skins have "_bound: NULL".

Expanding this main "_skinnedGraph" is where we start to see results. Most of the info under this main "_skinnedGraph" reads the same. The PS2 skin, however, has several objects listed for "_attributes: igAttrList" (usually 5-6 attributes), while the PSP only has 1. The PS2's attributes pertain mostly to the texture/color of the model. The PSP's lone attribute here is "igVertexBlendStateAttr", which is also generally present in the PS2. It's also worth noting that both skins have "_blendMatrixIndices: igIntList" that both have counts and capacities of 32.

Expanding the "_childList: igNodeList" of the main "_skinnedGraph" shows more differences. The PS2's "_childList" contains the "igGeometry", while the PSP's "_childList" shows "igAttrSet". I'm going to look at the PSP's "igAttrSet" first.

Expanding "igAttrSet" for the PSP shows a lot of info that's similar to the main "_skinnedGraph" of the PS2. Here, you can find the 5 attributes related to the texture/color/appearance of the model, as well as a "_childList". There is no "_blendMatrixIndices" at this part, however. The "_childList" contains 5 objects instead of 1. These 5 objects are each "igBlendMatrixSelect", and contain similar information to the main "_skinnedGraph" of the PS2 as well. There are no attributes, but each has a "_childList" and "_blendMatrixIndices: igIntList". The "_blendMatrixIndices: igIntList" generally has counts and capacities of 8, but the final one usually has 4 or 5. The "_childList" of each "igBlendMatrixSelect" of the PSP skin contains 1 object, which is also "igGeometry".

the "igGeometry" of the PS2 version initially looks very similar to the 5 "igGeometry" entries for the PSP. The main visible differences are that the PS2 skin shows the skin's name, and has 4 flags. The PSP has no name on any of its entries, and 0 flags. However, expanding the "_attributes" of the "igGeometry" entries shows differences: PS2 skins use "igGeometryAttr1_5", while PSP skins use "igGeometryAttr2".

"igGeometryAttr1_5" has somewhat different information from "igGeometryAttr2", particularly in extraneous info. Both skin types have "_stripLengths: igPrimLengthArray1_1", just with a different number of strips. Both have "_vertexArray", but the PS2 skin has "_vertexArray: igDx9VertexArray1_1", while the PSP skin has "_vertexArray: igDx9VertexArray2" These contain very different information.

Conversion Attempts
The 2C hex editor value for PSP skins is 08, and Finalizer has an optimization that can be run on skins to "convert igGeometryAttr to igGeometryAttr2". It is possible to successfully run this optimization on the PS2 skin, and it will convert the igGeometryAttr to igGeometryAttr2 (and this will convert "_vertexArray: igDx9VertexArray1_1" to "_vertexArray: igDx9VertexArray2"), but there are still a substantial amount of differences.

Looking at the newly created "_vertexArray: igDx9VertexArray2" in the PS2 skin, you can expend the object list to find 5 objects each containing "igVertexData" (on the PSP skin, each "_vertexArray: igDx9VertexArray2" only has 1 object). Here, the differences are striking. The "_componentType" for each of the 5 objects of the PS2 skin is different, including "IG_VERTEX_COMPONENT_POSITION" (the rest replace the word POSITION with NORMAL, TEXCOORD, WEIGHT, or INDEX). The PSP skin has 5 different object lists (with one object each) that are distributed across its 5 "igGeometryAttr2" entries, and each have a "_componentType" of "IG_VERTEX_COMPONENT_STREAM_PSP".

The converted PS2 skin also uses a "_data" type of "igVec3fList" for each object, while the PSP skin uses "igUnsignedIntList".

None of the optimizations in Finalizer 5 allow the necessary data to be converted. The right PSP information isn't there in the leaked tools. Some seem like they would ("Build native igGeometryAttr2), but they don't actually do anything to the skin. Until it's possible to set up the internal data in this way, there's nothing we can do. Perhaps the Alchemy 5 exporter for 3ds Max has some built-in functionality to do this, but I don't have an actual way to check that.

Hopefully, it will one day be possible to create custom models for XML2 PSP, and I hope that the research I've conducted can help with that. I know there's a lot of info here, so I advise opening up Finalizer yourself and checking out the differences. I would recommend looking at skins without cel shading or segments, so there's less information to be confused by. The 2 pairs I compared were:
- 0301.igb from MUA1 PS2 and 0301.igb from MUA1 PSP (Wolverine Street)
- 0901.igb from XML2 PSP and 7803.igb from MUA1 PS2 (Colossus Astonishing)