From 4cd4c0a8722bfcf010575297a7df21ed81e20bd3 Mon Sep 17 00:00:00 2001 From: TropheusJ Date: Mon, 9 Oct 2023 23:30:14 -0400 Subject: [PATCH] back by unpopular demand emissives.json works, and is now resourcepackable --- .../portalcubed/client/PortalCubedClient.java | 29 +---- .../render/block/EmissiveSpriteRegistry.java | 1 - .../models/PortalCubedModelLoadingPlugin.java | 51 ++------ .../client/render/models/RenderMaterials.java | 37 +++--- .../models/emissive/EmissiveBakedModel.java | 115 +++--------------- .../render/models/emissive/EmissiveData.java | 13 ++ .../models/emissive/EmissiveLoader.java | 58 +++++++++ .../models/emissive/EmissiveWrapper.java | 35 ++++++ .../rendertype/MultiRenderTypeBakedModel.java | 6 +- .../rendertype/MultiRenderTypeWrapper.java | 25 ++++ .../{ => assets/portalcubed}/emissives.json | 0 11 files changed, 190 insertions(+), 180 deletions(-) create mode 100644 src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveData.java create mode 100644 src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveLoader.java create mode 100644 src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveWrapper.java create mode 100644 src/main/java/com/fusionflux/portalcubed/client/render/models/rendertype/MultiRenderTypeWrapper.java rename src/main/resources/{ => assets/portalcubed}/emissives.json (100%) diff --git a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java index ce20847f..5d3f7aa5 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java +++ b/src/main/java/com/fusionflux/portalcubed/client/PortalCubedClient.java @@ -14,11 +14,11 @@ import com.fusionflux.portalcubed.client.packet.PortalCubedClientPackets; import com.fusionflux.portalcubed.client.render.models.PortalCubedModelLoadingPlugin; import com.fusionflux.portalcubed.client.render.PortalHud; -import com.fusionflux.portalcubed.client.render.block.EmissiveSpriteRegistry; import com.fusionflux.portalcubed.client.render.block.entity.*; import com.fusionflux.portalcubed.client.render.entity.*; import com.fusionflux.portalcubed.client.render.entity.animatedtextures.AnimatedEntityTextures; import com.fusionflux.portalcubed.client.render.entity.model.*; +import com.fusionflux.portalcubed.client.render.models.emissive.EmissiveLoader; import com.fusionflux.portalcubed.client.render.portal.PortalRenderPhase; import com.fusionflux.portalcubed.client.render.portal.PortalRendererImpl; import com.fusionflux.portalcubed.client.render.portal.PortalRenderers; @@ -38,7 +38,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import com.mojang.brigadier.arguments.BoolArgumentType; -import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin; import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry; import net.fabricmc.fabric.api.client.render.fluid.v1.SimpleFluidRenderHandler; import net.fabricmc.fabric.api.client.rendering.v1.*; @@ -63,7 +63,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundSource; -import net.minecraft.util.GsonHelper; import net.minecraft.util.Mth; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; @@ -92,13 +91,10 @@ import org.quiltmc.qsl.networking.api.PacketByteBufs; import org.quiltmc.qsl.networking.api.client.ClientLoginConnectionEvents; import org.quiltmc.qsl.networking.api.client.ClientPlayNetworking; + import xyz.amymialee.visiblebarriers.VisibleBarriers; import java.io.File; -import java.io.IOException; -import java.io.Reader; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.text.DecimalFormat; import java.util.*; @@ -158,12 +154,11 @@ public void onInitializeClient(ModContainer mod) { registerEntityRenderers(); registerColorProviders(); - registerEmissiveModels(mod); PortalCubedClientPackets.registerPackets(); PortalCubedKeyBindings.register(); AnimatedEntityTextures.init(); - ModelLoadingPlugin.register(PortalCubedModelLoadingPlugin.INSTANCE); + PreparableModelLoadingPlugin.register(EmissiveLoader.INSTANCE, PortalCubedModelLoadingPlugin.INSTANCE); HudRenderCallback.EVENT.register(PortalHud::renderPortals); @@ -630,22 +625,6 @@ public static void transformCameraIntersectingPortal(Camera camera, Entity camer } } - private void registerEmissiveModels(ModContainer mod) { - try (Reader reader = Files.newBufferedReader(mod.getPath("emissives.json"), StandardCharsets.UTF_8)) { - for (final var entry : GsonHelper.parse(reader).entrySet()) { - if (entry.getValue().isJsonArray()) { - for (final var value : entry.getValue().getAsJsonArray()) { - EmissiveSpriteRegistry.register(id(entry.getKey()), id(value.getAsString())); - } - } else { - EmissiveSpriteRegistry.register(id(entry.getKey()), id(entry.getValue().getAsString())); - } - } - } catch (IOException e) { - PortalCubed.LOGGER.error("Failed to load emissives.json", e); - } - } - private void registerColorProviders() { ColorProviderRegistry.ITEM.register( (stack, tintIndex) -> tintIndex > 0 ? -1 : ((PortalGun) stack.getItem()).getSidedColor(stack), diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/block/EmissiveSpriteRegistry.java b/src/main/java/com/fusionflux/portalcubed/client/render/block/EmissiveSpriteRegistry.java index 387f583a..bcbac278 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/block/EmissiveSpriteRegistry.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/block/EmissiveSpriteRegistry.java @@ -1,6 +1,5 @@ package com.fusionflux.portalcubed.client.render.block; -import com.fusionflux.portalcubed.client.render.models.emissive.EmissiveBakedModel; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.resources.ResourceLocation; diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/models/PortalCubedModelLoadingPlugin.java b/src/main/java/com/fusionflux/portalcubed/client/render/models/PortalCubedModelLoadingPlugin.java index e37ddd06..8e1e8cb0 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/models/PortalCubedModelLoadingPlugin.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/models/PortalCubedModelLoadingPlugin.java @@ -1,51 +1,18 @@ package com.fusionflux.portalcubed.client.render.models; -import com.fusionflux.portalcubed.accessor.BlockElementExt; -import com.fusionflux.portalcubed.client.render.models.rendertype.MultiRenderTypeUnbakedModel; -import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import com.fusionflux.portalcubed.client.render.models.emissive.EmissiveData; +import com.fusionflux.portalcubed.client.render.models.emissive.EmissiveWrapper; +import com.fusionflux.portalcubed.client.render.models.rendertype.MultiRenderTypeWrapper; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin.Context; import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier; -import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier.BeforeBake; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; +import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin; -import net.minecraft.client.renderer.block.model.BlockElement; -import net.minecraft.client.renderer.block.model.BlockModel; -import net.minecraft.client.resources.model.UnbakedModel; - -public enum PortalCubedModelLoadingPlugin implements ModelLoadingPlugin { +public enum PortalCubedModelLoadingPlugin implements PreparableModelLoadingPlugin { INSTANCE; @Override - public void onInitializeModelLoader(Context ctx) { - Event beforeBake = ctx.modifyModelBeforeBake(); - beforeBake.register(ModelModifier.WRAP_PHASE, MultiRenderTypeWrapper.INSTANCE); - beforeBake.register(ModelModifier.WRAP_PHASE, EmissiveWrapper.INSTANCE); - } - - private enum MultiRenderTypeWrapper implements BeforeBake { - INSTANCE; - - @Override - public UnbakedModel modifyModelBeforeBake(UnbakedModel model, Context context) { - if (model instanceof BlockModel blockModel) { - for (BlockElement element : blockModel.getElements()) { - RenderMaterial material = ((BlockElementExt) element).portalcubed$getRenderMaterial(); - if (material != null) { - return new MultiRenderTypeUnbakedModel(blockModel); - } - } - } - - return model; - } - } - - private enum EmissiveWrapper implements BeforeBake { - INSTANCE; - - @Override - public UnbakedModel modifyModelBeforeBake(UnbakedModel model, Context context) { - return model; - } + public void onInitializeModelLoader(EmissiveData emissiveData, Context ctx) { + ctx.modifyModelBeforeBake().register(ModelModifier.WRAP_PHASE, new MultiRenderTypeWrapper()); + ctx.modifyModelAfterBake().register(ModelModifier.WRAP_PHASE, new EmissiveWrapper(emissiveData)); } } diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/models/RenderMaterials.java b/src/main/java/com/fusionflux/portalcubed/client/render/models/RenderMaterials.java index 9b282044..92debfcd 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/models/RenderMaterials.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/models/RenderMaterials.java @@ -1,6 +1,7 @@ package com.fusionflux.portalcubed.client.render.models; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import com.fusionflux.portalcubed.PortalCubed; @@ -11,26 +12,32 @@ import net.fabricmc.fabric.api.renderer.v1.material.MaterialFinder; import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; import net.fabricmc.fabric.api.util.TriState; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.Util; public class RenderMaterials { - private static final Renderer renderer = RendererAccess.INSTANCE.getRenderer(); - private static final MaterialFinder finder = renderer == null ? null : renderer.materialFinder(); + @Nullable + private static final MaterialFinder finder = Util.make(() -> { + Renderer renderer = RendererAccess.INSTANCE.getRenderer(); + return renderer == null ? null : renderer.materialFinder(); + }); public static final boolean ARE_SUPPORTED = checkSupport(); public static final Map BY_NAME = new HashMap<>(); - public static final RenderMaterial DEFAULT = makeMaterial("default", BlendMode.DEFAULT, false); - public static final RenderMaterial SOLID = makeMaterial("solid", BlendMode.SOLID, false); - public static final RenderMaterial CUTOUT = makeMaterial("cutout", BlendMode.CUTOUT, false); - public static final RenderMaterial CUTOUT_MIPPED = makeMaterial("cutout_mipped", BlendMode.CUTOUT_MIPPED, false); - public static final RenderMaterial TRANSLUCENT = makeMaterial("translucent", BlendMode.TRANSLUCENT, false); + public static final RenderMaterial DEFAULT = makeMaterial(BlendMode.DEFAULT, false); + public static final RenderMaterial SOLID = makeMaterial(BlendMode.SOLID, false); + public static final RenderMaterial CUTOUT = makeMaterial(BlendMode.CUTOUT, false); + public static final RenderMaterial CUTOUT_MIPPED = makeMaterial(BlendMode.CUTOUT_MIPPED, false); + public static final RenderMaterial TRANSLUCENT = makeMaterial(BlendMode.TRANSLUCENT, false); - public static final RenderMaterial DEFAULT_EMISSIVE = makeMaterial("default_emissive", BlendMode.DEFAULT, true); - public static final RenderMaterial SOLID_EMISSIVE = makeMaterial("solid_emissive", BlendMode.SOLID, true); - public static final RenderMaterial CUTOUT_EMISSIVE = makeMaterial("cutout_emissive", BlendMode.CUTOUT, true); - public static final RenderMaterial CUTOUT_MIPPED_EMISSIVE = makeMaterial("cutout_mipped_emissive", BlendMode.CUTOUT_MIPPED, true); - public static final RenderMaterial TRANSLUCENT_EMISSIVE = makeMaterial("translucent_emissive", BlendMode.TRANSLUCENT, true); + public static final RenderMaterial DEFAULT_EMISSIVE = makeMaterial(BlendMode.DEFAULT, true); + public static final RenderMaterial SOLID_EMISSIVE = makeMaterial(BlendMode.SOLID, true); + public static final RenderMaterial CUTOUT_EMISSIVE = makeMaterial(BlendMode.CUTOUT, true); + public static final RenderMaterial CUTOUT_MIPPED_EMISSIVE = makeMaterial(BlendMode.CUTOUT_MIPPED, true); + public static final RenderMaterial TRANSLUCENT_EMISSIVE = makeMaterial(BlendMode.TRANSLUCENT, true); public static final String SUPPORTED_TYPES = String.join(", ", BY_NAME.keySet()); @@ -52,15 +59,17 @@ public static RenderMaterial parse(String name) { return material; } - private static RenderMaterial makeMaterial(String name, BlendMode mode, boolean emissive) { + private static RenderMaterial makeMaterial(BlendMode mode, boolean emissive) { if (finder == null) return null; finder.clear().blendMode(mode); + String name = mode.name().toLowerCase(Locale.ROOT); if (emissive) { finder.emissive(true) .disableDiffuse(true) .ambientOcclusion(TriState.FALSE); + name += "_emissive"; } RenderMaterial material = finder.find(); BY_NAME.put(name, material); @@ -68,7 +77,7 @@ private static RenderMaterial makeMaterial(String name, BlendMode mode, boolean } private static boolean checkSupport() { - if (renderer == null) { + if (finder == null) { PortalCubed.LOGGER.error("No renderer present, rendering will be wrong. If you have Sodium, install Indium!"); return false; } diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveBakedModel.java b/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveBakedModel.java index 31c4bff6..0044983a 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveBakedModel.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveBakedModel.java @@ -1,108 +1,29 @@ package com.fusionflux.portalcubed.client.render.models.emissive; -import com.fusionflux.portalcubed.client.render.block.EmissiveSpriteRegistry; +import java.util.Collection; + import com.fusionflux.portalcubed.client.render.models.RenderMaterials; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import com.fusionflux.portalcubed.client.render.models.rendertype.MultiRenderTypeBakedModel; import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; -import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; -import net.fabricmc.fabric.api.renderer.v1.model.SpriteFinder; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform; -import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.client.Minecraft; +import org.apache.commons.lang3.tuple.Triple; + import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlas; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; +import net.minecraft.client.resources.model.SimpleBakedModel; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.RandomSource; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; - -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; -import java.util.function.Supplier; - -public final class EmissiveBakedModel extends ForwardingBakedModel { - - private static final Map> WRAPPERS = new Object2ObjectOpenHashMap<>(); - - public static void register(ResourceLocation modelId) { - WRAPPERS.put(modelId, EmissiveBakedModel::new); - } - public static Optional wrap(ResourceLocation modelId, BakedModel model) { - if (!RenderMaterials.ARE_SUPPORTED) - return Optional.empty(); - final Function wrapper = WRAPPERS.get(new ResourceLocation(modelId.getNamespace(), modelId.getPath())); - if (wrapper != null) return Optional.of(wrapper.apply(model)); - return Optional.empty(); - } - - private static final Map TO_EMISSIVE = new ConcurrentHashMap<>(); - - private final QuadTransform emissiveTransform; - - EmissiveBakedModel(BakedModel model) { - this.wrapped = model; - this.emissiveTransform = quad -> { - TextureAtlasSprite sprite = getSpriteFinder().find(quad); - if (EmissiveSpriteRegistry.isEmissive(sprite.contents().name())) { - RenderMaterial material = quad.material(); - quad.material(getEmissiveMaterial(material)); +public class EmissiveBakedModel extends MultiRenderTypeBakedModel { + public EmissiveBakedModel(SimpleBakedModel model, Collection emissiveTextures) { + super(model); + for (int i = 0; i < this.quads.size(); i++) { + Triple triple = quads.get(i); + ResourceLocation texture = triple.getLeft().getSprite().contents().name(); + if (emissiveTextures.contains(texture)) { + RenderMaterial material = triple.getMiddle(); + RenderMaterial emissive = RenderMaterials.get(material.blendMode(), true); + Triple newTriple = Triple.of(triple.getLeft(), emissive, triple.getRight()); + quads.set(i, newTriple); } - return true; - }; - } - - @Override - public boolean isVanillaAdapter() { - return false; - } - - @Override - public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { - context.pushTransform(emissiveTransform); - super.emitBlockQuads(blockView, state, pos, randomSupplier, context); - context.popTransform(); - } - - @Override - public void emitItemQuads(ItemStack stack, Supplier randomSupplier, RenderContext context) { - context.pushTransform(emissiveTransform); - super.emitItemQuads(stack, randomSupplier, context); - context.popTransform(); - } - - @Override - public List getQuads(BlockState blockState, Direction face, RandomSource rand) { - throw new UnsupportedOperationException("isVanillaAdapter is false! call emitBlockQuads/emitItemQuads!"); - } - - public static RenderMaterial getEmissiveMaterial(RenderMaterial base) { - return TO_EMISSIVE.computeIfAbsent(base, EmissiveBakedModel::makeEmissiveMaterial); - } - - private static RenderMaterial makeEmissiveMaterial(RenderMaterial base) { - throw new RuntimeException("a"); -// return RenderMaterials.FINDER.copyFrom(base) -// .emissive(true) -// .disableDiffuse(true) -// .ambientOcclusion(TriState.FALSE) -// .find(); - } - - private static SpriteFinder getSpriteFinder() { - TextureAtlas blockAtlas = Minecraft.getInstance() - .getModelManager() - .getAtlas(InventoryMenu.BLOCK_ATLAS); - return SpriteFinder.get(blockAtlas); + } } } diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveData.java b/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveData.java new file mode 100644 index 00000000..fa83a3ed --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveData.java @@ -0,0 +1,13 @@ +package com.fusionflux.portalcubed.client.render.models.emissive; + +import java.util.Collection; + +import com.google.common.collect.Multimap; + +import net.minecraft.resources.ResourceLocation; + +public record EmissiveData(Multimap map) { + public Collection getEmissiveTexturesForModel(ResourceLocation modelId) { + return map.get(modelId); + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveLoader.java b/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveLoader.java new file mode 100644 index 00000000..316c6cb1 --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveLoader.java @@ -0,0 +1,58 @@ +package com.fusionflux.portalcubed.client.render.models.emissive; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +import com.fusionflux.portalcubed.PortalCubed; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonPrimitive; +import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin.DataLoader; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.util.GsonHelper; + +public enum EmissiveLoader implements DataLoader { + INSTANCE; + + public static final ResourceLocation EMISSIVES_JSON_LOCATION = PortalCubed.id("emissives.json"); + + @Override + public CompletableFuture load(ResourceManager manager, Executor executor) { + return CompletableFuture.supplyAsync(() -> manager.getResource(EMISSIVES_JSON_LOCATION).map(resource -> { + try { + Multimap modelToTextures = HashMultimap.create(); + GsonHelper.parse(resource.openAsReader()).asMap().forEach((model, element) -> { + ResourceLocation modelId = getId(model); + List textures = getTextures(element); + modelToTextures.putAll(modelId, textures); + }); + return new EmissiveData(modelToTextures); + } catch (IOException e) { + throw new RuntimeException(e); + } + }).orElseThrow(), executor); + } + + private static List getTextures(JsonElement element) { + if (element instanceof JsonArray array) { + return array.asList().stream().map(JsonElement::getAsString).map(EmissiveLoader::getId).toList(); + } else if (element instanceof JsonPrimitive) { + return List.of(getId(element.getAsString())); + } + return List.of(); + } + + private static ResourceLocation getId(String path) { + if (path.contains(":")) { + return new ResourceLocation(path); + } else { + return PortalCubed.id(path); + } + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveWrapper.java b/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveWrapper.java new file mode 100644 index 00000000..33d1d2ab --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveWrapper.java @@ -0,0 +1,35 @@ +package com.fusionflux.portalcubed.client.render.models.emissive; + +import java.util.Collection; + +import com.fusionflux.portalcubed.client.render.models.rendertype.MultiRenderTypeBakedModel; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier.AfterBake; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.resources.model.SimpleBakedModel; +import net.minecraft.resources.ResourceLocation; + +public record EmissiveWrapper(EmissiveData data) implements AfterBake { + @Override + @Nullable + public BakedModel modifyModelAfterBake(BakedModel model, Context context) { + Collection textures = data.getEmissiveTexturesForModel(context.id()); + if (!textures.isEmpty()) { + SimpleBakedModel simple = getSimpleBakedModel(model); + if (simple != null) { + return new EmissiveBakedModel(simple, textures); + } + } + return model; + } + + private SimpleBakedModel getSimpleBakedModel(BakedModel model) { + if (model instanceof SimpleBakedModel simple) { + return simple; + } else if (model instanceof MultiRenderTypeBakedModel multi) { + return (SimpleBakedModel) multi.getWrappedModel(); + } + return null; + } +} diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/models/rendertype/MultiRenderTypeBakedModel.java b/src/main/java/com/fusionflux/portalcubed/client/render/models/rendertype/MultiRenderTypeBakedModel.java index 5bc7c924..d733c2e8 100644 --- a/src/main/java/com/fusionflux/portalcubed/client/render/models/rendertype/MultiRenderTypeBakedModel.java +++ b/src/main/java/com/fusionflux/portalcubed/client/render/models/rendertype/MultiRenderTypeBakedModel.java @@ -39,11 +39,15 @@ public MultiRenderTypeBakedModel(SimpleBakedModel model) { culled.forEach((cullFace, quads) -> quads.forEach(quad -> addQuad(quad, cullFace))); } - private void addQuad(BakedQuad quad, @Nullable Direction cullFace) { + protected void addQuad(BakedQuad quad, @Nullable Direction cullFace) { RenderMaterial material = ((BakedQuadExt) quad).portalcubed$getRenderMaterial(); if (material == null) { material = RenderMaterials.DEFAULT; } + this.addQuad(quad, material, cullFace); + } + + protected void addQuad(BakedQuad quad, RenderMaterial material, @Nullable Direction cullFace) { this.quads.add(Triple.of(quad, material, cullFace)); } diff --git a/src/main/java/com/fusionflux/portalcubed/client/render/models/rendertype/MultiRenderTypeWrapper.java b/src/main/java/com/fusionflux/portalcubed/client/render/models/rendertype/MultiRenderTypeWrapper.java new file mode 100644 index 00000000..8c833d7f --- /dev/null +++ b/src/main/java/com/fusionflux/portalcubed/client/render/models/rendertype/MultiRenderTypeWrapper.java @@ -0,0 +1,25 @@ +package com.fusionflux.portalcubed.client.render.models.rendertype; + +import com.fusionflux.portalcubed.accessor.BlockElementExt; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier.BeforeBake; +import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; + +import net.minecraft.client.renderer.block.model.BlockElement; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.resources.model.UnbakedModel; + +public class MultiRenderTypeWrapper implements BeforeBake { + @Override + public UnbakedModel modifyModelBeforeBake(UnbakedModel model, Context context) { + if (model instanceof BlockModel blockModel) { + for (BlockElement element : blockModel.getElements()) { + RenderMaterial material = ((BlockElementExt) element).portalcubed$getRenderMaterial(); + if (material != null) { + return new MultiRenderTypeUnbakedModel(blockModel); + } + } + } + + return model; + } +} diff --git a/src/main/resources/emissives.json b/src/main/resources/assets/portalcubed/emissives.json similarity index 100% rename from src/main/resources/emissives.json rename to src/main/resources/assets/portalcubed/emissives.json