Skip to content

Commit 8475d00

Browse files
committed
Added KMath.getSpiral
1 parent fe2f163 commit 8475d00

File tree

4 files changed

+120
-12
lines changed

4 files changed

+120
-12
lines changed

src/main/java/dev/latvian/mods/klib/core/KLibPoseStackPose.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
package dev.latvian.mods.klib.core;
22

3+
import com.mojang.blaze3d.vertex.PoseStack;
34
import dev.latvian.mods.klib.vertex.VertexCallback;
45

56
public interface KLibPoseStackPose {
7+
default void scale(float scale) {
8+
((PoseStack) this).scale(scale, scale, scale);
9+
}
10+
611
default VertexCallback transform(VertexCallback callback) {
712
return transformNormals(transformPositions(callback));
813
}

src/main/java/dev/latvian/mods/klib/math/KMath.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.latvian.mods.klib.math;
22

3+
import dev.latvian.mods.klib.util.Lazy;
34
import net.minecraft.core.BlockPos;
45
import net.minecraft.core.Position;
56
import net.minecraft.nbt.ByteTag;
@@ -11,6 +12,8 @@
1112
import net.minecraft.world.phys.Vec3;
1213
import org.joml.Matrix3fc;
1314
import org.joml.Matrix4fc;
15+
import org.joml.Vector2i;
16+
import org.joml.Vector2ic;
1417
import org.joml.Vector3fc;
1518
import org.joml.Vector4fc;
1619

@@ -82,6 +85,16 @@ public String format(Vector4fc pos) {
8285
float F_TO_DEG = (float) TO_DEG;
8386
float F_TO_RAD = (float) TO_RAD;
8487

88+
Lazy<Vector2ic[]> CACHED_SPIRAL = Lazy.of(() -> {
89+
var spiral = new Vector2ic[961];
90+
91+
for (int i = 0; i < spiral.length; i++) {
92+
spiral[i] = calculateSpiral(i, new Vector2i());
93+
}
94+
95+
return spiral;
96+
});
97+
8598
static Vec3 vec3(double x, double y, double z) {
8699
if (x == 0D && y == 0D && z == 0D) {
87100
return Vec3.ZERO;
@@ -338,4 +351,44 @@ static float dist(float x0, float y0, float x1, float y1) {
338351
double dy = y1 - y0;
339352
return (float) Math.sqrt(dx * dx + dy * dy);
340353
}
354+
355+
static Vector2ic getSpiral(int index) {
356+
if (index <= 0) {
357+
return Identity.IVEC_2;
358+
} else if (index < 961) {
359+
return CACHED_SPIRAL.get()[index];
360+
} else {
361+
return calculateSpiral(index, new Vector2i());
362+
}
363+
}
364+
365+
static Vector2i calculateSpiral(int index, Vector2i out) {
366+
if (index <= 0) {
367+
return out.set(0);
368+
}
369+
370+
int x = 0, y = 0;
371+
int dx = 0, dy = 1;
372+
int segmentLength = 1, segmentPassed = 0;
373+
374+
for (var n = 0; n < index; n++) {
375+
x += dx;
376+
y += dy;
377+
segmentPassed++;
378+
379+
if (segmentPassed == segmentLength) {
380+
segmentPassed = 0;
381+
382+
var buffer = dy;
383+
dy = -dx;
384+
dx = buffer;
385+
386+
if (dx == 0) {
387+
segmentLength++;
388+
}
389+
}
390+
}
391+
392+
return out.set(x, y);
393+
}
341394
}

src/main/java/dev/latvian/mods/klib/texture/LightUV.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
public record LightUV(int packed, int u, int v) implements PackedUV {
88
public static final LightUV NONE = new LightUV(0xF00000);
9-
public static final LightUV BRIGHT = new LightUV(0xF000F0);
9+
public static final LightUV FULLBRIGHT = new LightUV(0xF000F0);
1010
public static final LightUV FULL_SKY = new LightUV(15728640);
1111
public static final LightUV FULL_BLOCK = new LightUV(240);
1212

@@ -17,7 +17,7 @@ public LightUV decode(ByteBuf buf) {
1717

1818
return switch (type) {
1919
case 1 -> NONE;
20-
case 2 -> BRIGHT;
20+
case 2 -> FULLBRIGHT;
2121
case 3 -> FULL_SKY;
2222
case 4 -> FULL_BLOCK;
2323
case 0 -> new LightUV(VarInt.read(buf));
@@ -29,7 +29,7 @@ public LightUV decode(ByteBuf buf) {
2929
public void encode(ByteBuf buf, LightUV value) {
3030
if (value.equals(NONE)) {
3131
buf.writeByte(1);
32-
} else if (value.equals(BRIGHT)) {
32+
} else if (value.equals(FULLBRIGHT)) {
3333
buf.writeByte(2);
3434
} else if (value.equals(FULL_SKY)) {
3535
buf.writeByte(3);

src/main/java/dev/latvian/mods/klib/texture/UV.java

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,73 @@
55
import dev.latvian.mods.klib.math.Vec3f;
66
import io.netty.buffer.ByteBuf;
77
import net.minecraft.core.Direction;
8-
import net.minecraft.network.codec.ByteBufCodecs;
98
import net.minecraft.network.codec.StreamCodec;
109

1110
import java.util.List;
1211

1312
public record UV(float u0, float v0, float u1, float v1) {
1413
public static final UV FULL = new UV(0F, 0F, 1F, 1F);
14+
public static final UV ZERO = new UV(0F, 0F, 0F, 0F);
15+
public static final UV ONE = new UV(1F, 1F, 1F, 1F);
1516

16-
public static final Codec<UV> CODEC = Codec.FLOAT.listOf(4, 4).xmap(f -> f.get(0) == 0F && f.get(1) == 0F && f.get(2) == 2F && f.get(3) == 1F ? FULL : new UV(f.get(0), f.get(1), f.get(2), f.get(3)), uv -> List.of(uv.u0, uv.v0, uv.u1, uv.v1));
17+
public static final Codec<UV> CODEC = Codec.FLOAT.listOf(4, 4).xmap(f -> {
18+
float u0 = f.get(0);
19+
float v0 = f.get(1);
20+
float u1 = f.get(2);
21+
float v1 = f.get(3);
1722

18-
public static final StreamCodec<ByteBuf, UV> STREAM_CODEC = StreamCodec.composite(
19-
ByteBufCodecs.FLOAT, UV::u0,
20-
ByteBufCodecs.FLOAT, UV::v0,
21-
ByteBufCodecs.FLOAT, UV::u1,
22-
ByteBufCodecs.FLOAT, UV::v1,
23-
UV::new
24-
);
23+
if (u0 == 0F && v0 == 0F && u1 == 1F && v1 == 1F) {
24+
return FULL;
25+
} else if (u0 == 0F && v0 == 0F && u1 == 0F && v1 == 0F) {
26+
return ZERO;
27+
} else if (u0 == 1F && v0 == 1F && u1 == 1F && v1 == 1F) {
28+
return ONE;
29+
} else {
30+
return new UV(u0, v0, u1, v1);
31+
}
32+
}, uv -> List.of(uv.u0, uv.v0, uv.u1, uv.v1));
33+
34+
public static final StreamCodec<ByteBuf, UV> STREAM_CODEC = new StreamCodec<>() {
35+
@Override
36+
public UV decode(ByteBuf buf) {
37+
return switch (buf.readByte()) {
38+
case 1 -> FULL;
39+
case 2 -> ZERO;
40+
case 3 -> ONE;
41+
case 4 -> new UV(buf.readFloat());
42+
case 5 -> new UV(0F, 0F, buf.readFloat(), buf.readFloat());
43+
default -> new UV(buf.readFloat(), buf.readFloat(), buf.readFloat(), buf.readFloat());
44+
};
45+
}
46+
47+
@Override
48+
public void encode(ByteBuf buf, UV uv) {
49+
if (uv.isFull()) {
50+
buf.writeByte(1);
51+
} else if (uv.equals(ZERO)) {
52+
buf.writeByte(2);
53+
} else if (uv.equals(ONE)) {
54+
buf.writeByte(3);
55+
} else if (uv.u1 == uv.u0 && uv.v0 == uv.u0 && uv.v1 == uv.u0) {
56+
buf.writeByte(4);
57+
buf.writeFloat(uv.u0);
58+
} else if (uv.u0 == 0F && uv.v0 == 0F) {
59+
buf.writeByte(5);
60+
buf.writeFloat(uv.u1);
61+
buf.writeFloat(uv.v1);
62+
} else {
63+
buf.writeByte(0);
64+
buf.writeFloat(uv.u0);
65+
buf.writeFloat(uv.v0);
66+
buf.writeFloat(uv.u1);
67+
buf.writeFloat(uv.v1);
68+
}
69+
}
70+
};
71+
72+
public UV(float all) {
73+
this(all, all, all, all);
74+
}
2575

2676
public UV uvsByFace(Vec3f from, Vec3f to, Direction face) {
2777
return switch (face) {

0 commit comments

Comments
 (0)