feat: outline tinting
Some checks failed
Build / build (push) Has been cancelled

This commit is contained in:
SushiCannibale 2025-08-14 17:43:00 +02:00
parent d393812448
commit ad6d36fecb
6 changed files with 57 additions and 27 deletions

View file

@ -67,7 +67,7 @@ public class FlowerCrownItemModel implements ItemModel
Vector2f uv = TRANSLATIONS.get(layer); Vector2f uv = TRANSLATIONS.get(layer);
return new Transformation( return new Transformation(
new Vector3f(uv.x * 0.0625f, uv.y * 0.0625f, 0.0f), new Vector3f(uv.x * 0.0625f, uv.y * 0.0625f, 0.0f),
new Quaternionf(), new Vector3f(1.002f), new Quaternionf()); new Quaternionf(), new Vector3f(1.001f), new Quaternionf());
} }
private ResourceLocation getFlowerLocation(int layer) private ResourceLocation getFlowerLocation(int layer)
@ -77,6 +77,21 @@ public class FlowerCrownItemModel implements ItemModel
"flower/flower_" + (layer % 2 == 0 ? "large" : "small")); "flower/flower_" + (layer % 2 == 0 ? "large" : "small"));
} }
private ResourceLocation getOutlineLocation(int layer)
{
return ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID,
"flower/flower_outline_" +
(layer % 2 == 0 ? "large" : "small"));
}
private TextureAtlasSprite getSprite(ResourceLocation textureLocation)
{
SpriteGetter sprites = this.context.blockModelBaker().sprites();
Material material = ClientHooks.getBlockMaterial(textureLocation);
return sprites.get(material, DEBUG_NAME);
}
/** /**
* Bakes the base and updates the LayerRenderState quads * Bakes the base and updates the LayerRenderState quads
*/ */
@ -95,32 +110,48 @@ public class FlowerCrownItemModel implements ItemModel
return new BlockModelWrapper(List.of(), quads, this.renderProperties); return new BlockModelWrapper(List.of(), quads, this.renderProperties);
} }
private ItemModel bakeLayer(int layer, ItemStack flower) private List<BakedQuad> bakeModel(ResourceLocation textureLocation,
int layer)
{ {
SpriteGetter sprites = this.context.blockModelBaker().sprites(); TextureAtlasSprite sprite = this.getSprite(textureLocation);
Material material =
ClientHooks.getBlockMaterial(this.getFlowerLocation(layer));
TextureAtlasSprite sprite = sprites.get(material, DEBUG_NAME);
List<BlockElement> bits = List<BlockElement> bits =
UnbakedElementsHelper.createUnbakedItemElements(0, sprite); UnbakedElementsHelper.createUnbakedItemElements(0, sprite);
List<BakedQuad> quads = return UnbakedElementsHelper.bakeElements(bits, $ -> sprite,
UnbakedElementsHelper.bakeElements(bits, $ -> sprite,
new ComposedModelState(BlockModelRotation.X0_Y0, new ComposedModelState(BlockModelRotation.X0_Y0,
this.getTransform(layer))); this.getTransform(layer)));
}
private ItemModel bakeOutline(int layer)
{
List<BakedQuad> quads =
this.bakeModel(this.getOutlineLocation(layer), layer);
return new BlockModelWrapper(List.of(new FlowersTint(layer)), quads, return new BlockModelWrapper(List.of(new FlowersTint(layer)), quads,
this.renderProperties); this.renderProperties);
} }
private ItemModel composeModel(FlowerCrownContent content) private ItemModel bakeFlower(int layer)
{
List<ItemModel> models = new ArrayList<>();
models.add(this.bakeOutline(layer));
List<BakedQuad> quads =
this.bakeModel(this.getFlowerLocation(layer), layer);
models.add(
new BlockModelWrapper(List.of(), quads, this.renderProperties));
return new CompositeModel(models);
}
private ItemModel bakeFlowerCrown(FlowerCrownContent content)
{ {
List<ItemModel> models = new ArrayList<>(); List<ItemModel> models = new ArrayList<>();
models.add(this.bakeBase()); models.add(this.bakeBase());
for (int i = 0; i < content.flowers().size(); i++) for (int i = 0; i < content.flowers().size(); i++)
{ {
if (!content.flowers().get(i).isEmpty()) if (content.flowers().get(i).isEmpty())
{ {
models.add(this.bakeLayer(i, content.flowers().get(i))); continue;
} }
models.add(this.bakeFlower(i));
} }
return new CompositeModel(models); return new CompositeModel(models);
} }
@ -133,14 +164,13 @@ public class FlowerCrownItemModel implements ItemModel
{ {
FlowerCrownContent comp = stack.get( FlowerCrownContent comp = stack.get(
CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get()); CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get());
if (comp == null) if (comp != null)
{ {
comp = new FlowerCrownContent(List.of()); this.bakeFlowerCrown(comp)
}
this.composeModel(comp)
.update(renderState, stack, itemModelResolver, displayContext, .update(renderState, stack, itemModelResolver, displayContext,
level, entity, seed); level, entity, seed);
} }
}
public record Unbaked(ResourceLocation base) implements ItemModel.Unbaked public record Unbaked(ResourceLocation base) implements ItemModel.Unbaked
{ {

View file

@ -7,7 +7,6 @@ import fr.sushi.charmsnfabrics.common.CnFRegistries;
import fr.sushi.charmsnfabrics.common.data.FlowerCrownContent; import fr.sushi.charmsnfabrics.common.data.FlowerCrownContent;
import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.color.item.ItemTintSource;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@ -26,21 +25,22 @@ public record FlowersTint(int layer) implements ItemTintSource
public int calculate(ItemStack stack, @Nullable ClientLevel level, public int calculate(ItemStack stack, @Nullable ClientLevel level,
@Nullable LivingEntity entity) @Nullable LivingEntity entity)
{ {
FlowerCrownContent data = FlowerCrownContent data = stack.get(
stack.get(CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get()); CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get());
if (data != null) if (data != null)
{ {
ItemStack flower = data.flowers().get(this.layer); ItemStack flower = data.flowers().get(this.layer);
if (flower.is(ItemTags.FLOWERS)) { if (flower.is(Items.BLUE_ORCHID))
}
if (flower.is(Items.POPPY))
{ {
return DyeColor.RED.getTextureDiffuseColor(); return DyeColor.LIGHT_BLUE.getTextureDiffuseColor();
} }
else if (flower.is(Items.DANDELION)) else if (flower.is(Items.LILY_OF_THE_VALLEY))
{ {
return DyeColor.YELLOW.getTextureDiffuseColor(); return DyeColor.WHITE.getTextureDiffuseColor();
}
else if (flower.is(Items.PINK_TULIP))
{
return DyeColor.MAGENTA.getTextureDiffuseColor();
} }
} }
return 0xFFFFFFFF; return 0xFFFFFFFF;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 141 B

After

Width:  |  Height:  |  Size: 108 B

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 B

After

Width:  |  Height:  |  Size: 95 B

Before After
Before After