Skip to content

Commit

Permalink
Port fabric-model-loading-api-v1, fabric-renderer-api-v1, fabric-rend…
Browse files Browse the repository at this point in the history
…erer-indigo
  • Loading branch information
Su5eD committed Jun 29, 2024
1 parent bc9372c commit a6e994c
Show file tree
Hide file tree
Showing 23 changed files with 160 additions and 92 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@

package net.fabricmc.fabric.mixin.block;

import org.spongepowered.asm.mixin.Mixin;
import net.fabricmc.fabric.api.block.v1.FabricBlockState;
import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.neoforge.common.extensions.IBlockStateExtension;
import org.spongepowered.asm.mixin.Mixin;

@Mixin(BlockState.class)
public class BlockStateMixin implements FabricBlockState { }
@Mixin(IBlockStateExtension.class)
public interface IBlockStateExtensionMixin extends FabricBlockState {

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"package": "net.fabricmc.fabric.mixin.block",
"compatibilityLevel": "JAVA_17",
"mixins": [
"BlockStateMixin",
"IBlockStateExtensionMixin",
"IBlockExtensionMixin"
],
"injectors": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,6 @@ public void resolveParents(Function<ResourceLocation, UnbakedModel> modelLoader)
@Override
@Nullable
public BakedModel bake(ModelBaker baker, Function<Material, TextureAtlasSprite> textureGetter, ModelState rotationContainer) {
return baker.bake(delegate, rotationContainer);
return baker.bake(delegate, rotationContainer, textureGetter);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

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

import net.fabricmc.fabric.impl.client.model.loading.ModelLoadingConstants;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.client.resources.model.ModelResourceLocation;
Expand All @@ -41,6 +42,6 @@ public interface FabricBakedModelManager {
* @return the model
*/
default BakedModel getModel(ResourceLocation id) {
throw new UnsupportedOperationException("Implemented via mixin.");
return ((ModelManager) this).getModel(ModelLoadingConstants.toResourceModelId(id));
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,15 @@
import java.util.function.BiFunction;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import net.fabricmc.fabric.api.client.model.loading.v1.FabricBakedModelManager;
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin;
import net.fabricmc.fabric.impl.client.model.loading.ModelLoadingConstants;
import net.fabricmc.fabric.impl.client.model.loading.ModelLoadingPluginManager;
import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.BlockStateModelLoader;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.client.resources.model.ModelManager;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.PreparableReloadListener;
import net.minecraft.server.packs.resources.ResourceManager;
Expand All @@ -45,13 +41,6 @@

@Mixin(ModelManager.class)
abstract class BakedModelManagerMixin implements FabricBakedModelManager {
@Shadow
private Map<ModelResourceLocation, BakedModel> bakedRegistry;

@Override
public BakedModel getModel(ResourceLocation id) {
return bakedRegistry.get(ModelLoadingConstants.toResourceModelId(id));
}

@Redirect(
method = "reload",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ abstract class ModelLoaderBakerImplMixin implements BakerImplHooks {
@Final
private Function<Material, TextureAtlasSprite> modelTextureGetter;

@WrapOperation(method = "bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;)Lnet/minecraft/client/resources/model/BakedModel;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBakery$ModelBakerImpl;bakeUncached(Lnet/minecraft/client/resources/model/UnbakedModel;Lnet/minecraft/client/resources/model/ModelState;)Lnet/minecraft/client/resources/model/BakedModel;"))
private BakedModel wrapInnerBake(@Coerce ModelBaker self, UnbakedModel unbakedModel, ModelState settings, Operation<BakedModel> operation, ResourceLocation id) {
@WrapOperation(method = "bake(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/client/resources/model/ModelState;Ljava/util/function/Function;)Lnet/minecraft/client/resources/model/BakedModel;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/model/ModelBakery$ModelBakerImpl;bakeUncached(Lnet/minecraft/client/resources/model/UnbakedModel;Lnet/minecraft/client/resources/model/ModelState;Ljava/util/function/Function;)Lnet/minecraft/client/resources/model/BakedModel;"))
private BakedModel wrapInnerBake(@Coerce ModelBaker self, UnbakedModel unbakedModel, ModelState settings, Function<Material, TextureAtlasSprite> sprites, Operation<BakedModel> operation, ResourceLocation id) {
ModelLoadingEventDispatcher dispatcher = ((ModelLoaderHooks) this.this$0).fabric_getDispatcher();
unbakedModel = dispatcher.modifyModelBeforeBake(unbakedModel, id, null, modelTextureGetter, settings, self);
BakedModel model = operation.call(self, unbakedModel, settings);
BakedModel model = operation.call(self, unbakedModel, settings, sprites);
return dispatcher.modifyModelAfterBake(model, id, null, unbakedModel, modelTextureGetter, settings, self);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
import net.fabricmc.fabric.impl.client.model.loading.ModelLoadingEventDispatcher;
import net.fabricmc.fabric.impl.client.model.loading.ModelLoadingPluginManager;

@Mixin(ModelBakery.class)
@Mixin(value = ModelBakery.class, priority = 2000)
abstract class ModelLoaderMixin implements ModelLoaderHooks {
@Final
@Shadow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@

import java.util.List;
import java.util.function.Supplier;

import com.mojang.blaze3d.vertex.PoseStack;
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.block.model.ItemOverrides;
import net.minecraft.client.renderer.block.model.ItemTransforms;
Expand All @@ -27,9 +30,14 @@
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import net.neoforged.neoforge.client.ChunkRenderTypeSet;
import net.neoforged.neoforge.client.model.data.ModelData;
import net.neoforged.neoforge.common.util.TriState;
import org.jetbrains.annotations.Nullable;

/**
* Base class for specialized model implementations that need to wrap other baked models.
Expand Down Expand Up @@ -98,4 +106,44 @@ public ItemOverrides getOverrides() {
public BakedModel getWrappedModel() {
return wrapped;
}

@Override
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, RandomSource rand, ModelData data, @Nullable RenderType renderType) {
return wrapped.getQuads(state, side, rand, data, renderType);
}

@Override
public TriState useAmbientOcclusion(BlockState state, ModelData data, RenderType renderType) {
return wrapped.useAmbientOcclusion(state, data, renderType);
}

@Override
public BakedModel applyTransform(ItemDisplayContext transformType, PoseStack poseStack, boolean applyLeftHandTransform) {
return wrapped.applyTransform(transformType, poseStack, applyLeftHandTransform);
}

@Override
public ModelData getModelData(BlockAndTintGetter level, BlockPos pos, BlockState state, ModelData modelData) {
return wrapped.getModelData(level, pos, state, modelData);
}

@Override
public TextureAtlasSprite getParticleIcon(ModelData data) {
return wrapped.getParticleIcon(data);
}

@Override
public ChunkRenderTypeSet getRenderTypes(BlockState state, RandomSource rand, ModelData data) {
return wrapped.getRenderTypes(state, rand, data);
}

@Override
public List<RenderType> getRenderTypes(ItemStack itemStack, boolean fabulous) {
return wrapped.getRenderTypes(itemStack, fabulous);
}

@Override
public List<BakedModel> getRenderPasses(ItemStack itemStack, boolean fabulous) {
return wrapped.getRenderPasses(itemStack, fabulous);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import java.util.function.Consumer;
import java.util.function.Supplier;

import net.minecraft.client.renderer.RenderType;
import net.neoforged.neoforge.client.model.data.ModelData;
import org.jetbrains.annotations.Nullable;
import net.fabricmc.fabric.api.renderer.v1.mesh.Mesh;
import net.fabricmc.fabric.api.renderer.v1.mesh.MutableQuadView;
Expand Down Expand Up @@ -177,4 +179,12 @@ interface BakedModelConsumer extends Consumer<BakedModel> {
*/
void accept(BakedModel model, @Nullable BlockState state);
}

default ModelData getModelData() {
return ModelData.EMPTY;
}

default RenderType getRenderType() {
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public static void emitBlockQuads(BakedModel model, @Nullable BlockState state,
continue;
}

final List<BakedQuad> quads = model.getQuads(state, cullFace, randomSupplier.get());
final List<BakedQuad> quads = model.getQuads(state, cullFace, randomSupplier.get(), context.getModelData(), context.getRenderType());
final int count = quads.size();

for (int j = 0; j < count; j++) {
Expand All @@ -70,7 +70,7 @@ public static void emitItemQuads(BakedModel model, @Nullable BlockState state, S

for (int i = 0; i <= ModelHelper.NULL_FACE_ID; i++) {
final Direction cullFace = ModelHelper.faceFromIndex(i);
final List<BakedQuad> quads = model.getQuads(state, cullFace, randomSupplier.get());
final List<BakedQuad> quads = model.getQuads(state, cullFace, randomSupplier.get(), context.getModelData(), context.getRenderType());
final int count = quads.size();

for (int j = 0; j < count; j++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ public class WeightedBakedModelMixin implements FabricBakedModel {

@Inject(at = @At("RETURN"), method = "<init>")
private void onInit(List<WeightedEntry.Wrapper<BakedModel>> models, CallbackInfo cb) {
for (int i = 0; i < models.size(); i++) {
if (!models.get(i).data().isVanillaAdapter()) {
for (WeightedEntry.Wrapper<BakedModel> model : models) {
if (!model.data().isVanillaAdapter()) {
isVanilla = false;
break;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ private static TriState asTriState(String property) {
final boolean forceCompatibility = IndigoMixinConfigPlugin.shouldForceCompatibility();
ENSURE_VERTEX_FORMAT_COMPATIBILITY = forceCompatibility;
// necessary because OF alters the BakedModel vertex format and will confuse the fallback model consumer
ALWAYS_TESSELATE_INDIGO = !forceCompatibility && asBoolean((String) properties.computeIfAbsent("always-tesselate-blocks", (a) -> "auto"), true);
ALWAYS_TESSELATE_INDIGO = !forceCompatibility && asBoolean((String) properties.computeIfAbsent("always-tesselate-blocks", (a) -> "auto"), false);
AMBIENT_OCCLUSION_MODE = asEnum((String) properties.computeIfAbsent("ambient-occlusion-mode", (a) -> "hybrid"), AoConfig.HYBRID);
DEBUG_COMPARE_LIGHTING = asBoolean((String) properties.computeIfAbsent("debug-compare-lighting", (a) -> "auto"), false);
FIX_SMOOTH_LIGHTING_OFFSET = asBoolean((String) properties.computeIfAbsent("fix-smooth-lighting-offset", (a) -> "auto"), true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@ public static int getLightmapCoordinates(BlockAndTintGetter world, BlockState st
// See AoCalculator#meanBrightness.
int i = world.getBrightness(LightLayer.SKY, pos);
int j = world.getBrightness(LightLayer.BLOCK, pos);
int k = state.getLightEmission();
int k = state.getLightEmission(world, pos);

if (j < k) {
j = k;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ static float vanilla(BlockGetter view, BlockPos pos, BlockState state) {
}

static float fixed(BlockGetter view, BlockPos pos, BlockState state) {
return state.getLightEmission() == 0 ? state.getShadeBrightness(view, pos) : 1f;
return state.getLightEmission(view, pos) == 0 ? state.getShadeBrightness(view, pos) : 1f;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import static net.fabricmc.fabric.impl.client.indigo.renderer.helper.GeometryHelper.LIGHT_FACE_FLAG;

import com.mojang.blaze3d.vertex.VertexConsumer;
import net.neoforged.neoforge.client.model.data.ModelData;
import org.jetbrains.annotations.Nullable;
import org.joml.Vector3f;
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial;
Expand Down Expand Up @@ -106,6 +107,16 @@ public BakedModelConsumer bakedModelConsumer() {
return vanillaModelConsumer;
}

@Override
public ModelData getModelData() {
return blockInfo.blockModelData;
}

@Override
public RenderType getRenderType() {
return blockInfo.defaultLayer;
}

private void renderQuad(MutableQuadViewImpl quad, boolean isVanilla) {
if (!transform(quad)) {
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,12 @@
package net.fabricmc.fabric.impl.client.indigo.renderer.render;

import java.util.function.Consumer;

import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import net.minecraft.client.renderer.block.model.BakedQuad;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import org.joml.Vector3f;
Expand Down Expand Up @@ -108,24 +112,42 @@ protected void bufferQuad(MutableQuadViewImpl quad, VertexConsumer vertexConsume
normalVec.set(quad.faceNormal());
normalVec.mul(normalMatrix);
}

for (int i = 0; i < 4; i++) {
posVec.set(quad.x(i), quad.y(i), quad.z(i), 1.0f);
posVec.mul(matrix);
vertexConsumer.addVertex(posVec.x(), posVec.y(), posVec.z());

final int color = quad.color(i);
vertexConsumer.setColor((color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF, (color >>> 24) & 0xFF);
vertexConsumer.setUv(quad.u(i), quad.v(i));
vertexConsumer.setOverlay(overlay);
vertexConsumer.setLight(quad.lightmap(i));

if (useNormals) {
quad.copyNormal(i, normalVec);
normalVec.mul(normalMatrix);
// Use fast track for the default vanilla implementation
if (vertexConsumer instanceof BufferBuilder) {
for (int i = 0; i < 4; i++) {
posVec.set(quad.x(i), quad.y(i), quad.z(i), 1.0f);
posVec.mul(matrix);
vertexConsumer.addVertex(posVec.x(), posVec.y(), posVec.z());

final int color = quad.color(i);
vertexConsumer.setColor((color >>> 16) & 0xFF, (color >>> 8) & 0xFF, color & 0xFF, (color >>> 24) & 0xFF);
vertexConsumer.setUv(quad.u(i), quad.v(i));
vertexConsumer.setOverlay(overlay);
vertexConsumer.setLight(quad.lightmap(i));

if (useNormals) {
quad.copyNormal(i, normalVec);
normalVec.mul(normalMatrix);
}

vertexConsumer.setNormal(normalVec.x(), normalVec.y(), normalVec.z());
}

vertexConsumer.setNormal(normalVec.x(), normalVec.y(), normalVec.z());
}
// Other implementations (namely Flywheel's ShadeSeparatingVertexConsumer) only support calling putBulkData
// However, this results in a few additional operations made, so we only use it when necessary
else {
PoseStack.Pose pose = new PoseStack().last();
pose.pose().set(matrix);
pose.normal().set(normalMatrix);
BakedQuad bakedQuad = quad.toBakedQuad(null);
vertexConsumer.putBulkData(
pose,
bakedQuad,
1.0F, 1.0F, 1.0F, 1.0F,
0,
overlay,
true
);
}
}
}
Loading

0 comments on commit a6e994c

Please sign in to comment.