summaryrefslogtreecommitdiff
path: root/NW4RTools/Models/VertexData.cs
diff options
context:
space:
mode:
Diffstat (limited to 'NW4RTools/Models/VertexData.cs')
-rw-r--r--NW4RTools/Models/VertexData.cs102
1 files changed, 100 insertions, 2 deletions
diff --git a/NW4RTools/Models/VertexData.cs b/NW4RTools/Models/VertexData.cs
index d8733b3..b1f65cd 100644
--- a/NW4RTools/Models/VertexData.cs
+++ b/NW4RTools/Models/VertexData.cs
@@ -1,10 +1,31 @@
using System;
namespace NW4RTools.Models {
- public class VertexDataBase {
+ public enum CompCount {
+ Position2 = 0,
+ Position3 = 1,
+ Normal3 = 0,
+ Color3 = 0,
+ Color4 = 1,
+ TexCoord1 = 0,
+ TexCoord2 = 1
+ }
+
+
+ public enum CompType {
+ UInt8 = 0,
+ Int8 = 1,
+ UInt16 = 2,
+ Int16 = 3,
+ Float32 = 4
+ }
+
+
+ public abstract class VertexDataBase {
public UInt32 Index;
- public UInt32 ComponentCount, ComponentType; // todo: enums
+ public CompCount ComponentCount;
+ public CompType ComponentType;
public byte Fraction /* Not used for colours */, EntrySize;
public UInt16 EntryCount;
@@ -13,6 +34,41 @@ namespace NW4RTools.Models {
public VertexDataBase() {
}
+
+ public float[] GetEntry(int index) {
+ float[] ret = new float[GetRealCount()];
+
+ float scale = 1.0f / (1 << Fraction);
+
+ //Console.WriteLine("Getting index {0}, count {1} size {2} length {3} offset {4}", index, EntryCount, EntrySize, Data.Length, index * EntrySize);
+ InputStream ins = new InputStream(Data);
+ ins.Seek(index * EntrySize);
+
+ for (int i = 0; i < ret.Length; i++) {
+ switch (ComponentType) {
+ case CompType.UInt8:
+ break;
+ case CompType.Int8:
+ ret[i] = (float)ins.ReadSByte() * scale;
+ break;
+ case CompType.UInt16:
+ ret[i] = (float)ins.ReadUInt16() * scale;
+ break;
+ case CompType.Int16:
+ ret[i] = (float)ins.ReadInt16() * scale;
+ break;
+ case CompType.Float32:
+ ret[i] = ins.ReadFloat();
+ break;
+ default:
+ throw new NotImplementedException(String.Format("unimplemented type {0}", (int)ComponentType));
+ }
+ }
+
+ return ret;
+ }
+
+ public abstract int GetRealCount();
}
@@ -21,18 +77,49 @@ namespace NW4RTools.Models {
public VertexPosData() {
}
+
+ public override int GetRealCount() {
+ switch (ComponentCount) {
+ case CompCount.Position2:
+ return 2;
+ case CompCount.Position3:
+ return 3;
+ default:
+ return -1;
+ }
+ }
}
public class VertexNrmData : VertexDataBase {
public VertexNrmData() {
}
+
+ public override int GetRealCount() {
+ switch (ComponentCount) {
+ case CompCount.Normal3:
+ return 3;
+ default:
+ return -1;
+ }
+ }
}
public class VertexClrData : VertexDataBase {
public VertexClrData() {
}
+
+ public override int GetRealCount() {
+ switch (ComponentCount) {
+ case CompCount.Color3:
+ return 3;
+ case CompCount.Color4:
+ return 4;
+ default:
+ return -1;
+ }
+ }
}
@@ -41,6 +128,17 @@ namespace NW4RTools.Models {
public VertexTexCoordData() {
}
+
+ public override int GetRealCount() {
+ switch (ComponentCount) {
+ case CompCount.TexCoord1:
+ return 1;
+ case CompCount.TexCoord2:
+ return 2;
+ default:
+ return -1;
+ }
+ }
}
}