Skip to content

Commit

Permalink
Move SpriteUtil to API package
Browse files Browse the repository at this point in the history
The existing private interface is kept intact as to
not break any mods currently relying on it.
  • Loading branch information
jellysquid3 committed Feb 14, 2025
1 parent 410a730 commit f9eee56
Show file tree
Hide file tree
Showing 18 changed files with 128 additions and 44 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package net.caffeinemc.mods.sodium.api.texture;

import net.caffeinemc.mods.sodium.api.internal.DependencyInjection;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;

/**
* Utility functions for querying sprite information and updating per-frame information about sprite visibility.
*/
@ApiStatus.Experimental
public interface SpriteUtil {
SpriteUtil INSTANCE = DependencyInjection.load(SpriteUtil.class,
"net.caffeinemc.mods.sodium.client.render.texture.SpriteUtilImpl");

/**
* Marks the sprite as "active", meaning that it is visible during this frame and should have the animation
* state updated. Mods which perform their own rendering without the use of Minecraft's helpers will need to
* call this method once every frame, when their sprite is actively being used in rendering.
* @param sprite The sprite to mark as active
*/
void markSpriteActive(@NotNull TextureAtlasSprite sprite);

/**
* Returns if the provided sprite has an animation.
*
* @param sprite The sprite to query an animation for
* @return {@code true} if the provided sprite has an animation, otherwise {@code false}
*/
boolean hasAnimation(@NotNull TextureAtlasSprite sprite);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
import it.unimi.dsi.fastutil.objects.ReferenceSet;
import it.unimi.dsi.fastutil.objects.ReferenceSets;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.client.SodiumClientMod;
import net.caffeinemc.mods.sodium.client.gl.device.CommandList;
import net.caffeinemc.mods.sodium.client.gl.device.RenderDevice;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.BuilderTaskOutput;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkBuildOutput;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.ChunkSortOutput;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.executor.ChunkBuilder;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.executor.ChunkJobResult;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.executor.ChunkJobCollector;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.executor.ChunkJobResult;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.tasks.ChunkBuilderMeshingTask;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.tasks.ChunkBuilderSortingTask;
import net.caffeinemc.mods.sodium.client.render.chunk.compile.tasks.ChunkBuilderTask;
Expand All @@ -37,7 +38,6 @@
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.trigger.CameraMovement;
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.trigger.SortTriggering;
import net.caffeinemc.mods.sodium.client.render.chunk.vertex.format.ChunkMeshFormats;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.client.render.util.RenderAsserts;
import net.caffeinemc.mods.sodium.client.render.viewport.CameraTransform;
import net.caffeinemc.mods.sodium.client.render.viewport.Viewport;
Expand Down Expand Up @@ -276,7 +276,7 @@ public void tickVisibleRenders() {
}

for (TextureAtlasSprite sprite : sprites) {
SpriteUtil.markSpriteActive(sprite);
SpriteUtil.INSTANCE.markSpriteActive(sprite);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.TranslucentGeometryCollector;
import net.caffeinemc.mods.sodium.client.render.chunk.vertex.builder.ChunkMeshBufferBuilder;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import org.jetbrains.annotations.NotNull;

public class BakedChunkModelBuilder implements ChunkModelBuilder {
private final ChunkMeshBufferBuilder[] vertexBuffers;
Expand All @@ -24,7 +25,7 @@ public ChunkMeshBufferBuilder getVertexBuffer(ModelQuadFacing facing) {
}

@Override
public void addSprite(TextureAtlasSprite sprite) {
public void addSprite(@NotNull TextureAtlasSprite sprite) {
this.renderData.addSprite(sprite);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
import net.caffeinemc.mods.sodium.client.render.chunk.translucent_sorting.TranslucentGeometryCollector;
import net.caffeinemc.mods.sodium.client.render.chunk.vertex.builder.ChunkMeshBufferBuilder;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import org.jetbrains.annotations.NotNull;

public interface ChunkModelBuilder {
ChunkMeshBufferBuilder getVertexBuffer(ModelQuadFacing facing);

void addSprite(TextureAtlasSprite sprite);
void addSprite(@NotNull TextureAtlasSprite sprite);

/**
* <b>This method should not be used unless absolutely necessary!</b> It exists only for compatibility purposes.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,9 @@ private void bufferQuad(MutableQuadViewImpl quad, float[] brightnesses, Material
ChunkMeshBufferBuilder vertexBuffer = builder.getVertexBuffer(normalFace);
vertexBuffer.push(vertices, materialBits);

builder.addSprite(atlasSprite);
if (atlasSprite != null) {
builder.addSprite(atlasSprite);
}
}

private boolean validateQuadUVs(TextureAtlasSprite atlasSprite) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package net.caffeinemc.mods.sodium.client.render.chunk.data;

import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.client.render.chunk.RenderSectionFlags;
import net.caffeinemc.mods.sodium.client.render.chunk.occlusion.VisibilityEncoding;
import net.caffeinemc.mods.sodium.client.render.chunk.terrain.TerrainRenderPass;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.minecraft.client.renderer.chunk.VisibilitySet;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.core.Direction;
Expand Down Expand Up @@ -78,8 +78,8 @@ public void setOcclusionData(VisibilitySet data) {
* before rendering as necessary.
* @param sprite The sprite
*/
public void addSprite(TextureAtlasSprite sprite) {
if (SpriteUtil.hasAnimation(sprite)) {
public void addSprite(@NotNull TextureAtlasSprite sprite) {
if (SpriteUtil.INSTANCE.hasAnimation(sprite)) {
this.animatedSprites.add(sprite);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.MatrixUtil;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.util.ColorMixer;
import net.caffeinemc.mods.sodium.client.render.frapi.helper.ColorHelper;
import net.caffeinemc.mods.sodium.client.render.frapi.mesh.EncodingFormat;
import net.caffeinemc.mods.sodium.client.render.frapi.mesh.MutableQuadViewImpl;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteFinderCache;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.mixin.features.render.frapi.ItemRendererAccessor;
import net.fabricmc.fabric.api.renderer.v1.material.BlendMode;
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial;
Expand Down Expand Up @@ -224,7 +224,10 @@ private void shadeQuad(MutableQuadViewImpl quad, boolean emissive) {

private void bufferQuad(MutableQuadViewImpl quad, VertexConsumer vertexConsumer) {
QuadEncoder.writeQuadVertices(quad, vertexConsumer, overlay, matPosition, trustedNormals, matNormal);
SpriteUtil.markSpriteActive(quad.sprite(SpriteFinderCache.forBlockAtlas()));
var sprite = quad.sprite(SpriteFinderCache.forBlockAtlas());
if (sprite != null) {
SpriteUtil.INSTANCE.markSpriteActive(sprite);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.util.ColorARGB;
import net.caffeinemc.mods.sodium.api.util.ColorMixer;
import net.caffeinemc.mods.sodium.client.model.light.LightMode;
import net.caffeinemc.mods.sodium.client.model.light.LightPipelineProvider;
import net.caffeinemc.mods.sodium.client.model.light.data.SingleBlockLightDataCache;
import net.caffeinemc.mods.sodium.client.render.frapi.mesh.MutableQuadViewImpl;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteFinderCache;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.client.services.SodiumModelData;
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial;
import net.fabricmc.fabric.api.renderer.v1.material.ShadeMode;
Expand Down Expand Up @@ -128,6 +128,9 @@ protected void shadeQuad(MutableQuadViewImpl quad, LightMode lightMode, boolean

private void bufferQuad(MutableQuadViewImpl quad) {
QuadEncoder.writeQuadVertices(quad, vertexConsumer, overlay, matPosition, trustedNormals, matNormal);
SpriteUtil.markSpriteActive(quad.sprite(SpriteFinderCache.forBlockAtlas()));
var sprite = quad.sprite(SpriteFinderCache.forBlockAtlas());
if (sprite != null) {
SpriteUtil.INSTANCE.markSpriteActive(sprite);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,22 @@
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import org.jetbrains.annotations.Nullable;

// Kept for mod compatibility, to be removed in next major release.
@Deprecated(forRemoval = true)
public class SpriteUtil {
@Deprecated(forRemoval = true)
public static void markSpriteActive(@Nullable TextureAtlasSprite sprite) {
if (sprite == null) {
// Can happen in some cases, for example if a mod passes a BakedQuad with a null sprite
// to a VertexConsumer that does not have a texture element.
return;
if (sprite != null) {
net.caffeinemc.mods.sodium.api.texture.SpriteUtil.INSTANCE.markSpriteActive(sprite);
}

((SpriteContentsExtension) sprite.contents()).sodium$setActive(true);
}

public static boolean hasAnimation(TextureAtlasSprite sprite) {
return ((SpriteContentsExtension) sprite.contents()).sodium$hasAnimation();
@Deprecated(forRemoval = true)
public static boolean hasAnimation(@Nullable TextureAtlasSprite sprite) {
if (sprite != null) {
return net.caffeinemc.mods.sodium.api.texture.SpriteUtil.INSTANCE.hasAnimation(sprite);
}

return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package net.caffeinemc.mods.sodium.client.render.texture;

import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import org.jetbrains.annotations.NotNull;

import java.util.Objects;

public class SpriteUtilImpl implements SpriteUtil {
@Override
public void markSpriteActive(@NotNull TextureAtlasSprite sprite) {
Objects.requireNonNull(sprite);

((SpriteContentsExtension) sprite.contents()).sodium$setActive(true);
}

@Override
public boolean hasAnimation(@NotNull TextureAtlasSprite sprite) {
Objects.requireNonNull(sprite);

return ((SpriteContentsExtension) sprite.contents()).sodium$hasAnimation();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.caffeinemc.mods.sodium.client.model.quad.ModelQuadView;
import net.caffeinemc.mods.sodium.client.render.immediate.model.BakedModelEncoder;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.util.ColorABGR;
import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter;
import net.caffeinemc.mods.sodium.client.model.quad.ModelQuadView;
import net.caffeinemc.mods.sodium.client.render.immediate.model.BakedModelEncoder;
import net.minecraft.client.renderer.block.model.BakedQuad;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -25,7 +25,9 @@ public void putBulkData(PoseStack.Pose matrices, BakedQuad bakedQuad, float r, f
if (!this.fastFormat) {
VertexConsumer.super.putBulkData(matrices, bakedQuad, r, g, b, a, light, overlay);

SpriteUtil.markSpriteActive(bakedQuad.getSprite());
if (bakedQuad.getSprite() != null) {
SpriteUtil.INSTANCE.markSpriteActive(bakedQuad.getSprite());
}

return;
}
Expand All @@ -41,15 +43,19 @@ public void putBulkData(PoseStack.Pose matrices, BakedQuad bakedQuad, float r, f
int color = ColorABGR.pack(r, g, b, a);
BakedModelEncoder.writeQuadVertices(writer, matrices, quad, color, light, overlay, false);

SpriteUtil.markSpriteActive(quad.getSprite());
if (quad.getSprite() != null) {
SpriteUtil.INSTANCE.markSpriteActive(quad.getSprite());
}
}

@Override
public void putBulkData(PoseStack.Pose matrices, BakedQuad bakedQuad, float[] brightnessTable, float r, float g, float b, float a, int[] light, int overlay, boolean colorize) {
if (!this.fastFormat) {
VertexConsumer.super.putBulkData(matrices, bakedQuad, brightnessTable, r, g, b, a, light, overlay, colorize);

SpriteUtil.markSpriteActive(bakedQuad.getSprite());
if (bakedQuad.getSprite() != null) {
SpriteUtil.INSTANCE.markSpriteActive(bakedQuad.getSprite());
}

return;
}
Expand All @@ -64,6 +70,8 @@ public void putBulkData(PoseStack.Pose matrices, BakedQuad bakedQuad, float[] br

BakedModelEncoder.writeQuadVertices(writer, matrices, quad, r, g, b, a, brightnessTable, colorize, light, overlay);

SpriteUtil.markSpriteActive(quad.getSprite());
if (quad.getSprite() != null) {
SpriteUtil.INSTANCE.markSpriteActive(quad.getSprite());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.util.ColorARGB;
import net.caffeinemc.mods.sodium.api.vertex.buffer.VertexBufferWriter;
import net.caffeinemc.mods.sodium.client.model.quad.BakedQuadView;
import net.caffeinemc.mods.sodium.client.render.immediate.model.BakedModelEncoder;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.client.render.vertex.VertexConsumerUtils;
import net.caffeinemc.mods.sodium.client.util.DirectionUtil;
import net.minecraft.client.color.item.ItemColors;
Expand Down Expand Up @@ -92,7 +92,9 @@ private void renderBakedItemQuads(PoseStack.Pose matrices, VertexBufferWriter wr

BakedModelEncoder.writeQuadVertices(writer, matrices, quad, color, light, overlay, BakedModelEncoder.shouldMultiplyAlpha());

SpriteUtil.markSpriteActive(quad.getSprite());
if (quad.getSprite() != null) {
SpriteUtil.INSTANCE.markSpriteActive(quad.getSprite());
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.caffeinemc.mods.sodium.mixin.features.textures.animations.tracking;

import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -16,7 +16,7 @@ private void preDrawSprite(int x, int y, int z,
TextureAtlasSprite sprite,
CallbackInfo ci)
{
SpriteUtil.markSpriteActive(sprite);
SpriteUtil.INSTANCE.markSpriteActive(sprite);
}

@Inject(method = "blit(IIIIILnet/minecraft/client/renderer/texture/TextureAtlasSprite;FFFF)V", at = @At("HEAD"))
Expand All @@ -26,6 +26,6 @@ private void preDrawSprite(int x, int y, int z,
float red, float green, float blue, float alpha,
CallbackInfo ci)
{
SpriteUtil.markSpriteActive(sprite);
SpriteUtil.INSTANCE.markSpriteActive(sprite);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.core.BlockPos;
Expand All @@ -22,6 +22,8 @@ public class ModelBlockRendererMixin {
*/
@Inject(method = "putQuadData", at = @At("HEAD"))
private void preRenderQuad(BlockAndTintGetter level, BlockState state, BlockPos pos, VertexConsumer vertexConsumer, PoseStack.Pose matrices, BakedQuad quad, float brightness0, float brightness1, float brightness2, float brightness3, int light0, int light1, int light2, int light3, int overlay, CallbackInfo ci) {
SpriteUtil.markSpriteActive(quad.getSprite());
if (quad.getSprite() != null) {
SpriteUtil.INSTANCE.markSpriteActive(quad.getSprite());
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package net.caffeinemc.mods.sodium.mixin.features.textures.animations.tracking;

import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil;
import net.caffeinemc.mods.sodium.api.texture.SpriteUtil;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import org.spongepowered.asm.mixin.Mixin;
Expand All @@ -15,7 +15,7 @@ private void preReturnSprite(CallbackInfoReturnable<TextureAtlasSprite> cir) {
TextureAtlasSprite sprite = cir.getReturnValue();

if (sprite != null) {
SpriteUtil.markSpriteActive(sprite);
SpriteUtil.INSTANCE.markSpriteActive(sprite);
}
}
}
Loading

0 comments on commit f9eee56

Please sign in to comment.