public Entity GetEntity(Chunk xiRootChunk, eTextureMode xiTextureMode, eTexMetaDataEntries xiSelectedMetadata, object xiMeshOwner) { MMEdEntity lAcc = new MMEdEntity(xiMeshOwner); Mesh lColouredMesh = null; Dictionary <int, Mesh> lPageIdToTexturedMeshMap = new Dictionary <int, Mesh>(); List <Mesh> lTranslucentMeshes = new List <Mesh>(); //qq move all this into Face class? //qq add quad mode meshes (needs separate meshes currently...) Vertex[] lVBuff = new Vertex[4]; foreach (Face f in Faces) { if (!f.IsUnknownType()) { for (int v = 0; v < f.mVertexIds.Length; v++) { lVBuff[v] = new Vertex(ThreeDeeViewer.Short3CoordToPoint(Vertices[f.mVertexIds[v]])); //normal if (v < f.mNormalIds.Length) { lVBuff[v].Normal = ThreeDeeViewer.Short3CoordToPoint(Normals[f.mNormalIds[v]]).GetPositionVector().Normalise(); } else { lVBuff[v].Normal = ThreeDeeViewer.Short3CoordToPoint(Normals[f.mNormalIds[0]]).GetPositionVector().Normalise(); } //color: if (f.mColors != null && v < f.mColors.Length) { lVBuff[v].Color = Utils.PSRGBColorToColor(f.mColors[v]); } else if (f.mColors != null) { lVBuff[v].Color = Utils.PSRGBColorToColor(f.mColors[0]); } //tex coords if (f.mTexCoords != null && v < f.mTexCoords.Length) { lVBuff[v].TexCoordX = f.mTexCoords[v].X / (double)VRAMViewer.TEX_PAGE_WIDTH; lVBuff[v].TexCoordY = f.mTexCoords[v].Y / (double)VRAMViewer.TEX_PAGE_HEIGHT; } } // Create a new mesh if appropriate, or add this face to an existing mesh // First check if it's tex or solid? Mesh lMesh; if (f.mTexCoords != null) { if (!lPageIdToTexturedMeshMap.ContainsKey(f.mTexPage)) { lMesh = new OwnedMesh(xiMeshOwner); lPageIdToTexturedMeshMap[f.mTexPage] = lMesh; if (xiTextureMode == eTextureMode.NormalTextures || xiTextureMode == eTextureMode.NormalTexturesWithMetadata) { lMesh.RenderMode = RenderMode.Textured; lMesh.Texture = AbstractRenderer.ImageToTextureId( VRAMViewer.GetInstance().GetTexturePage(xiRootChunk, f.mTexPage)); } else { lMesh.RenderMode = RenderMode.Wireframe; } } else { lMesh = lPageIdToTexturedMeshMap[f.mTexPage]; } } else { if (f.IsTranslucent()) { lMesh = new OwnedMesh(xiMeshOwner); if (xiTextureMode == eTextureMode.NormalTextures || xiTextureMode == eTextureMode.NormalTexturesWithMetadata) { lMesh.RenderMode = RenderMode.TranslucentFilled; } else { lMesh.RenderMode = RenderMode.Wireframe; } lTranslucentMeshes.Add(lMesh); } else { if (lColouredMesh == null) { lColouredMesh = new OwnedMesh(xiMeshOwner); if (xiTextureMode == eTextureMode.NormalTextures || xiTextureMode == eTextureMode.NormalTexturesWithMetadata) { lColouredMesh.RenderMode = RenderMode.Filled; } else { lColouredMesh.RenderMode = RenderMode.Wireframe; } } lMesh = lColouredMesh; } } if (f.mVertexIds.Length == 3) { lMesh.AddFace(lVBuff[0], lVBuff[1], lVBuff[2]); } else //4 { lMesh.AddFace(lVBuff[0], lVBuff[1], lVBuff[2]); lMesh.AddFace(lVBuff[0], lVBuff[2], lVBuff[3]); } } } foreach (Mesh lTexturedMesh in lPageIdToTexturedMeshMap.Values) { lAcc.Meshes.Add(lTexturedMesh); } if (lColouredMesh != null) { lAcc.Meshes.Add(lColouredMesh); } lAcc.Meshes.AddRange(lTranslucentMeshes); lAcc.Scale(1, 1, -1); return(lAcc); }
public Bitmap GetTexturePageById(int xiId) { return(VRAMViewer.GetInstance().GetTexturePage(this, xiId)); }