From d77c3eefd4aa4d5b28520361669dd36cb8aac569 Mon Sep 17 00:00:00 2001 From: DaniTheSkunk <> Date: Fri, 18 Nov 2022 02:55:58 +0000 Subject: [PATCH] implemented Engine.watchFile --- com/danitheskunk/skunkworks/BaseGame.java | 1 + com/danitheskunk/skunkworks/Data.java | 32 ++++++++++++++ com/danitheskunk/skunkworks/Engine.java | 51 +++++++++++++++++++++++ com/danitheskunk/skunkworks/Test.java | 9 ++++ 4 files changed, 93 insertions(+) create mode 100644 com/danitheskunk/skunkworks/Data.java diff --git a/com/danitheskunk/skunkworks/BaseGame.java b/com/danitheskunk/skunkworks/BaseGame.java index 13309d6..8451f3d 100644 --- a/com/danitheskunk/skunkworks/BaseGame.java +++ b/com/danitheskunk/skunkworks/BaseGame.java @@ -43,6 +43,7 @@ public abstract class BaseGame { currentTime = GLFW.glfwGetTime(); delta = currentTime - lastTime; lastTime = currentTime; + engine.tick(); window.tick(); //todo: frame rate control rootNode.tick(); diff --git a/com/danitheskunk/skunkworks/Data.java b/com/danitheskunk/skunkworks/Data.java new file mode 100644 index 0000000..fac3c51 --- /dev/null +++ b/com/danitheskunk/skunkworks/Data.java @@ -0,0 +1,32 @@ +package com.danitheskunk.skunkworks; + +import java.io.BufferedInputStream; +import java.io.InputStreamReader; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.LinkedHashMap; + +public class Data { + private LinkedHashMap> data; + private String currentCategory; + + public Data(ByteBuffer data) { + this.data = new LinkedHashMap<>(); + this.currentCategory = ""; + this.data.put("", new LinkedHashMap<>()); + StandardCharsets.UTF_8.decode(data).toString().lines().forEach(this::processLine); + } + + private void processLine(String line) { + if(line.contains("=")) { + var parts = line.split("=", 2); + data.get(currentCategory).put(parts[0].strip(), parts[1].strip()); + } else if(line.startsWith("[") && line.endsWith("]")) { + currentCategory = line.substring(1, line.length()-1); + if(!data.containsKey(currentCategory)) { + data.put(currentCategory, new LinkedHashMap<>()); + } + } + } +} diff --git a/com/danitheskunk/skunkworks/Engine.java b/com/danitheskunk/skunkworks/Engine.java index 6c7ada0..6385af6 100644 --- a/com/danitheskunk/skunkworks/Engine.java +++ b/com/danitheskunk/skunkworks/Engine.java @@ -8,11 +8,18 @@ import org.lwjgl.BufferUtils; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.file.*; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Callable; import static com.danitheskunk.skunkworks.gfx.GraphicsBackend.OPENGL; public class Engine { private final GraphicsBackend graphicsBackend; + private final WatchService watchService; + private final Map> watchCallbacks; + private final Map watchPaths; //Constructors public Engine() { @@ -21,6 +28,13 @@ public class Engine { public Engine(GraphicsBackend graphicsBackend) { this.graphicsBackend = graphicsBackend; + try { + watchService = FileSystems.getDefault().newWatchService(); + } catch(IOException e) { + throw new RuntimeException(e); + } + watchCallbacks = new HashMap<>(); + watchPaths = new HashMap<>(); } //Methods @@ -42,9 +56,46 @@ public class Engine { return new Image(loadBytes(path)); } + public Data loadData(String path) { + return new Data(loadBytes(path)); + } + + //requires engine.tick() to be called regularly + public void watchFile(String path, Callable callback) { + var p = Paths.get(path); + var dir = p.getParent(); + try { + var key = dir.register(watchService, + StandardWatchEventKinds.ENTRY_MODIFY + ); + watchCallbacks.put(key, callback); + watchPaths.put(key, p.getFileName()); + } catch(IOException e) { + throw new RuntimeException(e); + } + } + public IWindow openWindow(Vec2i size, String title) { return switch(graphicsBackend) { case OPENGL -> new Window(size, title, this); }; } + + public void tick() { + WatchKey key; + while((key = watchService.poll()) != null) { + for(var event : key.pollEvents()) { + var path = ((WatchEvent) event).context(); + if(path.equals(watchPaths.get(key))) { + try { + if(watchCallbacks.get(key).call()) { + key.reset(); + } + } catch(Exception e) { + throw new RuntimeException(e); + } + } + } + } + } } diff --git a/com/danitheskunk/skunkworks/Test.java b/com/danitheskunk/skunkworks/Test.java index 5110f35..31d02b2 100644 --- a/com/danitheskunk/skunkworks/Test.java +++ b/com/danitheskunk/skunkworks/Test.java @@ -17,6 +17,15 @@ public class Test extends BaseGame { @Override protected void init() { + var path = "C:\\Program Files (x86)" + + "\\Steam\\steamapps\\common\\Unreal " + + "Tournament\\System\\UnrealTournament.ini"; + var data = engine.loadData(path); + engine.watchFile(path, () -> { + System.out.println("changed"); + return true; + }); + var fontThin = window.loadFontTileset("fonts\\thin-6x12.png"); var fontThin2 = window.loadFontTileset("fonts\\thin-12x12.png"); term = new Terminal(new Vec2i(40, 22), fontThin2, fontThin);