From 677f97cfbf589503a9befe80b8be2b0d6caa8219 Mon Sep 17 00:00:00 2001 From: Nolan Poe Date: Sun, 25 May 2014 21:09:50 -0700 Subject: [PATCH 1/6] Switched to a faster floating-point voxel traversal by John Amanatides et al, removing "step aliasing" in the process. --- VoxelEngine/src/voxelengine/Renderer.java | 73 +++++++++++-------- .../src/voxelengine/SwingInterface.java | 46 +++++++----- 2 files changed, 69 insertions(+), 50 deletions(-) diff --git a/VoxelEngine/src/voxelengine/Renderer.java b/VoxelEngine/src/voxelengine/Renderer.java index 29c0335..34e9147 100644 --- a/VoxelEngine/src/voxelengine/Renderer.java +++ b/VoxelEngine/src/voxelengine/Renderer.java @@ -311,8 +311,13 @@ public class Renderer { return SkyboxColor.getRGB(); } + int[] mem = new int[0]; + MemoryImageSource fb; + public MemoryImageSource renderG(int width, int height, int pixelScale, int castScale) { - int[] mem = new int[width * height]; + if (mem.length != width * height) { + mem = new int[width * height]; // this is very marginally faster than recreating it every frame + } double yaw = camera.rotY; double pitch = camera.rotX; double[][] ref = new double[][] { { sin(pitch) * cos(yaw), sin(pitch) * sin(yaw), -cos(pitch) }, @@ -325,9 +330,9 @@ public class Renderer { ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); for (int py = 0; py < height - pixelScale; py += pixelScale) { for (int px = 0; px < width - pixelScale; px += pixelScale) { - if (pixelScale == 1) + if (pixelScale == 1) { service.execute(new PixelWorker(mem, new int[] { px + py * width }, px, py, width, height, ref)); - else { + } else { int[] fbIndices = new int[pixelScale * pixelScale]; for (int pys = 0; pys < pixelScale; ++pys) { for (int pxs = 0; pxs < pixelScale; ++pxs) { @@ -340,14 +345,19 @@ public class Renderer { } try { service.shutdown(); - service.awaitTermination(1, TimeUnit.SECONDS); + service.awaitTermination(10, TimeUnit.SECONDS); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } + if (fb == null) { + fb = new MemoryImageSource(width, height, mem, 0, width); + } else { + fb.newPixels(); // this is very marginally faster than recreating it + } // return image source - return new MemoryImageSource(width, height, mem, 0, width); + return fb; } private int raycastG(int px, int py, int width, int height, double[][] ref) { @@ -372,27 +382,35 @@ public class Renderer { double dy = ray[1] * renderDistance * 16; double dz = ray[2] * renderDistance * 16; - double exy, exz, ezy, ax, ay, az, bx, by, bz; + double rayMagnitude = Math.sqrt(dx * dx + dy * dy + dz * dz); + + double ax, ay, az; int sx, sy, sz, n; + double sv = Double.MIN_NORMAL; + sx = (int) Math.signum(dx); sy = (int) Math.signum(dy); sz = (int) Math.signum(dz); - ax = Math.abs(dx); - ay = Math.abs(dy); - az = Math.abs(dz); + ax = Math.abs(dx) / rayMagnitude; + ay = Math.abs(dy) / rayMagnitude; + az = Math.abs(dz) / rayMagnitude; - bx = 2 * ax; - by = 2 * ay; - bz = 2 * az; + ax = ((ax > sv) ? ax : sv); + ay = ((ay > sv) ? ay : sv); + az = ((az > sv) ? az : sv); - exy = ay - ax; - exz = az - ax; - ezy = ay - az; + double tDeltaX = 1 / ax; + double tDeltaY = 1 / ay; + double tDeltaZ = 1 / az; - n = (int) (ax + ay + az); + double tMaxX = Math.abs((sx == 1) ? (1 - (x % 1.0)) : (x % 1.0)) / ax; + double tMaxY = Math.abs((sy == 1) ? (1 - (y % 1.0)) : (y % 1.0)) / ay; + double tMaxZ = Math.abs((sz == 1) ? (1 - (z % 1.0)) : (z % 1.0)) / az; + + n = (int) (Math.abs(dx) + Math.abs(dy) + Math.abs(dz)); while (n-- != 0) { Block block = world.getBlock(x, y, z); @@ -401,26 +419,21 @@ public class Renderer { c = CalculateColor(c, camera.x, x, camera.y, y, camera.z, z); return c.getRGB(); } - - if (exy < 0) { - if (exz < 0) { + if (tMaxX < tMaxY) { + if (tMaxX < tMaxZ) { x += sx; - exy += by; - exz += bz; + tMaxX += tDeltaX; } else { z += sz; - exz -= bx; - ezy += by; + tMaxZ += tDeltaZ; } } else { - if (ezy < 0) { - z += sz; - exz -= bx; - ezy += by; - } else { + if (tMaxY < tMaxZ) { y += sy; - exy -= bx; - ezy -= bz; + tMaxY += tDeltaY; + } else { + z += sz; + tMaxZ += tDeltaZ; } } } diff --git a/VoxelEngine/src/voxelengine/SwingInterface.java b/VoxelEngine/src/voxelengine/SwingInterface.java index fc23fd2..64d2ecc 100644 --- a/VoxelEngine/src/voxelengine/SwingInterface.java +++ b/VoxelEngine/src/voxelengine/SwingInterface.java @@ -48,7 +48,9 @@ public class SwingInterface extends JPanel { set_up(); int frames = 0; long time = System.currentTimeMillis(); - + + long lastFrameNanos = System.nanoTime(); + while (true) { frames++; if (frames == 30) { @@ -58,11 +60,12 @@ public class SwingInterface extends JPanel { frames = 0; time = System.currentTimeMillis(); } - process_input(); - Image img = createImage(renderer.renderF(X_SIZE, Y_SIZE, pixelScale, castScale)); + process_input((System.nanoTime() - lastFrameNanos) / 1000000000.0); + lastFrameNanos = System.nanoTime(); + Image img = createImage(renderer.renderG(X_SIZE, Y_SIZE, pixelScale, castScale)); BufferedImage buffer = new BufferedImage(X_SIZE, Y_SIZE, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = buffer.createGraphics(); - g2.drawImage(img, 0, 0, null); + g2.drawImage(img, 0, 0, null); g2.dispose(); publish(buffer); } @@ -103,41 +106,44 @@ public class SwingInterface extends JPanel { renderer = new Renderer(world, camera); System.out.println("World set up. Now rendering..."); } - - private void process_input() { + + private void process_input(double timestep) { + final int movement_scale = 15; + final int rotation_scale = 15; + if (keyboard.isKeyDown('A')) { - camera.x += Math.cos(camera.rotY - Math.PI / 2); - camera.y += Math.sin(camera.rotY - Math.PI / 2); + camera.x += timestep * movement_scale * Math.cos(camera.rotY - Math.PI / 2); + camera.y += timestep * movement_scale * Math.sin(camera.rotY - Math.PI / 2); } if (keyboard.isKeyDown('D')) { - camera.x += Math.cos(camera.rotY + Math.PI / 2); - camera.y += Math.sin(camera.rotY + Math.PI / 2); + camera.x += timestep * movement_scale * Math.cos(camera.rotY + Math.PI / 2); + camera.y += timestep * movement_scale * Math.sin(camera.rotY + Math.PI / 2); } if (keyboard.isKeyDown('W')) { - camera.x += Math.cos(camera.rotY); - camera.y += Math.sin(camera.rotY); + camera.x += timestep * movement_scale * Math.cos(camera.rotY); + camera.y += timestep * movement_scale * Math.sin(camera.rotY); } if (keyboard.isKeyDown('S')) { - camera.x += Math.cos(camera.rotY + Math.PI); - camera.y += Math.sin(camera.rotY + Math.PI); + camera.x += timestep * movement_scale * Math.cos(camera.rotY + Math.PI); + camera.y += timestep * movement_scale * Math.sin(camera.rotY + Math.PI); } if (keyboard.isKeyDown('Q')) { - camera.z -= 1; + camera.z -= timestep * movement_scale; } if (keyboard.isKeyDown('E')) { - camera.z += 1; + camera.z += timestep * movement_scale; } if (keyboard.isKeyDown('J')) { - camera.rotY -= Math.PI / 32; + camera.rotY -= timestep * rotation_scale * Math.PI / 32; } if (keyboard.isKeyDown('L')) { - camera.rotY += Math.PI / 32; + camera.rotY += timestep * rotation_scale * Math.PI / 32; } if (keyboard.isKeyDown('I')) { - camera.rotX += Math.PI / 32; + camera.rotX += timestep * rotation_scale * Math.PI / 32; } if (keyboard.isKeyDown('K')) { - camera.rotX -= Math.PI / 32; + camera.rotX -= timestep * rotation_scale * Math.PI / 32; } if (keyboard.isKeyDown('T')) { pixelScale++; From 8db126ae4796b30d9ca52e0e3200ef1549b22d36 Mon Sep 17 00:00:00 2001 From: Nolan Poe Date: Sun, 25 May 2014 21:11:58 -0700 Subject: [PATCH 2/6] stop tracking eclipse-generated files and update .gitignore --- .gitignore | 1 + VoxelEngine/bin/.gitignore | 1 - VoxelEngine/bin/java.policy.applet | 7 ------- VoxelEngine/bin/voxelengine/Block.class | Bin 466 -> 0 bytes VoxelEngine/bin/voxelengine/BlockLibrary.class | Bin 1127 -> 0 bytes VoxelEngine/bin/voxelengine/BlockType.class | Bin 943 -> 0 bytes VoxelEngine/bin/voxelengine/Camera.class | Bin 638 -> 0 bytes VoxelEngine/bin/voxelengine/Chunk.class | Bin 2625 -> 0 bytes VoxelEngine/bin/voxelengine/Keyboard.class | Bin 848 -> 0 bytes VoxelEngine/bin/voxelengine/Menu.class | Bin 10995 -> 0 bytes VoxelEngine/bin/voxelengine/Palette.class | Bin 957 -> 0 bytes VoxelEngine/bin/voxelengine/Renderer.class | Bin 9083 -> 0 bytes .../bin/voxelengine/SwingInterface$Worker.class | Bin 6612 -> 0 bytes .../bin/voxelengine/SwingInterface.class | Bin 3138 -> 0 bytes VoxelEngine/bin/voxelengine/World.class | Bin 13056 -> 0 bytes 15 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 VoxelEngine/bin/.gitignore delete mode 100644 VoxelEngine/bin/java.policy.applet delete mode 100644 VoxelEngine/bin/voxelengine/Block.class delete mode 100644 VoxelEngine/bin/voxelengine/BlockLibrary.class delete mode 100644 VoxelEngine/bin/voxelengine/BlockType.class delete mode 100644 VoxelEngine/bin/voxelengine/Camera.class delete mode 100644 VoxelEngine/bin/voxelengine/Chunk.class delete mode 100644 VoxelEngine/bin/voxelengine/Keyboard.class delete mode 100644 VoxelEngine/bin/voxelengine/Menu.class delete mode 100644 VoxelEngine/bin/voxelengine/Palette.class delete mode 100644 VoxelEngine/bin/voxelengine/Renderer.class delete mode 100644 VoxelEngine/bin/voxelengine/SwingInterface$Worker.class delete mode 100644 VoxelEngine/bin/voxelengine/SwingInterface.class delete mode 100644 VoxelEngine/bin/voxelengine/World.class diff --git a/.gitignore b/.gitignore index 8e9e794..f7049a2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.class *.jar +*.policy.applet \ No newline at end of file diff --git a/VoxelEngine/bin/.gitignore b/VoxelEngine/bin/.gitignore deleted file mode 100644 index 3a4e84c..0000000 --- a/VoxelEngine/bin/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/voxelengine diff --git a/VoxelEngine/bin/java.policy.applet b/VoxelEngine/bin/java.policy.applet deleted file mode 100644 index ba9f51d..0000000 --- a/VoxelEngine/bin/java.policy.applet +++ /dev/null @@ -1,7 +0,0 @@ -/* AUTOMATICALLY GENERATED ON Tue Apr 16 17:20:59 EDT 2002*/ -/* DO NOT EDIT */ - -grant { - permission java.security.AllPermission; -}; - diff --git a/VoxelEngine/bin/voxelengine/Block.class b/VoxelEngine/bin/voxelengine/Block.class deleted file mode 100644 index c9af665014d3fe5dc1c092363bbc2da906ee0666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmZ`#%T9w(5IqC56r}W}ZFJ`jY9b4l8W);$MRZ}q9`FXK2nK1Rf2E1W#DyQ=M;V7( zcErV<=b1BS?$7VnH-Hn&bSQ+;rg#>a$dfb|-bGf#_c}Dfa20MsFAMX;yN*^Ot_WK7 z@+b&1zcsPs#wnqDmgZ@7PB?J>!MFj_To$*&go+&tIxK?fxPbwJZJ~oMVc@frtMx-9 z%4Ha3ymIUpahL^Rnbvtz)T+Dmi7;ueVkvqes#+Cc-*MZBMzDEPtjky|(t3$0k3X*O z#v#j5`I87rt%)OrV;w!V24@S-753)*li$$?`fn05U~9|C9yCT8FfruXbc@CaW6pR^ mvJ$gRu-kBY?1_7w`8)cr94M&iy0U0X8fyz^Xb5`}HT?sl{#srD diff --git a/VoxelEngine/bin/voxelengine/BlockLibrary.class b/VoxelEngine/bin/voxelengine/BlockLibrary.class deleted file mode 100644 index 227ed660a07fe4a905d35410314198850971488a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1127 zcmZ{i%TE(g6vn?hZ5caEAC#wv3M$$br7FH#NW?_bSaDH;(cQF6>V=`j>6D0T{|Vi> z(j_KZ5>3>#f0I$aJ2TOe!lHM2&*OK#bME>1`^z@~3s};j2~6y?UfPb`Y{;fvSaw?V z&5EqKmb&6$Ro|*=Sl` z$F&9K4~r>P`iidZZrjBrCJ&TkQ+i7Rk!)^FAbPL0ZX1XoVImGgM@nG$kg^7nNW>wK zF%iRnK&rxqRytcX+g-J44y9x&t-9r`S*}#~&=~ce%eKH|zoKvql%!kh>q;NPvi)(s z^4yvdFlpihrYM~W98Wgry=QvG+%vZ1`K<9HP^{Omy`bJ)FQV$Xve_u+j>uC2&X_oh za}+>=5>U?dOVDwiu0tQdz$~&Ra>xtBh$yp*k!&v`)L`Hu=5<^;upoiYL_v*Uz<$xO zoVFrfF>zH9Ra-087GE=oYbLJa24~ThuQ*q}by+}@te5Fg999z$l0QZys-9Kfd}M8h zuV++S9k*`Zm+F0odbf98?FeSL5D_jr*=j5J)p^r!j8^U`44#9uEc+Klc_B2aK1M@eNWv#=X~? zm{RvH7T*2&F7}9vK(#i;c7O!WB;PKDBLA0>@x@ICWy2OJ05@@qqBK0fZQS9v$lN%h QzYr6-L5;2w4H_2z0!l*lR{#J2 diff --git a/VoxelEngine/bin/voxelengine/BlockType.class b/VoxelEngine/bin/voxelengine/BlockType.class deleted file mode 100644 index 0f26d6d4024895d241404b3b72a973a5e880c4f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 943 zcmZ`$%Wl&^6g}hEO&d&-y6Gc^((+Es!wcAfSWpR6DJqLb**osYxHvX4PANM+2_zyU z7JL97g*Y=wfEu%zduQ%B_nvd-$Ioxy0X)LpIt+o$v+P_ZGL7O?`p=Urd^7y;R@Pw( zv`>Sxz)ylS@?VWlWmpK*3wd5lbIIaBSA+M3e>e#u`9#1>g9$6nyrOx>MINUSYesw` zV1-$dV@@{r*Rq=&jeof%8mbR_rDh5L^e=E+lGyGfm*LWT7$rb z4GSwO+q6-~s>-%)tj)8ojRr0WvFk zp~h!ac+2|&=MxiyFf5vE>ml|Wuoxn+udOR9f0H|9vRg^MQAyq^lXol0H*u>%_D-3+ LUrD~L&E5G0ctD|9 diff --git a/VoxelEngine/bin/voxelengine/Camera.class b/VoxelEngine/bin/voxelengine/Camera.class deleted file mode 100644 index 5306510451807b7b284563d8bd8e2c262509b24f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638 zcmZXS%}(1u6otBM%Al1rN>Ap(WP zi)5B`$I0ZZ`+0a_M^goL&2`N6o9mB4kZ03x9^XAqh@aW)qsKs@@;;rU(?f-*ef;!v zcpMyMKWq(UG&L5mtWa)u2307mXw0D^YE2{bYF%UAt7jTjuU=@>yxP==yxP{#UcJ(& zqoUC0Gt{T6%c0G`Cd091+I}`l#)BkJW&d;-OwZF_3a$SCqj;xK`;uMdBl{th`p8e{ zK!$^D+AMRF^CVqUDe>$`$By*tNVksk>PV-K^y#QLhX(5xxqD>SC9-F3v1IlNv`nYK zs)^?c#3qgkY?wGK@Z7}J0xwNmFR*3eMuD9hmX+|DZ^HqBEd#c!vfTojXki%}d~aa| zyI93O*6V=i#<}5L{d&kC<)q=55aR$5-4;^BKcYg8@V%yS9eMRO0YI} HC3OA)huc+9 diff --git a/VoxelEngine/bin/voxelengine/Chunk.class b/VoxelEngine/bin/voxelengine/Chunk.class deleted file mode 100644 index 3b20f8c0060a9f0cf9a5df8f8f4408d89c92c124..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2625 zcmZ{lTT@e46vzKN=OhQhQMn{|0j#&uKol?_RY9s!tf{E2U|OWso+Jl25R;e-g-)L; z)92PNP<`UX2YU-looQz}Qy)702K@&82(7LC?|sgYD1k{h`|Q2;TL1N1Yw!I2-%mdS z7{rPJpFqoUZpF^n*?A{x_m3}>vr7haf#yYP+3L?&+4=tK$wfO=67Us26A*EMKr)j{ zEfodYXJ=<8YxiH23nKyzqp6IObxLCbTBIi-ppWO$b|VCKneZbZuxFC-u9fd5?ZUK` z%-900lev_YNmvC(zI&5_QROBG4Xq}c5j4;s-GohWM8Bm4heFz3QlYYtDvEYVDH7<4 zykwzfr&sg#NIV|zNf_vO1%xsP;sCm2)Pn*Cc5h#63lS$i!Ao?(1pr5H%E#lddJ#QCGoJ5RTOF7pQiASikYUc$AVhFl6n0oN#afbE*LN|tQ(Z6F02GdU~m6|=ui7TbkPI>~}nSRIiq7@Sy1+4+)_ z%N7mX1iHf^uSveac9m$tJeKEiD(E0&W*)lfY0Y}vX+>%$!r zpGemYd8<&g*+@Z5qg6UenMi{;1E~e8aDi8e&Sn~yEAz5T7Nm&rx?UHNF|Z`CZyRJU zd0Dc%0?|6ab}rozawhV)M@91HD^UOs7;iQ$<0N_3cScR=Mdvf7A{;WG%9RT#`;sHC zub?VjpTv&CyrDGSu|5RlZKp=OuK1My8#yb`#J6rf`^n| z8*e^u&t>RpwY_%(Exq5tbU(kLP5Tj{s*l}DfktaT!W>Iqrn?jE*vmIk#eUE0BCY(K z3-$hhP-mZkdI#cwdNC@YV_xt5FKjthyIw}HC38!rVlFe ztCF;E)QV05IfxcSI2Ys0DDg@>uI4dMvkzxI%?58B3B|{Pbb6X2v~P#;9DebfzrXUk z+xIsb`C%qK^rc!x9H$Ohs0U9GouRr-oY=(R2F|pORxnn<#YvfCR_1s|8`jrxtyt#pB5qt%qB*zK+Vexs3W$b9b@14w1`Y zW_W}d9OX$rhTE*oJ-&a=`7gQt64C>;KUQ%a?=j~Nlod4}ZRZp2 zz1{FH4jLHp!1={s8_5M-a_{2?IZx3}Hr}*UCWh281nx(*sKl1g(-qv>#K&W@2fjhm zQ%uin!1_f2Ohm(a1*2DfZ$C=@P8ioVuVMAgK8?kU87WT_C zblly)iMa|Kd7c!=Xa(6vFV^MRa-qf83_w5IXn^PPB-0&YqNg|-=IAtk=FZ>>Tj(Z6 zu*{h+a87}{q3)IYTL39a YWs5(@Au{!gUH{;MkMx!)(1%a|2NKa6+W-In diff --git a/VoxelEngine/bin/voxelengine/Keyboard.class b/VoxelEngine/bin/voxelengine/Keyboard.class deleted file mode 100644 index 951665e7f365e212243e87ff87d3e8e1259fba04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848 zcmaixOK;Oq5QWdRP2Ac}(uOvLwme#1X^_aGVig370#bzqh(=w&>LwWlmtZ5?P04>^ zgTzBZh#$a@LY(VFX{8de@U>^|%r|F_fB*UM3&1Y!xUdvfM#)DRN<4^SX+4v1H_>U| zg`==^q({0n)bXJ8qI)F0+(k)Yy~yg5yd@)vbJG$=SuU}p3eGzjXA0Jv*9xTvQ5@wD z73{{&A+Pq5zId=v4zLK%h63N562QfRLN%m-=g056l6G`=CFMF2P9qaflTQ9N z;)HtmFWGH{1uE!_KS*C;vk{)x`oxHC8$pUAF3+t{@JM=@N|s6A!v?On*i=}XLkw^g z*Vr?VoQ9ZHi@o<1d}3bFU`>v~VwCazadHyVk;eWGeX?0VH7xZGlH;@|Pb0H^nRUg# zxMxOUi&h!WF7UC8WBi5Yn^yAl89id2o}%3Rj-Xkq{B*ve`k4s}%RDP=2TE|*9PnLZ z6iga$5i5)oR#BhA?lZPb?i5feioK$-KDnGWn$|U3;z>tmh&>K82*3FS)w|!Y?sQIJ zUU5~X_{tfeKLh$R;Pv@H`y6nYz}kO+TiB*f<5-&_j6&Ba+}QoZ&xu!)Raeh|+?g^L NH*m99^;S`T`!8xRipBr{ diff --git a/VoxelEngine/bin/voxelengine/Menu.class b/VoxelEngine/bin/voxelengine/Menu.class deleted file mode 100644 index 679f2f79c0990510e45d371b0347ea7e66eb0cb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10995 zcmdT~3wV^pxqiQYciGMI3kl&S7mcV$0&>5Kwn8KjNFWk~1_j+DKgq&oH|%amVpYTo zUP|kw=s}Bj3*K6<*`TPUYK7Y3jZ)j%daS2b#cHKWsUmvbng6nzK+kjfJm);mIq+n^ znQvy^nR(}%Z@!t`m%e)HSpXA^K|vUT{56R-D`v$TqH$|Xr4?@p!Y}BvGO{KzCeqv- zv(jT`Xc0sY!BAV@njT}VvEnSMOGgv&ifAfr#jRuzA;I8oRm#&=Q?^3b#g0Yd4PzFz z#N(0Lm?b!-K>1@L*=Pq|=G`bU`R(rPI-PLrUOZ-4aa;jKnIYYa?|O zAs2y~RP;h(_RV4}vf9#RQ7cwYn7mfiMYXOHXo|+m2^46Gv}xI#Xtk0=xG<4u67;BR zNhemUV7Wr9AX{0;ib$;$BV3QVL@beHS=hs6riTXB35Bc@8k&iK!lv{mt&|eY(Ke;6 zi=m&=d;@0)dRK6R%x`I`wUUc$lkHQHsEfoFN0L#M zca;8gqXO(x(S2K~HA|%<$+QApYT}zXGl=uL4AY)$2+L^&Nvk;$jiRh{PcsEjnb15`YQIfe!kjfk=+Nv`@z6JwS7Dy^REs;@CIPN~16)l*#ccTJ2}>g%+6s;j=i!~~`OzE)3j z)i;@#sMP;P64ZWi^|zRqgi%5KK+wzcY4~klKZyGT{p{g%t7_r_Wj+2_BGIgd@{oxiDMhG> zW~q(|nzOc0L4RjBY5`{_Bh8J`x|BA;NAY+Nk8#I&6LyPDJb@0nlKNz%)v=QaIViRn zl$U1>BdUCsZ5|71Q&w_~m7HF@lrE$}P?)Xe;&Ze0j_9MQ%1W+CB%3VymE&`I$UVJg zsgq0(csrg6;%UJkZ@@>?Gx02b!jW@DsuL|q<(~Vx+d})A1+^=!y7Y9#^iNIngsIqj z-oy)vy}Y`Z6-g@kl=ejvJC(MVb8_({RYj`l&rKX-H~oc)U#d!`d-%CkUN+H7RVl}- zCSJqqTr8_i9g6-D+{FsyS0?gds?@Jd6u?w#{u>j&RdD`P+FsZnCOebFy6&`LHyZ0-jy+UhpvhD@qxm! z(n{BzGRJQzun$cP$0=cague#yF;~%B3H#(T@rgp}t>|aeQkS;sReYhE{>{V)oT5^n zndpN;mHNAhes<~~Ci>f{FH8)uQ(u}GXs5n1aV+ORdoqF|G=N<1UENBrS{_f+k|K4M zDL(O&KeZ2(?K>x+ea^TJm_Rg)Az8yb!j5R6zErZV>uKlMPEa_Koa4(@(_+Llu50s48i#uz2d~ zs4GuSl#_#UQtpUKRSadya5;s3WoE^U(s^u{rB4@6SE$9Nl*mXPYeb#NgRLQH$3KNR zBe822FAmD7xqaw>EhJ;OmvoR>q++_$io!BV#&N2`V5pyi(seZznG;P6#b7n`$)-$E z!wgrH&z`gB{Mid<)F_B)rkv&utSphV?18D0V)Zd3Bn)1R@ngABWSsgKqO5#YNJ=>w z?&$_ASybJeprl@AnNp?(6pYks0}sg@_E;H-*ITjLmRM~_#ZGxnKG7Bu#)~~?CoOAL zQE4)fN`+)T>o2HFM;fjAB-fLeszaHkK8k}$+d}rVr(;uAOOon3#;|E?VYDGyKZ8j@Ne*1j z7Rj~kCN8@=g4AA4o6;g{=p0B$*T$s@x1JM)DHoenhJ?X&P@Dc~Map6?G%*B&mF*R& zH7^RuB@Cn0zO~CQH8BW-Lvk6-a;mmSR=JYCxsnkgcX$!`=7o&TAZ0hW%EWQ1!8P=5 z6GOr3CI@F_STFa!79A(5lqU%0~LWi6T{e6OpEdgt1bOrMwf_g^ZL= zP=$cgj6#>F*^d<5{)PbQ>!}vXzQb z(rhJ_;(o>R1KFUuE1CA{cDoSMPl zFS}>`EPe5&jpfxThoNQ>lGoU6H7_+Zk&x^m(Gx^CouX->`g&3Uld? zY|WcQt77YPS_3eu@TaX*IwTAv!g{px?P>o}aY2vIf&Pa=;GT`HR(!n6TtgyOzapAy z49RBu`^SwP&s%D+HqmDH_ZM-ZBðoLze)%IA*;mmS_LpjLcQ2s%O;#pm{T4B5`Uzl=8 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 bjaP}lM>vaDkxTgTJhkxTTz<{I4ZQJR@AI1z diff --git a/VoxelEngine/bin/voxelengine/SwingInterface$Worker.class b/VoxelEngine/bin/voxelengine/SwingInterface$Worker.class deleted file mode 100644 index faef5abdece77f9f32121bd4c79648c13f4463a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6612 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 diff --git a/VoxelEngine/bin/voxelengine/SwingInterface.class b/VoxelEngine/bin/voxelengine/SwingInterface.class deleted file mode 100644 index 841f853978535f78b80ee0cc71921431bda9f3de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3138 zcmah~+fx%)9R8Ms1mcPikOE#1MVpHn1raT_wg$CP6iX}uwzW$*#)YtNvg zJol;h&h(+x8fMB&AN$b1q7VH8`r7GCr{CEu$tGrKGRfIJ=X~Gq`(4iO{QmDRzXIsT zXF=2{=vvCJh@3F8x*-zjW!=c83|pAjwTuYDuOK|DEomzWORgl&UD6DZQ_wIcZcgVl zb4Ee?h?n5JJ3pkrXPFrV%_9<@(3b5)YF^6_| z`lX;F3N}TC-A{B}avfE%8BIYPQ_$n(sw|UUrfyD{Aq?UXNyPA;ic}<~a{tfp2 zcq^6|(1d5%3F8=^Q*jN?6Py(cJUfVC%U&UUh?ZTJEA))<2(i4n8^8_`NOG?%AAxKT z*Ij>{j#1jK;s$h{Fe+0J^~fpZc&KQ^Ipw3%vm#@=!sb-uFwYud1k(B~Dyom9T#xfA z7VrX3H`m5>OLq>JKQiTWT8DUwyhZH0>F8ET;i^U@O z*TIJs9N7>Yt*G@<7nJAomWoYK%Upd<6JkeOC+{ym@_28JL~GPjdCP!;z73^RC@D7V zVl}>@q7k7o(@_P7H)N`Gs?_`4fDZnjkV<%|@2|Vfel@V6`3gr$A@!!^IL{0#*W2|x zcUz+?^e|IjdS)g=>HMOZ5odJSrCTf8-a%Oe3e=Rr`cLLG%Mz@wK(TqEhw0>9gAl*G z3HVee`?xbQw9d#}J0p8C$B=9Q9J|nhFww2fS{vWDdfwZ)kN1hQpSKCeX0mp2mx674 z8=@WgX+b*WRvr0!@)KjT1DS|46I>rGN!EJcmXHMCfeyWcsKg#O(WV!yn`3hPREp5 zB*sZR&OLtFuU(_lL`nUfvG^*Iv7Zt94O`-J^!Z{1oW3Fr_#7X?1cG6%$8Lsk53kl< zhrGQ=;F6OH=P^S13l380pqh&qb?x0DnY4E-b`O`Oxx`_g20j`70Zn}tB#)^yC%Tcb@Ggvo&xNzui(`OZCt8Wwbf(eHN5U3DxAMv?R?mS zc@uBB7_alUtIc>JZ{wXBkb!DQo5#u>yjx4z&1z-d7{7=2U5qEjJ=Ip4Jyt%zM76Lk m9@}ao-n4vJ6XH4L#oU+j!ixCF$@0hegrmH$2l@LHb^iejXPrI( diff --git a/VoxelEngine/bin/voxelengine/World.class b/VoxelEngine/bin/voxelengine/World.class deleted file mode 100644 index d61eaf3315667776698e1dee7f47b01040975f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13056 zcmai431C#^wLWL=EO#b1VU}E&$s~#zAeo>DYLI{nOTfsc2}=W18InmdW|9e$2@u?C z6j$7ZA}XK~s@4THp@LhVLKl@TzP7KMZJ&L$?R&57YhM?t)!y34Gb8z-H->>_6$q*1x=cI+ zLeU8W=A_aMt&6NajMF>fsYEuLfNXP-(xEGxOih`c$;7)CB|EcV@zy1q+vC};43wEX z8qcf~Cb+^9IP+o*b%L!F+~l^Bf~=_OrcQ}^-;0KH{PIpDv%Lp8ss9khje+EU=Ug!^2tM)L0DGs7TP%GIe0UW9_TNUJFR!uza6ywGIlZS~%lm%aq`7dYk!GfB>5_GHh zp$PN4IvV5I#E1?IET^jsx|-H984WFohSr)UyLyoe80SA>-0V~eE{ZocS}rO&m8qi9 zI7%3_jvA!3h^eqS(Voaag~dReM5eAIjW4FiC?>&Cc2ur0sF_;ev&M5V@1~_qO$aAi z-MQB0!IqsI@s~&m|xG)@?Z8Z#fo?gHJ*=o(^l_kcDWJ`QUlSrUra;%g1JX_>x&k?PR(g z>BVzFT|EztRUUe4Fx`fMj)z`%Uy5~D{sY$rA04J|c<2aI!BDss$FnU4eUrWg)jQW` zRMNl`Fmpo!Gdl5!e3!3j;_jmceMh|J%C;o3aiM(ApzkX`cC;jAhJQ8a2lPXXhxOnC zl8Rps)4v(?W0^(kOt#DOPYwE+dTvOIF>niGa_+!itNY@>IeDK<{K3P*_-ljyL#Y=B zrw~3d=(iRj8^^F*_1P&Y6?xhysiiVflG1{)|1#*m=@0Pfy7Z=8?zklltkn6FLH|R4 zhUv&EDCQ}%QU@k=Vo5}Z-PtCq%av{F>{{o3^N*IR-EUdn1_5B*UHr|qG z%%tHX0O(N2hn6JE7l%3D-~vGoExryOX7(HG<2=#Uw$;%%4O4DRHf8~mK@`*6bSj<6 zEjgVY#?HnZp2N95ox`wns+Wtn*u&AmzwIhld-)C z@EJ@CY$K$%234Dwd9qQbq6|p{>hf98Xqsp=!QhE9yK6yhb@dXR%g}M2bi@pE$ zbVz8c3|=iX@4VTy3$Iok{6(zS&4_g}-PJiqEmYM$u&$M5Y>m!9f8Rzdwwbm>D&4LN z>@lVR*cA+pT9Hg+zpXPehv)0EmZ)_{31cktyg--g&s&#CZ*0G!E7OsJ0RjV;>9Qhu zu?=6}l}>hI4Rq_=1<9#ob4zwvj?BOrzFe1Gr>`}IE$m9m3D<%Qw_J~Cb;eU|qTY=l zEz!CB1Y=gCrf>5V3 zRyVI&r{|~RZ8|>z>N1_NxM6b{U!WFneiFpxIzJ8Mkkxyb7kbfy+y*#%GwJSl%5w0t zpss|vs9Ad%>(u#q%!~t27V90qDAn~64hW+_#OjmFNx-w1U&gx1ugEGmjKey`%`9J~ zbD!X<>|vIu%?%$wYDzwI>--wbSqBtMuE(y24nMAy;Tg1MBC6?bjX>qj$i?(kY z{B`~pln)l+C2FNDEE{DV_R*XCuEB>zM|Wa2$1@Rfe@*E>4#uHs1>!-rlK^j-zPmx!t2+d+NPkWV4k40alGh)$b z^j$hjdzDJ9=0r3nX&3dk}>_yirR9ZZ(WSZ$bNaYw_Q3uK-i=r*-akA-* z?jHDQkH#hV{-DRf#rS^vB`BcLWPDz%)bvBCJhTidf~u!O*%*|)fJ~~Qv2+Rc+tn1N zl@y@{v{RsE(RUq1>1@b2-!h2Kp(%KRY05!N(=qB?xXMAZa7>$umPT_Rc^Xe}6Mc%?f=|iCo6@w~>oC&YZLgHP7 zQo5KX!hcopoS4yMO_wucCZbZO%$TX7AsI7MMMDglX_tx{&X8!hAa{z2h8xn$R5U!8 zqgX{l$4n+Iqvf`dD{LcoU|b%g6_ttOop5~Ey|vO8s}Sd#zCKzxWW!kS5+dtF=)5!! zI982V&mWdQMLFGza=I6(V2JKTDi~4~MJgDQL1R@gbjS;+V0aMLn&u^{lgt zG!F$hNfqFEBkTNfrHEB_c{xS$l$cKLzfIAr5 zqS+WE?)E~zA{0sEkPCgPqaM1gQnQb>7<2CPs#FzF$2FNP?xGRmnudVE0{S(l5M@;n z%iWG8itmS6Qrdfqox6bP6(xeFlIz88psQBt>7^}NrQS=MOdTAC>A|PFmzuOnZ!fJ< zM6c;}K0ymrmw~oom{sh43JY(AfP?97DOrm$a<`bywJ0WhyVmwmvX{n!!K3@6A>1UT{g!;UkQZHA-4-Xi1Ll z#XN#ICfyIIg8E^)MZ5lUFby=r~3${OJfx zM=m_?L!hjDN3=>feTIrhOq>dzdBm9#t6|T@&PL_hmC9wsy9a*I<7U&1#s~=|hzo{$ zEbdqZ214X;+UH47Iyi?U$g@m8B=uwoL-AXpHXJv=ycM$3>jCcF zin!fISK$gTgZ8zc^&oP0(p_{P-A%jTTI&lSo@M0fO;ld`fN=)rkmXo<#P9 z212`j5aswmWR1Y=5ka{(4pOE*dTT#r7Yo$wjRiMGOEknbTC&#Fv4h6Mg56OKXuPtQ zj9Bnms~rnouSJCz3*Hzl@lR8&o1^{)i*}2@LG?yGkZ|c_e`6orTIs}!?At^BSn!Uh zf4(L0e9)#T+Fd!?_*n3s+(RfTO61GL));|Zf8*|fRf4qAm@^dGtFZSa6qt)1LTNsX zUB)BW!EVF0XggfF1B?8lST=V8&mO~G`EdaME&$SQl+PX%=aX~`t|;$BVQ!;dQ1{U@ z^c95qVTAfYg!(xZYHN`h47G#ap?eV;IZQl{WVj#Y8UW`5plOgh4I`yoB}m2Olem0F z1s=+9vHmGt#-U?mjB)%!)!svxNi9Q;E{rL{h@-Ntd8EqFD)SMjn3-SPPdjE5XqA2m zl<8NG0j)CBOIu@RNIe!hD#yAHdFr)rL2bP=9H^~#g$rw|#wnVR@aHP1tqS*&8H+{2 z<^A+{WL!V(sS5XuWf1ylZ`if{G4h#X&Aieh@r{uflQB|p`ipSpP~5)fm#97B6<-Sy&oIDmywyTz&)=bP<`0V_TyCX zHEb(iL*^gE=HLyytauZZ@)mOV4bQeMpC``u;T?f0C@%2lRc-Z*AJVv!J2BMMH$jkYBmJ>ZiIE!NYLpxq#XopENpFo zEw3Ym*C09HKr0LzO@$;8l|WaK?=#Bx;OvbY(yWgG^b}%a@4+!!)9l^-v$%wm|2_0J z{t*R&18|3bbT;gck$;kc4!PF1QV<((r&@1}Li&1iOKb6#^qA%sVEynz-BIQ5@fKgs z-v+#4?F9_m-wwInx8*KHpF|*9p-siV)(YoT{A+Efa81R()`kQ0?#OAruconfC(+zA zQTjGqgnM^+tzZjZi=fCNd8SHsh@Y%YZ9vLnhRIH8xiH6M7g{5?Ek7J)%9*)2&O}Pd z9FR!wqa|CZT|fqFv-lpsS`uPetfHSjnBkPK@6K?`*WR)N^x+KMszbdj>})+iKWZ%t zyYc;#R;kMo#2molf2e$|jZKp&3` z&F_YVCXkytkP8i7N7y3g+9JnDz_qEiz~77%_=jNv$K(W#u>~^yj(%?mbi50Jr$NW# zVJ}iNJp(&P!AieY8R(^7hrMP1S?g@vk`5O%&j@Ojg}rnb)WTs@Q>z@;OTD0u8%7N~ zDvPYZ1tn0X1SVWt6&(qn#l1ME#L8n4!0vzc(;p*I0ny?f+*k`qKy)WSw8+$V5BwNk zp4~J#4$eDvkK%SwU(^EK*|TnSr&YVHU16^UZMzQpd454ggx;Q^;l^8dW_3 zHUnrxN3MN;K_vedYtdf;9Df7!{2g%m55)Kw4mH>KOWif?Gef-@jLI8-RUB z72E~^t?wzgErhKvD!4UqApfd@+i|e_eg(H-Sie=lZ4rF1S;1|Tx+$sPwiq>T!EK3x z+XnI-CsVWV))c(OhunsZ9R{QVxr*gP#5IAqvnY5f#^IQYS6^02s}qs9;SdU>26ZyS ziTa!2E*rD$aS|LZYp&^~Kv^OE4Vi_k{|5+Rr}P$}H|%Vl;q0Ztu+w751B0T4-8mL_ z^9*d}3&ZYVEJ9PcT_)-7lyrC3;zlK+BZ+5trM&)$`2w**`b=nltiqWr684S(F&G;Y z21je!?uh6DT-JTuDy(V5CT@w0>pl;nxDp3Cq~y&Uh!E9haKOi%LJ^bDUvU*mICGFlf-hjPhy$OZ`~QbMkt z97wL0krWo-J&#lnSnI*1*8rd#@81bOFaXUu8JVOXrxH!m@&o<=&PY?SaB3!m;LW2A zVb=jcWuq`&d27YSGffu@mZJ<>4d%&XuavO?}G&cH*%6!#iCgI_<%l8tER^`T25f z>+M-jAy|3Gbc^I6nB9Po5MM$bz7%1cO{ei(D&=|jF;_KB<@t0zFQ5f@zJf2O6}*tv z@FHs9#ni-00J#hCi;*kwdbbw8`KUuyFQe_e9Q(OidWFA0{k)1kiUc&`^6;I}? z`Ep*1*L87~F6xxY$-#6%%f6dL%f2Z<%f2Z<%f2Z<%epB*!T_A*lqo+l@#5P9JJzY& z1Dz(}QdoAeUflSVD=_uqlv}PK)T)sQ6!=tr0rx58u~*$1jMhS?;*GVPsmm}$KBg*mRj|_#}9i47COgn`tP?)H#+D2u>4?;THT>F-Z}= zhEC^JKxYcj*+#RuotB~fMbMf!Luu}$F7Cq5n69Clc_W~+8$ZU`47j|OzRTCqZ}Ilk z%{SnM`%NmDdaStQlBqP8Or^PGD$ONRX)c*cbIDYSU4bN%hf7ond7!JwK~Qw;D_c0E zlBt*yDw%xPL(fyml!w*&0+nipT4&FtyaC*i=h=&;I>X>Y-ZshIri;tua_SfrI^>}8 zPaKMv3$eJUUAXfO>>R+WeIys02idIWV0Vbe?dM28pN{*^A@Us|K65{pjwEjk@udA+ zK9YQMh$rvob4HS{5AoFfeBKChh$};U;eM_fK@Z*%;*0k4B_qi`JYBtqP*gw*);0PPu#B^lyY#ZsX8W1}&&g*dGk$~6Dj(HPc;xKlAK z573qX-98#mHpCl*2i*aBH9-4EW7-tr%@)%y0`$uO{bV$z>q2~k#WWD0mjm?pXiPVS z_)8X3zyA{d#L-xKLVTOB_>%$pUVwfx8qe(^zS9!Z3vB}QqtTe|4)Iot30i*~p!Y^& zx-Y~JSWJHo&~5&6N8@=Y#E)1!$NWicG>+{d-eGYZ4bUG?Vf)SyKW;JYQ%dg}P13Fq z?-3?{cYt0G(2mh~o(l0^#WNEsq)0=5Nh$2sm1I54X`7SWtRs9N$Xk z@NHDhTd>OBPMv%Q-Nkp(9=;2pcQ<{9@1ak4D-H0y_({}#d?9`lvYH(leTcv6H(sYV>owGKUA;4SS6#g; zcu!ruJ9uqfy(idRSFZ=JudDaFgE!;T6TAbTdhkYkdV?GB=>y2%D=&CUT|d9j$NN_f ziGKC}6^+rBAh((tvN1PgWAZ`SYMwmlK1p`J-)F1625N^m4!uL1fZ`!eLh}%}K|bIG z(m+DDA2js)K?H-}D;y_@{aQ}!dL=fi#BNezuTx@gQex37V$m&P(Jx}bAYyMiS?ql| zu{}!c?Mm$3O6+|~>_bW{dPOX{MJ)P7EEq)WLnn(pm=n8QiQTEh?owi(QeyWhvFH`C z=oYc)7qMUvvHJ$a4&}0XBh9_En)hM%_Z95=p5X*Pi{Iir=Rm>?<(Q*zFvsNAyVlZ& zTTq9(?y8g*m6IeJiu?HWx9HhEeygI7-}y2w?}vyl+HWaO@8cu82RAenri0-R@NmZWE}|KJq)Tl*`4pLoMMtX|hm{cVKD$CV$J;?*dh`DApl^ j)x{vcrbJsedYlu@{B3nn%lzKwi+KHWM7%F^^9TP2{k!Mw From 55096e165cf853190c2529de6e8f4dd6c81cb681 Mon Sep 17 00:00:00 2001 From: Nolan Poe Date: Sun, 25 May 2014 21:15:08 -0700 Subject: [PATCH 3/6] check in accidentally removed /bin/.gitignore --- VoxelEngine/bin/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 VoxelEngine/bin/.gitignore diff --git a/VoxelEngine/bin/.gitignore b/VoxelEngine/bin/.gitignore new file mode 100644 index 0000000..3a4e84c --- /dev/null +++ b/VoxelEngine/bin/.gitignore @@ -0,0 +1 @@ +/voxelengine From 526376c3431662d5673924d9bbd849ce78821218 Mon Sep 17 00:00:00 2001 From: Nolan Poe Date: Sun, 25 May 2014 21:52:37 -0700 Subject: [PATCH 4/6] use diffuse lighting (headlight-style) instead of lighting based on distance alone --- VoxelEngine/src/voxelengine/Renderer.java | 46 +++++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/VoxelEngine/src/voxelengine/Renderer.java b/VoxelEngine/src/voxelengine/Renderer.java index 34e9147..76a87f9 100644 --- a/VoxelEngine/src/voxelengine/Renderer.java +++ b/VoxelEngine/src/voxelengine/Renderer.java @@ -9,8 +9,9 @@ import java.util.concurrent.*; public class Renderer { private World world; private Color SkyboxColor = Color.BLACK; - private double falloff = 8.0; - private double rate = 0.85; + private double falloff = 4.0; + private double rate = 0.6; + private double ambientIntensity = 0.2; private int renderDistance = 8; public Camera camera; @@ -412,26 +413,32 @@ public class Renderer { n = (int) (Math.abs(dx) + Math.abs(dy) + Math.abs(dz)); + int face = -1; + while (n-- != 0) { Block block = world.getBlock(x, y, z); if (block != null) { Color c = block.getType().getColor(); - c = CalculateColor(c, camera.x, x, camera.y, y, camera.z, z); + c = CalculateColor(c, camera.x, x, camera.y, y, camera.z, z, face); return c.getRGB(); } if (tMaxX < tMaxY) { if (tMaxX < tMaxZ) { + face = 0; x += sx; tMaxX += tDeltaX; } else { + face = 2; z += sz; tMaxZ += tDeltaZ; } } else { if (tMaxY < tMaxZ) { + face = 1; y += sy; tMaxY += tDeltaY; } else { + face = 2; z += sz; tMaxZ += tDeltaZ; } @@ -457,6 +464,39 @@ public class Renderer { return new Color(red, green, blue); } + private Color CalculateColor(Color c, double x1, double x2, double y1, double y2, double z1, double z2, int face) { + double ray[] = { x1 - x2, y1 - y2, z1 - z2 }; + double distance = Math.sqrt(ray[0] * ray[0] + ray[1] * ray[1] + ray[2] * ray[2]); + ray[0] /= distance; + ray[1] /= distance; + ray[2] /= distance; + double dot = 0; + switch (face) { + case 0: + dot = Math.abs(ray[0]); + break; + case 1: + dot = Math.abs(ray[1]); + break; + case 2: + dot = Math.abs(ray[2]); + break; + } + double diffuseIntensity = Math.max(falloff / Math.pow(distance, rate), 1.0) * dot; + double lightIntensity = ambientIntensity + (1 - ambientIntensity) * diffuseIntensity; + + // calculate color components + int red = (int) (c.getRed() * lightIntensity); + red = (red > 255) ? 255 : red; + int green = (int) (c.getGreen() * lightIntensity); + green = (green > 255) ? 255 : green; + int blue = (int) (c.getBlue() * lightIntensity); + blue = (blue > 255) ? 255 : blue; + + // return calculated color + return new Color(red, green, blue); + } + private class PixelWorker implements Runnable { private int[] framebuffer; From ff7ef8d87f71eac5b8ac8b409a9ba1beebb1a454 Mon Sep 17 00:00:00 2001 From: Nolan Poe Date: Mon, 26 May 2014 14:10:38 -0700 Subject: [PATCH 5/6] Draw shadows when the P key is held --- VoxelEngine/src/voxelengine/Renderer.java | 93 +++++++++++++++---- .../src/voxelengine/SwingInterface.java | 13 ++- 2 files changed, 88 insertions(+), 18 deletions(-) diff --git a/VoxelEngine/src/voxelengine/Renderer.java b/VoxelEngine/src/voxelengine/Renderer.java index 76a87f9..4376bc0 100644 --- a/VoxelEngine/src/voxelengine/Renderer.java +++ b/VoxelEngine/src/voxelengine/Renderer.java @@ -12,6 +12,7 @@ public class Renderer { private double falloff = 4.0; private double rate = 0.6; private double ambientIntensity = 0.2; + private double directionalIntensity = 0.3; private int renderDistance = 8; public Camera camera; @@ -315,7 +316,7 @@ public class Renderer { int[] mem = new int[0]; MemoryImageSource fb; - public MemoryImageSource renderG(int width, int height, int pixelScale, int castScale) { + public MemoryImageSource renderG(int width, int height, int pixelScale, int castScale, boolean doShadows) { if (mem.length != width * height) { mem = new int[width * height]; // this is very marginally faster than recreating it every frame } @@ -332,7 +333,8 @@ public class Renderer { for (int py = 0; py < height - pixelScale; py += pixelScale) { for (int px = 0; px < width - pixelScale; px += pixelScale) { if (pixelScale == 1) { - service.execute(new PixelWorker(mem, new int[] { px + py * width }, px, py, width, height, ref)); + service.execute(new PixelWorker(mem, new int[] { px + py * width }, px, py, width, height, ref, + doShadows)); } else { int[] fbIndices = new int[pixelScale * pixelScale]; for (int pys = 0; pys < pixelScale; ++pys) { @@ -340,7 +342,7 @@ public class Renderer { fbIndices[pys * pixelScale + pxs] = px + pxs + (py + pys) * width; } } - service.execute(new PixelWorker(mem, fbIndices, px, py, width, height, ref)); + service.execute(new PixelWorker(mem, fbIndices, px, py, width, height, ref, doShadows)); } } } @@ -361,7 +363,7 @@ public class Renderer { return fb; } - private int raycastG(int px, int py, int width, int height, double[][] ref) { + private RayCastCollision raycastGScreenCoords(int px, int py, int width, int height, double[][] ref) { double w2 = width / 2.0; double h2 = height / 2.0; @@ -379,6 +381,15 @@ public class Renderer { ray[0] * ref[0][1] + ray[1] * ref[1][1] + ray[2] * ref[2][1], ray[0] * ref[0][2] + ray[1] * ref[1][2] + ray[2] * ref[2][2], }; + return raycastG(x, y, z, ray); + } + + private RayCastCollision raycastG(double x, double y, double z, double[] ray) { + + double startX = x; + double startY = y; + double startZ = z; + double dx = ray[0] * renderDistance * 16; double dy = ray[1] * renderDistance * 16; double dz = ray[2] * renderDistance * 16; @@ -416,12 +427,6 @@ public class Renderer { int face = -1; while (n-- != 0) { - Block block = world.getBlock(x, y, z); - if (block != null) { - Color c = block.getType().getColor(); - c = CalculateColor(c, camera.x, x, camera.y, y, camera.z, z, face); - return c.getRGB(); - } if (tMaxX < tMaxY) { if (tMaxX < tMaxZ) { face = 0; @@ -443,9 +448,26 @@ public class Renderer { tMaxZ += tDeltaZ; } } + Block block = world.getBlock(x, y, z); + if (block != null) { + double t = 0; + switch (face) { + case 0: + t = tMaxX - tDeltaX - 0.01; + break; + case 1: + t = tMaxY - tDeltaY - 0.01; + break; + case 2: + t = tMaxZ - tDeltaZ - 0.01; + break; + } + return new RayCastCollision(block, face, t * dx / rayMagnitude + startX, + t * dy / rayMagnitude + startY, t * dz / rayMagnitude + startZ); + } } - return SkyboxColor.getRGB(); + return null; } private Color CalculateColor(Color c, double x1, double x2, double y1, double y2, double z1, double z2) { @@ -464,7 +486,8 @@ public class Renderer { return new Color(red, green, blue); } - private Color CalculateColor(Color c, double x1, double x2, double y1, double y2, double z1, double z2, int face) { + private Color CalculateColor(Color c, double x1, double x2, double y1, double y2, double z1, double z2, int face, + double directionalDot) { double ray[] = { x1 - x2, y1 - y2, z1 - z2 }; double distance = Math.sqrt(ray[0] * ray[0] + ray[1] * ray[1] + ray[2] * ray[2]); ray[0] /= distance; @@ -483,7 +506,9 @@ public class Renderer { break; } double diffuseIntensity = Math.max(falloff / Math.pow(distance, rate), 1.0) * dot; - double lightIntensity = ambientIntensity + (1 - ambientIntensity) * diffuseIntensity; + double lightIntensity = ambientIntensity + (1 - ambientIntensity - directionalIntensity) * diffuseIntensity; + + lightIntensity += directionalIntensity * directionalDot; // calculate color components int red = (int) (c.getRed() * lightIntensity); @@ -506,8 +531,10 @@ public class Renderer { private int width; private int height; private double[][] ref; + private boolean doShadows; - public PixelWorker(int[] framebuffer, int[] fbIndices, int px, int py, int width, int height, double[][] ref) { + public PixelWorker(int[] framebuffer, int[] fbIndices, int px, int py, int width, int height, double[][] ref, + boolean doShadows) { this.framebuffer = framebuffer; this.fbIndices = fbIndices; this.px = px; @@ -515,14 +542,48 @@ public class Renderer { this.width = width; this.height = height; this.ref = ref; + this.doShadows = doShadows; } + double[] lightRay = { renderDistance * 8, renderDistance * 2, renderDistance * 4 }; + @Override public void run() { - int result = Renderer.this.raycastG(px, py, width, height, ref); + RayCastCollision result = Renderer.this.raycastGScreenCoords(px, py, width, height, ref); + Color c; + double lightRayMagnitude = Math.sqrt(lightRay[0] * lightRay[0] + lightRay[1] * lightRay[1] + lightRay[2] + * lightRay[2]); + if (result != null) { + Block block = result.getCollisionBlock(); + double x = result.getX(); + double y = result.getY(); + double z = result.getZ(); + double lightDot = 0; + if (doShadows) { + RayCastCollision lightOcclusion = Renderer.this.raycastG(result.getX(), result.getY(), + result.getZ(), lightRay); + if (lightOcclusion == null) { + switch (result.getFace()) { + case 0: + lightDot = Math.abs(lightRay[0] / lightRayMagnitude); + break; + case 1: + lightDot = Math.abs(lightRay[1] / lightRayMagnitude); + break; + case 2: + lightDot = Math.abs(lightRay[2] / lightRayMagnitude); + break; + } + } + } + c = Renderer.this.CalculateColor(block.getType().getColor(), camera.x, x, camera.y, y, camera.z, z, + result.getFace(), lightDot); + } else { + c = SkyboxColor; + } synchronized (framebuffer) { for (int index : fbIndices) { - framebuffer[index] = result; + framebuffer[index] = c.getRGB(); } } } diff --git a/VoxelEngine/src/voxelengine/SwingInterface.java b/VoxelEngine/src/voxelengine/SwingInterface.java index 64d2ecc..0f76bf5 100644 --- a/VoxelEngine/src/voxelengine/SwingInterface.java +++ b/VoxelEngine/src/voxelengine/SwingInterface.java @@ -24,7 +24,9 @@ public class SwingInterface extends JPanel { private static final int Y_SIZE = 600; private static int pixelScale = 4; private static int castScale = 4; - + + private static boolean doShadows = false; + public SwingInterface() { new Worker().execute(); } @@ -62,7 +64,7 @@ public class SwingInterface extends JPanel { } process_input((System.nanoTime() - lastFrameNanos) / 1000000000.0); lastFrameNanos = System.nanoTime(); - Image img = createImage(renderer.renderG(X_SIZE, Y_SIZE, pixelScale, castScale)); + Image img = createImage(renderer.renderG(X_SIZE, Y_SIZE, pixelScale, castScale, doShadows)); BufferedImage buffer = new BufferedImage(X_SIZE, Y_SIZE, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = buffer.createGraphics(); g2.drawImage(img, 0, 0, null); @@ -157,6 +159,13 @@ public class SwingInterface extends JPanel { if (keyboard.isKeyDown('H')) { castScale--; } + if (keyboard.isKeyDown('P')) { // P is for pretty + doShadows = true; + pixelScale = 1; + } else { + doShadows = false; + pixelScale = 4; + } camera.rotY = camera.rotY % (Math.PI * 2); camera.rotX = Math.max(Math.min(camera.rotX, Math.PI), 0); pixelScale = Math.max(Math.min(pixelScale, 10), 1); From 3ba3e7da5d29600a08d7208bd6009a9487c8b65b Mon Sep 17 00:00:00 2001 From: Nolan Poe Date: Mon, 26 May 2014 14:11:03 -0700 Subject: [PATCH 6/6] check in file omitted in last commit --- .../src/voxelengine/RayCastCollision.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 VoxelEngine/src/voxelengine/RayCastCollision.java diff --git a/VoxelEngine/src/voxelengine/RayCastCollision.java b/VoxelEngine/src/voxelengine/RayCastCollision.java new file mode 100644 index 0000000..2cfb111 --- /dev/null +++ b/VoxelEngine/src/voxelengine/RayCastCollision.java @@ -0,0 +1,57 @@ +package voxelengine; + +public class RayCastCollision { + private Block collisionBlock; + private int face; + + private double x, y, z; + + public RayCastCollision(Block collisionBlock, int face, double x, double y, double z) { + super(); + this.collisionBlock = collisionBlock; + this.face = face; + this.x = x; + this.y = y; + this.z = z; + } + + public Block getCollisionBlock() { + return collisionBlock; + } + + public void setCollisionBlock(Block collisionBlock) { + this.collisionBlock = collisionBlock; + } + + public int getFace() { + return face; + } + + public void setFace(int face) { + this.face = face; + } + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getZ() { + return z; + } + + public void setZ(double z) { + this.z = z; + } +}