mirror of
https://github.com/FabricMC/fabric.git
synced 2025-02-16 19:59:56 -05:00
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:
parent
dd84212848
commit
a1ff8ff878
5 changed files with 78 additions and 18 deletions
|
@ -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')
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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))));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in a new issue