public void ImportWavefrontObject(WavefrontObject Wavefront, CompressionBounds boundingBox) { List<D3DVertex> temp = new List<D3DVertex>(Wavefront.FaceCount * 3); for (int Material = 0; Material < Wavefront.MaterialCount; Material++) { int[] FaceIndices = Wavefront.GetFaceIndicesUsingMaterialID(Material); for (int Face = 0; Face < FaceIndices.Length; Face++) { for (int Component = 0; Component < 3; Component++) { D3DVertex d3DVertex = new D3DVertex(); d3DVertex.Position = Wavefront.Vertices[Wavefront.Faces[FaceIndices[Face]].VertexIndices[Component]]; d3DVertex.Texture = Wavefront.Texcoords[Wavefront.Faces[FaceIndices[Face]].TexcoordIndices[Component]]; d3DVertex.Normal = Wavefront.Normals[Wavefront.Faces[FaceIndices[Face]].NormalIndices[Component]]; temp.Add(d3DVertex); } } } //Hashtable D3DVertexHashtable = new Hashtable(Wavefront.FaceCount * 3); List<short> tempIndices = new List<short>(Wavefront.FaceCount * 3); List<D3DVertex> D3DVertexList = new List<D3DVertex>(Wavefront.FaceCount * 3); short IndiceIndex = 0; for (int Index = 0; Index < temp.Count; Index++) { D3DVertex d3DVertex = temp[Index]; if (!D3DVertexList.Contains(d3DVertex)) { //D3DVertexHashtable.Add(d3DVertex, d3DVertex); D3DVertexList.Add(d3DVertex); tempIndices.Add(IndiceIndex); IndiceIndex++; } else { tempIndices.Add((short)D3DVertexList.IndexOf(d3DVertex)); } } this.Indices = tempIndices.ToArray(); D3DVertex[] D3DVertices = D3DVertexList.ToArray(); RenderDevice Device = new RenderDevice(); Device.InitializeDevice(); Microsoft.DirectX.Direct3D.Mesh mesh = new Microsoft.DirectX.Direct3D.Mesh(Wavefront.FaceCount, D3DVertices.Length, MeshFlags.SystemMemory, D3DVertex.Format, Device.Device); List<int> newAttributes = new List<int>(Wavefront.FaceCount); foreach (Face f in Wavefront.Faces) { newAttributes.Add(f.MaterialID); } mesh.LockAttributeBuffer(LockFlags.None); mesh.UnlockAttributeBuffer(newAttributes.ToArray()); mesh.SetIndexBufferData(Indices.ToArray(), LockFlags.None); mesh.SetVertexBufferData(D3DVertices.ToArray(), LockFlags.None); int[] adj = new int[Wavefront.FaceCount * 3]; mesh.GenerateAdjacency(0.005F, adj); mesh.OptimizeInPlace(MeshFlags.OptimizeAttributeSort, adj); IndexBuffer iBuffer = mesh.IndexBuffer; short[] D3DIndices; int IndiceCount; short[][] MaterialFaceIndices = new short[Wavefront.MaterialCount][]; for (int Material = 0; Material < Wavefront.MaterialCount; Material++) { iBuffer = Microsoft.DirectX.Direct3D.Mesh.ConvertMeshSubsetToSingleStrip(mesh, Material, MeshFlags.SystemMemory, out IndiceCount); GraphicsStream graphics = iBuffer.Lock(0, 0, LockFlags.None); unsafe { short* IndiceArray = (short*)graphics.InternalData.ToPointer(); D3DIndices = new short[IndiceCount]; for (int Index = 0; Index < IndiceCount; Index++) { D3DIndices[Index] = IndiceArray[Index]; } } MaterialFaceIndices[Material] = D3DIndices; } List<short> newIndices = new List<short>(); Groups = new Group[MaterialFaceIndices.Length]; for (int i = 0; i < MaterialFaceIndices.Length; i++) { Groups[i] = new Group(); Groups[i].IndiceStart = (short)newIndices.Count; Groups[i].IndiceCount = (short)MaterialFaceIndices[i].Length; Groups[i].ShaderIndex = (short)i; newIndices.AddRange(MaterialFaceIndices[i]); } this.Indices = newIndices.ToArray(); this._Vertices = new Vector3[D3DVertices.Length]; this.Texcoords = new Vector2[D3DVertices.Length]; this.Normals = new Vector3[D3DVertices.Length]; for (int i = 0; i < D3DVertices.Length; i++) { _Vertices[i] = D3DVertices[i].Position; Texcoords[i] = D3DVertices[i].Texture; Normals[i] = D3DVertices[i].Normal; } CalculateTangentArray(_Vertices.Length, _Vertices, Normals, Texcoords, mesh.NumberFaces, Wavefront.Faces.ToArray(), out Bitangents, out Tangents); mesh.Dispose(); }