fine tuned transforms
Some checks are pending
Build / build (push) Waiting to run

This commit is contained in:
SushiCannibale 2025-08-14 12:25:41 +02:00
parent 67ae714c64
commit d393812448
2 changed files with 32 additions and 47 deletions

View file

@ -8,7 +8,6 @@ import fr.sushi.charmsnfabrics.client.util.FlowersTint;
import fr.sushi.charmsnfabrics.common.CnFRegistries;
import fr.sushi.charmsnfabrics.common.data.FlowerCrownContent;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.BlockElement;
import net.minecraft.client.renderer.block.model.TextureSlots;
@ -20,12 +19,11 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.neoforged.neoforge.client.ClientHooks;
import net.neoforged.neoforge.client.NeoForgeRenderTypes;
import net.neoforged.neoforge.client.RenderTypeGroup;
import net.neoforged.neoforge.client.model.ComposedModelState;
import net.neoforged.neoforge.client.model.UnbakedElementsHelper;
import org.jetbrains.annotations.Nullable;
import org.joml.Quaternionf;
import org.joml.Vector2f;
import org.joml.Vector3f;
import java.util.ArrayList;
@ -35,39 +33,20 @@ import java.util.Map;
public class FlowerCrownItemModel implements ItemModel
{
private static final Map<Integer, Transformation> TRANSFORMS =
new HashMap<>();
private static final Map<Integer, Vector2f> TRANSLATIONS = new HashMap<>();
/*
* Position the flower on the item model based on the layer (anticlockwise)
*/
static
{
TRANSFORMS.put(0, new Transformation(
new Vector3f(1f * 0.0625f, -4f * 0.0625f, 0.0f),
new Quaternionf(), new Vector3f(1.01f, 1.01f, 1.0625f),
new Quaternionf()));
TRANSFORMS.put(1, new Transformation(
new Vector3f(5f * 0.0625f, -3f * 0.0625f, 0.0f),
new Quaternionf(), new Vector3f(1.01f, 1.01f, 1.0625f),
new Quaternionf()));
TRANSFORMS.put(2, new Transformation(
new Vector3f(5f * 0.0625f, 2f * 0.0625f, 0.0f),
new Quaternionf(), new Vector3f(1.01f, 1.01f, 1.0625f),
new Quaternionf()));
TRANSFORMS.put(3, new Transformation(
new Vector3f(2f * 0.0625f, 4f * 0.0625f, 0.0f),
new Quaternionf(), new Vector3f(1.01f, 1.01f, 1.0625f),
new Quaternionf()));
TRANSFORMS.put(4, new Transformation(
new Vector3f(-3f * 0.0625f, 4f * 0.0625f, 0.0f),
new Quaternionf(), new Vector3f(1.01f, 1.01f, 1.0625f),
new Quaternionf()));
TRANSFORMS.put(5, new Transformation(
new Vector3f(-5f * 0.0625f, 0f * 0.0625f, 0.0f),
new Quaternionf(), new Vector3f(1.01f, 1.01f, 1.0625f),
new Quaternionf()));
TRANSFORMS.put(6, new Transformation(
new Vector3f(-4f * 0.0625f, -3f * 0.0625f, 0.0f),
new Quaternionf(), new Vector3f(1.01f, 1.01f, 1.0625f),
new Quaternionf()));
TRANSLATIONS.put(0, new Vector2f(1, -4));
TRANSLATIONS.put(1, new Vector2f(5, -3));
TRANSLATIONS.put(2, new Vector2f(5, 2));
TRANSLATIONS.put(3, new Vector2f(2, 4));
TRANSLATIONS.put(4, new Vector2f(-3, 4));
TRANSLATIONS.put(5, new Vector2f(-5, 0));
TRANSLATIONS.put(6, new Vector2f(-4, -3));
}
private static final ModelDebugName DEBUG_NAME =
@ -83,6 +62,14 @@ public class FlowerCrownItemModel implements ItemModel
this.context = context;
}
private Transformation getTransform(int layer)
{
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());
}
private ResourceLocation getFlowerLocation(int layer)
{
@ -90,13 +77,6 @@ public class FlowerCrownItemModel implements ItemModel
"flower/flower_" + (layer % 2 == 0 ? "large" : "small"));
}
private static RenderTypeGroup getLayerRenderTypes(boolean unlit)
{
return new RenderTypeGroup(RenderType.translucent(), unlit ?
NeoForgeRenderTypes.ITEM_UNSORTED_UNLIT_TRANSLUCENT.get() :
NeoForgeRenderTypes.ITEM_UNSORTED_TRANSLUCENT.get());
}
/**
* Bakes the base and updates the LayerRenderState quads
*/
@ -126,20 +106,20 @@ public class FlowerCrownItemModel implements ItemModel
List<BakedQuad> quads =
UnbakedElementsHelper.bakeElements(bits, $ -> sprite,
new ComposedModelState(BlockModelRotation.X0_Y0,
TRANSFORMS.get(layer)));
this.getTransform(layer)));
return new BlockModelWrapper(List.of(new FlowersTint(layer)), quads,
this.renderProperties);
}
private ItemModel composeModel(FlowerCrownContent colors)
private ItemModel composeModel(FlowerCrownContent content)
{
List<ItemModel> models = new ArrayList<>();
models.add(this.bakeBase());
for (int i = 0; i < colors.flowers().size(); i++)
for (int i = 0; i < content.flowers().size(); i++)
{
if (!colors.flowers().get(i).isEmpty())
if (!content.flowers().get(i).isEmpty())
{
models.add(this.bakeLayer(i, colors.flowers().get(i)));
models.add(this.bakeLayer(i, content.flowers().get(i)));
}
}
return new CompositeModel(models);
@ -151,8 +131,8 @@ public class FlowerCrownItemModel implements ItemModel
ItemDisplayContext displayContext, @Nullable ClientLevel level,
@Nullable LivingEntity entity, int seed)
{
FlowerCrownContent comp =
stack.get(CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get());
FlowerCrownContent comp = stack.get(
CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get());
if (comp == null)
{
comp = new FlowerCrownContent(List.of());

View file

@ -48,6 +48,11 @@ public class FlowerCrown extends Item implements ICurioItem
ItemStack stack = player.getItemInHand(hand);
ItemStack offStack = player.getOffhandItem();
if (stack.isEmpty() || offStack.isEmpty())
{
return InteractionResult.PASS;
}
FlowerCrownContent content = stack.get(
CnFRegistries.DataComponents.FLOWER_CROWN_CONTENT.get());
if (content == null ||