diff --git a/.classpath b/.classpath index be88c88..aa24133 100644 --- a/.classpath +++ b/.classpath @@ -12,7 +12,19 @@ - + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.buildship.core.prefs b/.settings/org.eclipse.buildship.core.prefs index 6d93aa6..d123caf 100644 --- a/.settings/org.eclipse.buildship.core.prefs +++ b/.settings/org.eclipse.buildship.core.prefs @@ -1,11 +1,11 @@ arguments= auto.sync=false build.scans.enabled=false -connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER) +connection.gradle.distribution=GRADLE_DISTRIBUTION(VERSION(9.1.0)) connection.project.dir= eclipse.preferences.version=1 gradle.user.home= -java.home=C\:/Program Files/Eclipse Adoptium/jdk-21.0.1.12-hotspot +java.home=C\:/Program Files/Java/jdk-25.0.2+10 jvm.arguments= offline.mode=false override.workspace.settings=true diff --git a/build.gradle b/build.gradle index 9923614..1dfa11b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,8 @@ apply plugin: 'java' apply plugin: 'eclipse' +java.toolchain.languageVersion = JavaLanguageVersion.of(25) + tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } @@ -12,7 +14,14 @@ eclipse { } } -sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = JavaLanguageVersion.of(21) +sourceSets { + graphics {} +} + +configurations { + graphics.extendsFrom implementation + graphics.extendsFrom runtime +} repositories { mavenCentral() @@ -23,34 +32,6 @@ repositories { maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } -task srcJar(type: Jar) { - from sourceSets.main.allSource - archiveClassifier = 'sources' - from { - configurations.runtimeClasspath.collect { - it.isDirectory() ? it : zipTree(it) - } - } - duplicatesStrategy = DuplicatesStrategy.INCLUDE -} - -artifacts { - archives srcJar -} - -jar { - manifest { - attributes "Main-Class": 'speiger.src.coreengine.NewInputTest' - } - from { - configurations.runtimeClasspath.collect { - it.isDirectory() ? it : zipTree(it) - } - } - exclude('**/*.LIST') - exclude('**/module-info.class') - duplicatesStrategy = DuplicatesStrategy.INCLUDE -} dependencies { //LWJGL 3 @@ -77,11 +58,38 @@ dependencies { implementation "org.lwjgl:lwjgl-harfbuzz::$lwjglNatives" implementation "org.lwjgl:lwjgl-nanovg::$lwjglNatives" - - //Gson implementation 'com.google.code.gson:gson:2.8.6' //Primitive Collections - implementation 'de.speiger:Primitive-Collections:0.9.0' + implementation 'de.speiger:Primitive-Collections:1.0.0' } + +jar { + manifest { + attributes "Main-Class": 'speiger.src.coreengine.NewInputTest' + } + from { + configurations.runtimeClasspath.collect { + it.isDirectory() ? it : zipTree(it) + } + } + exclude('**/*.LIST') + exclude('**/module-info.class') + duplicatesStrategy = DuplicatesStrategy.INCLUDE +} + +task srcJar(type: Jar) { + from sourceSets.main.allSource + archiveClassifier = 'sources' + from { + configurations.runtimeClasspath.collect { + it.isDirectory() ? it : zipTree(it) + } + } + duplicatesStrategy = DuplicatesStrategy.INCLUDE +} + +artifacts { + archives srcJar +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a595206..757df18 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/graphics/java/speiger/src/coreengine/api/buffer/VertexBuffer.java b/src/graphics/java/speiger/src/coreengine/api/buffer/VertexBuffer.java new file mode 100644 index 0000000..1c09e53 --- /dev/null +++ b/src/graphics/java/speiger/src/coreengine/api/buffer/VertexBuffer.java @@ -0,0 +1,5 @@ +package speiger.src.coreengine.api.buffer; + +public interface VertexBuffer { + +} diff --git a/src/graphics/java/speiger/src/coreengine/api/core/Graphics.java b/src/graphics/java/speiger/src/coreengine/api/core/Graphics.java new file mode 100644 index 0000000..9a70ff1 --- /dev/null +++ b/src/graphics/java/speiger/src/coreengine/api/core/Graphics.java @@ -0,0 +1,9 @@ +package speiger.src.coreengine.api.core; + +import speiger.src.coreengine.rendering.input.window.Window; + +public interface Graphics { + public String getName(); + + public GraphicsDevice createDevice(Window window); +} diff --git a/src/graphics/java/speiger/src/coreengine/api/core/GraphicsCommandQueue.java b/src/graphics/java/speiger/src/coreengine/api/core/GraphicsCommandQueue.java new file mode 100644 index 0000000..e7268e6 --- /dev/null +++ b/src/graphics/java/speiger/src/coreengine/api/core/GraphicsCommandQueue.java @@ -0,0 +1,5 @@ +package speiger.src.coreengine.api.core; + +public interface GraphicsCommandQueue { + +} diff --git a/src/graphics/java/speiger/src/coreengine/api/core/GraphicsDevice.java b/src/graphics/java/speiger/src/coreengine/api/core/GraphicsDevice.java new file mode 100644 index 0000000..86d60d0 --- /dev/null +++ b/src/graphics/java/speiger/src/coreengine/api/core/GraphicsDevice.java @@ -0,0 +1,12 @@ +package speiger.src.coreengine.api.core; + +import speiger.src.coreengine.api.buffer.VertexBuffer; +import speiger.src.coreengine.api.texture.Texture; +import speiger.src.coreengine.rendering.input.window.Window; + +public interface GraphicsDevice { + public GraphicsSurface createSurface(Window window); + public GraphicsCommandQueue getQueue(); + public VertexBuffer createBuffer(); + public Texture createTexture(); +} diff --git a/src/graphics/java/speiger/src/coreengine/api/core/GraphicsResource.java b/src/graphics/java/speiger/src/coreengine/api/core/GraphicsResource.java new file mode 100644 index 0000000..ae0e4b2 --- /dev/null +++ b/src/graphics/java/speiger/src/coreengine/api/core/GraphicsResource.java @@ -0,0 +1,5 @@ +package speiger.src.coreengine.api.core; + +public interface GraphicsResource { + public void remove(); +} diff --git a/src/graphics/java/speiger/src/coreengine/api/core/GraphicsSurface.java b/src/graphics/java/speiger/src/coreengine/api/core/GraphicsSurface.java new file mode 100644 index 0000000..5713d38 --- /dev/null +++ b/src/graphics/java/speiger/src/coreengine/api/core/GraphicsSurface.java @@ -0,0 +1,5 @@ +package speiger.src.coreengine.api.core; + +public interface GraphicsSurface { + public void setVsync(boolean value); +} diff --git a/src/graphics/java/speiger/src/coreengine/api/texture/Texture.java b/src/graphics/java/speiger/src/coreengine/api/texture/Texture.java new file mode 100644 index 0000000..d9d971b --- /dev/null +++ b/src/graphics/java/speiger/src/coreengine/api/texture/Texture.java @@ -0,0 +1,6 @@ +package speiger.src.coreengine.api.texture; + +public abstract class Texture { + protected final TextureType type = null; + +} diff --git a/src/graphics/java/speiger/src/coreengine/api/texture/TextureType.java b/src/graphics/java/speiger/src/coreengine/api/texture/TextureType.java new file mode 100644 index 0000000..824c3c7 --- /dev/null +++ b/src/graphics/java/speiger/src/coreengine/api/texture/TextureType.java @@ -0,0 +1,15 @@ +package speiger.src.coreengine.api.texture; + +public enum TextureType { + TEXTURE_1D, + TEXTURE_1D_ARRAY, + TEXTURE_2D, + TEXTURE_2D_ARRAY, + TEXTURE_2D_MULTISAMPLE, + TEXTURE_2D_MULTISAMPLE_ARRAY, + TEXTURE_3D, + TEXTURE_CUBE_MAP, + TEXTURE_CUBE_MAP_ARRAY, + TEXTURE_RECTANGLE, + TEXTURE_BUFFER; +} diff --git a/src/main/java/speiger/src/coreengine/NewInputTest.java b/src/main/java/speiger/src/coreengine/NewInputTest.java index 7efcee0..04ec2ec 100644 --- a/src/main/java/speiger/src/coreengine/NewInputTest.java +++ b/src/main/java/speiger/src/coreengine/NewInputTest.java @@ -28,6 +28,7 @@ import speiger.src.coreengine.rendering.input.devices.Joystick; import speiger.src.coreengine.rendering.input.devices.Keyboard; import speiger.src.coreengine.rendering.input.devices.Mouse; import speiger.src.coreengine.rendering.input.events.KeyEvent; +import speiger.src.coreengine.rendering.input.events.MouseEvent; import speiger.src.coreengine.rendering.input.window.Window; import speiger.src.coreengine.rendering.input.window.WindowManager; import speiger.src.coreengine.rendering.models.buffers.BufferAttribute; @@ -42,7 +43,6 @@ import speiger.src.coreengine.rendering.tesselation.format.VertexTypes; import speiger.src.coreengine.rendering.textures.custom.Drawable; import speiger.src.coreengine.rendering.textures.custom.DynamicTexture; import speiger.src.coreengine.rendering.utils.GLStateTracker; -import speiger.src.coreengine.rendering.utils.values.GLBlendFactor; import speiger.src.coreengine.rendering.utils.values.GLDataType; import speiger.src.coreengine.rendering.utils.values.GLMode; import speiger.src.coreengine.rendering.utils.values.textures.GLTextureFormat; @@ -78,6 +78,9 @@ public class NewInputTest { FileDrop.INSTANCE.init(bus); manager.addDevices(Mouse.INSTANCE, Keyboard.INSTANCE, Joystick.INSTANCE, FileDrop.INSTANCE); Window window = manager.builder().title("Testing Engine").width(800).height(600).antialis(0).build(); + Window secondWindow = manager.builder().title("Second Window Engine").width(800).height(600).antialis(0).build(); + Thread.ofPlatform().start(() -> drawSecondScreen(secondWindow)); + window.setupContext(); shaderTest.register(); guiShader.register(); assets.addListener(GLStateTracker.instance().shaders); @@ -102,6 +105,10 @@ public class NewInputTest { texture.fill(0, half, half, half, 0, 0, 255, 255); texture.process(true); window.visible(true); + + bus.register(MouseEvent.Click.class, T -> { + System.out.println("Testing: Button="+T.button()+", Click="+T.press()+", X="+T.x()+", Y="+T.y()+", WindowId="+T.windowId()+", WindowName="+manager.getWindow(T.windowId()).title()); + }); bus.register(KeyEvent.Key.class, T -> { if(T.key() == GLFW.GLFW_KEY_T) { T.cancel(); @@ -138,15 +145,15 @@ public class NewInputTest { builder.pos(-0.5F, 0.5F, 0).tex(0F, 0F).rgba(-1).endVertex(); builder.pos(-0.5F, -0.5F, 0).tex(0F, 1F).rgba(-1).endVertex(); - Font font = fonts.createFont(1F); +// Font font = fonts.createFont(1F); TestModel model = new TestModel(builder.getBytes()); - TestModel[] guiModel = new TestModel[1]; - List draws = new ObjectArrayList<>(); - TexturedBuffer buffer = new TexturedBuffer((K, V) -> { - draws.addAll(K); - guiModel[0] = new TestModel(V); - System.out.println("Testing: "+V.length+" bytes, "+K.size()); - }); +// TestModel[] guiModel = new TestModel[1]; +// List draws = new ObjectArrayList<>(); +// TexturedBuffer buffer = new TexturedBuffer((K, V) -> { +// draws.addAll(K); +// guiModel[0] = new TestModel(V); +// System.out.println("Testing: "+V.length+" bytes, "+K.size()); +// }); // String s = "The Quick brown fox Jumps over the Lazy dog"; float x = 50; @@ -154,15 +161,79 @@ public class NewInputTest { float scale = 1F; y /= scale; TextStyle style = TextStyle.DEFAULT.size(12).bold(false); - font.drawText(style, "Testing My Theory", x, y, -1, buffer, scale, true); +// font.drawText(style, "Testing My Theory", x, y, -1, buffer, scale, true); // float offset = font.drawText(style, "The Quick ", 50, y, -1, buffer, scale, false); // offset += font.drawText(style, "Brown ", 50+offset, y, -1, buffer, scale, false); // offset += font.drawText(style, "§ox ", 50+offset, y, -1, buffer, scale, false); // offset += font.drawText(style, "Jumps ", 50+offset, y, -1, buffer, scale, false); // offset += font.drawText(style, "over the Lazy dog", 50+offset, y, -1, buffer, scale, true); -// font.drawText(s, 50, 50, -1, buffer, true); +// font.drawText(s, 50, 50, -1, buffer, true); GLStateTracker tracker = GLStateTracker.instance(); GL11.glClearColor(0.2F, 0.55F, 0.66F, 1F); + while(!window.shouldClose()) { + GLFW.glfwPollEvents(); + if(window.changed()) { + window.updateViewport(); + applyWindowSize(window); + } + + window.beginFrame(); + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); + texture.bind(); + shaderTest.bind(); + model.bindArray(); + GLStateTracker.drawArrays(GLMode.TRIANGLES.glValue(), 6); + model.unbindArray(); +// guiModel[0].bindArray(); +// guiShader.bind(); +// tracker.blend.enable(); +// tracker.blend.setFunction(GLBlendFactor.SRC_ALPHA, GLBlendFactor.ONE_MINUS_SRC_ALPHA); +// for(GLDraw draw : draws) { +// tracker.textures.bind(draw.texture()); +// GLStateTracker.drawArrays(GLMode.TRIANGLES.glValue(), draw.startVertex(), draw.vertexCount()); +// } +// GLStateTracker.instance().blend.disable(); +// guiModel[0].unbindArray(); + + window.handleInput(); + window.finishFrame(); + try { Thread.sleep(100); } + catch(InterruptedException e) { e.printStackTrace(); } + } + window.destroy(); + manager.destroy(); + } + + public void drawSecondScreen(Window window) { + window.setupContext(); + assets.addListener(GLStateTracker.instance().shaders); + Shader secondShader = Shader.createAndRegister(TestShader::new); + + guiShader.register(); + window.visible(true); + GL11.glClearColor(0.4F, 0.55F, 0.36F, 1F); + int size = 512; + int half = size >> 1; + int base = size >> 3; + + DynamicTexture texture = new DynamicTexture(size, size, DynamicTexture.DEFAULT_PARAMETERS); + texture.fill(0, 0, size, size, -1); + texture.fill(0, 0, half, half, 255, 0, 0, 255); + texture.fill(half, 0, half, half, 0, 255, 0, 255); + texture.fill(half, half, half, half, 255, 0, 0, 255); + texture.fill(0, half, half, half, 0, 0, 255, 255); + texture.process(true); + + VertexBuilder builder = new VertexBuilder(255); + builder.start(GLMode.TRIANGLES, VertexTypes.TESTING); + builder.pos(-0.5F, -0.5F, 0).tex(0F, 1F).rgba(-1).endVertex(); + builder.pos(0.5F, -0.5F, 0).tex(1F, 1F).rgba(-1).endVertex(); + builder.pos(0.5F, 0.5F, 0).tex(1F, 0F).rgba(-1).endVertex(); + builder.pos(0.5F, 0.5F, 0).tex(1F, 0F).rgba(-1).endVertex(); + builder.pos(-0.5F, 0.5F, 0).tex(0F, 0F).rgba(-1).endVertex(); + builder.pos(-0.5F, -0.5F, 0).tex(0F, 1F).rgba(-1).endVertex(); + + TestModel model = new TestModel(builder.getBytes()); while(!window.shouldClose()) { GLFW.glfwPollEvents(); if(window.changed()) { @@ -172,32 +243,17 @@ public class NewInputTest { window.beginFrame(); GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); texture.bind(); - shaderTest.bind(); + secondShader.bind(); model.bindArray(); GLStateTracker.drawArrays(GLMode.TRIANGLES.glValue(), 6); model.unbindArray(); - guiModel[0].bindArray(); - guiShader.bind(); - tracker.blend.enable(); - tracker.blend.setFunction(GLBlendFactor.SRC_ALPHA, GLBlendFactor.ONE_MINUS_SRC_ALPHA); - for(GLDraw draw : draws) { - tracker.textures.bind(draw.texture()); - GLStateTracker.drawArrays(GLMode.TRIANGLES.glValue(), draw.startVertex(), draw.vertexCount()); - } - GLStateTracker.instance().blend.disable(); - guiModel[0].unbindArray(); -// NanoVG.nvgBeginFrame(vg, window.width(), window.height(), 1F); -// NanoVG.nvgFontSize(vg, 64); -// NanoVG.nvgText(vg, 50, 520, "Testing My Theory"); -// NanoVG.nvgEndFrame(vg); - + window.handleInput(); window.finishFrame(); try { Thread.sleep(100); } catch(InterruptedException e) { e.printStackTrace(); } } window.destroy(); - manager.destroy(); } public static class TexturedBuffer implements Font.TexturedBuffer { diff --git a/src/main/java/speiger/src/coreengine/assets/base/PackReloadingTask.java b/src/main/java/speiger/src/coreengine/assets/base/PackReloadingTask.java index 26741dd..359ef26 100644 --- a/src/main/java/speiger/src/coreengine/assets/base/PackReloadingTask.java +++ b/src/main/java/speiger/src/coreengine/assets/base/PackReloadingTask.java @@ -45,7 +45,7 @@ public class PackReloadingTask { syncStep.complete(new Object()); } }); - return syncStep.thenCombine(currentStep, (k, v) -> value); + return syncStep.thenCombine(currentStep, (_, _) -> value); } } } diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/components/base/IListableComponent.java b/src/main/java/speiger/src/coreengine/rendering/gui/components/base/IListableComponent.java index e1f7c6b..d3fe95f 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/components/base/IListableComponent.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/components/base/IListableComponent.java @@ -38,7 +38,7 @@ public sealed interface IListableComponent permits GuiComponent { } public default GuiComponent addListener(Runnable runnable, int index) { - return addListener(T -> runnable.run(), index); + return addListener(_ -> runnable.run(), index); } public default GuiComponent removeUserActionListener(Consumer listener) { diff --git a/src/main/java/speiger/src/coreengine/rendering/gui/renderer/SimpleUIRenderer.java b/src/main/java/speiger/src/coreengine/rendering/gui/renderer/SimpleUIRenderer.java index ab3abeb..a8e8406 100644 --- a/src/main/java/speiger/src/coreengine/rendering/gui/renderer/SimpleUIRenderer.java +++ b/src/main/java/speiger/src/coreengine/rendering/gui/renderer/SimpleUIRenderer.java @@ -10,6 +10,7 @@ import speiger.src.coreengine.math.vector.matrix.Matrix4f; import speiger.src.coreengine.math.vector.matrix.Matrix4fStack; import speiger.src.coreengine.math.vector.quaternion.Quaternion; import speiger.src.coreengine.rendering.guiOld.helper.box.IGuiBox; +import speiger.src.coreengine.rendering.input.window.Window; import speiger.src.coreengine.rendering.models.DrawCall; import speiger.src.coreengine.rendering.tesselation.buffer.VertexBuilder; import speiger.src.coreengine.rendering.tesselation.format.VertexFormat; @@ -26,8 +27,13 @@ public class SimpleUIRenderer implements IUIRenderer, AutoCloseable { List drawCalls = new ObjectArrayList<>(); VertexBuilder builder = new VertexBuilder(Short.MAX_VALUE); ScissorsManager manager = new ScissorsManager(32); + Window window; + public SimpleUIRenderer(Window window) { + this.window = window; + } + @Override public void close() throws Exception { builder.close(); diff --git a/src/main/java/speiger/src/coreengine/rendering/guiOld/base/GuiScreenBase.java b/src/main/java/speiger/src/coreengine/rendering/guiOld/base/GuiScreenBase.java index ed999f2..0377595 100644 --- a/src/main/java/speiger/src/coreengine/rendering/guiOld/base/GuiScreenBase.java +++ b/src/main/java/speiger/src/coreengine/rendering/guiOld/base/GuiScreenBase.java @@ -485,7 +485,7 @@ public class GuiScreenBase extends GuiBase @Override public boolean isComponentInFront(GuiComponent comp) { - if(!hasFocus() || renderOrder.last() == comp || (renderOrder.last() instanceof IButtonComponent && ((IButtonComponent)renderOrder.last()).isPopup())) + if(!hasFocus() || renderOrder.getLast() == comp || (renderOrder.getLast() instanceof IButtonComponent && ((IButtonComponent)renderOrder.getLast()).isPopup())) { return true; } diff --git a/src/main/java/speiger/src/coreengine/rendering/guiOld/components/ListComponent.java b/src/main/java/speiger/src/coreengine/rendering/guiOld/components/ListComponent.java index 44ef3a9..c773a9f 100644 --- a/src/main/java/speiger/src/coreengine/rendering/guiOld/components/ListComponent.java +++ b/src/main/java/speiger/src/coreengine/rendering/guiOld/components/ListComponent.java @@ -181,11 +181,11 @@ public class ListComponent extends GuiComponent { if(selectionMode == SELECTION_MODE_MULTI && Keyboard.isShiftDown()) { - for(int i = selectedIndexes.lastInt();iindex;i--) + for(int i = selectedIndexes.getLastInt();i>index;i--) { selectedIndexes.add(i); } diff --git a/src/main/java/speiger/src/coreengine/rendering/input/window/Window.java b/src/main/java/speiger/src/coreengine/rendering/input/window/Window.java index 3862192..a4dbb40 100644 --- a/src/main/java/speiger/src/coreengine/rendering/input/window/Window.java +++ b/src/main/java/speiger/src/coreengine/rendering/input/window/Window.java @@ -144,8 +144,14 @@ public class Window { } } - public void beginFrame() { + public void setupContext() { + GL.setCapabilities(capabilities); GLFW.glfwMakeContextCurrent(id); + + } + + public void beginFrame() { + setupContext(); if(flags.isFlagSet(WINDOW_CHANGE)) updateViewport(); } diff --git a/src/main/java/speiger/src/coreengine/rendering/inputOld/Mouse.java b/src/main/java/speiger/src/coreengine/rendering/inputOld/Mouse.java index 2ae2ca0..c0b0d1f 100644 --- a/src/main/java/speiger/src/coreengine/rendering/inputOld/Mouse.java +++ b/src/main/java/speiger/src/coreengine/rendering/inputOld/Mouse.java @@ -38,7 +38,7 @@ public class Mouse window.addCallback(T -> GLFW.glfwSetCursorPosCallback(T, Mouse.this::onDrag)); window.addCallback(T -> GLFW.glfwSetMouseButtonCallback(T, Mouse.this::onClick)); window.addCallback(T -> GLFW.glfwSetScrollCallback(T, Mouse.this::onScroll)); - window.addCallback(T -> GLFW.glfwSetCursorEnterCallback(T, (K, V) -> active = V)); + window.addCallback(T -> GLFW.glfwSetCursorEnterCallback(T, (_, V) -> active = V)); } protected void onDrag(long window, double xpos, double ypos) { diff --git a/src/main/java/speiger/src/coreengine/rendering/shader/Shader.java b/src/main/java/speiger/src/coreengine/rendering/shader/Shader.java index f5cf095..3738459 100644 --- a/src/main/java/speiger/src/coreengine/rendering/shader/Shader.java +++ b/src/main/java/speiger/src/coreengine/rendering/shader/Shader.java @@ -7,7 +7,6 @@ import speiger.src.coreengine.assets.base.IAssetProvider; import speiger.src.coreengine.rendering.utils.GLStateTracker; public class Shader implements Supplier { - boolean registered = false; T program; Function provider; @@ -36,8 +35,6 @@ public class Shader implements Supplier { } public void register() { - if(registered) throw new IllegalStateException("Shader is already registered!"); - registered = true; GLStateTracker.instance().shaders.register(this); } diff --git a/src/main/java/speiger/src/coreengine/rendering/shader/ShaderTracker.java b/src/main/java/speiger/src/coreengine/rendering/shader/ShaderTracker.java index 0d1c89e..2b8cb52 100644 --- a/src/main/java/speiger/src/coreengine/rendering/shader/ShaderTracker.java +++ b/src/main/java/speiger/src/coreengine/rendering/shader/ShaderTracker.java @@ -14,6 +14,7 @@ public class ShaderTracker implements ISimpleRealodableAsset, IManagedAsset { IAssetProvider provider; public void register(Shader shader) { + if(shaders.contains(shader)) throw new IllegalStateException("Shader is already registered!"); shaders.add(shader); load(provider, shader); } diff --git a/src/main/java/speiger/src/coreengine/utils/eventbus/EventBus.java b/src/main/java/speiger/src/coreengine/utils/eventbus/EventBus.java index af59914..99b499c 100644 --- a/src/main/java/speiger/src/coreengine/utils/eventbus/EventBus.java +++ b/src/main/java/speiger/src/coreengine/utils/eventbus/EventBus.java @@ -45,8 +45,9 @@ public class EventBus SubscribeEvent data = t.getAnnotation(SubscribeEvent.class); if(data == null) return; Consumer listener = new MethodListener(LOOKUP.unreflect(t).bindTo(obj)); - getListeners(castClass(t.getParameterTypes()[0])).addListener(data.priority(), listener); - list.add(new EventListener(data.value(), listener)); + Class clz = castClass(t.getParameterTypes()[0]); + getListeners(clz).addListener(data.priority(), listener); + list.add(new EventListener(clz, listener)); } catch(Exception e) { e.printStackTrace(); } }); @@ -99,11 +100,12 @@ public class EventBus } protected Listeners getListeners(Class event) { - //TODO this is abusing undefined behavior! - return listeners.computeIfAbsent(event, T -> { - if(T == Event.class) return new Listeners(); - else return new Listeners(getListeners(castClass(event.getSuperclass()))); - }); + Listeners result = listeners.get(event); + if(result == null) { + result = event == Event.class ? new Listeners() : new Listeners(getListeners(castClass(event.getSuperclass()))); + listeners.put(event, result); + } + return result; } @SuppressWarnings("unchecked") @@ -117,22 +119,11 @@ public class EventBus } public static record EventListener(Class event, Consumer listener) {} - - public static class MethodListener implements Consumer { - MethodHandle handle; - - public MethodListener(MethodHandle handle) { - this.handle = handle; - } - + public static record MethodListener(MethodHandle handle) implements Consumer { @Override public void accept(Event t) { - try { - handle.invoke(t); - } - catch(Throwable e) { - e.printStackTrace(); - } + try { handle.invoke(t); } + catch(Throwable e) { e.printStackTrace(); } } } } diff --git a/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java b/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java index f485e42..467b5ba 100644 --- a/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java +++ b/src/main/java/speiger/src/coreengine/utils/eventbus/Listeners.java @@ -49,8 +49,7 @@ public class Listeners if(parent != null) parent.getListeners(entry, events); } - public Consumer[] getListeners() - { + public Consumer[] getListeners() { if(rebuild) rebuildListeners(); return listeners; } diff --git a/src/main/java/speiger/src/coreengine/utils/io/finders/JavaFileFinder.java b/src/main/java/speiger/src/coreengine/utils/io/finders/JavaFileFinder.java index 3994f6e..334eccc 100644 --- a/src/main/java/speiger/src/coreengine/utils/io/finders/JavaFileFinder.java +++ b/src/main/java/speiger/src/coreengine/utils/io/finders/JavaFileFinder.java @@ -21,7 +21,7 @@ public class JavaFileFinder implements IFileFinder { if((flags & MULTI_FILE) != 0) file.setMultiSelectionEnabled(true); file.setFileHidingEnabled(false); file.setFileFilter(new Filter(description, validFormats)); - if((flags & SAVE) != 0 && file.showSaveDialog(null) == 0) return ObjectArrayList.wrap(sanitize(file.getSelectedFiles(), validFormats.first())); + if((flags & SAVE) != 0 && file.showSaveDialog(null) == 0) return ObjectArrayList.wrap(sanitize(file.getSelectedFiles(), validFormats.getFirst())); else if((flags & SAVE) == 0 && file.showOpenDialog(null) == 0) return ObjectArrayList.wrap(file.getSelectedFiles()); return new ObjectArrayList<>(); } diff --git a/src/main/java/speiger/src/coreengine/utils/io/finders/NativeFileFinder.java b/src/main/java/speiger/src/coreengine/utils/io/finders/NativeFileFinder.java index 290871a..f4ca256 100644 --- a/src/main/java/speiger/src/coreengine/utils/io/finders/NativeFileFinder.java +++ b/src/main/java/speiger/src/coreengine/utils/io/finders/NativeFileFinder.java @@ -22,7 +22,7 @@ public class NativeFileFinder implements IFileFinder { PointerBuffer output = stack.mallocPointer(1); if(NativeFileDialog.NFD_SaveDialog(output, toFileFormat(stack, validFormats, description), startPath, "") == NativeFileDialog.NFD_OKAY) { File file = new File(output.getStringUTF8()); - if(file.getName().lastIndexOf(".") == -1) file = new File(file.getParent(), file.getName()+"."+validFormats.first()); + if(file.getName().lastIndexOf(".") == -1) file = new File(file.getParent(), file.getName()+"."+validFormats.getFirst()); files.add(file); } }