Example #1
0
        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);
        }
Example #2
0
        private GLTK.Entity GetSurfaceEntity(Level xiLevel, eTextureMode xiTextureMode, eTexMetaDataEntries xiSelectedMetadata)
        {
            // notes:
            // invert the textures along the y-axis
            // use level co-ords, so z is down

            /////////////////////////////////////////////////////
            // The surface
            Entity lSurface = new MMEdEntity(this);

            Font  lNumberFont = null;
            Brush lNumberFGBrush = null, lNumberBGBrush = null;
            Pen   lWaypointPen = null, lKeyWaypointPen = null;

            if (xiTextureMode == eTextureMode.NormalTexturesWithMetadata)
            {
                lNumberFont     = new Font(FontFamily.GenericMonospace, 10);
                lNumberFGBrush  = new SolidBrush(Color.Black);
                lNumberBGBrush  = new SolidBrush(Color.White);
                lWaypointPen    = new Pen(Color.Black, 1f);
                lKeyWaypointPen = new Pen(Color.Red, 2f);
            }

            for (int x = 0; x < Width; x++)
            {
                for (int y = 0; y < Height; y++)
                {
                    Mesh lSquare = new OwnedMesh(this, PolygonMode.Quads);
                    lSquare.AddFace(
                        new Vertex(new Point(x, y, -GetTerrainHeightSafe(x, y)), 0, 0),
                        new Vertex(new Point(x + 1, y, -GetTerrainHeightSafe(x + 1, y)), 1, 0),
                        new Vertex(new Point(x + 1, y + 1, -GetTerrainHeightSafe(x + 1, y + 1)), 1, 1),
                        new Vertex(new Point(x, y + 1, -GetTerrainHeightSafe(x, y + 1)), 0, 1));

                    switch (xiTextureMode)
                    {
                    case eTextureMode.WireFrame:
                        lSquare.RenderMode = RenderMode.Wireframe;
                        break;

                    // normal textures, optionally with metadata drawn on
                    case eTextureMode.NormalTextures:
                    case eTextureMode.NormalTexturesWithMetadata:
                        TIMChunk lTIM = xiLevel.GetTileById(TextureIds[x][y]);

                        if (lTIM != null)
                        {
                            //some TIMs can't be loaded yet: they're null
                            Bitmap lTexture = lTIM.ToBitmap();
                            if (xiTextureMode == eTextureMode.NormalTexturesWithMetadata &&
                                TexMetaData != null)
                            {
                                byte lVal = TexMetaData[x][y][(int)xiSelectedMetadata];

                                if (lVal != 0)
                                {
                                    // we create a new bitmap based on the given texture
                                    // a) so that we can modify it freely
                                    // and b) to change it from indexed to full colour mode, to allow us
                                    // to draw on it (otherwise we'll get an exception)
                                    lTexture = new Bitmap(lTexture);

                                    Graphics g = Graphics.FromImage(lTexture);

                                    string lText = lVal.ToString();

                                    SizeF size = g.MeasureString(lText, lNumberFont);

                                    float xf = lTexture.Width / 2.0f - size.Width / 2.0f;
                                    float yf = lTexture.Height / 2.0f - size.Height / 2.0f;

                                    g.FillRectangle(lNumberBGBrush, xf, yf, size.Width, size.Height);

                                    g.DrawString(
                                        lText,
                                        lNumberFont,
                                        lNumberFGBrush,
                                        xf,
                                        yf);

                                    if (xiSelectedMetadata == eTexMetaDataEntries.Waypoint)
                                    {
                                        Pen lPen = xiLevel.WaypointIsKeyWaypoint(lVal)
                          ? lKeyWaypointPen
                          : lWaypointPen;

                                        g.DrawRectangle(
                                            lPen,
                                            0, 0, lTexture.Width - 1, lTexture.Height - 1);
                                    }
                                }
                            }

                            lSquare.Texture = AbstractRenderer.ImageToTextureId(lTexture);
                        }
                        break;

                    //draw the bumpmap textures on:
                    case eTextureMode.BumpmapTextures:
                        if (TexMetaData != null)
                        {
                            BumpImageChunk lBIC = xiLevel.GetBumpById(TexMetaData[x][y][(int)eTexMetaDataEntries.Bumpmap]);

                            if (lBIC != null)
                            {
                                Bitmap lTexture = lBIC.ToBitmap();
                                lSquare.Texture = AbstractRenderer.ImageToTextureId(lTexture);
                            }
                        }
                        break;

                    default: throw new Exception("Unexpected case");
                    } //end switch

                    lSurface.Meshes.Add(lSquare);
                }
            }

            lSurface.Scale(ScaleX, ScaleY, 1.0);
            if (RotationVector.Norm() != 0)
            {
                //the rotation is z-y-x
                lSurface.RotateAboutWorldOrigin(RotationVector.Z / 1024.0 * Math.PI / 2.0, Vector.ZAxis);
                lSurface.RotateAboutWorldOrigin(-RotationVector.Y / 1024.0 * Math.PI / 2.0, Vector.YAxis);
                lSurface.RotateAboutWorldOrigin(-RotationVector.X / 1024.0 * Math.PI / 2.0, Vector.XAxis);
            }

            Point lNewPos = ThreeDeeViewer.Short3CoordToPoint(OriginPosition);

            lSurface.Position = new Point(lNewPos.x, lNewPos.y, -lNewPos.z);

            return(lSurface);
        }