示例#1
0
        public static RenderModel BuildRenderModelFromFrame(FrameObjectSingleMesh Mesh)
        {
            if (Mesh.MaterialIndex == -1 && Mesh.MeshIndex == -1)
            {
                return(null);
            }

            FrameGeometry geom = SceneData.FrameResource.FrameGeometries[Mesh.Refs[FrameEntryRefTypes.Geometry]];
            FrameMaterial mat  = SceneData.FrameResource.FrameMaterials[Mesh.Refs[FrameEntryRefTypes.Material]];

            IndexBuffer[]  indexBuffers  = new IndexBuffer[geom.LOD.Length];
            VertexBuffer[] vertexBuffers = new VertexBuffer[geom.LOD.Length];

            // We need to retrieve buffers first.
            for (int c = 0; c != geom.LOD.Length; c++)
            {
                indexBuffers[c]  = SceneData.IndexBufferPool.GetBuffer(geom.LOD[c].IndexBufferRef.Hash);
                vertexBuffers[c] = SceneData.VertexBufferPool.GetBuffer(geom.LOD[c].VertexBufferRef.Hash);
            }

            if (indexBuffers[0] == null || vertexBuffers[0] == null)
            {
                return(null);
            }
            RenderModel model = new RenderModel();

            model.ConvertFrameToRenderModel(Mesh, geom, mat, indexBuffers, vertexBuffers);
            return(model);
        }
        private FrameObjectBase CreateSingleMesh()
        {
            FrameObjectBase mesh = new FrameObjectSingleMesh();

            Model model = new Model();

            model.FrameMesh = (mesh as FrameObjectSingleMesh);

            if (m2tBrowser.ShowDialog() == DialogResult.Cancel)
            {
                return(null);
            }

            if (m2tBrowser.FileName.ToLower().EndsWith(".m2t"))
            {
                model.ModelStructure.ReadFromM2T(new BinaryReader(File.Open(m2tBrowser.FileName, FileMode.Open)));
            }
            else if (m2tBrowser.FileName.ToLower().EndsWith(".fbx"))
            {
                if (model.ModelStructure.ReadFromFbx(m2tBrowser.FileName) == -1)
                {
                    return(null);
                }
            }

            mesh.Name.Set(model.ModelStructure.Name);
            model.CreateObjectsFromModel();
            mesh.AddRef(FrameEntryRefTypes.Mesh, model.FrameGeometry.RefID);
            mesh.AddRef(FrameEntryRefTypes.Material, model.FrameMaterial.RefID);
            SceneData.FrameResource.FrameMaterials.Add(model.FrameMaterial.RefID, model.FrameMaterial);
            SceneData.FrameResource.FrameGeometries.Add(model.FrameGeometry.RefID, model.FrameGeometry);

            dataGridView1.Rows.Add(ConvertEntryToDataGridView(model.FrameMaterial));
            dataGridView1.Rows.Add(ConvertEntryToDataGridView(model.FrameGeometry));

            //Check for existing buffer; if it exists, remove so we can add one later.
            if (SceneData.IndexBufferPool.SearchBuffer(model.IndexBuffers[0].Hash) != null)
            {
                SceneData.IndexBufferPool.RemoveBuffer(model.IndexBuffers[0]);
            }

            //do the same for vertexbuffer pools.
            if (SceneData.VertexBufferPool.SearchBuffer(model.VertexBuffers[0].Hash) != null)
            {
                SceneData.VertexBufferPool.RemoveBuffer(model.VertexBuffers[0]);
            }

            SceneData.IndexBufferPool.AddBuffer(model.IndexBuffers[0]);
            SceneData.VertexBufferPool.AddBuffer(model.VertexBuffers[0]);

            return(mesh);
        }
示例#3
0
 public Model(FrameObjectSingleMesh frameMesh, IndexBuffer[] indexBuffers, VertexBuffer[] vertexBuffers)
 {
     this.frameMesh     = frameMesh;
     this.indexBuffers  = indexBuffers;
     this.vertexBuffers = vertexBuffers;
     frameGeometry      = frameMesh.Geometry;
     frameMaterial      = frameMesh.Material;
     model           = new M2TStructure();
     model.IsSkinned = false;
     model.Name      = frameMesh.Name.ToString();
     model.AOTexture = frameMesh.OMTextureHash.String;
     model.BuildLods(frameGeometry, frameMaterial, vertexBuffers, indexBuffers);
 }
示例#4
0
        public bool ConvertFrameToRenderModel(FrameObjectSingleMesh mesh, FrameGeometry geom, FrameMaterial mats, IndexBuffer[] indexBuffers, VertexBuffer[] vertexBuffers)
        {
            if (mesh == null || geom == null || mats == null || indexBuffers[0] == null || vertexBuffers[0] == null)
            {
                return(false);
            }

            aoHash = mesh.OMTextureHash;
            SetTransform(mesh.WorldTransform);
            //DoRender = (mesh.SecondaryFlags == 4097 ? true : false);
            BoundingBox = mesh.Boundings;
            LODs        = new LOD[geom.NumLods];

            for (int i = 0; i != geom.NumLods; i++)
            {
                LOD lod = new LOD();
                lod.Indices    = indexBuffers[i].GetData();
                lod.ModelParts = new ModelPart[mats.LodMatCount[i]];

                for (int z = 0; z != mats.Materials[i].Length; z++)
                {
                    lod.ModelParts[z]              = new ModelPart();
                    lod.ModelParts[z].NumFaces     = (uint)mats.Materials[i][z].NumFaces;
                    lod.ModelParts[z].StartIndex   = (uint)mats.Materials[i][z].StartIndex;
                    lod.ModelParts[z].MaterialHash = mats.Materials[i][z].MaterialHash;
                    lod.ModelParts[z].Material     = MaterialsManager.LookupMaterialByHash(lod.ModelParts[z].MaterialHash);
                }

                lod.Vertices = new VertexLayouts.NormalLayout.Vertex[geom.LOD[i].NumVerts];
                int vertexSize;
                Dictionary <VertexFlags, FrameLOD.VertexOffset> vertexOffsets = geom.LOD[i].GetVertexOffsets(out vertexSize);
                try
                {
                    for (int x = 0; x != lod.Vertices.Length; x++)
                    {
                        VertexLayouts.NormalLayout.Vertex vertex = new VertexLayouts.NormalLayout.Vertex();

                        //declare data required and send to decompresser
                        byte[] data = new byte[vertexSize];
                        Array.Copy(vertexBuffers[i].Data, (x * vertexSize), data, 0, vertexSize);
                        Vertex decompressed = VertexTranslator.DecompressVertex(data, geom.LOD[i].VertexDeclaration, geom.DecompressionOffset, geom.DecompressionFactor, vertexOffsets);

                        //retrieve the data we require
                        vertex.Position  = decompressed.Position;
                        vertex.Normal    = decompressed.Normal;
                        vertex.Tangent   = decompressed.Tangent;
                        vertex.Binormal  = decompressed.Binormal;
                        vertex.TexCoord0 = decompressed.UVs[0];
                        vertex.TexCoord7 = decompressed.UVs[3];

                        lod.Vertices[x] = vertex;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(string.Format("Error when creating renderable {1}!: \n{0}", ex.Message, mesh.Name.ToString()), "Toolkit");
                    return(false);
                }
                LODs[i] = lod;
            }

            SetupShaders();
            return(true);
        }
        private void importFrameEDDButton_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Warning! This is a very WIP feature and has not been tested. \n\nIf you want to use it, select an FBX file with multiple objects. They will be converted and added into the Frame Resource as objects. \n The M2FBX tool will export each model into seperate files, so you'll have to manually delete them afterwards. \n");
            NewObjectForm form = new NewObjectForm(false);

            form.SetLabel(Language.GetString("$QUESTION_NOT_NEEDED"));
            form.LoadOption(new FrameResourceSceneOption());
            form.ShowDialog();

            if (form.type == -1)
            {
                return;
            }

            FrameResourceSceneOption control = form.control as FrameResourceSceneOption;
            Vector3 offsetVector             = control.GetOffset();

            control.Dispose();
            form.Dispose();

            //check if the user cancels.
            if (eddBrowser.ShowDialog() == DialogResult.Cancel)
            {
                return;
            }

            CustomEDD frameData            = new CustomEDD();
            string    frameParentDirectory = "";

            //check if the filename is correct.
            if (eddBrowser.FileName.ToLower().EndsWith(".edd"))
            {
                FileInfo file = new FileInfo(eddBrowser.FileName);

                //check if the file actually exists.
                if (!file.Exists)
                {
                    return;
                }

                frameParentDirectory = file.Directory.FullName;

                using (BinaryReader reader = new BinaryReader(File.Open(file.FullName, FileMode.Open)))
                {
                    frameData.ReadFromFile(reader);
                }
            }
            else if (eddBrowser.FileName.ToLower().EndsWith(".fbx"))
            {
                FileInfo file = new FileInfo(eddBrowser.FileName);

                //check if the file actually exists.
                if (!file.Exists)
                {
                    return;
                }

                frameParentDirectory = file.Directory.FullName;
                frameData.ReadFromFbx(file);
            }

            int done = 0;

            foreach (CustomEDD.Entry entry in frameData.Entries)
            {
                FrameObjectSingleMesh mesh = new FrameObjectSingleMesh();
                Model model = new Model();
                model.FrameMesh = mesh;

                string path = frameParentDirectory + "//" + entry.LODNames[0] + ".m2t";

                using (BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open)))
                {
                    model.ModelStructure.ReadFromM2T(reader);
                }

                mesh.Name.Set(model.ModelStructure.Name);
                model.CreateObjectsFromModel();
                mesh.AddRef(FrameEntryRefTypes.Mesh, model.FrameGeometry.RefID);
                mesh.AddRef(FrameEntryRefTypes.Material, model.FrameMaterial.RefID);
                SceneData.FrameResource.FrameMaterials.Add(model.FrameMaterial.RefID, model.FrameMaterial);
                SceneData.FrameResource.FrameGeometries.Add(model.FrameGeometry.RefID, model.FrameGeometry);
                DataGridViewRow row = new DataGridViewRow();
                row.Tag = mesh;
                row.CreateCells(dataGridView1, new object[] { dataGridView1.Rows.Count - 1, model.FrameMaterial.ToString() });
                dataGridView1.Rows.Add(row);
                row     = new DataGridViewRow();
                row.Tag = mesh;
                row.CreateCells(dataGridView1, new object[] { dataGridView1.Rows.Count - 1, model.FrameGeometry.ToString() });
                dataGridView1.Rows.Add(row);

                //Check for existing buffer; if it exists, remove so we can add one later.
                if (SceneData.IndexBufferPool.SearchBuffer(model.IndexBuffers[0].Hash) != null)
                {
                    SceneData.IndexBufferPool.RemoveBuffer(model.IndexBuffers[0]);
                }

                //do the same for vertexbuffer pools.
                if (SceneData.VertexBufferPool.SearchBuffer(model.VertexBuffers[0].Hash) != null)
                {
                    SceneData.VertexBufferPool.RemoveBuffer(model.VertexBuffers[0]);
                }

                SceneData.IndexBufferPool.AddBuffer(model.IndexBuffers[0]);
                SceneData.VertexBufferPool.AddBuffer(model.VertexBuffers[0]);

                mesh.UpdateNode();

                FrameHeaderScene scene = SceneData.FrameResource.FrameScenes.ElementAt(0).Value;
                mesh.SubRef(FrameEntryRefTypes.Parent2);
                mesh.AddRef(FrameEntryRefTypes.Parent2, scene.RefID);
                mesh.ParentIndex2.Index  = 0;
                mesh.ParentIndex2.RefID  = scene.RefID;
                mesh.ParentIndex2.Name   = scene.Name.String;
                mesh.IsOnFrameTable      = true;
                mesh.FrameNameTableFlags = 0;

                mesh.Matrix.Position  = entry.Position;
                mesh.Matrix.Position += offsetVector;
                //entry.Rotation.ChangeHandedness();
                mesh.Matrix.Rotation = entry.Rotation;

                treeView1.Nodes.Add(CreateTreeNode(mesh));
                SceneData.FrameResource.FrameObjects.Add(mesh.RefID, mesh);
                row     = new DataGridViewRow();
                row.Tag = mesh;
                row.CreateCells(dataGridView1, new object[] { dataGridView1.Rows.Count - 1, mesh.Name.String });
                dataGridView1.Rows.Add(row);
                done++;
                Console.WriteLine("Done number {0}/{1} {2}", done, frameData.EntryCount, mesh.Name.String);
            }
            PopulateForm();
        }
        private void ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {
            if (treeView1.SelectedNode == null)
            {
                return;
            }

            if (e.ClickedItem.Name == "contextExtract3D")
            {
                FrameObjectSingleMesh mesh = treeView1.SelectedNode.Tag as FrameObjectSingleMesh;

                FrameGeometry  geom          = SceneData.FrameResource.FrameGeometries[mesh.Refs["Mesh"]];
                FrameMaterial  mat           = SceneData.FrameResource.FrameMaterials[mesh.Refs["Material"]];
                IndexBuffer[]  indexBuffers  = new IndexBuffer[geom.LOD.Length];
                VertexBuffer[] vertexBuffers = new VertexBuffer[geom.LOD.Length];

                //we need to retrieve buffers first.
                for (int c = 0; c != geom.LOD.Length; c++)
                {
                    indexBuffers[c]  = SceneData.IndexBufferPool.GetBuffer(geom.LOD[c].IndexBufferRef.uHash);
                    vertexBuffers[c] = SceneData.VertexBufferPool.GetBuffer(geom.LOD[c].VertexBufferRef.uHash);
                }

                Model newModel = new Model(mesh, indexBuffers, vertexBuffers, geom, mat);
                newModel.ModelStructure.ExportToM2T(ToolkitSettings.ExportPath + "\\");
                switch (ToolkitSettings.Format)
                {
                case 0:
                    newModel.ModelStructure.ExportToFbx(ToolkitSettings.ExportPath + "\\", false);
                    break;

                case 1:
                    newModel.ModelStructure.ExportToFbx(ToolkitSettings.ExportPath + "\\", true);
                    break;

                case 2:
                    newModel.ModelStructure.ExportToM2T(ToolkitSettings.ExportPath + "\\");
                    break;

                default:
                    Log.WriteLine("Error! Unknown value set for ToolkitSettings.Format!", LoggingTypes.ERROR);
                    break;
                }
            }
            else if (e.ClickedItem.Name == "contextUpdateParents")
            {
                FrameObjectBase obj    = treeView1.SelectedNode.Tag as FrameObjectBase;
                ListWindow      window = new ListWindow();
                window.PopulateForm(true);
                window.ShowDialog();
                if (window.type == -1)
                {
                    return;
                }

                int refID = (window.chosenObject as FrameEntry).RefID;
                obj.IsOnFrameTable     = true;
                obj.ParentIndex2.Index = window.chosenObjectIndex;
                obj.ParentIndex2.RefID = refID;
                obj.SubRef(FrameEntryRefTypes.Parent2);
                obj.AddRef(FrameEntryRefTypes.Parent2, refID);
                obj.UpdateNode();

                treeView1.Nodes.Remove(treeView1.SelectedNode);
                TreeNode newNode = CreateTreeNode(obj);
                treeView1.Nodes[window.chosenObjectIndex].Nodes.Add(newNode);
            }
        }
        private void ExportModels(List <object> meshes)
        {
            string[]   fileNames = new string[meshes.Count];
            Vector3[]  filePos   = new Vector3[meshes.Count];
            Matrix33[] rotPos    = new Matrix33[meshes.Count];

            CustomEDD frameEDD = new CustomEDD();

            frameEDD.Entries = new List <CustomEDD.Entry>();

            Parallel.For(0, meshes.Count, i =>
            {
                CustomEDD.Entry entry        = new CustomEDD.Entry();
                FrameObjectSingleMesh mesh   = (meshes[i] as FrameObjectSingleMesh);
                FrameGeometry geom           = SceneData.FrameResource.FrameGeometries[mesh.Refs["Mesh"]];
                FrameMaterial mat            = SceneData.FrameResource.FrameMaterials[mesh.Refs["Material"]];
                IndexBuffer[] indexBuffers   = new IndexBuffer[geom.LOD.Length];
                VertexBuffer[] vertexBuffers = new VertexBuffer[geom.LOD.Length];

                //we need to retrieve buffers first.
                for (int c = 0; c != geom.LOD.Length; c++)
                {
                    indexBuffers[c]  = SceneData.IndexBufferPool.GetBuffer(geom.LOD[c].IndexBufferRef.uHash);
                    vertexBuffers[c] = SceneData.VertexBufferPool.GetBuffer(geom.LOD[c].VertexBufferRef.uHash);
                }

                Model newModel = new Model(mesh, indexBuffers, vertexBuffers, geom, mat);

                //if (mesh.ParentIndex1.Index != -1)
                //{
                //    FrameObjectBase parent = (SceneData.FrameResource.EntireFrame[mesh.ParentIndex1.Index] as FrameObjectBase);
                //    filePos[i] = RetrieveParent1Position(mesh);
                //}

                //if (((mesh.ParentIndex1.Index != -1)) && ((mesh.ParentIndex1.Index == mesh.ParentIndex2.Index)))
                //{
                //    FrameObjectFrame frame = SceneData.FrameResource.EntireFrame[mesh.ParentIndex1.Index] as FrameObjectFrame;
                //    if (frame.Item != null)
                //    {
                //        filePos[i] = frame.Item.Position;
                //    }
                //}

                entry.LodCount = newModel.ModelStructure.Lods.Length;
                entry.LODNames = new string[entry.LodCount];

                for (int c = 0; c != newModel.ModelStructure.Lods.Length; c++)
                {
                    newModel.ModelStructure.ExportToM2T(ToolkitSettings.ExportPath + "\\");
                    switch (ToolkitSettings.Format)
                    {
                    case 0:
                        newModel.ModelStructure.ExportToFbx(ToolkitSettings.ExportPath + "\\", false);
                        break;

                    case 1:
                        newModel.ModelStructure.ExportToFbx(ToolkitSettings.ExportPath + "\\", true);
                        break;

                    case 2:
                        newModel.ModelStructure.ExportToM2T(ToolkitSettings.ExportPath + "\\");
                        break;

                    default:
                        Log.WriteLine("Error! Unknown value set for ToolkitSettings.Format!", LoggingTypes.ERROR);
                        break;
                    }
                    Console.WriteLine(newModel.FrameMesh.Name.String);
                    if (newModel.FrameMesh.Name.String == "")
                    {
                        entry.LODNames[c] = newModel.FrameGeometry.LOD[c].VertexBufferRef.String;
                    }
                    else
                    {
                        entry.LODNames[c] = newModel.FrameMesh.Name.String;
                    }
                }
                entry.Position = mesh.Matrix.Position;
                entry.Rotation = mesh.Matrix.Rotation;

                frameEDD.Entries.Add(entry);
            });
            frameEDD.EntryCount = frameEDD.Entries.Count;
            using (BinaryWriter writer = new BinaryWriter(File.Create(ToolkitSettings.ExportPath + "\\" + "frame.edd")))
            {
                frameEDD.WriteToFile(writer);
            }
        }
示例#8
0
        public bool ConvertFrameToRenderModel(FrameObjectSingleMesh mesh, FrameGeometry geom, FrameMaterial mats, IndexBuffer[] indexBuffers, VertexBuffer[] vertexBuffers)
        {
            if (mesh == null || geom == null || mats == null || indexBuffers == null || vertexBuffers == null)
            {
                return(false);
            }

            aoHash = mesh.OMTextureHash;
            SetTransform(mesh.Matrix.Position, mesh.Matrix.Matrix);
            //DoRender = (mesh.SecondaryFlags == 4097 ? true : false);
            BoundingBox = new RenderBoundingBox();
            BoundingBox.Init(mesh.Boundings);
            BoundingBox.SetTransform(Transform);
            BoundingBox.DoRender = false;
            LODs = new LOD[geom.NumLods];

            for (int i = 0; i != geom.NumLods; i++)
            {
                LOD lod = new LOD();
                lod.Indices    = indexBuffers[i].Data;
                lod.ModelParts = new ModelPart[mats.LodMatCount[i]];

                for (int z = 0; z != mats.Materials[i].Length; z++)
                {
                    lod.ModelParts[z]              = new ModelPart();
                    lod.ModelParts[z].NumFaces     = (uint)mats.Materials[i][z].NumFaces;
                    lod.ModelParts[z].StartIndex   = (uint)mats.Materials[i][z].StartIndex;
                    lod.ModelParts[z].MaterialHash = mats.Materials[i][z].MaterialHash;
                    lod.ModelParts[z].Material     = MaterialsManager.LookupMaterialByHash(lod.ModelParts[z].MaterialHash);
                }

                lod.Vertices = new VertexLayouts.NormalLayout.Vertex[geom.LOD[i].NumVertsPr];
                int vertexSize;
                Dictionary <VertexFlags, FrameLOD.VertexOffset> vertexOffsets = geom.LOD[i].GetVertexOffsets(out vertexSize);

                for (int x = 0; x != lod.Vertices.Length; x++)
                {
                    VertexLayouts.NormalLayout.Vertex vertex = new VertexLayouts.NormalLayout.Vertex();

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.Position))
                    {
                        int startIndex = x * vertexSize + vertexOffsets[VertexFlags.Position].Offset;
                        vertex.Position = VertexTranslator.ReadPositionDataFromVB(vertexBuffers[i].Data, startIndex, geom.DecompressionFactor, geom.DecompressionOffset);
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.Tangent))
                    {
                        int startIndex = x * vertexSize + vertexOffsets[VertexFlags.Position].Offset;
                        vertex.Tangent = VertexTranslator.ReadTangentDataFromVB(vertexBuffers[i].Data, startIndex);
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.Normals))
                    {
                        int startIndex = x * vertexSize + vertexOffsets[VertexFlags.Normals].Offset;
                        vertex.Normal = VertexTranslator.ReadNormalDataFromVB(vertexBuffers[i].Data, startIndex);
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.Skin))
                    {
                        //int startIndex = v * vertexSize + vertexOffsets[VertexFlags.BlendData].Offset;
                        // vertex.BlendWeight = VertexTranslator.ReadBlendWeightFromVB(vertexBuffer.Data, startIndex);
                        // vertex.BoneID = VertexTranslator.ReadBlendIDFromVB(vertexBuffer.Data, startIndex);
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.Color))
                    {
                        //unknown
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.TexCoords0))
                    {
                        int startIndex = x * vertexSize + vertexOffsets[VertexFlags.TexCoords0].Offset;
                        vertex.TexCoord0 = VertexTranslator.ReadTexcoordFromVB(vertexBuffers[i].Data, startIndex);
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.TexCoords1))
                    {
                        //int startIndex = v * vertexSize + vertexOffsets[VertexFlags.TexCoords1].Offset;
                        //vertex.UVs[1] = VertexTranslator.ReadTexcoordFromVB(vertexBuffer.Data, startIndex);
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.TexCoords2))
                    {
                        //int startIndex = v * vertexSize + vertexOffsets[VertexFlags.TexCoords2].Offset;
                        //vertex.UVs[2] = VertexTranslator.ReadTexcoordFromVB(vertexBuffer.Data, startIndex);
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.ShadowTexture))
                    {
                        int startIndex = x * vertexSize + vertexOffsets[VertexFlags.ShadowTexture].Offset;
                        vertex.TexCoord7 = VertexTranslator.ReadTexcoordFromVB(vertexBuffers[i].Data, startIndex);
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.Color1))
                    {
                        //unknown
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.BBCoeffs))
                    {
                        //unknown
                    }

                    if (geom.LOD[i].VertexDeclaration.HasFlag(VertexFlags.DamageGroup))
                    {
                        //int startIndex = v * vertexSize + vertexOffsets[VertexFlags.DamageGroup].Offset;
                        //vertex.DamageGroup = VertexTranslator.ReadDamageGroupFromVB(vertexBuffer.Data, startIndex);
                    }

                    lod.Vertices[x] = vertex;
                }
                LODs[i] = lod;
            }

            SetupShaders();
            return(true);
        }