Example #1
0
        private void Redraw()
        {
            var map = eyeManager.CurrentMap;

            VS.CanvasItemClear(ShadedCanvasItem);
            VS.CanvasItemClear(UnshadedCanvasItem);
            using (var shadedHandle = new DrawingHandleScreen(ShadedCanvasItem))
                using (var unshadedHandle = new DrawingHandleScreen(UnshadedCanvasItem))
                {
                    foreach (var effect in _Effects)
                    {
                        if (effect.Coordinates.MapID != map)
                        {
                            continue;
                        }

                        // NOTE TO FUTURE READERS:
                        // Yes, due to how this is implemented, unshaded is always on top of shaded.
                        // If you want to rework it to be properly defined, be my guest.
                        var handle = effect.Shaded ? shadedHandle : unshadedHandle;

                        handle.SetTransform(effect.Coordinates.ToWorld().Position *EyeManager.PIXELSPERMETER *new Vector2(1, -1), new Angle(-effect.Rotation), effect.Size);
                        var effectSprite = effect.EffectSprite;
                        handle.DrawTexture(effectSprite, -((Vector2)effectSprite.Size) / 2, ToColor(effect.Color));
                    }
                }
        }
Example #2
0
        public override void Initialize()
        {
            base.Initialize();
            IoCManager.InjectDependencies(this);
            DrawingNode = new Godot.Node2D()
            {
                Name = "EffectSystem",
            };
            sceneTree.WorldRoot.AddChild(DrawingNode);

            UnshadedMaterial = new Godot.CanvasItemMaterial()
            {
                LightMode = Godot.CanvasItemMaterial.LightModeEnum.Unshaded
            };

            ShadedMaterial = new Godot.CanvasItemMaterial();

            ShadedCanvasItem = VS.CanvasItemCreate();
            VS.CanvasItemSetParent(ShadedCanvasItem, DrawingNode.GetCanvasItem());
            VS.CanvasItemSetMaterial(ShadedCanvasItem, ShadedMaterial.GetRid());

            UnshadedCanvasItem = VS.CanvasItemCreate();
            VS.CanvasItemSetParent(UnshadedCanvasItem, DrawingNode.GetCanvasItem());
            VS.CanvasItemSetMaterial(UnshadedCanvasItem, UnshadedMaterial.GetRid());
        }
        public void AddOverlay(Overlay overlay)
        {
            if (_overlays.ContainsKey(overlay.ID))
            {
                throw new InvalidOperationException($"We already have an overlay with ID '{overlay.ID}'");
            }

            _overlays.Add(overlay.ID, overlay);
            if (GameController.OnGodot)
            {
                Godot.RID parent;
                switch (overlay.Space)
                {
                case OverlaySpace.ScreenSpace:
                    parent = RootNodeScreen.GetCanvasItem();
                    break;

                case OverlaySpace.WorldSpace:
                    parent = RootNodeWorld.GetCanvasItem();
                    break;

                case OverlaySpace.ScreenSpaceBelowWorld:
                    parent = RootNodeScreenBelowWorld.GetCanvasItem();
                    break;

                default:
                    throw new NotImplementedException($"Unknown overlay space: {overlay.Space}");
                }

                var item = VS.CanvasItemCreate();
                VS.CanvasItemSetParent(item, parent);
                overlay.AssignCanvasItem(item);
                _canvasItems.Add(overlay, item);
            }
        }
        public void SetTransform(Vector2 position, Angle rotation, Vector2 scale)
        {
            CheckDisposed();
            var transform = Godot.Transform2D.Identity.Rotated((float)rotation.Theta).Scaled(scale.Convert());

            SetTransform2DRotationAndScale(ref transform, rotation.Theta, scale);
            transform.o = position.Convert();
            VS.CanvasItemAddSetTransform(Item, transform);
        }
Example #5
0
        public override void DrawLine(Vector2 from, Vector2 to, Color color, float width = 1, bool antiAliased = false)
        {
            if (!GameController.OnGodot)
            {
                return;
            }

            CheckDisposed();
            VS.CanvasItemAddLine(Item, ToPixelCoords(from), ToPixelCoords(to), color.Convert(), width, antiAliased);
        }
        public override void DrawLine(Vector2 from, Vector2 to, Color color, float width = 1, bool antiAliased = false)
        {
            if (!GameController.OnGodot)
            {
                return;
            }

            CheckDisposed();
            VS.CanvasItemAddLine(Item, from.Convert(), to.Convert(), (Modulate * color).Convert(), width, antiAliased);
        }
        public override void DrawCircle(Vector2 position, float radius, Color color)
        {
            if (!GameController.OnGodot)
            {
                return;
            }

            CheckDisposed();
            VS.CanvasItemAddCircle(Item, position.Convert(), radius, (color * Modulate).Convert());
        }
Example #8
0
 public override void Shutdown()
 {
     base.Shutdown();
     VS.FreeRid(ShadedCanvasItem);
     VS.FreeRid(UnshadedCanvasItem);
     UnshadedMaterial.Dispose();
     ShadedMaterial.Dispose();
     DrawingNode.QueueFree();
     DrawingNode.Dispose();
 }
 public void SetTransform(Matrix3 matrix)
 {
     CheckDisposed();
     if (_renderHandle != null)
     {
         _renderHandle.SetModelTransform(ref matrix, _handleId);
     }
     else if (Item != null)
     {
         VS.CanvasItemAddSetTransform(Item, matrix.Convert());
     }
 }
Example #10
0
 public override void Shutdown()
 {
     base.Shutdown();
     if (!GameController.OnGodot)
     {
         return;
     }
     VS.FreeRid(ShadedCanvasItem);
     VS.FreeRid(UnshadedCanvasItem);
     UnshadedMaterial.Dispose();
     ShadedMaterial.Dispose();
     DrawingNode.QueueFree();
     DrawingNode.Dispose();
 }
 public void DrawRect(Box2 rect, Color color, bool filled = true)
 {
     CheckDisposed();
     if (filled)
     {
         VS.CanvasItemAddRect(Item, rect.Convert(), color.Convert());
     }
     else
     {
         DrawLine(rect.TopLeft, rect.TopRight, color);
         DrawLine(rect.TopRight, rect.BottomRight, color);
         DrawLine(rect.BottomRight, rect.BottomLeft, color);
         DrawLine(rect.BottomLeft, rect.TopLeft, color);
     }
 }
Example #12
0
        public void RemoveOverlay(string id)
        {
            if (!_overlays.TryGetValue(id, out var overlay))
            {
                return;
            }

            overlay.Dispose();
            _overlays.Remove(id);

            if (GameController.OnGodot)
            {
                var item = _canvasItems[overlay];
                _canvasItems.Remove(overlay);
                VS.FreeRid(item);
            }
        }
Example #13
0
        public void DrawRect(UIBox2 rect, Color color, bool filled = true)
        {
            if (!GameController.OnGodot)
            {
                return;
            }

            CheckDisposed();
            if (filled)
            {
                VS.CanvasItemAddRect(Item, rect.Convert(), color.Convert());
            }
            else
            {
                DrawLine(rect.TopLeft, rect.TopRight, color);
                DrawLine(rect.TopRight, rect.BottomRight, color);
                DrawLine(rect.BottomRight, rect.BottomLeft, color);
                DrawLine(rect.BottomLeft, rect.TopLeft, color);
            }
        }
Example #14
0
 public void SetTransform(Vector2 position, Angle rotation, Vector2 scale)
 {
     CheckDisposed();
     if (_renderHandle != null)
     {
         var matrix = Matrix3.Identity;
         (matrix.R0C0, matrix.R1C1) = scale;
         matrix.Rotate(rotation);
         matrix.R0C2 += position.X;
         matrix.R1C2 += position.Y;
         _renderHandle.SetModelTransform(matrix, _handleId);
     }
     else if (Item != null)
     {
         var transform = Godot.Transform2D.Identity.Rotated((float)rotation.Theta).Scaled(scale.Convert());
         SetTransform2DRotationAndScale(ref transform, rotation.Theta, scale);
         transform.origin = position.Convert();
         VS.CanvasItemAddSetTransform(Item, transform);
     }
 }
 public void DrawRect(UIBox2 rect, Color color, bool filled = true)
 {
     CheckDisposed();
     color *= Modulate;
     if (filled)
     {
         if (_renderHandle != null)
         {
             _renderHandle.DrawTextureRect(Texture.White, rect.TopLeft, rect.BottomRight, color, null, _handleId);
         }
         else if (Item != null)
         {
             VS.CanvasItemAddRect(Item, rect.Convert(), color.Convert());
         }
     }
     else
     {
         DrawLine(rect.TopLeft, rect.TopRight, color);
         DrawLine(rect.TopRight, rect.BottomRight, color);
         DrawLine(rect.BottomRight, rect.BottomLeft, color);
         DrawLine(rect.BottomLeft, rect.TopLeft, color);
     }
 }
 public void DrawCircle(Vector2 position, float radius, Color color)
 {
     CheckDisposed();
     VS.CanvasItemAddCircle(Item, position.Convert(), radius, color.Convert());
 }
 public void DrawLine(Vector2 from, Vector2 to, Color color, float width = 1, bool antialiased = false)
 {
     CheckDisposed();
     VS.CanvasItemAddLine(Item, from.Convert(), to.Convert(), color.Convert(), width, antialiased);
 }
 public void SetTransform(Matrix3 matrix)
 {
     CheckDisposed();
     VS.CanvasItemAddSetTransform(Item, matrix.Convert());
 }
 public override void DrawCircle(Vector2 position, float radius, Color color)
 {
     CheckDisposed();
     VS.CanvasItemAddCircle(Item, ToPixelCoords(position), radius * PPM, (Modulate * color).Convert());
 }