From e58a77eab05d83dea6d63801d9f3fd7a34ce9ad7 Mon Sep 17 00:00:00 2001 From: JellySquid Date: Thu, 15 Aug 2024 19:54:23 -0500 Subject: [PATCH] Clean up handling of vertex formats Minecraft 1.21 makes it unnecessary for us to keep track of our own VertexFormatDescription. Additionally, it's no longer possible for mods to create vertex formats with the same element type specified multiple times, so we can avoid checking for it. --- .../api/vertex/buffer/VertexBufferWriter.java | 8 +- .../format/VertexFormatDescription.java | 36 ------- .../vertex/format/VertexFormatExtensions.java | 9 ++ .../vertex/format/VertexFormatRegistry.java | 2 +- .../api/vertex/format/common/ColorVertex.java | 6 +- .../{ModelVertex.java => EntityVertex.java} | 8 +- .../api/vertex/format/common/GlyphVertex.java | 6 +- .../api/vertex/format/common/LineVertex.java | 6 +- .../vertex/format/common/ParticleVertex.java | 6 +- .../serializer/VertexSerializerRegistry.java | 4 +- .../render/frapi/render/QuadEncoder.java | 10 +- .../immediate/model/BakedModelEncoder.java | 18 ++-- .../immediate/model/EntityRenderer.java | 16 ++-- .../vertex/VertexFormatDescriptionImpl.java | 93 ------------------- .../vertex/VertexFormatRegistryImpl.java | 56 ++++++----- .../vertex/buffer/BufferBuilderExtension.java | 3 - .../VertexSerializerRegistryImpl.java | 19 ++-- .../generated/VertexSerializerFactory.java | 31 ++++--- .../mixin/core/render/VertexFormatMixin.java | 30 ++++++ .../consumer/BufferBuilderMixin.java | 47 ++++------ .../consumer/EntityOutlineGeneratorMixin.java | 13 ++- .../SheetedDecalTextureGeneratorMixin.java | 18 ++-- .../SpriteCoordinateExpanderMixin.java | 12 +-- .../consumer/VertexMultiConsumerMixin.java | 6 +- .../shadows/EntityRenderDispatcherMixin.java | 16 ++-- common/src/main/resources/sodium.mixins.json | 1 + 26 files changed, 185 insertions(+), 295 deletions(-) delete mode 100644 common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatDescription.java create mode 100644 common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatExtensions.java rename common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/{ModelVertex.java => EntityVertex.java} (76%) delete mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/VertexFormatDescriptionImpl.java create mode 100644 common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/VertexFormatMixin.java diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter.java index 19ac176227..3b467b27cf 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/buffer/VertexBufferWriter.java @@ -1,8 +1,8 @@ package net.caffeinemc.mods.sodium.api.vertex.buffer; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; import org.jetbrains.annotations.Nullable; import org.lwjgl.system.MemoryStack; @@ -61,7 +61,7 @@ private static RuntimeException createUnsupportedVertexConsumerThrowable(VertexC * @param count The number of vertices to copy * @param format The format of the vertices */ - void push(MemoryStack stack, long ptr, int count, VertexFormatDescription format); + void push(MemoryStack stack, long ptr, int count, VertexFormat format); /** * If this {@link VertexBufferWriter} passes through data to nested {@link VertexConsumer} implementations, @@ -86,9 +86,9 @@ default boolean canUseIntrinsics() { */ static void copyInto(VertexBufferWriter writer, MemoryStack stack, long ptr, int count, - VertexFormatDescription format) + VertexFormat format) { - var length = count * format.stride(); + var length = count * format.getVertexSize(); var copy = stack.nmalloc(length); MemoryIntrinsics.copyMemory(ptr, copy, length); diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatDescription.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatDescription.java deleted file mode 100644 index 66d7a3d338..0000000000 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatDescription.java +++ /dev/null @@ -1,36 +0,0 @@ -package net.caffeinemc.mods.sodium.api.vertex.format; - -import net.caffeinemc.mods.sodium.api.vertex.attributes.CommonVertexAttribute; - -import java.util.NoSuchElementException; - -public interface VertexFormatDescription { - /** - * @param element The type of the element to query - * @return True if the vertex format contains the generic element, otherwise false - */ - boolean containsElement(CommonVertexAttribute element); - - /** - * @param element The type of the element to query - * @return The offset (in bytes) at which the generic element begins within the vertex format - * @throws NoSuchElementException If the vertex format does not contain the generic element - */ - int getElementOffset(CommonVertexAttribute element); - - /** - * Returns the unique identifier for this vertex format. - */ - int id(); - - /** - * Returns the number of bytes between consecutive vertices in a buffer. Each vertex in a buffer is expected to - * start at the byte offset (index * stride). - */ - int stride(); - - /** - * Returns whether or not the format is "simple" (has no duplicate elements). - */ - boolean isSimpleFormat(); -} diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatExtensions.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatExtensions.java new file mode 100644 index 0000000000..93a98f2bb8 --- /dev/null +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatExtensions.java @@ -0,0 +1,9 @@ +package net.caffeinemc.mods.sodium.api.vertex.format; + +public interface VertexFormatExtensions { + /** + * Returns an integer identifier that represents this vertex format in the global namespace. These identifiers + * are valid only for the current process lifetime and should not be saved to disk. + */ + int sodium$getGlobalId(); +} diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatRegistry.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatRegistry.java index 0ee2f42201..0030da2796 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatRegistry.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/VertexFormatRegistry.java @@ -11,5 +11,5 @@ static VertexFormatRegistry instance() { return INSTANCE; } - VertexFormatDescription get(VertexFormat format); + int allocateGlobalId(VertexFormat format); } \ No newline at end of file diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ColorVertex.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ColorVertex.java index 2c6d46b0d5..d58cacd6c9 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ColorVertex.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ColorVertex.java @@ -1,16 +1,14 @@ package net.caffeinemc.mods.sodium.api.vertex.format.common; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.math.MatrixHelper; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.ColorAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.PositionAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatRegistry; import org.joml.Matrix4f; public final class ColorVertex { - public static final VertexFormatDescription FORMAT = VertexFormatRegistry.instance() - .get(DefaultVertexFormat.POSITION_COLOR); + public static final VertexFormat FORMAT = DefaultVertexFormat.POSITION_COLOR; public static final int STRIDE = 16; diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ModelVertex.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/EntityVertex.java similarity index 76% rename from common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ModelVertex.java rename to common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/EntityVertex.java index 3b19ed1e79..994dd253bd 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ModelVertex.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/EntityVertex.java @@ -1,13 +1,11 @@ package net.caffeinemc.mods.sodium.api.vertex.format.common; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.*; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatRegistry; -public final class ModelVertex { - public static final VertexFormatDescription FORMAT = VertexFormatRegistry.instance() - .get(DefaultVertexFormat.NEW_ENTITY); +public final class EntityVertex { + public static final VertexFormat FORMAT = DefaultVertexFormat.NEW_ENTITY; public static final int STRIDE = 36; diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/GlyphVertex.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/GlyphVertex.java index 77ebd99fa1..46237bb350 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/GlyphVertex.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/GlyphVertex.java @@ -1,16 +1,14 @@ package net.caffeinemc.mods.sodium.api.vertex.format.common; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.ColorAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.LightAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.PositionAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatRegistry; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.TextureAttribute; public final class GlyphVertex { - public static final VertexFormatDescription FORMAT = VertexFormatRegistry.instance() - .get(DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP); + public static final VertexFormat FORMAT = DefaultVertexFormat.POSITION_COLOR_TEX_LIGHTMAP; public static final int STRIDE = 28; diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/LineVertex.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/LineVertex.java index 7f1ec9f306..9695670635 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/LineVertex.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/LineVertex.java @@ -1,15 +1,13 @@ package net.caffeinemc.mods.sodium.api.vertex.format.common; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.ColorAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.NormalAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.PositionAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatRegistry; public final class LineVertex { - public static final VertexFormatDescription FORMAT = VertexFormatRegistry.instance() - .get(DefaultVertexFormat.POSITION_COLOR_NORMAL); + public static final VertexFormat FORMAT = DefaultVertexFormat.POSITION_COLOR_NORMAL; public static final int STRIDE = 20; diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ParticleVertex.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ParticleVertex.java index fccca93b05..4c1e344c35 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ParticleVertex.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/format/common/ParticleVertex.java @@ -1,16 +1,14 @@ package net.caffeinemc.mods.sodium.api.vertex.format.common; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.ColorAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.LightAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.PositionAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatRegistry; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.TextureAttribute; public final class ParticleVertex { - public static final VertexFormatDescription FORMAT = VertexFormatRegistry.instance() - .get(DefaultVertexFormat.PARTICLE); + public static final VertexFormat FORMAT = DefaultVertexFormat.PARTICLE; public static final int STRIDE = 28; diff --git a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/serializer/VertexSerializerRegistry.java b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/serializer/VertexSerializerRegistry.java index 8aecabc7d9..c9ca246206 100644 --- a/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/serializer/VertexSerializerRegistry.java +++ b/common/src/api/java/net/caffeinemc/mods/sodium/api/vertex/serializer/VertexSerializerRegistry.java @@ -1,7 +1,7 @@ package net.caffeinemc.mods.sodium.api.vertex.serializer; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.internal.DependencyInjection; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; public interface VertexSerializerRegistry { VertexSerializerRegistry INSTANCE = DependencyInjection.load(VertexSerializerRegistry.class, @@ -11,5 +11,5 @@ static VertexSerializerRegistry instance() { return INSTANCE; } - VertexSerializer get(VertexFormatDescription srcFormat, VertexFormatDescription dstFormat); + VertexSerializer get(VertexFormat srcFormat, VertexFormat dstFormat); } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/QuadEncoder.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/QuadEncoder.java index b9fe658704..8925908a4b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/QuadEncoder.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/frapi/render/QuadEncoder.java @@ -7,7 +7,7 @@ import net.caffeinemc.mods.sodium.api.util.ColorARGB; import net.caffeinemc.mods.sodium.api.util.NormI8; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; -import net.caffeinemc.mods.sodium.api.vertex.format.common.ModelVertex; +import net.caffeinemc.mods.sodium.api.vertex.format.common.EntityVertex; import org.joml.Math; import org.joml.Matrix3f; import org.joml.Matrix4f; @@ -27,7 +27,7 @@ public static void writeQuadVertices(MutableQuadViewImpl quad, VertexConsumer ve public static void writeQuadVertices(MutableQuadViewImpl quad, VertexBufferWriter writer, int overlay, Matrix4f matPosition, boolean trustedNormals, Matrix3f matNormal) { try (MemoryStack stack = MemoryStack.stackPush()) { - long buffer = stack.nmalloc(4 * ModelVertex.STRIDE); + long buffer = stack.nmalloc(4 * EntityVertex.STRIDE); long ptr = buffer; final boolean useNormals = quad.hasVertexNormals(); @@ -56,11 +56,11 @@ public static void writeQuadVertices(MutableQuadViewImpl quad, VertexBufferWrite normal = MatrixHelper.transformNormal(matNormal, trustedNormals, quad.packedNormal(i)); } - ModelVertex.write(ptr, xt, yt, zt, ColorARGB.toABGR(quad.color(i)), quad.u(i), quad.v(i), overlay, quad.lightmap(i), normal); - ptr += ModelVertex.STRIDE; + EntityVertex.write(ptr, xt, yt, zt, ColorARGB.toABGR(quad.color(i)), quad.u(i), quad.v(i), overlay, quad.lightmap(i), normal); + ptr += EntityVertex.STRIDE; } - writer.push(stack, buffer, 4, ModelVertex.FORMAT); + writer.push(stack, buffer, 4, EntityVertex.FORMAT); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/BakedModelEncoder.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/BakedModelEncoder.java index 539e8ad3a6..19dba9b3b7 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/BakedModelEncoder.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/BakedModelEncoder.java @@ -6,7 +6,7 @@ import net.caffeinemc.mods.sodium.api.util.ColorABGR; import net.caffeinemc.mods.sodium.api.util.ColorU8; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; -import net.caffeinemc.mods.sodium.api.vertex.format.common.ModelVertex; +import net.caffeinemc.mods.sodium.api.vertex.format.common.EntityVertex; import net.caffeinemc.mods.sodium.client.render.frapi.helper.ColorHelper; import org.joml.Matrix3f; import org.joml.Matrix4f; @@ -26,7 +26,7 @@ public static void writeQuadVertices(VertexBufferWriter writer, PoseStack.Pose m Matrix4f matPosition = matrices.pose(); try (MemoryStack stack = MemoryStack.stackPush()) { - long buffer = stack.nmalloc(4 * ModelVertex.STRIDE); + long buffer = stack.nmalloc(4 * EntityVertex.STRIDE); long ptr = buffer; for (int i = 0; i < 4; i++) { @@ -45,11 +45,11 @@ public static void writeQuadVertices(VertexBufferWriter writer, PoseStack.Pose m float yt = MatrixHelper.transformPositionY(matPosition, x, y, z); float zt = MatrixHelper.transformPositionZ(matPosition, x, y, z); - ModelVertex.write(ptr, xt, yt, zt, ColorHelper.multiplyColor(color, quad.getColor(i)), quad.getTexU(i), quad.getTexV(i), overlay, newLight, normal); - ptr += ModelVertex.STRIDE; + EntityVertex.write(ptr, xt, yt, zt, ColorHelper.multiplyColor(color, quad.getColor(i)), quad.getTexU(i), quad.getTexV(i), overlay, newLight, normal); + ptr += EntityVertex.STRIDE; } - writer.push(stack, buffer, 4, ModelVertex.FORMAT); + writer.push(stack, buffer, 4, EntityVertex.FORMAT); } } @@ -58,7 +58,7 @@ public static void writeQuadVertices(VertexBufferWriter writer, PoseStack.Pose m Matrix4f matPosition = matrices.pose(); try (MemoryStack stack = MemoryStack.stackPush()) { - long buffer = stack.nmalloc(4 * ModelVertex.STRIDE); + long buffer = stack.nmalloc(4 * EntityVertex.STRIDE); long ptr = buffer; for (int i = 0; i < 4; i++) { @@ -98,11 +98,11 @@ public static void writeQuadVertices(VertexBufferWriter writer, PoseStack.Pose m int color = ColorABGR.pack(fR, fG, fB, a); - ModelVertex.write(ptr, xt, yt, zt, color, quad.getTexU(i), quad.getTexV(i), overlay, light[i], normal); - ptr += ModelVertex.STRIDE; + EntityVertex.write(ptr, xt, yt, zt, color, quad.getTexU(i), quad.getTexV(i), overlay, light[i], normal); + ptr += EntityVertex.STRIDE; } - writer.push(stack, buffer, 4, ModelVertex.FORMAT); + writer.push(stack, buffer, 4, EntityVertex.FORMAT); } } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/EntityRenderer.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/EntityRenderer.java index 434d2dc7c6..36ee747940 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/EntityRenderer.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/immediate/model/EntityRenderer.java @@ -3,7 +3,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.caffeinemc.mods.sodium.api.math.MatrixHelper; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; -import net.caffeinemc.mods.sodium.api.vertex.format.common.ModelVertex; +import net.caffeinemc.mods.sodium.api.vertex.format.common.EntityVertex; import net.minecraft.core.Direction; import org.joml.Matrix3f; import org.joml.Matrix4f; @@ -38,7 +38,7 @@ public class EntityRenderer { private static final Matrix3f lastMatrix = new Matrix3f(); - private static final long SCRATCH_BUFFER = MemoryUtil.nmemAlignedAlloc(64, NUM_CUBE_FACES * NUM_FACE_VERTICES * ModelVertex.STRIDE); + private static final long SCRATCH_BUFFER = MemoryUtil.nmemAlignedAlloc(64, NUM_CUBE_FACES * NUM_FACE_VERTICES * EntityVertex.STRIDE); private static final Vector3f[] CUBE_CORNERS = new Vector3f[NUM_CUBE_VERTICES]; private static final int[][] CUBE_VERTICES = new int[][] { @@ -87,7 +87,7 @@ public static void renderCuboid(PoseStack.Pose matrices, VertexBufferWriter writ var vertexCount = emitQuads(cuboid, color, overlay, light); try (MemoryStack stack = MemoryStack.stackPush()) { - writer.push(stack, SCRATCH_BUFFER, vertexCount, ModelVertex.FORMAT); + writer.push(stack, SCRATCH_BUFFER, vertexCount, EntityVertex.FORMAT); } } @@ -106,16 +106,16 @@ private static int emitQuads(ModelCuboid cuboid, int color, int overlay, int lig } emitVertex(ptr, positions[quadIndex][0], color, textures[quadIndex][0], overlay, light, normals[quadIndex]); - ptr += ModelVertex.STRIDE; + ptr += EntityVertex.STRIDE; emitVertex(ptr, positions[quadIndex][1], color, textures[quadIndex][1], overlay, light, normals[quadIndex]); - ptr += ModelVertex.STRIDE; + ptr += EntityVertex.STRIDE; emitVertex(ptr, positions[quadIndex][2], color, textures[quadIndex][2], overlay, light, normals[quadIndex]); - ptr += ModelVertex.STRIDE; + ptr += EntityVertex.STRIDE; emitVertex(ptr, positions[quadIndex][3], color, textures[quadIndex][3], overlay, light, normals[quadIndex]); - ptr += ModelVertex.STRIDE; + ptr += EntityVertex.STRIDE; vertexCount += 4; } @@ -124,7 +124,7 @@ private static int emitQuads(ModelCuboid cuboid, int color, int overlay, int lig } private static void emitVertex(long ptr, Vector3f pos, int color, Vector2f tex, int overlay, int light, int normal) { - ModelVertex.write(ptr, pos.x, pos.y, pos.z, color, tex.x, tex.y, overlay, light, normal); + EntityVertex.write(ptr, pos.x, pos.y, pos.z, color, tex.x, tex.y, overlay, light, normal); } private static void prepareVertices(PoseStack.Pose matrices, ModelCuboid cuboid) { diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/VertexFormatDescriptionImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/VertexFormatDescriptionImpl.java deleted file mode 100644 index 1cea64380b..0000000000 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/VertexFormatDescriptionImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.caffeinemc.mods.sodium.client.render.vertex; - -import net.caffeinemc.mods.sodium.api.vertex.attributes.CommonVertexAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.VertexFormat; - -import java.util.Arrays; -import java.util.EnumSet; -import java.util.NoSuchElementException; - -public class VertexFormatDescriptionImpl implements VertexFormatDescription { - private final int id; - private final int stride; - - private final int[] offsets; - - private final boolean isSimple; - - public VertexFormatDescriptionImpl(VertexFormat format, int id) { - this.id = id; - this.stride = format.getVertexSize(); - - this.offsets = getOffsets(format); - this.isSimple = checkSimple(format); - } - - private static boolean checkSimple(VertexFormat format) { - EnumSet attributeSet = EnumSet.noneOf(CommonVertexAttribute.class); - var elementList = format.getElements(); - - for (int elementIndex = 0; elementIndex < elementList.size(); elementIndex++) { - var element = elementList.get(elementIndex); - var commonType = CommonVertexAttribute.getCommonType(element); - if ((commonType == null || !attributeSet.add(commonType))) { - return false; - } - } - - return true; - } - - public static int[] getOffsets(VertexFormat format) { - final int[] commonElementOffsets = new int[CommonVertexAttribute.COUNT]; - - Arrays.fill(commonElementOffsets, -1); - - var elementList = format.getElements(); - var elementOffsets = format.getOffsetsByElement(); - - for (int elementIndex = 0; elementIndex < elementList.size(); elementIndex++) { - var element = elementList.get(elementIndex); - var commonType = CommonVertexAttribute.getCommonType(element); - - if (commonType != null) { - commonElementOffsets[commonType.ordinal()] = elementOffsets[element.id()]; - } - } - - return commonElementOffsets; - } - - @Override - public boolean containsElement(CommonVertexAttribute element) { - return this.offsets[element.ordinal()] != -1; - } - - @Override - public int getElementOffset(CommonVertexAttribute element) { - int offset = this.offsets[element.ordinal()]; - - if (offset == -1) { - throw new NoSuchElementException("Vertex format does not contain element: " + element); - } - - return offset; - } - - @Override - public int id() { - return this.id; - } - - @Override - public int stride() { - return this.stride; - } - - @Override - public boolean isSimpleFormat() { - return this.isSimple; - } -} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/VertexFormatRegistryImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/VertexFormatRegistryImpl.java index d538a78b39..3dbace6a9c 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/VertexFormatRegistryImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/VertexFormatRegistryImpl.java @@ -1,50 +1,46 @@ package net.caffeinemc.mods.sodium.client.render.vertex; import com.mojang.blaze3d.vertex.VertexFormat; -import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatRegistry; -import java.util.Map; + import java.util.concurrent.locks.StampedLock; public class VertexFormatRegistryImpl implements VertexFormatRegistry { - private final Map descriptions = new Reference2ReferenceOpenHashMap<>(); + private static final int ABSENT_INDEX = -1; + private final Reference2IntMap descriptions = new Reference2IntOpenHashMap<>(); private final StampedLock lock = new StampedLock(); - @Override - public VertexFormatDescription get(VertexFormat format) { - VertexFormatDescription desc = this.findExisting(format); - - if (desc == null) { - desc = this.create(format); - } - - return desc; + public VertexFormatRegistryImpl() { + this.descriptions.defaultReturnValue(ABSENT_INDEX); } - private VertexFormatDescription findExisting(VertexFormat format) { - var stamp = this.lock.readLock(); + @Override + public int allocateGlobalId(VertexFormat format) { + int id; - try { - return this.descriptions.get(format); - } finally { - this.lock.unlockRead(stamp); - } - } + { + var stamp = this.lock.readLock(); - private VertexFormatDescription create(VertexFormat format) { - var stamp = this.lock.writeLock(); + try { + id = this.descriptions.getInt(format); + } finally { + this.lock.unlockRead(stamp); + } + } - var id = this.descriptions.size(); - var desc = new VertexFormatDescriptionImpl(format, id); + if (id == ABSENT_INDEX) { + var stamp = this.lock.writeLock(); - try { - this.descriptions.put(format, desc); - } finally { - this.lock.unlockWrite(stamp); + try { + this.descriptions.put(format, id = this.descriptions.size()); + } finally { + this.lock.unlockWrite(stamp); + } } - return desc; + return id; } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/buffer/BufferBuilderExtension.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/buffer/BufferBuilderExtension.java index 838d4e2969..40af81b01b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/buffer/BufferBuilderExtension.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/buffer/BufferBuilderExtension.java @@ -1,9 +1,6 @@ package net.caffeinemc.mods.sodium.client.render.vertex.buffer; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; - -import java.nio.ByteBuffer; public interface BufferBuilderExtension extends VertexBufferWriter { void sodium$duplicateVertex(); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/serializers/VertexSerializerRegistryImpl.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/serializers/VertexSerializerRegistryImpl.java index ff85ca4f34..c9eb8fb6ae 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/serializers/VertexSerializerRegistryImpl.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/serializers/VertexSerializerRegistryImpl.java @@ -1,9 +1,10 @@ package net.caffeinemc.mods.sodium.client.render.vertex.serializers; +import com.mojang.blaze3d.vertex.VertexFormat; import it.unimi.dsi.fastutil.longs.Long2ReferenceMap; import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; +import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatExtensions; import net.caffeinemc.mods.sodium.client.render.vertex.serializers.generated.VertexSerializerFactory; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; import net.caffeinemc.mods.sodium.api.vertex.serializer.VertexSerializer; import net.caffeinemc.mods.sodium.api.vertex.serializer.VertexSerializerRegistry; import org.slf4j.Logger; @@ -35,7 +36,7 @@ public class VertexSerializerRegistryImpl implements VertexSerializerRegistry { private final StampedLock lock = new StampedLock(); @Override - public VertexSerializer get(VertexFormatDescription srcFormat, VertexFormatDescription dstFormat) { + public VertexSerializer get(VertexFormat srcFormat, VertexFormat dstFormat) { var identifier = createKey(srcFormat, dstFormat); var serializer = this.find(identifier); @@ -46,7 +47,7 @@ public VertexSerializer get(VertexFormatDescription srcFormat, VertexFormatDescr return serializer; } - private VertexSerializer create(long identifier, VertexFormatDescription srcFormat, VertexFormatDescription dstFormat) { + private VertexSerializer create(long identifier, VertexFormat srcFormat, VertexFormat dstFormat) { var stamp = this.lock.writeLock(); try { @@ -76,8 +77,8 @@ private VertexSerializer find(long identifier) { } } - private static VertexSerializer createSerializer(VertexFormatDescription srcVertexFormat, VertexFormatDescription dstVertexFormat) { - var identifier = String.format("%04X$%04X", srcVertexFormat.id(), dstVertexFormat.id()); + private static VertexSerializer createSerializer(VertexFormat srcVertexFormat, VertexFormat dstVertexFormat) { + var identifier = String.format("%04X$%04X", getGlobalId(srcVertexFormat), getGlobalId(dstVertexFormat)); var bytecode = VertexSerializerFactory.generate(srcVertexFormat, dstVertexFormat, identifier); @@ -123,7 +124,11 @@ private static void dumpClass(String id, VertexSerializerFactory.Bytecode byteco } } - private static long createKey(VertexFormatDescription a, VertexFormatDescription b) { - return (long) a.id() & 0xffffffffL | ((long) b.id() & 0xffffffffL) << 32; + private static long createKey(VertexFormat a, VertexFormat b) { + return (long) getGlobalId(a) & 0xffffffffL | ((long) getGlobalId(b) & 0xffffffffL) << 32; + } + + private static int getGlobalId(VertexFormat format) { + return ((VertexFormatExtensions) format).sodium$getGlobalId(); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/serializers/generated/VertexSerializerFactory.java b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/serializers/generated/VertexSerializerFactory.java index e35ebd7ea4..de6614977b 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/serializers/generated/VertexSerializerFactory.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/client/render/vertex/serializers/generated/VertexSerializerFactory.java @@ -1,10 +1,11 @@ package net.caffeinemc.mods.sodium.client.render.vertex.serializers.generated; -import net.caffeinemc.mods.sodium.api.vertex.attributes.CommonVertexAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexFormatElement; import net.caffeinemc.mods.sodium.api.vertex.serializer.VertexSerializer; import org.lwjgl.system.MemoryUtil; import org.objectweb.asm.*; + import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.List; @@ -12,7 +13,7 @@ public class VertexSerializerFactory { private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); - public static Bytecode generate(VertexFormatDescription srcFormat, VertexFormatDescription dstFormat, String identifier) { + public static Bytecode generate(VertexFormat srcFormat, VertexFormat dstFormat, String identifier) { var memoryCopies = createMemoryTransferList(srcFormat, dstFormat); var name = "net/caffeinemc/mods/sodium/client/render/vertex/serializers/generated/VertexSerializer$Impl$" + identifier; @@ -128,7 +129,7 @@ public static Bytecode generate(VertexFormatDescription srcFormat, VertexFormatD Label labelIncrementSourcePointer = new Label(); methodVisitor.visitLabel(labelIncrementSourcePointer); methodVisitor.visitVarInsn(Opcodes.LLOAD, localSrcPointer); - methodVisitor.visitLdcInsn((long) srcFormat.stride()); + methodVisitor.visitLdcInsn((long) srcFormat.getVertexSize()); methodVisitor.visitInsn(Opcodes.LADD); methodVisitor.visitVarInsn(Opcodes.LSTORE, localSrcPointer); @@ -136,7 +137,7 @@ public static Bytecode generate(VertexFormatDescription srcFormat, VertexFormatD Label labelIncrementDestinationPointer = new Label(); methodVisitor.visitLabel(labelIncrementDestinationPointer); methodVisitor.visitVarInsn(Opcodes.LLOAD, localDstPointer); - methodVisitor.visitLdcInsn((long) dstFormat.stride()); + methodVisitor.visitLdcInsn((long) dstFormat.getVertexSize()); methodVisitor.visitInsn(Opcodes.LADD); methodVisitor.visitVarInsn(Opcodes.LSTORE, localDstPointer); @@ -166,24 +167,30 @@ public static Bytecode generate(VertexFormatDescription srcFormat, VertexFormatD return new Bytecode(classWriter.toByteArray()); } - private static List createMemoryTransferList(VertexFormatDescription srcVertexFormat, VertexFormatDescription dstVertexFormat) { + private static List createMemoryTransferList(VertexFormat srcVertexFormat, VertexFormat dstVertexFormat) { var ops = new ArrayList(); - for (var elementType : CommonVertexAttribute.values()) { + for (var elementIndex = 0; elementIndex < 32; elementIndex++) { + var elementType = VertexFormatElement.byId(elementIndex); + + if (elementType == null) { + continue; + } + // Check if we need to transfer the element into the destination format - if (!dstVertexFormat.containsElement(elementType)) { + if (!dstVertexFormat.contains(elementType)) { continue; } // If the destination format has the element, then the source format needs to have it as well - if (!srcVertexFormat.containsElement(elementType)) { + if (!srcVertexFormat.contains(elementType)) { throw new RuntimeException("Source format is missing element %s as required by destination format".formatted(elementType)); } - var srcOffset = srcVertexFormat.getElementOffset(elementType); - var dstOffset = dstVertexFormat.getElementOffset(elementType); + var srcOffset = srcVertexFormat.getOffset(elementType); + var dstOffset = dstVertexFormat.getOffset(elementType); - ops.add(new MemoryTransfer(srcOffset, dstOffset, elementType.getByteLength())); + ops.add(new MemoryTransfer(srcOffset, dstOffset, elementType.byteSize())); } return mergeAdjacentMemoryTransfers(ops); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/VertexFormatMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/VertexFormatMixin.java new file mode 100644 index 0000000000..3c0667485b --- /dev/null +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/VertexFormatMixin.java @@ -0,0 +1,30 @@ +package net.caffeinemc.mods.sodium.mixin.core.render; + +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexFormatElement; +import it.unimi.dsi.fastutil.ints.IntList; +import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatExtensions; +import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatRegistry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(VertexFormat.class) +public class VertexFormatMixin implements VertexFormatExtensions { + private int sodium$globalId; + + @Inject(method = "", at = @At("RETURN")) + private void afterInit(List elements, List names, IntList offsets, int vertexSize, CallbackInfo ci) { + this.sodium$globalId = VertexFormatRegistry.instance() + .allocateGlobalId((VertexFormat) (Object) this); + } + + @Unique + public int sodium$getGlobalId() { + return this.sodium$globalId; + } +} diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/BufferBuilderMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/BufferBuilderMixin.java index f10a7b2bb6..ec198c1731 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/BufferBuilderMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/BufferBuilderMixin.java @@ -1,25 +1,17 @@ package net.caffeinemc.mods.sodium.mixin.core.render.immediate.consumer; +import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.ByteBufferBuilder; -import net.caffeinemc.mods.sodium.client.render.vertex.buffer.BufferBuilderExtension; +import com.mojang.blaze3d.vertex.VertexFormat; import net.caffeinemc.mods.sodium.api.memory.MemoryIntrinsics; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatRegistry; import net.caffeinemc.mods.sodium.api.vertex.serializer.VertexSerializerRegistry; +import net.caffeinemc.mods.sodium.client.render.vertex.buffer.BufferBuilderExtension; import org.lwjgl.system.MemoryStack; -import org.lwjgl.system.MemoryUtil; -import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.VertexFormat; -import java.nio.ByteBuffer; @Mixin(BufferBuilder.class) public abstract class BufferBuilderMixin implements VertexBufferWriter, BufferBuilderExtension { @@ -40,38 +32,31 @@ public abstract class BufferBuilderMixin implements VertexBufferWriter, BufferBu @Shadow private int elementsToFill; - @Unique - private VertexFormatDescription formatDescription; - - @Inject(method = "", at = @At("TAIL")) - private void onFormatChanged(ByteBufferBuilder byteBufferBuilder, VertexFormat.Mode mode, VertexFormat format, CallbackInfo ci) { - this.formatDescription = VertexFormatRegistry.instance() - .get(format); - } + @Shadow + @Final + private VertexFormat format; @Override public void sodium$duplicateVertex() { - if (vertices == 0) return; + if (this.vertices == 0) { + return; + } - long dst = this.buffer.reserve(this.vertexSize); - MemoryIntrinsics.copyMemory(dst - this.vertexSize, dst, this.vertexSize); - ++this.vertices; - } + long head = this.buffer.reserve(this.vertexSize); + MemoryIntrinsics.copyMemory(head - this.vertexSize, head, this.vertexSize); - @Override - public boolean canUseIntrinsics() { - return this.formatDescription != null && this.formatDescription.isSimpleFormat(); + this.vertices++; } @Override - public void push(MemoryStack stack, long src, int count, VertexFormatDescription format) { + public void push(MemoryStack stack, long src, int count, VertexFormat format) { var length = count * this.vertexSize; // The buffer may change in the even, so we need to make sure that the // pointer is retrieved *after* the resize var dst = this.buffer.reserve(length); - if (format == this.formatDescription) { + if (format == this.format) { // The layout is the same, so we can just perform a memory copy // The stride of a vertex format is always 4 bytes, so this aligned copy is always safe MemoryIntrinsics.copyMemory(src, dst, length); @@ -86,9 +71,9 @@ public void push(MemoryStack stack, long src, int count, VertexFormatDescription } @Unique - private void copySlow(long src, long dst, int count, VertexFormatDescription format) { + private void copySlow(long src, long dst, int count, VertexFormat format) { VertexSerializerRegistry.instance() - .get(format, this.formatDescription) + .get(format, this.format) .serialize(src, dst, count); } } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/EntityOutlineGeneratorMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/EntityOutlineGeneratorMixin.java index c1980c1ee5..015277efce 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/EntityOutlineGeneratorMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/EntityOutlineGeneratorMixin.java @@ -1,11 +1,10 @@ package net.caffeinemc.mods.sodium.mixin.core.render.immediate.consumer; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.caffeinemc.mods.sodium.api.util.ColorABGR; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexFormatElement; import net.caffeinemc.mods.sodium.api.util.ColorARGB; -import net.caffeinemc.mods.sodium.api.vertex.attributes.CommonVertexAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.ColorAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; import org.lwjgl.system.MemoryStack; import org.spongepowered.asm.mixin.Final; @@ -39,7 +38,7 @@ public boolean canUseIntrinsics() { } @Override - public void push(MemoryStack stack, long ptr, int count, VertexFormatDescription format) { + public void push(MemoryStack stack, long ptr, int count, VertexFormat format) { transform(ptr, count, format, this.color); @@ -56,10 +55,10 @@ public void push(MemoryStack stack, long ptr, int count, VertexFormatDescription * @param color The packed color to use for transforming the vertices */ @Unique - private static void transform(long ptr, int count, VertexFormatDescription format, + private static void transform(long ptr, int count, VertexFormat format, int color) { - long stride = format.stride(); - long offsetColor = format.getElementOffset(CommonVertexAttribute.COLOR); + long stride = format.getVertexSize(); + long offsetColor = format.getOffset(VertexFormatElement.COLOR); for (int vertexIndex = 0; vertexIndex < count; vertexIndex++) { ColorAttribute.set(ptr + offsetColor, ColorARGB.toABGR(color)); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/SheetedDecalTextureGeneratorMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/SheetedDecalTextureGeneratorMixin.java index 4e21f23e24..b08314a264 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/SheetedDecalTextureGeneratorMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/SheetedDecalTextureGeneratorMixin.java @@ -2,12 +2,12 @@ import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexFormatElement; import net.caffeinemc.mods.sodium.api.util.ColorABGR; import net.caffeinemc.mods.sodium.api.util.NormI8; -import net.caffeinemc.mods.sodium.api.vertex.attributes.CommonVertexAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.ColorAttribute; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.TextureAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; import net.minecraft.core.Direction; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; import org.joml.Matrix3f; @@ -56,7 +56,7 @@ public boolean canUseIntrinsics() { } @Override - public void push(MemoryStack stack, long ptr, int count, VertexFormatDescription format) { + public void push(MemoryStack stack, long ptr, int count, VertexFormat format) { transform(ptr, count, format, this.normalInversePose, this.cameraInversePose, this.textureScale); @@ -75,14 +75,14 @@ public void push(MemoryStack stack, long ptr, int count, VertexFormatDescription * @param textureScale The amount which the overlay texture should be adjusted */ @Unique - private static void transform(long ptr, int count, VertexFormatDescription format, + private static void transform(long ptr, int count, VertexFormat format, Matrix3f inverseNormalMatrix, Matrix4f inverseTextureMatrix, float textureScale) { - long stride = format.stride(); + long stride = format.getVertexSize(); - var offsetPosition = format.getElementOffset(CommonVertexAttribute.POSITION); - var offsetColor = format.getElementOffset(CommonVertexAttribute.COLOR); - var offsetNormal = format.getElementOffset(CommonVertexAttribute.NORMAL); - var offsetTexture = format.getElementOffset(CommonVertexAttribute.TEXTURE); + var offsetPosition = format.getOffset(VertexFormatElement.POSITION); + var offsetColor = format.getOffset(VertexFormatElement.COLOR); + var offsetNormal = format.getOffset(VertexFormatElement.NORMAL); + var offsetTexture = format.getOffset(VertexFormatElement.UV0); int color = ColorABGR.pack(1.0f, 1.0f, 1.0f, 1.0f); diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/SpriteCoordinateExpanderMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/SpriteCoordinateExpanderMixin.java index 89f768ce5a..a5791813ed 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/SpriteCoordinateExpanderMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/SpriteCoordinateExpanderMixin.java @@ -1,9 +1,9 @@ package net.caffeinemc.mods.sodium.mixin.core.render.immediate.consumer; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.caffeinemc.mods.sodium.api.vertex.attributes.CommonVertexAttribute; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexFormatElement; import net.caffeinemc.mods.sodium.api.vertex.attributes.common.TextureAttribute; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; import net.minecraft.client.renderer.SpriteCoordinateExpander; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; @@ -48,7 +48,7 @@ public boolean canUseIntrinsics() { } @Override - public void push(MemoryStack stack, final long ptr, int count, VertexFormatDescription format) { + public void push(MemoryStack stack, final long ptr, int count, VertexFormat format) { transform(ptr, count, format, this.minU, this.minV, this.maxU, this.maxV); @@ -69,10 +69,10 @@ public void push(MemoryStack stack, final long ptr, int count, VertexFormatDescr * @param maxV The maximum Y-coordinate of the sprite bounds */ @Unique - private static void transform(long ptr, int count, VertexFormatDescription format, + private static void transform(long ptr, int count, VertexFormat format, float minU, float minV, float maxU, float maxV) { - long stride = format.stride(); - long offsetUV = format.getElementOffset(CommonVertexAttribute.TEXTURE); + long stride = format.getVertexSize(); + long offsetUV = format.getOffset(VertexFormatElement.UV0); // The width/height of the sprite float w = maxU - minU; diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/VertexMultiConsumerMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/VertexMultiConsumerMixin.java index edfd27095a..551492f3ea 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/VertexMultiConsumerMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/core/render/immediate/consumer/VertexMultiConsumerMixin.java @@ -1,7 +1,7 @@ package net.caffeinemc.mods.sodium.mixin.core.render.immediate.consumer; -import net.caffeinemc.mods.sodium.api.vertex.format.VertexFormatDescription; +import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexConsumer; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; import org.lwjgl.system.MemoryStack; @@ -38,7 +38,7 @@ public boolean canUseIntrinsics() { } @Override - public void push(MemoryStack stack, long ptr, int count, VertexFormatDescription format) { + public void push(MemoryStack stack, long ptr, int count, VertexFormat format) { VertexBufferWriter.copyInto(VertexBufferWriter.of(this.first), stack, ptr, count, format); VertexBufferWriter.copyInto(VertexBufferWriter.of(this.second), stack, ptr, count, format); } @@ -75,7 +75,7 @@ public boolean canUseIntrinsics() { } @Override - public void push(MemoryStack stack, long ptr, int count, VertexFormatDescription format) { + public void push(MemoryStack stack, long ptr, int count, VertexFormat format) { for (var delegate : this.delegates) { VertexBufferWriter.copyInto(VertexBufferWriter.of(delegate), stack, ptr, count, format); } diff --git a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/shadows/EntityRenderDispatcherMixin.java b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/shadows/EntityRenderDispatcherMixin.java index 3b53ef2afc..7f96b527b3 100644 --- a/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/shadows/EntityRenderDispatcherMixin.java +++ b/common/src/main/java/net/caffeinemc/mods/sodium/mixin/features/render/entity/shadows/EntityRenderDispatcherMixin.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.caffeinemc.mods.sodium.client.render.vertex.VertexConsumerUtils; import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter; -import net.caffeinemc.mods.sodium.api.vertex.format.common.ModelVertex; +import net.caffeinemc.mods.sodium.api.vertex.format.common.EntityVertex; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.texture.OverlayTexture; @@ -103,22 +103,22 @@ private static void renderShadowPart(PoseStack.Pose matrices, VertexBufferWriter var normal = MatrixHelper.transformNormal(matNormal, matrices.trustedNormals, Direction.UP); try (MemoryStack stack = MemoryStack.stackPush()) { - long buffer = stack.nmalloc(4 * ModelVertex.STRIDE); + long buffer = stack.nmalloc(4 * EntityVertex.STRIDE); long ptr = buffer; writeShadowVertex(ptr, matPosition, minX, minY, minZ, u1, v1, color, normal); - ptr += ModelVertex.STRIDE; + ptr += EntityVertex.STRIDE; writeShadowVertex(ptr, matPosition, minX, minY, maxZ, u1, v2, color, normal); - ptr += ModelVertex.STRIDE; + ptr += EntityVertex.STRIDE; writeShadowVertex(ptr, matPosition, maxX, minY, maxZ, u2, v2, color, normal); - ptr += ModelVertex.STRIDE; + ptr += EntityVertex.STRIDE; writeShadowVertex(ptr, matPosition, maxX, minY, minZ, u2, v1, color, normal); - ptr += ModelVertex.STRIDE; + ptr += EntityVertex.STRIDE; - writer.push(stack, buffer, 4, ModelVertex.FORMAT); + writer.push(stack, buffer, 4, EntityVertex.FORMAT); } } @@ -129,6 +129,6 @@ private static void writeShadowVertex(long ptr, Matrix4f matPosition, float x, f float yt = MatrixHelper.transformPositionY(matPosition, x, y, z); float zt = MatrixHelper.transformPositionZ(matPosition, x, y, z); - ModelVertex.write(ptr, xt, yt, zt, color, u, v, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, normal); + EntityVertex.write(ptr, xt, yt, zt, color, u, v, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, normal); } } diff --git a/common/src/main/resources/sodium.mixins.json b/common/src/main/resources/sodium.mixins.json index 7dbaeb8053..b35f470ff6 100644 --- a/common/src/main/resources/sodium.mixins.json +++ b/common/src/main/resources/sodium.mixins.json @@ -16,6 +16,7 @@ "core.model.colors.BlockColorsMixin", "core.model.colors.ItemColorsMixin", "core.model.FaceBakeryMixin", + "core.render.VertexFormatMixin", "core.render.frustum.FrustumMixin", "core.render.immediate.consumer.BufferBuilderMixin", "core.render.immediate.consumer.EntityOutlineGeneratorMixin",