Hat renderer

This commit is contained in:
2026-04-08 19:50:44 +02:00
parent 84947d6b33
commit d782bccb5f
5 changed files with 35 additions and 37 deletions
@@ -291,6 +291,8 @@ public class CloakFeatureRenderer extends FeatureRenderer<PlayerEntityRenderStat
SaturnPlayer player = state.getData(SaturnRenderState.saturnDataKey); SaturnPlayer player = state.getData(SaturnRenderState.saturnDataKey);
player = null;
if (player == null) { if (player == null) {
return; return;
} }
@@ -4,9 +4,9 @@ import org.joml.Quaternionf;
import org.saturnclient.client.player.SaturnPlayer; import org.saturnclient.client.player.SaturnPlayer;
import org.saturnclient.impl.cosmetics.obj.MtlLoader; import org.saturnclient.impl.cosmetics.obj.MtlLoader;
import org.saturnclient.impl.cosmetics.obj.ObjModel; import org.saturnclient.impl.cosmetics.obj.ObjModel;
import org.saturnclient.saturnclient.SaturnRenderState;
import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.command.OrderedRenderCommandQueue; import net.minecraft.client.render.command.OrderedRenderCommandQueue;
import net.minecraft.client.render.entity.feature.FeatureRenderer; import net.minecraft.client.render.entity.feature.FeatureRenderer;
import net.minecraft.client.render.entity.feature.FeatureRendererContext; import net.minecraft.client.render.entity.feature.FeatureRendererContext;
@@ -20,13 +20,10 @@ public class HatFeatureRenderer extends FeatureRenderer<PlayerEntityRenderState,
super(context); super(context);
} }
// @Override @Override
public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, public void render(MatrixStack matrices, OrderedRenderCommandQueue queue, int light, PlayerEntityRenderState state,
PlayerEntityRenderState state, float limbAngle, float limbDistance) { float limbAngle, float limbDistance) {
if (state.playerName == null) SaturnPlayer player = state.getData(SaturnRenderState.saturnDataKey);
return;
SaturnPlayer player = SaturnPlayer.get(state.playerName.getString());
if (state.invisible || player == null || player.hat.isEmpty()) { if (state.invisible || player == null || player.hat.isEmpty()) {
return; return;
@@ -38,14 +35,9 @@ public class HatFeatureRenderer extends FeatureRenderer<PlayerEntityRenderState,
matrices.multiply(new Quaternionf().rotationZYX(head.roll, head.yaw, head.pitch)); matrices.multiply(new Quaternionf().rotationZYX(head.roll, head.yaw, head.pitch));
ObjModel.cosmetic("hat", player.hat).render(MtlLoader.cosmetic(player.hat), ObjModel.cosmetic("hat", player.hat).render(MtlLoader.cosmetic(player.hat),
matrices, vertexConsumers, light, matrices, queue, light,
OverlayTexture.DEFAULT_UV); OverlayTexture.DEFAULT_UV);
matrices.pop(); matrices.pop();
} }
@Override
public void render(MatrixStack matrices, OrderedRenderCommandQueue queue, int light, PlayerEntityRenderState state,
float limbAngle, float limbDistance) {
}
} }
@@ -13,7 +13,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import de.javagl.obj.Mtl; import de.javagl.obj.Mtl;
import de.javagl.obj.Obj; import de.javagl.obj.Obj;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.command.OrderedRenderCommandQueue;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.resource.Resource; import net.minecraft.resource.Resource;
import net.minecraft.resource.ResourceManager; import net.minecraft.resource.ResourceManager;
@@ -78,7 +78,7 @@ public class ObjModel {
} }
} }
public void render(Map<String, Mtl> mtlMap, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, public void render(Map<String, Mtl> mtlMap, MatrixStack matrices, OrderedRenderCommandQueue queue, int light,
int overlay) { int overlay) {
matrices.push(); matrices.push();
@@ -95,7 +95,7 @@ public class ObjModel {
matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Z.rotationDegrees(config.rotation.z)); matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Z.rotationDegrees(config.rotation.z));
} }
ObjRenderer.renderObj(this.obj, mtlMap, matrices, vertexConsumers, light, overlay); ObjRenderer.renderObj(this.obj, mtlMap, matrices, queue, light, overlay);
matrices.pop(); matrices.pop();
} }
@@ -10,8 +10,9 @@ 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.command.OrderedRenderCommandQueue;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -24,9 +25,12 @@ public class ObjRenderer {
} }
} }
public static void renderObj(Obj obj, Map<String, Mtl> mtlMap, MatrixStack matrices, public static void renderObj(Obj obj,
VertexConsumerProvider vertexConsumers, int light, int overlay) { Map<String, Mtl> mtlMap,
MatrixStack.Entry entry = matrices.peek(); MatrixStack matrices,
OrderedRenderCommandQueue queue,
int light,
int overlay) {
Map<String, Obj> materialGroups = ObjSplitting.splitByMaterialGroups(obj); Map<String, Obj> materialGroups = ObjSplitting.splitByMaterialGroups(obj);
@@ -36,19 +40,15 @@ public class ObjRenderer {
Mtl mtl = mtlMap != null ? mtlMap.get(materialName) : null; Mtl mtl = mtlMap != null ? mtlMap.get(materialName) : null;
// Resolve texture identifier using same logic as ObjUnbakedModelModel
IdentifierRef texture = IdentifierRef.ofVanilla("textures/misc/white.png"); IdentifierRef texture = IdentifierRef.ofVanilla("textures/misc/white.png");
if (mtl != null) { if (mtl != null) {
String mapKd = mtl.getMapKd(); String mapKd = mtl.getMapKd();
if (mapKd != null) { if (mapKd != null && !mapKd.startsWith("#")) {
if (!mapKd.startsWith("#")) {
texture = IdentifierRef.of(mapKd); texture = IdentifierRef.of(mapKd);
} }
} }
}
// Diffuse color (Kd)
float r = 1f, g = 1f, b = 1f; float r = 1f, g = 1f, b = 1f;
if (mtl != null) { if (mtl != null) {
FloatTuple kd = mtl.getKd(); FloatTuple kd = mtl.getKd();
@@ -59,20 +59,24 @@ public class ObjRenderer {
} }
} }
VertexConsumer consumer = vertexConsumers.getBuffer(ShaderUtils.getRenderLayer(texture)); RenderLayer layer = ShaderUtils.getRenderLayer(texture);
int faces = groupObj.getNumFaces();
final float fr = r, fg = g, fb = b; final float fr = r, fg = g, fb = b;
final Obj finalObj = groupObj;
queue.submitCustom(matrices, layer, (e, vertexConsumer) -> {
int faces = finalObj.getNumFaces();
for (int f = 0; f < faces; f++) { for (int f = 0; f < faces; f++) {
ObjFace face = groupObj.getFace(f); ObjFace face = finalObj.getFace(f);
int verts = face.getNumVertices(); int verts = face.getNumVertices();
// Your original winding order logic, untouched
for (int i = verts - 1; i >= 0; i--) { for (int i = verts - 1; i >= 0; i--) {
writeVertex(groupObj, face, i, consumer, entry, light, overlay, fr, fg, fb); writeVertex(finalObj, face, i, vertexConsumer, e, light, overlay, fr, fg, fb);
} }
} }
});
} }
} }
@@ -36,7 +36,7 @@ public class ShaderUtils {
return RenderLayers.entityAlpha((Identifier) (Object) GifUtils.get(texture)); return RenderLayers.entityAlpha((Identifier) (Object) GifUtils.get(texture));
} else if (path.endsWith("end.png")) { } else if (path.endsWith("end.png")) {
// return END_GATEWAY; // return END_GATEWAY;
return null; return RenderLayers.endGateway();
} else { } else {
return RenderLayers.entityAlpha((Identifier) (Object) texture); return RenderLayers.entityAlpha((Identifier) (Object) texture);
} }