// render the scene. public void Render() { if (GameEngine.IsInError || SurfaceId == 0 || Visible == false || Width == 0 || Height == 0 || Game == null) { return; } NativeObjectAdapter gameLevel = GameEngine.GetGameLevel(); try { NativeObjectAdapter game = Game.As <NativeObjectAdapter>(); GameEngine.SetGameLevel(game); GameEngine.SetRenderState(m_renderState); if (Game.RootGameObjectFolder.GameObjects.Count > 0) { GameEngine.Update(0, 0, true); } if (ResetCamera) { // save view type ViewTypes viewtype = this.ViewType; ViewType = ViewTypes.Perspective; Size sz = ClientSize; float aspect = (float)sz.Width / (float)sz.Height; IBoundable boundable = Game.RootGameObjectFolder.Cast <IBoundable>(); Sce.Atf.VectorMath.Sphere3F sphere = boundable.BoundingBox.ToSphere(); float nearZ = sphere.Radius * 0.01f; nearZ = Math.Min(0.1f, nearZ); Camera.SetPerspective( (float)Math.PI / 4, aspect, nearZ, sphere.Radius * 10.0f); Vec3F camPos = sphere.Center + new Vec3F(sphere.Radius, sphere.Radius, sphere.Radius) * 1.2f; Camera.Set(camPos, sphere.Center, new Vec3F(0, 1, 0)); ViewType = viewtype; ResetCamera = false; } GameEngine.Begin(SurfaceId, Camera.ViewMatrix, Camera.ProjectionMatrix); if (Game.RootGameObjectFolder.GameObjects.Count > 0) { GameEngine.RenderGame(); } string str = "View Type: " + ViewType.ToString(); GameEngine.DrawText2D(str, Util3D.CaptionFont, 1, 1, Color.White); GameEngine.End(); } finally { GameEngine.SetGameLevel(gameLevel); } }
public void Render(Camera cam) { GameEngine.SetRendererFlag(BasicRendererFlags.WireFrame); IGrid grid = this.As <IGrid>(); if (grid.Visible == false) { return; } float s = grid.Size; Matrix4F scale = new Matrix4F(); scale.Scale(new Vec3F(s, s, s)); Matrix4F gridXform = new Matrix4F(); if (cam.Frustum.IsOrtho) { float dist = cam.ViewMatrix.Translation.Z; ViewTypes vt = cam.ViewType; if (vt == ViewTypes.Top) { gridXform.Translation = new Vec3F(0, dist, 0); } else if (vt == ViewTypes.Bottom) { gridXform.Translation = new Vec3F(0, -dist, 0); } else if (vt == ViewTypes.Right) { gridXform.RotZ(MathHelper.PiOver2); gridXform.Translation = new Vec3F(dist, 0, 0); } else if (vt == ViewTypes.Left) { gridXform.RotZ(MathHelper.PiOver2); gridXform.Translation = new Vec3F(-dist, 0, 0); } else if (vt == ViewTypes.Front) { gridXform.RotX(MathHelper.PiOver2); gridXform.Translation = new Vec3F(0, 0, dist); } else if (vt == ViewTypes.Back) { gridXform.RotX(MathHelper.PiOver2); gridXform.Translation = new Vec3F(0, 0, -dist); } gridXform.Mul(scale, gridXform); } else { Matrix4F trans = new Matrix4F(); trans.Translation = new Vec3F(0, grid.Height, 0); gridXform = Matrix4F.Multiply(scale, trans); } GameEngine.DrawPrimitive(PrimitiveType.LineList, m_gridVBId, 0, m_gridVertexCount, Color.LightGray, gridXform); }
public NativeViewControl() { ClientSize = new Size(16, 16); if (!GameEngine.IsInError) { swapChainId = GameEngine.GetObjectTypeId("SwapChain"); SurfaceId = GameEngine.CreateObject(swapChainId, this.Handle, IntPtr.Size); SizePropId = GameEngine.GetObjectPropertyId(swapChainId, "Size"); GameEngine.SetObjectProperty(swapChainId, SurfaceId, SizePropId, ClientSize); BkgColorPropId = GameEngine.GetObjectPropertyId(swapChainId, "BkgColor"); GameEngine.SetObjectProperty(swapChainId, SurfaceId, BkgColorPropId, BackColor); } m_renderState = new RenderState(); m_renderState.RenderFlag = GlobalRenderFlags.Solid | GlobalRenderFlags.Textured | GlobalRenderFlags.Lit; m_renderState.WireFrameColor = Color.DarkBlue; m_renderState.SelectionColor = Color.FromArgb(66, 255, 161); BackColor = SystemColors.ControlDark; #region Context menu GlobalRenderFlags[] flags = new GlobalRenderFlags[] { GlobalRenderFlags.Solid, GlobalRenderFlags.WireFrame, GlobalRenderFlags.Textured, GlobalRenderFlags.RenderBackFace, GlobalRenderFlags.Lit }; ContextMenuStrip cntx = new ContextMenuStrip(); foreach (var flag in flags) { ToolStripMenuItem item = new ToolStripMenuItem(flag.ToString()); item.Tag = flag; item.Click += delegate(object sender, EventArgs e) { ToolStripMenuItem menu = (ToolStripMenuItem)sender; RenderState.RenderFlag = RenderState.RenderFlag ^ (GlobalRenderFlags)menu.Tag; this.Invalidate(); }; cntx.Items.Add(item); } cntx.Items.Add(new ToolStripSeparator()); ToolStripMenuItem views = new ToolStripMenuItem("View"); cntx.Items.Add(views); views.DropDownOpening += delegate { foreach (ToolStripMenuItem item in views.DropDownItems) { item.Checked = (ViewType == (ViewTypes)item.Tag); } }; foreach (var val in Enum.GetValues(typeof(ViewTypes))) { ViewTypes viewtype = (ViewTypes)val; ToolStripMenuItem item = new ToolStripMenuItem(viewtype.ToString()); item.Tag = viewtype; item.Click += delegate(object sender, EventArgs e) { ToolStripMenuItem menuItem = (ToolStripMenuItem)sender; this.ViewType = (ViewTypes)menuItem.Tag; }; views.DropDownItems.Add(item); } cntx.Opening += delegate { GlobalRenderFlags renderflags = RenderState.RenderFlag; foreach (ToolStripItem item in cntx.Items) { if (item is ToolStripSeparator) { break; } ((ToolStripMenuItem)item).Checked = (renderflags & (GlobalRenderFlags)item.Tag) != 0; } }; this.ContextMenuStrip = cntx; #endregion }