Skip to content

Commit 1c4ad64

Browse files
committed
It couldn't have just flown away
- Improve Track Signal and Track Observer Visuals
1 parent 50cf512 commit 1c4ad64

File tree

2 files changed

+72
-47
lines changed

2 files changed

+72
-47
lines changed

src/main/java/com/simibubi/create/content/trains/observer/TrackObserverVisual.java

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,38 +23,21 @@
2323

2424
public class TrackObserverVisual extends AbstractBlockEntityVisual<TrackObserverBlockEntity> implements SimpleTickableVisual {
2525
private final TransformedInstance overlay;
26-
26+
private BlockPos oldTargetPos;
2727

2828
public TrackObserverVisual(VisualizationContext ctx, TrackObserverBlockEntity blockEntity, float partialTick) {
2929
super(ctx, blockEntity, partialTick);
3030

3131
overlay = ctx.instancerProvider()
3232
.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TRACK_OBSERVER_OVERLAY))
3333
.createInstance();
34+
35+
setupVisual();
3436
}
3537

3638
@Override
3739
public void tick(Context context) {
38-
TrackTargetingBehaviour<TrackObserver> target = blockEntity.edgePoint;
39-
BlockPos targetPosition = target.getGlobalPosition();
40-
Level level = blockEntity.getLevel();
41-
BlockState trackState = level.getBlockState(targetPosition);
42-
Block block = trackState.getBlock();
43-
44-
if (!(block instanceof ITrackBlock trackBlock)) {
45-
overlay.setZeroTransform()
46-
.setChanged();
47-
return;
48-
}
49-
50-
overlay.setIdentityTransform()
51-
.translate(targetPosition);
52-
53-
RenderedTrackOverlayType type = RenderedTrackOverlayType.OBSERVER;
54-
trackBlock.prepareTrackOverlay(overlay, level, targetPosition, trackState, target.getTargetBezier(),
55-
target.getTargetDirection(), type);
56-
57-
overlay.setChanged();
40+
setupVisual();
5841
}
5942

6043
@Override
@@ -71,4 +54,31 @@ protected void _delete() {
7154
public void collectCrumblingInstances(Consumer<@Nullable Instance> consumer) {
7255
consumer.accept(overlay);
7356
}
57+
58+
private void setupVisual() {
59+
TrackTargetingBehaviour<TrackObserver> target = blockEntity.edgePoint;
60+
BlockPos targetPosition = target.getGlobalPosition();
61+
Level level = blockEntity.getLevel();
62+
BlockState trackState = level.getBlockState(targetPosition);
63+
Block block = trackState.getBlock();
64+
65+
if (!(block instanceof ITrackBlock trackBlock)) {
66+
overlay.setZeroTransform()
67+
.setChanged();
68+
return;
69+
}
70+
71+
if (!targetPosition.equals(oldTargetPos)) {
72+
oldTargetPos = targetPosition;
73+
74+
overlay.setIdentityTransform()
75+
.translate(targetPosition.subtract(renderOrigin()));
76+
77+
RenderedTrackOverlayType type = RenderedTrackOverlayType.OBSERVER;
78+
trackBlock.prepareTrackOverlay(overlay, level, targetPosition, trackState, target.getTargetBezier(),
79+
target.getTargetDirection(), type);
80+
81+
overlay.setChanged();
82+
}
83+
}
7484
}

src/main/java/com/simibubi/create/content/trains/signal/SignalVisual.java

Lines changed: 41 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,32 @@ public SignalVisual(VisualizationContext ctx, SignalBlockEntity blockEntity, flo
4343
signalOverlay = ctx.instancerProvider()
4444
.instancer(InstanceTypes.TRANSFORMED, Models.partial(AllPartialModels.TRACK_SIGNAL_OVERLAY))
4545
.createInstance();
46+
47+
setupVisual();
4648
}
4749

4850
@Override
4951
public void tick(Context context) {
52+
setupVisual();
53+
}
54+
55+
@Override
56+
public void updateLight(float partialTick) {
57+
relight(signalLight, signalOverlay);
58+
}
59+
60+
@Override
61+
protected void _delete() {
62+
signalLight.delete();
63+
signalOverlay.delete();
64+
}
65+
66+
@Override
67+
public void collectCrumblingInstances(Consumer<@Nullable Instance> consumer) {
68+
consumer.accept(signalLight);
69+
}
70+
71+
private void setupVisual() {
5072
{
5173
SignalState signalState = blockEntity.getState();
5274

@@ -81,43 +103,36 @@ public void tick(Context context) {
81103
Block block = trackState.getBlock();
82104

83105
if (!(block instanceof ITrackBlock trackBlock) || overlayState == OverlayState.SKIP) {
106+
previousOverlayState = null;
84107
signalOverlay.setZeroTransform()
85108
.setChanged();
86109
return;
87110
}
88111

89-
signalOverlay.setIdentityTransform()
90-
.translate(targetPosition);
91-
92-
RenderedTrackOverlayType type =
93-
overlayState == OverlayState.DUAL ? RenderedTrackOverlayType.DUAL_SIGNAL : RenderedTrackOverlayType.SIGNAL;
94-
PartialModel partial = trackBlock.prepareTrackOverlay(signalOverlay, level, targetPosition, trackState, target.getTargetBezier(), target.getTargetDirection(), type);
95-
96112
if (overlayState != previousOverlayState) {
113+
previousOverlayState = overlayState;
114+
115+
PartialModel partial;
116+
RenderedTrackOverlayType type;
117+
if (overlayState == OverlayState.DUAL) {
118+
type = RenderedTrackOverlayType.DUAL_SIGNAL;
119+
partial = AllPartialModels.TRACK_SIGNAL_DUAL_OVERLAY;
120+
} else {
121+
type = RenderedTrackOverlayType.SIGNAL;
122+
partial = AllPartialModels.TRACK_SIGNAL_OVERLAY;
123+
}
124+
97125
instancerProvider()
98126
.instancer(InstanceTypes.TRANSFORMED, Models.partial(partial))
99127
.stealInstance(signalOverlay);
100-
}
101-
102-
signalOverlay.setChanged();
103-
104-
previousOverlayState = overlayState;
105-
}
106-
}
107128

108-
@Override
109-
public void updateLight(float partialTick) {
110-
relight(signalLight, signalOverlay);
111-
}
129+
signalOverlay.setIdentityTransform()
130+
.translate(targetPosition.subtract(renderOrigin()));
112131

113-
@Override
114-
protected void _delete() {
115-
signalLight.delete();
116-
signalOverlay.delete();
117-
}
132+
trackBlock.prepareTrackOverlay(signalOverlay, level, targetPosition, trackState, target.getTargetBezier(), target.getTargetDirection(), type);
118133

119-
@Override
120-
public void collectCrumblingInstances(Consumer<@Nullable Instance> consumer) {
121-
consumer.accept(signalLight);
134+
signalOverlay.setChanged();
135+
}
136+
}
122137
}
123138
}

0 commit comments

Comments
 (0)