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",