public List <Bone> GetBones() { List <Bone> bones = new List <Bone>(); for (int i = 0; i < subDataCount[1]; i++) { Bone b = new Bone(); int loc = (int)subDataOffset[1] + (i * 80) + 4; float m11 = BitConverter.ToSingle(cachedData.GetRange(loc + 4, 4).ToArray(), 0); float m12 = BitConverter.ToSingle(cachedData.GetRange(loc + 8, 4).ToArray(), 0); float m13 = BitConverter.ToSingle(cachedData.GetRange(loc + 12, 4).ToArray(), 0); float m14 = BitConverter.ToSingle(cachedData.GetRange(loc + 16, 4).ToArray(), 0); float m21 = BitConverter.ToSingle(cachedData.GetRange(loc + 20, 4).ToArray(), 0); float m22 = BitConverter.ToSingle(cachedData.GetRange(loc + 24, 4).ToArray(), 0); float m23 = BitConverter.ToSingle(cachedData.GetRange(loc + 28, 4).ToArray(), 0); float m24 = BitConverter.ToSingle(cachedData.GetRange(loc + 32, 4).ToArray(), 0); float m31 = BitConverter.ToSingle(cachedData.GetRange(loc + 36, 4).ToArray(), 0); float m32 = BitConverter.ToSingle(cachedData.GetRange(loc + 40, 4).ToArray(), 0); float m33 = BitConverter.ToSingle(cachedData.GetRange(loc + 44, 4).ToArray(), 0); float m34 = BitConverter.ToSingle(cachedData.GetRange(loc + 48, 4).ToArray(), 0); float m41 = BitConverter.ToSingle(cachedData.GetRange(loc + 52, 4).ToArray(), 0); float m42 = BitConverter.ToSingle(cachedData.GetRange(loc + 56, 4).ToArray(), 0); float m43 = BitConverter.ToSingle(cachedData.GetRange(loc + 60, 4).ToArray(), 0); float m44 = BitConverter.ToSingle(cachedData.GetRange(loc + 64, 4).ToArray(), 0); b.parent = BitConverter.ToInt32(cachedData.GetRange(loc + 68, 4).ToArray(), 0); b.name = Utils.GetStringFromNullTerminatedByteArray(cachedData.ToArray(), BitConverter.ToInt32(cachedData.GetRange(loc - 4, 4).ToArray(), 0)); Matrix4 m = new Matrix4(); m.M11 = m11; m.M12 = m12; m.M13 = m13; m.M14 = m14; m.M21 = m21; m.M22 = m22; m.M23 = m23; m.M24 = m24; m.M31 = m31; m.M32 = m32; m.M33 = m33; m.M34 = m34; m.M41 = m41; m.M42 = m42; m.M43 = m43; m.M44 = m44; b.boneMatrix = m.Inverted(); //if (i > 0) b.rootMatrix = bones[0].boneMatrix.Inverted(); //else b.rootMatrix = Matrix4.Identity.Inverted(); bones.Add(b); } return(bones); }
public List <Mesh> GetMeshes() { List <Mesh> meshes = new List <Mesh>(); Bone grannyRootBone = GetBones()[0]; for (int i = 0; i < subDataCount[0]; i++) { Mesh m = new Mesh(); int loc = (int)subDataOffset[0] + (i * 152); m.materialID = BitConverter.ToInt32(cachedData.GetRange(loc, 4).ToArray(), 0); m.accessoryIndex = BitConverter.ToInt32(cachedData.GetRange(loc + 4, 4).ToArray(), 0); m.maxBones = BitConverter.ToInt32(cachedData.GetRange(loc + 8, 4).ToArray(), 0); m.rigidBoneIndex = BitConverter.ToInt32(cachedData.GetRange(loc + 12, 4).ToArray(), 0); m.indexBufferOffsetInShorts = BitConverter.ToInt32(cachedData.GetRange(loc + 16, 4).ToArray(), 0); m.faceCount = BitConverter.ToInt32(cachedData.GetRange(loc + 20, 4).ToArray(), 0); m.vertexBufferOffsetInBytes = BitConverter.ToInt32(cachedData.GetRange(loc + 24, 4).ToArray(), 0); m.vertexBufferSizeInBytes = BitConverter.ToInt32(cachedData.GetRange(loc + 28, 4).ToArray(), 0); m.vertexSize = BitConverter.ToInt32(cachedData.GetRange(loc + 32, 4).ToArray(), 0); m.vertexCount = BitConverter.ToInt32(cachedData.GetRange(loc + 36, 4).ToArray(), 0); m.rigidOnly = BitConverter.ToBoolean(cachedData.GetRange(loc + 124, 1).ToArray(), 0); for (int j = 0; j < m.faceCount; j++) { m.indices.Add((uint)BitConverter.ToInt16(ibData.GetRange((m.indexBufferOffsetInShorts * 2) + (j * 6) + 0, 2).ToArray(), 0)); m.indices.Add((uint)BitConverter.ToInt16(ibData.GetRange((m.indexBufferOffsetInShorts * 2) + (j * 6) + 2, 2).ToArray(), 0)); m.indices.Add((uint)BitConverter.ToInt16(ibData.GetRange((m.indexBufferOffsetInShorts * 2) + (j * 6) + 4, 2).ToArray(), 0)); } for (int k = 0; k < m.vertexCount; k++) { Mesh.Vertex v = new Mesh.Vertex(); if (m.vertexSize == 0x18) { v.x = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 0, 2).ToArray(), 0); v.y = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 2, 2).ToArray(), 0); v.z = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 4, 2).ToArray(), 0); v.nx = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 8, 4).ToArray(), 0); v.ny = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 12, 4).ToArray(), 0); v.nz = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 16, 4).ToArray(), 0); v.u = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 20, 2).ToArray(), 0); v.v = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 22, 2).ToArray(), 0); } if (m.vertexSize == 0x1c) { v.x = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 0, 2).ToArray(), 0); v.y = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 2, 2).ToArray(), 0); v.z = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 4, 2).ToArray(), 0); v.nx = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 8, 4).ToArray(), 0); v.ny = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 12, 4).ToArray(), 0); v.nz = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 16, 4).ToArray(), 0); v.u = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 20, 2).ToArray(), 0); v.v = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 22, 2).ToArray(), 0); } if (m.vertexSize == 0x20) { v.x = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 0, 2).ToArray(), 0); v.y = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 2, 2).ToArray(), 0); v.z = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 4, 2).ToArray(), 0); v.nx = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 8, 4).ToArray(), 0); v.ny = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 12, 4).ToArray(), 0); v.nz = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 16, 4).ToArray(), 0); v.u = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 28, 2).ToArray(), 0); v.v = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 30, 2).ToArray(), 0); } if (m.vertexSize == 0x24) { v.x = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 0, 2).ToArray(), 0); v.y = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 2, 2).ToArray(), 0); v.z = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 4, 2).ToArray(), 0); v.nx = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 8, 4).ToArray(), 0); v.ny = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 12, 4).ToArray(), 0); v.nz = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 16, 4).ToArray(), 0); v.u = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 32, 2).ToArray(), 0); v.v = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 34, 2).ToArray(), 0); } if (m.vertexSize == 0x28) { v.x = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 0, 2).ToArray(), 0); v.y = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 2, 2).ToArray(), 0); v.z = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 4, 2).ToArray(), 0); v.nx = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 8, 4).ToArray(), 0); v.ny = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 12, 4).ToArray(), 0); v.nz = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 16, 4).ToArray(), 0); v.u = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 32, 2).ToArray(), 0); v.v = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 34, 2).ToArray(), 0); } if (m.vertexSize == 0x2c) { v.x = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 0, 2).ToArray(), 0); v.y = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 2, 2).ToArray(), 0); v.z = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 4, 2).ToArray(), 0); v.nx = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 8, 4).ToArray(), 0); v.ny = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 12, 4).ToArray(), 0); v.nz = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 16, 4).ToArray(), 0); v.u = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 40, 2).ToArray(), 0); v.v = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 42, 2).ToArray(), 0); } if (m.vertexSize == 0x30) { v.x = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 0, 2).ToArray(), 0); v.y = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 2, 2).ToArray(), 0); v.z = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 4, 2).ToArray(), 0); v.nx = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 8, 4).ToArray(), 0); v.ny = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 12, 4).ToArray(), 0); v.nz = BitConverter.ToSingle(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 16, 4).ToArray(), 0); v.u = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 40, 2).ToArray(), 0); v.v = Half.ToHalf(vbData.GetRange(m.vertexBufferOffsetInBytes + (k * m.vertexSize) + 42, 2).ToArray(), 0); } v.v = 1 - v.v; m.vertices.Add(v); } m.rootMatrix = new Matrix4(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1) * grannyRootBone.boneMatrix; meshes.Add(m); } return(meshes); }