// render the scene. public void Render() { bool skipRender = SurfaceId == 0 || GameEngine.IsInError || Width == 0 || Height == 0 || DesignView.Context == null; if (skipRender) { return; } m_clk.Start(); GameEngine.SetObjectProperty(swapChainId, SurfaceId, BkgColorPropId, DesignView.BackColor); GameEngine.SetRenderState(RenderState); GameEngine.Begin(SurfaceId, Camera.ViewMatrix, Camera.ProjectionMatrix); IGame game = DesignView.Context.As <IGame>(); GridRenderer gridRender = game.Grid.Cast <GridRenderer>(); gridRender.Render(Camera); bool renderSelected = RenderState.DisplayBound == DisplayFlagModes.Selection || RenderState.DisplayCaption == DisplayFlagModes.Selection || RenderState.DisplayPivot == DisplayFlagModes.Selection; if (renderSelected) { // for testing draw bounds for selected objects var selection = DesignView.Context.As <ISelectionContext>().Selection; IEnumerable <DomNode> rootDomNodes = DomNode.GetRoots(selection.AsIEnumerable <DomNode>()); RenderProperties(rootDomNodes, RenderState.DisplayCaption == DisplayFlagModes.Selection, RenderState.DisplayBound == DisplayFlagModes.Selection, RenderState.DisplayPivot == DisplayFlagModes.Selection); } RenderProperties(Items, RenderState.DisplayCaption == DisplayFlagModes.Always, RenderState.DisplayBound == DisplayFlagModes.Always, RenderState.DisplayPivot == DisplayFlagModes.Always); GameEngine.RenderGame(); if (DesignView.Manipulator != null) { DesignView.Manipulator.Render(this); } string str = string.Format("View Type: {0} time-per-frame: {1:0.00} ms", ViewType, m_clk.Milliseconds); GameEngine.DrawText2D(str, Util3D.CaptionFont, 1, 1, Color.White); RenderSystemAxis(); GameEngine.End(); }
public NativeDesignControl(DesignView designView) : base(designView) { ClientSize = new Size(10, 10); 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); } if (s_marqueePen == null) { s_marqueePen = new Pen(Color.FromArgb(30, 30, 30), 2); s_marqueePen.DashPattern = new float[] { 3, 3 }; } m_renderState = new RenderState(); m_renderState.RenderFlag = GlobalRenderFlags.Solid | GlobalRenderFlags.Textured | GlobalRenderFlags.Lit | GlobalRenderFlags.Shadows; m_renderState.WireFrameColor = Color.DarkBlue; m_renderState.SelectionColor = Color.FromArgb(66, 255, 161); BackColor = SystemColors.ControlDark; m_renderState.Changed += (sender, e) => Invalidate(); }
protected override void OnBackColorChanged(EventArgs e) { base.OnBackColorChanged(e); if (swapChainId != 0) { GameEngine.SetObjectProperty(swapChainId, SurfaceId, BkgColorPropId, BackColor); } }
protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); Size sz = ClientSize; if (!GameEngine.IsInError && SurfaceId != 0 && sz.Width > 0 && sz.Height > 0) { GameEngine.SetObjectProperty(swapChainId, SurfaceId, SizePropId, sz); Camera.Aspect = (float)sz.Width / (float)sz.Height; } }
void node_AttributeChanged(object sender, AttributeEventArgs e) { // process events only for the DomNode attached to this adapter. if (this.DomNode != e.DomNode) { return; } // the "attribInfo" given to us may not belong this this exact // object type. It might belong to a base class (or even, possibly, to a super class). // We need to check for these cases, and remap to the exact attribute that // belongs our concrete class. var type = DomNode.Type; var attribInfo = e.AttributeInfo; if (attribInfo.DefiningType != type) { attribInfo = DomNode.Type.GetAttributeInfo(attribInfo.Name); if (attribInfo == null) { return; } } bool hierarchicalProperty = (e.AttributeInfo.Name == "transform") || (e.AttributeInfo.Name == "visible"); using (var transfer = new NativePropertyTransfer()) { using (var stream = transfer.CreateStream()) { UpdateNativeProperty(DomNode, attribInfo, transfer.Properties, stream); if (hierarchicalProperty) { UpdateSecondaryNativeProperties(transfer.Properties, stream); } if (transfer.Properties.Count > 0) { GameEngine.SetObjectProperty( TypeId, DocumentId, InstanceId, transfer.Properties); } } } if (hierarchicalProperty) { UpdateLocalToWorld_Children(); } }
internal void UpdateLocalToWorld() { using (var transfer = new NativePropertyTransfer()) { using (var stream = transfer.CreateStream()) { UpdateSecondaryNativeProperties(transfer.Properties, stream); if (transfer.Properties.Count > 0) { GameEngine.SetObjectProperty( TypeId, DocumentId, InstanceId, transfer.Properties); } } } }
/// <summary> /// Updates all the shared properties /// between this and native object /// only call onece. /// </summary> public unsafe void UpdateNativeObject() { using (var transfer = new NativePropertyTransfer()) { using (var stream = transfer.CreateStream()) foreach (AttributeInfo attribInfo in this.DomNode.Type.Attributes) { UpdateNativeProperty(DomNode, attribInfo, transfer.Properties, stream); } if (transfer.Properties.Count > 0) { GameEngine.SetObjectProperty( TypeId, DocumentId, InstanceId, transfer.Properties); } } }
public void LoadFromFile(Uri ur) { if (!ur.IsAbsoluteUri) { throw new ArgumentException("uri must be absolute"); } string localPath = ur.LocalPath; if (!File.Exists(localPath)) { throw new FileNotFoundException(localPath); fixed(char *chptr = localPath) { IntPtr ptr = new IntPtr((void *)chptr); int sz = localPath.Length * 2; GameEngine.SetObjectProperty(TypeId, m_instanceId, LoadFromFileId, ptr, sz); } RefreshCachedProperties(); }
public void Convert(ImageDataFORMAT format) { GameEngine.SetObjectProperty(TypeId, m_instanceId, ConvertId, (uint)format); RefreshCachedProperties(); }
// render the scene. public override void Render() { bool skipRender = SurfaceId == 0 || GameEngine.IsInError || Width == 0 || Height == 0 || DesignView.Context == null; if (skipRender) { return; } m_clk.Start(); GameEngine.SetObjectProperty(swapChainId, SurfaceId, BkgColorPropId, DesignView.BackColor); GameEngine.SetRenderState(RenderState); GameEngine.Begin(SurfaceId, Camera.ViewMatrix, Camera.ProjectionMatrix); IGame game = DesignView.Context.As <IGame>(); GridRenderer gridRender = game.Grid.Cast <GridRenderer>(); gridRender.Render(Camera); GameEngine.RenderGame(); bool renderSelected = RenderState.DisplayBound == DisplayFlagModes.Selection || RenderState.DisplayCaption == DisplayFlagModes.Selection || RenderState.DisplayPivot == DisplayFlagModes.Selection; if (renderSelected) { var selection = DesignView.Context.As <ISelectionContext>().Selection; IEnumerable <DomNode> rootDomNodes = DomNode.GetRoots(selection.AsIEnumerable <DomNode>()); RenderProperties(rootDomNodes, RenderState.DisplayCaption == DisplayFlagModes.Selection, RenderState.DisplayBound == DisplayFlagModes.Selection, RenderState.DisplayPivot == DisplayFlagModes.Selection); } RenderProperties(Items, RenderState.DisplayCaption == DisplayFlagModes.Always, RenderState.DisplayBound == DisplayFlagModes.Always, RenderState.DisplayPivot == DisplayFlagModes.Always); GameEngine.SetRendererFlag(BasicRendererFlags.Foreground | BasicRendererFlags.Lit); if (DesignView.Manipulator != null) { DesignView.Manipulator.Render(this); } string str = string.Format("View Type: {0} time per frame-render call: {1:0.00} ms", ViewType, m_clk.Milliseconds); GameEngine.DrawText2D(str, Util3D.CaptionFont, 1, 1, Color.White); GameEngine.End(); if (IsPicking) {// todo: use Directx to draw marque. using (Graphics g = CreateGraphics()) { Rectangle rect = MakeRect(FirstMousePoint, CurrentMousePoint); if (rect.Width > 0 && rect.Height > 0) { g.DrawRectangle(s_marqueePen, rect); } } } }
unsafe private void UpdateNativeProperty(AttributeInfo attribInfo) { object idObj = attribInfo.GetTag(NativeAnnotations.NativeProperty); if (idObj == null) { return; } uint id = (uint)idObj; if (this.InstanceId == 0) { return; } AttributeInfo mappedAttribute = attribInfo.GetTag(NativeAnnotations.MappedAttribute) as AttributeInfo; DomNodeType definingType = (mappedAttribute != null) ? mappedAttribute.DefiningType : attribInfo.DefiningType; uint typeId = (uint)definingType.GetTag(NativeAnnotations.NativeType); Type clrType = attribInfo.Type.ClrType; Type elmentType = clrType.GetElementType(); object data = this.DomNode.GetAttribute(attribInfo); if (clrType.IsArray && elmentType.IsPrimitive) { GCHandle pinHandle = new GCHandle(); try { pinHandle = GCHandle.Alloc(data, GCHandleType.Pinned); IntPtr ptr = pinHandle.AddrOfPinnedObject(); int sz = Marshal.SizeOf(elmentType); GameEngine.SetObjectProperty(typeId, InstanceId, id, ptr, sz * attribInfo.Type.Length); } finally { if (pinHandle.IsAllocated) { pinHandle.Free(); } } } else { IntPtr ptr = IntPtr.Zero; int sz = 0; if (clrType == typeof(string)) { string str = (string)data; if (!string.IsNullOrEmpty(str)) { fixed(char *chptr = str) { ptr = new IntPtr((void *)chptr); sz = str.Length * 2; GameEngine.SetObjectProperty(typeId, InstanceId, id, ptr, sz); } return; } } else if (clrType == typeof(DateTime)) { DateTime dt = (DateTime)data; float seconds = (float)(dt.Hour * 60 * 60 + dt.Minute * 60 + dt.Second); float secondsInADay = 60.0f * 60.0f * 24.0f; // sec per minute * min per hour * hour per day float normalizedTime = seconds / secondsInADay; // normalize 0.0 to 1.0 ptr = new IntPtr(&normalizedTime); sz = sizeof(float); } else if (clrType == typeof(bool)) { bool val = (bool)data; ptr = new IntPtr(&val); sz = sizeof(bool); } else if (clrType == typeof(byte)) { byte val = (byte)data; ptr = new IntPtr(&val); sz = sizeof(byte); } else if (clrType == typeof(sbyte)) { sbyte val = (sbyte)data; ptr = new IntPtr(&val); sz = sizeof(sbyte); } else if (clrType == typeof(short)) { short val = (short)data; ptr = new IntPtr(&val); sz = sizeof(short); } else if (clrType == typeof(ushort)) { ushort val = (ushort)data; ptr = new IntPtr(&val); sz = sizeof(ushort); } else if (clrType == typeof(int)) { int val = (int)data; ptr = new IntPtr(&val); sz = sizeof(int); } else if (clrType == typeof(uint)) { uint val = (uint)data; ptr = new IntPtr(&val); sz = sizeof(uint); } else if (clrType == typeof(long)) { long val = (long)data; ptr = new IntPtr(&val); sz = sizeof(long); } else if (clrType == typeof(ulong)) { ulong val = (ulong)data; ptr = new IntPtr(&val); sz = sizeof(ulong); } else if (clrType == typeof(float)) { float val = (float)data; ptr = new IntPtr(&val); sz = sizeof(float); } else if (clrType == typeof(double)) { double val = (double)data; ptr = new IntPtr(&val); sz = sizeof(double); } else if (clrType == typeof(System.Uri)) { if (data != null && !string.IsNullOrWhiteSpace(data.ToString())) { Uri uri = (Uri)data; string str = uri.LocalPath; fixed(char *chptr = str) { ptr = new IntPtr((void *)chptr); sz = str.Length * 2; GameEngine.SetObjectProperty(typeId, InstanceId, id, ptr, sz); } return; } } else if (clrType == typeof(DomNode)) { // this is a 'reference' to an object DomNode node = (DomNode)data; NativeObjectAdapter nativeGob = node.As <NativeObjectAdapter>(); if (nativeGob != null) { ptr = new IntPtr((void *)nativeGob.InstanceId); sz = sizeof(ulong); } } GameEngine.SetObjectProperty(typeId, InstanceId, id, ptr, sz); } }
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 }