internal void Recompute(RmvMesh mesh)
 {
     //throw new NotImplementedException();
 }
        public void UpdateOffsets()
        {
            for (int lodIndex = 0; lodIndex < Header.LodCount; lodIndex++)
            {
                for (var modelIndex = 0; modelIndex < MeshList[lodIndex].Length; modelIndex++)
                {
                    var header = MeshList[lodIndex][modelIndex].Header;
                    header.UpdateHeader(MeshList[lodIndex][modelIndex].Mesh, MeshList[lodIndex][modelIndex].Textures, MeshList[lodIndex][modelIndex].AttachmentPoints);
                    MeshList[lodIndex][modelIndex].Header = header;
                }
            }
            var  headerOffset = (uint)(ByteHelper.GetSize <RmvModelHeader>() + GetLodHeaderSize() * Header.LodCount);
            uint modelOffset  = 0;

            for (int lodIndex = 0; lodIndex < Header.LodCount; lodIndex++)
            {
                var lodHeader = LodHeaders[lodIndex];
                lodHeader.MeshCount          = (uint)MeshList[lodIndex].Length;
                lodHeader.TotalLodVertexSize = (uint)MeshList[lodIndex].Sum(x => x.Header.VertexCount * RmvMesh.GetVertexSize(x.Header.VertextType));
                lodHeader.TotalLodIndexSize  = (uint)MeshList[lodIndex].Sum(x => x.Header.FaceCount * sizeof(ushort));
                lodHeader.FirstMeshOffset    = headerOffset + modelOffset;
                LodHeaders[lodIndex]         = lodHeader;

                modelOffset += (uint)MeshList[lodIndex].Sum(x => x.Header.ModelSize);
            }
        }
        public RmvMesh CreateRmvMesh()
        {
            RmvMesh mesh = new RmvMesh();

            mesh.IndexList = GetIndexBuffer().ToArray();

            if (_vertedFormat == VertexFormat.Default)
            {
                mesh.VertexList = new DefaultVertex[VertexCount()];

                for (int i = 0; i < mesh.VertexList.Length; i++)
                {
                    _vertexArray[i].Normal   = Vector3.Normalize(_vertexArray[i].Normal);
                    _vertexArray[i].BiNormal = Vector3.Normalize(_vertexArray[i].BiNormal);
                    _vertexArray[i].Tangent  = Vector3.Normalize(_vertexArray[i].Tangent);

                    mesh.VertexList[i] = new DefaultVertex(
                        new RmvVector4(_vertexArray[i].Position.X, _vertexArray[i].Position.Y, _vertexArray[i].Position.Z, 1),
                        new RmvVector2(_vertexArray[i].TextureCoordinate.X, _vertexArray[i].TextureCoordinate.Y),
                        new RmvVector3(_vertexArray[i].Normal.X, _vertexArray[i].Normal.Y, _vertexArray[i].Normal.Z),
                        new RmvVector3(_vertexArray[i].BiNormal.X, _vertexArray[i].BiNormal.Y, _vertexArray[i].BiNormal.Z),
                        new RmvVector3(_vertexArray[i].Tangent.X, _vertexArray[i].Tangent.Y, _vertexArray[i].Tangent.Z)
                        );
                }
            }
            else if (_vertedFormat == VertexFormat.Weighted)
            {
                mesh.VertexList = new WeightedVertex[VertexCount()];
                for (int i = 0; i < mesh.VertexList.Length; i++)
                {
                    _vertexArray[i].Normal   = Vector3.Normalize(_vertexArray[i].Normal);
                    _vertexArray[i].BiNormal = Vector3.Normalize(_vertexArray[i].BiNormal);
                    _vertexArray[i].Tangent  = Vector3.Normalize(_vertexArray[i].Tangent);

                    mesh.VertexList[i] = new WeightedVertex(
                        new RmvVector4(_vertexArray[i].Position.X, _vertexArray[i].Position.Y, _vertexArray[i].Position.Z, 1),
                        new RmvVector2(_vertexArray[i].TextureCoordinate.X, _vertexArray[i].TextureCoordinate.Y),
                        new RmvVector3(_vertexArray[i].Normal.X, _vertexArray[i].Normal.Y, _vertexArray[i].Normal.Z),
                        new RmvVector3(_vertexArray[i].BiNormal.X, _vertexArray[i].BiNormal.Y, _vertexArray[i].BiNormal.Z),
                        new RmvVector3(_vertexArray[i].Tangent.X, _vertexArray[i].Tangent.Y, _vertexArray[i].Tangent.Z),
                        new BaseVertex.BoneInformation[2]
                    {
                        new BaseVertex.BoneInformation((byte)_vertexArray[i].BlendIndices.X, _vertexArray[i].BlendWeights.X),
                        new BaseVertex.BoneInformation((byte)_vertexArray[i].BlendIndices.Y, _vertexArray[i].BlendWeights.Y),
                    });
                }
            }
            else if (_vertedFormat == VertexFormat.Cinematic)
            {
                mesh.VertexList = new CinematicVertex[VertexCount()];
                for (int i = 0; i < mesh.VertexList.Length; i++)
                {
                    _vertexArray[i].Normal   = Vector3.Normalize(_vertexArray[i].Normal);
                    _vertexArray[i].BiNormal = Vector3.Normalize(_vertexArray[i].BiNormal);
                    _vertexArray[i].Tangent  = Vector3.Normalize(_vertexArray[i].Tangent);

                    mesh.VertexList[i] = new CinematicVertex(
                        new RmvVector4(_vertexArray[i].Position.X, _vertexArray[i].Position.Y, _vertexArray[i].Position.Z, 1),
                        new RmvVector2(_vertexArray[i].TextureCoordinate.X, _vertexArray[i].TextureCoordinate.Y),
                        new RmvVector3(_vertexArray[i].Normal.X, _vertexArray[i].Normal.Y, _vertexArray[i].Normal.Z),
                        new RmvVector3(_vertexArray[i].BiNormal.X, _vertexArray[i].BiNormal.Y, _vertexArray[i].BiNormal.Z),
                        new RmvVector3(_vertexArray[i].Tangent.X, _vertexArray[i].Tangent.Y, _vertexArray[i].Tangent.Z),
                        new BaseVertex.BoneInformation[4]
                    {
                        new BaseVertex.BoneInformation((byte)_vertexArray[i].BlendIndices.X, _vertexArray[i].BlendWeights.X),
                        new BaseVertex.BoneInformation((byte)_vertexArray[i].BlendIndices.Y, _vertexArray[i].BlendWeights.Y),
                        new BaseVertex.BoneInformation((byte)_vertexArray[i].BlendIndices.Z, _vertexArray[i].BlendWeights.Z),
                        new BaseVertex.BoneInformation((byte)_vertexArray[i].BlendIndices.W, _vertexArray[i].BlendWeights.W)
                    });
                }
            }
            else
            {
                throw new Exception("Unknown vertex format");
            }

            return(mesh);
        }