removed Structural instance and SJKScript was changed to be using an nuget package.
This commit is contained in:
@@ -12,7 +12,8 @@ using SJK.Functional;
|
||||
|
||||
[Tool]
|
||||
[Meta(typeof(IAutoNode))]
|
||||
public partial class BeltPort : Node3D, IBeltPort {
|
||||
public partial class BeltPort : Node3D, IBeltPort
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
[Dependency] public IVoxelGridRegistry Grid => this.DependOn<IVoxelGridRegistry>();
|
||||
[Export] public Direction Face { get; set; } = default!;
|
||||
@@ -21,7 +22,7 @@ public partial class BeltPort : Node3D, IBeltPort {
|
||||
[Export] public Path3D Path { get; set; } = default!;
|
||||
[Dependency] public IItemRenderer ItemRenderer => this.DependOn<IItemRenderer>();
|
||||
public BeltPortProfile Profile => new(GridTransform3D.FromGodot(GlobalTransform), Width, Access);
|
||||
[Dependency] public IItemTransferAnimator ItemTransferAnimator => this.DependOn<IItemTransferAnimator>(()=> new CurveItemTransfer(){Curve3D = Path.Curve,Tree = GetTree(), ItemRenderer = ItemRenderer, Transform3D = GlobalTransform});
|
||||
[Dependency] public IItemTransferAnimator ItemTransferAnimator => this.DependOn<IItemTransferAnimator>(() => new CurveItemTransfer() { Curve3D = Path.Curve, Tree = GetTree(), ItemRenderer = ItemRenderer, Transform3D = GlobalTransform });
|
||||
public void OnResolved()
|
||||
{
|
||||
if (Engine.IsEditorHint())
|
||||
@@ -33,16 +34,16 @@ public partial class BeltPort : Node3D, IBeltPort {
|
||||
}
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
DebugDraw3D.DrawLine(GlobalPosition,GlobalTransform * Face.ToVector(), Colors.Red);
|
||||
DebugDraw3D.DrawLine(GlobalPosition, GlobalTransform * Face.ToVector(), Colors.Red);
|
||||
if (Engine.IsEditorHint())
|
||||
{
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < _itemsDummys.Count; i++)
|
||||
{
|
||||
_itemsDummys[i] = (_itemsDummys[i].i+(float)delta,_itemsDummys[i].beltItem);
|
||||
_itemsDummys[i] = (_itemsDummys[i].i + (float)delta, _itemsDummys[i].beltItem);
|
||||
GD.Print(_itemsDummys[i].i);
|
||||
ItemRenderer.UpdateTransform(_itemsDummys[i].beltItem,GlobalTransform * Path.Curve.SampleBakedWithRotation(_itemsDummys[i].i));
|
||||
ItemRenderer.UpdateTransform(_itemsDummys[i].beltItem, GlobalTransform * Path.Curve.SampleBakedWithRotation(_itemsDummys[i].i));
|
||||
if (_itemsDummys[i].i > Path.Curve.GetBakedLength())
|
||||
{
|
||||
_itemsDummys[i].beltItem.Dispose();
|
||||
@@ -57,11 +58,11 @@ DebugDraw3D.DrawLine(GlobalPosition,GlobalTransform * Face.ToVector(), Colors.Re
|
||||
return true;
|
||||
throw new System.NotImplementedException();
|
||||
}
|
||||
List<(float i,IBeltItem beltItem)> _itemsDummys = [];
|
||||
List<(float i, IBeltItem beltItem)> _itemsDummys = [];
|
||||
|
||||
public bool TryInsert(IBeltItem item, LaneSpan laneSpan, float beltT)
|
||||
{
|
||||
var tween = ItemTransferAnimator.StartTransfer(new(item,beltT){LaneSpan = laneSpan}, () => GD.Print("Done"));
|
||||
var tween = ItemTransferAnimator.StartTransfer(new(item, beltT) { LaneSpan = laneSpan }, () => GD.Print("Done"));
|
||||
// GD.Print("gg "+laneSpan);
|
||||
tween.TweenCallback(Callable.From(item.Dispose));
|
||||
// GD.Print(laneSpan);
|
||||
@@ -103,7 +104,7 @@ public class CurveItemTransfer : IItemTransferAnimator
|
||||
Curve3D curve,
|
||||
float duration,
|
||||
IItemRenderer renderer)
|
||||
{
|
||||
{
|
||||
float length = curve.GetBakedLength();
|
||||
|
||||
var tween = Tree.CreateTween();
|
||||
@@ -111,9 +112,9 @@ public class CurveItemTransfer : IItemTransferAnimator
|
||||
tween.TweenMethod(
|
||||
Callable.From<float>(t =>
|
||||
{
|
||||
//Transform is not being set when using update transform in a tween, but can set position
|
||||
//Transform is not being set when using update transform in a tween, but can set position
|
||||
// renderer.UpdateTransform(item, Transform3D * curve.SampleBakedWithRotation(t),1/duration);
|
||||
(renderer as TestItemRendered)._items[item.Item].Transform =Transform3D *Curve3D.SampleBakedWithRotation(t).Translated(-Curve3D.SampleBakedWithRotation(t).Basis.X * item.LaneSpan.Start);
|
||||
(renderer as TestItemRendered)._items[item.Item].Transform = Transform3D * Curve3D.SampleBakedWithRotation(t).Translated(-Curve3D.SampleBakedWithRotation(t).Basis.X * item.LaneSpan.Start);
|
||||
// GD.PrintS(Transform3D * curve.SampleBakedWithRotation(t).Origin,1/duration,(renderer as TestItemRendered)._items[item].GlobalPosition);
|
||||
}),
|
||||
0f,
|
||||
@@ -121,10 +122,12 @@ public class CurveItemTransfer : IItemTransferAnimator
|
||||
duration
|
||||
);
|
||||
return tween;
|
||||
}
|
||||
public Tween StartTransfer(ConveyorSlice item, Action onFinished = null){
|
||||
var tween = AnimateAlongCurve(item,Curve3D,1,ItemRenderer);
|
||||
if (onFinished is not null){
|
||||
}
|
||||
public Tween StartTransfer(ConveyorSlice item, Action onFinished = null)
|
||||
{
|
||||
var tween = AnimateAlongCurve(item, Curve3D, 1, ItemRenderer);
|
||||
if (onFinished is not null)
|
||||
{
|
||||
tween.TweenCallback(Callable.From(onFinished));
|
||||
}
|
||||
return tween;
|
||||
|
||||
@@ -16,7 +16,7 @@ public partial class ConveyorItemRender : Node
|
||||
[Export] protected Path3D Path3D { get; set; } = default!;
|
||||
[Export] protected TestItemConveyor ItemConveyor { get; set; } = default!;
|
||||
[Chickensoft.AutoInject.Dependency] protected IItemRenderer Items => this.DependOn<IItemRenderer>();
|
||||
private Chickensoft.Sync.Primitives.AutoList<ConveyorSlice>.Binding binding = default!;
|
||||
private Chickensoft.Sync.Primitives.AutoList<ConveyorSlice>.Binding _binding = default!;
|
||||
public override async void _Ready()
|
||||
{
|
||||
base._Ready();
|
||||
@@ -24,7 +24,7 @@ public partial class ConveyorItemRender : Node
|
||||
{
|
||||
await ToSignal(ItemConveyor, Node.SignalName.Ready);
|
||||
}
|
||||
binding = ItemConveyor.Items.Items.Bind();
|
||||
_binding = ItemConveyor.Items.Items.Bind();
|
||||
// binding.OnRemove(callback =>
|
||||
// {
|
||||
// Items.Remove(callback.Item);
|
||||
@@ -36,37 +36,14 @@ public partial class ConveyorItemRender : Node
|
||||
// // node.QueueFree();
|
||||
// // }
|
||||
// });
|
||||
binding.OnAdd((i, v) =>
|
||||
{
|
||||
|
||||
// itemsRenders[i.Item] = new MeshInstance3D(){Mesh = new BoxMesh()};
|
||||
// AddSibling(itemsRenders[i.Item]);
|
||||
// itemsRenders[i.Item].Transform = Path3D.Curve.SampleBakedWithRotation(i.BeltT);
|
||||
// GD.Print($"Item : {i},{v} added");
|
||||
Items.UpdateTransform(i.Item,Path3D.GlobalTransform *Path3D.Curve.SampleBakedWithRotation(i.BeltT));
|
||||
});
|
||||
binding.OnUpdate((a,b) =>
|
||||
{
|
||||
Items.UpdateTransform(a.Item, Path3D.GlobalTransform *Path3D.Curve.SampleBakedWithRotation(b.BeltT).Translated(-Path3D.Curve.SampleBakedWithRotation(b.BeltT).Basis.X*(b.LaneSpan.Start)));
|
||||
return;
|
||||
if (itemsRenders.TryGetValue(a.Item, out var node))
|
||||
{
|
||||
if (tweens.TryGetValue(a.Item, out var t))
|
||||
{
|
||||
t.Kill();
|
||||
}
|
||||
tweens[a.Item] = t = CreateTween();
|
||||
t.TweenProperty(node, "transform",Path3D.Curve.SampleBakedWithRotation(b.BeltT), .25f);
|
||||
// node.Transform = Path3D.Curve.SampleBakedWithRotation(b.BeltT);
|
||||
}
|
||||
});
|
||||
_binding.OnAdd((i, v) => Items.UpdateTransform(i.Item, Path3D.GlobalTransform * Path3D.Curve.SampleBakedWithRotation(i.BeltT)));
|
||||
_binding.OnUpdate((a, b) => Items.UpdateTransform(a.Item, Path3D.GlobalTransform * Path3D.Curve.SampleBakedWithRotation(b.BeltT).Translated(-Path3D.Curve.SampleBakedWithRotation(b.BeltT).Basis.X * b.LaneSpan.Start)));
|
||||
|
||||
}
|
||||
private Dictionary<IBeltItem, Node3D> itemsRenders = [];//This would be an item server for reuse via depency
|
||||
private Dictionary<IBeltItem, Tween> tweens = [];//This would be an item server for reuse via depency
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
binding.Dispose();
|
||||
_binding.Dispose();
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
}
|
||||
@@ -84,18 +61,20 @@ public partial class TestItemRendered : Node3D, IItemRenderer
|
||||
private ConditionalWeakTable<IBeltItem, Tween> _tweens = [];
|
||||
public void Remove(IBeltItem beltItem)
|
||||
{
|
||||
if (_items.TryGetValue(beltItem, out var node)){
|
||||
if (_items.TryGetValue(beltItem, out var node))
|
||||
{
|
||||
node.QueueFree();
|
||||
}
|
||||
_items.Remove(beltItem);
|
||||
}
|
||||
|
||||
public void UpdateTransform(IBeltItem beltItem, Transform3D newTransform, float time ){
|
||||
public void UpdateTransform(IBeltItem beltItem, Transform3D newTransform, float time)
|
||||
{
|
||||
if (!_items.TryGetValue(beltItem, out var node))
|
||||
{
|
||||
_items.Add(beltItem,node = beltItem.CreateItemVisual());
|
||||
_items.Add(beltItem, node = beltItem.CreateItemVisual());
|
||||
AddChild(node);
|
||||
beltItem.Disposed += _ =>{node.QueueFree();_items.Remove(beltItem);};
|
||||
beltItem.Disposed += _ => { node.QueueFree(); _items.Remove(beltItem); };
|
||||
node.Transform = newTransform;
|
||||
return;
|
||||
}
|
||||
@@ -107,8 +86,8 @@ public partial class TestItemRendered : Node3D, IItemRenderer
|
||||
// GD.Print(newTransform);
|
||||
tween = GetTree().CreateTween().BindNode(node);
|
||||
tween.TweenProperty(node, "transform", newTransform, time);
|
||||
_tweens.Add(beltItem,tween);
|
||||
_tweens.Add(beltItem, tween);
|
||||
}
|
||||
|
||||
public void UpdateTransform(IBeltItem beltItem, Transform3D newTransform) => UpdateTransform(beltItem,newTransform,.25f);
|
||||
public void UpdateTransform(IBeltItem beltItem, Transform3D newTransform) => UpdateTransform(beltItem, newTransform, .25f);
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ public class Sorted1DList<T>
|
||||
if (_getPosition(_items[i - 1]) >= _getPosition(_items[i]))
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
$"AutoList not sorted at index {i - 1} → {i}. ({_getPosition(_items[i-1])},{_getPosition(_items[i])})");
|
||||
$"AutoList not sorted at index {i - 1} → {i}. ({_getPosition(_items[i - 1])},{_getPosition(_items[i])})");
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -49,7 +49,7 @@ public class Sorted1DList<T>
|
||||
{
|
||||
throw new IndexOutOfRangeException($"{nameof(startIndex)}:{startIndex} can not be greater then or equal to {nameof(Count)}:{Count}");
|
||||
}
|
||||
for (int i = Mathf.Max(0,startIndex ?? 0); i < _items.Count; i++)
|
||||
for (int i = Mathf.Max(0, startIndex ?? 0); i < _items.Count; i++)
|
||||
{
|
||||
bool removed = false;
|
||||
yield return new(_items[i],
|
||||
@@ -81,7 +81,7 @@ public class Sorted1DList<T>
|
||||
{
|
||||
throw new IndexOutOfRangeException($"{nameof(startIndex)}:{startIndex} can not be less than zero");
|
||||
}
|
||||
for (int i = Math.Min(startIndex ?? (_items.Count - 1), _items.Count -1); i>=0 ; i--)
|
||||
for (int i = Math.Min(startIndex ?? (_items.Count - 1), _items.Count - 1); i >= 0; i--)
|
||||
{
|
||||
bool removed = false;
|
||||
yield return new(_items[i],
|
||||
@@ -102,11 +102,11 @@ public class Sorted1DList<T>
|
||||
throw new NotSupportedException("Can not Replace an Item after Removing it");
|
||||
}
|
||||
|
||||
if (i-1>=0 && _getPosition(_items[i-1]) >= _getPosition(replaced))
|
||||
if (i - 1 >= 0 && _getPosition(_items[i - 1]) >= _getPosition(replaced))
|
||||
{
|
||||
throw new Exception();
|
||||
}
|
||||
if (i+1<Count && _getPosition(_items[i+1]) <= _getPosition(replaced))
|
||||
if (i + 1 < Count && _getPosition(_items[i + 1]) <= _getPosition(replaced))
|
||||
{
|
||||
throw new Exception();
|
||||
}
|
||||
@@ -123,7 +123,7 @@ public class Sorted1DList<T>
|
||||
_items.Add(item);
|
||||
return;
|
||||
}
|
||||
if (pos <=_getPosition(_items[0]))
|
||||
if (pos <= _getPosition(_items[0]))
|
||||
{
|
||||
_items.Insert(0, item);
|
||||
return;
|
||||
@@ -176,7 +176,8 @@ public class Sorted1DList<T>
|
||||
public void Replace(T slice) => _replace(slice);
|
||||
}
|
||||
}
|
||||
[Meta(typeof(IAutoNode))][Tool]
|
||||
[Meta(typeof(IAutoNode))]
|
||||
[Tool]
|
||||
public partial class TestItemConveyor : Node, IMovementConveyor
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
@@ -302,7 +303,7 @@ public partial class TestItemConveyor : Node, IMovementConveyor
|
||||
var points = item.Points();
|
||||
GridRegistry.Register(item, [.. points]);
|
||||
}
|
||||
StartPort.TryInsert(new TestItem(), LaneSpan.Shifted(LaneSpan.One,0), 0);
|
||||
StartPort.TryInsert(new TestItem(), LaneSpan.Shifted(LaneSpan.One, 0), 0);
|
||||
// StartPort.TryInsert(new TestItem(), LaneSpan.Sh fted(LaneSpan.One,1), 0);
|
||||
// Items.Insert(new ConveyorSlice(new TestItem(), 0));
|
||||
// _items.Add(new (new TestItem()));
|
||||
@@ -404,12 +405,12 @@ public partial class TestItemConveyor : Node, IMovementConveyor
|
||||
var mappedLane2 = MapLaneOrFail(port, otherport, laneSpan);
|
||||
if (mappedLane2.HasValue(out var lane2))
|
||||
{
|
||||
return new PortBeltObstacle(distanceToBoundary,lane2,otherport);
|
||||
// return new BeltObstacle(ObstacleKind.Boundary,distanceToBoundary+1,lane1,this,null, null);//TODO THIS SHOULD GET SPACE IN PORT SO ITEMS KNOW IF THEY CAN FIT
|
||||
return new PortBeltObstacle(distanceToBoundary, lane2, otherport);
|
||||
// return new BeltObstacle(ObstacleKind.Boundary,distanceToBoundary+1,lane1,this,null, null);//TODO THIS SHOULD GET SPACE IN PORT SO ITEMS KNOW IF THEY CAN FIT
|
||||
|
||||
}
|
||||
return new BoundaryBeltObstacle(distanceToBoundary);
|
||||
// return new BeltObstacle(ObstacleKind.Boundary,distanceToBoundary,laneSpan,this,null, null);//TODO THIS SHOULD GET SPACE IN PORT SO ITEMS KNOW IF THEY CAN FIT
|
||||
return new BoundaryBeltObstacle(distanceToBoundary);
|
||||
// return new BeltObstacle(ObstacleKind.Boundary,distanceToBoundary,laneSpan,this,null, null);//TODO THIS SHOULD GET SPACE IN PORT SO ITEMS KNOW IF THEY CAN FIT
|
||||
}
|
||||
return new BoundaryBeltObstacle(distanceToBoundary);
|
||||
}
|
||||
@@ -487,7 +488,7 @@ public partial class TestItemConveyor : Node, IMovementConveyor
|
||||
var mapped = from.MapLaneSpanToFacingPort(to);
|
||||
|
||||
if (mapped == LaneSpan.Zero)
|
||||
return LaneSpan.Zero.ToOption();
|
||||
return LaneSpan.Zero.ToOption();
|
||||
|
||||
int sourceWidth = from.Profile.Width;
|
||||
int targetWidth = mapped.Width;
|
||||
@@ -498,13 +499,13 @@ public partial class TestItemConveyor : Node, IMovementConveyor
|
||||
int newStart;
|
||||
if (mirror)
|
||||
{
|
||||
// mirrored: right side of incoming aligns with right side of mapped
|
||||
newStart = mapped.End - (startOffset + spanLength);
|
||||
// mirrored: right side of incoming aligns with right side of mapped
|
||||
newStart = mapped.End - (startOffset + spanLength);
|
||||
}
|
||||
else
|
||||
{
|
||||
// normal: left side of incoming aligns with left side of mapped
|
||||
newStart = mapped.Start + startOffset;
|
||||
// normal: left side of incoming aligns with left side of mapped
|
||||
newStart = mapped.Start + startOffset;
|
||||
}
|
||||
|
||||
int newEnd = newStart + spanLength;
|
||||
@@ -523,10 +524,10 @@ public partial class TestItemConveyor : Node, IMovementConveyor
|
||||
return new LaneSpan((ushort)newStart, (ushort)newEnd).ToOption();
|
||||
}
|
||||
|
||||
private ItemConveyor.BeltDirection DirectionAwayFromEnd(ItemConveyor.ConveyorEnd conveyorEnd) => conveyorEnd switch {ItemConveyor.ConveyorEnd.Start=>ItemConveyor.BeltDirection.TowardEnd,ItemConveyor.ConveyorEnd.End=>ItemConveyor.BeltDirection.TowardStart};
|
||||
private ItemConveyor.BeltDirection DirectionAwayFromEnd(ItemConveyor.ConveyorEnd conveyorEnd) => conveyorEnd switch { ItemConveyor.ConveyorEnd.Start => ItemConveyor.BeltDirection.TowardEnd, ItemConveyor.ConveyorEnd.End => ItemConveyor.BeltDirection.TowardStart };
|
||||
public IEnumerable<Sorted1DList<ConveyorSlice>.ItemHandle> EnumerateTowardEnd() => Items.EnumerateTowardEnd();
|
||||
public IEnumerable<Sorted1DList<ConveyorSlice>.ItemHandle> EnumerateTowardStart() => Items.EnumerateTowardStart();
|
||||
private static Vector3[] _Square = [new(-.5f, .5f, -.5f), new(.5f, .5f, -.5f), new(.5f, -.5f, -.5f), new(-.5f, -.5f, -.5f), new(-.5f, .5f, -.5f)];
|
||||
private static Vector3[] _Square = [new(-.5f, .5f, -.5f), new(.5f, .5f, -.5f), new(.5f, -.5f, -.5f), new(-.5f, -.5f, -.5f), new(-.5f, .5f, -.5f)];
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
@@ -538,7 +539,7 @@ private static Vector3[] _Square = [new(-.5f, .5f, -.5f), new(.5f, .5f, -.5f), n
|
||||
{
|
||||
for (int ii = 0; ii < item.Profile.Width; ii++)
|
||||
{
|
||||
DebugDraw3D.DrawLinePath(_Square.Select(i => item.Profile.LocalOffset.ToGodot().TranslatedLocal(i).TranslatedLocal(new Vector3(ii,0,0)).Origin).ToArray(),(!Engine.IsEditorHint())&&GetPortFacing(item).HasValue()?Colors.Green:Colors.Red);
|
||||
DebugDraw3D.DrawLinePath(_Square.Select(i => item.Profile.LocalOffset.ToGodot().TranslatedLocal(i).TranslatedLocal(new Vector3(ii, 0, 0)).Origin).ToArray(), (!Engine.IsEditorHint()) && GetPortFacing(item).HasValue() ? Colors.Green : Colors.Red);
|
||||
|
||||
}
|
||||
// DebugDraw3D.DrawArrow(item.Profile.LocalOffset.Origin, item.Profile.LocalOffset.LocalToWorld(item.Profile.Face.ToVector()),(!Engine.IsEditorHint())&&GetPortFacing(item).HasValue()?Colors.Green:Colors.Red);
|
||||
@@ -559,16 +560,13 @@ private static Vector3[] _Square = [new(-.5f, .5f, -.5f), new(.5f, .5f, -.5f), n
|
||||
}
|
||||
else if (beltT is ItemConveyor.BeltTOffset endOffset)
|
||||
{
|
||||
return HasClearance(endOffset.T,lane);
|
||||
return HasClearance(endOffset.T, lane);
|
||||
// var lowerObstacle = GetDistanceToNextItem(ItemConveyor.BeltDirection.TowardStart, endOffset.T, ItemConveyor.ITEMSIZE,LaneSpan.One);
|
||||
// var upperObstacle = GetDistanceToNextItem(ItemConveyor.BeltDirection.TowardEnd, endOffset.T, ItemConveyor.ITEMSIZE,LaneSpan.One);
|
||||
// var lowerDistanceAllowed = lowerObstacle.DistanceToCenter - (lowerObstacle.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
// var upperObstacleAllowed = upperObstacle.DistanceToCenter - (upperObstacle.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
// return ItemConveyor.ITEMSIZE < lowerDistanceAllowed && ItemConveyor.ITEMSIZE < upperObstacleAllowed;
|
||||
}
|
||||
// return true;
|
||||
|
||||
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
// if (beltT is ItemConveyor.BeltTEnd end && end.End == ItemConveyor.ConveyorEnd.End){
|
||||
@@ -584,12 +582,12 @@ private static Vector3[] _Square = [new(-.5f, .5f, -.5f), new(.5f, .5f, -.5f), n
|
||||
{
|
||||
if (end.End == ItemConveyor.ConveyorEnd.End)
|
||||
{
|
||||
Items.Insert(new (item, Length-offset){LaneSpan = laneSpan});
|
||||
Items.Insert(new(item, Length - offset) { LaneSpan = laneSpan });
|
||||
// _items.Add(new(item, Length-offset));
|
||||
}
|
||||
else
|
||||
{
|
||||
Items.Insert(new (item, offset) {LaneSpan = laneSpan});
|
||||
Items.Insert(new(item, offset) { LaneSpan = laneSpan });
|
||||
// _items.Insert(0, new(item, offset));
|
||||
}
|
||||
return true;
|
||||
@@ -602,7 +600,7 @@ private static Vector3[] _Square = [new(-.5f, .5f, -.5f), new(.5f, .5f, -.5f), n
|
||||
return false;
|
||||
}
|
||||
|
||||
Items.Insert(new (item, endOffset.T){LaneSpan = laneSpan});
|
||||
Items.Insert(new(item, endOffset.T) { LaneSpan = laneSpan });
|
||||
// int insertIndex = FindInsertIndex(endOffset.T);
|
||||
|
||||
// _items.Insert(insertIndex, new(item, endOffset.T));
|
||||
@@ -623,53 +621,53 @@ private static Vector3[] _Square = [new(-.5f, .5f, -.5f), new(.5f, .5f, -.5f), n
|
||||
}
|
||||
private bool HasClearance(float centerT, LaneSpan span)
|
||||
{
|
||||
var lower = GetDistanceToNextItem(
|
||||
ItemConveyor.BeltDirection.TowardStart,
|
||||
centerT,
|
||||
ItemConveyor.ITEMSIZE,
|
||||
span
|
||||
);
|
||||
var lower = GetDistanceToNextItem(
|
||||
ItemConveyor.BeltDirection.TowardStart,
|
||||
centerT,
|
||||
ItemConveyor.ITEMSIZE,
|
||||
span
|
||||
);
|
||||
|
||||
var upper = GetDistanceToNextItem(
|
||||
ItemConveyor.BeltDirection.TowardEnd,
|
||||
centerT,
|
||||
ItemConveyor.ITEMSIZE,
|
||||
span
|
||||
);
|
||||
var upper = GetDistanceToNextItem(
|
||||
ItemConveyor.BeltDirection.TowardEnd,
|
||||
centerT,
|
||||
ItemConveyor.ITEMSIZE,
|
||||
span
|
||||
);
|
||||
|
||||
float lowerAllowed =
|
||||
lower.Distance;// -
|
||||
// (lower.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
float lowerAllowed =
|
||||
lower.Distance;// -
|
||||
// (lower.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
|
||||
float upperAllowed =
|
||||
upper.Distance;// -
|
||||
// (upper.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
float upperAllowed =
|
||||
upper.Distance;// -
|
||||
// (upper.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
|
||||
return ItemConveyor.ITEMSIZE < lowerAllowed &&
|
||||
ItemConveyor.ITEMSIZE < upperAllowed;
|
||||
return ItemConveyor.ITEMSIZE < lowerAllowed &&
|
||||
ItemConveyor.ITEMSIZE < upperAllowed;
|
||||
}
|
||||
|
||||
}
|
||||
// Items.Add(new ConveyorSlice(new TestItem(), 0));
|
||||
// StartPort = new ConveyorPort(this,
|
||||
// new BeltPortProfile(Position, Direction.Back, 1, PortAccess.BiDirectional),
|
||||
// new ItemConveyor.BeltTEnd(ItemConveyor.ConveyorEnd.Start),
|
||||
// (item, offset) =>
|
||||
// {
|
||||
// var obstacle = GetDistanceToNextItem(ItemConveyor.BeltDirection.TowardEnd, 0, offset, LaneSpan.One);
|
||||
// return ItemConveyor.ITEMSIZE < obstacle.DistanceToCenter - (obstacle.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
// },
|
||||
// (item, offset) => { _items.Insert(0, new(item, offset)); return true;});
|
||||
// EndPort = new ConveyorPort(this,
|
||||
// new BeltPortProfile(Position, Direction.Front, 1, PortAccess.BiDirectional),
|
||||
// new ItemConveyor.BeltTEnd(ItemConveyor.ConveyorEnd.End),
|
||||
// (item, offset) =>
|
||||
// {
|
||||
// var obstacle = GetDistanceToNextItem(ItemConveyor.BeltDirection.TowardEnd, Length, offset, LaneSpan.One);
|
||||
// return ItemConveyor.ITEMSIZE < obstacle.DistanceToCenter - (obstacle.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
// // return ItemConveyor.ITEMSIZE < GetDistanceToNextItem(ItemConveyor.BeltDirection.TowardStart, Length, SpeedMagnitude, LaneSpan.One);
|
||||
// },
|
||||
// (item, offset) => { _items.Add(new(item, offset)); return true;});
|
||||
// Items.Add(new ConveyorSlice(new TestItem(), 0));
|
||||
// StartPort = new ConveyorPort(this,
|
||||
// new BeltPortProfile(Position, Direction.Back, 1, PortAccess.BiDirectional),
|
||||
// new ItemConveyor.BeltTEnd(ItemConveyor.ConveyorEnd.Start),
|
||||
// (item, offset) =>
|
||||
// {
|
||||
// var obstacle = GetDistanceToNextItem(ItemConveyor.BeltDirection.TowardEnd, 0, offset, LaneSpan.One);
|
||||
// return ItemConveyor.ITEMSIZE < obstacle.DistanceToCenter - (obstacle.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
// },
|
||||
// (item, offset) => { _items.Insert(0, new(item, offset)); return true;});
|
||||
// EndPort = new ConveyorPort(this,
|
||||
// new BeltPortProfile(Position, Direction.Front, 1, PortAccess.BiDirectional),
|
||||
// new ItemConveyor.BeltTEnd(ItemConveyor.ConveyorEnd.End),
|
||||
// (item, offset) =>
|
||||
// {
|
||||
// var obstacle = GetDistanceToNextItem(ItemConveyor.BeltDirection.TowardEnd, Length, offset, LaneSpan.One);
|
||||
// return ItemConveyor.ITEMSIZE < obstacle.DistanceToCenter - (obstacle.IsItem ? ItemConveyor.ITEMSIZE : 0);
|
||||
// // return ItemConveyor.ITEMSIZE < GetDistanceToNextItem(ItemConveyor.BeltDirection.TowardStart, Length, SpeedMagnitude, LaneSpan.One);
|
||||
// },
|
||||
// (item, offset) => { _items.Add(new(item, offset)); return true;});
|
||||
//TODO Should liklely account for max search distance where the conveyorm may be needed to know
|
||||
public record class BeltObstacle(float Distance)
|
||||
{
|
||||
|
||||
@@ -23,7 +23,6 @@ public partial class VoxelGridNode : Node3D, IProvide<IVoxelGridQuery<LayeredEqu
|
||||
IItemRenderer IProvide<IItemRenderer>.Value() => _itemRenderer;
|
||||
public override void _Ready()
|
||||
{
|
||||
TestStructural.Test();
|
||||
GD.Print();
|
||||
base._Ready();
|
||||
_voxelGrid = new EquipmentVoxelGrid();
|
||||
@@ -107,7 +106,8 @@ public class LayeredEquipment
|
||||
}
|
||||
}
|
||||
}
|
||||
public sealed class SlotDescriptor {
|
||||
public sealed class SlotDescriptor
|
||||
{
|
||||
public SlotDirection Direction { get; }
|
||||
|
||||
public SlotDescriptor(
|
||||
@@ -117,10 +117,12 @@ public sealed class SlotDescriptor {
|
||||
Direction = direction;
|
||||
}
|
||||
}
|
||||
public abstract class SlotLogic<TPayload> {
|
||||
public abstract class SlotLogic<TPayload>
|
||||
{
|
||||
public SlotDescriptor Descriptor { get; }
|
||||
|
||||
protected SlotLogic(SlotDescriptor descriptor) {
|
||||
protected SlotLogic(SlotDescriptor descriptor)
|
||||
{
|
||||
Descriptor = descriptor;
|
||||
}
|
||||
|
||||
@@ -133,26 +135,30 @@ public abstract class SlotLogic<TPayload> {
|
||||
);
|
||||
}
|
||||
public sealed class ItemSlotLogic
|
||||
: SlotLogic<IBeltItem> {
|
||||
: SlotLogic<IBeltItem>
|
||||
{
|
||||
|
||||
public ItemSlotLogic(SlotDescriptor descriptor)
|
||||
: base(descriptor) {}
|
||||
: base(descriptor) { }
|
||||
|
||||
public override bool CanTransfer(IBeltItem item) => false;
|
||||
// item.Count > 0;
|
||||
// item.Count > 0;
|
||||
|
||||
public override bool TryTransfer(IBeltItem item) {
|
||||
public override bool TryTransfer(IBeltItem item)
|
||||
{
|
||||
// routing rules
|
||||
return true;
|
||||
}
|
||||
}
|
||||
[Meta]
|
||||
public partial class ItemSlotNode
|
||||
: SlotComponentNode {
|
||||
: SlotComponentNode
|
||||
{
|
||||
|
||||
private ItemSlotLogic _logic;
|
||||
|
||||
public override void _Ready() {
|
||||
public override void _Ready()
|
||||
{
|
||||
base._Ready();
|
||||
_logic = new ItemSlotLogic(
|
||||
new SlotDescriptor(Direction)
|
||||
@@ -163,7 +169,8 @@ public partial class ItemSlotNode
|
||||
|
||||
}
|
||||
|
||||
public void Tick(IBeltItem stack) {
|
||||
public void Tick(IBeltItem stack)
|
||||
{
|
||||
if (_logic.CanTransfer(stack))
|
||||
_logic.TryTransfer(stack);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user