From ad6d36fecb38430aa148256c0955ed030b69a970 Mon Sep 17 00:00:00 2001 From: SushiCannibale Date: Thu, 14 Aug 2025 17:43:00 +0200 Subject: [PATCH] feat: outline tinting --- .../client/model/FlowerCrownItemModel.java | 64 +++++++++++++----- .../client/util/FlowersTint.java | 20 +++--- .../textures/flower/flower_large.png | Bin 141 -> 108 bytes .../textures/flower/flower_outline_large.png | Bin 0 -> 123 bytes .../textures/flower/flower_outline_small.png | Bin 0 -> 103 bytes .../textures/flower/flower_small.png | Bin 112 -> 95 bytes 6 files changed, 57 insertions(+), 27 deletions(-) create mode 100644 src/main/resources/assets/charmsnfabrics/textures/flower/flower_outline_large.png create mode 100644 src/main/resources/assets/charmsnfabrics/textures/flower/flower_outline_small.png diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/model/FlowerCrownItemModel.java b/src/main/java/fr/sushi/charmsnfabrics/client/model/FlowerCrownItemModel.java index 704d482..89934ca 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/model/FlowerCrownItemModel.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/model/FlowerCrownItemModel.java @@ -67,7 +67,7 @@ public class FlowerCrownItemModel implements ItemModel Vector2f uv = TRANSLATIONS.get(layer); return new Transformation( 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) @@ -77,6 +77,21 @@ public class FlowerCrownItemModel implements ItemModel "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 */ @@ -95,32 +110,48 @@ public class FlowerCrownItemModel implements ItemModel return new BlockModelWrapper(List.of(), quads, this.renderProperties); } - private ItemModel bakeLayer(int layer, ItemStack flower) + private List bakeModel(ResourceLocation textureLocation, + int layer) { - SpriteGetter sprites = this.context.blockModelBaker().sprites(); - Material material = - ClientHooks.getBlockMaterial(this.getFlowerLocation(layer)); - TextureAtlasSprite sprite = sprites.get(material, DEBUG_NAME); + TextureAtlasSprite sprite = this.getSprite(textureLocation); List bits = UnbakedElementsHelper.createUnbakedItemElements(0, sprite); + return UnbakedElementsHelper.bakeElements(bits, $ -> sprite, + new ComposedModelState(BlockModelRotation.X0_Y0, + this.getTransform(layer))); + } + + private ItemModel bakeOutline(int layer) + { List quads = - UnbakedElementsHelper.bakeElements(bits, $ -> sprite, - new ComposedModelState(BlockModelRotation.X0_Y0, - this.getTransform(layer))); + this.bakeModel(this.getOutlineLocation(layer), layer); return new BlockModelWrapper(List.of(new FlowersTint(layer)), quads, this.renderProperties); } - private ItemModel composeModel(FlowerCrownContent content) + private ItemModel bakeFlower(int layer) + { + List models = new ArrayList<>(); + models.add(this.bakeOutline(layer)); + + List 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 models = new ArrayList<>(); models.add(this.bakeBase()); 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); } @@ -133,13 +164,12 @@ public class FlowerCrownItemModel implements ItemModel { FlowerCrownContent comp = stack.get( CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get()); - if (comp == null) + if (comp != null) { - comp = new FlowerCrownContent(List.of()); + this.bakeFlowerCrown(comp) + .update(renderState, stack, itemModelResolver, displayContext, + level, entity, seed); } - this.composeModel(comp) - .update(renderState, stack, itemModelResolver, displayContext, - level, entity, seed); } public record Unbaked(ResourceLocation base) implements ItemModel.Unbaked diff --git a/src/main/java/fr/sushi/charmsnfabrics/client/util/FlowersTint.java b/src/main/java/fr/sushi/charmsnfabrics/client/util/FlowersTint.java index 133576a..8fde5ec 100644 --- a/src/main/java/fr/sushi/charmsnfabrics/client/util/FlowersTint.java +++ b/src/main/java/fr/sushi/charmsnfabrics/client/util/FlowersTint.java @@ -7,7 +7,6 @@ import fr.sushi.charmsnfabrics.common.CnFRegistries; import fr.sushi.charmsnfabrics.common.data.FlowerCrownContent; import net.minecraft.client.color.item.ItemTintSource; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.tags.ItemTags; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.DyeColor; 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, @Nullable LivingEntity entity) { - FlowerCrownContent data = - stack.get(CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get()); + FlowerCrownContent data = stack.get( + CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get()); if (data != null) { ItemStack flower = data.flowers().get(this.layer); - if (flower.is(ItemTags.FLOWERS)) { - - } - if (flower.is(Items.POPPY)) + if (flower.is(Items.BLUE_ORCHID)) { - 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; diff --git a/src/main/resources/assets/charmsnfabrics/textures/flower/flower_large.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower_large.png index 40fa1b01fec8ef7015cbe0982702a11249493093..7f48c28f505bcdf3b40f03a82845f660ae2b5404 100644 GIT binary patch delta 65 zcmeBW%$Z)?C7-G?zoFKt^ShnWw(trQ|OaK4><%y)R0)iz)*IU V`cO954U? delta 98 zcmd1lWt?CbF=7-G?zoFKv4EK~FU-{1e=-{1fLIQVdj|L6UO*?45)l_fq%HeGJ` zEpKmR00e*PzjB>ZlZ>hU_~`#uas3Zfi6T5~3=A^_m8vEczE))b0#8>zmvv4FO#q^U BDV6{L diff --git a/src/main/resources/assets/charmsnfabrics/textures/flower/flower_outline_large.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower_outline_large.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd724b71925c6bc9c11f2e3a1538462cbdffbd2 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Og&v3Lo9le z6C_xhWorKa`}_a<`}_YVua%URmNj@dX~+MM%3)@n4{mjf|6jki!f~Fs8>1{EgOY_z V{H3{_aX^>bP0l+XkK-EJF_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/charmsnfabrics/textures/flower/flower_small.png b/src/main/resources/assets/charmsnfabrics/textures/flower/flower_small.png index a25efa437c7b5be914055797ead2308ff562b1e7..3f0646c342aaac1c96fd7008a193e2aa0e7f18c8 100644 GIT binary patch delta 51 zcmXSjpJ1pb>FMGaV$qwNAi;WAw&w2AfAtIQ8gR9-F)*kzGF|g;T#>;51fH&bF6*2U FngGiX5f1}%WV$qwNAi>%!Q}h4dUwcJUpC2awt#b|(ygka@)b@ZyBvX#nnUjIx X>l;Bftve;{3_#%N>gTe~DWM4fja3;r