Esempio n. 1
0
        // 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();
        }
Esempio n. 2
0
        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();
        }
Esempio n. 3
0
 protected override void OnBackColorChanged(EventArgs e)
 {
     base.OnBackColorChanged(e);
     if (swapChainId != 0)
     {
         GameEngine.SetObjectProperty(swapChainId, SurfaceId, BkgColorPropId, BackColor);
     }
 }
Esempio n. 4
0
        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;
            }
        }
Esempio n. 5
0
        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();
            }
        }
Esempio n. 6
0
 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);
             }
         }
     }
 }
Esempio n. 7
0
        /// <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);
                }
            }
        }
Esempio n. 8
0
        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();
        }
Esempio n. 9
0
 public void Convert(ImageDataFORMAT format)
 {
     GameEngine.SetObjectProperty(TypeId, m_instanceId, ConvertId, (uint)format);
     RefreshCachedProperties();
 }
Esempio n. 10
0
        // 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);
                    }
                }
            }
        }
Esempio n. 11
0
        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);
            }
        }
Esempio n. 12
0
            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
            }