Skip to content

Commit 98dbdad

Browse files
committed
feat: introduce client side logic
1 parent 9293af4 commit 98dbdad

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+553
-381
lines changed

build.gradle.kts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,25 @@ plugins {
1212
fun buildMetadata(): String {
1313
System.getenv("BUILD_METADATA")?.let { return it }
1414
System.getenv("GITHUB_RUN_NUMBER")?.let { return "build.${it}" }
15-
return "unknown"
15+
return "dev"
1616
}
1717

1818
version = "${project.property("mod_version")}-mc${project.property("compatible_mc_version")}+${buildMetadata()}"
1919
group = "nk0.me"
2020

2121
base {
22-
archivesName = "redstone-comp-util"
22+
archivesName = "redstone-computer-utilities"
2323
}
2424

2525
loom {
2626
accessWidenerPath = file("src/main/resources/rcu.accesswidener")
27+
splitEnvironmentSourceSets()
28+
mods {
29+
create("rcu") {
30+
sourceSet("main")
31+
sourceSet("client")
32+
}
33+
}
2734
}
2835

2936
tasks.withType<AbstractArchiveTask> {
@@ -41,7 +48,8 @@ dependencies {
4148
"fabric-command-api-v2",
4249
"fabric-events-interaction-v0",
4350
"fabric-lifecycle-events-v1",
44-
"fabric-particles-v1"
51+
"fabric-particles-v1",
52+
"fabric-rendering-v1",
4553
)
4654
apiModules.forEach {
4755
modImplementation(fabricApi.module(it, project.property("fabric_version") as? String))
@@ -50,6 +58,7 @@ dependencies {
5058
implementation("com.google.code.gson:gson:${project.property("gson_version")}")
5159
implementation("com.google.guava:guava:${project.property("guava_version")}")
5260
implementation("io.netty:netty-all:${project.property("netty_version")}")
61+
implementation("org.joml:joml:${project.property("joml_version")}")
5362
}
5463

5564
tasks.processResources {
@@ -82,14 +91,13 @@ tasks.jar {
8291
}
8392

8493
tasks.shadowJar {
94+
from(sourceSets.get("client").output)
8595
from("LICENSE") {
8696
rename { "${it}-rcu" }
8797
}
88-
8998
dependencies {
9099
include(dependency("io.netty:netty-codec-http:.*"))
91100
}
92-
93101
exclude("mappings/**")
94102
minimize()
95103
}

determine_deps.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ def main():
1919
print(f' guava_version={version}')
2020
case [_, 'netty-codec', version]:
2121
print(f' netty_version={version}')
22+
case [_, 'joml', version]:
23+
print(f' joml_version={version}')
2224
case [_, _, _]:
2325
pass
2426
case _:

gradle.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,4 @@ fabric_version=0.87.2+1.19.4
1515
gson_version=2.10
1616
guava_version=31.1-jre
1717
netty_version=4.1.82.Final
18+
joml_version=1.10.5
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package me.nk0.rcu.client
2+
3+
import me.nk0.rcu.client.render.InterfaceRenderer
4+
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents
5+
6+
fun init() {
7+
WorldRenderEvents.AFTER_ENTITIES.register(InterfaceRenderer::render)
8+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package me.nk0.rcu.client.render
2+
3+
import me.nk0.rcu.manager.InterfaceManager
4+
import me.nk0.rcu.model.Interface
5+
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext
6+
import net.minecraft.client.render.VertexConsumerProvider
7+
import net.minecraft.client.util.math.MatrixStack
8+
9+
object InterfaceRenderer {
10+
fun render(ctx: WorldRenderContext) {
11+
val consumer = ctx.worldRenderer().bufferBuilders.outlineVertexConsumers
12+
consumer.setColor(255, 255, 255, 255)
13+
val matrix = ctx.matrixStack()
14+
matrix.push()
15+
matrix.translate(ctx.camera().pos.negate())
16+
InterfaceManager.iterable().forEach { interfaze -> renderOne(matrix, consumer, interfaze) }
17+
matrix.pop()
18+
}
19+
20+
private fun renderOne(matrix: MatrixStack, consumer: VertexConsumerProvider, interfaze: Interface) {
21+
val selected = true
22+
interfaze.forEach { pos ->
23+
val powered = pos.readDigitalOrZero()
24+
val color = Color.getFill(selected, powered)
25+
val buffer = consumer.getBuffer(RcuRenderLayer.getFill(selected))
26+
drawBoxFilledAtBlock(matrix, buffer, pos, color)
27+
val outline = consumer.getBuffer(RcuRenderLayer.getOutline(selected))
28+
drawBoxOutlineAtBlock(matrix, outline, pos)
29+
}
30+
}
31+
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package me.nk0.rcu.client.render
2+
3+
import net.minecraft.client.render.*
4+
import net.minecraft.client.render.VertexFormat.DrawMode
5+
import net.minecraft.client.util.math.MatrixStack
6+
import net.minecraft.util.Identifier
7+
import net.minecraft.util.math.BlockPos
8+
import net.minecraft.util.math.Vec3d
9+
import net.minecraft.util.math.Vec3i
10+
import org.joml.Matrix4f
11+
import org.joml.Vector4f
12+
13+
object Color {
14+
val DEFAULT: Vector4f = Vector4f(0f, 0.823f, 1f, 0.3f)
15+
val POWERED: Vector4f = Vector4f(1f, 0.251f, 0f, 0.3f)
16+
val SELECTED: Vector4f = Vector4f(0f, 0.823f, 1f, 0.7f)
17+
val SELECTED_POWERED: Vector4f = Vector4f(1f, 0.251f, 0f, 0.7f)
18+
val SELECTED_OUTLINE: Vector4f = Vector4f(1f, 1f, 1f, 1f)
19+
val SELECTED_POWERED_OUTLINE: Vector4f = Vector4f(0.384f, 0.878f, 1f, 1f)
20+
21+
fun getFill(selected: Boolean, powered: Boolean): Vector4f = when (Pair(selected, powered)) {
22+
Pair(true, true) -> {
23+
SELECTED_POWERED
24+
}
25+
26+
Pair(true, false) -> {
27+
SELECTED
28+
}
29+
30+
Pair(false, true) -> {
31+
POWERED
32+
}
33+
34+
else -> {
35+
DEFAULT
36+
}
37+
}
38+
39+
fun getOutline(powered: Boolean): Vector4f = if (powered) {
40+
SELECTED_POWERED_OUTLINE
41+
} else {
42+
SELECTED_OUTLINE
43+
}
44+
}
45+
46+
object RcuRenderLayer {
47+
val DEFAULT = RenderLayer.of(
48+
"rcu_default",
49+
VertexFormats.POSITION_COLOR,
50+
DrawMode.TRIANGLE_STRIP,
51+
131072,
52+
RenderLayer.MultiPhaseParameters.builder().program(RenderPhase.COLOR_PROGRAM)
53+
.layering(RenderPhase.VIEW_OFFSET_Z_LAYERING).transparency(RenderPhase.TRANSLUCENT_TRANSPARENCY)
54+
.build(false),
55+
) as RenderLayer
56+
val SELECTED = RenderLayer.of(
57+
"rcu_selected",
58+
VertexFormats.POSITION_COLOR,
59+
DrawMode.TRIANGLE_STRIP,
60+
131072,
61+
RenderLayer.MultiPhaseParameters.builder().program(RenderPhase.COLOR_PROGRAM)
62+
.layering(RenderPhase.VIEW_OFFSET_Z_LAYERING).transparency(RenderPhase.TRANSLUCENT_TRANSPARENCY)
63+
.depthTest(RenderPhase.ALWAYS_DEPTH_TEST).target(RenderPhase.OUTLINE_TARGET).build(true),
64+
) as RenderLayer
65+
val OUTLINE = RenderLayer.of(
66+
"outline",
67+
VertexFormats.POSITION_COLOR_TEXTURE,
68+
DrawMode.QUADS,
69+
256,
70+
RenderLayer.MultiPhaseParameters.builder().program(RenderPhase.OUTLINE_PROGRAM)
71+
.texture(RenderPhase.Texture(Identifier("minecraft", "textures/entity/shulker/shulker.png"), false, false))
72+
.cull(RenderPhase.DISABLE_CULLING).depthTest(RenderPhase.ALWAYS_DEPTH_TEST)
73+
.target(RenderPhase.OUTLINE_TARGET).build(RenderLayer.OutlineMode.IS_OUTLINE),
74+
)
75+
76+
fun getFill(selected: Boolean): RenderLayer = if (selected) {
77+
SELECTED
78+
} else {
79+
DEFAULT
80+
}
81+
82+
fun getOutline(selected: Boolean): RenderLayer = OUTLINE
83+
}
84+
85+
fun MatrixStack.translate(vec: Vec3d) = this.translate(vec.x, vec.y, vec.z)
86+
87+
fun MatrixStack.translate(vec: Vec3i) = this.translate(vec.x.toDouble(), vec.y.toDouble(), vec.z.toDouble())
88+
89+
fun drawBoxFilledAtBlock(matrix: MatrixStack, buffer: VertexConsumer, pos: BlockPos, color: Vector4f) =
90+
WorldRenderer.method_49041(
91+
matrix,
92+
buffer,
93+
pos.x.toFloat(),
94+
pos.y.toFloat(),
95+
pos.z.toFloat(),
96+
(pos.x + 1).toFloat(),
97+
(pos.y + 1).toFloat(),
98+
(pos.z + 1).toFloat(),
99+
color.x,
100+
color.y,
101+
color.z,
102+
color.w,
103+
)
104+
105+
fun drawBoxOutline(
106+
matrix: MatrixStack, buffer: VertexConsumer,
107+
x1: Float,
108+
y1: Float,
109+
z1: Float,
110+
x2: Float,
111+
y2: Float,
112+
z2: Float,
113+
) {
114+
val matrix: Matrix4f? = matrix.peek().getPositionMatrix()
115+
116+
buffer.vertex(matrix, x1, y1, z1).next()
117+
buffer.vertex(matrix, x1, y1, z2).next()
118+
buffer.vertex(matrix, x1, y2, z2).next()
119+
buffer.vertex(matrix, x1, y2, z1).next()
120+
121+
buffer.vertex(matrix, x2, y1, z1).next()
122+
buffer.vertex(matrix, x2, y2, z1).next()
123+
buffer.vertex(matrix, x2, y2, z2).next()
124+
buffer.vertex(matrix, x2, y1, z2).next()
125+
126+
buffer.vertex(matrix, x1, y1, z1).next()
127+
buffer.vertex(matrix, x2, y1, z1).next()
128+
buffer.vertex(matrix, x2, y1, z2).next()
129+
buffer.vertex(matrix, x1, y1, z2).next()
130+
131+
buffer.vertex(matrix, x1, y2, z1).next()
132+
buffer.vertex(matrix, x1, y2, z2).next()
133+
buffer.vertex(matrix, x2, y2, z2).next()
134+
buffer.vertex(matrix, x2, y2, z1).next()
135+
136+
buffer.vertex(matrix, x1, y1, z1).next()
137+
buffer.vertex(matrix, x1, y2, z1).next()
138+
buffer.vertex(matrix, x2, y2, z1).next()
139+
buffer.vertex(matrix, x2, y1, z1).next()
140+
141+
buffer.vertex(matrix, x1, y1, z2).next()
142+
buffer.vertex(matrix, x2, y1, z2).next()
143+
buffer.vertex(matrix, x2, y2, z2).next()
144+
buffer.vertex(matrix, x1, y2, z2).next()
145+
}
146+
147+
fun drawBoxOutlineAtBlock(
148+
matrix: MatrixStack, buffer: VertexConsumer, pos: BlockPos,
149+
) = drawBoxOutline(
150+
matrix, buffer,
151+
pos.x.toFloat(),
152+
pos.y.toFloat(),
153+
pos.z.toFloat(),
154+
(pos.x + 1).toFloat(),
155+
(pos.y + 1).toFloat(),
156+
(pos.z + 1).toFloat(),
157+
)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"required": true,
3+
"minVersion": "0.8",
4+
"package": "me.nk0.rcu.client.mixin",
5+
"compatibilityLevel": "JAVA_17",
6+
"mixins": [],
7+
"client": [],
8+
"injectors": {
9+
"defaultRequire": 1
10+
}
11+
}

src/main/java/me/nk0/rcu/Options.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,8 @@
11
package me.nk0.rcu;
22

3-
import java.io.File;
4-
import java.io.FileReader;
5-
import java.io.FileWriter;
6-
import java.io.IOException;
7-
import java.nio.charset.StandardCharsets;
8-
93
import com.google.gson.Gson;
104
import com.google.gson.JsonParseException;
115
import com.google.gson.annotations.Expose;
12-
136
import me.nk0.rcu.helper.GsonHelper;
147
import me.nk0.rcu.helper.Log;
158
import net.fabricmc.loader.api.FabricLoader;
@@ -19,6 +12,12 @@
1912
import net.minecraft.server.MinecraftServer;
2013
import net.minecraft.text.Text;
2114

15+
import java.io.File;
16+
import java.io.FileReader;
17+
import java.io.FileWriter;
18+
import java.io.IOException;
19+
import java.nio.charset.StandardCharsets;
20+
2221
public class Options {
2322
private static Gson gson;
2423
private static File file;

src/main/java/me/nk0/rcu/adapter/BitSetAdapter.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package me.nk0.rcu.adapter;
22

3-
import java.io.IOException;
4-
import java.util.BitSet;
5-
63
import com.google.gson.TypeAdapter;
74
import com.google.gson.stream.JsonReader;
85
import com.google.gson.stream.JsonToken;
96
import com.google.gson.stream.JsonWriter;
10-
117
import me.nk0.rcu.helper.BitSetHelper;
128

9+
import java.io.IOException;
10+
import java.util.BitSet;
11+
1312
public class BitSetAdapter extends TypeAdapter<BitSet> {
1413
@Override
1514
public void write(JsonWriter out, BitSet value) throws IOException {
@@ -29,5 +28,5 @@ public BitSet read(JsonReader in) throws IOException {
2928
return BitSetHelper.fromBase64(in.nextString());
3029
}
3130
}
32-
31+
3332
}

src/main/java/me/nk0/rcu/adapter/BlockPosAdapter.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package me.nk0.rcu.adapter;
22

3-
import java.io.IOException;
4-
53
import com.google.gson.TypeAdapter;
64
import com.google.gson.stream.JsonReader;
75
import com.google.gson.stream.JsonToken;
86
import com.google.gson.stream.JsonWriter;
9-
107
import me.nk0.rcu.helper.PosHelper;
118
import net.minecraft.util.math.BlockPos;
129

10+
import java.io.IOException;
11+
1312
public class BlockPosAdapter extends TypeAdapter<BlockPos> {
1413
private static final Vec3iAdapter VEC3I_ADAPTER = new Vec3iAdapter();
1514

0 commit comments

Comments
 (0)