From c4f12ea0633b3a243becf5df490e231b4b87d0a9 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 28 Dec 2016 21:54:44 +0100 Subject: [PATCH 1/5] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index da5778f..f612a90 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,6 @@ I plan on making a series where I show the whole process of creating this projec * Add a virtual PC if you don't have any (the first one will be started) * Install an OS and Guest Additions, if you haven't already * Put the jar file into /plugins directory -* Put the dll file into /plugins/VirtualComputer directory - if it doesn't exist, create it * Make sure your server is set to a world that you don't mind your maps deleted from * Start your server From 58691f1777274c1cbe7b4a64c62643f5728c0a47 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 30 Dec 2016 01:29:44 +0100 Subject: [PATCH 2/5] Added POM... --- VirtualComputer/pom.xml | 89 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 VirtualComputer/pom.xml diff --git a/VirtualComputer/pom.xml b/VirtualComputer/pom.xml new file mode 100644 index 0000000..899b2e2 --- /dev/null +++ b/VirtualComputer/pom.xml @@ -0,0 +1,89 @@ + + 4.0.0 + io.github.NorbiPeti + VirtualComputer + 1.2-SNAPSHOT + + src + + + src + + **/*.java + + + + . + + *.dll + *.yml + + + + + + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.2 + + + package + + shade + + + + + org.virtualbox:VirtualBox + + + + + + + + + + + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + repo + file://${basedir}/repo + + + + + org.spigotmc + spigot-api + 1.9.2-R0.1-SNAPSHOT + provided + + + net.countercraft + Movecraft + 3.0.0 + provided + + + org.virtualbox + VirtualBox + 5.1 + + + \ No newline at end of file From 8f2690443ed82273877d557e9442cc760117d8be Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Fri, 30 Dec 2016 01:34:46 +0100 Subject: [PATCH 3/5] (Re)Added JNI4NET... --- VirtualComputer/.classpath | 2 +- VirtualComputer/pom.xml | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/VirtualComputer/.classpath b/VirtualComputer/.classpath index 8878e24..cc16eb5 100644 --- a/VirtualComputer/.classpath +++ b/VirtualComputer/.classpath @@ -1,6 +1,6 @@ - + diff --git a/VirtualComputer/pom.xml b/VirtualComputer/pom.xml index 899b2e2..ed7b5b8 100644 --- a/VirtualComputer/pom.xml +++ b/VirtualComputer/pom.xml @@ -80,6 +80,11 @@ 3.0.0 provided + + net.sf.jni4net + jni4net.j + 0.8.8.0 + org.virtualbox VirtualBox From 3da76f075f67c051e644b4dd50a57b69a3968c2e Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Mon, 8 Apr 2019 15:44:44 +0200 Subject: [PATCH 4/5] Conditional shading --- VirtualComputer/pom.xml | 77 ++++++++++++++----- .../java/sznp/virtualcomputer/PluginMain.java | 2 +- 2 files changed, 57 insertions(+), 22 deletions(-) diff --git a/VirtualComputer/pom.xml b/VirtualComputer/pom.xml index 8dd459e..fc2f807 100644 --- a/VirtualComputer/pom.xml +++ b/VirtualComputer/pom.xml @@ -57,11 +57,16 @@ 6.0 - org.bukkit - craftbukkit - 1.12.2-R0.1-SNAPSHOT - provided - + org.virtualbox + VirtualBox-MSCOM + 6.0 + + + org.bukkit + craftbukkit + 1.12.2-R0.1-SNAPSHOT + provided + net.java.dev.jna @@ -90,26 +95,56 @@ 3.0.0 - + \ No newline at end of file diff --git a/VirtualComputer/src/main/java/sznp/virtualcomputer/PluginMain.java b/VirtualComputer/src/main/java/sznp/virtualcomputer/PluginMain.java index c9898f2..427c400 100644 --- a/VirtualComputer/src/main/java/sznp/virtualcomputer/PluginMain.java +++ b/VirtualComputer/src/main/java/sznp/virtualcomputer/PluginMain.java @@ -67,7 +67,7 @@ public class PluginMain extends JavaPlugin { System.setProperty("java.library.path", vbpath); Utils.addLibraryPath(vbpath); final VirtualBoxManager manager = VirtualBoxManager.createInstance(getDataFolder().getAbsolutePath()); - VBoxLib vbl = LibraryLoader.create(VBoxLib.class).load("vboxjxpcom"); + VBoxLib vbl = LibraryLoader.create(VBoxLib.class).load("vboxjxpcom"); //TODO: Test for MSCOM vbl.RTR3InitExe(0, "", 0); IVirtualBox vbox = manager.getVBox(); listener = new VBoxEventHandler().registerTo(vbox.getEventSource()); From 18e1981a2ae47b267cea66e4de6cb00d6330885a Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Wed, 10 Apr 2019 17:59:36 +0200 Subject: [PATCH 5/5] Only sending changed map data --- .../java/sznp/virtualcomputer/Computer.java | 3 ++- .../virtualcomputer/renderer/GPURenderer.java | 25 ++++++++++++++++--- .../renderer/GPURendererInternal.java | 2 +- .../renderer/MCFrameBuffer.java | 4 +-- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/VirtualComputer/src/main/java/sznp/virtualcomputer/Computer.java b/VirtualComputer/src/main/java/sznp/virtualcomputer/Computer.java index 40cc76e..c29c184 100644 --- a/VirtualComputer/src/main/java/sznp/virtualcomputer/Computer.java +++ b/VirtualComputer/src/main/java/sznp/virtualcomputer/Computer.java @@ -8,6 +8,7 @@ import org.bukkit.command.CommandSender; import org.virtualbox_6_0.*; import sznp.virtualcomputer.events.MachineEventHandler; import sznp.virtualcomputer.events.VBoxEventHandler; +import sznp.virtualcomputer.renderer.GPURenderer; import sznp.virtualcomputer.renderer.GPURendererInternal; import sznp.virtualcomputer.renderer.MCFrameBuffer; import sznp.virtualcomputer.util.Scancode; @@ -207,7 +208,7 @@ public final class Computer { sendMessage(sender, "§eComputer powered off."); //This block runs later } }); - GPURendererInternal.setPixels(new byte[1], 0, 0); //Black screen + GPURenderer.update(new byte[1], 0, 0, 0, 0, 640, 480); //Black screen stopEvents(); MouseLockerPlayerListener.computerStop(); } diff --git a/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/GPURenderer.java b/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/GPURenderer.java index e67a101..0551f3e 100644 --- a/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/GPURenderer.java +++ b/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/GPURenderer.java @@ -16,8 +16,10 @@ public class GPURenderer extends MapRenderer implements IRenderer { private byte[] buffer; private GPURendererInternal kernel; private WorldMap wmap; + private int mapx, mapy; //Store at central location after conversion private static int[] colors_; + private static int changedX, changedY, changedWidth, changedHeight; public GPURenderer(short id, World world, int mapx, int mapy) throws Exception { MapView map = IRenderer.prepare(id, world); @@ -32,6 +34,8 @@ public class GPURenderer extends MapRenderer implements IRenderer { colors_[i] = cs[i].getRGB(); } } + this.mapx = mapx; + this.mapy = mapy; Field field = map.getClass().getDeclaredField("worldMap"); field.setAccessible(true); wmap = (WorldMap) field.get(map); @@ -46,19 +50,34 @@ public class GPURenderer extends MapRenderer implements IRenderer { public void render(MapView map, MapCanvas canvas, Player player) { Timing t = new Timing(); try { - if (kernel.isRendered()) return; //TODO: Stop rendering after computer is stopped + if (kernel.isRendered()) return; if (buffer == null) { //The buffer remains the same, as the canvas remains the same Field field = canvas.getClass().getDeclaredField("buffer"); field.setAccessible(true); buffer = (byte[]) field.get(canvas); } + if (changedX >= (mapx + 1) * 128 || changedY >= (mapy + 1) * 128 + || changedX + changedWidth < mapx * 128 || changedY + changedHeight < mapy * 128) + return; //No change for this map - TODO: Test + int x = changedX % 128; + int y = changedY % 128; + int w = x + changedWidth >= 128 ? 128 - x - 1 : changedWidth; + int h = y + changedHeight >= 128 ? 128 - y - 1 : changedHeight; kernel.render(buffer); - wmap.flagDirty(0, 0); - wmap.flagDirty(127, 127); // Send the whole image - TODO: Only send changes + wmap.flagDirty(x, y); + wmap.flagDirty(x + w, y + h); // Send the changes only } catch (Exception e) { e.printStackTrace(); } if (t.elapsedMS() > 60) System.out.println("Map rendering took " + t.elapsedMS() + "ms"); } + + public static void update(byte[] pixels, int width, int height, int changedX, int changedY, int changedWidth, int changedHeight) { + GPURenderer.changedX = changedX; + GPURenderer.changedY = changedY; + GPURenderer.changedWidth = changedWidth; + GPURenderer.changedHeight = changedHeight; + GPURendererInternal.setPixels(pixels, width, height); + } } diff --git a/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/GPURendererInternal.java b/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/GPURendererInternal.java index 636bdf3..e1a723f 100644 --- a/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/GPURendererInternal.java +++ b/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/GPURendererInternal.java @@ -95,7 +95,7 @@ public class GPURendererInternal extends Kernel { private static final int BLUE = 0; @SuppressWarnings("Convert2Lambda") //Aparapi fails with lambdas - public static void setPixels(byte[] pixels, int width, int height) { + static void setPixels(byte[] pixels, int width, int height) { renderers.forEach(new Consumer() { @Override //IT'S THE LAMBDAS (exception) public void accept(GPURendererInternal r) { diff --git a/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/MCFrameBuffer.java b/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/MCFrameBuffer.java index c8a5d6b..a4c49da 100644 --- a/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/MCFrameBuffer.java +++ b/VirtualComputer/src/main/java/sznp/virtualcomputer/renderer/MCFrameBuffer.java @@ -106,7 +106,7 @@ public class MCFrameBuffer implements IFramebuffer { pointer = new Pointer(ptr[0]); this.width = (int) w[0]; this.height = (int) h[0]; - GPURendererInternal.setPixels(pointer.getByteArray(0L, (int) (w[0] * h[0] * 4)), (int) w[0], (int) h[0]); + GPURenderer.update(pointer.getByteArray(0L, (int) (w[0] * h[0] * 4)), (int) w[0], (int) h[0], 0, 0, this.width, this.height); } else { PluginMain.allpixels = new Pointer(ptr[0]).getByteBuffer(0L, width * height * 4); if (width * height > 640 * 480) @@ -129,7 +129,7 @@ public class MCFrameBuffer implements IFramebuffer { @Override public void notifyUpdate(long x, long y, long width, long height) { Timing t = new Timing(); - GPURendererInternal.setPixels(pointer.getByteArray(0L, (this.width * this.height * 4)), this.width, this.height); //TODO: Only copy changed part + GPURenderer.update(pointer.getByteArray(0L, this.width * this.height * 4), this.width, this.height, (int) x, (int) y, (int) width, (int) height); if (t.elapsedMS() > 60) //Typically 1ms max System.out.println("Update took " + t.elapsedMS() + "ms"); }