feat: flower crown model type + layers baking (WIP)
Some checks failed
Build / build (push) Has been cancelled
Some checks failed
Build / build (push) Has been cancelled
This commit is contained in:
parent
9f0e679dd1
commit
a8990da272
2 changed files with 155 additions and 0 deletions
|
@ -0,0 +1,155 @@
|
||||||
|
package fr.sushi.charmsnfabrics.client.model;
|
||||||
|
|
||||||
|
import com.mojang.math.Transformation;
|
||||||
|
import com.mojang.serialization.MapCodec;
|
||||||
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||||
|
import fr.sushi.charmsnfabrics.CharmsAndFabrics;
|
||||||
|
import net.minecraft.client.multiplayer.ClientLevel;
|
||||||
|
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||||
|
import net.minecraft.client.renderer.block.model.BlockElement;
|
||||||
|
import net.minecraft.client.renderer.block.model.ItemTransforms;
|
||||||
|
import net.minecraft.client.renderer.block.model.TextureSlots;
|
||||||
|
import net.minecraft.client.renderer.item.*;
|
||||||
|
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||||
|
import net.minecraft.client.resources.model.*;
|
||||||
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.world.entity.LivingEntity;
|
||||||
|
import net.minecraft.world.item.DyeColor;
|
||||||
|
import net.minecraft.world.item.ItemDisplayContext;
|
||||||
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
import net.neoforged.neoforge.client.ClientHooks;
|
||||||
|
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.Vector3f;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class FlowerCrownItemModel implements ItemModel
|
||||||
|
{
|
||||||
|
private static final ModelDebugName DEBUG_NAME =
|
||||||
|
() -> "FlowerCrownItemModel";
|
||||||
|
|
||||||
|
// private final FlowerCrownItemModel.Unbaked unbakedModel;
|
||||||
|
// private final ItemTransforms transforms;
|
||||||
|
private final ItemModel bakedBase;
|
||||||
|
private final BakingContext bakingContext;
|
||||||
|
private final ItemTransforms baseTransform;
|
||||||
|
|
||||||
|
public FlowerCrownItemModel(ItemModel bakedBase, BakingContext context)
|
||||||
|
{
|
||||||
|
this.bakedBase = bakedBase;
|
||||||
|
this.bakingContext = context;
|
||||||
|
ResolvedModel baseItemModel = bakingContext.blockModelBaker().getModel(
|
||||||
|
ResourceLocation.withDefaultNamespace("item/generated"));
|
||||||
|
this.baseTransform = baseItemModel.getTopTransforms();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ResourceLocation getFlowerLocation(int layer)
|
||||||
|
{
|
||||||
|
return ResourceLocation.fromNamespaceAndPath(CharmsAndFabrics.MODID,
|
||||||
|
"flowers/flower" + layer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prevent Z fighting */
|
||||||
|
private Transformation getLayerTransform(int layer)
|
||||||
|
{
|
||||||
|
return new Transformation(new Vector3f(), new Quaternionf(),
|
||||||
|
new Vector3f(0.0f, 0.0f, 1.0f + (layer / 100f)),
|
||||||
|
new Quaternionf());
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemModel bakeForColors(List<DyeColor> colors)
|
||||||
|
{
|
||||||
|
ModelState state = BlockModelRotation.X0_Y0;
|
||||||
|
SpriteGetter sprites = this.bakingContext.blockModelBaker().sprites();
|
||||||
|
|
||||||
|
List<ItemModel> submodels = new ArrayList<>();
|
||||||
|
submodels.add(this.bakedBase);
|
||||||
|
|
||||||
|
for (int layer = 0; layer < colors.size(); layer++)
|
||||||
|
{
|
||||||
|
ResourceLocation texture = this.getFlowerLocation(layer);
|
||||||
|
Material material = ClientHooks.getBlockMaterial(texture);
|
||||||
|
TextureAtlasSprite sprite = sprites.get(material, DEBUG_NAME);
|
||||||
|
|
||||||
|
/* ***** TODO: Multiply pixels with dye color **** */
|
||||||
|
|
||||||
|
List<BlockElement> unbaked =
|
||||||
|
UnbakedElementsHelper.createUnbakedItemElements(0, sprite);
|
||||||
|
List<BakedQuad> quads =
|
||||||
|
UnbakedElementsHelper.bakeElements(unbaked, mat -> sprite,
|
||||||
|
new ComposedModelState(state,
|
||||||
|
this.getLayerTransform(layer)));
|
||||||
|
|
||||||
|
ModelRenderProperties renderProperties =
|
||||||
|
new ModelRenderProperties(false, sprite,
|
||||||
|
this.baseTransform);
|
||||||
|
submodels.add(
|
||||||
|
new BlockModelWrapper(List.of(), quads, renderProperties));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ****************************************************************** */
|
||||||
|
return new CompositeModel(submodels);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(ItemStackRenderState renderState, ItemStack stack,
|
||||||
|
ItemModelResolver itemModelResolver,
|
||||||
|
ItemDisplayContext displayContext, @Nullable ClientLevel level,
|
||||||
|
@Nullable LivingEntity entity, int seed)
|
||||||
|
{
|
||||||
|
ItemStackRenderState.LayerRenderState freshLayer =
|
||||||
|
renderState.newLayer();
|
||||||
|
}
|
||||||
|
|
||||||
|
public record Unbaked(
|
||||||
|
ResourceLocation baseModel) implements ItemModel.Unbaked
|
||||||
|
{
|
||||||
|
|
||||||
|
public static final MapCodec<FlowerCrownItemModel.Unbaked> MAP_CODEC =
|
||||||
|
RecordCodecBuilder.mapCodec(unbaked -> unbaked
|
||||||
|
.group(ResourceLocation.CODEC.fieldOf("base").forGetter(
|
||||||
|
FlowerCrownItemModel.Unbaked::baseModel))
|
||||||
|
.apply(unbaked, FlowerCrownItemModel.Unbaked::new));
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MapCodec<? extends ItemModel.Unbaked> type()
|
||||||
|
{
|
||||||
|
return MAP_CODEC;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemModel bake(BakingContext context)
|
||||||
|
{
|
||||||
|
ModelBaker modelbaker = context.blockModelBaker();
|
||||||
|
ResolvedModel resolved = modelbaker.getModel(this.baseModel);
|
||||||
|
List<BakedQuad> quads = resolved
|
||||||
|
.bakeTopGeometry(resolved.getTopTextureSlots(), modelbaker,
|
||||||
|
BlockModelRotation.X0_Y0).getAll();
|
||||||
|
|
||||||
|
ItemModel bakedBase = new BlockModelWrapper(List.of(), quads,
|
||||||
|
this.getRenderProperties(context));
|
||||||
|
return new FlowerCrownItemModel(bakedBase, context);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void resolveDependencies(Resolver resolver)
|
||||||
|
{
|
||||||
|
resolver.markDependency(this.baseModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A vérifier, pas sûr sûr de celle là Y-Y */
|
||||||
|
private ModelRenderProperties getRenderProperties(
|
||||||
|
ItemModel.BakingContext context)
|
||||||
|
{
|
||||||
|
ModelBaker modelbaker = context.blockModelBaker();
|
||||||
|
ResolvedModel resolvedmodel = modelbaker.getModel(this.baseModel);
|
||||||
|
TextureSlots textureslots = resolvedmodel.getTopTextureSlots();
|
||||||
|
return ModelRenderProperties.fromResolvedModel(modelbaker,
|
||||||
|
resolvedmodel, textureslots);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 104 B |
Loading…
Add table
Add a link
Reference in a new issue