Clean up a bit and allow for setting alpha

This commit is contained in:
Sollace 2024-05-04 22:01:10 +01:00
parent 93a895e90e
commit 0da671b699
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
3 changed files with 71 additions and 38 deletions

@ -1 +1 @@
Subproject commit c4f3e09c933521749a7d349c39e212ffabd1b375 Subproject commit 9932af1fa278a481fe262fbd2ed95510942b5638

View file

@ -35,32 +35,57 @@ public interface ArmourRendererPlugin {
return new ItemStack[] { entity.getEquippedStack(armorSlot) }; return new ItemStack[] { entity.getEquippedStack(armorSlot) };
} }
default boolean shouldRenderGlint(EquipmentSlot slot, ItemStack stack) { default float getGlintAlpha(EquipmentSlot slot, ItemStack stack) {
return stack.hasGlint(); return stack.hasGlint() ? 1 : 0;
} }
default int getDyeColor(EquipmentSlot slot, ItemStack stack) { default int getDyeColor(EquipmentSlot slot, ItemStack stack) {
return stack.isIn(ItemTags.DYEABLE) ? DyedColorComponent.getColor(stack, -6265536) : Colors.WHITE; return stack.isIn(ItemTags.DYEABLE) ? DyedColorComponent.getColor(stack, -6265536) : Colors.WHITE;
} }
default float getArmourAlpha(EquipmentSlot slot, ArmourLayer layer) {
return 1F;
}
default float getTrimAlpha(EquipmentSlot slot, RegistryEntry<ArmorMaterial> material, ArmorTrim trim, ArmourLayer layer) {
return 1F;
}
@Nullable @Nullable
default VertexConsumer getTrimConsumer(EquipmentSlot slot, VertexConsumerProvider provider, RegistryEntry<ArmorMaterial> material, ArmorTrim trim, ArmourLayer layer) { default VertexConsumer getTrimConsumer(EquipmentSlot slot, VertexConsumerProvider provider, RegistryEntry<ArmorMaterial> material, ArmorTrim trim, ArmourLayer layer) {
@Nullable RenderLayer renderLayer = getTrimLayer(slot, material, trim, layer);
if (renderLayer == null) {
return null;
}
SpriteAtlasTexture armorTrimsAtlas = MinecraftClient.getInstance().getBakedModelManager().getAtlas(TexturedRenderLayers.ARMOR_TRIMS_ATLAS_TEXTURE); SpriteAtlasTexture armorTrimsAtlas = MinecraftClient.getInstance().getBakedModelManager().getAtlas(TexturedRenderLayers.ARMOR_TRIMS_ATLAS_TEXTURE);
Sprite sprite = armorTrimsAtlas.getSprite( Sprite sprite = armorTrimsAtlas.getSprite(layer == ArmourLayer.INNER ? trim.getLeggingsModelId(material) : trim.getGenericModelId(material));
layer == ArmourLayer.INNER ? trim.getLeggingsModelId(material) : trim.getGenericModelId(material) return sprite.getTextureSpecificVertexConsumer(provider.getBuffer(renderLayer));
); }
return sprite.getTextureSpecificVertexConsumer(
provider.getBuffer(TexturedRenderLayers.getArmorTrims(trim.getPattern().value().decal())) @Nullable
); default RenderLayer getTrimLayer(EquipmentSlot slot, RegistryEntry<ArmorMaterial> material, ArmorTrim trim, ArmourLayer layer) {
return TexturedRenderLayers.getArmorTrims(trim.getPattern().value().decal());
} }
@Nullable @Nullable
default VertexConsumer getArmourConsumer(EquipmentSlot slot, VertexConsumerProvider provider, Identifier texture, ArmourLayer layer) { default VertexConsumer getArmourConsumer(EquipmentSlot slot, VertexConsumerProvider provider, Identifier texture, ArmourLayer layer) {
return provider.getBuffer(RenderLayer.getArmorCutoutNoCull(texture)); @Nullable RenderLayer renderLayer = getArmourLayer(slot, texture, layer);
return renderLayer == null ? null : provider.getBuffer(renderLayer);
}
@Nullable
default RenderLayer getArmourLayer(EquipmentSlot slot, Identifier texture, ArmourLayer layer) {
return RenderLayer.getArmorCutoutNoCull(texture);
} }
@Nullable @Nullable
default VertexConsumer getGlintConsumer(EquipmentSlot slot, VertexConsumerProvider provider, ArmourLayer layer) { default VertexConsumer getGlintConsumer(EquipmentSlot slot, VertexConsumerProvider provider, ArmourLayer layer) {
return provider.getBuffer(RenderLayer.getArmorEntityGlint()); @Nullable RenderLayer renderLayer = getGlintLayer(slot, layer);
return renderLayer == null ? null : provider.getBuffer(renderLayer);
}
@Nullable
default RenderLayer getGlintLayer(EquipmentSlot slot, ArmourLayer layer) {
return RenderLayer.getArmorEntityGlint();
} }
} }

View file

@ -56,36 +56,41 @@ public class ArmourFeature<T extends LivingEntity, M extends EntityModel<T> & Po
continue; continue;
} }
boolean glint = plugin.shouldRenderGlint(armorSlot, stack); float glintAlpha = plugin.getGlintAlpha(armorSlot, stack);
boolean glint = glintAlpha > 0;
int color = plugin.getDyeColor(armorSlot, stack); int color = plugin.getDyeColor(armorSlot, stack);
Set<PonyArmourModel<?>> models = glint ? new HashSet<>() : null; Set<PonyArmourModel<?>> models = glint ? new HashSet<>() : null;
ArmourTextureLookup textureLookup = plugin.getTextureLookup(); ArmourTextureLookup textureLookup = plugin.getTextureLookup();
for (ArmorMaterial.Layer armorLayer : textureLookup.getArmorLayers(stack, color)) { float alpha = plugin.getArmourAlpha(armorSlot, layer);
ArmourTexture layerTexture = textureLookup.getTexture(stack, layer, armorLayer);
if (layerTexture == ArmourTexture.UNKNOWN) { if (alpha > 0) {
continue; for (ArmorMaterial.Layer armorLayer : textureLookup.getArmorLayers(stack, color)) {
} ArmourTexture layerTexture = textureLookup.getTexture(stack, layer, armorLayer);
var m = pony.getArmourModel(stack, layer, layerTexture.variant()).orElse(null); if (layerTexture == ArmourTexture.UNKNOWN) {
if (m != null && m.poseModel(entity, limbAngle, limbDistance, age, headYaw, headPitch, armorSlot, layer, pony.body())) { continue;
VertexConsumer armorConsumer = plugin.getArmourConsumer(armorSlot, provider, layerTexture.texture(), layer);
if (armorConsumer != null) {
float red = 1;
float green = 1;
float blue = 1;
if (armorLayer.isDyeable() && color != Colors.WHITE) {
red = Color.r(color);
green = Color.g(color);
blue = Color.b(color);
}
m.render(matrices, armorConsumer, light, OverlayTexture.DEFAULT_UV, red, green, blue, 1);
} }
if (glint) {
models.add(m); var m = pony.getArmourModel(stack, layer, layerTexture.variant()).orElse(null);
if (m != null && m.poseModel(entity, limbAngle, limbDistance, age, headYaw, headPitch, armorSlot, layer, pony.body())) {
VertexConsumer armorConsumer = plugin.getArmourConsumer(armorSlot, provider, layerTexture.texture(), layer);
if (armorConsumer != null) {
float red = 1;
float green = 1;
float blue = 1;
if (armorLayer.isDyeable() && color != Colors.WHITE) {
red = Color.r(color);
green = Color.g(color);
blue = Color.b(color);
}
m.render(matrices, armorConsumer, light, OverlayTexture.DEFAULT_UV, red, green, blue, alpha);
}
if (glint) {
models.add(m);
}
} }
} }
} }
@ -93,11 +98,14 @@ public class ArmourFeature<T extends LivingEntity, M extends EntityModel<T> & Po
ArmorTrim trim = stack.get(DataComponentTypes.TRIM); ArmorTrim trim = stack.get(DataComponentTypes.TRIM);
if (trim != null && stack.getItem() instanceof ArmorItem armor) { if (trim != null && stack.getItem() instanceof ArmorItem armor) {
var m = pony.getArmourModel(stack, layer, ArmourVariant.TRIM).orElse(null); float trimAlpha = plugin.getTrimAlpha(armorSlot, armor.getMaterial(), trim, layer);
if (m != null && m.poseModel(entity, limbAngle, limbDistance, age, headYaw, headPitch, armorSlot, layer, pony.body())) { if (trimAlpha > 0) {
VertexConsumer trimConsumer = plugin.getTrimConsumer(armorSlot, provider, armor.getMaterial(), trim, layer); var m = pony.getArmourModel(stack, layer, ArmourVariant.TRIM).orElse(null);
if (trimConsumer != null) { if (m != null && m.poseModel(entity, limbAngle, limbDistance, age, headYaw, headPitch, armorSlot, layer, pony.body())) {
m.render(matrices, trimConsumer, light, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1); VertexConsumer trimConsumer = plugin.getTrimConsumer(armorSlot, provider, armor.getMaterial(), trim, layer);
if (trimConsumer != null) {
m.render(matrices, trimConsumer, light, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1);
}
} }
} }
} }
@ -106,7 +114,7 @@ public class ArmourFeature<T extends LivingEntity, M extends EntityModel<T> & Po
VertexConsumer glintConsumer = plugin.getGlintConsumer(armorSlot, provider, layer); VertexConsumer glintConsumer = plugin.getGlintConsumer(armorSlot, provider, layer);
if (glintConsumer != null) { if (glintConsumer != null) {
for (var m : models) { for (var m : models) {
m.render(matrices, glintConsumer, light, OverlayTexture.DEFAULT_UV, 1, 1, 1, 1); m.render(matrices, glintConsumer, light, OverlayTexture.DEFAULT_UV, 1, 1, 1, glintAlpha);
} }
} }
} }