mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-02-15 03:30:53 +01:00
@@ -18,7 +18,6 @@ namespace SS14.Client.Interfaces.Placement
|
||||
event EventHandler PlacementCanceled;
|
||||
|
||||
void BeginPlacing(PlacementInformation info);
|
||||
void Render();
|
||||
void Clear();
|
||||
void ToggleEraser();
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
Reference in New Issue
Block a user