diff --git a/src/main/java/com/jozufozu/flywheel/api/vertex/MutableVertexList.java b/src/main/java/com/jozufozu/flywheel/api/vertex/MutableVertexList.java index e4796c038..5e82575f6 100644 --- a/src/main/java/com/jozufozu/flywheel/api/vertex/MutableVertexList.java +++ b/src/main/java/com/jozufozu/flywheel/api/vertex/MutableVertexList.java @@ -7,20 +7,13 @@ public interface MutableVertexList extends VertexList { void z(int index, float z); - void r(int index, byte r); + void r(int index, float r); - void g(int index, byte g); + void g(int index, float g); - void b(int index, byte b); + void b(int index, float b); - void a(int index, byte a); - - default void color(int index, int color) { - a(index, (byte) (color >> 24 & 0xFF)); - r(index, (byte) (color >> 16 & 0xFF)); - g(index, (byte) (color >> 8 & 0xFF)); - b(index, (byte) (color & 0xFF)); - } + void a(int index, float a); void u(int index, float u); diff --git a/src/main/java/com/jozufozu/flywheel/api/vertex/ReusableVertexList.java b/src/main/java/com/jozufozu/flywheel/api/vertex/ReusableVertexList.java index 6cff3b6d5..a74bcb103 100644 --- a/src/main/java/com/jozufozu/flywheel/api/vertex/ReusableVertexList.java +++ b/src/main/java/com/jozufozu/flywheel/api/vertex/ReusableVertexList.java @@ -5,7 +5,5 @@ public interface ReusableVertexList extends MutableVertexList { void ptr(long ptr); - int vertexStride(); - void vertexCount(int vertexCount); } diff --git a/src/main/java/com/jozufozu/flywheel/api/vertex/VertexList.java b/src/main/java/com/jozufozu/flywheel/api/vertex/VertexList.java index d30ad7ce3..1b5070534 100644 --- a/src/main/java/com/jozufozu/flywheel/api/vertex/VertexList.java +++ b/src/main/java/com/jozufozu/flywheel/api/vertex/VertexList.java @@ -1,7 +1,5 @@ package com.jozufozu.flywheel.api.vertex; -import com.dreizak.miniball.model.PointSet; - /** * A read only view of a vertex buffer. * @@ -11,24 +9,20 @@ import com.dreizak.miniball.model.PointSet; *

* TODO: more flexible elements? */ -public interface VertexList extends PointSet { +public interface VertexList { float x(int index); float y(int index); float z(int index); - byte r(int index); + float r(int index); - byte g(int index); + float g(int index); - byte b(int index); + float b(int index); - byte a(int index); - - default int color(int index) { - return a(index) << 24 | r(index) << 16 | g(index) << 8 | b(index); - } + float a(int index); float u(int index); @@ -80,24 +74,4 @@ public interface VertexList extends PointSet { default boolean isEmpty() { return vertexCount() == 0; } - - @Override - default int size() { - return vertexCount(); - } - - @Override - default int dimension() { - return 3; - } - - @Override - default double coord(int i, int j) { - return switch (j) { - case 0 -> x(i); - case 1 -> y(i); - case 2 -> z(i); - default -> throw new IllegalArgumentException("Invalid dimension: " + j); - }; - } } diff --git a/src/main/java/com/jozufozu/flywheel/api/vertex/VertexType.java b/src/main/java/com/jozufozu/flywheel/api/vertex/VertexType.java index 72dab420d..596ff8aba 100644 --- a/src/main/java/com/jozufozu/flywheel/api/vertex/VertexType.java +++ b/src/main/java/com/jozufozu/flywheel/api/vertex/VertexType.java @@ -14,12 +14,4 @@ public interface VertexType extends VertexListProvider { BufferLayout getLayout(); FileResolution getLayoutShader(); - - default int getStride() { - return getLayout().getStride(); - } - - default int byteOffset(int vertexIndex) { - return getStride() * vertexIndex; - } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMeshPool.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMeshPool.java index 896077b4d..649c79989 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMeshPool.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchedMeshPool.java @@ -36,7 +36,7 @@ public class BatchedMeshPool { public BatchedMeshPool(VertexFormat vertexFormat) { this.vertexFormat = vertexFormat; vertexList = VertexListProvider.get(vertexFormat).createVertexList(); - growthMargin = vertexList.vertexStride() * 32; + growthMargin = vertexFormat.getVertexSize() * 32; } /** @@ -47,7 +47,7 @@ public class BatchedMeshPool { */ public BufferedMesh alloc(Mesh mesh) { return meshes.computeIfAbsent(mesh, m -> { - BufferedMesh bufferedMesh = new BufferedMesh(m, byteSize, m.getVertexCount() * vertexList.vertexStride()); + BufferedMesh bufferedMesh = new BufferedMesh(m, byteSize); byteSize += bufferedMesh.size(); allBuffered.add(bufferedMesh); pendingUpload.add(bufferedMesh); @@ -150,19 +150,50 @@ public class BatchedMeshPool { public class BufferedMesh { private final Mesh mesh; + private final int byteSize; + private final int vertexCount; + private long byteIndex; - private int byteSize; private boolean deleted; - private BufferedMesh(Mesh mesh, long byteIndex, int byteSize) { + private BufferedMesh(Mesh mesh, long byteIndex) { this.mesh = mesh; + vertexCount = mesh.getVertexCount(); + byteSize = vertexCount * vertexFormat.getVertexSize(); this.byteIndex = byteIndex; - this.byteSize = byteSize; + } + + public int size() { + return byteSize; + } + + public int getVertexCount() { + return vertexCount; + } + + public VertexFormat getVertexFormat() { + return vertexFormat; + } + + public boolean isDeleted() { + return deleted; + } + + private boolean isEmpty() { + return mesh.isEmpty() || isDeleted(); + } + + private long ptr() { + return BatchedMeshPool.this.memory.ptr() + byteIndex; } private void buffer(ReusableVertexList vertexList) { + if (isEmpty()) { + return; + } + vertexList.ptr(ptr()); - vertexList.vertexCount(mesh.getVertexCount()); + vertexList.vertexCount(vertexCount); mesh.write(vertexList); } @@ -175,34 +206,10 @@ public class BatchedMeshPool { MemoryUtil.memCopy(ptr(), ptr, byteSize); } - private boolean isEmpty() { - return mesh.isEmpty() || isDeleted(); - } - - private long ptr() { - return BatchedMeshPool.this.memory.ptr() + byteIndex; - } - public void delete() { deleted = true; BatchedMeshPool.this.dirty = true; BatchedMeshPool.this.anyToRemove = true; } - - public Mesh getMesh() { - return mesh; - } - - public int size() { - return byteSize; - } - - public VertexFormat getVertexFormat() { - return vertexFormat; - } - - public boolean isDeleted() { - return deleted; - } } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java index 5e0572102..84f1408be 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/BatchingEngine.java @@ -39,10 +39,10 @@ public class BatchingEngine implements Engine { // TODO: async task engine barriers taskEngine.syncPoint(); - submitTasks(taskEngine, stack, context.level()); + submitTasks(taskEngine, stack.last(), context.level()); } - public void submitTasks(TaskEngine taskEngine, PoseStack stack, ClientLevel level) { + public void submitTasks(TaskEngine taskEngine, PoseStack.Pose matrices, ClientLevel level) { for (var transformSetEntry : transformManager.getTransformSetsView().entrySet()) { var stage = transformSetEntry.getKey(); var transformSet = transformSetEntry.getValue(); @@ -65,7 +65,7 @@ public class BatchingEngine implements Engine { int startVertex = 0; for (var transformCall : transformCalls) { - transformCall.submitTasks(taskEngine, buffer, startVertex, stack, level); + transformCall.submitTasks(taskEngine, buffer, startVertex, matrices, level); startVertex += transformCall.getTotalVertexCount(); } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/DrawBuffer.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/DrawBuffer.java index 534fd687c..4a5cc0621 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/DrawBuffer.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/DrawBuffer.java @@ -72,7 +72,7 @@ public class DrawBuffer { } ReusableVertexList vertexList = provider.createVertexList(); - vertexList.ptr(memory.ptr() + startVertex * vertexList.vertexStride()); + vertexList.ptr(memory.ptr() + startVertex * stride); vertexList.vertexCount(vertexCount); return vertexList; } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/TransformCall.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/TransformCall.java index caac1a4f4..2c0827707 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/TransformCall.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/batching/TransformCall.java @@ -9,7 +9,6 @@ import com.jozufozu.flywheel.api.vertex.MutableVertexList; import com.jozufozu.flywheel.api.vertex.ReusableVertexList; import com.jozufozu.flywheel.backend.instancing.TaskEngine; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.math.Matrix3f; import com.mojang.math.Matrix4f; import com.mojang.math.Vector3f; @@ -20,23 +19,25 @@ import net.minecraft.client.multiplayer.ClientLevel; public class TransformCall { private final CPUInstancer instancer; private final Material material; - private final BatchedMeshPool.BufferedMesh bufferedMesh; + private final BatchedMeshPool.BufferedMesh mesh; + + private final int meshVertexCount; + private final int meshByteSize; public TransformCall(CPUInstancer instancer, Material material, BatchedMeshPool.BufferedMesh mesh) { this.instancer = instancer; this.material = material; - this.bufferedMesh = mesh; + this.mesh = mesh; + + meshVertexCount = mesh.getVertexCount(); + meshByteSize = mesh.size(); } - public Material getMaterial() { - return material; + public int getTotalVertexCount() { + return meshVertexCount * instancer.getInstanceCount(); } - public VertexFormat getVertexFormat() { - return bufferedMesh.getVertexFormat(); - } - - void submitTasks(TaskEngine pool, DrawBuffer buffer, int startVertex, PoseStack stack, ClientLevel level) { + void submitTasks(TaskEngine pool, DrawBuffer buffer, int startVertex, PoseStack.Pose matrices, ClientLevel level) { instancer.setup(); int instances = instancer.getInstanceCount(); @@ -46,34 +47,32 @@ public class TransformCall { instances -= 512; int start = Math.max(instances, 0); - int vertexCount = bufferedMesh.getMesh().getVertexCount() * (end - start); + int vertexCount = meshVertexCount * (end - start); ReusableVertexList sub = buffer.slice(startVertex, vertexCount); startVertex += vertexCount; - pool.submit(() -> transformRange(sub, start, end, stack, level)); + pool.submit(() -> transformRange(sub, start, end, matrices, level)); } } - private void transformRange(ReusableVertexList vertexList, int from, int to, PoseStack stack, ClientLevel level) { - transformList(vertexList, instancer.getRange(from, to), stack, level); + private void transformRange(ReusableVertexList vertexList, int from, int to, PoseStack.Pose matrices, ClientLevel level) { + transformList(vertexList, instancer.getRange(from, to), matrices, level); } - void transformAll(ReusableVertexList vertexList, PoseStack stack, ClientLevel level) { - transformList(vertexList, instancer.getAll(), stack, level); + void transformAll(ReusableVertexList vertexList, PoseStack.Pose matrices, ClientLevel level) { + transformList(vertexList, instancer.getAll(), matrices, level); } - private void transformList(ReusableVertexList vertexList, List parts, PoseStack stack, ClientLevel level) { + private void transformList(ReusableVertexList vertexList, List parts, PoseStack.Pose matrices, ClientLevel level) { long anchorPtr = vertexList.ptr(); int totalVertexCount = vertexList.vertexCount(); - int meshVertexCount = bufferedMesh.getMesh().getVertexCount(); - int meshByteSize = bufferedMesh.size(); vertexList.vertexCount(meshVertexCount); StructType.VertexTransformer structVertexTransformer = instancer.type.getVertexTransformer(); for (D d : parts) { - bufferedMesh.copyTo(vertexList.ptr()); + mesh.copyTo(vertexList.ptr()); structVertexTransformer.transform(vertexList, d, level); @@ -83,15 +82,15 @@ public class TransformCall { vertexList.ptr(anchorPtr); vertexList.vertexCount(totalVertexCount); material.getVertexTransformer().transform(vertexList, level); - applyPoseStack(vertexList, stack); + applyPoseStack(vertexList, matrices); } - private static void applyPoseStack(MutableVertexList vertexList, PoseStack stack) { + private static void applyPoseStack(MutableVertexList vertexList, PoseStack.Pose matrices) { Vector4f pos = new Vector4f(); Vector3f normal = new Vector3f(); - Matrix4f modelMatrix = stack.last().pose(); - Matrix3f normalMatrix = stack.last().normal(); + Matrix4f modelMatrix = matrices.pose(); + Matrix3f normalMatrix = matrices.normal(); for (int i = 0; i < vertexList.vertexCount(); i++) { pos.set( @@ -117,8 +116,4 @@ public class TransformCall { vertexList.normalZ(i, normal.z()); } } - - public int getTotalVertexCount() { - return bufferedMesh.getMesh().getVertexCount() * instancer.getInstanceCount(); - } } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectMeshPool.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectMeshPool.java index 4868a8427..d18671817 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectMeshPool.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/indirect/IndirectMeshPool.java @@ -34,7 +34,7 @@ public class IndirectMeshPool { public IndirectMeshPool(VertexType type, int vertexCapacity) { vertexType = type; vbo = glCreateBuffers(); - var byteCapacity = type.byteOffset(vertexCapacity); + var byteCapacity = type.getLayout().getStride() * vertexCapacity; glNamedBufferStorage(vbo, byteCapacity, GL_DYNAMIC_STORAGE_BIT); clientStorage = MemoryBlock.malloc(byteCapacity); } diff --git a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMeshPool.java b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMeshPool.java index 3fd0ad738..329fbc04b 100644 --- a/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMeshPool.java +++ b/src/main/java/com/jozufozu/flywheel/backend/instancing/instancing/InstancedMeshPool.java @@ -37,7 +37,7 @@ public class InstancedMeshPool { */ public InstancedMeshPool(VertexType vertexType) { this.vertexType = vertexType; - int stride = vertexType.getStride(); + int stride = vertexType.getLayout().getStride(); this.vbo = new GlBuffer(GlBufferType.ARRAY_BUFFER); this.vbo.setGrowthMargin(stride * 32); @@ -183,6 +183,26 @@ public class InstancedMeshPool { this.ebo = mesh.createEBO(); } + public int size() { + return mesh.size(); + } + + public VertexType getVertexType() { + return vertexType; + } + + public int getAttributeCount() { + return vertexType.getLayout().getAttributeCount(); + } + + public boolean isDeleted() { + return deleted; + } + + private boolean isEmpty() { + return mesh.isEmpty() || isDeleted(); + } + private void buffer(long ptr) { mesh.write(ptr + byteIndex); @@ -203,10 +223,6 @@ public class InstancedMeshPool { draw(instanceCount); } - private boolean isEmpty() { - return mesh.isEmpty() || isDeleted(); - } - private void setup(GlVertexArray vao) { if (boundTo.add(vao)) { vao.enableArrays(getAttributeCount()); @@ -229,25 +245,5 @@ public class InstancedMeshPool { InstancedMeshPool.this.dirty = true; InstancedMeshPool.this.anyToRemove = true; } - - public Mesh getMesh() { - return mesh; - } - - public int size() { - return mesh.size(); - } - - public VertexType getVertexType() { - return vertexType; - } - - public int getAttributeCount() { - return vertexType.getLayout().getAttributeCount(); - } - - public boolean isDeleted() { - return deleted; - } } } diff --git a/src/main/java/com/jozufozu/flywheel/core/Materials.java b/src/main/java/com/jozufozu/flywheel/core/Materials.java index 207eb8112..01cc3ad28 100644 --- a/src/main/java/com/jozufozu/flywheel/core/Materials.java +++ b/src/main/java/com/jozufozu/flywheel/core/Materials.java @@ -14,7 +14,6 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.texture.AbstractTexture; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; import net.minecraft.world.inventory.InventoryMenu; public final class Materials { @@ -26,9 +25,9 @@ public final class Materials { DiffuseLightCalculator diffuseCalc = DiffuseLightCalculator.forLevel(level); for (int i = 0; i < vertexList.vertexCount(); i++) { float diffuse = diffuseCalc.getDiffuse(vertexList.normalX(i), vertexList.normalY(i), vertexList.normalZ(i), true); - vertexList.r(i, (byte) Mth.clamp((int) (Byte.toUnsignedInt(vertexList.r(i)) * diffuse), 0, 255)); - vertexList.g(i, (byte) Mth.clamp((int) (Byte.toUnsignedInt(vertexList.g(i)) * diffuse), 0, 255)); - vertexList.b(i, (byte) Mth.clamp((int) (Byte.toUnsignedInt(vertexList.b(i)) * diffuse), 0, 255)); + vertexList.r(i, vertexList.r(i) * diffuse); + vertexList.g(i, vertexList.g(i) * diffuse); + vertexList.b(i, vertexList.b(i) * diffuse); } }; diff --git a/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java b/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java index 176610cbb..8e29f75ee 100644 --- a/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java +++ b/src/main/java/com/jozufozu/flywheel/core/hardcoded/ModelPart.java @@ -16,8 +16,8 @@ public class ModelPart implements Mesh { private final int vertexCount; private final MemoryBlock contents; private final ReusableVertexList vertexList; - private final String name; private final Vector4f boundingSphere; + private final String name; public ModelPart(List cuboids, String name) { this.name = name; @@ -63,7 +63,12 @@ public class ModelPart implements Mesh { } @Override - public void close() { + public Vector4fc getBoundingSphere() { + return boundingSphere; + } + + @Override + public void delete() { contents.free(); } @@ -72,11 +77,6 @@ public class ModelPart implements Mesh { return name; } - @Override - public Vector4fc getBoundingSphere() { - return boundingSphere; - } - private static int countVertices(List cuboids) { int vertices = 0; for (PartBuilder.CuboidBuilder cuboid : cuboids) { diff --git a/src/main/java/com/jozufozu/flywheel/core/model/Mesh.java b/src/main/java/com/jozufozu/flywheel/core/model/Mesh.java index 9a120f6b6..12ee9e9cf 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/Mesh.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/Mesh.java @@ -13,8 +13,6 @@ public interface Mesh { VertexType getVertexType(); - Vector4fc getBoundingSphere(); - /** * @return The number of vertices this mesh has. */ @@ -32,7 +30,7 @@ public interface Mesh { * The size in bytes that this mesh's data takes up. */ default int size() { - return getVertexType().byteOffset(getVertexCount()); + return getVertexType().getLayout().getStride() * getVertexCount(); } /** @@ -64,7 +62,9 @@ public interface Mesh { .quads2Tris(getVertexCount() / 4); } - void close(); + Vector4fc getBoundingSphere(); + + void delete(); /** * A name uniquely identifying this mesh. diff --git a/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java b/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java index 9466abff0..546846c60 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/ModelUtil.java @@ -3,11 +3,11 @@ package com.jozufozu.flywheel.core.model; import java.lang.reflect.Field; import java.nio.ByteBuffer; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.system.MemoryUtil; import com.dreizak.miniball.highdim.Miniball; +import com.dreizak.miniball.model.PointSet; import com.jozufozu.flywheel.Flywheel; import com.jozufozu.flywheel.api.material.Material; import com.jozufozu.flywheel.api.vertex.ReusableVertexList; @@ -58,7 +58,7 @@ public class ModelUtil { VertexType dstVertexType = Formats.BLOCK; ByteBuffer src = pair.getSecond(); - MemoryBlock dst = MemoryBlock.malloc(src.capacity()); + MemoryBlock dst = MemoryBlock.malloc(vertexCount * dstVertexType.getLayout().getStride()); long srcPtr = MemoryUtil.memAddress(src); long dstPtr = dst.ptr(); @@ -94,11 +94,34 @@ public class ModelUtil { return null; } - @NotNull - public static Vector4f computeBoundingSphere(VertexList reader) { - var miniball = new Miniball(reader); - double[] center = miniball.center(); - double radius = miniball.radius(); - return new Vector4f((float) center[0], (float) center[1], (float) center[2], (float) radius); - } + public static Vector4f computeBoundingSphere(VertexList vertexList) { + return computeBoundingSphere(new PointSet() { + @Override + public int size() { + return vertexList.vertexCount(); + } + + @Override + public int dimension() { + return 3; + } + + @Override + public double coord(int i, int j) { + return switch (j) { + case 0 -> vertexList.x(i); + case 1 -> vertexList.y(i); + case 2 -> vertexList.z(i); + default -> throw new IllegalArgumentException("Invalid dimension: " + j); + }; + } + }); + } + + public static Vector4f computeBoundingSphere(PointSet points) { + var miniball = new Miniball(points); + double[] center = miniball.center(); + double radius = miniball.radius(); + return new Vector4f((float) center[0], (float) center[1], (float) center[2], (float) radius); + } } diff --git a/src/main/java/com/jozufozu/flywheel/core/model/SimpleLazyModel.java b/src/main/java/com/jozufozu/flywheel/core/model/SimpleLazyModel.java index 3af609e4f..a35519876 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/SimpleLazyModel.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/SimpleLazyModel.java @@ -30,7 +30,7 @@ public class SimpleLazyModel implements Model { @Override public void delete() { - supplier.ifPresent(Mesh::close); + supplier.ifPresent(Mesh::delete); } public int getVertexCount() { @@ -40,7 +40,7 @@ public class SimpleLazyModel implements Model { @Override public String toString() { - return "BasicModelSupplier{" + supplier.map(Mesh::name) + return "SimpleLazyModel{" + supplier.map(Mesh::name) .orElse("Uninitialized") + '}'; } } diff --git a/src/main/java/com/jozufozu/flywheel/core/model/SimpleMesh.java b/src/main/java/com/jozufozu/flywheel/core/model/SimpleMesh.java index 8dcb3f9bd..5d2a6236c 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/SimpleMesh.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/SimpleMesh.java @@ -12,8 +12,8 @@ public class SimpleMesh implements Mesh { private final int vertexCount; private final MemoryBlock contents; private final ReusableVertexList vertexList; - private final String name; private final Vector4f boundingSphere; + private final String name; public SimpleMesh(VertexType vertexType, MemoryBlock contents, String name) { this.vertexType = vertexType; @@ -21,7 +21,7 @@ public class SimpleMesh implements Mesh { this.name = name; int bytes = (int) contents.size(); - int stride = vertexType.getStride(); + int stride = vertexType.getLayout().getStride(); if (bytes % stride != 0) { throw new IllegalArgumentException("MemoryBlock contains non-whole amount of vertices!"); } @@ -55,7 +55,12 @@ public class SimpleMesh implements Mesh { } @Override - public void close() { + public Vector4fc getBoundingSphere() { + return boundingSphere; + } + + @Override + public void delete() { contents.free(); } @@ -64,11 +69,6 @@ public class SimpleMesh implements Mesh { return name; } - @Override - public Vector4fc getBoundingSphere() { - return boundingSphere; - } - @Override public String toString() { return "SimpleMesh{" + "name='" + name + "',vertexType='" + vertexType + "}"; diff --git a/src/main/java/com/jozufozu/flywheel/core/model/TessellatedModel.java b/src/main/java/com/jozufozu/flywheel/core/model/TessellatedModel.java index d1986dc6e..d0d4a221b 100644 --- a/src/main/java/com/jozufozu/flywheel/core/model/TessellatedModel.java +++ b/src/main/java/com/jozufozu/flywheel/core/model/TessellatedModel.java @@ -22,7 +22,7 @@ public class TessellatedModel implements Model { @Override public void delete() { meshes.values() - .forEach(Mesh::close); + .forEach(Mesh::delete); } public boolean isShadeSeparated() { diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java index 166231bf9..50b2dd6ee 100644 --- a/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/oriented/OrientedType.java @@ -6,6 +6,7 @@ import com.jozufozu.flywheel.core.Components; import com.jozufozu.flywheel.core.layout.BufferLayout; import com.jozufozu.flywheel.core.layout.CommonItems; import com.jozufozu.flywheel.core.source.FileResolution; +import com.jozufozu.flywheel.util.RenderMath; import com.mojang.math.Matrix3f; import com.mojang.math.Matrix4f; import com.mojang.math.Quaternion; @@ -58,7 +59,12 @@ public class OrientedType implements StructType { Matrix3f normalMatrix = new Matrix3f(q); + float r = RenderMath.uf(struct.r); + float g = RenderMath.uf(struct.g); + float b = RenderMath.uf(struct.b); + float a = RenderMath.uf(struct.a); int light = struct.getPackedLight(); + for (int i = 0; i < vertexList.vertexCount(); i++) { pos.set( vertexList.x(i), @@ -82,10 +88,10 @@ public class OrientedType implements StructType { vertexList.normalY(i, normal.y()); vertexList.normalZ(i, normal.z()); - vertexList.r(i, struct.r); - vertexList.g(i, struct.g); - vertexList.b(i, struct.b); - vertexList.a(i, struct.a); + vertexList.r(i, r); + vertexList.g(i, g); + vertexList.b(i, b); + vertexList.a(i, a); vertexList.light(i, light); } }; diff --git a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedType.java b/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedType.java index 2138e8743..296d89734 100644 --- a/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedType.java +++ b/src/main/java/com/jozufozu/flywheel/core/structs/transformed/TransformedType.java @@ -6,6 +6,7 @@ import com.jozufozu.flywheel.core.Components; import com.jozufozu.flywheel.core.layout.BufferLayout; import com.jozufozu.flywheel.core.layout.CommonItems; import com.jozufozu.flywheel.core.source.FileResolution; +import com.jozufozu.flywheel.util.RenderMath; import com.mojang.math.Vector3f; import com.mojang.math.Vector4f; @@ -44,13 +45,18 @@ public class TransformedType implements StructType { Vector4f pos = new Vector4f(); Vector3f normal = new Vector3f(); + float r = RenderMath.uf(struct.r); + float g = RenderMath.uf(struct.g); + float b = RenderMath.uf(struct.b); + float a = RenderMath.uf(struct.a); int light = struct.getPackedLight(); + for (int i = 0; i < vertexList.vertexCount(); i++) { pos.set( vertexList.x(i), vertexList.y(i), vertexList.z(i), - 1F + 1f ); pos.transform(struct.model); vertexList.x(i, pos.x()); @@ -68,10 +74,10 @@ public class TransformedType implements StructType { vertexList.normalY(i, normal.y()); vertexList.normalZ(i, normal.z()); - vertexList.r(i, struct.r); - vertexList.g(i, struct.g); - vertexList.b(i, struct.b); - vertexList.a(i, struct.a); + vertexList.r(i, r); + vertexList.g(i, g); + vertexList.b(i, b); + vertexList.a(i, a); vertexList.light(i, light); } }; diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java index 2b8129ae5..7df213657 100644 --- a/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java +++ b/src/main/java/com/jozufozu/flywheel/core/vertex/BlockVertexList.java @@ -2,60 +2,57 @@ package com.jozufozu.flywheel.core.vertex; import org.lwjgl.system.MemoryUtil; +import com.jozufozu.flywheel.api.vertex.MutableVertexList; import com.jozufozu.flywheel.util.RenderMath; import net.minecraft.client.renderer.texture.OverlayTexture; public class BlockVertexList extends AbstractVertexList { - protected static final int STRIDE = 32; - - protected long idxPtr(int index) { - return ptr + index * STRIDE; - } + private static final int STRIDE = 32; @Override public float x(int index) { - return MemoryUtil.memGetFloat(idxPtr(index)); + return MemoryUtil.memGetFloat(ptr + index * STRIDE); } @Override public float y(int index) { - return MemoryUtil.memGetFloat(idxPtr(index) + 4); + return MemoryUtil.memGetFloat(ptr + index * STRIDE + 4); } @Override public float z(int index) { - return MemoryUtil.memGetFloat(idxPtr(index) + 8); + return MemoryUtil.memGetFloat(ptr + index * STRIDE + 8); } @Override - public byte r(int index) { - return MemoryUtil.memGetByte(idxPtr(index) + 12); + public float r(int index) { + return RenderMath.uf(MemoryUtil.memGetByte(ptr + index * STRIDE + 12)); } @Override - public byte g(int index) { - return MemoryUtil.memGetByte(idxPtr(index) + 13); + public float g(int index) { + return RenderMath.uf(MemoryUtil.memGetByte(ptr + index * STRIDE + 13)); } @Override - public byte b(int index) { - return MemoryUtil.memGetByte(idxPtr(index) + 14); + public float b(int index) { + return RenderMath.uf(MemoryUtil.memGetByte(ptr + index * STRIDE + 14)); } @Override - public byte a(int index) { - return MemoryUtil.memGetByte(idxPtr(index) + 15); + public float a(int index) { + return RenderMath.uf(MemoryUtil.memGetByte(ptr + index * STRIDE + 15)); } @Override public float u(int index) { - return MemoryUtil.memGetFloat(idxPtr(index) + 16); + return MemoryUtil.memGetFloat(ptr + index * STRIDE + 16); } @Override public float v(int index) { - return MemoryUtil.memGetFloat(idxPtr(index) + 20); + return MemoryUtil.memGetFloat(ptr + index * STRIDE + 20); } @Override @@ -65,67 +62,67 @@ public class BlockVertexList extends AbstractVertexList { @Override public int light(int index) { - return MemoryUtil.memGetInt(idxPtr(index) + 24) << 4; + return MemoryUtil.memGetInt(ptr + index * STRIDE + 24) << 4; } @Override public float normalX(int index) { - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + 28)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * STRIDE + 28)); } @Override public float normalY(int index) { - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + 29)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * STRIDE + 29)); } @Override public float normalZ(int index) { - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + 30)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * STRIDE + 30)); } @Override public void x(int index, float x) { - MemoryUtil.memPutFloat(idxPtr(index), x); + MemoryUtil.memPutFloat(ptr + index * STRIDE, x); } @Override public void y(int index, float y) { - MemoryUtil.memPutFloat(idxPtr(index) + 4, y); + MemoryUtil.memPutFloat(ptr + index * STRIDE + 4, y); } @Override public void z(int index, float z) { - MemoryUtil.memPutFloat(idxPtr(index) + 8, z); + MemoryUtil.memPutFloat(ptr + index * STRIDE + 8, z); } @Override - public void r(int index, byte r) { - MemoryUtil.memPutByte(idxPtr(index) + 12, r); + public void r(int index, float r) { + MemoryUtil.memPutByte(ptr + index * STRIDE + 12, RenderMath.unb(r)); } @Override - public void g(int index, byte g) { - MemoryUtil.memPutByte(idxPtr(index) + 13, g); + public void g(int index, float g) { + MemoryUtil.memPutByte(ptr + index * STRIDE + 13, RenderMath.unb(g)); } @Override - public void b(int index, byte b) { - MemoryUtil.memPutByte(idxPtr(index) + 14, b); + public void b(int index, float b) { + MemoryUtil.memPutByte(ptr + index * STRIDE + 14, RenderMath.unb(b)); } @Override - public void a(int index, byte a) { - MemoryUtil.memPutByte(idxPtr(index) + 15, a); + public void a(int index, float a) { + MemoryUtil.memPutByte(ptr + index * STRIDE + 15, RenderMath.unb(a)); } @Override public void u(int index, float u) { - MemoryUtil.memPutFloat(idxPtr(index) + 16, u); + MemoryUtil.memPutFloat(ptr + index * STRIDE + 16, u); } @Override public void v(int index, float v) { - MemoryUtil.memPutFloat(idxPtr(index) + 20, v); + MemoryUtil.memPutFloat(ptr + index * STRIDE + 20, v); } @Override @@ -134,26 +131,51 @@ public class BlockVertexList extends AbstractVertexList { @Override public void light(int index, int light) { - MemoryUtil.memPutInt(idxPtr(index) + 24, light >> 4); + MemoryUtil.memPutInt(ptr + index * STRIDE + 24, light >> 4); } @Override public void normalX(int index, float normalX) { - MemoryUtil.memPutByte(idxPtr(index) + 28, RenderMath.nb(normalX)); + MemoryUtil.memPutByte(ptr + index * STRIDE + 28, RenderMath.nb(normalX)); } @Override public void normalY(int index, float normalY) { - MemoryUtil.memPutByte(idxPtr(index) + 29, RenderMath.nb(normalY)); + MemoryUtil.memPutByte(ptr + index * STRIDE + 29, RenderMath.nb(normalY)); } @Override public void normalZ(int index, float normalZ) { - MemoryUtil.memPutByte(idxPtr(index) + 30, RenderMath.nb(normalZ)); + MemoryUtil.memPutByte(ptr + index * STRIDE + 30, RenderMath.nb(normalZ)); } @Override - public int vertexStride() { - return STRIDE; + public void write(MutableVertexList dst, int srcIndex, int dstIndex) { + if (getClass() == dst.getClass()) { + long dstPtr = ((BlockVertexList) dst).ptr; + MemoryUtil.memCopy(ptr + srcIndex * STRIDE, dstPtr + dstIndex * STRIDE, STRIDE); + } else { + super.write(dst, srcIndex, dstIndex); + } + } + + @Override + public void write(MutableVertexList dst, int srcStartIndex, int dstStartIndex, int vertexCount) { + if (getClass() == dst.getClass()) { + long dstPtr = ((BlockVertexList) dst).ptr; + MemoryUtil.memCopy(ptr + srcStartIndex * STRIDE, dstPtr + dstStartIndex * STRIDE, vertexCount * STRIDE); + } else { + super.write(dst, srcStartIndex, dstStartIndex, vertexCount); + } + } + + @Override + public void writeAll(MutableVertexList dst) { + if (getClass() == dst.getClass()) { + long dstPtr = ((BlockVertexList) dst).ptr; + MemoryUtil.memCopy(ptr, dstPtr, vertexCount * STRIDE); + } else { + super.writeAll(dst); + } } } diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/InferredVertexFormatInfo.java b/src/main/java/com/jozufozu/flywheel/core/vertex/InferredVertexFormatInfo.java index 81b116384..9b95a94e0 100644 --- a/src/main/java/com/jozufozu/flywheel/core/vertex/InferredVertexFormatInfo.java +++ b/src/main/java/com/jozufozu/flywheel/core/vertex/InferredVertexFormatInfo.java @@ -1,11 +1,11 @@ package com.jozufozu.flywheel.core.vertex; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormatElement; public class InferredVertexFormatInfo { public final VertexFormat format; - public final int stride; public final int positionOffset; public final int colorOffset; @@ -16,7 +16,6 @@ public class InferredVertexFormatInfo { public InferredVertexFormatInfo(VertexFormat format) { this.format = format; - stride = format.getVertexSize(); int positionOffset = -1; int colorOffset = -1; @@ -27,17 +26,18 @@ public class InferredVertexFormatInfo { int offset = 0; for (VertexFormatElement element : format.getElements()) { - switch (element.getUsage()) { - case POSITION -> positionOffset = offset; - case NORMAL -> normalOffset = offset; - case COLOR -> colorOffset = offset; - case UV -> { - switch (element.getIndex()) { - case 0 -> textureOffset = offset; - case 1 -> overlayOffset = offset; - case 2 -> lightOffset = offset; - } - } + if (element == DefaultVertexFormat.ELEMENT_POSITION) { + positionOffset = offset; + } else if (element == DefaultVertexFormat.ELEMENT_COLOR) { + colorOffset = offset; + } else if (element == DefaultVertexFormat.ELEMENT_UV0) { + textureOffset = offset; + } else if (element == DefaultVertexFormat.ELEMENT_UV1) { + overlayOffset = offset; + } else if (element == DefaultVertexFormat.ELEMENT_UV2) { + lightOffset = offset; + } else if (element == DefaultVertexFormat.ELEMENT_NORMAL) { + normalOffset = offset; } offset += element.getByteSize(); diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/InferredVertexListImpl.java b/src/main/java/com/jozufozu/flywheel/core/vertex/InferredVertexListImpl.java index f4d1a0353..fd5bf780e 100644 --- a/src/main/java/com/jozufozu/flywheel/core/vertex/InferredVertexListImpl.java +++ b/src/main/java/com/jozufozu/flywheel/core/vertex/InferredVertexListImpl.java @@ -6,6 +6,7 @@ import com.jozufozu.flywheel.api.vertex.ReusableVertexList; import com.jozufozu.flywheel.util.RenderMath; import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; public class InferredVertexListImpl extends AbstractVertexList implements ReusableVertexList { @@ -21,7 +22,7 @@ public class InferredVertexListImpl extends AbstractVertexList implements Reusab public InferredVertexListImpl(InferredVertexFormatInfo formatInfo) { format = formatInfo.format; - stride = formatInfo.stride; + stride = format.getVertexSize(); positionOffset = formatInfo.positionOffset; colorOffset = formatInfo.colorOffset; textureOffset = formatInfo.textureOffset; @@ -30,180 +31,171 @@ public class InferredVertexListImpl extends AbstractVertexList implements Reusab normalOffset = formatInfo.normalOffset; } - protected long idxPtr(int index) { - return ptr + index * stride; - } - @Override public float x(int index) { if (positionOffset < 0) return 0; - return MemoryUtil.memGetFloat(idxPtr(index) + positionOffset); + return MemoryUtil.memGetFloat(ptr + index * stride + positionOffset); } @Override public float y(int index) { if (positionOffset < 0) return 0; - return MemoryUtil.memGetFloat(idxPtr(index) + positionOffset + 4); + return MemoryUtil.memGetFloat(ptr + index * stride + positionOffset + 4); } @Override public float z(int index) { if (positionOffset < 0) return 0; - return MemoryUtil.memGetFloat(idxPtr(index) + positionOffset + 8); + return MemoryUtil.memGetFloat(ptr + index * stride + positionOffset + 8); } @Override - public byte r(int index) { - if (colorOffset < 0) return 0; - return MemoryUtil.memGetByte(idxPtr(index) + colorOffset); + public float r(int index) { + if (colorOffset < 0) return 1; + return RenderMath.uf(MemoryUtil.memGetByte(ptr + index * stride + colorOffset)); } @Override - public byte g(int index) { - if (colorOffset < 0) return 0; - return MemoryUtil.memGetByte(idxPtr(index) + colorOffset + 1); + public float g(int index) { + if (colorOffset < 0) return 1; + return RenderMath.uf(MemoryUtil.memGetByte(ptr + index * stride + colorOffset + 1)); } @Override - public byte b(int index) { - if (colorOffset < 0) return 0; - return MemoryUtil.memGetByte(idxPtr(index) + colorOffset + 2); + public float b(int index) { + if (colorOffset < 0) return 1; + return RenderMath.uf(MemoryUtil.memGetByte(ptr + index * stride + colorOffset + 2)); } @Override - public byte a(int index) { - if (colorOffset < 0) return 0; - return MemoryUtil.memGetByte(idxPtr(index) + colorOffset + 3); + public float a(int index) { + if (colorOffset < 0) return 1; + return RenderMath.uf(MemoryUtil.memGetByte(ptr + index * stride + colorOffset + 3)); } @Override public float u(int index) { if (textureOffset < 0) return 0; - return MemoryUtil.memGetFloat(idxPtr(index) + textureOffset); + return MemoryUtil.memGetFloat(ptr + index * stride + textureOffset); } @Override public float v(int index) { if (textureOffset < 0) return 0; - return MemoryUtil.memGetFloat(idxPtr(index) + textureOffset + 4); + return MemoryUtil.memGetFloat(ptr + index * stride + textureOffset + 4); } @Override public int overlay(int index) { if (overlayOffset < 0) return OverlayTexture.NO_OVERLAY; - return MemoryUtil.memGetInt(idxPtr(index) + overlayOffset); + return MemoryUtil.memGetInt(ptr + index * stride + overlayOffset); } @Override public int light(int index) { - if (lightOffset < 0) return 0; - return MemoryUtil.memGetInt(idxPtr(index) + lightOffset); + if (lightOffset < 0) return LightTexture.FULL_BRIGHT; + return MemoryUtil.memGetInt(ptr + index * stride + lightOffset); } @Override public float normalX(int index) { if (normalOffset < 0) return 0; - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + normalOffset)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * stride + normalOffset)); } @Override public float normalY(int index) { if (normalOffset < 0) return 0; - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + normalOffset + 1)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * stride + normalOffset + 1)); } @Override public float normalZ(int index) { if (normalOffset < 0) return 0; - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + normalOffset + 2)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * stride + normalOffset + 2)); } @Override public void x(int index, float x) { if (positionOffset < 0) return; - MemoryUtil.memPutFloat(idxPtr(index) + positionOffset, x); + MemoryUtil.memPutFloat(ptr + index * stride + positionOffset, x); } @Override public void y(int index, float y) { if (positionOffset < 0) return; - MemoryUtil.memPutFloat(idxPtr(index) + positionOffset + 4, y); + MemoryUtil.memPutFloat(ptr + index * stride + positionOffset + 4, y); } @Override public void z(int index, float z) { if (positionOffset < 0) return; - MemoryUtil.memPutFloat(idxPtr(index) + positionOffset + 8, z); + MemoryUtil.memPutFloat(ptr + index * stride + positionOffset + 8, z); } @Override - public void r(int index, byte r) { + public void r(int index, float r) { if (colorOffset < 0) return; - MemoryUtil.memPutByte(idxPtr(index) + colorOffset, r); + MemoryUtil.memPutByte(ptr + index * stride + colorOffset, RenderMath.unb(r)); } @Override - public void g(int index, byte g) { + public void g(int index, float g) { if (colorOffset < 0) return; - MemoryUtil.memPutByte(idxPtr(index) + colorOffset + 1, g); + MemoryUtil.memPutByte(ptr + index * stride + colorOffset + 1, RenderMath.unb(g)); } @Override - public void b(int index, byte b) { + public void b(int index, float b) { if (colorOffset < 0) return; - MemoryUtil.memPutByte(idxPtr(index) + colorOffset + 2, b); + MemoryUtil.memPutByte(ptr + index * stride + colorOffset + 2, RenderMath.unb(b)); } @Override - public void a(int index, byte a) { + public void a(int index, float a) { if (colorOffset < 0) return; - MemoryUtil.memPutByte(idxPtr(index) + colorOffset + 3, a); + MemoryUtil.memPutByte(ptr + index * stride + colorOffset + 3, RenderMath.unb(a)); } @Override public void u(int index, float u) { if (textureOffset < 0) return; - MemoryUtil.memPutFloat(idxPtr(index) + textureOffset, u); + MemoryUtil.memPutFloat(ptr + index * stride + textureOffset, u); } @Override public void v(int index, float v) { if (textureOffset < 0) return; - MemoryUtil.memPutFloat(idxPtr(index) + textureOffset + 4, v); + MemoryUtil.memPutFloat(ptr + index * stride + textureOffset + 4, v); } @Override public void overlay(int index, int overlay) { if (overlayOffset < 0) return; - MemoryUtil.memPutInt(idxPtr(index) + overlayOffset, overlay); + MemoryUtil.memPutInt(ptr + index * stride + overlayOffset, overlay); } @Override public void light(int index, int light) { if (lightOffset < 0) return; - MemoryUtil.memPutInt(idxPtr(index) + lightOffset, light); + MemoryUtil.memPutInt(ptr + index * stride + lightOffset, light); } @Override public void normalX(int index, float normalX) { if (normalOffset < 0) return; - MemoryUtil.memPutByte(idxPtr(index) + normalOffset, RenderMath.nb(normalX)); + MemoryUtil.memPutByte(ptr + index * stride + normalOffset, RenderMath.nb(normalX)); } @Override public void normalY(int index, float normalY) { if (normalOffset < 0) return; - MemoryUtil.memPutByte(idxPtr(index) + normalOffset + 1, RenderMath.nb(normalY)); + MemoryUtil.memPutByte(ptr + index * stride + normalOffset + 1, RenderMath.nb(normalY)); } @Override public void normalZ(int index, float normalZ) { if (normalOffset < 0) return; - MemoryUtil.memPutByte(idxPtr(index) + normalOffset + 2, RenderMath.nb(normalZ)); - } - - @Override - public int vertexStride() { - return stride; + MemoryUtil.memPutByte(ptr + index * stride + normalOffset + 2, RenderMath.nb(normalZ)); } } diff --git a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexList.java b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexList.java index 52506ac66..051fac1b6 100644 --- a/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexList.java +++ b/src/main/java/com/jozufozu/flywheel/core/vertex/PosTexNormalVertexList.java @@ -2,60 +2,58 @@ package com.jozufozu.flywheel.core.vertex; import org.lwjgl.system.MemoryUtil; +import com.jozufozu.flywheel.api.vertex.MutableVertexList; import com.jozufozu.flywheel.util.RenderMath; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; public class PosTexNormalVertexList extends AbstractVertexList { - protected static final int STRIDE = 23; - - protected long idxPtr(long idx) { - return ptr + idx * STRIDE; - } + private static final int STRIDE = 23; @Override public float x(int index) { - return MemoryUtil.memGetFloat(idxPtr(index)); + return MemoryUtil.memGetFloat(ptr + index * STRIDE); } @Override public float y(int index) { - return MemoryUtil.memGetFloat(idxPtr(index) + 4); + return MemoryUtil.memGetFloat(ptr + index * STRIDE + 4); } @Override public float z(int index) { - return MemoryUtil.memGetFloat(idxPtr(index) + 8); + return MemoryUtil.memGetFloat(ptr + index * STRIDE + 8); } @Override - public byte r(int index) { - return (byte) 0xFF; + public float r(int index) { + return 1; } @Override - public byte g(int index) { - return (byte) 0xFF; + public float g(int index) { + return 1; } @Override - public byte b(int index) { - return (byte) 0xFF; + public float b(int index) { + return 1; } @Override - public byte a(int index) { - return (byte) 0xFF; + public float a(int index) { + return 1; } @Override public float u(int index) { - return MemoryUtil.memGetFloat(idxPtr(index) + 12); + return MemoryUtil.memGetFloat(ptr + index * STRIDE + 12); } @Override public float v(int index) { - return MemoryUtil.memGetFloat(idxPtr(index) + 16); + return MemoryUtil.memGetFloat(ptr + index * STRIDE + 16); } @Override @@ -65,63 +63,63 @@ public class PosTexNormalVertexList extends AbstractVertexList { @Override public int light(int index) { - return 0; + return LightTexture.FULL_BRIGHT; } @Override public float normalX(int index) { - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + 20)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * STRIDE + 20)); } @Override public float normalY(int index) { - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + 21)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * STRIDE + 21)); } @Override public float normalZ(int index) { - return RenderMath.f(MemoryUtil.memGetByte(idxPtr(index) + 22)); + return RenderMath.f(MemoryUtil.memGetByte(ptr + index * STRIDE + 22)); } @Override public void x(int index, float x) { - MemoryUtil.memPutFloat(idxPtr(index), x); + MemoryUtil.memPutFloat(ptr + index * STRIDE, x); } @Override public void y(int index, float y) { - MemoryUtil.memPutFloat(idxPtr(index) + 4, y); + MemoryUtil.memPutFloat(ptr + index * STRIDE + 4, y); } @Override public void z(int index, float z) { - MemoryUtil.memPutFloat(idxPtr(index) + 8, z); + MemoryUtil.memPutFloat(ptr + index * STRIDE + 8, z); } @Override - public void r(int index, byte r) { + public void r(int index, float r) { } @Override - public void g(int index, byte g) { + public void g(int index, float g) { } @Override - public void b(int index, byte b) { + public void b(int index, float b) { } @Override - public void a(int index, byte a) { + public void a(int index, float a) { } @Override public void u(int index, float u) { - MemoryUtil.memPutFloat(idxPtr(index) + 12, u); + MemoryUtil.memPutFloat(ptr + index * STRIDE + 12, u); } @Override public void v(int index, float v) { - MemoryUtil.memPutFloat(idxPtr(index) + 16, v); + MemoryUtil.memPutFloat(ptr + index * STRIDE + 16, v); } @Override @@ -134,21 +132,46 @@ public class PosTexNormalVertexList extends AbstractVertexList { @Override public void normalX(int index, float normalX) { - MemoryUtil.memPutByte(idxPtr(index) + 20, RenderMath.nb(normalX)); + MemoryUtil.memPutByte(ptr + index * STRIDE + 20, RenderMath.nb(normalX)); } @Override public void normalY(int index, float normalY) { - MemoryUtil.memPutByte(idxPtr(index) + 21, RenderMath.nb(normalY)); + MemoryUtil.memPutByte(ptr + index * STRIDE + 21, RenderMath.nb(normalY)); } @Override public void normalZ(int index, float normalZ) { - MemoryUtil.memPutByte(idxPtr(index) + 22, RenderMath.nb(normalZ)); + MemoryUtil.memPutByte(ptr + index * STRIDE + 22, RenderMath.nb(normalZ)); } @Override - public int vertexStride() { - return STRIDE; + public void write(MutableVertexList dst, int srcIndex, int dstIndex) { + if (getClass() == dst.getClass()) { + long dstPtr = ((PosTexNormalVertexList) dst).ptr; + MemoryUtil.memCopy(ptr + srcIndex * STRIDE, dstPtr + dstIndex * STRIDE, STRIDE); + } else { + super.write(dst, srcIndex, dstIndex); + } + } + + @Override + public void write(MutableVertexList dst, int srcStartIndex, int dstStartIndex, int vertexCount) { + if (getClass() == dst.getClass()) { + long dstPtr = ((PosTexNormalVertexList) dst).ptr; + MemoryUtil.memCopy(ptr + srcStartIndex * STRIDE, dstPtr + dstStartIndex * STRIDE, vertexCount * STRIDE); + } else { + super.write(dst, srcStartIndex, dstStartIndex, vertexCount); + } + } + + @Override + public void writeAll(MutableVertexList dst) { + if (getClass() == dst.getClass()) { + long dstPtr = ((PosTexNormalVertexList) dst).ptr; + MemoryUtil.memCopy(ptr, dstPtr, vertexCount * STRIDE); + } else { + super.writeAll(dst); + } } } diff --git a/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererMixin.java b/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererMixin.java index 6357f7639..b0a3b25e6 100644 --- a/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererMixin.java +++ b/src/main/java/com/jozufozu/flywheel/mixin/LevelRendererMixin.java @@ -25,7 +25,6 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.MinecraftForge; @Mixin(value = LevelRenderer.class, priority = 1001) // Higher priority to go after Sodium diff --git a/src/main/java/com/jozufozu/flywheel/util/RenderMath.java b/src/main/java/com/jozufozu/flywheel/util/RenderMath.java index 861262f71..213cc2819 100644 --- a/src/main/java/com/jozufozu/flywheel/util/RenderMath.java +++ b/src/main/java/com/jozufozu/flywheel/util/RenderMath.java @@ -5,31 +5,31 @@ import net.minecraftforge.client.model.pipeline.LightUtil; public class RenderMath { /** - * Convert a signed, normalized floating point value into a normalized byte. - */ - public static byte nb(float f) { - return (byte) (f * 127); - } - - /** - * Convert a signed byte into a normalized float. + * Convert a signed byte into a signed, normalized float. */ public static float f(byte b) { return b / 127f; } /** - * Convert an unsigned byte into a normalized float. + * Convert a signed, normalized float into a signed byte. + */ + public static byte nb(float f) { + return (byte) (f * 127); + } + + /** + * Convert an unsigned byte into an unsigned, normalized float. */ public static float uf(byte b) { return (float) (Byte.toUnsignedInt(b)) / 255f; } /** - * Convert an unsigned, normalized float into an unsigned normalized byte. + * Convert an unsigned, normalized float into an unsigned byte. */ public static byte unb(float f) { - return (byte) Math.floor(f * 255); + return (byte) (int) (f * 255); } public static int nextPowerOf2(int a) {