add entity renderer registry

This commit is contained in:
asie 2018-11-29 00:53:29 +01:00
parent 9240854fff
commit df2790c68d
5 changed files with 136 additions and 7 deletions

View file

@ -22,15 +22,15 @@ import net.minecraft.client.render.block.entity.BlockEntityRenderer;
import java.util.Map;
public class FabricBlockEntityRendererRegistry {
public static final FabricBlockEntityRendererRegistry INSTANCE = new FabricBlockEntityRendererRegistry();
public class BlockEntityRendererRegistry {
public static final BlockEntityRendererRegistry INSTANCE = new BlockEntityRendererRegistry();
private Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> blockEntityRenderers;
private FabricBlockEntityRendererRegistry() {
private BlockEntityRendererRegistry() {
}
public void setBlockEntityRendererMap(Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> map) {
public void initialize(Map<Class<? extends BlockEntity>, BlockEntityRenderer<? extends BlockEntity>> map) {
if (blockEntityRenderers != null && blockEntityRenderers != map) {
throw new RuntimeException("Tried to set blockEntityRenderers twice!");
}

View file

@ -0,0 +1,87 @@
/*
* Copyright (c) 2016, 2017, 2018 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.client.render;
import net.minecraft.client.render.entity.EntityRenderManager;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.texture.TextureManager;
import net.minecraft.entity.Entity;
import java.util.HashMap;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.function.Function;
public class EntityRendererRegistry {
@FunctionalInterface
public interface Factory {
EntityRenderer<? extends Entity> create(EntityRenderManager manager, EntityRendererRegistry.Context context);
}
public static final class Context {
private final TextureManager textureManager;
private final ItemRenderer itemRenderer;
private final Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> rendererMap;
private Context(TextureManager textureManager, ItemRenderer itemRenderer, Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> rendererMap) {
this.textureManager = textureManager;
this.itemRenderer = itemRenderer;
this.rendererMap = rendererMap;
}
public TextureManager getTextureManager() {
return textureManager;
}
public ItemRenderer getItemRenderer() {
return itemRenderer;
}
}
public static final EntityRendererRegistry INSTANCE = new EntityRendererRegistry();
private final Map<EntityRenderManager, Context> renderManagerMap = new WeakHashMap<>();
private final Map<Class<? extends Entity>, EntityRendererRegistry.Factory> renderSupplierMap = new HashMap<>();
private EntityRendererRegistry() {
}
public void initialize(EntityRenderManager manager, TextureManager textureManager, ItemRenderer itemRenderer, Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> map) {
synchronized (renderSupplierMap) {
if (renderManagerMap.containsKey(manager)) {
return;
}
Context context = new Context(textureManager, itemRenderer, map);
renderManagerMap.put(manager, context);
for (Class<? extends Entity> c : renderSupplierMap.keySet()) {
map.put(c, renderSupplierMap.get(c).create(manager, context));
}
}
}
public void register(Class<? extends Entity> entityClass, EntityRendererRegistry.Factory factory) {
synchronized (renderSupplierMap) {
// TODO: warn on duplicate
renderSupplierMap.put(entityClass, factory);
for (EntityRenderManager manager : renderManagerMap.keySet()) {
renderManagerMap.get(manager).rendererMap.put(entityClass, factory.create(manager, renderManagerMap.get(manager)));
}
}
}
}

View file

@ -16,8 +16,7 @@
package net.fabricmc.fabric.mixin.render;
import com.google.common.collect.Maps;
import net.fabricmc.fabric.client.render.FabricBlockEntityRendererRegistry;
import net.fabricmc.fabric.client.render.BlockEntityRendererRegistry;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.client.render.block.entity.BlockEntityRenderManager;
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
@ -36,6 +35,6 @@ public class MixinBlockEntityRenderManager {
@Inject(method = "<init>()V", at = @At("RETURN"))
public void init(CallbackInfo info) {
FabricBlockEntityRendererRegistry.INSTANCE.setBlockEntityRendererMap(blockEntityRenderers);
BlockEntityRendererRegistry.INSTANCE.initialize(blockEntityRenderers);
}
}

View file

@ -0,0 +1,42 @@
/*
* Copyright (c) 2016, 2017, 2018 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.mixin.render;
import net.fabricmc.fabric.client.render.EntityRendererRegistry;
import net.minecraft.client.render.entity.EntityRenderManager;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.texture.TextureManager;
import net.minecraft.entity.Entity;
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.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Map;
@Mixin(EntityRenderManager.class)
public class MixinEntityRenderManager {
@Shadow
private Map<Class<? extends Entity>, EntityRenderer<? extends Entity>> RENDER_MAP;
@Inject(method = "<init>(Lnet/minecraft/client/texture/TextureManager;Lnet/minecraft/client/render/item/ItemRenderer;)V", at = @At("RETURN"))
public void init(TextureManager textureManager, ItemRenderer itemRenderer, CallbackInfo info) {
EntityRendererRegistry.INSTANCE.initialize((EntityRenderManager) (Object) this, textureManager, itemRenderer, RENDER_MAP);
}
}

View file

@ -8,6 +8,7 @@
"registry.client.MixinItemColorMap",
"registry.client.MixinItemModelMap",
"render.MixinBlockEntityRenderManager",
"render.MixinEntityRenderManager",
"resources.MixinMinecraftGame"
],
"injectors": {