138 lines
4.2 KiB
Java
138 lines
4.2 KiB
Java
package electrosphere;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Paths;
|
|
import java.util.Scanner;
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
import org.joml.Vector3i;
|
|
|
|
import electrosphere.render.GLFWContext;
|
|
import electrosphere.render.Mesh;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public class Main {
|
|
|
|
|
|
|
|
|
|
public static void main(String args[]){
|
|
|
|
int dim = 2;
|
|
int i = 0;
|
|
long time = 0;
|
|
long lastTime = 0;
|
|
Scanner scan = new Scanner(System.in);
|
|
|
|
try {
|
|
|
|
GLFWContext.init();
|
|
|
|
//init shader program
|
|
Mesh.initShaderProgram();
|
|
|
|
|
|
FluidSim[][][] simArray = initFluidSim(dim,1,1);
|
|
|
|
Mesh[][][] meshArray = initMeshes(dim,1,1,simArray);
|
|
|
|
|
|
|
|
while(true){
|
|
try {
|
|
TimeUnit.MILLISECONDS.sleep(2);
|
|
} catch (InterruptedException e) {
|
|
e.printStackTrace();
|
|
}
|
|
//
|
|
//Transfer data
|
|
//
|
|
lastTime = System.currentTimeMillis();
|
|
//
|
|
//Simulate
|
|
//
|
|
FluidSim.simChunks(simArray,i,0.001f);
|
|
time = time + (System.currentTimeMillis() - lastTime);
|
|
//
|
|
//Remesh
|
|
//
|
|
for(int x = 0; x < simArray.length; x++){
|
|
for(int y = 0; y < simArray[0].length; y++){
|
|
for(int z = 0; z < simArray[0][0].length; z++){
|
|
meshArray[x][y][z].remesh();
|
|
}
|
|
}
|
|
}
|
|
//redraw
|
|
GLFWContext.redraw(meshArray);
|
|
i++;
|
|
if(i == 1000){
|
|
System.out.println(time / 1000.0);
|
|
}
|
|
if(i > 3){
|
|
// scan.next();
|
|
}
|
|
}
|
|
} catch(Throwable ex){
|
|
ex.printStackTrace(System.err);
|
|
}
|
|
}
|
|
|
|
private static FluidSim[][][] initFluidSim(int dimx, int dimy, int dimz){
|
|
FluidSim[][][] simArray = new FluidSim[dimx][dimy][dimz];
|
|
for(int x = 0; x < simArray.length; x++){
|
|
for(int y = 0; y < simArray[0].length; y++){
|
|
for(int z = 0; z < simArray[0][0].length; z++){
|
|
simArray[x][y][z] = new FluidSim();
|
|
simArray[x][y][z].setup(new Vector3i(x,y,z));
|
|
}
|
|
}
|
|
}
|
|
//set sim adjacencies
|
|
for(int x = 0; x < simArray.length; x++){
|
|
for(int y = 0; y < simArray[0].length; y++){
|
|
for(int z = 0; z < simArray[0][0].length; z++){
|
|
FluidSim current = simArray[x][y][z];
|
|
|
|
for(int i = -1; i < 2; i++){
|
|
for(int j = -1; j < 2; j++){
|
|
for(int k = -1; k < 2; k++){
|
|
if(i == j && j == k && k == 0){
|
|
continue;
|
|
}
|
|
if(
|
|
0 <= x + i && x + i < simArray.length &&
|
|
0 <= y + j && y + j < simArray[0].length &&
|
|
0 <= z + k && z + k < simArray[0][0].length
|
|
){
|
|
current.setNeighbor(i+1,j+1,k+1,simArray[x+i][y+j][z+k]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
return simArray;
|
|
}
|
|
|
|
private static Mesh[][][] initMeshes(int dimx, int dimy, int dimz, FluidSim[][][] simArray){
|
|
Mesh[][][] meshArray = new Mesh[dimx][dimy][dimz];
|
|
for(int x = 0; x < simArray.length; x++){
|
|
for(int y = 0; y < simArray[0].length; y++){
|
|
for(int z = 0; z < simArray[0][0].length; z++){
|
|
meshArray[x][y][z] = new Mesh(simArray[x][y][z], new Vector3i(z * 16, y * 16, x * 16));
|
|
meshArray[x][y][z].meshInitially();
|
|
}
|
|
}
|
|
}
|
|
return meshArray;
|
|
}
|
|
|
|
}
|