Placement drawing moved to overlay; works in Clyde.

Fixes #597
This commit is contained in:
Pieter-Jan Briers
2019-03-08 10:23:08 +01:00
parent cf32f0874d
commit bff03cd2b8
6 changed files with 43 additions and 82 deletions

View File

@@ -18,7 +18,6 @@ namespace SS14.Client.Interfaces.Placement
event EventHandler PlacementCanceled;
void BeginPlacing(PlacementInformation info);
void Render();
void Clear();
void ToggleEraser();

View File

@@ -1,5 +1,6 @@
using System;
using SS14.Client.Graphics.ClientEye;
using SS14.Client.Graphics.Drawing;
using SS14.Client.Utility;
using SS14.Shared.Map;
using SS14.Shared.Maths;
@@ -18,12 +19,12 @@ namespace SS14.Client.Placement.Modes
{
}
public override void Render()
public override void Render(DrawingHandleWorld handle)
{
if (GameController.OnGodot && onGrid)
if (onGrid)
{
const int ppm = EyeManager.PIXELSPERMETER;
var viewportSize = pManager.sceneTree.SceneTree.Root.Size.Convert();
var viewportSize = (Vector2)pManager.DisplayManager.ScreenSize;
var position = pManager.eyeManager.ScreenToWorld(Vector2.Zero);
var gridstartx = (float) Math.Round(position.X / snapSize, MidpointRounding.AwayFromZero) * snapSize;
var gridstarty = (float) Math.Round(position.Y / snapSize, MidpointRounding.AwayFromZero) * snapSize;
@@ -31,26 +32,25 @@ namespace SS14.Client.Placement.Modes
new Vector2( //Find snap grid closest to screen origin and convert back to screen coords
gridstartx,
gridstarty));
var flip = new Godot.Vector2(1, -1);
for (var a = gridstart.X;
a < viewportSize.X;
a += snapSize * ppm) //Iterate through screen creating gridlines
{
var from = ScreenToWorld(new Vector2(a, 0)).Convert() * ppm * flip;
var to = ScreenToWorld(new Vector2(a, viewportSize.Y)).Convert() * ppm * flip;
pManager.DrawNode.DrawLine(from, to, new Godot.Color(0, 0, 1), 0.5f);
var from = ScreenToWorld(new Vector2(a, 0));
var to = ScreenToWorld(new Vector2(a, viewportSize.Y));
handle.DrawLine(from, to, new Color(0, 0, 1f), 0.5f);
}
for (var a = gridstart.Y; a < viewportSize.Y; a += snapSize * ppm)
{
var from = ScreenToWorld(new Vector2(0, a)).Convert() * ppm * flip;
var to = ScreenToWorld(new Vector2(viewportSize.X, a)).Convert() * ppm * flip;
pManager.DrawNode.DrawLine(from, to, new Godot.Color(0, 0, 1), 0.5f);
var from = ScreenToWorld(new Vector2(0, a));
var to = ScreenToWorld(new Vector2(viewportSize.X, a));
handle.DrawLine(from, to, new Color(0, 0, 1f), 0.5f);
}
}
// Draw grid BELOW the ghost.
base.Render();
base.Render(handle);
}
public override void AlignPlacementMode(ScreenCoordinates mouseScreen)

View File

@@ -3,6 +3,7 @@ using SS14.Client.Utility;
using SS14.Shared.Map;
using SS14.Shared.Maths;
using SS14.Client.Graphics.ClientEye;
using SS14.Client.Graphics.Drawing;
namespace SS14.Client.Placement.Modes
{
@@ -16,33 +17,31 @@ namespace SS14.Client.Placement.Modes
public SnapgridCenter(PlacementManager pMan) : base(pMan) { }
public override void Render()
public override void Render(DrawingHandleWorld handle)
{
if (GameController.OnGodot && onGrid)
if (onGrid)
{
const int ppm = EyeManager.PIXELSPERMETER;
var viewportSize = pManager.sceneTree.SceneTree.Root.Size.Convert();
var viewportSize = (Vector2)pManager.DisplayManager.ScreenSize;
var position = pManager.eyeManager.ScreenToWorld(Vector2.Zero);
var gridstart = pManager.eyeManager.WorldToScreen(new Vector2( //Find snap grid closest to screen origin and convert back to screen coords
(float)(Math.Round(position.X / snapSize - 0.5f, MidpointRounding.AwayFromZero) + 0.5f) * snapSize,
(float)(Math.Round(position.Y / snapSize - 0.5f, MidpointRounding.AwayFromZero) + 0.5f) * snapSize));
var flip = new Godot.Vector2(1, -1);
for (var a = gridstart.X; a < viewportSize.X; a += snapSize * 32) //Iterate through screen creating gridlines
{
var from = ScreenToWorld(new Vector2(a, 0)).Convert() * ppm * flip;
var to = ScreenToWorld(new Vector2(a, viewportSize.Y)).Convert() * ppm * flip;
pManager.DrawNode.DrawLine(from, to, new Godot.Color(0, 0, 1), 0.5f);
var from = ScreenToWorld(new Vector2(a, 0));
var to = ScreenToWorld(new Vector2(a, viewportSize.Y));
handle.DrawLine(from, to, new Color(0, 0, 1f), 0.5f);
}
for (var a = gridstart.Y; a < viewportSize.Y; a += snapSize * 32)
{
var from = ScreenToWorld(new Vector2(0, a)).Convert() * ppm * flip;
var to = ScreenToWorld(new Vector2(viewportSize.X, a)).Convert() * ppm * flip;
pManager.DrawNode.DrawLine(from, to, new Godot.Color(0, 0, 1), 0.5f);
var from = ScreenToWorld(new Vector2(0, a));
var to = ScreenToWorld(new Vector2(viewportSize.X, a));
handle.DrawLine(from, to, new Color(0, 0, 1f), 0.5f);
}
}
// Draw grid BELOW the ghost thing.
base.Render();
base.Render(handle);
}
public override void AlignPlacementMode(ScreenCoordinates mouseScreen)

View File

@@ -27,6 +27,9 @@ using SS14.Client.Graphics.ClientEye;
using SS14.Client.Graphics;
using SS14.Client.GameObjects;
using SS14.Client.GameObjects.EntitySystems;
using SS14.Client.Graphics.Drawing;
using SS14.Client.Interfaces.Graphics;
using SS14.Client.Interfaces.Graphics.Overlays;
using SS14.Client.Player;
using SS14.Shared.Input;
using SS14.Shared.Utility;
@@ -34,7 +37,7 @@ using SS14.Shared.Serialization;
namespace SS14.Client.Placement
{
public class PlacementManager : IPlacementManager, IDisposable
public partial class PlacementManager : IPlacementManager, IDisposable
{
[Dependency]
public readonly IPhysicsManager PhysicsManager;
@@ -64,6 +67,10 @@ namespace SS14.Client.Placement
private readonly IPrototypeManager _prototypeManager;
[Dependency]
private readonly IBaseClient _baseClient;
[Dependency]
private readonly IOverlayManager _overlayManager;
[Dependency]
public readonly IDisplayManager DisplayManager;
/// <summary>
/// How long before a pending tile change is dropped.
@@ -171,8 +178,7 @@ namespace SS14.Client.Placement
/// </summary>
public Direction Direction { get; set; } = Direction.South;
public Godot.Node2D DrawNode { get; set; }
private GodotGlue.GodotSignalSubscriber0 drawNodeDrawSubscriber;
private PlacementOverlay _drawOverlay;
private bool _isActive;
public void Initialize()
@@ -187,24 +193,8 @@ namespace SS14.Client.Placement
_mapMan.TileChanged += HandleTileChanged;
if (GameController.OnGodot)
{
var unshadedMaterial = new Godot.CanvasItemMaterial()
{
LightMode = Godot.CanvasItemMaterial.LightModeEnum.Unshaded
};
DrawNode = new Godot.Node2D()
{
Name = "Placement Manager Sprite",
ZIndex = 100,
Material = unshadedMaterial
};
sceneTree.WorldRoot.AddChild(DrawNode);
drawNodeDrawSubscriber = new GodotGlue.GodotSignalSubscriber0();
drawNodeDrawSubscriber.Connect(DrawNode, "draw");
drawNodeDrawSubscriber.Signal += Render;
}
_drawOverlay = new PlacementOverlay(this);
_overlayManager.AddOverlay(_drawOverlay);
// a bit ugly, oh well
_baseClient.PlayerJoinedServer += (sender, args) => SetupInput(_entitySystemManager);
@@ -308,15 +298,7 @@ namespace SS14.Client.Placement
public void Dispose()
{
if (!GameController.OnGodot)
{
return;
}
drawNodeDrawSubscriber.Disconnect(DrawNode, "draw");
drawNodeDrawSubscriber.Dispose();
DrawNode.QueueFree();
DrawNode.Dispose();
_drawOverlay.Dispose();
}
private void HandlePlacementMessage(MsgPlacement msg)
@@ -353,12 +335,6 @@ namespace SS14.Client.Placement
IsActive = false;
Eraser = false;
PlacementOffset = Vector2i.Zero;
// Make it draw again to remove the drawn things.
if (GameController.OnGodot)
{
DrawNode?.Update();
}
}
public void Rotate()
@@ -511,11 +487,6 @@ namespace SS14.Client.Placement
// continues tile placement but placement of entities only occurs on mouseUp
if (_placenextframe && CurrentPermission.IsTile)
HandlePlacement();
if (GameController.OnGodot)
{
DrawNode.Update();
}
}
private void ActivateLineMode()
@@ -553,24 +524,19 @@ namespace SS14.Client.Placement
return true;
}
public void Render()
private void Render(DrawingHandleWorld handle)
{
if (CurrentMode == null || !IsActive)
return;
CurrentMode.Render();
CurrentMode.Render(handle);
if (CurrentPermission == null || CurrentPermission.Range <= 0 || !CurrentMode.RangeRequired)
return;
var pos = PlayerManager.LocalPlayer.ControlledEntity.Transform.WorldPosition;
const int ppm = EyeManager.PIXELSPERMETER;
var worldPos = PlayerManager.LocalPlayer.ControlledEntity.Transform.WorldPosition;
if (GameController.OnGodot)
{
DrawNode.DrawCircle(pos.Convert() * new Godot.Vector2(1, -1) * ppm, CurrentPermission.Range * ppm,
new Godot.Color(1, 1, 1, 0.25f));
}
handle.DrawCircle(worldPos, CurrentPermission.Range, new Color(1, 1, 1, 0.25f));
}
private void HandleStartPlacement(MsgPlacement msg)

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic;
using SS14.Client.Graphics;
using SS14.Client.Graphics.ClientEye;
using SS14.Client.Graphics.Drawing;
using SS14.Client.ResourceManagement;
using SS14.Client.Utility;
using SS14.Shared.Interfaces.GameObjects.Components;
@@ -83,18 +84,13 @@ namespace SS14.Client.Placement
/// <returns></returns>
public abstract bool IsValidPosition(GridCoordinates position);
public virtual void Render()
public virtual void Render(DrawingHandleWorld handle)
{
if (!GameController.OnGodot)
{
return;
}
if (SpriteToDraw == null)
{
SetSprite();
}
IEnumerable<GridCoordinates> locationcollection;
switch (pManager.PlacementType)
{
@@ -115,9 +111,9 @@ namespace SS14.Client.Placement
var size = SpriteToDraw.Size;
foreach (var coordinate in locationcollection)
{
var pos = coordinate.Position * EyeManager.PIXELSPERMETER * new Vector2(1, -1) - size / 2f;
var pos = coordinate.Position - (size/EyeManager.PIXELSPERMETER) / 2f;
var color = IsValidPosition(coordinate) ? ValidPlaceColor : InvalidPlaceColor;
pManager.DrawNode.DrawTexture(SpriteToDraw.GodotTexture, pos.Convert(), color.Convert());
handle.DrawTexture(SpriteToDraw, pos, color);
}
}

View File

@@ -176,6 +176,7 @@
<Compile Include="Interfaces\IBaseClient.cs" />
<Compile Include="Interfaces\ISceneTreeHolder.cs" />
<Compile Include="Interfaces\Map\IClientTileDefinitionManager.cs" />
<Compile Include="Placement\PlacementOverlay.cs" />
<Compile Include="Player\IPlayerManager.cs" />
<Compile Include="Player\IPlayerSession.cs" />
<Compile Include="Interfaces\State\IStateManager.cs" />