Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }