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)); } } }
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); }
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()); }
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()); } }
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); } }
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); } }
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); } }
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()); }