public View(Scene xiScene, Camera xiCamera, AbstractRenderer xiRenderer) { mScene = xiScene; mCamera = xiCamera; mRenderer = xiRenderer; xiRenderer.NextFrame += new AbstractRenderer.NextFrameEventHandler(Renderer_NextFrame); }
public MMEdEditorView(ThreeDeeEditor xiViewer, Scene xiScene, Camera xiCamera, AbstractRenderer xiRenderer) : base(xiScene, xiCamera, xiRenderer) { mViewer = xiViewer; }
void Renderer_NextFrame(AbstractRenderer xiSender, EventArgs xiArgs) { RenderScene(); }
public MMEdViewerView(ThreeDeeViewer xiViewer, Scene xiScene, Camera xiCamera, AbstractRenderer xiRenderer) : base(xiScene, xiCamera, xiRenderer) { mViewer = xiViewer; }
public void genVehicleInfoData() { sortByLevelTypeNationName(); renderer = new VehicleInfoData(); renderer.buildFile(vehicles); }
public void genVehicleNames() { sortByNationName(); renderer = new VehicleNames(); renderer.buildFile(vehicles); }
public override void Draw(AbstractRenderer renderer) { renderer.DrawState(this.SpritesInState); //// Globals.Graphics.GraphicsDevice.Clear(Color.CornflowerBlue); }
private void InitialiseThreeDeeView() { if (mSubject == null) { return; } int SCALE = 256; int GRIDSIZE = 9; // Should be an odd number so the centre is the middle of a tile. mRenderer = new ImmediateModeRenderer(); mRenderer.Attach(mMainForm.CameraRenderingSurface); mScene = new Scene(); mCamera = new Camera(80, 0.1, 1e10); mView = new GLTK.View(mScene, mCamera, mRenderer); mScene.Clear(); if (mMainForm.CurrentLevel != null) { // Create a surface and fill it with a 10 x 10 grid of squares MMEdEntity lSurface = new MMEdEntity(mSubject); for (int x = 0; x < GRIDSIZE; x++) { for (int y = 0; y < GRIDSIZE; y++) { Mesh lSquare = new OwnedMesh(mSubject, PolygonMode.Quads); lSquare.AddFace( new Vertex(new GLTK.Point(x, y, 0), 0, 0), new Vertex(new GLTK.Point(x + 1, y, 0), 1, 0), new Vertex(new GLTK.Point(x + 1, y + 1, 0), 1, 1), new Vertex(new GLTK.Point(x, y + 1, 0), 0, 1)); lSquare.RenderMode = RenderMode.Wireframe; lSurface.Meshes.Add(lSquare); } } // Add it to the scene at the origin lSurface.Scale(SCALE, SCALE, 1.0); short lOffset = (short)(-SCALE * GRIDSIZE / 2); GLTK.Point lNewPos = ThreeDeeViewer.Short3CoordToPoint(new Short3Coord(lOffset, lOffset, 0)); lSurface.Position = new GLTK.Point(lNewPos.x, lNewPos.y, -lNewPos.z); mScene.AddRange(new MMEdEntity[] { lSurface }); // Use a random object from the level for now. Level lLevel = mMainForm.CurrentLevel; TMDChunk lObject = lLevel.GetObjtById(1); mScene.AddRange(lObject.GetEntities( mMainForm.CurrentLevel, MMEd.Viewers.ThreeDee.eTextureMode.NormalTextures, eTexMetaDataEntries.Steering)); string lExceptionWhen = "opening file"; try { ThreeDeeViewer.SceneHolder sh; string lFilename = string.Format("{0}{1}..{1}camera-editor-scene.xml", Path.GetDirectoryName( new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath), Path.DirectorySeparatorChar); using (FileStream fs = File.OpenRead(lFilename)) { lExceptionWhen = "deserialising the scene"; XmlSerializer xs = new XmlSerializer(typeof(ThreeDeeViewer.SceneHolder)); sh = (ThreeDeeViewer.SceneHolder)xs.Deserialize(fs); } lExceptionWhen = "fixing texture ids"; Dictionary <int, int> lSavedTexIdsToLiveTexIds = new Dictionary <int, int>(); foreach (ThreeDeeViewer.TextureHolder th in sh.Textures) { if (th.Bitmap != null) { lSavedTexIdsToLiveTexIds[th.ID] = AbstractRenderer.ImageToTextureId(th.Bitmap); } else { lSavedTexIdsToLiveTexIds[th.ID] = 0; } } foreach (Entity ent in sh.Entities) { foreach (Mesh m in ent.Meshes) { if (m.RenderMode == RenderMode.Textured) { m.Texture = lSavedTexIdsToLiveTexIds[m.Texture]; } } } mScene.Objects.Clear(); mScene.AddRange(sh.Entities); } catch (Exception err) { System.Diagnostics.Trace.WriteLine(err); MessageBox.Show(string.Format("Exception occurred while {0}: {1}", lExceptionWhen, err.Message), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } UpdateCameraThreeDee(); } else { System.Windows.Forms.MessageBox.Show("3D view is only available when editing a level"); mMainForm.CameraRenderingSurface.Visible = false; } }
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); }