diff --git a/build.gradle b/build.gradle index 04b0b65d3..0673c0fa9 100644 --- a/build.gradle +++ b/build.gradle @@ -51,6 +51,21 @@ sourceSets { compileClasspath += sourceSets.main.runtimeClasspath runtimeClasspath += sourceSets.main.runtimeClasspath } + lwjgl { + java { + srcDir 'src/lwjgl/java' + } + + compileClasspath += sourceSets.main.runtimeClasspath + runtimeClasspath += sourceSets.main.runtimeClasspath + } +} + +// Minestom uses LWJGL libs as optional dependency if interfacing with a GPU is asked +java { + registerFeature("lwjgl") { + usingSourceSet(sourceSets.lwjgl) + } } dependencies { @@ -95,15 +110,15 @@ dependencies { api 'com.github.jglrxavpok:Hephaistos:v1.0.4' // LWJGL, for map rendering - implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion") + lwjglApi platform("org.lwjgl:lwjgl-bom:$lwjglVersion") - api "org.lwjgl:lwjgl" - api "org.lwjgl:lwjgl-egl" - api "org.lwjgl:lwjgl-opengl" - api "org.lwjgl:lwjgl-opengles" - api "org.lwjgl:lwjgl-glfw" - runtimeOnly "org.lwjgl:lwjgl::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-opengl::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-opengles::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-glfw::$lwjglNatives" + lwjglApi "org.lwjgl:lwjgl" + lwjglApi "org.lwjgl:lwjgl-egl" + lwjglApi "org.lwjgl:lwjgl-opengl" + lwjglApi "org.lwjgl:lwjgl-opengles" + lwjglApi "org.lwjgl:lwjgl-glfw" + lwjglRuntimeOnly "org.lwjgl:lwjgl::$lwjglNatives" + lwjglRuntimeOnly "org.lwjgl:lwjgl-opengl::$lwjglNatives" + lwjglRuntimeOnly "org.lwjgl:lwjgl-opengles::$lwjglNatives" + lwjglRuntimeOnly "org.lwjgl:lwjgl-glfw::$lwjglNatives" } diff --git a/src/lwjgl/README.md b/src/lwjgl/README.md new file mode 100644 index 000000000..7d11f275d --- /dev/null +++ b/src/lwjgl/README.md @@ -0,0 +1,4 @@ +# Minestom LWJGL code + +Here is all LWJGL-related code in Minestom. +Accessible when using "lwjgl" as an optional dependency in Gradle when declaring Minestom as a dependency diff --git a/src/main/java/fr/themode/demo/map/MapAnimationDemo.java b/src/lwjgl/java/fr/themode/demo/map/MapAnimationDemo.java similarity index 95% rename from src/main/java/fr/themode/demo/map/MapAnimationDemo.java rename to src/lwjgl/java/fr/themode/demo/map/MapAnimationDemo.java index 0df0032b8..5ec11dcbc 100644 --- a/src/main/java/fr/themode/demo/map/MapAnimationDemo.java +++ b/src/lwjgl/java/fr/themode/demo/map/MapAnimationDemo.java @@ -1,5 +1,6 @@ package fr.themode.demo.map; +import fr.themode.demo.Main; import net.minestom.server.MinecraftServer; import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.item.ItemStack; @@ -131,4 +132,12 @@ public class MapAnimationDemo { p.getPlayerConnection().sendPacket(mapDataPacket); }); } + + public static void main(String[] args) { + MinecraftServer.init(); + + MinecraftServer.getCommandManager().register(new TestItemFrame()); + init(); + Main.main(args); + } } diff --git a/src/main/java/fr/themode/demo/commands/TestItemFrame.java b/src/lwjgl/java/fr/themode/demo/map/TestItemFrame.java similarity index 93% rename from src/main/java/fr/themode/demo/commands/TestItemFrame.java rename to src/lwjgl/java/fr/themode/demo/map/TestItemFrame.java index 956f6db48..97b2f907c 100644 --- a/src/main/java/fr/themode/demo/commands/TestItemFrame.java +++ b/src/lwjgl/java/fr/themode/demo/map/TestItemFrame.java @@ -1,6 +1,5 @@ -package fr.themode.demo.commands; +package fr.themode.demo.map; -import fr.themode.demo.map.MapAnimationDemo; import net.minestom.server.command.CommandProcessor; import net.minestom.server.command.CommandSender; import net.minestom.server.entity.Player; diff --git a/src/main/java/net/minestom/server/map/framebuffers/GLFWFramebuffer.java b/src/lwjgl/java/net/minestom/server/map/framebuffers/GLFWFramebuffer.java similarity index 97% rename from src/main/java/net/minestom/server/map/framebuffers/GLFWFramebuffer.java rename to src/lwjgl/java/net/minestom/server/map/framebuffers/GLFWFramebuffer.java index 6ba82a0c1..0485e39b0 100644 --- a/src/main/java/net/minestom/server/map/framebuffers/GLFWFramebuffer.java +++ b/src/lwjgl/java/net/minestom/server/map/framebuffers/GLFWFramebuffer.java @@ -10,12 +10,11 @@ import org.lwjgl.PointerBuffer; import org.lwjgl.glfw.GLFWErrorCallback; import org.lwjgl.opengl.GL; import org.lwjgl.system.MemoryStack; -import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; -import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.opengl.GL11.*; /** * GLFW-based framebuffer. @@ -31,6 +30,8 @@ import static org.lwjgl.glfw.GLFW.*; * * GLFWFramebuffer does not provide guarantee that the result of {@link #toMapColors()} is synchronized with rendering, but * it will be updated after each frame rendered through {@link #render(Runnable)} or {@link #setupRenderLoop(long, TimeUnit, Runnable)}. + * + * This framebuffer is meant to render to a single map (ie it is only compatible with 128x128 rendering) */ public class GLFWFramebuffer implements Framebuffer { diff --git a/src/main/java/fr/themode/demo/Main.java b/src/main/java/fr/themode/demo/Main.java index 9d7c95e87..e90777fc9 100644 --- a/src/main/java/fr/themode/demo/Main.java +++ b/src/main/java/fr/themode/demo/Main.java @@ -4,7 +4,6 @@ import fr.themode.demo.blocks.BurningTorchBlock; import fr.themode.demo.blocks.StoneBlock; import fr.themode.demo.blocks.UpdatableBlockDemo; import fr.themode.demo.commands.*; -import fr.themode.demo.map.MapAnimationDemo; import net.minestom.server.MinecraftServer; import net.minestom.server.command.CommandManager; import net.minestom.server.instance.block.BlockManager; @@ -35,9 +34,6 @@ public class Main { commandManager.register(new GamemodeCommand()); commandManager.register(new DimensionCommand()); commandManager.register(new ShutdownCommand()); - commandManager.register(new TestItemFrame()); - - MapAnimationDemo.init(); /*RecipeManager recipeManager = MinecraftServer.getRecipeManager(); ShapelessRecipe shapelessRecipe = new ShapelessRecipe("test", "groupname") { diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index a4fc1140a..ff0c90d96 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -127,6 +127,8 @@ public class MinecraftServer { private static MinecraftSessionService sessionService = authService.createMinecraftSessionService(); public static MinecraftServer init() { + if(minecraftServer != null) // don't init twice + return minecraftServer; // warmup/force-init registries // without this line, registry types that are not loaded explicitly will have an internal empty registry in Registries // That can happen with PotionType for instance, if no code tries to access a PotionType field