Latest Changes

This commit is contained in:
Speiger 2026-05-18 16:33:29 +02:00
parent 02b1aab8f3
commit bc078abea4
26 changed files with 237 additions and 99 deletions

View File

@ -12,7 +12,19 @@
<attribute name="gradle_used_by_scope" value="main,test"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-21/"/>
<classpathentry kind="src" output="bin/graphics" path="src/graphics/java">
<attributes>
<attribute name="gradle_scope" value="graphics"/>
<attribute name="gradle_used_by_scope" value="graphics"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="bin/graphics" path="src/graphics/resources">
<attributes>
<attribute name="gradle_scope" value="graphics"/>
<attribute name="gradle_used_by_scope" value="graphics"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-25/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin/default"/>
</classpath>

View File

@ -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

View File

@ -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
}

View File

@ -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

View File

@ -0,0 +1,5 @@
package speiger.src.coreengine.api.buffer;
public interface VertexBuffer {
}

View File

@ -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);
}

View File

@ -0,0 +1,5 @@
package speiger.src.coreengine.api.core;
public interface GraphicsCommandQueue {
}

View File

@ -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();
}

View File

@ -0,0 +1,5 @@
package speiger.src.coreengine.api.core;
public interface GraphicsResource {
public void remove();
}

View File

@ -0,0 +1,5 @@
package speiger.src.coreengine.api.core;
public interface GraphicsSurface {
public void setVsync(boolean value);
}

View File

@ -0,0 +1,6 @@
package speiger.src.coreengine.api.texture;
public abstract class Texture {
protected final TextureType type = null;
}

View File

@ -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;
}

View File

@ -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<GLDraw> 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<GLDraw> 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,7 +161,7 @@ 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, "§<c=0x24FF00FF>F§<c=r>ox ", 50+offset, y, -1, buffer, scale, false);
@ -169,6 +176,7 @@ public class NewInputTest {
window.updateViewport();
applyWindowSize(window);
}
window.beginFrame();
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
texture.bind();
@ -176,20 +184,16 @@ public class NewInputTest {
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);
// 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();
@ -200,6 +204,58 @@ public class NewInputTest {
manager.destroy();
}
public void drawSecondScreen(Window window) {
window.setupContext();
assets.addListener(GLStateTracker.instance().shaders);
Shader<TestShader> 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()) {
window.updateViewport();
applyWindowSize(window);
}
window.beginFrame();
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
texture.bind();
secondShader.bind();
model.bindArray();
GLStateTracker.drawArrays(GLMode.TRIANGLES.glValue(), 6);
model.unbindArray();
window.handleInput();
window.finishFrame();
try { Thread.sleep(100); }
catch(InterruptedException e) { e.printStackTrace(); }
}
window.destroy();
}
public static class TexturedBuffer implements Font.TexturedBuffer {
int previousId = -1;
int lastVertex = 0;

View File

@ -45,7 +45,7 @@ public class PackReloadingTask {
syncStep.complete(new Object());
}
});
return syncStep.thenCombine(currentStep, (k, v) -> value);
return syncStep.thenCombine(currentStep, (_, _) -> value);
}
}
}

View File

@ -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<GuiComponent> listener) {

View File

@ -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<UIDrawCall> 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();

View File

@ -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;
}

View File

@ -181,11 +181,11 @@ public class ListComponent<T extends IListEntry> extends GuiComponent
{
if(selectionMode == SELECTION_MODE_MULTI && Keyboard.isShiftDown())
{
for(int i = selectedIndexes.lastInt();i<index;i++)
for(int i = selectedIndexes.getLastInt();i<index;i++)
{
selectedIndexes.add(i);
}
for(int i = selectedIndexes.lastInt();i>index;i--)
for(int i = selectedIndexes.getLastInt();i>index;i--)
{
selectedIndexes.add(i);
}

View File

@ -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();
}

View File

@ -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) {

View File

@ -7,7 +7,6 @@ import speiger.src.coreengine.assets.base.IAssetProvider;
import speiger.src.coreengine.rendering.utils.GLStateTracker;
public class Shader<T extends ShaderProgram> implements Supplier<T> {
boolean registered = false;
T program;
Function<IAssetProvider, T> provider;
@ -36,8 +35,6 @@ public class Shader<T extends ShaderProgram> implements Supplier<T> {
}
public void register() {
if(registered) throw new IllegalStateException("Shader is already registered!");
registered = true;
GLStateTracker.instance().shaders.register(this);
}

View File

@ -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);
}

View File

@ -45,8 +45,9 @@ public class EventBus
SubscribeEvent data = t.getAnnotation(SubscribeEvent.class);
if(data == null) return;
Consumer<Event> 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<Event> 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<? extends Event> 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<? extends Event> event, Consumer<Event> listener) {}
public static class MethodListener implements Consumer<Event> {
MethodHandle handle;
public MethodListener(MethodHandle handle) {
this.handle = handle;
}
public static record MethodListener(MethodHandle handle) implements Consumer<Event> {
@Override
public void accept(Event t) {
try {
handle.invoke(t);
}
catch(Throwable e) {
e.printStackTrace();
}
try { handle.invoke(t); }
catch(Throwable e) { e.printStackTrace(); }
}
}
}

View File

@ -49,8 +49,7 @@ public class Listeners
if(parent != null) parent.getListeners(entry, events);
}
public Consumer<Event>[] getListeners()
{
public Consumer<Event>[] getListeners() {
if(rebuild) rebuildListeners();
return listeners;
}

View File

@ -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<>();
}

View File

@ -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);
}
}