Rework the BlockEntityRenderer api to fix load order issues.

Based off the work from #430

Co-authored-by: Draylar <samuelhimes@gmail.com>
This commit is contained in:
modmuss50 2019-11-25 19:54:56 +00:00
parent dd84212848
commit a1ff8ff878
5 changed files with 78 additions and 18 deletions

View file

@ -1,5 +1,5 @@
archivesBaseName = "fabric-renderer-registries-v1"
version = getSubprojectVersion(project, "1.0.4")
version = getSubprojectVersion(project, "2.0.0")
dependencies {
compile project(path: ':fabric-api-base', configuration: 'dev')

View file

@ -16,22 +16,27 @@
package net.fabricmc.fabric.api.client.rendereregistry.v1;
import java.util.function.Function;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.fabricmc.fabric.mixin.client.renderer.registry.MixinBlockEntityRenderDispatcher;
import net.fabricmc.fabric.impl.client.rendereregistry.v1.BlockEntityRendererRegistryImpl;
/**
* Helper class for registering BlockEntityRenderers.
*/
public class BlockEntityRendererRegistry {
public static final BlockEntityRendererRegistry INSTANCE = new BlockEntityRendererRegistry();
public interface BlockEntityRendererRegistry {
BlockEntityRendererRegistry INSTANCE = new BlockEntityRendererRegistryImpl();
private BlockEntityRendererRegistry() { }
public <E extends BlockEntity> void register(BlockEntityType<E> blockEntityType, BlockEntityRenderer<E> blockEntityRenderer) {
((MixinBlockEntityRenderDispatcher) BlockEntityRenderDispatcher.INSTANCE).invoke_register(blockEntityType, blockEntityRenderer);
}
/**
* Register a BlockEntityRenderer for a BlockEntityType. Can be called clientside before the world is rendered
*
* @param blockEntityType the {@link BlockEntityType} to register a renderer for
* @param blockEntityRenderer a function that returns a {@link BlockEntityRenderer}
* @param <E> the {@link BlockEntity}
*/
<E extends BlockEntity> void register(BlockEntityType<E> blockEntityType, Function<BlockEntityRenderDispatcher, BlockEntityRenderer<E>> blockEntityRenderer);
}

View file

@ -0,0 +1,43 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.impl.client.rendereregistry.v1;
import java.util.HashMap;
import java.util.function.BiConsumer;
import java.util.function.Function;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.fabricmc.fabric.api.client.rendereregistry.v1.BlockEntityRendererRegistry;
public class BlockEntityRendererRegistryImpl implements BlockEntityRendererRegistry {
private static HashMap<BlockEntityType<?>, Function<BlockEntityRenderDispatcher, ? extends BlockEntityRenderer<?>>> map = new HashMap<>();
private static BiConsumer<BlockEntityType<?>, Function<BlockEntityRenderDispatcher, ? extends BlockEntityRenderer<?>>> handler = (type, function) -> map.put(type, function);
@Override
public <E extends BlockEntity> void register(BlockEntityType<E> blockEntityType, Function<BlockEntityRenderDispatcher, BlockEntityRenderer<E>> blockEntityRenderer) {
handler.accept(blockEntityType, blockEntityRenderer);
}
public static void setup(BiConsumer<BlockEntityType<?>, Function<BlockEntityRenderDispatcher, ? extends BlockEntityRenderer<?>>> vanillaHandler) {
map.forEach(vanillaHandler);
handler = vanillaHandler;
}
}

View file

@ -16,16 +16,32 @@
package net.fabricmc.fabric.mixin.client.renderer.registry;
import java.util.Map;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.client.render.block.entity.BlockEntityRenderDispatcher;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import net.fabricmc.fabric.impl.client.rendereregistry.v1.BlockEntityRendererRegistryImpl;
@Mixin(BlockEntityRenderDispatcher.class)
public interface MixinBlockEntityRenderDispatcher {
@Invoker(value = "register")
@SuppressWarnings("rawtypes")
void invoke_register(BlockEntityType blockEntityType, BlockEntityRenderer blockEntityRenderer);
public abstract class MixinBlockEntityRenderDispatcher {
@Shadow
@Final
public static BlockEntityRenderDispatcher INSTANCE;
@Shadow
@Final
private Map<BlockEntityType<?>, BlockEntityRenderer<?>> renderers;
@Inject(at = @At("RETURN"), method = "<init>")
private void init(CallbackInfo ci) {
BlockEntityRendererRegistryImpl.setup(((t, function) -> renderers.put(t, function.apply(INSTANCE))));
}
}

View file

@ -24,11 +24,8 @@ import java.util.Map;
import java.util.Set;
import com.google.common.base.Joiner;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
@ -48,7 +45,6 @@ import net.fabricmc.fabric.impl.client.texture.SpriteRegistryCallbackHolder;
@Mixin(SpriteAtlasTexture.class)
public abstract class MixinSpriteAtlasTexture {
@Shadow
public abstract Identifier method_24106();