Skip to content

Commit 5e3074e

Browse files
committed
finished preliminary shape drawer item functionality, added cone drawing to render system
1 parent 9838b57 commit 5e3074e

15 files changed

Lines changed: 227 additions & 58 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ loader_version=0.16.14
1010
loom_version=1.11-SNAPSHOT
1111

1212
# Mod Properties
13-
mod_version=0.4.1
13+
mod_version=0.4.4
1414
maven_group=com.aurus
1515
archives_base_name=tinytactics_ruler
1616

src/client/java/com/aurus/tinytactics/TinyTacticsClient.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,19 @@
33
import com.aurus.tinytactics.data.ColorProviders;
44
import com.aurus.tinytactics.data.TacticsRulerMap;
55
import com.aurus.tinytactics.data.TacticsRulerMapPayload;
6+
import com.aurus.tinytactics.data.TacticsShapeMap;
7+
import com.aurus.tinytactics.data.TacticsShapeMapPayload;
68
import com.aurus.tinytactics.render.RenderManager;
79
import com.aurus.tinytactics.render.blocks.ActorMarkerBlockRenderer;
810
import com.aurus.tinytactics.registry.BlockRegistrar;
911
import com.aurus.tinytactics.registry.ItemRegistrar;
1012

1113
import net.fabricmc.api.ClientModInitializer;
14+
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
1215
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
1316
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
1417
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
18+
import net.minecraft.client.render.RenderLayer;
1519
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories;
1620
import net.minecraft.client.world.ClientWorld;
1721

@@ -23,16 +27,20 @@ public void onInitializeClient() {
2327

2428
ClientPlayNetworking.registerGlobalReceiver(TacticsRulerMapPayload.ID,
2529
TinyTacticsClient::receiveRulerMapPacket);
30+
ClientPlayNetworking.registerGlobalReceiver(TacticsShapeMapPayload.ID,
31+
TinyTacticsClient::receiveShapeMapPacket);
2632

2733
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
2834
ServerHandler.broadcastRulerData();
35+
ServerHandler.broadcastShapeData();
2936
});
3037

3138
ColorProviderRegistry.ITEM.register(ColorProviders::getItemColor, ItemRegistrar.SIMPLE_DYEABLE_ITEMS);
3239
ColorProviderRegistry.BLOCK.register(ColorProviders::getBlockEntityColor,
3340
BlockRegistrar.SIMPLE_DYEABLE_BLOCKS);
3441

3542
BlockEntityRendererFactories.register(BlockRegistrar.ACTOR_MARKER_BLOCK_ENTITY, ActorMarkerBlockRenderer::new);
43+
BlockRenderLayerMap.INSTANCE.putBlock(BlockRegistrar.ACTOR_MARKER, RenderLayer.getTranslucent());
3644
}
3745

3846
public static void receiveRulerMapPacket(TacticsRulerMapPayload payload, ClientPlayNetworking.Context context) {
@@ -43,7 +51,20 @@ public static void receiveRulerMapPacket(TacticsRulerMapPayload payload, ClientP
4351
}
4452

4553
TacticsRulerMap map = payload.map();
46-
RenderManager.getManager().updateMap(map);
54+
RenderManager.getManager().updateRulerMap(map);
55+
56+
TinyTactics.LOGGER.info("Positions Received");
57+
}
58+
59+
public static void receiveShapeMapPacket(TacticsShapeMapPayload payload, ClientPlayNetworking.Context context) {
60+
ClientWorld world = context.client().world;
61+
62+
if (world == null) {
63+
return;
64+
}
65+
66+
TacticsShapeMap map = payload.map();
67+
RenderManager.getManager().updateShapeMap(map);
4768

4869
TinyTactics.LOGGER.info("Positions Received");
4970
}

src/client/java/com/aurus/tinytactics/render/ConeDrawer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public static void renderCone(WorldRenderContext context, Vec3d tipPos, double l
2424
Camera camera = context.camera();
2525
MatrixStack matrices = Objects.requireNonNull(context.matrixStack());
2626

27+
if (diameter <= 0) {
28+
diameter = 0.5;
29+
}
30+
2731
Vec3d endPos = tipPos.add(normal.normalize().multiply(length));
2832
List<Vec3d> ring = RenderUtils.getRingAround(normal, endPos, diameter);
2933

src/client/java/com/aurus/tinytactics/render/RenderManager.java

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,15 @@
66

77
import org.joml.Quaternionf;
88

9+
import com.aurus.tinytactics.data.TacticsDrawToolMap;
910
import com.aurus.tinytactics.data.TacticsRulerMap;
11+
import com.aurus.tinytactics.data.TacticsShape;
12+
import com.aurus.tinytactics.data.TacticsShapeMap;
13+
import com.aurus.tinytactics.util.Collection;
1014
import com.aurus.tinytactics.util.ListCollection;
15+
import com.aurus.tinytactics.util.MapCollection;
1116

17+
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
1218
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
1319
import net.minecraft.util.math.BlockPos;
1420
import net.minecraft.util.math.Vec3d;
@@ -18,7 +24,8 @@
1824

1925
public class RenderManager {
2026

21-
private TacticsRulerMap map;
27+
private TacticsRulerMap tacticsRulerMap;
28+
private TacticsShapeMap tacticsShapeMap;
2229

2330
private static RenderManager manager;
2431

@@ -28,8 +35,11 @@ public class RenderManager {
2835
private static final double CORNER_RULER_LINE_OPACITY = 0.5;
2936
private static final float CORNER_RULER_LINE_WIDTH = 0.02F;
3037

38+
private static final double SHAPE_OPACITY = 0.5;
39+
3140
private RenderManager() {
32-
map = TacticsRulerMap.DEFAULT;
41+
tacticsRulerMap = TacticsRulerMap.DEFAULT;
42+
tacticsShapeMap = TacticsShapeMap.DEFAULT;
3343
}
3444

3545
public static RenderManager getManager() {
@@ -40,33 +50,63 @@ public static RenderManager getManager() {
4050
}
4151

4252
public void init() {
43-
WorldRenderEvents.AFTER_ENTITIES.register(context -> {
44-
for (Map<DyeColor, ListCollection<BlockPos>> userMap : map.getFullMap().values()) {
45-
for (DyeColor color : userMap.keySet()) {
53+
WorldRenderEvents.AFTER_TRANSLUCENT.register(context -> {
54+
renderAllRulerLines(context);
55+
renderAllShapes(context);
56+
57+
ConeDrawer.renderDebugCone(context);
58+
});
59+
}
60+
61+
public void updateRulerMap(TacticsRulerMap map) {
62+
this.tacticsRulerMap = map;
63+
}
64+
65+
public void updateShapeMap(TacticsShapeMap map) {
66+
this.tacticsShapeMap = map;
67+
}
4668

47-
List<BlockPos> list = userMap.get(color).getEntries();
48-
List<Vec3d> vecs = blockPosToVec3ds(list);
69+
private <E extends TacticsDrawToolMap<T, C>, T, C extends Collection<T>> void renderAllDrawFeatures(
70+
WorldRenderContext context, E map, CollectionConsumer<T> consumer) {
71+
for (Map<DyeColor, C> userMap : map.getFullMap().values()) {
72+
for (DyeColor color : userMap.keySet()) {
73+
consumer.consume(userMap.get(color), color);
74+
}
75+
}
76+
}
4977

50-
if (vecs.size() >= 2) {
51-
int mainColor = setColorAlpha(color.getEntityColor(), MAIN_RULER_LINE_OPACITY);
52-
LineDrawer.renderQuadCrossLineStrip(context, vecs, mainColor, MAIN_RULER_LINE_WIDTH);
78+
private void renderAllRulerLines(WorldRenderContext context) {
79+
renderAllDrawFeatures(context, tacticsRulerMap, (collection, color) -> {
80+
List<BlockPos> list = ((ListCollection<BlockPos>) collection).getEntries();
81+
List<Vec3d> vecs = blockPosToVec3ds(list);
5382

54-
Vec3d from = vecs.get(Math.max(vecs.size() - 2, 0));
55-
Vec3d to = vecs.get(Math.max(vecs.size() - 1, 0));
56-
int conerColor = setColorAlpha(mainColor, CORNER_RULER_LINE_OPACITY);
57-
LineDrawer.renderLinesToCorners(context, from, to, conerColor,
58-
CORNER_RULER_LINE_WIDTH);
59-
}
83+
if (vecs.size() >= 2) {
84+
int mainColor = setColorAlpha(color.getEntityColor(), MAIN_RULER_LINE_OPACITY);
85+
LineDrawer.renderQuadCrossLineStrip(context, vecs, mainColor, MAIN_RULER_LINE_WIDTH);
6086

61-
}
87+
Vec3d from = vecs.get(Math.max(vecs.size() - 2, 0));
88+
Vec3d to = vecs.get(Math.max(vecs.size() - 1, 0));
89+
int conerColor = setColorAlpha(mainColor, CORNER_RULER_LINE_OPACITY);
90+
LineDrawer.renderLinesToCorners(context, from, to, conerColor,
91+
CORNER_RULER_LINE_WIDTH);
6292
}
93+
});
94+
}
6395

64-
ConeDrawer.renderDebugCone(context);
96+
private void renderAllShapes(WorldRenderContext context) {
97+
renderAllDrawFeatures(context, tacticsShapeMap, (collection, color) -> {
98+
Map<TacticsShape.Type, TacticsShape> map = ((MapCollection<TacticsShape.Type, TacticsShape>) collection)
99+
.getEntries();
100+
TacticsShape cone = map.get(TacticsShape.Type.CONE);
101+
if (cone != null) {
102+
ConeDrawer.renderCone(context, blockPosToVec3d(cone.getOrigin()), cone.getLength(), cone.getDiameter(),
103+
cone.getDirection(), setColorAlpha(color.getEntityColor(), SHAPE_OPACITY));
104+
}
65105
});
66106
}
67107

68-
public void updateMap(TacticsRulerMap map) {
69-
this.map = map;
108+
public interface CollectionConsumer<T> {
109+
void consume(Collection<T> collection, DyeColor color);
70110
}
71111

72112
public static List<Vec3d> blockPosToVec3ds(List<BlockPos> blockPos) {

src/client/java/com/aurus/tinytactics/render/RenderUtils.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ public static void setRenderPreferences() {
2121
RenderSystem.setShader(GameRenderer::getPositionColorProgram);
2222
}
2323

24+
public static void resetRenderPreferences() {
25+
RenderSystem.enableDepthTest();
26+
RenderSystem.enableCull();
27+
RenderSystem.disableBlend();
28+
RenderSystem.depthMask(true);
29+
}
30+
2431
public static List<Vec3d> getRingAround(Vec3d normal, Vec3d centerPos, double diameter) {
2532
List<Vec3d> result = new ArrayList<>();
2633
Vec3d norm = normal.normalize();

src/main/java/com/aurus/tinytactics/blocks/actor_marker/ActorMarkerBlock.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public class ActorMarkerBlock extends BlockWithEntity {
5252
private static final VoxelShape OUTLINE_SHAPE = Block.createCuboidShape(1.0, 1.0, 1.0, 15.0, 15.0, 15.0);
5353

5454
public ActorMarkerBlock(Settings settings) {
55-
super(settings);
55+
super(settings.nonOpaque().noCollision());
5656
setDefaultState(getDefaultState().with(ROTATION, 0).with(COLOR, DyeColor.WHITE));
5757
}
5858

src/main/java/com/aurus/tinytactics/data/TacticsShape.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
package com.aurus.tinytactics.data;
22

3+
import java.util.function.IntFunction;
4+
5+
import org.jetbrains.annotations.Contract;
6+
import org.jetbrains.annotations.Nullable;
7+
38
import com.mojang.serialization.Codec;
49
import com.mojang.serialization.codecs.RecordCodecBuilder;
510

611
import net.minecraft.util.StringIdentifiable;
12+
import net.minecraft.util.function.ValueLists;
13+
import net.minecraft.util.function.ValueLists.OutOfBoundsHandling;
714
import net.minecraft.util.math.BlockPos;
815
import net.minecraft.util.math.Vec3d;
916

@@ -67,20 +74,46 @@ public Vec3d faceDirection(BlockPos origin, BlockPos destination) {
6774
}
6875

6976
public static enum Type implements StringIdentifiable {
70-
LINE,
71-
SPHERE,
72-
CONE,
73-
CHAIN;
77+
LINE(0, "line"),
78+
SPHERE(1, "sphere"),
79+
CONE(2, "cone"),
80+
CHAIN(3, "chain");
81+
82+
private int id;
83+
private String name;
84+
85+
private static final IntFunction<Type> BY_ID = ValueLists.createIdToValueFunction(Type::getId, values(),
86+
OutOfBoundsHandling.ZERO);
87+
88+
private Type(int id, String name) {
89+
this.id = id;
90+
this.name = name;
91+
}
7492

7593
public static final Codec<TacticsShape.Type> CODEC = StringIdentifiable.createCodec(TacticsShape.Type::values);
7694

95+
public int getId() {
96+
return this.id;
97+
}
98+
99+
public static Type byId(int id) {
100+
return (Type) BY_ID.apply(id);
101+
}
102+
77103
public String toString() {
78-
return this.name().toLowerCase();
104+
return this.name;
79105
}
80106

81107
@Override
82108
public String asString() {
83-
return this.toString();
109+
return this.name;
110+
}
111+
112+
@Nullable
113+
@Contract("_,!null->!null;_,null->_")
114+
public static Type byName(String name, @Nullable Type defaultType) {
115+
Type Type = (Type) valueOf(Type.class, name);
116+
return Type != null ? Type : defaultType;
84117
}
85118

86119
}

src/main/java/com/aurus/tinytactics/data/TacticsShapeMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
public class TacticsShapeMap extends
1919
TacticsDrawToolMap<Pair<TacticsShape.Type, TacticsShape>, MapCollection<TacticsShape.Type, TacticsShape>> {
2020

21-
public static final TacticsShapeMap DEFAULT = new TacticsShapeMap(new HashMap<>());
2221
public static final MapCollection<TacticsShape.Type, TacticsShape> EMPTY = new MapCollection<>();
22+
public static final TacticsShapeMap DEFAULT = new TacticsShapeMap(new HashMap<>());
2323

2424
public static final Codec<TacticsShapeMap> CODEC = RecordCodecBuilder
2525
.create(instance -> instance

0 commit comments

Comments
 (0)