56 changes: 56 additions & 0 deletions .github/workflows/tag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -447,3 +447,59 @@ jobs:
name: ${{github.ref_name}}-1.20.6 - Fabric
files: 'versions/1.20.6-fabric/build/libs/!(*-@(dev|sources|javadoc|all)).jar'
game-versions: 1.20.6
- name: Publish-1.21-fabric-Curseforge
uses: Kir-Antipov/mc-publish@v3.3.0
with:
curseforge-id: 521480
curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }}
loaders: fabric
name: ${{github.ref_name}}-1.21 - Fabric
files: 'versions/1.21-fabric/build/libs/!(*-@(dev|sources|javadoc|all)).jar'
game-versions: 1.21
- name: Publish-1.21-fabric-Modrinth
uses: Kir-Antipov/mc-publish@v3.3.0
with:
modrinth-id: zV5r3pPn
modrinth-token: ${{ secrets.MODRINTH_TOKEN }}
loaders: fabric
name: ${{github.ref_name}}-1.21 - Fabric
files: 'versions/1.21-fabric/build/libs/!(*-@(dev|sources|javadoc|all)).jar'
game-versions: 1.21
- name: Publish-1.21-forge-Curseforge
uses: Kir-Antipov/mc-publish@v3.3.0
with:
curseforge-id: 521480
curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }}
loaders: forge
name: ${{github.ref_name}}-1.21 - Forge
version-type: beta
files: 'versions/1.21-forge/build/libs/!(*-@(dev|sources|javadoc)).jar'
game-versions: 1.21
- name: Publish-1.21-forge-Modrinth
uses: Kir-Antipov/mc-publish@v3.3.0
with:
modrinth-id: zV5r3pPn
modrinth-token: ${{ secrets.MODRINTH_TOKEN }}
loaders: forge
name: ${{github.ref_name}}-1.21 - Forge
files: 'versions/1.21-forge/build/libs/!(*-@(dev|sources|javadoc)).jar'
game-versions: 1.21
- name: Publish-1.21-neoforge-Curseforge
uses: Kir-Antipov/mc-publish@v3.3.0
with:
curseforge-id: 521480
curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }}
loaders: neoforge
name: ${{github.ref_name}}-1.21 - NeoForge
version-type: beta
files: 'versions/1.21-neoforge/build/libs/!(*-@(dev|sources|javadoc|all)).jar'
game-versions: 1.21
- name: Publish-1.21-neoforge-Modrinth
uses: Kir-Antipov/mc-publish@v3.3.0
with:
modrinth-id: zV5r3pPn
modrinth-token: ${{ secrets.MODRINTH_TOKEN }}
loaders: neoforge
name: ${{github.ref_name}}-1.21 - NeoForge
files: 'versions/1.21-neoforge/build/libs/!(*-@(dev|sources|javadoc|all)).jar'
game-versions: 1.21
2 changes: 1 addition & 1 deletion gradle-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ source: "https://github.com/tr7zw/ProcessedModTemplate/tree/master"
replacements:
name: "3d-Skin-Layers"
id: "skinlayers3d"
version: "1.6.5"
version: "1.6.6"
description: "Renders the player skin layer in 3d"
homepageUrl: "https://modrinth.com/mod/3dskinlayers"
sourcesUrl: "https://github.com/tr7zw/3d-skin-layers"
Expand Down
Binary file modified gradle/gradle-compose.jar
Binary file not shown.
5 changes: 4 additions & 1 deletion settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
"1.20.4-fabric",
"1.20.6-forge",
"1.20.6-neoforge",
"1.20.6-fabric"
"1.20.6-fabric",
"1.21-fabric",
"1.21-forge",
"1.21-neoforge"
]
}
8 changes: 4 additions & 4 deletions src/main/java/dev/tr7zw/skinlayers/SkinUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import dev.tr7zw.skinlayers.accessor.PlayerSettings;
import dev.tr7zw.skinlayers.accessor.SkullSettings;
import dev.tr7zw.skinlayers.api.SkinLayersAPI;
import dev.tr7zw.skinlayers.util.NMSWrapper;
import dev.tr7zw.util.NMSHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.player.AbstractClientPlayer;
Expand All @@ -40,7 +40,7 @@ public void onRemoval(RemovalNotification<AbstractTexture, NativeImage> notifica
}).build();

private static NativeImage getSkinTexture(AbstractClientPlayer player) {
return getTexture(NMSWrapper.getPlayerSkin(player), null);
return getTexture(NMSHelper.getPlayerSkin(player), null);
}

private static NativeImage getTexture(ResourceLocation resourceLocation, SkullSettings settings) {
Expand Down Expand Up @@ -121,7 +121,7 @@ private static NativeImage getTexture(ResourceLocation resourceLocation, SkullSe

public static boolean setup3dLayers(AbstractClientPlayer abstractClientPlayerEntity, PlayerSettings settings,
boolean thinArms, PlayerModel<AbstractClientPlayer> model) {
ResourceLocation skinLocation = NMSWrapper.getPlayerSkin(abstractClientPlayerEntity);
ResourceLocation skinLocation = NMSHelper.getPlayerSkin(abstractClientPlayerEntity);
if (skinLocation == null) {
return false;// this *should* never happen, but just to be sure
}
Expand Down Expand Up @@ -162,7 +162,7 @@ public static boolean setup3dLayers(GameProfile gameprofile, SkullSettings setti
if (gameprofile == null) {
return false; // no gameprofile
}
ResourceLocation playerSkin = NMSWrapper.getPlayerSkin(gameprofile);
ResourceLocation playerSkin = NMSHelper.getPlayerSkin(gameprofile);
if (playerSkin == null) {
return false; // no skin
}
Expand Down
9 changes: 6 additions & 3 deletions src/main/java/dev/tr7zw/skinlayers/api/Mesh.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void setPosition(float x, float y, float z) {

@Override
public void render(ModelPart vanillaModel, PoseStack poseStack, VertexConsumer vertexConsumer, int light,
int overlay, float red, float green, float blue, float alpha) {
int overlay, int color) {
}

@Override
Expand All @@ -52,11 +52,14 @@ public void copyFrom(ModelPart modelPart) {
};

public default void render(PoseStack poseStack, VertexConsumer vertexConsumer, int light, int overlay) {
render(null, poseStack, vertexConsumer, light, overlay, 1.0F, 1.0F, 1.0F, 1.0F);
render(null, poseStack, vertexConsumer, light, overlay, 0xFFFFFFFF);
}

/**
* @param color The color, in ARGB format
*/
public void render(ModelPart vanillaModel, PoseStack poseStack, VertexConsumer vertexConsumer, int light,
int overlay, float red, float green, float blue, float alpha);
int overlay, int color);

public void setPosition(float x, float y, float z);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import dev.tr7zw.skinlayers.SkinUtil;
import dev.tr7zw.skinlayers.SkullRendererCache.ItemSettings;
import dev.tr7zw.skinlayers.accessor.SkullSettings;
import dev.tr7zw.skinlayers.util.NMSWrapper;
import dev.tr7zw.util.NMSHelper;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource;

Expand Down Expand Up @@ -54,7 +54,7 @@ public void renderByItem(ItemStack itemStack, ItemDisplayContext itemDisplayCont
if (item instanceof BlockItem) {
Block block = ((BlockItem) item).getBlock();
if (block instanceof AbstractSkullBlock) {
GameProfile gameProfile = NMSWrapper.getGameProfile(itemStack);
GameProfile gameProfile = NMSHelper.getGameProfile(itemStack);
if (gameProfile != null) {
lastSkull = (SkullSettings) itemCache.computeIfAbsent(itemStack, it -> new ItemSettings());
if (!lastSkull.initialized() && lastSkull.getHeadLayers() == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
import dev.tr7zw.skinlayers.SkinUtil;
import dev.tr7zw.skinlayers.SkullRendererCache.ItemSettings;
import dev.tr7zw.skinlayers.accessor.SkullSettings;
import dev.tr7zw.skinlayers.util.NMSWrapper;
import dev.tr7zw.util.NMSHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.model.HeadedModel;
Expand All @@ -38,8 +38,8 @@ public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int
float g, float h, float j, float k, float l, CallbackInfo info) {
if (!SkinLayersModBase.config.enableSkulls)
return;
if (Minecraft.getInstance().player != null && livingEntity
.distanceToSqr(Minecraft.getInstance().gameRenderer.getMainCamera().getPosition()) > SkinLayersModBase.config.renderDistanceLOD
if (Minecraft.getInstance().player != null && livingEntity.distanceToSqr(Minecraft.getInstance().gameRenderer
.getMainCamera().getPosition()) > SkinLayersModBase.config.renderDistanceLOD
* SkinLayersModBase.config.renderDistanceLOD) {
return; // too far away
}
Expand All @@ -48,7 +48,7 @@ public void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int
return;
Item item = itemStack.getItem();
if (item instanceof BlockItem && ((BlockItem) item).getBlock() instanceof AbstractSkullBlock) {
GameProfile gameProfile = NMSWrapper.getGameProfile(itemStack);
GameProfile gameProfile = NMSHelper.getGameProfile(itemStack);
if (gameProfile != null) {
lastSkull = (SkullSettings) itemCache.computeIfAbsent(itemStack, it -> new ItemSettings());
if (!lastSkull.initialized() && lastSkull.getHeadLayers() == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,13 @@
import dev.tr7zw.skinlayers.accessor.PlayerSettings;
import dev.tr7zw.skinlayers.api.Mesh;
import dev.tr7zw.skinlayers.renderlayers.CustomLayerFeatureRenderer;
import dev.tr7zw.skinlayers.util.NMSWrapper;
import dev.tr7zw.util.NMSHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.model.PlayerModel;
import net.minecraft.client.model.geom.ModelPart;
import net.minecraft.client.player.AbstractClientPlayer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.client.renderer.entity.player.PlayerRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
Expand All @@ -29,7 +28,7 @@
//#if MC >= 11700
import net.minecraft.client.renderer.entity.EntityRendererProvider.Context;
//#else
//$$
//$$ import net.minecraft.client.renderer.entity.EntityRenderDispatcher;
//#endif
// spotless:on

Expand Down Expand Up @@ -66,9 +65,10 @@ public void setModelProperties(AbstractClientPlayer abstractClientPlayer, Callba
this.addLayer(new CustomLayerFeatureRenderer(this));
loaded = true;
}
if (Minecraft.getInstance().player == null || abstractClientPlayer
.distanceToSqr(Minecraft.getInstance().gameRenderer.getMainCamera().getPosition()) > SkinLayersModBase.config.renderDistanceLOD
* SkinLayersModBase.config.renderDistanceLOD) {
if (Minecraft.getInstance().player == null
|| abstractClientPlayer.distanceToSqr(Minecraft.getInstance().gameRenderer.getMainCamera()
.getPosition()) > SkinLayersModBase.config.renderDistanceLOD
* SkinLayersModBase.config.renderDistanceLOD) {
return;
}
PlayerModel<AbstractClientPlayer> playerModel = this.getModel();
Expand Down Expand Up @@ -128,7 +128,7 @@ private void renderHand(PoseStack poseStack, MultiBufferSource multiBufferSource
part.setPosition(x, y, 0);
part.render(poseStack,
multiBufferSource
.getBuffer(RenderType.entityTranslucent(NMSWrapper.getPlayerSkin(abstractClientPlayer))),
.getBuffer(RenderType.entityTranslucent(NMSHelper.getPlayerSkin(abstractClientPlayer))),
i, OverlayTexture.NO_OVERLAY);
part.setPosition(0, 0, 0);
part.setRotation(0, 0, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,15 @@
import dev.tr7zw.skinlayers.accessor.SkullModelAccessor;
import dev.tr7zw.skinlayers.accessor.SkullSettings;
import dev.tr7zw.skinlayers.api.Mesh;
import dev.tr7zw.skinlayers.util.NMSWrapper;
import dev.tr7zw.util.NMSHelper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.blockentity.SkullBlockRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.entity.SkullBlockEntity;
import net.minecraft.world.phys.Vec3;
// spotless:off
Expand Down Expand Up @@ -75,7 +73,7 @@ public void render(SkullBlockEntity skullBlockEntity, float f, PoseStack poseSta
//#endif
if (gameProfile == null)
return;
ResourceLocation textureLocation = NMSWrapper.getPlayerSkin(gameProfile);
ResourceLocation textureLocation = NMSHelper.getPlayerSkin(gameProfile);
if (textureLocation != lastSkull.getLastTexture()) {
lastSkull.setInitialized(false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,52 @@ public void render(PoseStack poseStack, VertexConsumer vertexConsumer, int i, in
render(null, poseStack, vertexConsumer, i, j, 1.0F, 1.0F, 1.0F, 1.0F);
}

private int convertFloatColorToInteger(float color) {
return color > 1F ? 255 : Math.round(color * 255F);
}

/**
* Kept for some mod (like ETF) shadowing the old render method to call
*/
@Deprecated(forRemoval = true)
public void render(ModelPart vanillaModel, PoseStack poseStack, VertexConsumer vertexConsumer, int light,
int overlay, float red, float green, float blue, float alpha) {
var color = (convertFloatColorToInteger(alpha) & 0xFF) << 24 | (convertFloatColorToInteger(red) & 0xFF) << 16
| (convertFloatColorToInteger(green) & 0xFF) << 8 | convertFloatColorToInteger(blue) & 0xFF;

render(vanillaModel, poseStack, vertexConsumer, light, overlay, color);
}

/**
* @param color Color, in ARGB format
*/
public void render(ModelPart vanillaModel, PoseStack poseStack, VertexConsumer vertexConsumer, int light,
int overlay, int color) {
if (!this.visible)
return;
poseStack.pushPose();
translateAndRotate(poseStack);
compile(vanillaModel, poseStack.last(), vertexConsumer, light, overlay, red, green, blue, alpha);
for (ModelPart modelPart : this.children.values())
modelPart.render(poseStack, vertexConsumer, light, overlay, red, green, blue, alpha);
compile(vanillaModel, poseStack.last(), vertexConsumer, light, overlay, color);

// spotless:off
//#if MC < 12100
//$$ float r,g,b,a;
//$$ a = ((color >> 24) & 0xFF) / 255F;
//$$ r = ((color >> 16) & 0xFF) / 255F;
//$$ g = ((color >> 8) & 0xFF) / 255F;
//$$ b = (color & 0xFF) / 255F;
//#endif
//spotless:on

for (ModelPart modelPart : this.children.values()) {
// spotless:off
//#if MC >= 12100
modelPart.render(poseStack, vertexConsumer, light, overlay, color);
//#else
//$$ modelPart.render(poseStack, vertexConsumer, light, overlay, r, g, b, a);
//#endif
//spotless:on
}
poseStack.popPose();
}

Expand All @@ -109,11 +146,22 @@ public void translateAndRotate(PoseStack poseStack) {
private Vector4f vector4f[] = new Vector4f[] { new Vector4f(), new Vector4f(), new Vector4f(), new Vector4f() };

private void compile(ModelPart vanillaModel, PoseStack.Pose pose, VertexConsumer vertexConsumer, int light,
int overlay, float red, float green, float blue, float alpha) {
int overlay, int color) {
MeshTransformer transformer = SkinLayersAPI.getMeshTransformerProvider().prepareTransformer(vanillaModel);
// compacted Cubes
Matrix4f matrix4f = pose.pose();
Matrix3f matrix3f = pose.normal();

// spotless:off
//#if MC < 12100
//$$ float red,green,blue,alpha;
//$$ alpha = ((color >> 24) & 0xFF) / 255F;
//$$ red = ((color >> 16) & 0xFF) / 255F;
//$$ green = ((color >> 8) & 0xFF) / 255F;
//$$ blue = (color & 0xFF) / 255F;
//#endif
//spotless:on

for (int id = 0; id < polygonData.length; id += polyDataSize) {
Vector3f vector3f = new Vector3f(polygonData[id + 0], polygonData[id + 1], polygonData[id + 2]);
for (int o = 0; o < 4; o++) {
Expand All @@ -133,19 +181,32 @@ private void compile(ModelPart vanillaModel, PoseStack.Pose pose, VertexConsumer
//$$ for (int o = 0; o < 4; o++) {
//$$ vector4f[o].transform(matrix4f);
//#endif
//spotless:on
vertexConsumer.vertex(vector4f[o].x(), vector4f[o].y(), vector4f[o].z(), red, green, blue, alpha,
polygonData[id + 3 + (o * 5) + 3], polygonData[id + 3 + (o * 5) + 4], overlay, light,
vector3f.x(), vector3f.y(), vector3f.z());
//#if MC >= 12100
vertexConsumer.addVertex(vector4f[o].x(), vector4f[o].y(), vector4f[o].z());
vertexConsumer.setColor(color);
vertexConsumer.setUv(polygonData[id + 3 + (o * 5) + 3], polygonData[id + 3 + (o * 5) + 4]);
vertexConsumer.setOverlay(overlay);
vertexConsumer.setLight(light);
vertexConsumer.setNormal(vector3f.x(), vector3f.y(), vector3f.z());
//#else
//$$ vertexConsumer.vertex(vector4f[o].x(), vector4f[o].y(), vector4f[o].z(),
//$$ red, green, blue, alpha,
//$$ polygonData[id + 3 + (o * 5) + 3], polygonData[id + 3 + (o * 5) + 4],
//$$ overlay, light,
//$$ vector3f.x(), vector3f.y(), vector3f.z());
//#endif
//spotless:on
}
}

// other cubes
for (Cube cube : this.cubes) {
transformer.transform(cube);
// spotless:off
//#if MC >= 11700
cube.compile(pose, vertexConsumer, light, overlay, red, green, blue, alpha);
//#if MC >= 12100
cube.compile(pose, vertexConsumer, light, overlay, color);
//#elseif MC >= 11700
//$$ cube.compile(pose, vertexConsumer, light, overlay, red, green, blue, alpha);
//#else
//$$ for (ModelPart.Polygon polygon : cube.polygons) {
//$$ Vector3f vector3f = polygon.normal.copy();
Expand Down
Loading