示例#1
0
        private void OnDraw(EngineDrawEventArgs args)
        {
            if (Entity == null)
            {
                return;
            }

            var entityLabel = Entity.Name + "[" + Entity.Id + "], Loc: " + (Entity.Parent?.Name ?? "<none>");
            var position    = Entity.GetBehavior <TransformBehavior>()?.Position.XZ();

            if (position == null)
            {
                return;
            }

            using (var format = new CanvasTextFormat {
                FontSize = 11
            })
            {
                args.DrawingSession.DrawText(
                    entityLabel,
                    position.Value + new Vector2(0, -20),
                    Colors.DarkGray,
                    format);
            }

            if (_isMouseOver)
            {
                args.DrawingSession.DrawCircle(position.Value, 6.0f, _mouseOverIndicatorColor, 2.5f);
            }
        }
示例#2
0
        private void OnDraw(EngineDrawEventArgs e)
        {
            if (Sprite != _oldSprite)
            {
                // Sprite has changed since last draw
                _rotateEffect?.Dispose();
                _rotateEffect = null;
            }

            if (Sprite == SpriteReference.Empty)
            {
                return;
            }

            var transform = Entity.GetBehavior <TransformBehavior>();
            var coords    = Entity.Level.RootEntity.GetImplementation <ICoordinateSystem>();
            var sprite    = Sprite.Resolve(Entity);

            if (transform == null)
            {
                throw new InvalidOperationException($"No {nameof(TransformBehavior)} is attached");
            }

            if (coords != null && sprite != null)
            {
                var worldPos = transform.Position;

                var worldRect = new Rect(
                    worldPos.X - transform.Scale.X * sprite.Size.X / 2,
                    worldPos.Y - transform.Scale.X * sprite.Size.Y / 2,
                    transform.Scale.X * sprite.Size.X,
                    transform.Scale.X * sprite.Size.Y);

                var dipsRect = coords.TransformToDips(worldRect);

                ICanvasImage renderImage;

                // If rotation is 0 we can draw the sprite directly.
                // Otherwise, use a Transform2DEffect to rotate.
                if (Math.Abs(transform.Rotation) <= float.Epsilon)
                {
                    renderImage = sprite.Image;
                }
                else
                {
                    _rotateEffect = _rotateEffect ?? new Transform2DEffect {
                        Source = sprite.Image
                    };
                    _rotateEffect.TransformMatrix = Matrix3x2.CreateRotation(transform.RotationRadians);
                    renderImage = _rotateEffect;
                }

                e.DrawingSession.DrawImage(renderImage, dipsRect, renderImage.GetBounds(e.DrawingSession));
            }

            _oldSprite = Sprite;
        }
示例#3
0
        private void OnDraw(EngineDrawEventArgs e)
        {
            _terrainMap.Properties["dpi"]           = e.Sender.Dpi;
            _terrainMap.Properties["baseHeight"]    = _terrain.BaseHeight;
            _terrainMap.Properties["heightDiff"]    = _terrain.Height - _terrain.BaseHeight;
            _terrainMap.Properties["grassColor"]    = _grassColor.ToVector4();
            _terrainMap.Properties["snowColor"]     = _snowColor.ToVector4();
            _terrainMap.Properties["rockColor"]     = _rockColor.ToVector4();
            _terrainMap.Properties["snowMinHeight"] = 2000f;

            e.DrawingSession.DrawImage(_terrainMap);
        }
示例#4
0
        protected override void Draw(EngineDrawEventArgs e)
        {
            var worldPos = _coordinateSystem.TransformToWorld3D(LastMouseScreenPosition);

            e.DrawingSession.DrawCircle(LastMouseScreenPosition, 4, Colors.Red);

            e.DrawingSession.DrawText(
                $"[{(int)worldPos.X}, {(int)worldPos.Y}, {(int)worldPos.Z}]",
                new Vector2(10, 10),
                Colors.Red,
                new CanvasTextFormat {
                FontWeight = FontWeights.Bold
            });
        }
示例#5
0
        private void OnRender(EngineDrawEventArgs args)
        {
            var absolutePosition = Entity.GetBehavior <TransformBehavior>().Position.XZ();
            var halfSize         = new Vector2((float)(Size.Width / 2), (float)(Size.Height / 2));

            switch (Geometry)
            {
            case SimpleGeometry.Circle:
                if (FillGeometry)
                {
                    args.DrawingSession.FillCircle(absolutePosition, (float)(Size.Width / 2), Color);
                }
                else
                {
                    args.DrawingSession.DrawCircle(absolutePosition, (float)(Size.Width / 2), Color);
                }
                break;

            case SimpleGeometry.Square:
                var pos = absolutePosition - halfSize;
                if (FillGeometry)
                {
                    args.DrawingSession.FillRectangle(new Rect(pos.X, pos.Y, Size.Width, Size.Height), Color);
                }
                else
                {
                    args.DrawingSession.DrawRectangle(new Rect(pos.X, pos.Y, Size.Width, Size.Height), Color);
                }
                break;
            }
            if (DrawCenter)
            {
                var color = Color;
                if (FillGeometry)
                {
                    color = Colors.Black;
                }
                args.DrawingSession.DrawCircle(absolutePosition, 1.0f, color);
            }
        }
示例#6
0
        private void OnRender(EngineDrawEventArgs args)
        {
            var coordinateSystem = Entity.Level.RootEntity.GetImplementation <ICoordinateSystem>();
            var lineTransform    = Entity.GetImplementation <ILineTransform>();

            if (coordinateSystem == null || lineTransform == null)
            {
                return;
            }

            var startPoint = coordinateSystem.TransformToDips(lineTransform.Point1);
            var endPoint   = coordinateSystem.TransformToDips(lineTransform.Point2);

            var sprite = Sprite.Resolve(Entity);

            if (sprite == null)
            {
                // Use Color
                // TODO: Stroke width?
                args.DrawingSession.DrawLine(startPoint, endPoint, Color);
            }
            else
            {
                // Use Sprite
                // TODO: Respect sprite size and adjust stroke width accordingly
                // TODO: Rotate sprite depending on the angle of the line
                if (_spriteBrush == null)
                {
                    var brush = new CanvasImageBrush(args.Sender, sprite.Image);
                    brush.ExtendX = Microsoft.Graphics.Canvas.CanvasEdgeBehavior.Wrap;
                    brush.ExtendY = Microsoft.Graphics.Canvas.CanvasEdgeBehavior.Wrap;
                    _spriteBrush  = brush;
                }

                args.DrawingSession.DrawLine(startPoint, endPoint, _spriteBrush);
            }
        }
示例#7
0
 private bool CanRender(EngineDrawEventArgs args) => IsEffectivelyVisible;
示例#8
0
 private void OnDraw(EngineDrawEventArgs args)
 {
     _canvasSize = args.Sender.Size;
 }
示例#9
0
 protected virtual void Draw(EngineDrawEventArgs e)
 {
     e.DrawingSession.DrawCircle(LastMouseScreenPosition, 10, Colors.Red);
 }