diff options
11 files changed, 42 insertions, 13 deletions
diff --git a/common/src/main/java/dev/isxander/yacl3/gui/image/ImageRendererManager.java b/common/src/main/java/dev/isxander/yacl3/gui/image/ImageRendererManager.java index 0c9b8a3..2f7ef50 100644 --- a/common/src/main/java/dev/isxander/yacl3/gui/image/ImageRendererManager.java +++ b/common/src/main/java/dev/isxander/yacl3/gui/image/ImageRendererManager.java @@ -3,14 +3,16 @@ package dev.isxander.yacl3.gui.image; import com.mojang.blaze3d.systems.RenderSystem; import dev.isxander.yacl3.gui.image.impl.AnimatedDynamicTextureImage; import dev.isxander.yacl3.impl.utils.YACLConstants; +import dev.isxander.yacl3.platform.YACLPlatform; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.*; -import java.util.function.Function; +import java.util.function.BiFunction; import java.util.function.Predicate; import java.util.function.Supplier; @@ -23,11 +25,11 @@ public class ImageRendererManager { static final List<PreloadedImageFactory> PRELOADED_IMAGE_FACTORIES = List.of( new PreloadedImageFactory( location -> location.getPath().endsWith(".webp"), - AnimatedDynamicTextureImage::createWEBPFromTexture + AnimatedDynamicTextureImage::createWEBPFromResource ), new PreloadedImageFactory( location -> location.getPath().endsWith(".gif"), - AnimatedDynamicTextureImage::createGIFFromTexture + AnimatedDynamicTextureImage::createGIFFromResource ) ); @@ -37,6 +39,13 @@ public class ImageRendererManager { } if (IMAGE_CACHE.containsKey(id)) { + // warn developers if they don't put their webp/gif images `/textures` folder + if (YACLPlatform.isDevelopmentEnv()) { + if (PRELOADED_IMAGE_FACTORIES.stream().anyMatch(factory -> factory.predicate().test(id))) { + YACLConstants.LOGGER.error("Image '{}' not preloaded. MAKE SURE THAT ALL YACL WEBP/GIF IMAGES ARE INSIDE YOUR ASSETS `/textures` FOLDER, ELSE THEY WILL NOT BE PRELOADED!!! THIS ERROR WILL NOT APPEAR IN PROD", id); + } + } + return Optional.ofNullable((T) IMAGE_CACHE.get(id).getNow(null)); } @@ -45,8 +54,6 @@ public class ImageRendererManager { @SuppressWarnings("unchecked") public static <T extends ImageRenderer> CompletableFuture<T> registerImage(ResourceLocation id, ImageRendererFactory factory) { - System.out.println(PRELOADED_IMAGE_CACHE.get(id)); - if (IMAGE_CACHE.containsKey(id)) { return (CompletableFuture<T>) IMAGE_CACHE.get(id); } @@ -66,7 +73,7 @@ public class ImageRendererManager { return (CompletableFuture<T>) future; } - private static <T extends ImageRenderer> void completeImageFactory(ResourceLocation id, Supplier<Optional<ImageRendererFactory.ImageSupplier>> supplier, CompletableFuture<ImageRenderer> future) { + private static void completeImageFactory(ResourceLocation id, Supplier<Optional<ImageRendererFactory.ImageSupplier>> supplier, CompletableFuture<ImageRenderer> future) { RenderSystem.assertOnRenderThread(); ImageRendererFactory.ImageSupplier completableImage = supplier.get().orElse(null); @@ -111,7 +118,7 @@ public class ImageRendererManager { } } - public record PreloadedImageFactory(Predicate<ResourceLocation> predicate, Function<ResourceLocation, ImageRendererFactory> factory) { + public record PreloadedImageFactory(Predicate<ResourceLocation> predicate, BiFunction<Resource, ResourceLocation, ImageRendererFactory> factory) { } private record CompletedSupplier<T>(T get) implements Supplier<T> { diff --git a/common/src/main/java/dev/isxander/yacl3/gui/image/YACLImageReloadListener.java b/common/src/main/java/dev/isxander/yacl3/gui/image/YACLImageReloadListener.java index cc259b0..bac8c56 100644 --- a/common/src/main/java/dev/isxander/yacl3/gui/image/YACLImageReloadListener.java +++ b/common/src/main/java/dev/isxander/yacl3/gui/image/YACLImageReloadListener.java @@ -28,8 +28,9 @@ public class YACLImageReloadListener implements PreparableReloadListener { Executor backgroundExecutor, Executor gameExecutor ) { + YACLConstants.LOGGER.info("YACL is reloading images"); Map<ResourceLocation, Resource> imageResources = resourceManager.listResources( - "", + "textures", location -> ImageRendererManager.PRELOADED_IMAGE_FACTORIES .stream() .anyMatch(factory -> factory.predicate().test(location)) @@ -51,7 +52,7 @@ public class YACLImageReloadListener implements PreparableReloadListener { ImageRendererFactory imageFactory = ImageRendererManager.PRELOADED_IMAGE_FACTORIES .stream() .filter(factory -> factory.predicate().test(location)) - .map(factory -> factory.factory().apply(location)) + .map(factory -> factory.factory().apply(resource, location)) .findAny() .orElseThrow(); @@ -94,6 +95,8 @@ public class YACLImageReloadListener implements PreparableReloadListener { }); } + YACLConstants.LOGGER.info("YACL has found {} images", imageResources.size()); + return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); } } diff --git a/common/src/main/java/dev/isxander/yacl3/gui/image/impl/AnimatedDynamicTextureImage.java b/common/src/main/java/dev/isxander/yacl3/gui/image/impl/AnimatedDynamicTextureImage.java index 39ddb55..2136f56 100644 --- a/common/src/main/java/dev/isxander/yacl3/gui/image/impl/AnimatedDynamicTextureImage.java +++ b/common/src/main/java/dev/isxander/yacl3/gui/image/impl/AnimatedDynamicTextureImage.java @@ -103,6 +103,10 @@ public class AnimatedDynamicTextureImage extends DynamicTextureImage { }; } + public static ImageRendererFactory createGIFFromResource(Resource resource, ResourceLocation resourceLocation) { + return () -> createGIFSupplier(resource.open(), resourceLocation); + } + public static ImageRendererFactory createGIFFromPath(Path path, ResourceLocation uniqueLocation) { return () -> createGIFSupplier(new FileInputStream(path.toFile()), uniqueLocation); } @@ -116,6 +120,10 @@ public class AnimatedDynamicTextureImage extends DynamicTextureImage { }; } + public static ImageRendererFactory createWEBPFromResource(Resource resource, ResourceLocation resourceLocation) { + return () -> createWEBPSupplier(resource.open(), resourceLocation); + } + public static ImageRendererFactory createWEBPFromPath(Path path, ResourceLocation uniqueLocation) { return () -> createWEBPSupplier(new FileInputStream(path.toFile()), uniqueLocation); } diff --git a/neoforge/src/main/java/dev/isxander/yacl3/platform/neoforge/YACLForgeEntrypoint.java b/neoforge/src/main/java/dev/isxander/yacl3/platform/neoforge/YACLForgeEntrypoint.java index 4dfe2dd..488cbb1 100644 --- a/neoforge/src/main/java/dev/isxander/yacl3/platform/neoforge/YACLForgeEntrypoint.java +++ b/neoforge/src/main/java/dev/isxander/yacl3/platform/neoforge/YACLForgeEntrypoint.java @@ -11,7 +11,6 @@ import net.neoforged.neoforge.common.NeoForge; public class YACLForgeEntrypoint { public YACLForgeEntrypoint(IEventBus modEventBus) { modEventBus.addListener(RegisterClientReloadListenersEvent.class, event -> { - System.out.println("image reload event"); event.registerReloadListener(new YACLImageReloadListener()); }); } diff --git a/test-common/src/main/java/dev/isxander/yacl3/test/GuiTest.java b/test-common/src/main/java/dev/isxander/yacl3/test/GuiTest.java index 52a51e1..f81db33 100644 --- a/test-common/src/main/java/dev/isxander/yacl3/test/GuiTest.java +++ b/test-common/src/main/java/dev/isxander/yacl3/test/GuiTest.java @@ -83,7 +83,7 @@ public class GuiTest { .append(Component.literal("e").withStyle(style -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("e"))))) .withStyle(style -> style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://isxander.dev"))) ) - .webpImage(new ResourceLocation("yacl3", "reach-around-placement.webp")) + .webpImage(new ResourceLocation("yacl3", "textures/reach-around-placement.webp")) .build()) .binding( defaults.booleanToggle, @@ -100,7 +100,7 @@ public class GuiTest { .name(Component.literal("Custom Boolean Toggle")) .description(val -> OptionDescription.createBuilder() .text(Component.literal("You can customize controllers like so! YACL is truly infinitely customizable! This tooltip is long in order to demonstrate the cool, smooth scrolling of these descriptions. Did you know, they are also super clickable?! I know, cool right, YACL 3.x really is amazing.")) - .image(Path.of("D:\\Xander\\Downloads\\_MG_0860-Enhanced-NR.png"), new ResourceLocation("yacl", "f.webp")) // TODO: Add img file to git? + .webpImage(new ResourceLocation("yacl3", "textures/sample-1.webp")) .build()) .binding( defaults.customBooleanToggle, @@ -114,7 +114,10 @@ public class GuiTest { .build()) .option(Option.<Boolean>createBuilder() .name(Component.literal("Tick Box")) - .description(OptionDescription.of(Component.literal("There are even alternate methods of displaying the same data type!"))) + .description(OptionDescription.createBuilder() + .text(Component.literal("There are even alternate methods of displaying the same data type!")) + .webpImage(new ResourceLocation("yacl3", "textures/sample-2.webp")) + .build()) .binding( defaults.tickbox, () -> config.tickbox, @@ -127,6 +130,9 @@ public class GuiTest { .name(Component.literal("Slider Controllers")) .option(Option.<Integer>createBuilder() .name(Component.literal("Int Slider")) + .description(OptionDescription.createBuilder() + .webpImage(new ResourceLocation("yacl3", "textures/sample-3.webp")) + .build()) .binding( defaults.intSlider, () -> config.intSlider, @@ -136,6 +142,9 @@ public class GuiTest { .build()) .option(Option.<Double>createBuilder() .name(Component.literal("Double Slider")) + .description(OptionDescription.createBuilder() + .webpImage(new ResourceLocation("yacl3", "textures/sample-4.webp")) + .build()) .binding( defaults.doubleSlider, () -> config.doubleSlider, @@ -145,6 +154,9 @@ public class GuiTest { .build()) .option(Option.<Float>createBuilder() .name(Component.literal("Float Slider")) + .description(OptionDescription.createBuilder() + .webpImage(new ResourceLocation("yacl3", "textures/sample-5.webp")) + .build()) .binding( defaults.floatSlider, () -> config.floatSlider, diff --git a/test-common/src/main/resources/assets/yacl3/reach-around-placement.webp b/test-common/src/main/resources/assets/yacl3/textures/reach-around-placement.webp Binary files differindex 1937809..1937809 100644 --- a/test-common/src/main/resources/assets/yacl3/reach-around-placement.webp +++ b/test-common/src/main/resources/assets/yacl3/textures/reach-around-placement.webp diff --git a/test-common/src/main/resources/assets/yacl3/textures/sample-1.webp b/test-common/src/main/resources/assets/yacl3/textures/sample-1.webp Binary files differnew file mode 100644 index 0000000..0da983e --- /dev/null +++ b/test-common/src/main/resources/assets/yacl3/textures/sample-1.webp diff --git a/test-common/src/main/resources/assets/yacl3/textures/sample-2.webp b/test-common/src/main/resources/assets/yacl3/textures/sample-2.webp Binary files differnew file mode 100644 index 0000000..e887f8c --- /dev/null +++ b/test-common/src/main/resources/assets/yacl3/textures/sample-2.webp diff --git a/test-common/src/main/resources/assets/yacl3/textures/sample-3.webp b/test-common/src/main/resources/assets/yacl3/textures/sample-3.webp Binary files differnew file mode 100644 index 0000000..eda78a9 --- /dev/null +++ b/test-common/src/main/resources/assets/yacl3/textures/sample-3.webp diff --git a/test-common/src/main/resources/assets/yacl3/textures/sample-4.webp b/test-common/src/main/resources/assets/yacl3/textures/sample-4.webp Binary files differnew file mode 100644 index 0000000..8bbe329 --- /dev/null +++ b/test-common/src/main/resources/assets/yacl3/textures/sample-4.webp diff --git a/test-common/src/main/resources/assets/yacl3/textures/sample-5.webp b/test-common/src/main/resources/assets/yacl3/textures/sample-5.webp Binary files differnew file mode 100644 index 0000000..ed91379 --- /dev/null +++ b/test-common/src/main/resources/assets/yacl3/textures/sample-5.webp |