Merge pull request #44 from saturnclientmc/cosmetics

Cosmetics
This commit is contained in:
Kr4ight
2026-03-21 14:47:33 +01:00
committed by GitHub
4 changed files with 47 additions and 21 deletions
+1 -1
Submodule common updated: 2969a8340a...9064238c3a
@@ -5,9 +5,9 @@ import java.util.Arrays;
import org.saturnclient.client.player.SaturnPlayer; import org.saturnclient.client.player.SaturnPlayer;
import org.saturnclient.config.Config; import org.saturnclient.config.Config;
import org.saturnclient.cosmetics.Cloaks; import org.saturnclient.cosmetics.Cloaks;
import org.saturnclient.impl.cosmetics.utils.ShaderUtils;
import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.entity.equipment.EquipmentModel; import net.minecraft.client.render.entity.equipment.EquipmentModel;
@@ -283,7 +283,7 @@ public class CloakFeatureRenderer extends FeatureRenderer<PlayerEntityRenderStat
return; return;
} }
Identifier customCape = (Identifier) (Object) Cloaks.getCurrentCloakTexture(player.uuid); Identifier customCape = (Identifier) (Object) Cloaks.getCurrentCloakTexture(player.cloak);
if (customCape == null if (customCape == null
|| this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.WINGS)) { || this.hasCustomModelForLayer(playerEntityRenderState.equippedChestStack, LayerType.WINGS)) {
return; return;
@@ -297,7 +297,7 @@ public class CloakFeatureRenderer extends FeatureRenderer<PlayerEntityRenderStat
light = (skyLight << 20) | (blockLight << 4); light = (skyLight << 20) | (blockLight << 4);
VertexConsumer vertexConsumer = vertexConsumerProvider VertexConsumer vertexConsumer = vertexConsumerProvider
.getBuffer(RenderLayer.getEntityAlpha(customCape)); .getBuffer(ShaderUtils.getRenderLayer(customCape));
matrixStack.push(); matrixStack.push();
@@ -314,25 +314,16 @@ public class CloakFeatureRenderer extends FeatureRenderer<PlayerEntityRenderStat
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
if (now - lastUpdate >= 20) { if (now - lastUpdate >= 20) {
float velX = Math.min(1.0f, playerEntityRenderState.field_53537 / 108.0f); float velX = Math.min(0.6f, playerEntityRenderState.field_53537 / 108.0f);
float rawVelY = playerEntityRenderState.field_53536; float rawVelY = playerEntityRenderState.field_53536;
float velY = (rawVelY > 4.0f ? rawVelY : 0.0f) / 16; float velY = (rawVelY > 3.4f ? rawVelY : 0.0f) / 16;
float value = playerEntityRenderState.isSwimming ? 0.0f : velX + velY; float value = playerEntityRenderState.isSwimming ? 0.0f : velX + velY;
if (Config.cloakPhysics.value) { if (Config.cloakPhysics.value) {
updateSegmentValues(value); updateSegmentValues(segmentValues[0] + (value - segmentValues[0]) * 0.3f);
} else { } else {
float last = segmentValues[0]; Arrays.fill(segmentValues, segmentValues[0] + (value - segmentValues[0]) * 0.05f);
float maxStep = 0.02f;
float next = value;
if (next > last)
next = Math.min(next, last + maxStep);
else if (next < last)
next = Math.max(next, last - maxStep);
Arrays.fill(segmentValues, next);
} }
lastUpdate = now; lastUpdate = now;
} }
@@ -4,16 +4,18 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.Map; import java.util.Map;
import org.saturnclient.impl.cosmetics.utils.ShaderUtils;
import de.javagl.obj.*; import de.javagl.obj.*;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer; import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public class ObjRenderer { public class ObjRenderer {
public static Obj loadObj(Identifier objId) throws IOException { public static Obj loadObj(Identifier objId) throws IOException {
try (InputStream is = MinecraftClient.getInstance().getResourceManager() try (InputStream is = MinecraftClient.getInstance().getResourceManager()
.getResource(objId).get().getInputStream()) { .getResource(objId).get().getInputStream()) {
@@ -39,8 +41,6 @@ public class ObjRenderer {
if (mtl != null) { if (mtl != null) {
String mapKd = mtl.getMapKd(); String mapKd = mtl.getMapKd();
if (mapKd != null) { if (mapKd != null) {
// "#key" references are not resolvable at runtime without a texture map,
// so we only support direct resource location strings here
if (!mapKd.startsWith("#")) { if (!mapKd.startsWith("#")) {
texture = Identifier.of(mapKd); texture = Identifier.of(mapKd);
} }
@@ -58,7 +58,7 @@ public class ObjRenderer {
} }
} }
VertexConsumer consumer = vertexConsumers.getBuffer(RenderLayer.getEntityAlpha(texture)); VertexConsumer consumer = vertexConsumers.getBuffer(ShaderUtils.getRenderLayer(texture));
int faces = groupObj.getNumFaces(); int faces = groupObj.getNumFaces();
final float fr = r, fg = g, fb = b; final float fr = r, fg = g, fb = b;
@@ -0,0 +1,35 @@
package org.saturnclient.impl.cosmetics.utils;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.RenderPhase;
import net.minecraft.client.render.VertexFormat.DrawMode;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.render.RenderPhase.Textures;
import net.minecraft.client.render.block.entity.EndPortalBlockEntityRenderer;
import net.minecraft.util.Identifier;
public class ShaderUtils {
public static final RenderLayer END_GATEWAY = RenderLayer.of(
"end_gateway_no_cull",
VertexFormats.POSITION,
DrawMode.QUADS,
1536,
false,
false,
RenderLayer.MultiPhaseParameters.builder()
.program(RenderLayer.END_GATEWAY_PROGRAM)
.texture(Textures.create()
.add(EndPortalBlockEntityRenderer.SKY_TEXTURE, false, false)
.add(EndPortalBlockEntityRenderer.PORTAL_TEXTURE, false, false)
.build())
.cull(RenderPhase.DISABLE_CULLING)
.build(false));
public static RenderLayer getRenderLayer(Identifier texture) {
if (texture.getPath().endsWith("end.png")) {
return END_GATEWAY;
} else {
return RenderLayer.getEntityAlpha(texture);
}
}
}