diff --git a/src/projectzombie/Main.java b/src/projectzombie/Main.java index 5421139..b2bd1fa 100755 --- a/src/projectzombie/Main.java +++ b/src/projectzombie/Main.java @@ -42,6 +42,7 @@ public class Main public static AudioEngine audio; public static Random rand = new Random(); public static Menu menu; + public static Worker worker; public static boolean game_paused = false; public static int tickrate = 10; @@ -61,7 +62,8 @@ public class Main public static void main(String[] args) throws IOException { - Worker worker = new Worker(); + worker = new Worker(); + worker.start(); // Initialize cheats, settings, and environment Environment.init(args); diff --git a/src/projectzombie/display/lighting/TileLighting.java b/src/projectzombie/display/lighting/TileLighting.java index bd1f29f..45d1c00 100755 --- a/src/projectzombie/display/lighting/TileLighting.java +++ b/src/projectzombie/display/lighting/TileLighting.java @@ -2,12 +2,16 @@ package projectzombie.display.lighting; import static org.lwjgl.opengl.GL11.GL_RGBA; import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE; +import static org.lwjgl.opengl.GL12.GL_TEXTURE_3D; +import static org.lwjgl.opengl.GL12.glTexImage3D; import java.nio.ByteBuffer; import java.util.Arrays; import org.lwjgl.opengl.GL33; +import bdf.types.BdfNamedList; +import bdf.types.BdfObject; import gl_engine.MathHelpers; import gl_engine.range.Range4i; import gl_engine.vec.Vec2i; @@ -56,6 +60,66 @@ public class TileLighting return; } + int size = (Chunk.RENDER_DISTANCE * 2 + 1) * 16; + float[] lights = new float[size * size * 3]; + for(int cx=-Chunk.RENDER_DISTANCE;cx<=Chunk.RENDER_DISTANCE;cx++) { + for(int cy=-Chunk.RENDER_DISTANCE;cy<=Chunk.RENDER_DISTANCE;cy++) + { + Vec2i cpos = new Vec2i( + cx + MathHelpers.floor(player.pos.x / 16), + cy + MathHelpers.floor(player.pos.y / 16)); + + Chunk chunk = layer.chunks.get(cpos); + + for(int x=0;x<16;x++) { + for(int y=0;y<16;y++) + { + Vec2i tpos = new Vec2i(x, y); + int tid = tpos.getId(Chunk.CHUNK_SIZE); + + TileState ft = chunk.getFrontTile(tid); + TileState bt = chunk.getBackTile(tid); + + float transparency = (float)MathHelpers.biggest( + ft.tile.getLightDissipation(ft), + bt.tile.getLightDissipation(bt)); + + float lightSrc = (float)MathHelpers.biggest( + ft.tile.getLightLevel(ft, tpos), + bt.tile.getLightLevel(bt, tpos)); + + float lightSun = ft.tile.passNaturalLight && bt.tile.passNaturalLight ? 1 : 0; + + int id = ((cx * 16 + x + Chunk.RENDER_DISTANCE * 16) + + (cy * 16 + y + Chunk.RENDER_DISTANCE * 16) * size) * 3; + + lights[id+0] = lightSun; + lights[id+1] = lightSrc; + lights[id+2] = transparency; + } + } + } + } + + Main.worker.processLighting(lights, size, size); + } + + public static void updateLighting(BdfObject bdf) + { + BdfNamedList nl = bdf.getNamedList(); + float[] light = nl.get("light").getFloatArray(); + int width = nl.get("w").getInteger(); + int height = nl.get("h").getInteger(); + + float[] pixels = new float[width*height*3]; + + for(int i=0;i