From 81b0cc5821b1ad75f931ba8c184334b732af111f Mon Sep 17 00:00:00 2001 From: Leo40Git <7997354+Leo40Git@users.noreply.github.com> Date: Sun, 20 Jun 2021 17:30:32 +0300 Subject: [PATCH 1/5] Particle Factory API (closes architectury#93) --- .../registry/ParticleFactories.java | 55 +++++++++ .../fabric/ParticleFactoriesImpl.java | 70 ++++++++++++ .../mixin/forge/ParticleEngineAccessor.java | 47 ++++++++ .../registry/forge/ParticleFactoriesImpl.java | 108 ++++++++++++++++++ .../main/resources/architectury.mixins.json | 4 +- 5 files changed, 283 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java create mode 100644 fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java create mode 100644 forge/src/main/java/me/shedaniel/architectury/mixin/forge/ParticleEngineAccessor.java create mode 100644 forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java diff --git a/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java b/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java new file mode 100644 index 00000000..2230bedf --- /dev/null +++ b/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java @@ -0,0 +1,55 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.registry; + +import me.shedaniel.architectury.annotations.ExpectPlatform; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; + +import java.util.List; + +@Environment(EnvType.CLIENT) +public final class ParticleFactories { + public interface ExtendedSpriteSet extends SpriteSet { + TextureAtlas getAtlas(); + List getSprites(); + } + + @ExpectPlatform + void register(ParticleType type, ParticleProvider provider) { + throw new AssertionError(); + } + + @ExpectPlatform + void register(ParticleType type, PendingParticleProvider constructor) { + throw new AssertionError(); + } + + @FunctionalInterface + public interface PendingParticleProvider { + ParticleProvider create(ExtendedSpriteSet spriteSet); + } +} diff --git a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java new file mode 100644 index 00000000..b261c426 --- /dev/null +++ b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java @@ -0,0 +1,70 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.registry.fabric; + +import me.shedaniel.architectury.registry.ParticleFactories; +import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider; +import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; + +import java.util.List; +import java.util.Random; + +public class ParticleFactoriesImpl { + public static class ExtendedSpriteSetImpl implements ParticleFactories.ExtendedSpriteSet { + private final FabricSpriteProvider delegate; + + public ExtendedSpriteSetImpl(FabricSpriteProvider delegate) { + this.delegate = delegate; + } + + @Override + public TextureAtlas getAtlas() { + return delegate.getAtlas(); + } + + @Override + public List getSprites() { + return delegate.getSprites(); + } + + @Override + public TextureAtlasSprite get(int i, int j) { + return delegate.get(i, j); + } + + @Override + public TextureAtlasSprite get(Random random) { + return delegate.get(random); + } + } + + public static void register(ParticleType type, ParticleProvider provider) { + ParticleFactoryRegistry.getInstance().register(type, provider); + } + + public static void register(ParticleType type, ParticleFactories.PendingParticleProvider constructor) { + ParticleFactoryRegistry.getInstance().register(type, provider -> constructor.create(new ExtendedSpriteSetImpl(provider))); + } +} diff --git a/forge/src/main/java/me/shedaniel/architectury/mixin/forge/ParticleEngineAccessor.java b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/ParticleEngineAccessor.java new file mode 100644 index 00000000..84c12bec --- /dev/null +++ b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/ParticleEngineAccessor.java @@ -0,0 +1,47 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.mixin.forge; + +import net.minecraft.client.particle.ParticleEngine; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.Map; + +@Mixin(ParticleEngine.class) +public interface ParticleEngineAccessor { + @Accessor + TextureAtlas getTextureAtlas(); + + // this is actually a Map, but luckily type erasure saves the day + @Accessor + Map getProviders(); + + @Mixin(targets = "net/minecraft/client/particle/ParticleEngine$MutableSpriteSet") + interface MutableSpriteSetAccessor { + @Accessor + List getSprites(); + } +} diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java new file mode 100644 index 00000000..58f21f5b --- /dev/null +++ b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java @@ -0,0 +1,108 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.registry.forge; + +import me.shedaniel.architectury.forge.ArchitecturyForge; +import me.shedaniel.architectury.mixin.forge.ParticleEngineAccessor; +import me.shedaniel.architectury.registry.ParticleFactories; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.ParticleEngine; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +@Mod.EventBusSubscriber(modid = ArchitecturyForge.MOD_ID) +public class ParticleFactoriesImpl { + private static final class ExtendedSpriteSetImpl implements ParticleFactories.ExtendedSpriteSet { + private final ParticleEngine engine; + private final SpriteSet delegate; + + private ExtendedSpriteSetImpl(ParticleEngine engine, SpriteSet delegate) { + this.engine = engine; + this.delegate = delegate; + } + + @Override + public TextureAtlas getAtlas() { + return ((ParticleEngineAccessor) engine).getTextureAtlas(); + } + + @Override + public List getSprites() { + return ((ParticleEngineAccessor.MutableSpriteSetAccessor) delegate).getSprites(); + } + + @Override + public TextureAtlasSprite get(int i, int j) { + return delegate.get(i, j); + } + + @Override + public TextureAtlasSprite get(Random random) { + return delegate.get(random); + } + } + + private static ArrayList deferred = new ArrayList<>(); + + private static void _register(ParticleType type, ParticleProvider provider) { + Minecraft.getInstance().particleEngine.register(type, provider); + } + + private static void _register(ParticleType type, ParticleFactories.PendingParticleProvider constructor) { + Minecraft.getInstance().particleEngine.register(type, arg -> + constructor.create(new ExtendedSpriteSetImpl(Minecraft.getInstance().particleEngine, arg))); + } + + public static void register(ParticleType type, ParticleProvider provider) { + if (deferred == null) + _register(type, provider); + else + deferred.add(() -> _register(type, provider)); + } + + public static void register(ParticleType type, ParticleFactories.PendingParticleProvider constructor) { + if (deferred == null) + _register(type, constructor); + else + deferred.add(() -> _register(type, constructor)); + } + + @SubscribeEvent + public static void onParticleFactoryRegister(ParticleFactoryRegisterEvent unused) { + if (deferred != null) { + // run all deferred registrations + for (Runnable r : deferred) + r.run(); + // yeet deferred list - register immediately from now on + deferred = null; + } + } +} diff --git a/forge/src/main/resources/architectury.mixins.json b/forge/src/main/resources/architectury.mixins.json index 5a59dda3..4277a9aa 100644 --- a/forge/src/main/resources/architectury.mixins.json +++ b/forge/src/main/resources/architectury.mixins.json @@ -20,7 +20,9 @@ "MixinItemExtension", "MixinRegistryEntry", "MixinWorldEvent", - "MobSpawnSettingsBuilderAccessor" + "MobSpawnSettingsBuilderAccessor", + "ParticleEngineAccessor", + "ParticleEngineAccessor$MutableSpriteSetAccessor" ], "injectors": { "defaultRequire": 1 From 1ba9ae1a0b2b9cbfaf39bf9abc1cf693acde09d7 Mon Sep 17 00:00:00 2001 From: Leo40Git <7997354+Leo40Git@users.noreply.github.com> Date: Sun, 20 Jun 2021 19:43:19 +0300 Subject: [PATCH 2/5] Add testmod Added public static modifiers to methods (OOPS) --- .../registry/ParticleFactories.java | 4 +- .../shedaniel/architectury/test/TestMod.java | 2 + .../test/particle/TestParticles.java | 44 ++++++++++++++++++ .../particles/test_particle.json | 5 ++ .../textures/particle/test_particle.png | Bin 0 -> 200 bytes 5 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 testmod-common/src/main/java/me/shedaniel/architectury/test/particle/TestParticles.java create mode 100644 testmod-common/src/main/resources/assets/architectury-test/particles/test_particle.json create mode 100644 testmod-common/src/main/resources/assets/architectury-test/textures/particle/test_particle.png diff --git a/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java b/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java index 2230bedf..724174bd 100644 --- a/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java +++ b/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java @@ -39,12 +39,12 @@ public final class ParticleFactories { } @ExpectPlatform - void register(ParticleType type, ParticleProvider provider) { + public static void register(ParticleType type, ParticleProvider provider) { throw new AssertionError(); } @ExpectPlatform - void register(ParticleType type, PendingParticleProvider constructor) { + public static void register(ParticleType type, PendingParticleProvider constructor) { throw new AssertionError(); } diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java index 9498cfcd..8dbb23f5 100644 --- a/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java +++ b/testmod-common/src/main/java/me/shedaniel/architectury/test/TestMod.java @@ -27,6 +27,7 @@ import me.shedaniel.architectury.test.debug.client.ClientOverlayMessageSink; import me.shedaniel.architectury.test.entity.TestEntity; import me.shedaniel.architectury.test.events.DebugEvents; import me.shedaniel.architectury.test.gamerule.TestGameRules; +import me.shedaniel.architectury.test.particle.TestParticles; import me.shedaniel.architectury.test.registry.TestRegistries; import me.shedaniel.architectury.test.registry.client.TestKeybinds; import me.shedaniel.architectury.test.tags.TestTags; @@ -45,6 +46,7 @@ public class TestMod { TestGameRules.init(); TestTags.initialize(); TestTrades.init(); + TestParticles.initialize(); if (Platform.getEnvironment() == Env.CLIENT) { TestKeybinds.initialize(); EntityRenderers.register(TestEntity.TYPE, MinecartRenderer::new); diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/particle/TestParticles.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/particle/TestParticles.java new file mode 100644 index 00000000..ba71bbda --- /dev/null +++ b/testmod-common/src/main/java/me/shedaniel/architectury/test/particle/TestParticles.java @@ -0,0 +1,44 @@ +/* + * This file is part of architectury. + * Copyright (C) 2020, 2021 architectury + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package me.shedaniel.architectury.test.particle; + +import me.shedaniel.architectury.platform.Platform; +import me.shedaniel.architectury.registry.DeferredRegister; +import me.shedaniel.architectury.registry.ParticleFactories; +import me.shedaniel.architectury.registry.RegistrySupplier; +import me.shedaniel.architectury.test.TestMod; +import me.shedaniel.architectury.utils.Env; +import net.minecraft.client.particle.HeartParticle; +import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; + +public class TestParticles { + public static final DeferredRegister> PARTICLE_TYPES = DeferredRegister.create(TestMod.MOD_ID, Registry.PARTICLE_TYPE_REGISTRY); + + public static final RegistrySupplier TEST_PARTICLE = PARTICLE_TYPES.register("test_particle", () -> + new SimpleParticleType(false) { }); + + public static void initialize() { + PARTICLE_TYPES.register(); + if (Platform.getEnvironment() == Env.CLIENT) + ParticleFactories.register(TEST_PARTICLE.get(), HeartParticle.Provider::new); + } +} diff --git a/testmod-common/src/main/resources/assets/architectury-test/particles/test_particle.json b/testmod-common/src/main/resources/assets/architectury-test/particles/test_particle.json new file mode 100644 index 00000000..3743d66d --- /dev/null +++ b/testmod-common/src/main/resources/assets/architectury-test/particles/test_particle.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "architectury-test:test_particle" + ] +} \ No newline at end of file diff --git a/testmod-common/src/main/resources/assets/architectury-test/textures/particle/test_particle.png b/testmod-common/src/main/resources/assets/architectury-test/textures/particle/test_particle.png new file mode 100644 index 0000000000000000000000000000000000000000..2427afe2dbe2d80bd41bbd05eb7042fa8218bed8 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^93afW3?x5a^xFxf7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%xYH3|=Y5AX%^Fc~#o`^^%Q1}o3ise9xtt7}V_&*3RY~H_QKTw3T zz$3Dlfr0NZ2s0kfUy%Y7)b(_643P-e?QY~{FyJ_3)%rhPZr8*aW`ZC1)#fz^U(j8V k@HDVeFL>Le$lja#r0+0X&2*aX3Dn5o>FVdQ&MBb@0MueXg8%>k literal 0 HcmV?d00001 From c18c2c8d29bc86ac1798dc13ba211cf12be62c6f Mon Sep 17 00:00:00 2001 From: Leo40Git <7997354+Leo40Git@users.noreply.github.com> Date: Tue, 22 Jun 2021 14:13:36 +0300 Subject: [PATCH 3/5] Remove unused accessor --- .../architectury/mixin/forge/ParticleEngineAccessor.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/forge/src/main/java/me/shedaniel/architectury/mixin/forge/ParticleEngineAccessor.java b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/ParticleEngineAccessor.java index 84c12bec..ebee0c3e 100644 --- a/forge/src/main/java/me/shedaniel/architectury/mixin/forge/ParticleEngineAccessor.java +++ b/forge/src/main/java/me/shedaniel/architectury/mixin/forge/ParticleEngineAccessor.java @@ -20,25 +20,18 @@ package me.shedaniel.architectury.mixin.forge; import net.minecraft.client.particle.ParticleEngine; -import net.minecraft.client.particle.SpriteSet; import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import java.util.List; -import java.util.Map; @Mixin(ParticleEngine.class) public interface ParticleEngineAccessor { @Accessor TextureAtlas getTextureAtlas(); - - // this is actually a Map, but luckily type erasure saves the day - @Accessor - Map getProviders(); - + @Mixin(targets = "net/minecraft/client/particle/ParticleEngine$MutableSpriteSet") interface MutableSpriteSetAccessor { @Accessor From 2c16f7ac096f1c4fe3f2a7df561fec0277d26a54 Mon Sep 17 00:00:00 2001 From: Leo40Git <7997354+Leo40Git@users.noreply.github.com> Date: Fri, 25 Jun 2021 15:06:26 +0300 Subject: [PATCH 4/5] Requested changes PendingParticleProvider -> DeferredParticleProvider parameter constructor -> provider --- .../architectury/registry/ParticleFactories.java | 4 ++-- .../registry/fabric/ParticleFactoriesImpl.java | 5 +++-- .../registry/forge/ParticleFactoriesImpl.java | 12 ++++++------ 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java b/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java index 724174bd..73352c53 100644 --- a/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java +++ b/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java @@ -44,12 +44,12 @@ public final class ParticleFactories { } @ExpectPlatform - public static void register(ParticleType type, PendingParticleProvider constructor) { + public static void register(ParticleType type, DeferredParticleProvider provider) { throw new AssertionError(); } @FunctionalInterface - public interface PendingParticleProvider { + public interface DeferredParticleProvider { ParticleProvider create(ExtendedSpriteSet spriteSet); } } diff --git a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java index b261c426..66b25230 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java @@ -64,7 +64,8 @@ public class ParticleFactoriesImpl { ParticleFactoryRegistry.getInstance().register(type, provider); } - public static void register(ParticleType type, ParticleFactories.PendingParticleProvider constructor) { - ParticleFactoryRegistry.getInstance().register(type, provider -> constructor.create(new ExtendedSpriteSetImpl(provider))); + public static void register(ParticleType type, ParticleFactories.DeferredParticleProvider provider) { + ParticleFactoryRegistry.getInstance().register(type, spriteProvider -> + provider.create(new ExtendedSpriteSetImpl(spriteProvider))); } } diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java index 58f21f5b..7de4bbe6 100644 --- a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java @@ -76,9 +76,9 @@ public class ParticleFactoriesImpl { Minecraft.getInstance().particleEngine.register(type, provider); } - private static void _register(ParticleType type, ParticleFactories.PendingParticleProvider constructor) { - Minecraft.getInstance().particleEngine.register(type, arg -> - constructor.create(new ExtendedSpriteSetImpl(Minecraft.getInstance().particleEngine, arg))); + private static void _register(ParticleType type, ParticleFactories.DeferredParticleProvider provider) { + Minecraft.getInstance().particleEngine.register(type, spriteSet -> + provider.create(new ExtendedSpriteSetImpl(Minecraft.getInstance().particleEngine, spriteSet))); } public static void register(ParticleType type, ParticleProvider provider) { @@ -88,11 +88,11 @@ public class ParticleFactoriesImpl { deferred.add(() -> _register(type, provider)); } - public static void register(ParticleType type, ParticleFactories.PendingParticleProvider constructor) { + public static void register(ParticleType type, ParticleFactories.DeferredParticleProvider provider) { if (deferred == null) - _register(type, constructor); + _register(type, provider); else - deferred.add(() -> _register(type, constructor)); + deferred.add(() -> _register(type, provider)); } @SubscribeEvent From 9f8140fdec6e8a5440fb4bdaf36134f6741bc9de Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 25 Jun 2021 23:48:25 +0800 Subject: [PATCH 5/5] Some changes - Migrate from ParticleFactories to ParticleProviderRegistry (We are not yarn) - Format Code Signed-off-by: shedaniel --- ...ies.java => ParticleProviderRegistry.java} | 9 ++-- ...java => ParticleProviderRegistryImpl.java} | 26 +++++----- ...java => ParticleProviderRegistryImpl.java} | 51 ++++++++++--------- .../test/particle/TestParticles.java | 4 +- 4 files changed, 47 insertions(+), 43 deletions(-) rename common/src/main/java/me/shedaniel/architectury/registry/{ParticleFactories.java => ParticleProviderRegistry.java} (96%) rename fabric/src/main/java/me/shedaniel/architectury/registry/fabric/{ParticleFactoriesImpl.java => ParticleProviderRegistryImpl.java} (89%) rename forge/src/main/java/me/shedaniel/architectury/registry/forge/{ParticleFactoriesImpl.java => ParticleProviderRegistryImpl.java} (85%) diff --git a/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java b/common/src/main/java/me/shedaniel/architectury/registry/ParticleProviderRegistry.java similarity index 96% rename from common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java rename to common/src/main/java/me/shedaniel/architectury/registry/ParticleProviderRegistry.java index 73352c53..f3d9bb26 100644 --- a/common/src/main/java/me/shedaniel/architectury/registry/ParticleFactories.java +++ b/common/src/main/java/me/shedaniel/architectury/registry/ParticleProviderRegistry.java @@ -32,22 +32,23 @@ import net.minecraft.core.particles.ParticleType; import java.util.List; @Environment(EnvType.CLIENT) -public final class ParticleFactories { +public final class ParticleProviderRegistry { public interface ExtendedSpriteSet extends SpriteSet { TextureAtlas getAtlas(); + List getSprites(); } - + @ExpectPlatform public static void register(ParticleType type, ParticleProvider provider) { throw new AssertionError(); } - + @ExpectPlatform public static void register(ParticleType type, DeferredParticleProvider provider) { throw new AssertionError(); } - + @FunctionalInterface public interface DeferredParticleProvider { ParticleProvider create(ExtendedSpriteSet spriteSet); diff --git a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleProviderRegistryImpl.java similarity index 89% rename from fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java rename to fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleProviderRegistryImpl.java index 66b25230..87d47d56 100644 --- a/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleFactoriesImpl.java +++ b/fabric/src/main/java/me/shedaniel/architectury/registry/fabric/ParticleProviderRegistryImpl.java @@ -19,7 +19,7 @@ package me.shedaniel.architectury.registry.fabric; -import me.shedaniel.architectury.registry.ParticleFactories; +import me.shedaniel.architectury.registry.ParticleProviderRegistry; import net.fabricmc.fabric.api.client.particle.v1.FabricSpriteProvider; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; import net.minecraft.client.particle.ParticleProvider; @@ -31,41 +31,41 @@ import net.minecraft.core.particles.ParticleType; import java.util.List; import java.util.Random; -public class ParticleFactoriesImpl { - public static class ExtendedSpriteSetImpl implements ParticleFactories.ExtendedSpriteSet { +public class ParticleProviderRegistryImpl { + public static class ExtendedSpriteSetImpl implements ParticleProviderRegistry.ExtendedSpriteSet { private final FabricSpriteProvider delegate; - + public ExtendedSpriteSetImpl(FabricSpriteProvider delegate) { this.delegate = delegate; } - + @Override public TextureAtlas getAtlas() { return delegate.getAtlas(); } - + @Override public List getSprites() { return delegate.getSprites(); } - + @Override public TextureAtlasSprite get(int i, int j) { return delegate.get(i, j); } - + @Override public TextureAtlasSprite get(Random random) { return delegate.get(random); } } - + public static void register(ParticleType type, ParticleProvider provider) { ParticleFactoryRegistry.getInstance().register(type, provider); } - - public static void register(ParticleType type, ParticleFactories.DeferredParticleProvider provider) { - ParticleFactoryRegistry.getInstance().register(type, spriteProvider -> - provider.create(new ExtendedSpriteSetImpl(spriteProvider))); + + public static void register(ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) { + ParticleFactoryRegistry.getInstance().register(type, sprites -> + provider.create(new ExtendedSpriteSetImpl(sprites))); } } diff --git a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleProviderRegistryImpl.java similarity index 85% rename from forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java rename to forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleProviderRegistryImpl.java index 7de4bbe6..c6a95e31 100644 --- a/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleFactoriesImpl.java +++ b/forge/src/main/java/me/shedaniel/architectury/registry/forge/ParticleProviderRegistryImpl.java @@ -21,7 +21,7 @@ package me.shedaniel.architectury.registry.forge; import me.shedaniel.architectury.forge.ArchitecturyForge; import me.shedaniel.architectury.mixin.forge.ParticleEngineAccessor; -import me.shedaniel.architectury.registry.ParticleFactories; +import me.shedaniel.architectury.registry.ParticleProviderRegistry; import net.minecraft.client.Minecraft; import net.minecraft.client.particle.ParticleEngine; import net.minecraft.client.particle.ParticleProvider; @@ -39,68 +39,71 @@ import java.util.List; import java.util.Random; @Mod.EventBusSubscriber(modid = ArchitecturyForge.MOD_ID) -public class ParticleFactoriesImpl { - private static final class ExtendedSpriteSetImpl implements ParticleFactories.ExtendedSpriteSet { +public class ParticleProviderRegistryImpl { + private static final class ExtendedSpriteSetImpl implements ParticleProviderRegistry.ExtendedSpriteSet { private final ParticleEngine engine; private final SpriteSet delegate; - + private ExtendedSpriteSetImpl(ParticleEngine engine, SpriteSet delegate) { this.engine = engine; this.delegate = delegate; } - + @Override public TextureAtlas getAtlas() { return ((ParticleEngineAccessor) engine).getTextureAtlas(); } - + @Override public List getSprites() { return ((ParticleEngineAccessor.MutableSpriteSetAccessor) delegate).getSprites(); } - + @Override public TextureAtlasSprite get(int i, int j) { return delegate.get(i, j); } - + @Override public TextureAtlasSprite get(Random random) { return delegate.get(random); } } - + private static ArrayList deferred = new ArrayList<>(); - + private static void _register(ParticleType type, ParticleProvider provider) { Minecraft.getInstance().particleEngine.register(type, provider); } - - private static void _register(ParticleType type, ParticleFactories.DeferredParticleProvider provider) { - Minecraft.getInstance().particleEngine.register(type, spriteSet -> - provider.create(new ExtendedSpriteSetImpl(Minecraft.getInstance().particleEngine, spriteSet))); + + private static void _register(ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) { + Minecraft.getInstance().particleEngine.register(type, sprites -> + provider.create(new ExtendedSpriteSetImpl(Minecraft.getInstance().particleEngine, sprites))); } - + public static void register(ParticleType type, ParticleProvider provider) { - if (deferred == null) + if (deferred == null) { _register(type, provider); - else + } else { deferred.add(() -> _register(type, provider)); + } } - - public static void register(ParticleType type, ParticleFactories.DeferredParticleProvider provider) { - if (deferred == null) + + public static void register(ParticleType type, ParticleProviderRegistry.DeferredParticleProvider provider) { + if (deferred == null) { _register(type, provider); - else + } else { deferred.add(() -> _register(type, provider)); + } } - + @SubscribeEvent public static void onParticleFactoryRegister(ParticleFactoryRegisterEvent unused) { if (deferred != null) { // run all deferred registrations - for (Runnable r : deferred) - r.run(); + for (Runnable runnable : deferred) { + runnable.run(); + } // yeet deferred list - register immediately from now on deferred = null; } diff --git a/testmod-common/src/main/java/me/shedaniel/architectury/test/particle/TestParticles.java b/testmod-common/src/main/java/me/shedaniel/architectury/test/particle/TestParticles.java index ba71bbda..9a1f2aca 100644 --- a/testmod-common/src/main/java/me/shedaniel/architectury/test/particle/TestParticles.java +++ b/testmod-common/src/main/java/me/shedaniel/architectury/test/particle/TestParticles.java @@ -21,7 +21,7 @@ package me.shedaniel.architectury.test.particle; import me.shedaniel.architectury.platform.Platform; import me.shedaniel.architectury.registry.DeferredRegister; -import me.shedaniel.architectury.registry.ParticleFactories; +import me.shedaniel.architectury.registry.ParticleProviderRegistry; import me.shedaniel.architectury.registry.RegistrySupplier; import me.shedaniel.architectury.test.TestMod; import me.shedaniel.architectury.utils.Env; @@ -39,6 +39,6 @@ public class TestParticles { public static void initialize() { PARTICLE_TYPES.register(); if (Platform.getEnvironment() == Env.CLIENT) - ParticleFactories.register(TEST_PARTICLE.get(), HeartParticle.Provider::new); + ParticleProviderRegistry.register(TEST_PARTICLE.get(), HeartParticle.Provider::new); } }