Skip to content

Commit bff57ec

Browse files
committed
Further generify wire rendering; fix wire dropping and spending
1 parent 4859124 commit bff57ec

17 files changed

Lines changed: 171 additions & 137 deletions

src/main/java/falseresync/vivatech/client/VivatechClient.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import falseresync.vivatech.client.particle.VivatechParticleFactories;
77
import falseresync.vivatech.client.rendering.VivatechRendering;
88
import falseresync.vivatech.client.wire.ClientWireManager;
9-
import falseresync.vivatech.client.wire.VivatechWireParameters;
9+
import falseresync.vivatech.client.wire.WireRenderingRegistry;
1010
import falseresync.vivatech.common.Vivatech;
1111
import falseresync.vivatech.common.config.TranslatableEnum;
1212
import falseresync.vivatech.common.config.TranslatableEnumGuiProvider;
@@ -35,7 +35,7 @@ public void onInitializeClient() {
3535
VivatechParticleFactories.init();
3636
VivatechGui.init();
3737
VivatechKeybindings.init();
38-
VivatechWireParameters.registerAll();
38+
WireRenderingRegistry.registerAll();
3939
VivatechClientReceivers.registerAll();
4040
ClientPlayerInventoryEvents.init();
4141

src/main/java/falseresync/vivatech/client/rendering/world/WireRenderer.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
import falseresync.vivatech.client.VivatechClient;
44
import falseresync.vivatech.client.rendering.RenderingUtil;
5-
import falseresync.vivatech.client.wire.VivatechWireParameters;
65
import falseresync.vivatech.client.wire.WireParameters;
6+
import falseresync.vivatech.client.wire.WireRenderingRegistry;
7+
import falseresync.vivatech.client.wire.WireModel;
78
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
89
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
910
import net.minecraft.client.render.*;
@@ -30,8 +31,9 @@ public void afterEntities(WorldRenderContext context) {
3031
var cameraPos = context.camera().getPos();
3132

3233
for (var wire : wires) {
33-
var parameters = VivatechWireParameters.get(wire);
34-
var buffer = parameters.getSprite().getTextureSpecificVertexConsumer(context.consumers().getBuffer(RenderLayer.getCutout()));
34+
var parameters = WireRenderingRegistry.getAndBuild(wire);
35+
var model = parameters.getModel();
36+
var buffer = model.getSprite().getTextureSpecificVertexConsumer(context.consumers().getBuffer(RenderLayer.getCutout()));
3537

3638
var wireEnd = wire.end().sub(wire.start(), new Vector3f());
3739
var light = WorldRenderer.getLightmapCoordinates(context.world(), BlockPos.ofFloored(wire.middle().x, wire.middle().y, wire.middle().z));
@@ -43,21 +45,19 @@ public void afterEntities(WorldRenderContext context) {
4345

4446
var positionMatrix = matrices.peek().getPositionMatrix();
4547
var direction = wireEnd.normalize(new Vector3f());
46-
47-
float length = wireEnd.length();
48-
int segmentCount = (int) (length / parameters.getSegmentSize());
48+
int segmentCount = (int) (wire.length() / model.getSegmentSize());
4949

5050
if (direction.x == 0 && direction.z == 0) {
51-
drawVerticalWire(parameters, wireEnd, segmentCount, buffer, positionMatrix, light);
51+
drawVerticalWire(model, wireEnd, segmentCount, buffer, positionMatrix, light);
5252
} else {
53-
drawHorizontalWire(parameters, direction, wireEnd, segmentCount, length, buffer, positionMatrix, light);
53+
drawHorizontalWire(parameters, model, direction, wireEnd, segmentCount, wire.length(), buffer, positionMatrix, light);
5454
}
5555

5656
matrices.pop();
5757
}
5858
}
5959

60-
private void drawVerticalWire(WireParameters parameters, Vector3f wireEnd, int segmentCount, VertexConsumer buffer, Matrix4f positionMatrix, int light) {
60+
private void drawVerticalWire(WireModel parameters, Vector3f wireEnd, int segmentCount, VertexConsumer buffer, Matrix4f positionMatrix, int light) {
6161
var tangent = new Vector3f(VERTICAL_SEGMENT_NORMAL);
6262
var tangentialHalfSize = tangent.mul(parameters.getSegmentSize() / 2f, new Vector3f());
6363
var stepY = new Vector3f(0, wireEnd.y / segmentCount, 0);
@@ -79,24 +79,24 @@ private void drawVerticalWire(WireParameters parameters, Vector3f wireEnd, int s
7979
}
8080
}
8181

82-
private void drawHorizontalWire(WireParameters parameters, Vector3f direction, Vector3f wireEnd, int segmentCount, float length, VertexConsumer buffer, Matrix4f positionMatrix, int light) {
82+
private void drawHorizontalWire(WireParameters renderableWire, WireModel model, Vector3f direction, Vector3f wireEnd, int segmentCount, float length, VertexConsumer buffer, Matrix4f positionMatrix, int light) {
8383
var tangent = new Vector3f(direction.x, 0, direction.z).normalize(new Vector3f()).cross(HORIZONTAL_SEGMENT_NORMAL);
84-
var tangentialHalfSize = tangent.mul(parameters.getSegmentSize() / 2f, new Vector3f());
84+
var tangentialHalfSize = tangent.mul(model.getSegmentSize() / 2f, new Vector3f());
8585

86-
var stepXZ = direction.mul(parameters.getSegmentSize(), new Vector3f());
86+
var stepXZ = direction.mul(model.getSegmentSize(), new Vector3f());
8787
float stepY = wireEnd.y / segmentCount;
8888

89-
var segmentAVertices = buildInitialSegmentVertices(tangentialHalfSize, new Vector3f(0, parameters.getSegmentSize() / 2, 0), stepXZ);
90-
var segmentBVertices = buildInitialSegmentVertices(tangentialHalfSize, new Vector3f(0, -parameters.getSegmentSize() / 2, 0), stepXZ);
89+
var segmentAVertices = buildInitialSegmentVertices(tangentialHalfSize, new Vector3f(0, model.getSegmentSize() / 2, 0), stepXZ);
90+
var segmentBVertices = buildInitialSegmentVertices(tangentialHalfSize, new Vector3f(0, -model.getSegmentSize() / 2, 0), stepXZ);
9191

92-
var startY = parameters.getSaggedY(0, stepY, length);
92+
var startY = renderableWire.getSaggedY(0, stepY);
9393
for (int segmentNo = 0; segmentNo < segmentCount; segmentNo++) {
94-
var endY = parameters.getSaggedY(segmentNo + 1, stepY, length);
95-
advanceSegmentVertices(segmentAVertices, stepXZ, startY, endY, parameters.getSegmentSize() / 2);
96-
advanceSegmentVertices(segmentBVertices, stepXZ, startY, endY, -parameters.getSegmentSize() / 2);
94+
var endY = renderableWire.getSaggedY(segmentNo + 1, stepY);
95+
advanceSegmentVertices(segmentAVertices, stepXZ, startY, endY, model.getSegmentSize() / 2);
96+
advanceSegmentVertices(segmentBVertices, stepXZ, startY, endY, -model.getSegmentSize() / 2);
9797
startY = endY;
9898

99-
var uv = parameters.getUv(segmentNo);
99+
var uv = model.getUv(segmentNo);
100100
drawSegment(buffer, positionMatrix, segmentAVertices, uv, TINT, light, OVERLAY, HORIZONTAL_SEGMENT_NORMAL);
101101
drawSegment(buffer, positionMatrix, segmentBVertices, uv, TINT, light, OVERLAY, HORIZONTAL_SEGMENT_NORMAL);
102102
}

src/main/java/falseresync/vivatech/client/wire/CopperWireParameters.java

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package falseresync.vivatech.client.wire;
2+
3+
import falseresync.vivatech.common.power.wire.Wire;
4+
5+
public abstract class DefaultRenderableWire implements WireParameters {
6+
private final Wire wire;
7+
private final WireModel parameters;
8+
9+
protected DefaultRenderableWire(Wire wire, WireModel parameters) {
10+
this.wire = wire;
11+
this.parameters = parameters;
12+
}
13+
14+
@Override
15+
public WireModel getModel() {
16+
return parameters;
17+
}
18+
19+
@Override
20+
public float getSaggedY(int segmentNo, float yStep) {
21+
return (float) (yStep * segmentNo + getSaggingCoefficient() * (Math.pow(2 * (parameters.getSegmentSize() * segmentNo) - wire.length(), 2) / Math.pow(wire.length(), 2) - 1));
22+
}
23+
24+
public abstract float getSaggingCoefficient();
25+
}

src/main/java/falseresync/vivatech/client/wire/RandomizedUvWireParameters.java renamed to src/main/java/falseresync/vivatech/client/wire/RandomizedUvWireModel.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
import java.util.Random;
88
import java.util.function.Function;
99

10-
public abstract class RandomizedUvWireParameters implements WireParameters {
10+
public class RandomizedUvWireModel implements WireModel {
1111
private static final Random RANDOM = new Random();
12+
protected final float segmentSize;
1213
private final SpriteIdentifier spriteId;
1314
private int uvChunkAmount;
1415
private Sprite sprite;
@@ -26,9 +27,10 @@ public abstract class RandomizedUvWireParameters implements WireParameters {
2627
};
2728
});
2829

29-
protected RandomizedUvWireParameters(SpriteIdentifier spriteId, float uvChunkSize) {
30+
protected RandomizedUvWireModel(SpriteIdentifier spriteId, float uvChunkSize, float segmentSize) {
3031
this.spriteId = spriteId;
3132
this.uvChunkAmount = (int) (16 / uvChunkSize);
33+
this.segmentSize = segmentSize;
3234
}
3335

3436
@Override
@@ -55,4 +57,9 @@ public float[] getUv(int segmentNo) {
5557
}
5658
return randomizedUv.apply(segmentNo);
5759
}
60+
61+
@Override
62+
public float getSegmentSize() {
63+
return segmentSize;
64+
}
5865
}

src/main/java/falseresync/vivatech/client/wire/VivatechWireParameters.java

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package falseresync.vivatech.client.wire;
2+
3+
import net.minecraft.client.texture.Sprite;
4+
import net.minecraft.client.util.SpriteIdentifier;
5+
6+
public interface WireModel {
7+
SpriteIdentifier getSpriteId();
8+
9+
Sprite getSprite();
10+
11+
float[] getUv(int segmentNo);
12+
13+
float getSegmentSize();
14+
}
Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
11
package falseresync.vivatech.client.wire;
22

3-
import net.minecraft.client.texture.Sprite;
4-
import net.minecraft.client.util.SpriteIdentifier;
3+
import falseresync.vivatech.common.power.wire.Wire;
54

65
public interface WireParameters {
7-
SpriteIdentifier getSpriteId();
6+
WireModel getModel();
87

9-
Sprite getSprite();
8+
float getSaggedY(int segmentNo, float yStep);
109

11-
float[] getUv(int segmentNo);
12-
13-
float getSegmentSize();
14-
15-
float getSaggedY(int segmentNo, float yStep, float length);
16-
17-
float getSaggingCoefficient(float length);
10+
@FunctionalInterface
11+
interface Factory {
12+
WireParameters build(Wire wire, WireModel model);
13+
}
1814
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package falseresync.vivatech.client.wire;
2+
3+
import com.google.common.base.Preconditions;
4+
import falseresync.vivatech.common.power.wire.Wire;
5+
import falseresync.vivatech.common.power.wire.WireType;
6+
import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap;
7+
import net.minecraft.client.texture.SpriteAtlasTexture;
8+
import net.minecraft.client.util.SpriteIdentifier;
9+
10+
import java.util.Map;
11+
12+
import static falseresync.vivatech.common.Vivatech.vtId;
13+
14+
public class WireRenderingRegistry {
15+
private static final SpriteIdentifier COPPER_SPRITE_ID = new SpriteIdentifier(SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE, vtId("block/wire"));
16+
private static final Map<WireType, WireModel> MODELS = new Reference2ObjectArrayMap<>();
17+
private static final Map<WireType, WireParameters.Factory> FACTORIES = new Reference2ObjectArrayMap<>();
18+
19+
public static WireParameters getAndBuild(Wire wire) {
20+
return FACTORIES.get(wire.type()).build(wire, MODELS.get(wire.type()));
21+
}
22+
23+
public static void registerModel(WireType type, WireModel parameters) {
24+
Preconditions.checkArgument(!FACTORIES.containsKey(type), "Attempted to register a model for the same wire type twice!");
25+
MODELS.put(type, parameters);
26+
}
27+
28+
public static void registerParametersFactory(WireType type, WireParameters.Factory factory) {
29+
Preconditions.checkArgument(!FACTORIES.containsKey(type), "Attempted to register a parameters factory for the same wire type twice!");
30+
FACTORIES.put(type, factory);
31+
}
32+
33+
public static void registerAll() {
34+
registerModel(WireType.V_230, new RandomizedUvWireModel(COPPER_SPRITE_ID, 2f, 1/32f));
35+
36+
registerParametersFactory(WireType.V_230, (wire, parameters) -> new DefaultRenderableWire(wire, parameters) {
37+
@Override
38+
public float getSaggingCoefficient() {
39+
return wire.length() < 5 ? 0.3f : 0.4f;
40+
}
41+
});
42+
}
43+
}

src/main/java/falseresync/vivatech/common/item/PliersItem.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@
22

33
import falseresync.vivatech.common.Vivatech;
44
import falseresync.vivatech.common.power.grid.GridVertex;
5-
import net.minecraft.item.ItemStack;
65
import net.minecraft.item.ItemUsageContext;
76
import net.minecraft.server.network.ServerPlayerEntity;
87
import net.minecraft.util.ActionResult;
98
import net.minecraft.util.math.GlobalPos;
10-
import net.minecraft.util.math.MathHelper;
119

1210
public class PliersItem extends WireManagementItem {
1311
public PliersItem(Settings settings) {
@@ -16,15 +14,13 @@ public PliersItem(Settings settings) {
1614

1715
@Override
1816
protected ActionResult manageWire(ItemUsageContext context, GlobalPos connection, GridVertex vertexU, GridVertex vertexV) {
19-
if (context.getPlayer() instanceof ServerPlayerEntity player) {
20-
var grid = Vivatech.getPowerSystem().in(context.getWorld().getRegistryKey())
21-
.find(vertexU.pos(), vertexV.pos());
17+
if (context.getPlayer() instanceof ServerPlayerEntity) {
18+
var grid = Vivatech.getPowerSystem().in(context.getWorld().getRegistryKey()).find(vertexU.pos(), vertexV.pos());
2219
if (grid == null) {
2320
return ActionResult.FAIL;
2421
}
2522

2623
if (grid.disconnect(vertexU, vertexV)) {
27-
player.getInventory().offerOrDrop(new ItemStack(VivatechItems.WIRE, MathHelper.floor(vertexU.pos().subtract(vertexV.pos()).toCenterPos().length())));
2824
return ActionResult.SUCCESS;
2925
}
3026

0 commit comments

Comments
 (0)