summaryrefslogtreecommitdiff
path: root/NW4RTools/VertexSettings.cs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--NW4RTools/VertexSettings.cs234
1 files changed, 234 insertions, 0 deletions
diff --git a/NW4RTools/VertexSettings.cs b/NW4RTools/VertexSettings.cs
new file mode 100644
index 0000000..5eac02a
--- /dev/null
+++ b/NW4RTools/VertexSettings.cs
@@ -0,0 +1,234 @@
+using System;
+
+namespace NW4RTools {
+ public struct GXIndexedVertex {
+ public int Position;
+ public int Normal;
+
+ public int[] Colors;
+ public int[] TexCoords;
+
+
+
+ public void LoadFrom(InputStream ins, VertexSettings vs) {
+ if (vs.PNMatrixIndexExists)
+ throw new NotImplementedException();
+ if (vs.TexCoordMatrixIndexExists[0])
+ throw new NotImplementedException();
+ // won't bother with the rest
+
+ switch (vs.PositionDesc) {
+ case VertexSettings.DescType.Direct:
+ throw new NotImplementedException();
+ case VertexSettings.DescType.None:
+ throw new NotImplementedException();
+ case VertexSettings.DescType.Index8:
+ Position = ins.ReadByte();
+ if (Position == 0xFF)
+ Position = -1;
+ break;
+ case VertexSettings.DescType.Index16:
+ Position = ins.ReadUInt16();
+ if (Position == 0xFFFF)
+ Position = -1;
+ break;
+ }
+
+ // not sure how to detect NBT3 yet
+ switch (vs.NormalDesc) {
+ case VertexSettings.DescType.Direct:
+ throw new NotImplementedException();
+ case VertexSettings.DescType.None:
+ Normal = -1;
+ break;
+ case VertexSettings.DescType.Index8:
+ Normal = ins.ReadByte();
+ if (Normal == 0xFF)
+ Normal = -1;
+ break;
+ case VertexSettings.DescType.Index16:
+ Normal = ins.ReadUInt16();
+ if (Normal == 0xFFFF)
+ Normal = -1;
+ break;
+ }
+
+ Colors = new int[2];
+
+ for (int i = 0; i < 2; i++) {
+ switch (vs.ColorDesc[i]) {
+ case VertexSettings.DescType.Direct:
+ throw new NotImplementedException();
+ case VertexSettings.DescType.None:
+ Colors[i] = -1;
+ break;
+ case VertexSettings.DescType.Index8:
+ Colors[i] = ins.ReadByte();
+ if (Colors[i] == 0xFF)
+ Colors[i] = -1;
+ break;
+ case VertexSettings.DescType.Index16:
+ Colors[i] = ins.ReadUInt16();
+ if (Colors[i] == 0xFFFF)
+ Colors[i] = -1;
+ break;
+ }
+ }
+
+ TexCoords = new int[8];
+
+ for (int i = 0; i < 8; i++) {
+ switch (vs.TexCoordDesc[i]) {
+ case VertexSettings.DescType.Direct:
+ throw new NotImplementedException();
+ case VertexSettings.DescType.None:
+ TexCoords[i] = -1;
+ break;
+ case VertexSettings.DescType.Index8:
+ TexCoords[i] = ins.ReadByte();
+ if (TexCoords[i] == 0xFF)
+ TexCoords[i] = -1;
+ break;
+ case VertexSettings.DescType.Index16:
+ TexCoords[i] = ins.ReadUInt16();
+ if (TexCoords[i] == 0xFFFF)
+ TexCoords[i] = -1;
+ break;
+ }
+ }
+ }
+ }
+
+
+
+ public class VertexSettings {
+ public enum DescType {
+ None,
+ Direct,
+ Index8,
+ Index16
+ }
+
+ public enum CompCount {
+ Position2 = 0,
+ Position3 = 1,
+ Normal3 = 0,
+ NBT = 1,
+ NBT3 = 2,
+ Color3 = 0,
+ Color4 = 1,
+ TexCoord1 = 0,
+ TexCoord2 = 1
+ }
+
+ public enum CompType {
+ UInt8 = 0,
+ Int8 = 1,
+ UInt16 = 2,
+ Int16 = 3,
+ Float32 = 4
+ }
+
+
+ public bool PNMatrixIndexExists;
+ public bool[] TexCoordMatrixIndexExists;
+ public DescType PositionDesc, NormalDesc;
+ public DescType[] ColorDesc, TexCoordDesc;
+
+ public CompCount PositionCount, NormalCount;
+ public CompCount[] ColorCount, TexCoordCount;
+
+ public CompType PositionFormat, NormalFormat;
+ public CompType[] ColorFormat, TexCoordFormat;
+
+ public byte PositionFrac;
+ public byte[] TexCoordFrac;
+
+
+
+ public VertexSettings() {
+ TexCoordMatrixIndexExists = new bool[8];
+
+ ColorDesc = new DescType[2];
+ TexCoordDesc = new DescType[8];
+
+ ColorCount = new CompCount[2];
+ TexCoordCount = new CompCount[8];
+
+ ColorFormat = new CompType[2];
+ TexCoordFormat = new CompType[8];
+
+ TexCoordFrac = new byte[8];
+ }
+
+
+ public void SetDesc(UInt32 val1, UInt32 val2) {
+ PNMatrixIndexExists = ((val1 & 1) != 0);
+
+ for (int i = 0; i < 8; i++)
+ TexCoordMatrixIndexExists[i] = ((val1 & (2 << i)) != 0);
+
+ PositionDesc = (DescType)((val1 & 0x600) >> 9);
+ NormalDesc = (DescType)((val1 & 0x1800) >> 11);
+ ColorDesc[0] = (DescType)((val1 & 0x6000) >> 13);
+ ColorDesc[1] = (DescType)((val1 & 0x18000) >> 15);
+
+ for (int i = 0; i < 8; i++)
+ TexCoordDesc[i] = (DescType)((val2 & (3 << (i * 2))) >> (i * 2));
+ }
+
+ public void SetAttrFmt(UInt32 val1, UInt32 val2, UInt32 val3) {
+ PositionCount = (CompCount)(val1 & 1);
+ PositionFormat = (CompType)((val1 & 0xE) >> 3);
+ PositionFrac = (byte)((val1 & 0x1F0) >> 4);
+
+ // note: this field is special
+ bool IsNormalSet = ((val1 & 0x200) != 0);
+ bool UseNormalIndex3 = ((val1 & 0x80000000) != 0);
+ NormalCount = IsNormalSet ? (UseNormalIndex3 ? CompCount.NBT3 : CompCount.NBT) : CompCount.Normal3;
+ NormalFormat = (CompType)((val1 & 0x1C00) >> 10);
+
+ ColorCount[0] = (CompCount)((val1 & 0x2000) >> 13);
+ ColorFormat[0] = (CompType)((val1 & 0x1C000) >> 14);
+
+ ColorCount[1] = (CompCount)((val1 & 0x20000) >> 17);
+ ColorFormat[1] = (CompType)((val1 & 0x1C0000) >> 18);
+
+ TexCoordCount[0] = (CompCount)((val1 & 0x200000) >> 21);
+ TexCoordFormat[0] = (CompType)((val1 & 0x1C00000) >> 22);
+ TexCoordFrac[0] = (byte)((val1 & 0x3E000000) >> 25);
+
+ // set in various cases, see libogc gx.c for info
+ bool ByteDequant = ((val1 & 0x40000000) != 0);
+
+ TexCoordCount[1] = (CompCount)(val2 & 0x1);
+ TexCoordFormat[1] = (CompType)((val2 & 0xE) >> 1);
+ TexCoordFrac[1] = (byte)((val2 & 0x1F0) >> 4);
+
+ TexCoordCount[2] = (CompCount)((val2 & 0x200) >> 9);
+ TexCoordFormat[2] = (CompType)((val2 & 0x1C00) >> 10);
+ TexCoordFrac[2] = (byte)((val2 & 0x3E000) >> 13);
+
+ TexCoordCount[3] = (CompCount)((val2 & 0x40000) >> 18);
+ TexCoordFormat[3] = (CompType)((val2 & 0x380000) >> 19);
+ TexCoordFrac[3] = (byte)((val2 & 0x3E000000) >> 22);
+
+ TexCoordCount[4] = (CompCount)((val2 & 0x8000000) >> 27);
+ TexCoordFormat[4] = (CompType)((val2 & 0x70000000) >> 28);
+ TexCoordFrac[4] = (byte)(val3 & 0x1F);
+
+ TexCoordCount[5] = (CompCount)((val3 & 0x20) >> 5);
+ TexCoordFormat[5] = (CompType)((val3 & 0x1C0) >> 6);
+ TexCoordFrac[5] = (byte)((val3 & 0x3E00) >> 9);
+
+ TexCoordCount[6] = (CompCount)((val3 & 0x4000) >> 14);
+ TexCoordFormat[6] = (CompType)((val3 & 0x38000) >> 15);
+ TexCoordFrac[6] = (byte)((val3 & 0x7C0000) >> 18);
+
+ TexCoordCount[7] = (CompCount)((val3 & 0x800000) >> 23);
+ TexCoordFormat[7] = (CompType)((val3 & 0x7000000) >> 24);
+ TexCoordFrac[7] = (byte)((val3 & 0xF8000000) >> 27);
+ }
+ }
+}
+