Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
33e1e9a
begin porting
sylv256 Feb 15, 2026
27e9b00
refactor!: `RenderType` in `QuadView` & update `EncodingFormat`
sylv256 Feb 16, 2026
adffa1a
refactor!: `FabricMaterialBaker` :3
sylv256 Feb 19, 2026
639fbe3
fix: everything
sylv256 Feb 19, 2026
04d1ff6
Merge remote-tracking branch 'origin/26.1' into rendering-1
sylv256 Feb 19, 2026
9d916ea
fix: some style and mixinextras being mad at me
sylv256 Feb 19, 2026
959487b
fix!: minor issues
sylv256 Feb 20, 2026
da01daf
fix: the `BakedQuadOutput` crisis of 2026
sylv256 Feb 21, 2026
fca1cb7
refactor!: remove `ItemRenderTypeGetter`
sylv256 Feb 21, 2026
35d8de6
docs: fix `ModelModifier` `ModelBaker#sprites` -> `#materials`
sylv256 Feb 21, 2026
37642a7
docs: `MutableQuadView` missing reference
sylv256 Feb 21, 2026
4470e79
fix: forgot to set `itemRenderType` to null by default
sylv256 Feb 21, 2026
df13e0a
fix: set `chunkLayer` and `itemRenderType` in `#fromBakedQuad`
sylv256 Feb 21, 2026
37ad034
fix: nullability issues in `EncodingFormat` w/ `itemRenderType`
sylv256 Feb 21, 2026
4c00b49
fix: nullability issues in `EncodingFormat` w/ `itemRenderType` pt 2
sylv256 Feb 21, 2026
6df8101
fix: recalculate transparency instead of storing in QVs
sylv256 Feb 21, 2026
5cdecb7
fix: get or find chunk layer (not item render types)
sylv256 Feb 22, 2026
440abec
Fix testmod and use getOrResolveItemRenderType in ItemRenderContext
PepperCode1 Feb 22, 2026
e723894
Fixes and improvements
PepperCode1 Feb 22, 2026
7f28d9c
Some doc fixes
PepperCode1 Feb 22, 2026
a35cea9
style: chain `QuadEmitter` calls
sylv256 Feb 22, 2026
8a71c9c
docs: prefer using this method 😇 -> use this method 😡
sylv256 Feb 23, 2026
37ebbae
docs(javadoc): omg pls build successfully thx
sylv256 Feb 23, 2026
6b86771
Merge branch '26.1' of github.com:FabricMC/fabric into rendering-1
BluSpring Mar 11, 2026
2339bb1
Large port for 26.1-pre-1
BluSpring Mar 11, 2026
989f130
Uncomment mixin for BlockFeatureRenderer
BluSpring Mar 11, 2026
42964bf
fix mixins JSON
BluSpring Mar 11, 2026
cc1c1bb
Merge pull request #1 from BluSpring/rendering-1
sylv256 Mar 13, 2026
08b4eff
Merge branch '26.1' into rendering-1
sylv256 Mar 13, 2026
7afbd86
Merge remote-tracking branch 'origin/26.1' into rendering-1
Rigner Mar 21, 2026
467948c
Fixed many compile errors in model-loading-api and renderer apis
Rigner Mar 21, 2026
5f76a86
fix: use BlockState random in SimpleBlockRenderContext#bufferModel
sylv256 Mar 23, 2026
a2ff2da
general changes and add FabricBlockFeatureRenderer
sylv256 Mar 23, 2026
643a47b
refactor: fix some mixins, some new stuff
sylv256 Mar 24, 2026
4860522
fix: use seed 42 in simple block contexts
sylv256 Mar 24, 2026
285eac6
feat: mesh thingy in `BlockModelRenderState`
sylv256 Mar 24, 2026
8d612d2
Work
PepperCode1 Mar 26, 2026
d2385c9
Work II
PepperCode1 Mar 27, 2026
d9423de
Remove QuadConsumers.ValidateAtlasUsage and promote one TODO to FIXME
PepperCode1 Mar 27, 2026
2062429
Merge remote-tracking branch 'origin/26.1' into rendering-1
sylv256 Mar 27, 2026
3ba4d87
fix: crash when mannequin is present
sylv256 Mar 27, 2026
b469a2f
docs: some docs, I guess
sylv256 Mar 27, 2026
fc2513c
fix: apply mixin suggestions
sylv256 Mar 27, 2026
0e0bf83
feat: `QuadView#animated`
sylv256 Mar 27, 2026
0a9b004
chore: docs
Kilip1000 Mar 27, 2026
f7d6c95
chore: fix checkstyle
Kilip1000 Mar 28, 2026
067f483
Docs
PepperCode1 Mar 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

import org.jetbrains.annotations.ApiStatus;

import net.minecraft.client.renderer.block.model.BlockStateModel;
import net.minecraft.client.renderer.block.dispatch.BlockStateModel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Unmodifiable;

import net.minecraft.client.renderer.block.model.BlockStateModel;
import net.minecraft.client.renderer.block.dispatch.BlockStateModel;
import net.minecraft.client.renderer.item.CompositeModel;

import net.fabricmc.fabric.impl.client.model.loading.CompositeBlockStateModelImpl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@

import com.mojang.serialization.MapCodec;

import net.minecraft.client.renderer.block.model.BlockStateModel;
import net.minecraft.client.renderer.block.model.SingleVariant;
import net.minecraft.client.renderer.block.model.Variant;
import net.minecraft.client.renderer.block.dispatch.BlockStateModel;
import net.minecraft.client.renderer.block.dispatch.SingleVariant;
import net.minecraft.client.renderer.block.dispatch.Variant;
import net.minecraft.resources.Identifier;

import net.fabricmc.fabric.impl.client.model.loading.CustomUnbakedBlockStateModelRegistry;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@
package net.fabricmc.fabric.api.client.model.loading.v1;

import org.jetbrains.annotations.ApiStatus;
import org.joml.Matrix4fc;

import net.minecraft.client.renderer.block.model.BlockStateModel;
import net.minecraft.client.renderer.block.dispatch.BlockStateModel;
import net.minecraft.client.renderer.item.ItemModel;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ResolvableModel;
Expand Down Expand Up @@ -144,7 +145,7 @@ interface Context {

/**
* The baker being used to bake this model. It can be used to
* {@linkplain ModelBaker#getModel get resolved models} and {@linkplain ModelBaker#sprites get sprites}. Note
* {@linkplain ModelBaker#getModel get resolved models} and {@linkplain ModelBaker#materials get materials}. Note
* that retrieving a model which was not previously
* {@linkplain ResolvableModel.Resolver#markDependency discovered} will log a warning and return the missing
* model.
Expand Down Expand Up @@ -182,7 +183,7 @@ interface Context {

/**
* The baker being used to bake this model. It can be used to
* {@linkplain ModelBaker#getModel get resolved models} and {@linkplain ModelBaker#sprites get sprites}. Note
* {@linkplain ModelBaker#getModel get resolved models} and {@linkplain ModelBaker#materials get materials}. Note
* that retrieving a model which was not previously
* {@linkplain ResolvableModel.Resolver#markDependency discovered} will log a warning and return the missing
* model.
Expand Down Expand Up @@ -217,6 +218,11 @@ interface Context {
* The vanilla context being used to bake this model.
*/
ItemModel.BakingContext bakingContext();

/**
* The transformation applied during baking of this model.
*/
Matrix4fc transformation();
}
}

Expand Down Expand Up @@ -251,6 +257,11 @@ interface Context {
* The vanilla context being used to bake this model.
*/
ItemModel.BakingContext bakingContext();

/**
* The transformation applied during baking of this model.
*/
Matrix4fc transformation();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,22 +18,39 @@

import java.util.function.BiFunction;

import net.minecraft.client.renderer.block.model.BlockStateModel;
import net.minecraft.client.renderer.block.model.SimpleModelWrapper;
import net.minecraft.client.renderer.block.model.SingleVariant;
import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.resources.model.BlockModelRotation;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.mojang.logging.LogUtils;
import org.apache.commons.lang3.mutable.MutableObject;
import org.slf4j.Logger;

import net.minecraft.client.renderer.block.dispatch.BlockModelRotation;
import net.minecraft.client.renderer.block.dispatch.BlockStateModel;
import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart;
import net.minecraft.client.renderer.block.dispatch.ModelState;
import net.minecraft.client.renderer.block.dispatch.SingleVariant;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.client.resources.model.ModelState;
import net.minecraft.client.resources.model.ResolvedModel;
import net.minecraft.client.resources.model.SimpleModelWrapper;
import net.minecraft.client.resources.model.geometry.BakedQuad;
import net.minecraft.client.resources.model.geometry.QuadCollection;
import net.minecraft.client.resources.model.sprite.Material;
import net.minecraft.client.resources.model.sprite.TextureSlots;
import net.minecraft.resources.Identifier;

import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadAtlas;
import net.fabricmc.fabric.api.client.renderer.v1.model.MeshQuadCollection;

/**
* A {@link UnbakedExtraModel} that loads a single model.
*
* @param <T> The type of the baked model, for instance {@link BlockStateModel}.
*/
public final class SimpleUnbakedExtraModel<T> implements UnbakedExtraModel<T> {
private static final Logger LOGGER = LogUtils.getLogger();

private final Identifier model;
private final BiFunction<ResolvedModel, ModelBaker, T> bake;

Expand Down Expand Up @@ -69,19 +86,61 @@ public static SimpleUnbakedExtraModel<BlockStateModel> blockStateModel(Identifie
/**
* Create a {@link SimpleUnbakedExtraModel} for a {@link BlockStateModel}.
*
* @param model The location of the model to load.
* @param settings The settings to bake the geometry with.
* @param model The location of the model to load.
* @param state The state to bake the geometry with.
* @return The unbaked extra model.
*/
public static SimpleUnbakedExtraModel<BlockStateModel> blockStateModel(Identifier model, ModelState settings) {
return new SimpleUnbakedExtraModel<>(model, (baked, baker) -> {
TextureSlots textures = baked.getTopTextureSlots();
return new SingleVariant(new SimpleModelWrapper(
baked.bakeTopGeometry(textures, baker, settings),
baked.getTopAmbientOcclusion(),
baked.resolveParticleSprite(textures, baker)
));
});
public static SimpleUnbakedExtraModel<BlockStateModel> blockStateModel(Identifier model, ModelState state) {
return new SimpleUnbakedExtraModel<>(model, (baked, baker) -> new SingleVariant(bakeResolved(baker, baked, state)));
}

// TODO: expose this as a public utility
// Mirror of SimpleModelWrapper#bake (with FRAPI's mixin) that accepts a ResolvedModel instead of an Identifier
private static BlockStateModelPart bakeResolved(final ModelBaker modelBakery, final ResolvedModel model, final ModelState state) {
TextureSlots textureSlots = model.getTopTextureSlots();
boolean hasAmbientOcclusion = model.getTopAmbientOcclusion();
Material.Baked particleMaterial = model.resolveParticleMaterial(textureSlots, modelBakery);
QuadCollection geometry = model.bakeTopGeometry(textureSlots, modelBakery, state);
Multimap<Identifier, Identifier> forbiddenSprites = null;

if (geometry instanceof MeshQuadCollection meshQuadCollection) {
MutableObject<Multimap<Identifier, Identifier>> forbiddenSpritesRef = new MutableObject<>(forbiddenSprites);

meshQuadCollection.getMesh().forEach(quad -> {
if (quad.atlas() != QuadAtlas.BLOCK) {
Multimap<Identifier, Identifier> forbiddenSprites1 = forbiddenSpritesRef.get();

if (forbiddenSprites1 == null) {
forbiddenSprites1 = HashMultimap.create();
forbiddenSpritesRef.setValue(forbiddenSprites1);
}

TextureAtlasSprite sprite = modelBakery.materials().spriteFinder(quad.atlas()).find(quad);
forbiddenSprites1.put(sprite.atlasLocation(), sprite.contents().name());
}
});

forbiddenSprites = forbiddenSpritesRef.get();
}

for (BakedQuad bakedQuad : geometry.getAll()) {
TextureAtlasSprite sprite = bakedQuad.materialInfo().sprite();

if (!sprite.atlasLocation().equals(TextureAtlas.LOCATION_BLOCKS)) {
if (forbiddenSprites == null) {
forbiddenSprites = HashMultimap.create();
}

forbiddenSprites.put(sprite.atlasLocation(), sprite.contents().name());
}
}

if (forbiddenSprites != null) {
LOGGER.warn("Rejecting block model {}, since it contains sprites from outside of supported atlas: {}", model.debugName(), forbiddenSprites);
return modelBakery.missingBlockModelPart();
} else {
return new SimpleModelWrapper(geometry, hasAmbientOcclusion, particleMaterial);
}
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,12 @@
import com.google.gson.JsonParseException;
import org.jspecify.annotations.Nullable;

import net.minecraft.client.renderer.block.model.BlockElement;
import net.minecraft.client.renderer.block.model.BlockElementFace;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.renderer.block.model.ItemTransform;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.client.resources.model.cuboid.CuboidFace;
import net.minecraft.client.resources.model.cuboid.CuboidModel;
import net.minecraft.client.resources.model.cuboid.CuboidModelElement;
import net.minecraft.client.resources.model.cuboid.ItemTransform;
import net.minecraft.client.resources.model.cuboid.ItemTransforms;
import net.minecraft.resources.Identifier;

import net.fabricmc.fabric.impl.client.model.loading.UnbakedModelDeserializerRegistry;
Expand Down Expand Up @@ -74,7 +74,7 @@ static UnbakedModelDeserializer get(Identifier id) {

/**
* Deserializes an {@link UnbakedModel} from a {@link Reader}, respecting custom deserializers. Prefer using this
* method to {@link BlockModel#fromStream(Reader)}.
* method to {@link CuboidModel#fromStream(Reader)}.
*/
static UnbakedModel deserialize(Reader reader) throws JsonParseException {
return UnbakedModelDeserializerRegistry.deserialize(reader);
Expand All @@ -86,8 +86,8 @@ static UnbakedModel deserialize(Reader reader) throws JsonParseException {
* <p>The provided deserialization context is able to deserialize objects of the following types:
* <ul>
* <li>{@link UnbakedModel}</li>
* <li>{@link BlockElement}</li>
* <li>{@link BlockElementFace}</li>
* <li>{@link CuboidModelElement}</li>
* <li>{@link CuboidFace}</li>
* <li>{@link ItemTransform}</li>
* <li>{@link ItemTransforms}</li>
* </ul>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,14 @@

import org.jspecify.annotations.Nullable;

import net.minecraft.client.renderer.block.model.BlockModelPart;
import net.minecraft.client.renderer.block.model.BlockStateModel;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.block.BlockAndTintGetter;
import net.minecraft.client.renderer.block.dispatch.BlockStateModel;
import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart;
import net.minecraft.client.resources.model.geometry.BakedQuad;
import net.minecraft.client.resources.model.sprite.Material;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;

import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter;
Expand All @@ -47,18 +48,23 @@ protected WrapperBlockStateModel(BlockStateModel wrapped) {
}

@Override
public void collectParts(RandomSource random, List<BlockModelPart> parts) {
public void collectParts(RandomSource random, List<BlockStateModelPart> parts) {
wrapped.collectParts(random, parts);
}

@Override
public List<BlockModelPart> collectParts(RandomSource random) {
return wrapped.collectParts(random);
public Material.Baked particleMaterial() {
return wrapped.particleMaterial();
}

@Override
public TextureAtlasSprite particleIcon() {
return wrapped.particleIcon();
public @BakedQuad.MaterialFlags int materialFlags() {
return wrapped.materialFlags();
}

@Override
public boolean hasMaterialFlag(@BakedQuad.MaterialFlags int flag) {
return wrapped.hasMaterialFlag(flag);
}

@Override
Expand All @@ -73,7 +79,7 @@ public Object createGeometryKey(BlockAndTintGetter level, BlockPos pos, BlockSta
}

@Override
public TextureAtlasSprite particleIcon(BlockAndTintGetter level, BlockPos pos, BlockState state) {
return wrapped.particleIcon(level, pos, state);
public Material.Baked particleMaterial(BlockAndTintGetter level, BlockPos pos, BlockState state) {
return wrapped.particleMaterial(level, pos, state);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package net.fabricmc.fabric.api.client.model.loading.v1.wrapper;

import com.mojang.serialization.MapCodec;
import org.joml.Matrix4fc;

import net.minecraft.client.renderer.item.ItemModel;

Expand Down Expand Up @@ -45,7 +46,7 @@ public MapCodec<? extends ItemModel.Unbaked> type() {
}

@Override
public ItemModel bake(ItemModel.BakingContext context) {
return wrapped.bake(context);
public ItemModel bake(ItemModel.BakingContext context, Matrix4fc transformation) {
return wrapped.bake(context, transformation);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@

import org.jspecify.annotations.Nullable;

import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.block.model.TextureSlots;
import net.minecraft.client.resources.model.UnbakedGeometry;
import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.client.resources.model.cuboid.ItemTransforms;
import net.minecraft.client.resources.model.geometry.UnbakedGeometry;
import net.minecraft.client.resources.model.sprite.TextureSlots;
import net.minecraft.resources.Identifier;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

package net.fabricmc.fabric.api.client.model.loading.v1.wrapper;

import net.minecraft.client.renderer.block.model.BlockStateModel;
import net.minecraft.client.renderer.block.dispatch.BlockStateModel;
import net.minecraft.client.resources.model.ModelBaker;
import net.minecraft.world.level.block.state.BlockState;

Expand Down
Loading
Loading