Example #1
0
        public int ReplaceMesh(Mesh mesh, int meshIndexToReplace)
        {
            Console.WriteLine("A");
            if (meshIndexToReplace >= subDataCount[0])
            {
                return(-1);
            }

            mesh.vertexSize = 24;
            int loc = (int)subDataOffset[0] + (meshIndexToReplace * 152);

            cachedData.ReplaceRange(BitConverter.GetBytes(mesh.materialID), loc, 4);
            cachedData.ReplaceRange(BitConverter.GetBytes(mesh.rigidBoneIndex), loc + 12, 4);
            cachedData.ReplaceRange(BitConverter.GetBytes(ibData.Count / 2), loc + 16, 4);
            cachedData.ReplaceRange(BitConverter.GetBytes(mesh.faceCount), loc + 20, 4);
            cachedData.ReplaceRange(BitConverter.GetBytes(vbData.Count), loc + 24, 4);
            cachedData.ReplaceRange(BitConverter.GetBytes(mesh.vertices.Count * mesh.vertexSize), loc + 28, 4);
            cachedData.ReplaceRange(BitConverter.GetBytes(mesh.vertexSize), loc + 32, 4);
            cachedData.ReplaceRange(BitConverter.GetBytes(mesh.vertices.Count), loc + 36, 4);
            List <byte> v = new List <byte>();

            if (mesh.vertexSize == 24)
            {
                for (int i = 0; i < mesh.vertices.Count; i++)
                {
                    Vector4 vec = new Vector4(mesh.vertices[i].x, mesh.vertices[i].y, mesh.vertices[i].z, 1) * mesh.modelMatrix;
                    v.AddRange(SystemHalf.Half.GetBytes((Half)vec.X));
                    v.AddRange(SystemHalf.Half.GetBytes((Half)vec.Y));
                    v.AddRange(SystemHalf.Half.GetBytes((Half)vec.Z));
                    v.AddRange(SystemHalf.Half.GetBytes(1));
                    v.AddRange(BitConverter.GetBytes(mesh.vertices[i].nx));
                    v.AddRange(BitConverter.GetBytes(mesh.vertices[i].ny));
                    v.AddRange(BitConverter.GetBytes(mesh.vertices[i].nz));
                    v.AddRange(SystemHalf.Half.GetBytes(mesh.vertices[i].u));
                    v.AddRange(SystemHalf.Half.GetBytes(mesh.vertices[i].v));
                }
            }
            vbData.AddRange(v);

            for (int i = 0; i < mesh.indices.Count; i++)
            {
                ibData.AddRange(BitConverter.GetBytes((short)mesh.indices[i]));
            }

            Console.WriteLine("B");
            return(1);
        }
Example #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);
        }