From 5dc4978f48826c99bad36396683975cff45e3841 Mon Sep 17 00:00:00 2001 From: EmaMaker Date: Mon, 8 Aug 2022 23:37:16 +0200 Subject: [PATCH] initial commit working interval trees and stupid meshing --- .gitignore | 13 + .vscode/JME_style.xml | 310 ++++++++++++++++++ .vscode/launch.json | 18 + .vscode/settings.json | 7 + README.txt | 67 ++++ Voxel.zip | Bin 0 -> 69980 bytes bin/main/Interface/empty | 1 + bin/main/MatDefs/empty | 1 + bin/main/Materials/empty | 1 + bin/main/Models/empty | 1 + bin/main/Scenes/empty | 1 + bin/main/Shaders/empty | 1 + bin/main/Sounds/empty | 1 + bin/main/Textures/empty | 1 + .../voxeltest/intervaltrees/Voxel.class | Bin 0 -> 1394 bytes .../intervaltrees/data/Interval.class | Bin 0 -> 1972 bytes .../data/IntervalTree$TreeNode.class | Bin 0 -> 3339 bytes .../intervaltrees/data/IntervalTree.class | Bin 0 -> 7603 bytes .../renderer/ChunkRenderer.class | Bin 0 -> 8033 bytes .../intervaltrees/utils/Config.class | Bin 0 -> 564 bytes .../voxeltest/intervaltrees/utils/Utils.class | Bin 0 -> 721 bytes .../voxeltest/intervaltrees/world/Chunk.class | Bin 0 -> 3941 bytes .../intervaltrees/world/WorldManager.class | Bin 0 -> 2490 bytes .../intervaltrees/world/blocks/Blocks.class | Bin 0 -> 1279 bytes build.gradle | 203 ++++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 234 +++++++++++++ gradlew.bat | 89 +++++ scripts/desktopDeployment/Voxel.bat | 2 + scripts/desktopDeployment/Voxel.command | 5 + scripts/desktopDeployment/Voxel.sh | 3 + settings.gradle | 1 + .../voxeltest/intervaltrees/Voxel.java | 43 +++ .../intervaltrees/data/Interval.java | 63 ++++ .../intervaltrees/data/IntervalTree.java | 243 ++++++++++++++ .../intervaltrees/renderer/ChunkRenderer.java | 192 +++++++++++ .../voxeltest/intervaltrees/utils/Config.java | 12 + .../voxeltest/intervaltrees/utils/Utils.java | 20 ++ .../voxeltest/intervaltrees/world/Chunk.java | 81 +++++ .../intervaltrees/world/WorldManager.java | 42 +++ .../intervaltrees/world/blocks/Blocks.java | 9 + src/main/resources/Interface/empty | 1 + src/main/resources/MatDefs/empty | 1 + src/main/resources/Materials/empty | 1 + src/main/resources/Models/empty | 1 + src/main/resources/Scenes/empty | 1 + src/main/resources/Shaders/empty | 1 + src/main/resources/Sounds/empty | 1 + src/main/resources/Textures/empty | 1 + 50 files changed, 1678 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/JME_style.xml create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 README.txt create mode 100644 Voxel.zip create mode 100644 bin/main/Interface/empty create mode 100644 bin/main/MatDefs/empty create mode 100644 bin/main/Materials/empty create mode 100644 bin/main/Models/empty create mode 100644 bin/main/Scenes/empty create mode 100644 bin/main/Shaders/empty create mode 100644 bin/main/Sounds/empty create mode 100644 bin/main/Textures/empty create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/Voxel.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/data/Interval.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/data/IntervalTree$TreeNode.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/data/IntervalTree.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/renderer/ChunkRenderer.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/utils/Config.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/utils/Utils.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/world/Chunk.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/world/WorldManager.class create mode 100644 bin/main/com/emamaker/voxeltest/intervaltrees/world/blocks/Blocks.class create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 scripts/desktopDeployment/Voxel.bat create mode 100644 scripts/desktopDeployment/Voxel.command create mode 100755 scripts/desktopDeployment/Voxel.sh create mode 100644 settings.gradle create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/Voxel.java create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/data/Interval.java create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/data/IntervalTree.java create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/renderer/ChunkRenderer.java create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/utils/Config.java create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/utils/Utils.java create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/world/Chunk.java create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/world/WorldManager.java create mode 100644 src/main/java/com/emamaker/voxeltest/intervaltrees/world/blocks/Blocks.java create mode 100644 src/main/resources/Interface/empty create mode 100644 src/main/resources/MatDefs/empty create mode 100644 src/main/resources/Materials/empty create mode 100644 src/main/resources/Models/empty create mode 100644 src/main/resources/Scenes/empty create mode 100644 src/main/resources/Shaders/empty create mode 100644 src/main/resources/Sounds/empty create mode 100644 src/main/resources/Textures/empty diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d34efd --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +/.gradle/ +/.nb-gradle/ +/build/ +/private/ +/*.dll +/*.dylib +/*.so + +#Although most of the .idea directory should not be committed there is a legitimate purpose for committing run configurations +/.idea/ +!/.idea/runConfigurations/ + +local.properties diff --git a/.vscode/JME_style.xml b/.vscode/JME_style.xml new file mode 100644 index 0000000..7e54d4f --- /dev/null +++ b/.vscode/JME_style.xml @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..d706c1b --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Launch Voxel", + "request": "launch", + "mainClass": "com.emamaker.voxeltest.intervaltrees.Voxel", + "osx": { + "vmArgs": "-XstartOnFirstThread -ea" + }, + "vmArgs": "-ea" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..274005b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "java.configuration.updateBuildConfiguration": "automatic", + "java.refactor.renameFromFileExplorer": "prompt", + "java.format.settings.url": "./.vscode/JME_style.xml", + "editor.formatOnPaste": true, + "editor.formatOnType": true +} diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..18b1027 --- /dev/null +++ b/README.txt @@ -0,0 +1,67 @@ +# Voxel + +This is the readme for Voxel, try to keep it up to date with any information future-you will wish past-you +remembered to write down + +## Project set up +This is a gradle project using JMonkey Engine and other java libraries + +## How to run (for development) +You'll want a java 11 JDK installed on your machine (Your IDE may do this for you, IntelliJ does) + +Open this application in your preferred IDE (IntelliJ and Eclipse will support Gradle by default, netbeans will support it with a plugin). The remaining instructions are for IntelliJ but the basic principle will be the same for any IDE) + + +### Development in IntelliJ +- Download the latest version of IntelliJ Community (IntelliJ Ultimate is a paid for version the features of which you may consider useful but are not essential for a JMonkey project) +- File > Open > select the top level folder of this project ( i.e. Voxel) > Ok. +- The project will open with your project files on the left had side (IntelliJ may need to "think" for a couple of seconds before they appear) +- IntelliJ may say "No SDK set up" and prompt you to download one, follow its instructions and allow it to download a java 11 JDK. A JDK is used for compiling java applications, a JRE is used for running them. +- You can now add more java source files or assets to the project +- To run the project find Voxel.java (which will be in under src/main/java/com/emamaker/voxeltest/intervaltrees) and right click > Run 'Voxel' + +## How to package the game + +### Distribute without a JRE + +Either: + +In your IDE execute the gradle task distZip (which you'll find under gradle > distributions > distZip) + +Or: + +In the command line open at the root of this project enter the following command: gradlew distZip + +Then you will find a zip in the build/distributions folder. This zip will contain your game, all the libraries to run it and in the bin folder launch files (for windows and linux). + +Note that the distribution does not contain a JRE, so java will need to be installed on the machine of anyone you give this distribution to. Alternatively you may wish to bundle a JRE with your game to remove this requirement. + + +### Distribute with a JRE + +Distributing with a JRE means you'll need to provide an operating specific bundle for each OS you are +targeting (which is a disadvantage) but your end use will not have to have a JRE locally installed +(which is an advantage). + +Either: + +In your IDE execute the gradle task distZip (which you'll find under gradle > distributions > buildAllDistributions) + +Or: + +In the command line open at the root of this project enter the following command: gradlew buildAllDistributions + +Then you will find a series of zip in the build/distributions folder. These zip will contain your game, all the libraries to run it and an +OS specific JRE. (The same files will also be available unzipped in a folder, which may be useful if distributing via steampipe or similar). + + +## Next Steps +You may wish to commit your project to a git repository to keep track of your changes (so you can roll back if anything goes wrong) + +## Adding more libraries +During the JMonkey Initializer you chose from a small subset of the available java libraries. +You can add more by editing the dependencies section in the build.gradle file + +## txt vs md + +This readme is provided as a .txt as that is a common format openable on any machine. However, it would more normally be a .md, this will allow it to be nicely formatted by most git repositories (assuming you commit it to git). Just change the extension from .txt to .md, the syntax is already correct for an md file diff --git a/Voxel.zip b/Voxel.zip new file mode 100644 index 0000000000000000000000000000000000000000..ce3b690235a4f9dc7bb13cc883e89859410c4fce GIT binary patch literal 69980 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Š#X|WEA*p+$e(Vrh@eXQun-M5uh`oUArri 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�D}T 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 U^<1xoC|m>a8cPAha!`BaH-3>c_W%F@ literal 0 HcmV?d00001 diff --git a/bin/main/com/emamaker/voxeltest/intervaltrees/data/Interval.class b/bin/main/com/emamaker/voxeltest/intervaltrees/data/Interval.class new file mode 100644 index 0000000000000000000000000000000000000000..8a941ffe2fe92606c734b52ab9fca2432be86029 GIT binary patch literal 1972 zcmbW1YflqF6o%hvOIz!f)(X^8R1~Xi0oMzPig!CbyQ<}yR>M`!mb6_*sg_xnt~4upD29kY`nlYarY#$*=ECxGRdWTxcJrlxs0c*X ztkpGv=vAv>x!34Rv9v^^^UbwaNu1Xm+>nlINea-jTO24b)HCi)5s16Z zMc1(!s{#YXQgvr-{n42iP77pr56^8{c3nAfoFTPO5}3p}UfJ^kgT-D(X^A5)7`TXO zs;%7EPz|c!NU_qJP?KlkxGWHw80DEWJoBo+WDvV2-422FpLoiE8wSQPA&^*XZaOt} z%i^7t+}_ov*&WrE)|8G%h;G^q^aSq(dM4=$?OJ*!s5eVdg5LYfU+E5q+em(*ZU_hH z+3z9Zh){Tft_+PCemD+dfO?EdYt%i8=9E4vKN5gS5~`m-DGxR3hieo~#2_j3)L@8O zA!^g9>fl2fpZ|hvdE^UnyOn0h>OsN}>=~cOh{l`r=G1-V&&YnDhF=0-PqxcCr|_*G z4xF6ZJvkpZ`3R2c%yXVmAjO&K&b>unv$6|xcPjmsd%~QqxRLEs029mi9x%YwI&+L_4>X4VU<^t>GBELmm7dZQ7 zr`Ewvrn>SKI;AQ6>12$Ylza1S*XRxMoYpT_T95u^+g#dfKKi9lR{kd}(7xlNQ236? sM;Y@g&T_UkrZSh>xWehUJxlF2u79M!?xQm6<@5g%+x`S@dQo$~0r37X*8l(j literal 0 HcmV?d00001 diff --git a/bin/main/com/emamaker/voxeltest/intervaltrees/data/IntervalTree$TreeNode.class b/bin/main/com/emamaker/voxeltest/intervaltrees/data/IntervalTree$TreeNode.class new file mode 100644 index 0000000000000000000000000000000000000000..501cbafaa42c98a9a8d59e91683b7f1a46266a8c GIT binary patch literal 3339 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 PE92k${QEPXz4H7&dH4#d literal 0 HcmV?d00001 diff --git a/bin/main/com/emamaker/voxeltest/intervaltrees/renderer/ChunkRenderer.class b/bin/main/com/emamaker/voxeltest/intervaltrees/renderer/ChunkRenderer.class new file mode 100644 index 0000000000000000000000000000000000000000..e1a6be38b1026afa0acd05412a25c5f6ae728981 GIT binary patch literal 8033 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 literal 0 HcmV?d00001 diff --git a/bin/main/com/emamaker/voxeltest/intervaltrees/world/blocks/Blocks.class b/bin/main/com/emamaker/voxeltest/intervaltrees/world/blocks/Blocks.class new file mode 100644 index 0000000000000000000000000000000000000000..bf382db5ccc1975625e0b9a078743f45c70e7826 GIT binary patch literal 1279 zcmbtTT~pIQ6g^AYq%Dz;ibV>DA1G}>A}Z+E%79p%j-||y(wUA=X;?9kCQg!~y!(T+ zJizG4`0S5zyc-JS#TUp!cF*SCbI-kd^5^f569CV!q@a)Cx#_kw-Zt9C9{03;_Y1cJ z?gyIX1l-#>HYGI6GR|>9iT7)ygKri|S=r ziwtqSzELYP#9mi6>jd9!uIf5Nf4R1`KHXTYZj}iY-(RIfqGZ~ZV+G43IG1lwtu=R> zClF78VOT{P*BRteFC>$zUbLwPp5^QmEBQu}VsEI3Lry>u;HC;ifP?_!DiQ)D1-PXm z30drJt4N`rVX$gByw+*AxK}q?HfKmzUDL1|hGz*J9;P5+n8XDiEuZwzZFD$oUgq*w z=stxU3JUTJLy@iy{D8Mr%wmoqX?UJ-V7i|U7z)weH(I;g42qS=IL?k}9t=vTaN`3* zEt=LFS^n}jCI<0H#X~GGEJmrrSTj8+9bxDYBO%DdLNFSFv3LlwA()UuFsb~aB&mxLy&3CbRBy(+$m&hG zi%I;Zcz8TW+lyu(>BSaMa5Isc;bS^ql3bPYOxOYJ!QviBN zYPeT0Em|Y%-^YVq`Vy59>6tF3n(w5-NwXwWu1n*`n3?-VUrr^RvaxdsNxJ;`9!G&< aM6Fbs6^^0(2K#?rA0CICPpBcmz4#AryDdck literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..9953c1f --- /dev/null +++ b/build.gradle @@ -0,0 +1,203 @@ +plugins { + id 'application' + id 'java' + id "de.undercouch.download" version "5.1.0" + id 'idea' + id "io.github.0ffz.github-packages" version "1.2.1" // Plugin for anonymous inclusion of artifacts hosted in github package registry +} + +description = 'Voxel application' + +java { + sourceCompatibility = '11' + targetCompatibility = '11' +} + +ext.jmonkeyengineVersion = '3.5.2-stable' + +mainClassName = 'com.emamaker.voxeltest.intervaltrees.Voxel' +if (!hasProperty('mainClass')) { + ext.mainClass = mainClassName +} +jar.manifest.attributes('Main-Class': mainClassName) + +repositories { + mavenCentral() + mavenLocal() +} + +dependencies { + // You can read more about how to add dependencies here: + // https://docs.gradle.org/current/userguide/dependency_management.html#sec:how_to_declare_your_dependencies + + implementation 'org.jmonkeyengine:jme3-core:' + jmonkeyengineVersion + runtimeOnly 'org.jmonkeyengine:jme3-jogg:' + jmonkeyengineVersion + runtimeOnly 'org.jmonkeyengine:jme3-plugins:' + jmonkeyengineVersion + + + runtimeOnly 'org.jmonkeyengine:jme3-lwjgl3:' + jmonkeyengineVersion + + +} + +distZip { + //having a degenerate folder within the dist zip complicates generating the other zips + eachFile { file -> + String path = file.relativePath + file.setPath(path.substring(path.indexOf("/") + 1, path.length())) + } + includeEmptyDirs(false) +} + +//See https://api.adoptium.net/v3/assets/feature_releases/11/ga?image_type=jre for jre urls +def windowsJreUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15%2B10/OpenJDK11U-jre_x64_windows_hotspot_11.0.15_10.zip" +def linuxJreUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15%2B10/OpenJDK11U-jre_x64_linux_hotspot_11.0.15_10.tar.gz" +def macJreUrl = "https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.15%2B10/OpenJDK11U-jre_x64_mac_hotspot_11.0.15_10.tar.gz" + + +task downloadWindowsJre(type: Download) { + src windowsJreUrl + dest new File(buildDir, '/jres/windowsJre.zip') + overwrite false +} + +task downloadAndUnzipWindowsJre(dependsOn: downloadWindowsJre, type: Copy) { + from zipTree(downloadWindowsJre.dest) + into "${buildDir}/jres/windowsJre/" + includeEmptyDirs(false) + filesMatching("**") { + it.path = it.path.replaceAll("^[a-zA-Z0-9.+-]*[/\\\\]", "jre/") //rename the top level to something standard so the rest of the script will be easier + } +} + +task buildWindowsDistribution(dependsOn: [distZip, downloadAndUnzipWindowsJre], type: Copy) +{ + group 'distribution' + from files("${projectDir}/scripts/desktopDeployment/Voxel.bat"), zipTree(distZip.archiveFile), "${buildDir}/jres/windowsJre" + into new File(buildDir, 'distributions/Voxel-windows') + includeEmptyDirs false + exclude 'bin/**' //we are adding our own run scripts, exclude the ones coming from distZip +} + +task zipWindowsDistribution( dependsOn:buildWindowsDistribution, type: Zip) { + group 'distribution' + archiveFileName = "Voxel-windows.zip" + destinationDirectory = file("$buildDir/distributions") + from "$buildDir/distributions/Voxel-windows" +} + + +task downloadLinuxJre(type: Download) { + src linuxJreUrl + dest new File(buildDir, '/jres/linuxJre.tar.gz') + overwrite false +} + +task downloadAndUnzipLinuxJre(dependsOn: downloadLinuxJre, type: Copy) { + from tarTree(downloadLinuxJre.dest) + into "${buildDir}/jres/linuxJre/" + includeEmptyDirs(false) + filesMatching("**") { + it.path = it.path.replaceAll("^[a-zA-Z0-9.+-]*[/\\\\]", "jre/") //rename the top level to something standard so the rest of the script will be easier + } +} + +task buildLinuxDistribution(dependsOn: [distZip, downloadAndUnzipLinuxJre], type: Copy) +{ + group 'distribution' + from files("${projectDir}/scripts/desktopDeployment/Voxel.sh"){ + fileMode 0755 + } + from zipTree(distZip.archiveFile) + from "${buildDir}/jres/linuxJre" + into new File(buildDir, 'distributions/Voxel-linux') + includeEmptyDirs false + exclude 'bin/**' //we are adding our own run scripts, exclude the ones coming from distZip +} + +task zipLinuxDistribution( dependsOn:buildLinuxDistribution, type: Zip) { + group 'distribution' + archiveFileName = "Voxel-linux.tar.gz" + destinationDirectory = file("$buildDir/distributions") + from ("$buildDir/distributions/Voxel-linux"){ + include('**.sh') + include('**/java') + fileMode 0755 + } + from ("$buildDir/distributions/Voxel-linux"){ + exclude('**.sh') + exclude('**/java') + } +} + + +task downloadMacJre(type: Download) { + src macJreUrl + dest new File(buildDir, '/jres/macJre.tar.gz') + overwrite false +} + +task downloadAndUnzipMacJre(dependsOn: downloadMacJre, type: Copy) { + from tarTree(downloadMacJre.dest) + into "${buildDir}/jres/macJre/" + includeEmptyDirs(false) + filesMatching("**") { + it.path = it.path.replaceAll("^[a-zA-Z0-9.+-]*[/\\\\]", "jre/") //rename the top level to something standard so the rest of the script will be easier + } +} + +task buildMacDistribution(dependsOn: [distZip, downloadAndUnzipMacJre], type: Copy) +{ + group 'distribution' + from files("${projectDir}/scripts/desktopDeployment/Voxel.command"){ + fileMode 0755 + } + from zipTree(distZip.archiveFile) + from "${buildDir}/jres/macJre" + into new File(buildDir, 'distributions/Voxel-mac') + includeEmptyDirs false + exclude 'bin/**' //we are adding our own run scripts, exclude the ones coming from distZip +} + +task zipMacDistribution( dependsOn:buildMacDistribution, type: Zip) { + group 'distribution' + archiveFileName = "Voxel-mac.tar.gz" + destinationDirectory = file("$buildDir/distributions") + from ("$buildDir/distributions/Voxel-mac"){ + include('**.command') + include('**/java') + fileMode 0755 + } + from ("$buildDir/distributions/Voxel-mac"){ + exclude('**.command') + exclude('**/java') + } +} + +task buildAllDistributions{ + group 'distribution' + dependsOn 'zipWindowsDistribution' + dependsOn 'zipLinuxDistribution' + dependsOn 'zipMacDistribution' +} + +// cleanup tasks +clean.dependsOn('cleanDLLs', 'cleanDyLibs', 'cleanLogs', 'cleanSOs') +task cleanDLLs(type: Delete) { + delete fileTree(dir: '.', include: '*.dll') +} +task cleanDyLibs(type: Delete) { + delete fileTree(dir: '.', include: '*.dylib') +} +task cleanLogs(type: Delete) { + delete fileTree(dir: '.', include: 'hs_err_pid*.log') +} +task cleanSOs(type: Delete) { + delete fileTree(dir: '.', include: '*.so') +} + +task fund(){ + doLast { + java.awt.Desktop.desktop.browse "https://start.jmonkeyengine.org/#!funding=JME_DESKTOP".toURI() + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ffed3a2 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/scripts/desktopDeployment/Voxel.bat b/scripts/desktopDeployment/Voxel.bat new file mode 100644 index 0000000..562a745 --- /dev/null +++ b/scripts/desktopDeployment/Voxel.bat @@ -0,0 +1,2 @@ +"jre/bin/java" -XX:MaxRAMPercentage=60 -classpath "lib/*" com.emamaker.voxeltest.intervaltrees.Voxel +exit 0 diff --git a/scripts/desktopDeployment/Voxel.command b/scripts/desktopDeployment/Voxel.command new file mode 100644 index 0000000..4f9b888 --- /dev/null +++ b/scripts/desktopDeployment/Voxel.command @@ -0,0 +1,5 @@ +#!/bin/bash +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +cd "${DIR}" +./jre/Contents/Home/bin/java -XX:MaxRAMPercentage=60 -XstartOnFirstThread -classpath "lib/*" com.emamaker.voxeltest.intervaltrees.Voxel +exit 0 diff --git a/scripts/desktopDeployment/Voxel.sh b/scripts/desktopDeployment/Voxel.sh new file mode 100755 index 0000000..4d1363c --- /dev/null +++ b/scripts/desktopDeployment/Voxel.sh @@ -0,0 +1,3 @@ +#!/bin/bash +jre/bin/java -XX:MaxRAMPercentage=60 -classpath "lib/*" com.emamaker.voxeltest.intervaltrees.Voxel +exit 0 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..0981916 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'Voxel' diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/Voxel.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/Voxel.java new file mode 100644 index 0000000..bb06cad --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/Voxel.java @@ -0,0 +1,43 @@ +package com.emamaker.voxeltest.intervaltrees; + +import com.emamaker.voxeltest.intervaltrees.world.WorldManager; +import com.jme3.app.SimpleApplication; +import com.jme3.font.BitmapText; +import com.jme3.renderer.RenderManager; +import com.jme3.util.BufferUtils; + +/** + * This is the Main Class of your Game. It should boot up your game and do initial initialisation + * Move your Logic into AppStates or Controls or other java classes + */ +public class Voxel extends SimpleApplication { + + WorldManager worldManager = new WorldManager(this); + + public static void main(String[] args) { + Voxel app = new Voxel(); + app.setShowSettings(false); //Settings dialog not supported on mac + app.start(); + + BufferUtils.setTrackDirectMemoryEnabled(true); + + } + + @Override + public void simpleInitApp() { + getFlyByCamera().setMoveSpeed(20f); + + worldManager.initWorld(); + worldManager.render(); + } + + @Override + public void simpleUpdate(float tpf) { + // System.out.println(this.getCamera().getLocation()); + } + + @Override + public void simpleRender(RenderManager rm) { + //add render code here (if any) + } +} diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/data/Interval.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/data/Interval.java new file mode 100644 index 0000000..660068b --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/data/Interval.java @@ -0,0 +1,63 @@ +package com.emamaker.voxeltest.intervaltrees.data; + +/* When visualizing as a 1D array, high indicates the last index with a valid position (es. if there are 10 values), the interval will be (0,9) */ + +public class Interval { + int low, high; + + public Interval() { + set(0, 0); + } + + + public Interval(int low_, int high_) { + set(low_, high_); + } + + public void set(int low_, int high_) { + this.low = low_; + this.high = high_; + } + + public int getLow(){ + return low; + } + + public int getHigh(){ + return high; + } + public boolean isValid() { + return this.low < this.high; + } + + // return if is contained in another interval + public boolean contains(Interval i) { + return this.low <= i.low && i.high <= this.high; + } + + // if contains another interval + public boolean isContainedBy(Interval i) { + return i.contains(this); + } + + public boolean fullyLeftOf(Interval i) { + return this.high < i.low; + } + + public boolean fullyRightOf(Interval i) { + return this.low > i.high; + } + + public boolean partiallyContainsLeft(Interval i) { + return i.low < this.low && i.high >= this.low && i.high < this.high; + } + + public boolean partiallyContainsRight(Interval i) { + return this.high >= i.low && this.low < i.low && this.high < i.high; + } + + @Override + public String toString() { + return "[" + low + ", " + high + "]"; + } +} \ No newline at end of file diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/data/IntervalTree.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/data/IntervalTree.java new file mode 100644 index 0000000..af06fee --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/data/IntervalTree.java @@ -0,0 +1,243 @@ +package com.emamaker.voxeltest.intervaltrees.data; + +import java.util.ArrayList; +import java.util.Arrays; + +public class IntervalTree { + + TreeNode root = null; + int size = 0; + + public void insertValue(V value, Interval i) { + root = insertNode(root, new TreeNode(i, value, null, null)); + // if (isEmpty()) { + // root = new TreeNode(i, value, null, null); + // size++; + // } else + // insertValue(root, value, i); + } + + public TreeNode getRoot() { + return this.root; + } + + // For what we're doing, when we add new values that (partially) overlap old + // ones, we can't have the old ones laying around, so intervals need to be + // readjusted accordingly + // For a normal interval tree, there's no need no check for partial overrides + // Also, no values can be shared from one node to another (no limits in common, e.g. one node has the high limit that is the same as the low limit of its right child) + public TreeNode insertNode(TreeNode currentNode, TreeNode newNode) { + if (!newNode.interval.isValid()) return null; + if (currentNode == null) + return newNode; + + // System.out.println(currentNode.interval.toString() +", "+ + // newNode.interval.toString()); + + if (newNode.interval.fullyLeftOf(currentNode.interval)) { + currentNode.setLeft(insertNode(currentNode.left, newNode)); + return currentNode; + } else if (newNode.interval.fullyRightOf(currentNode.interval)) { + currentNode.setRight(insertNode(currentNode.right, newNode)); + return currentNode; + } else if (newNode.interval.contains(currentNode.interval)) { + // check is they carry the same value + if (newNode.value.equals(currentNode.value)) { + currentNode.interval = newNode.interval; + } else { + TreeNode newLeftNode = new TreeNode(new Interval(newNode.interval.low, currentNode.interval.low - 1), + newNode.value, currentNode.left, null); + + newNode.setInterval(currentNode.interval.high + 1, newNode.interval.high); + newNode.setRight(currentNode.right); + + // Important! otherwhise already existing nodes will node by replaced + currentNode.value = newNode.value; + + currentNode.setLeft(newLeftNode); + currentNode.setRight(newNode); + } + + constrainIntervals(currentNode, currentNode.interval); + return currentNode; + + } else if (newNode.interval.isContainedBy(currentNode.interval)) { + + if (newNode.value.equals(currentNode.value)) return currentNode; + + if (currentNode.interval.low < newNode.interval.low) + newNode.setLeft(new TreeNode(new Interval(currentNode.interval.low, newNode.interval.low - 1), + currentNode.value, currentNode.left, null)); + else newNode.setLeft(null); + + if (newNode.interval.high < currentNode.interval.high) + newNode.setRight(new TreeNode(new Interval(newNode.interval.high + 1, currentNode.interval.high), + currentNode.value, null, currentNode.right)); + else + newNode.setRight(null); + + return newNode; + + } else if (newNode.interval.partiallyContainsLeft(currentNode.interval)) { + currentNode.setInterval(currentNode.interval.low, newNode.interval.low - 1); + + newNode.setLeft(currentNode); + constrainIntervals(currentNode, currentNode.interval); + + return newNode; + } else if (newNode.interval.partiallyContainsRight(currentNode.interval)) { + currentNode.setInterval(newNode.interval.high + 1, currentNode.interval.high); + + newNode.setRight(currentNode); + constrainIntervals(currentNode, currentNode.interval); + return currentNode; + } + + System.out.println("How did we get here?"); + return null; + } + + // Get the value from n to n+1 + public V getSingleValue(int n) { + return getValues(new Interval(n, n + 1)).get(0); + } + + public ArrayList getValues(Interval interval) { + ArrayList values = new ArrayList<>(); + if (root != null && interval != null) + getValues(interval, root, values); + return values; + } + + private void getValues(Interval interval, TreeNode start, ArrayList results) { + System.out.println(interval.toString() + ", " + start.toString() + ", " + Arrays.toString(results.toArray())); + + if (interval.fullyLeftOf(start.interval) && start.left != null) + getValues(interval, start.left, results); + else if (interval.fullyRightOf(start.interval) && start.right != null) + getValues(interval, start.right, results); + else if (interval.isContainedBy(start.interval)) + results.add(start.value); // base case + else if (interval.contains(start.interval)) { + results.add(start.value); + Interval intLeft = new Interval(interval.low, start.interval.low); + Interval intRight = new Interval(interval.high, start.interval.high); + if (start.left != null && intLeft.isValid()) + getValues(intLeft, start.left, results); + if (start.right != null && intRight.isValid()) + getValues(intRight, start.right, results); + } else if (interval.partiallyContainsLeft(start.interval)) { + results.add(start.value); + Interval newInt = new Interval(start.interval.high, interval.high); + if (start.right != null && newInt.isValid()) + getValues(newInt, start.right, results); + } else if (interval.partiallyContainsRight(start.interval)) { + results.add(start.value); + Interval newInt = new Interval(interval.low, start.interval.low); + if (start.left != null && newInt.isValid()) + getValues(newInt, start.left, results); + } + } + + public TreeNode constrainIntervals(TreeNode start, Interval i) { + if (start == null) + return null; + + start.interval.high = Math.min(start.interval.high, i.high); + start.interval.low = Math.max(start.interval.low, i.low); + + if (!start.interval.isValid()) + return null; + + if (start.left != null) + start.setLeft(constrainIntervals(start.left, new Interval(start.left.interval.low, start.interval.low))); + if (start.right != null) + start.setRight( + constrainIntervals(start.right, new Interval(start.interval.high, start.right.interval.high))); + + return start; + } + + public void print() { + System.out.println("================"); + print(root, 0); + System.out.println("================"); + } + + private void print(TreeNode tree, int level) { + for (int i = 0; i < level; i++) + System.out.print("\t"); + if (level != 0) + System.out.print("|"); + for (int i = 0; i < level * 4; i++) + System.out.print("-"); + + if (tree == null) + System.out.println("NULL"); + else { + System.out.println(tree.interval.toString() + ": " + tree.value); + print(tree.left, level + 1); + print(tree.right, level + 1); + } + } + + boolean isEmpty() { + return size == 0; + } + + public class TreeNode { + + V value; + Interval interval; + TreeNode left, right; + + public TreeNode(Interval interval_, V value_, TreeNode left_, TreeNode right_) { + this.setInterval(interval_); + this.setValue(value_); + this.setLeft(left_); + this.setRight(right_); + } + + public String toString() { + return this.interval.toString() + ": " + this.value.toString(); + } + + public void setInterval(int low_, int high_) { + this.interval.set(low_, high_); + } + + public void setInterval(Interval i) { + this.interval = i; + } + + public Interval getInterval() { + return this.interval; + } + + public void setValue(V value_) { + this.value = value_; + } + + public V getValue() { + return this.value; + } + + public void setLeft(TreeNode left_) { + this.left = left_; + } + + public void setRight(TreeNode right_) { + this.right = right_; + } + + public TreeNode getLeft() { + return this.left; + } + + public TreeNode getRight() { + return this.right; + } + + } + +} diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/renderer/ChunkRenderer.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/renderer/ChunkRenderer.java new file mode 100644 index 0000000..5b603c6 --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/renderer/ChunkRenderer.java @@ -0,0 +1,192 @@ +package com.emamaker.voxeltest.intervaltrees.renderer; + +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Queue; + +import com.emamaker.voxeltest.intervaltrees.data.IntervalTree; +import com.emamaker.voxeltest.intervaltrees.utils.Config; +import com.emamaker.voxeltest.intervaltrees.world.Chunk; +import com.emamaker.voxeltest.intervaltrees.world.WorldManager; +import com.emamaker.voxeltest.intervaltrees.world.blocks.Blocks; +import com.jme3.material.Material; +import com.jme3.math.ColorRGBA; +import com.jme3.math.Vector3f; +import com.jme3.scene.Geometry; +import com.jme3.scene.shape.Box; +import com.jme3.scene.shape.Sphere; + +public class ChunkRenderer { + + // Just render a full cube for every block + public void stupidMeshing(WorldManager mgr, Chunk chunk) { + // Breadth-first visit each node of the tree + chunk.blocks.print(); + + Queue.TreeNode> queue = new ArrayDeque(); + queue.add(chunk.blocks.getRoot()); + + IntervalTree.TreeNode t; + Box b; + Geometry geom; + Material mat; + int[] coords1, coords2; + + while (!queue.isEmpty()) { + t = queue.poll(); + if (t.getLeft() != null) queue.add(t.getLeft()); + if (t.getRight() != null) queue.add(t.getRight()); + + if (!t.getValue().equals(Blocks.AIR)) { + + int start = t.getInterval().getLow(); + for (int i = t.getInterval().getLow(); i <= t.getInterval().getHigh(); i++) { + + if ((i % Config.CHUNK_SIZE == 0 && i != t.getInterval().getLow()) || i == t.getInterval().getHigh()) { + if (i == t.getInterval().getHigh()) i++; + b = new Box((i - start) * 0.5f, 0.5f, 0.5f); + + geom = new Geometry("Box", b); + mat = new Material(mgr.game.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); + mat.getAdditionalRenderState().setWireframe(true); + geom.setMaterial(mat); + + coords1 = Chunk.coord1DTo3D(start); + coords2 = Chunk.coord1DTo3D(i); + + geom.getLocalTransform().setTranslation(coords1[0] + b.xExtent, coords1[1] + b.yExtent, coords1[2] + b.zExtent); + System.out.println(Arrays.toString(coords1) + "-" + Arrays.toString(coords2) + "\t\tBox with extext " + b.xExtent + " (both directions) with center" + + geom.getLocalTransform().getTranslation()); + + chunk.chunkNode.attachChild(geom); + + if (t.getValue() == Blocks.DIRT) { + mat.setColor("Color", ColorRGBA.Brown); + } else if (t.getValue() == Blocks.STONE) { + mat.setColor("Color", ColorRGBA.Gray); + } else if (t.getValue() == Blocks.GRASS) { + mat.setColor("Color", ColorRGBA.Green); + } + + start = i; + } + } + + // System.out.println("Placing a box long " + b.xExtent + " at " + // + Arrays.toString(coords)); + + } + if (!mgr.game.getRootNode().hasChild(chunk.chunkNode)) mgr.game.getRootNode().attachChild(chunk.chunkNode); + } + } + + public void stupidArrayMeshing(WorldManager mgr, Chunk chunk) { + Blocks[] blocks = chunk.treeTo1DArray(); + + int idx; + for (int i = 0; i < Config.CHUNK_SIZE; i++) { + for (int j = 0; j < Config.CHUNK_SIZE; j++) { + + for (int k = 0; k < Config.CHUNK_SIZE; k++) { + idx = Chunk.coord3DTo1D(i, j, k); + if (blocks[idx] != Blocks.AIR) { + Box b = new Box(0.5f, 0.5f, 0.5f); + + Geometry geom = new Geometry("Box", b); + Material mat = new Material(mgr.game.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); + // mat.getAdditionalRenderState().setWireframe(true); + geom.setMaterial(mat); + geom.getLocalTransform().setTranslation(i - 0.5f, j - 0.5f, k - 0.5f); + + chunk.chunkNode.attachChild(geom); + + if (blocks[idx] == Blocks.DIRT) { + mat.setColor("Color", ColorRGBA.Brown); + } else if (blocks[idx] == Blocks.STONE) { + mat.setColor("Color", ColorRGBA.Gray); + } else if (blocks[idx] == Blocks.GRASS) { + mat.setColor("Color", ColorRGBA.Green); + } else { + mat.setColor("Color", ColorRGBA.Red); + } + } + } + } + } + + } + + public void greedyMeshing(WorldManager mgr, Chunk chunk) { + HashMap points = new HashMap<>(); + + // convert tree to array since it is easier to work with it + Blocks[] blocks = chunk.treeTo1DArray(); + System.out.println(Arrays.toString(blocks)); + + Vector3f pos, belowPos; + int idx; + + for (int j = 0; j < 1; j++) { + Blocks prevBlock = null; + + // For now I'm placing little spheres to show vertices instead of + // actually constructing a mesh + // Currently only meshing on XZ plane + + for (int k = 0; k < Config.CHUNK_SIZE; k++) { + + for (int i = 0; i < Config.CHUNK_SIZE; i++) { + idx = Chunk.coord3DTo1D(i, j, k); + pos = new Vector3f(i, j, k); + belowPos = new Vector3f(i, j, k - 1); + + // Got a new type of block, place a vertex + if (blocks[idx] != prevBlock || prevBlock == null) { + // Check if we are at the start, if so just place + // vertices + if (k == 0) { + points.put(pos, new Sphere(25, 25, 0.25f)); + } + + // check if we are at the second step (right after + // start) + // if so, a new vertex needs to be placed whenever a + // quad can be completed + // if a quad cannot be completed but the block has + // changed, also place a vertex 1 lower to complete a + // quad + else if (k == 1) { + points.put(pos, new Sphere(25, 25, 0.25f)); + if (blocks[idx] != blocks[Chunk.coord3DTo1D(i, j, k - 1)]) points.put(belowPos, new Sphere(25, 25, 0.25f)); + } + // in any other situation + else { + if (blocks[idx] == blocks[Chunk.coord3DTo1D(i, j, k - 1)]) { + points.put(pos, new Sphere(25, 25, 0.25f)); + points.remove(belowPos); + System.out.println("should be moving from " + belowPos + " to " + pos); + } else if (blocks[idx] != blocks[Chunk.coord3DTo1D(i, j, k - 1)]) points.put(belowPos, new Sphere(25, 25, 0.25f)); + } + } + prevBlock = blocks[idx]; + } + + } + for (Vector3f v : points.keySet()) { + System.out.println(v); + Geometry geom = new Geometry("Sphere", points.get(v)); + geom.getLocalTransform().setTranslation(v); + + Material mat = new Material(mgr.game.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); + mat.getAdditionalRenderState().setWireframe(true); + geom.setMaterial(mat); + + chunk.chunkNode.attachChild(geom); + } + + points.clear(); + } + + } +} diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/utils/Config.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/utils/Config.java new file mode 100644 index 0000000..4cdef02 --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/utils/Config.java @@ -0,0 +1,12 @@ +package com.emamaker.voxeltest.intervaltrees.utils; + +import com.emamaker.voxeltest.intervaltrees.Voxel; + +public class Config { + public Voxel game; + + public static int CHUNK_SIZE = 4; + // return x + maxX * (y + z * maxY); + public static int CHUNK_3DCOORD_MAX_INDEX = (CHUNK_SIZE-1) + CHUNK_SIZE * ( (CHUNK_SIZE - 1) + (CHUNK_SIZE - 1) * CHUNK_SIZE); + +} diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/utils/Utils.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/utils/Utils.java new file mode 100644 index 0000000..adba5c8 --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/utils/Utils.java @@ -0,0 +1,20 @@ +package com.emamaker.voxeltest.intervaltrees.utils; + +public class Utils { + + // https://stackoverflow.com/questions/20266201/3d-array-1d-flat-indexing + //flatten 3d coords to 1d array cords + public static int coord3DTo1D (int x, int y, int z, int maxX, int maxY, int maxZ){ + return x + maxX * (y + z * maxY); + } + + // To check if this actually works + public static int[] coord1DTo3D(int idx, int maxX, int maxY, int mazZ){ + final int z = idx / (maxX * maxY); + idx -= (z * maxX* maxY); + final int y = idx / maxX; + final int x = idx % maxX; + return new int[]{ x, y, z }; + } + +} diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/world/Chunk.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/world/Chunk.java new file mode 100644 index 0000000..a83be9c --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/world/Chunk.java @@ -0,0 +1,81 @@ +package com.emamaker.voxeltest.intervaltrees.world; + +import java.util.ArrayDeque; +import java.util.Queue; + +import com.emamaker.voxeltest.intervaltrees.data.Interval; +import com.emamaker.voxeltest.intervaltrees.data.IntervalTree; +import com.emamaker.voxeltest.intervaltrees.utils.Config; +import com.emamaker.voxeltest.intervaltrees.utils.Utils; +import com.emamaker.voxeltest.intervaltrees.world.blocks.Blocks; +import com.jme3.material.Material; +import com.jme3.math.Vector3f; +import com.jme3.scene.Geometry; +import com.jme3.scene.Node; + +public class Chunk { + + Vector3f pos; + public IntervalTree blocks = new IntervalTree(); + public Node chunkNode = new Node(); + + public Chunk() { + this(Vector3f.ZERO); + } + + public Chunk(Vector3f pos_) { + // I still have to decided if this is necessary. With an empty tree this + // takes O(1) + blocks.insertValue(Blocks.AIR, new Interval(0, Config.CHUNK_3DCOORD_MAX_INDEX)); + } + + public static int coord3DTo1D(int x, int y, int z) { + return Utils.coord3DTo1D(x, y, z, Config.CHUNK_SIZE, Config.CHUNK_SIZE, Config.CHUNK_SIZE); + } + + public static int[] coord1DTo3D(int idx) { + return Utils.coord1DTo3D(idx, Config.CHUNK_SIZE, Config.CHUNK_SIZE, Config.CHUNK_SIZE); + } + + public Blocks getBlock(int x, int y, int z) { + return blocks.getSingleValue(Chunk.coord3DTo1D(x, y, z)); + } + + public void generatePlane() { + // blocks.print(); + // blocks.insertValue(Blocks.STONE, new Interval(0, + // Config.CHUNK_3DCOORD_MAX_INDEX)); + + for (int i = 0; i < Config.CHUNK_SIZE; i++) blocks.insertValue(Blocks.STONE, new Interval(coord3DTo1D(0, 0, i), coord3DTo1D(Config.CHUNK_SIZE - 1, 0, i))); + for (int i = 0; i < Config.CHUNK_SIZE; i++) blocks.insertValue(Blocks.DIRT, new Interval(coord3DTo1D(0, 1, i), coord3DTo1D(Config.CHUNK_SIZE - 1, 1, i))); + } + + public void generateStair() { + for (int i = 0; i < Config.CHUNK_SIZE; i++) { + for (int j = 0; j < Config.CHUNK_SIZE; j++) { + blocks.insertValue(j < Config.CHUNK_SIZE - i - 1 ? Blocks.STONE : Blocks.GRASS, new Interval(coord3DTo1D(0, i, j), coord3DTo1D(Config.CHUNK_SIZE - 1, i, j))); + } + } + } + + public Blocks[] treeTo1DArray() { + // System.out.println(Config.CHUNK_3DCOORD_MAX_INDEX); + Blocks[] result = new Blocks[Config.CHUNK_3DCOORD_MAX_INDEX + 1]; + + Queue.TreeNode> queue = new ArrayDeque(); + queue.add(blocks.getRoot()); + + IntervalTree.TreeNode t; + int[] coords1, coords2; + + while (!queue.isEmpty()) { + t = queue.poll(); + if (t.getLeft() != null) queue.add(t.getLeft()); + if (t.getRight() != null) queue.add(t.getRight()); + + for (int i = t.getInterval().getLow(); i <= t.getInterval().getHigh(); i++) result[i] = t.getValue(); + } + return result; + } + +} diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/world/WorldManager.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/world/WorldManager.java new file mode 100644 index 0000000..0125a4b --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/world/WorldManager.java @@ -0,0 +1,42 @@ +package com.emamaker.voxeltest.intervaltrees.world; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Queue; + +import com.emamaker.voxeltest.intervaltrees.Voxel; +import com.emamaker.voxeltest.intervaltrees.renderer.ChunkRenderer; +import com.jme3.math.Vector3f; + +public class WorldManager { + + public final Voxel game; + + ChunkRenderer chunkRenderer = new ChunkRenderer(); + + HashMap chunks = new HashMap<>(); + Queue chunkToModel = new ArrayDeque(); + ArrayList chunksToRender = new ArrayList<>(); + + public WorldManager(final Voxel game_) { + this.game = game_; + } + + public void initWorld() { + chunks.put(Vector3f.ZERO, new Chunk()); + chunks.get(Vector3f.ZERO).generateStair(); + + chunkToModel.add(chunks.get(Vector3f.ZERO)); + } + + public void render() { + for (Chunk c : chunkToModel) { + // chunkRenderer.stupidArrayMeshing(this, c); + chunkRenderer.greedyMeshing(this, c); + + game.getRootNode().attachChild(c.chunkNode); + } + } + +} diff --git a/src/main/java/com/emamaker/voxeltest/intervaltrees/world/blocks/Blocks.java b/src/main/java/com/emamaker/voxeltest/intervaltrees/world/blocks/Blocks.java new file mode 100644 index 0000000..c891388 --- /dev/null +++ b/src/main/java/com/emamaker/voxeltest/intervaltrees/world/blocks/Blocks.java @@ -0,0 +1,9 @@ +package com.emamaker.voxeltest.intervaltrees.world.blocks; + +public enum Blocks { + + AIR, + STONE, + DIRT, + GRASS +} diff --git a/src/main/resources/Interface/empty b/src/main/resources/Interface/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/Interface/empty @@ -0,0 +1 @@ + diff --git a/src/main/resources/MatDefs/empty b/src/main/resources/MatDefs/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/MatDefs/empty @@ -0,0 +1 @@ + diff --git a/src/main/resources/Materials/empty b/src/main/resources/Materials/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/Materials/empty @@ -0,0 +1 @@ + diff --git a/src/main/resources/Models/empty b/src/main/resources/Models/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/Models/empty @@ -0,0 +1 @@ + diff --git a/src/main/resources/Scenes/empty b/src/main/resources/Scenes/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/Scenes/empty @@ -0,0 +1 @@ + diff --git a/src/main/resources/Shaders/empty b/src/main/resources/Shaders/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/Shaders/empty @@ -0,0 +1 @@ + diff --git a/src/main/resources/Sounds/empty b/src/main/resources/Sounds/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/Sounds/empty @@ -0,0 +1 @@ + diff --git a/src/main/resources/Textures/empty b/src/main/resources/Textures/empty new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/main/resources/Textures/empty @@ -0,0 +1 @@ +