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);
player = null;
if (player == null) {
return;
}
@@ -4,9 +4,9 @@ import org.joml.Quaternionf;
import org.saturnclient.client.player.SaturnPlayer;
import org.saturnclient.impl.cosmetics.obj.MtlLoader;
import org.saturnclient.impl.cosmetics.obj.ObjModel;
import org.saturnclient.saturnclient.SaturnRenderState;
import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.command.OrderedRenderCommandQueue;
import net.minecraft.client.render.entity.feature.FeatureRenderer;
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
@@ -20,13 +20,10 @@ public class HatFeatureRenderer extends FeatureRenderer<PlayerEntityRenderState,
super(context);
}
// @Override
public void render(MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light,
PlayerEntityRenderState state, float limbAngle, float limbDistance) {
if (state.playerName == null)
return;
SaturnPlayer player = SaturnPlayer.get(state.playerName.getString());
@Override
public void render(MatrixStack matrices, OrderedRenderCommandQueue queue, int light, PlayerEntityRenderState state,
float limbAngle, float limbDistance) {
SaturnPlayer player = state.getData(SaturnRenderState.saturnDataKey);
if (state.invisible || player == null || player.hat.isEmpty()) {
return;
@@ -38,14 +35,9 @@ public class HatFeatureRenderer extends FeatureRenderer<PlayerEntityRenderState,
matrices.multiply(new Quaternionf().rotationZYX(head.roll, head.yaw, head.pitch));
ObjModel.cosmetic("hat", player.hat).render(MtlLoader.cosmetic(player.hat),
matrices, vertexConsumers, light,
matrices, queue, light,
OverlayTexture.DEFAULT_UV);
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.Obj;
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.resource.Resource;
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) {
matrices.push();
@@ -95,7 +95,7 @@ public class ObjModel {
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();
}
@@ -10,8 +10,9 @@ import org.saturnclient.impl.cosmetics.utils.ShaderUtils;
import de.javagl.obj.*;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.RenderLayer;
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.util.Identifier;
@@ -24,9 +25,12 @@ public class ObjRenderer {
}
}
public static void renderObj(Obj obj, Map<String, Mtl> mtlMap, MatrixStack matrices,
VertexConsumerProvider vertexConsumers, int light, int overlay) {
MatrixStack.Entry entry = matrices.peek();
public static void renderObj(Obj obj,
Map<String, Mtl> mtlMap,
MatrixStack matrices,
OrderedRenderCommandQueue queue,
int light,
int overlay) {
Map<String, Obj> materialGroups = ObjSplitting.splitByMaterialGroups(obj);
@@ -36,19 +40,15 @@ public class ObjRenderer {
Mtl mtl = mtlMap != null ? mtlMap.get(materialName) : null;
// Resolve texture identifier using same logic as ObjUnbakedModelModel
IdentifierRef texture = IdentifierRef.ofVanilla("textures/misc/white.png");
if (mtl != null) {
String mapKd = mtl.getMapKd();
if (mapKd != null) {
if (!mapKd.startsWith("#")) {
texture = IdentifierRef.of(mapKd);
}
if (mapKd != null && !mapKd.startsWith("#")) {
texture = IdentifierRef.of(mapKd);
}
}
// Diffuse color (Kd)
float r = 1f, g = 1f, b = 1f;
if (mtl != null) {
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 Obj finalObj = groupObj;
for (int f = 0; f < faces; f++) {
ObjFace face = groupObj.getFace(f);
int verts = face.getNumVertices();
queue.submitCustom(matrices, layer, (e, vertexConsumer) -> {
// Your original winding order logic, untouched
for (int i = verts - 1; i >= 0; i--) {
writeVertex(groupObj, face, i, consumer, entry, light, overlay, fr, fg, fb);
int faces = finalObj.getNumFaces();
for (int f = 0; f < faces; f++) {
ObjFace face = finalObj.getFace(f);
int verts = face.getNumVertices();
for (int i = verts - 1; i >= 0; i--) {
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));
} else if (path.endsWith("end.png")) {
// return END_GATEWAY;
return null;
return RenderLayers.endGateway();
} else {
return RenderLayers.entityAlpha((Identifier) (Object) texture);
}