From 466427e9746029dfe8cd4273944a8e2fe4e8f57e Mon Sep 17 00:00:00 2001 From: Eclipse Date: Tue, 14 Oct 2025 08:33:38 +0000 Subject: [PATCH] Split the mod in half --- client/build.gradle.kts | 6 ++ .../client/MinecraftAssetResolver.java | 41 +++++++++ .../geysermc/rainbow/client}/PackManager.java | 5 +- .../rainbow/client/RainbowClient.java | 27 ++++++ .../accessor/ResolvedModelAccessor.java | 2 +- .../CommandSuggestionsArgumentType.java | 2 +- .../client}/command/PackGeneratorCommand.java | 8 +- .../client}/mapper/CustomItemProvider.java | 2 +- .../client}/mapper/InventoryMapper.java | 2 +- .../mapper/ItemSuggestionProvider.java | 2 +- .../rainbow/client}/mapper/PackMapper.java | 5 +- .../mixin/EntityRenderDispatcherAccessor.java | 2 +- .../mixin/GuiItemRenderStateMixin.java | 2 +- .../client}/mixin/ModelManagerMixin.java | 4 +- .../PictureInPictureRendererAccessor.java | 2 +- .../mixin/PictureInPictureRendererMixin.java | 4 +- .../client}/mixin/SplashRendererAccessor.java | 2 +- .../render/MinecraftGeometryRenderer.java | 81 ++++++++++++++++++ .../render/PictureInPictureCopyRenderer.java | 2 +- .../main/resources/assets/rainbow/icon.png | Bin .../resources/assets/rainbow/lang/en_us.json | 0 client/src/main/resources/fabric.mod.json | 38 ++++++++ .../main/resources/rainbow-client.mixins.json | 18 ++++ .../java/org/geysermc/rainbow/Rainbow.java | 23 +---- .../rainbow/mapping/AssetResolver.java | 25 ++++++ .../rainbow/mapping/BedrockItemMapper.java | 21 ++--- .../geysermc/rainbow/mapping/PackContext.java | 4 +- .../mapping/attachable/AttachableMapper.java | 10 +-- .../mapping/geometry/GeometryRenderer.java | 73 +--------------- .../geometry/NoopGeometryRenderer.java | 14 +++ .../geysermc/rainbow/pack/BedrockPack.java | 34 ++++---- .../src/main/resources/rainbow.mixins.json | 6 -- 32 files changed, 307 insertions(+), 160 deletions(-) create mode 100644 client/src/main/java/org/geysermc/rainbow/client/MinecraftAssetResolver.java rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/PackManager.java (89%) create mode 100644 client/src/main/java/org/geysermc/rainbow/client/RainbowClient.java rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/accessor/ResolvedModelAccessor.java (93%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/command/CommandSuggestionsArgumentType.java (98%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/command/PackGeneratorCommand.java (97%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mapper/CustomItemProvider.java (88%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mapper/InventoryMapper.java (93%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mapper/ItemSuggestionProvider.java (97%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mapper/PackMapper.java (94%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mixin/EntityRenderDispatcherAccessor.java (89%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mixin/GuiItemRenderStateMixin.java (92%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mixin/ModelManagerMixin.java (96%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mixin/PictureInPictureRendererAccessor.java (88%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mixin/PictureInPictureRendererMixin.java (90%) rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/mixin/SplashRendererAccessor.java (85%) create mode 100644 client/src/main/java/org/geysermc/rainbow/client/render/MinecraftGeometryRenderer.java rename {rainbow/src/main/java/org/geysermc/rainbow => client/src/main/java/org/geysermc/rainbow/client}/render/PictureInPictureCopyRenderer.java (66%) rename {rainbow => client}/src/main/resources/assets/rainbow/icon.png (100%) rename {rainbow => client}/src/main/resources/assets/rainbow/lang/en_us.json (100%) create mode 100644 client/src/main/resources/fabric.mod.json create mode 100644 client/src/main/resources/rainbow-client.mixins.json create mode 100644 rainbow/src/main/java/org/geysermc/rainbow/mapping/AssetResolver.java create mode 100644 rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/NoopGeometryRenderer.java diff --git a/client/build.gradle.kts b/client/build.gradle.kts index def7c69..7ad5470 100644 --- a/client/build.gradle.kts +++ b/client/build.gradle.kts @@ -1,3 +1,9 @@ plugins { id("rainbow.base-conventions") } + +dependencies { + // Implement namedElements so IntelliJ can use it correctly, but include the remapped build + implementation(project(path = ":rainbow", configuration = "namedElements")) + include(project(":rainbow")) +} diff --git a/client/src/main/java/org/geysermc/rainbow/client/MinecraftAssetResolver.java b/client/src/main/java/org/geysermc/rainbow/client/MinecraftAssetResolver.java new file mode 100644 index 0000000..1a1c392 --- /dev/null +++ b/client/src/main/java/org/geysermc/rainbow/client/MinecraftAssetResolver.java @@ -0,0 +1,41 @@ +package org.geysermc.rainbow.client; + +import net.minecraft.client.renderer.item.ClientItem; +import net.minecraft.client.resources.model.EquipmentClientInfo; +import net.minecraft.client.resources.model.ResolvedModel; +import net.minecraft.core.HolderLookup; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.equipment.EquipmentAsset; +import org.geysermc.rainbow.mapping.AssetResolver; + +import java.io.InputStream; +import java.util.Optional; + +public class MinecraftAssetResolver implements AssetResolver { + + @Override + public Optional getResolvedModel(ResourceLocation location) { + return Optional.empty(); + } + + @Override + public Optional getClientItem(ResourceLocation location) { + return Optional.empty(); + } + + @Override + public EquipmentClientInfo getEquipmentInfo(ResourceKey key) { + return null; + } + + @Override + public InputStream getTexture(ResourceLocation location) { + return null; + } + + @Override + public HolderLookup.Provider registries() { + return null; + } +} diff --git a/rainbow/src/main/java/org/geysermc/rainbow/PackManager.java b/client/src/main/java/org/geysermc/rainbow/client/PackManager.java similarity index 89% rename from rainbow/src/main/java/org/geysermc/rainbow/PackManager.java rename to client/src/main/java/org/geysermc/rainbow/client/PackManager.java index 8148d5d..458609d 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/PackManager.java +++ b/client/src/main/java/org/geysermc/rainbow/client/PackManager.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow; +package org.geysermc.rainbow.client; import org.geysermc.rainbow.pack.BedrockPack; @@ -6,7 +6,6 @@ import java.io.IOException; import java.nio.file.Path; import java.util.Optional; import java.util.function.Consumer; -import java.util.function.Function; public final class PackManager { @@ -17,7 +16,7 @@ public final class PackManager { throw new IllegalStateException("Already started a pack (" + currentPack.get().name() + ")"); } - currentPack = Optional.of(new BedrockPack(name)); + currentPack = Optional.of(new BedrockPack(name, new MinecraftAssetResolver())); } public void run(Consumer consumer) { diff --git a/client/src/main/java/org/geysermc/rainbow/client/RainbowClient.java b/client/src/main/java/org/geysermc/rainbow/client/RainbowClient.java new file mode 100644 index 0000000..1ef7cea --- /dev/null +++ b/client/src/main/java/org/geysermc/rainbow/client/RainbowClient.java @@ -0,0 +1,27 @@ +package org.geysermc.rainbow.client; + +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.command.v2.ArgumentTypeRegistry; +import net.minecraft.commands.synchronization.SingletonArgumentInfo; +import org.geysermc.rainbow.Rainbow; +import org.geysermc.rainbow.client.command.CommandSuggestionsArgumentType; +import org.geysermc.rainbow.client.command.PackGeneratorCommand; +import org.geysermc.rainbow.client.mapper.PackMapper; + +public class RainbowClient implements ClientModInitializer { + + private final PackManager packManager = new PackManager(); + private final PackMapper packMapper = new PackMapper(packManager); + + // TODO export language overrides + @Override + public void onInitializeClient() { + ClientCommandRegistrationCallback.EVENT.register((dispatcher, buildContext) -> PackGeneratorCommand.register(dispatcher, packManager, packMapper)); + ClientTickEvents.START_CLIENT_TICK.register(packMapper::tick); + + ArgumentTypeRegistry.registerArgumentType(Rainbow.getModdedLocation("command_suggestions"), + CommandSuggestionsArgumentType.class, SingletonArgumentInfo.contextFree(CommandSuggestionsArgumentType::new)); + } +} diff --git a/rainbow/src/main/java/org/geysermc/rainbow/accessor/ResolvedModelAccessor.java b/client/src/main/java/org/geysermc/rainbow/client/accessor/ResolvedModelAccessor.java similarity index 93% rename from rainbow/src/main/java/org/geysermc/rainbow/accessor/ResolvedModelAccessor.java rename to client/src/main/java/org/geysermc/rainbow/client/accessor/ResolvedModelAccessor.java index c8f0aae..c3a2cd3 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/accessor/ResolvedModelAccessor.java +++ b/client/src/main/java/org/geysermc/rainbow/client/accessor/ResolvedModelAccessor.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.accessor; +package org.geysermc.rainbow.client.accessor; import net.minecraft.client.renderer.item.ClientItem; import net.minecraft.client.resources.model.ResolvedModel; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/command/CommandSuggestionsArgumentType.java b/client/src/main/java/org/geysermc/rainbow/client/command/CommandSuggestionsArgumentType.java similarity index 98% rename from rainbow/src/main/java/org/geysermc/rainbow/command/CommandSuggestionsArgumentType.java rename to client/src/main/java/org/geysermc/rainbow/client/command/CommandSuggestionsArgumentType.java index f1f812a..23add2a 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/command/CommandSuggestionsArgumentType.java +++ b/client/src/main/java/org/geysermc/rainbow/client/command/CommandSuggestionsArgumentType.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.command; +package org.geysermc.rainbow.client.command; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/command/PackGeneratorCommand.java b/client/src/main/java/org/geysermc/rainbow/client/command/PackGeneratorCommand.java similarity index 97% rename from rainbow/src/main/java/org/geysermc/rainbow/command/PackGeneratorCommand.java rename to client/src/main/java/org/geysermc/rainbow/client/command/PackGeneratorCommand.java index 2743826..adcc51f 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/command/PackGeneratorCommand.java +++ b/client/src/main/java/org/geysermc/rainbow/client/command/PackGeneratorCommand.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.command; +package org.geysermc.rainbow.client.command; import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; @@ -10,9 +10,9 @@ import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.item.ItemStack; -import org.geysermc.rainbow.PackManager; -import org.geysermc.rainbow.mapper.InventoryMapper; -import org.geysermc.rainbow.mapper.PackMapper; +import org.geysermc.rainbow.client.PackManager; +import org.geysermc.rainbow.client.mapper.InventoryMapper; +import org.geysermc.rainbow.client.mapper.PackMapper; import org.geysermc.rainbow.pack.BedrockPack; import java.nio.file.Path; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapper/CustomItemProvider.java b/client/src/main/java/org/geysermc/rainbow/client/mapper/CustomItemProvider.java similarity index 88% rename from rainbow/src/main/java/org/geysermc/rainbow/mapper/CustomItemProvider.java rename to client/src/main/java/org/geysermc/rainbow/client/mapper/CustomItemProvider.java index 8a8c7ad..8708f5d 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapper/CustomItemProvider.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mapper/CustomItemProvider.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.mapper; +package org.geysermc.rainbow.client.mapper; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapper/InventoryMapper.java b/client/src/main/java/org/geysermc/rainbow/client/mapper/InventoryMapper.java similarity index 93% rename from rainbow/src/main/java/org/geysermc/rainbow/mapper/InventoryMapper.java rename to client/src/main/java/org/geysermc/rainbow/client/mapper/InventoryMapper.java index 5cfde28..4bac740 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapper/InventoryMapper.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mapper/InventoryMapper.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.mapper; +package org.geysermc.rainbow.client.mapper; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapper/ItemSuggestionProvider.java b/client/src/main/java/org/geysermc/rainbow/client/mapper/ItemSuggestionProvider.java similarity index 97% rename from rainbow/src/main/java/org/geysermc/rainbow/mapper/ItemSuggestionProvider.java rename to client/src/main/java/org/geysermc/rainbow/client/mapper/ItemSuggestionProvider.java index fea136a..33ef127 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapper/ItemSuggestionProvider.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mapper/ItemSuggestionProvider.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.mapper; +package org.geysermc.rainbow.client.mapper; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapper/PackMapper.java b/client/src/main/java/org/geysermc/rainbow/client/mapper/PackMapper.java similarity index 94% rename from rainbow/src/main/java/org/geysermc/rainbow/mapper/PackMapper.java rename to client/src/main/java/org/geysermc/rainbow/client/mapper/PackMapper.java index ce9666a..cb56500 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapper/PackMapper.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mapper/PackMapper.java @@ -1,14 +1,13 @@ -package org.geysermc.rainbow.mapper; +package org.geysermc.rainbow.client.mapper; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.player.LocalPlayer; import net.minecraft.network.chat.Component; -import org.geysermc.rainbow.PackManager; +import org.geysermc.rainbow.client.PackManager; import org.geysermc.rainbow.pack.BedrockPack; import java.util.Objects; -import java.util.Optional; public class PackMapper { private final PackManager packManager; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mixin/EntityRenderDispatcherAccessor.java b/client/src/main/java/org/geysermc/rainbow/client/mixin/EntityRenderDispatcherAccessor.java similarity index 89% rename from rainbow/src/main/java/org/geysermc/rainbow/mixin/EntityRenderDispatcherAccessor.java rename to client/src/main/java/org/geysermc/rainbow/client/mixin/EntityRenderDispatcherAccessor.java index 6dcc361..2267bd9 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mixin/EntityRenderDispatcherAccessor.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mixin/EntityRenderDispatcherAccessor.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.mixin; +package org.geysermc.rainbow.client.mixin; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.resources.model.EquipmentAssetManager; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mixin/GuiItemRenderStateMixin.java b/client/src/main/java/org/geysermc/rainbow/client/mixin/GuiItemRenderStateMixin.java similarity index 92% rename from rainbow/src/main/java/org/geysermc/rainbow/mixin/GuiItemRenderStateMixin.java rename to client/src/main/java/org/geysermc/rainbow/client/mixin/GuiItemRenderStateMixin.java index 70e1b9d..8b76205 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mixin/GuiItemRenderStateMixin.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mixin/GuiItemRenderStateMixin.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.mixin; +package org.geysermc.rainbow.client.mixin; import net.minecraft.client.gui.render.state.GuiItemRenderState; import net.minecraft.client.gui.render.state.ScreenArea; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mixin/ModelManagerMixin.java b/client/src/main/java/org/geysermc/rainbow/client/mixin/ModelManagerMixin.java similarity index 96% rename from rainbow/src/main/java/org/geysermc/rainbow/mixin/ModelManagerMixin.java rename to client/src/main/java/org/geysermc/rainbow/client/mixin/ModelManagerMixin.java index f3d92dd..acd0a57 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mixin/ModelManagerMixin.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mixin/ModelManagerMixin.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.mixin; +package org.geysermc.rainbow.client.mixin; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; @@ -9,7 +9,7 @@ import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.ResolvedModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.resources.PreparableReloadListener; -import org.geysermc.rainbow.accessor.ResolvedModelAccessor; +import org.geysermc.rainbow.client.accessor.ResolvedModelAccessor; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mixin/PictureInPictureRendererAccessor.java b/client/src/main/java/org/geysermc/rainbow/client/mixin/PictureInPictureRendererAccessor.java similarity index 88% rename from rainbow/src/main/java/org/geysermc/rainbow/mixin/PictureInPictureRendererAccessor.java rename to client/src/main/java/org/geysermc/rainbow/client/mixin/PictureInPictureRendererAccessor.java index 4c6d5e4..4a51697 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mixin/PictureInPictureRendererAccessor.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mixin/PictureInPictureRendererAccessor.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.mixin; +package org.geysermc.rainbow.client.mixin; import com.mojang.blaze3d.textures.GpuTexture; import net.minecraft.client.gui.render.pip.PictureInPictureRenderer; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mixin/PictureInPictureRendererMixin.java b/client/src/main/java/org/geysermc/rainbow/client/mixin/PictureInPictureRendererMixin.java similarity index 90% rename from rainbow/src/main/java/org/geysermc/rainbow/mixin/PictureInPictureRendererMixin.java rename to client/src/main/java/org/geysermc/rainbow/client/mixin/PictureInPictureRendererMixin.java index a665dee..3329a71 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mixin/PictureInPictureRendererMixin.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mixin/PictureInPictureRendererMixin.java @@ -1,8 +1,8 @@ -package org.geysermc.rainbow.mixin; +package org.geysermc.rainbow.client.mixin; import com.mojang.blaze3d.textures.GpuTexture; import net.minecraft.client.gui.render.pip.PictureInPictureRenderer; -import org.geysermc.rainbow.render.PictureInPictureCopyRenderer; +import org.geysermc.rainbow.client.render.PictureInPictureCopyRenderer; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mixin/SplashRendererAccessor.java b/client/src/main/java/org/geysermc/rainbow/client/mixin/SplashRendererAccessor.java similarity index 85% rename from rainbow/src/main/java/org/geysermc/rainbow/mixin/SplashRendererAccessor.java rename to client/src/main/java/org/geysermc/rainbow/client/mixin/SplashRendererAccessor.java index 95fcb8e..0f5a4a3 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mixin/SplashRendererAccessor.java +++ b/client/src/main/java/org/geysermc/rainbow/client/mixin/SplashRendererAccessor.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.mixin; +package org.geysermc.rainbow.client.mixin; import net.minecraft.client.gui.components.SplashRenderer; import org.spongepowered.asm.mixin.Mixin; diff --git a/client/src/main/java/org/geysermc/rainbow/client/render/MinecraftGeometryRenderer.java b/client/src/main/java/org/geysermc/rainbow/client/render/MinecraftGeometryRenderer.java new file mode 100644 index 0000000..b8243fb --- /dev/null +++ b/client/src/main/java/org/geysermc/rainbow/client/render/MinecraftGeometryRenderer.java @@ -0,0 +1,81 @@ +package org.geysermc.rainbow.client.render; + +import com.mojang.blaze3d.buffers.GpuBuffer; +import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.blaze3d.systems.CommandEncoder; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.textures.GpuTexture; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.gui.render.pip.OversizedItemRenderer; +import net.minecraft.client.gui.render.state.GuiItemRenderState; +import net.minecraft.client.gui.render.state.GuiRenderState; +import net.minecraft.client.gui.render.state.pip.OversizedItemRenderState; +import net.minecraft.client.renderer.item.TrackingItemStackRenderState; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import org.geysermc.rainbow.CodecUtil; +import org.geysermc.rainbow.mapping.geometry.GeometryRenderer; +import org.geysermc.rainbow.client.mixin.PictureInPictureRendererAccessor; +import org.joml.Matrix3x2fStack; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Objects; + +// TODO maybe just use this even for normal 2D items, not sure, could be useful for composite models and stuff +// TODO output in a size bedrock likes +public class MinecraftGeometryRenderer implements GeometryRenderer { + + @Override + public boolean render(ItemStack stack, Path path) { + TrackingItemStackRenderState itemRenderState = new TrackingItemStackRenderState(); + Minecraft.getInstance().getItemModelResolver().updateForTopItem(itemRenderState, stack, ItemDisplayContext.GUI, null, null, 0); + itemRenderState.setOversizedInGui(true); + + GuiItemRenderState guiItemRenderState = new GuiItemRenderState("geometry_render", new Matrix3x2fStack(16), itemRenderState, 0, 0, null); + ScreenRectangle sizeBounds = guiItemRenderState.oversizedItemBounds(); + Objects.requireNonNull(sizeBounds); + OversizedItemRenderState oversizedRenderState = new OversizedItemRenderState(guiItemRenderState, sizeBounds.left(), sizeBounds.top(), sizeBounds.right() + 4, sizeBounds.bottom() + 4); + + try (OversizedItemRenderer itemRenderer = new OversizedItemRenderer(Minecraft.getInstance().renderBuffers().bufferSource())) { + //noinspection DataFlowIssue + ((PictureInPictureCopyRenderer) itemRenderer).rainbow$allowTextureCopy(); + itemRenderer.prepare(oversizedRenderState, new GuiRenderState(), 4); + writeAsPNG(path, ((PictureInPictureRendererAccessor) itemRenderer).getTexture()); + } + return true; + } + + // Simplified TextureUtil#writeAsPNG with some modifications to flip the image and just generate it at full size + private static void writeAsPNG(Path path, GpuTexture texture) { + RenderSystem.assertOnRenderThread(); + int width = texture.getWidth(0); + int height = texture.getHeight(0); + int bufferSize = texture.getFormat().pixelSize() * width * height; + + GpuBuffer buffer = RenderSystem.getDevice().createBuffer(() -> "Texture output buffer", GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_MAP_READ, bufferSize); + CommandEncoder commandEncoder = RenderSystem.getDevice().createCommandEncoder(); + + Runnable writer = () -> { + try (GpuBuffer.MappedView mappedView = commandEncoder.mapBuffer(buffer, true, false)) { + try (NativeImage nativeImage = new NativeImage(width, height, false)) { + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int colour = mappedView.data().getInt((x + y * width) * texture.getFormat().pixelSize()); + nativeImage.setPixelABGR(x, height - y - 1, colour); + } + } + + CodecUtil.ensureDirectoryExists(path.getParent()); + nativeImage.writeToFile(path); + } catch (IOException var19) { + // TODO + } + } + + buffer.close(); + }; + commandEncoder.copyTextureToBuffer(texture, buffer, 0, writer, 0); + } +} diff --git a/rainbow/src/main/java/org/geysermc/rainbow/render/PictureInPictureCopyRenderer.java b/client/src/main/java/org/geysermc/rainbow/client/render/PictureInPictureCopyRenderer.java similarity index 66% rename from rainbow/src/main/java/org/geysermc/rainbow/render/PictureInPictureCopyRenderer.java rename to client/src/main/java/org/geysermc/rainbow/client/render/PictureInPictureCopyRenderer.java index df2a497..d4c6da8 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/render/PictureInPictureCopyRenderer.java +++ b/client/src/main/java/org/geysermc/rainbow/client/render/PictureInPictureCopyRenderer.java @@ -1,4 +1,4 @@ -package org.geysermc.rainbow.render; +package org.geysermc.rainbow.client.render; public interface PictureInPictureCopyRenderer { diff --git a/rainbow/src/main/resources/assets/rainbow/icon.png b/client/src/main/resources/assets/rainbow/icon.png similarity index 100% rename from rainbow/src/main/resources/assets/rainbow/icon.png rename to client/src/main/resources/assets/rainbow/icon.png diff --git a/rainbow/src/main/resources/assets/rainbow/lang/en_us.json b/client/src/main/resources/assets/rainbow/lang/en_us.json similarity index 100% rename from rainbow/src/main/resources/assets/rainbow/lang/en_us.json rename to client/src/main/resources/assets/rainbow/lang/en_us.json diff --git a/client/src/main/resources/fabric.mod.json b/client/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..0dd34a6 --- /dev/null +++ b/client/src/main/resources/fabric.mod.json @@ -0,0 +1,38 @@ +{ + "schemaVersion": 1, + "id": "rainbow-client", + "version": "${version}", + "name": "Rainbow", + "description": "Rainbow is a mod to generate Geyser item mappings and bedrock resourcepacks for use with Geyser's custom item API (v2)", + "authors": [ + "GeyserMC contributors" + ], + "contact": { + "homepage": "https://github.com/GeyserMC/rainbow", + "issues": "https://github.com/GeyserMC/rainbow/issues", + "sources": "https://github.com/GeyserMC/rainbow" + }, + "license": "MIT", + "icon": "assets/rainbow/icon.png", + "environment": "client", + "entrypoints": { + "client": [ + "org.geysermc.rainbow.client.RainbowClient" + ] + }, + "mixins": [ + "rainbow-client.mixins.json" + ], + "depends": { + "fabricloader": ">=${loader_version}", + "fabric-api": "*", + "minecraft": "${supported_versions}" + }, + "custom": { + "modmenu": { + "links": { + "modmenu.discord": "https://discord.gg/GeyserMC" + } + } + } +} diff --git a/client/src/main/resources/rainbow-client.mixins.json b/client/src/main/resources/rainbow-client.mixins.json new file mode 100644 index 0000000..bc5f880 --- /dev/null +++ b/client/src/main/resources/rainbow-client.mixins.json @@ -0,0 +1,18 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "org.geysermc.rainbow.client.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [], + "client": [ + "EntityRenderDispatcherAccessor", + "GuiItemRenderStateMixin", + "ModelManagerMixin", + "PictureInPictureRendererAccessor", + "PictureInPictureRendererMixin", + "SplashRendererAccessor" + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/rainbow/src/main/java/org/geysermc/rainbow/Rainbow.java b/rainbow/src/main/java/org/geysermc/rainbow/Rainbow.java index f0f4eba..3aa247c 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/Rainbow.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/Rainbow.java @@ -1,36 +1,15 @@ package org.geysermc.rainbow; import com.mojang.logging.LogUtils; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.fabricmc.fabric.api.command.v2.ArgumentTypeRegistry; -import net.minecraft.commands.synchronization.SingletonArgumentInfo; import net.minecraft.resources.ResourceLocation; -import org.geysermc.rainbow.command.CommandSuggestionsArgumentType; -import org.geysermc.rainbow.command.PackGeneratorCommand; -import org.geysermc.rainbow.mapper.PackMapper; import org.slf4j.Logger; -public class Rainbow implements ClientModInitializer { +public class Rainbow { public static final String MOD_ID = "rainbow"; public static final String MOD_NAME = "Rainbow"; public static final Logger LOGGER = LogUtils.getLogger(); - private final PackManager packManager = new PackManager(); - private final PackMapper packMapper = new PackMapper(packManager); - - // TODO export language overrides - @Override - public void onInitializeClient() { - ClientCommandRegistrationCallback.EVENT.register((dispatcher, buildContext) -> PackGeneratorCommand.register(dispatcher, packManager, packMapper)); - ClientTickEvents.START_CLIENT_TICK.register(packMapper::tick); - - ArgumentTypeRegistry.registerArgumentType(getModdedLocation("command_suggestions"), - CommandSuggestionsArgumentType.class, SingletonArgumentInfo.contextFree(CommandSuggestionsArgumentType::new)); - } - public static ResourceLocation getModdedLocation(String path) { return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); } diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/AssetResolver.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/AssetResolver.java new file mode 100644 index 0000000..1ea9e60 --- /dev/null +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/AssetResolver.java @@ -0,0 +1,25 @@ +package org.geysermc.rainbow.mapping; + +import net.minecraft.client.renderer.item.ClientItem; +import net.minecraft.client.resources.model.EquipmentClientInfo; +import net.minecraft.client.resources.model.ResolvedModel; +import net.minecraft.core.HolderLookup; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.equipment.EquipmentAsset; + +import java.io.InputStream; +import java.util.Optional; + +public interface AssetResolver { + + Optional getResolvedModel(ResourceLocation location); + + Optional getClientItem(ResourceLocation location); + + EquipmentClientInfo getEquipmentInfo(ResourceKey key); + + InputStream getTexture(ResourceLocation location); + + HolderLookup.Provider registries(); +} diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java index 412d4e3..169bec7 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/BedrockItemMapper.java @@ -1,6 +1,5 @@ package org.geysermc.rainbow.mapping; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.item.BlockModelWrapper; import net.minecraft.client.renderer.item.ClientItem; import net.minecraft.client.renderer.item.ConditionalItemModel; @@ -38,13 +37,11 @@ import net.minecraft.world.item.component.ItemAttributeModifiers; import net.minecraft.world.item.equipment.trim.TrimMaterial; import net.minecraft.world.level.Level; import org.apache.commons.lang3.ArrayUtils; -import org.geysermc.rainbow.accessor.ResolvedModelAccessor; import org.geysermc.rainbow.mapping.animation.AnimationMapper; import org.geysermc.rainbow.mapping.animation.BedrockAnimationContext; import org.geysermc.rainbow.mapping.attachable.AttachableMapper; import org.geysermc.rainbow.mapping.geometry.BedrockGeometryContext; import org.geysermc.rainbow.mapping.geometry.GeometryMapper; -import org.geysermc.rainbow.mapping.geometry.GeometryRenderer; import org.geysermc.rainbow.mapping.geyser.GeyserBaseDefinition; import org.geysermc.rainbow.mapping.geyser.GeyserItemDefinition; import org.geysermc.rainbow.mapping.geyser.GeyserLegacyDefinition; @@ -72,23 +69,19 @@ public class BedrockItemMapper { .map(ResourceLocation::withDefaultNamespace) .toList(); - private static ResolvedModelAccessor getModels() { - return (ResolvedModelAccessor) Minecraft.getInstance().getModelManager(); - } - private static ResourceLocation getModelId(ItemModel.Unbaked model) { //noinspection unchecked return ((LateBoundIdMapperAccessor) ItemModels.ID_MAPPER).getIdToValue().inverse().get(model.type()); } public static void tryMapStack(ItemStack stack, ResourceLocation modelLocation, ProblemReporter reporter, PackContext context) { - getModels().rainbow$getClientItem(modelLocation).map(ClientItem::model) + context.assetResolver().getClientItem(modelLocation).map(ClientItem::model) .ifPresentOrElse(model -> mapItem(model, stack, reporter.forChild(() -> "client item definition " + modelLocation + " "), base -> new GeyserSingleDefinition(base, Optional.of(modelLocation)), context), () -> reporter.report(() -> "missing client item definition " + modelLocation)); } public static void tryMapStack(ItemStack stack, int customModelData, ProblemReporter reporter, PackContext context) { - ItemModel.Unbaked vanillaModel = getModels().rainbow$getClientItem(stack.get(DataComponents.ITEM_MODEL)).map(ClientItem::model).orElseThrow(); + ItemModel.Unbaked vanillaModel = context.assetResolver().getClientItem(stack.get(DataComponents.ITEM_MODEL)).map(ClientItem::model).orElseThrow(); ProblemReporter childReporter = reporter.forChild(() -> "item model " + vanillaModel + " with custom model data " + customModelData + " "); if (vanillaModel instanceof RangeSelectItemModel.Unbaked(RangeSelectItemModelProperty property, float scale, List entries, Optional fallback)) { // WHY, Mojang? @@ -130,7 +123,7 @@ public class BedrockItemMapper { private static void mapBlockModelWrapper(BlockModelWrapper.Unbaked model, MappingContext context) { ResourceLocation itemModelLocation = model.model(); - getModels().rainbow$getResolvedModel(itemModelLocation) + context.packContext().assetResolver().getResolvedModel(itemModelLocation) .ifPresentOrElse(itemModel -> { ResolvedModel parentModel = itemModel.parent(); // debugName() returns the resource location of the model as a string @@ -290,13 +283,15 @@ public class BedrockItemMapper { boolean exportTexture = true; if (customModel.isPresent()) { texture = texture.withPath(path -> path + "_icon"); - GeometryRenderer.render(stack, packContext.packPath().resolve(BedrockTextures.TEXTURES_FOLDER + texture.getPath() + ".png")); - exportTexture = false; + // FIXME Bit of a hack, preferably render geometry at a later stage + exportTexture = !packContext.geometryRenderer().render(stack, packContext.packPath().resolve(BedrockTextures.TEXTURES_FOLDER + texture.getPath() + ".png")); packContext.additionalTextureConsumer().accept(geometryTexture); } packContext.itemConsumer().accept(new BedrockItem(bedrockIdentifier, base.textureName(), texture, exportTexture, - AttachableMapper.mapItem(stack.getComponentsPatch(), bedrockIdentifier, bedrockGeometry, bedrockAnimation, packContext.additionalTextureConsumer()), + AttachableMapper.mapItem(stack.getComponentsPatch(), bedrockIdentifier, bedrockGeometry, bedrockAnimation, + packContext.assetResolver(), + packContext.additionalTextureConsumer()), bedrockGeometry.map(BedrockGeometryContext::geometry), bedrockAnimation.map(BedrockAnimationContext::animation))); } diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/PackContext.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/PackContext.java index b8a788a..f6276b6 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapping/PackContext.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/PackContext.java @@ -1,10 +1,12 @@ package org.geysermc.rainbow.mapping; import net.minecraft.resources.ResourceLocation; +import org.geysermc.rainbow.mapping.geometry.GeometryRenderer; import org.geysermc.rainbow.mapping.geyser.GeyserMappings; import java.nio.file.Path; import java.util.function.Consumer; -public record PackContext(GeyserMappings mappings, Path packPath, BedrockItemConsumer itemConsumer, Consumer additionalTextureConsumer) { +public record PackContext(GeyserMappings mappings, Path packPath, BedrockItemConsumer itemConsumer, AssetResolver assetResolver, + GeometryRenderer geometryRenderer, Consumer additionalTextureConsumer) { } diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/attachable/AttachableMapper.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/attachable/AttachableMapper.java index 6995474..8801f98 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapping/attachable/AttachableMapper.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/attachable/AttachableMapper.java @@ -1,7 +1,6 @@ package org.geysermc.rainbow.mapping.attachable; import com.mojang.datafixers.util.Pair; -import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.EquipmentAssetManager; import net.minecraft.client.resources.model.EquipmentClientInfo; import net.minecraft.core.component.DataComponentPatch; @@ -9,9 +8,9 @@ import net.minecraft.core.component.DataComponents; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.equipment.Equippable; +import org.geysermc.rainbow.mapping.AssetResolver; import org.geysermc.rainbow.mapping.animation.BedrockAnimationContext; import org.geysermc.rainbow.mapping.geometry.BedrockGeometryContext; -import org.geysermc.rainbow.mixin.EntityRenderDispatcherAccessor; import org.geysermc.rainbow.pack.attachable.BedrockAttachable; import java.util.List; @@ -21,17 +20,14 @@ import java.util.function.Consumer; public class AttachableMapper { public static Optional mapItem(DataComponentPatch components, ResourceLocation bedrockIdentifier, Optional customGeometry, - Optional customAnimation, Consumer textureConsumer) { + Optional customAnimation, AssetResolver assetResolver, Consumer textureConsumer) { // Crazy optional statement // Unfortunately we can't have both equippables and custom models, so we prefer the latter :( return customGeometry .map(geometry -> BedrockAttachable.geometry(bedrockIdentifier, geometry.geometry().definitions().getFirst(), geometry.texture().getPath())) .or(() -> Optional.ofNullable(components.get(DataComponents.EQUIPPABLE)) .flatMap(optional -> (Optional) optional) - .flatMap(equippable -> { - EquipmentAssetManager equipmentAssets = ((EntityRenderDispatcherAccessor) Minecraft.getInstance().getEntityRenderDispatcher()).getEquipmentAssets(); - return equippable.assetId().map(asset -> Pair.of(equippable.slot(), equipmentAssets.get(asset))); - }) + .flatMap(equippable -> equippable.assetId().map(asset -> Pair.of(equippable.slot(), assetResolver.getEquipmentInfo(asset)))) .filter(assetInfo -> assetInfo.getSecond() != EquipmentAssetManager.MISSING) .map(assetInfo -> assetInfo .mapSecond(info -> info.getLayers(getLayer(assetInfo.getFirst())))) diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/GeometryRenderer.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/GeometryRenderer.java index f215134..37799d7 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/GeometryRenderer.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/GeometryRenderer.java @@ -1,79 +1,10 @@ package org.geysermc.rainbow.mapping.geometry; -import com.mojang.blaze3d.buffers.GpuBuffer; -import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.systems.CommandEncoder; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.textures.GpuTexture; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.navigation.ScreenRectangle; -import net.minecraft.client.gui.render.pip.OversizedItemRenderer; -import net.minecraft.client.gui.render.state.GuiItemRenderState; -import net.minecraft.client.gui.render.state.GuiRenderState; -import net.minecraft.client.gui.render.state.pip.OversizedItemRenderState; -import net.minecraft.client.renderer.item.TrackingItemStackRenderState; -import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; -import org.geysermc.rainbow.CodecUtil; -import org.geysermc.rainbow.mixin.PictureInPictureRendererAccessor; -import org.geysermc.rainbow.render.PictureInPictureCopyRenderer; -import org.joml.Matrix3x2fStack; -import java.io.IOException; import java.nio.file.Path; -import java.util.Objects; -// TODO maybe just use this even for normal 2D items, not sure, could be useful for composite models and stuff -// TODO output in a size bedrock likes -public class GeometryRenderer { +public interface GeometryRenderer { - public static void render(ItemStack stack, Path path) { - TrackingItemStackRenderState itemRenderState = new TrackingItemStackRenderState(); - Minecraft.getInstance().getItemModelResolver().updateForTopItem(itemRenderState, stack, ItemDisplayContext.GUI, null, null, 0); - itemRenderState.setOversizedInGui(true); - - GuiItemRenderState guiItemRenderState = new GuiItemRenderState("geometry_render", new Matrix3x2fStack(16), itemRenderState, 0, 0, null); - ScreenRectangle sizeBounds = guiItemRenderState.oversizedItemBounds(); - Objects.requireNonNull(sizeBounds); - OversizedItemRenderState oversizedRenderState = new OversizedItemRenderState(guiItemRenderState, sizeBounds.left(), sizeBounds.top(), sizeBounds.right() + 4, sizeBounds.bottom() + 4); - - try (OversizedItemRenderer itemRenderer = new OversizedItemRenderer(Minecraft.getInstance().renderBuffers().bufferSource())) { - //noinspection DataFlowIssue - ((PictureInPictureCopyRenderer) itemRenderer).rainbow$allowTextureCopy(); - itemRenderer.prepare(oversizedRenderState, new GuiRenderState(), 4); - writeAsPNG(path, ((PictureInPictureRendererAccessor) itemRenderer).getTexture()); - } - } - - // Simplified TextureUtil#writeAsPNG with some modifications to flip the image and just generate it at full size - private static void writeAsPNG(Path path, GpuTexture texture) { - RenderSystem.assertOnRenderThread(); - int width = texture.getWidth(0); - int height = texture.getHeight(0); - int bufferSize = texture.getFormat().pixelSize() * width * height; - - GpuBuffer buffer = RenderSystem.getDevice().createBuffer(() -> "Texture output buffer", GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_MAP_READ, bufferSize); - CommandEncoder commandEncoder = RenderSystem.getDevice().createCommandEncoder(); - - Runnable writer = () -> { - try (GpuBuffer.MappedView mappedView = commandEncoder.mapBuffer(buffer, true, false)) { - try (NativeImage nativeImage = new NativeImage(width, height, false)) { - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - int colour = mappedView.data().getInt((x + y * width) * texture.getFormat().pixelSize()); - nativeImage.setPixelABGR(x, height - y - 1, colour); - } - } - - CodecUtil.ensureDirectoryExists(path.getParent()); - nativeImage.writeToFile(path); - } catch (IOException var19) { - // TODO - } - } - - buffer.close(); - }; - commandEncoder.copyTextureToBuffer(texture, buffer, 0, writer, 0); - } + boolean render(ItemStack stack, Path path); } diff --git a/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/NoopGeometryRenderer.java b/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/NoopGeometryRenderer.java new file mode 100644 index 0000000..9836042 --- /dev/null +++ b/rainbow/src/main/java/org/geysermc/rainbow/mapping/geometry/NoopGeometryRenderer.java @@ -0,0 +1,14 @@ +package org.geysermc.rainbow.mapping.geometry; + +import net.minecraft.world.item.ItemStack; + +import java.nio.file.Path; + +public class NoopGeometryRenderer implements GeometryRenderer { + public static final NoopGeometryRenderer INSTANCE = new NoopGeometryRenderer(); + + @Override + public boolean render(ItemStack stack, Path path) { + return false; + } +} diff --git a/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java b/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java index 6aeade7..11716dc 100644 --- a/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java +++ b/rainbow/src/main/java/org/geysermc/rainbow/pack/BedrockPack.java @@ -4,8 +4,6 @@ import com.mojang.serialization.JsonOps; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.SplashRenderer; import net.minecraft.core.component.DataComponents; import net.minecraft.resources.RegistryOps; import net.minecraft.resources.ResourceLocation; @@ -18,10 +16,11 @@ import org.apache.commons.io.IOUtils; import org.geysermc.rainbow.CodecUtil; import org.geysermc.rainbow.PackConstants; import org.geysermc.rainbow.Rainbow; +import org.geysermc.rainbow.mapping.AssetResolver; import org.geysermc.rainbow.mapping.BedrockItemMapper; import org.geysermc.rainbow.mapping.PackContext; +import org.geysermc.rainbow.mapping.geometry.NoopGeometryRenderer; import org.geysermc.rainbow.mapping.geyser.GeyserMappings; -import org.geysermc.rainbow.mixin.SplashRendererAccessor; import org.jetbrains.annotations.NotNull; import java.io.FileOutputStream; @@ -74,7 +73,9 @@ public class BedrockPack { private final ProblemReporter.Collector reporter; - public BedrockPack(String name) throws IOException { + private final PackContext context; + + public BedrockPack(String name, AssetResolver assetResolver) throws IOException { this.name = name; // Not reading existing item mappings/texture atlas for now since that doesn't work all that well yet @@ -88,6 +89,14 @@ public class BedrockPack { itemTextures = BedrockTextures.builder(); reporter = new ProblemReporter.Collector(() -> "Bedrock pack " + name + " "); + + context = new PackContext(mappings, packPath, item -> { + itemTextures.withItemTexture(item); + if (item.exportTexture()) { + texturesToExport.add(item.texture()); + } + bedrockItems.add(item); + }, assetResolver, NoopGeometryRenderer.INSTANCE, texturesToExport::add); } public String name() { @@ -113,13 +122,6 @@ public class BedrockPack { reporter.report(problem); } }; - PackContext context = new PackContext(mappings, packPath, item -> { - itemTextures.withItemTexture(item); - if (item.exportTexture()) { - texturesToExport.add(item.texture()); - } - bedrockItems.add(item); - }, texturesToExport::add); Optional patchedModel = stack.getComponentsPatch().get(DataComponents.ITEM_MODEL); //noinspection OptionalAssignedToNull - annoying Mojang @@ -148,7 +150,7 @@ public class BedrockPack { boolean success = true; try { - CodecUtil.trySaveJson(GeyserMappings.CODEC, mappings, exportPath.resolve(MAPPINGS_FILE), RegistryOps.create(JsonOps.INSTANCE, Minecraft.getInstance().level.registryAccess())); + CodecUtil.trySaveJson(GeyserMappings.CODEC, mappings, exportPath.resolve(MAPPINGS_FILE), RegistryOps.create(JsonOps.INSTANCE, context.assetResolver().registries())); CodecUtil.trySaveJson(PackManifest.CODEC, manifest, packPath.resolve(MANIFEST_FILE)); CodecUtil.trySaveJson(BedrockTextureAtlas.CODEC, BedrockTextureAtlas.itemAtlas(name, itemTextures), packPath.resolve(ITEM_ATLAS_FILE)); } catch (IOException | NullPointerException exception) { @@ -165,8 +167,8 @@ public class BedrockPack { } for (ResourceLocation texture : texturesToExport) { - texture = texture.withPath(path -> "textures/" + path + ".png"); - try (InputStream inputTexture = Minecraft.getInstance().getResourceManager().open(texture)) { + texture = texture.withPath(path -> "textures/" + path + ".png"); // FIXME + try (InputStream inputTexture = context.assetResolver().getTexture(texture)) { Path texturePath = packPath.resolve(texture.getPath()); CodecUtil.ensureDirectoryExists(texturePath.getParent()); try (OutputStream outputTexture = new FileOutputStream(texturePath.toFile())) { @@ -227,11 +229,11 @@ Textures tried to export: %d private static String randomSummaryComment() { if (RANDOM.nextDouble() < 0.6) { - SplashRenderer splash = Minecraft.getInstance().getSplashManager().getSplash(); + /*SplashRenderer splash = Minecraft.getInstance().getSplashManager().getSplash(); if (splash == null) { return "Undefined Undefined :("; } - return ((SplashRendererAccessor) splash).getSplash(); + return ((SplashRendererAccessor) splash).getSplash();*/ // TODO } return randomBuiltinSummaryComment(); } diff --git a/rainbow/src/main/resources/rainbow.mixins.json b/rainbow/src/main/resources/rainbow.mixins.json index 2d5bb60..887a686 100644 --- a/rainbow/src/main/resources/rainbow.mixins.json +++ b/rainbow/src/main/resources/rainbow.mixins.json @@ -5,14 +5,8 @@ "compatibilityLevel": "JAVA_21", "mixins": [], "client": [ - "EntityRenderDispatcherAccessor", - "GuiItemRenderStateMixin", "LateBoundIdMapperAccessor", - "ModelManagerMixin", - "PictureInPictureRendererAccessor", - "PictureInPictureRendererMixin", "RangeSelectItemModelAccessor", - "SplashRendererAccessor", "TextureSlotsAccessor" ], "injectors": {