From 5353f28acde9467a9d2ecf1367dec29a09bc8654 Mon Sep 17 00:00:00 2001
From: zomseffen <steffen@tom.bi>
Date: Thu, 20 Feb 2025 16:48:20 +0100
Subject: [PATCH] start of second test generator. revealed issue with neighbor
 linkage overwriting

---
 shaders/compiled/frag_rt_quad.spv | Bin 44124 -> 44228 bytes
 shaders/rt_quad.frag              |   2 +-
 src/main.rs                       |   5 +-
 src/scene/empty_volume.rs         |   6 +-
 src/scene/generators.rs           | 113 ++++++++++++++++++++++++++----
 src/scene/oct_tree.rs             |   5 +-
 6 files changed, 112 insertions(+), 19 deletions(-)

diff --git a/shaders/compiled/frag_rt_quad.spv b/shaders/compiled/frag_rt_quad.spv
index 9e46dcc4d26c15e13c8abc5d395d6021b6ab2395..6cb39ac357fec59ae52c44ff2fa0be971b8177d2 100644
GIT binary patch
delta 14418
zcmZ9S34m2)*~brXXNG`rVT54-K{Of-$?R(pL6Q{r-O$Wz9Cbhp7#Kj&vLm^)Xciv(
z$~D&#&4tKp^ApRZEHkrIQZp=DtSq%eH0}HS?mZ8__gpyh{{R2yd7t-r*K_Xj<l}?y
zSwFaa$lx8?vTRT`JZsO!tZLtP>!Vw<>=>?It`oRMuIamf<e>YCsU4j=Jy6TC`OEqS
zdY8@bUzBB83;!NLTQGm#$;*1?FFL7j1xjo7Y_YJTGyfx&#k~W)3ro+x!WZ_g=$YGl
z;<Ek$YuB=uDn6SwM?0~90Z#h7+T>HqUWX6#EnU7~StG_96+4w|_rqnwwQO)h*vxAc
z-df>9D|}cJZ_VCa9Jfv9yWZ2J*0T3i__QY8md$7>UagItbO7?A{(*(P3mVxU*yPrd
z9a3!Arelx8P?z`g&z-xpk6t!L`dGA6E81MN6%}novFoUgd=-{6nk=>KTC|Ai$le5h
zbB1c!%@ux2h2Pf1TeEfWQ~MVzU)a~PxPNKSibkfb*}W}U@x-VR#Y3as()B>I&l%zK
zQ1Qa3&aTI?p3Lg$IlbqE{(+PFSQboQYqp`7G`h3vIjjr%PwQFnrm=2)zBnA~i>399
zCTm+ZyjVGU+@P-FiqR7%jb#O=JsjV}+p>wpQ=`Xiy<L-9%eF73bxu97mhD*4cdGCy
zO}sUm3Log3yP)sHW%Ey+zwGozUx#M97b`m_&YIrjUCU-x_^b-wyNS1CbBYa}9bN9v
zxdXlPj;fFQk;{4qmet4Pn4*15=d=$u)v0A4Y2vL}54^s!dItKJ&pUZh-_oV^+P%eb
zV>)NK-`Sn>7tL#|%@dny*Rs9}pV!3OvQrrOt|6`2isIoho%!ia)>`)Q3O}=nw`S+S
z8@Zh{e}Exuj9x7}x5=-TeY(OwTjA$7_^@)nw`Hq}C0*l2twQ#-u>Yh!_8yC@70cCK
zojYk6jB@JyzSHz*Wk}S9fEN$+pVH9u-q6)KXjQSPYg}GnUw%SAp0(@}aJtAYt?<h$
z{K^Wys=}{n;zP3Q;f{uF-Po{=-F%pRqsh6J-C8^~c85LEbk<fpZm;k=;Qfo4b{1?)
z)|Ra++Q*H{@2+^=Q{nel_yZOGNQFOI;p;2>$!0z;d%9W3o@wGO*|YG*a#^~(af_*C
z8=HJ;*`^AAt-@b#EoP3NaCj@Xz;wihR`{?AA5r03H1U>fWO3&B6LWX!7EIf|Oq+ND
zcu>iYDY?sTUly8o+wc|Z>r0!vGHhaPE=}Wp5zhZ?E3W<EvB)_Zk3eXwV{F+D{^6Bs
zWZhKJ<fypWM{d16Lo3#7+i_g%mekX3=y_Inl9O7s1=CLJ$*s4JtDadgX+p;wTi~AF
z$eAP}XKU)c6`BJRnK%&c$L+EC3O=bp>wM(e&rX=wmQTTT9P*EdKkTs`W^4yPl(;5(
zJeT|^LeWBfT&I`Z`BT&Wp%RaWYnMBpVL!ga?WJAroMO-G6>PwXw89tyd;vTiY@f&T
zHzsv34imDW^?vG;UN)|u30*|#XgeMzBzHX2v|n7}@pfHdYr5;u+o%=fBa1a}o08AL
z)v-{u^nMb&8}9ui_+fDGC&4YfV+422ddCQE=^Z0@H~f@@qZj9Qw@=o7dZHW0dq>o>
zJhQm7d*ZI%8A8>|J45hpxOax&mgg7kJC4gm9?_}ABRY6Dc8}=b_VcQQYriJpLm5hs
z=<v7nm=3PLr*z5lOySlyg={MPwuI~W%?kGrF9T$|VD}IYZv8tFZv1r#*U#g;;h)#)
zr-|oz1h9hVd2mb5^WfS&&x2cfo~L|$!u9t&54$7iabD-gu(Wh|CWMlEo<{}CjR|*h
zHznNqp5>`OXZagDjh(IJd7hd)&x3bk_dE}7Zl34CyWv}`o%;5h2Ia@nf*XG(o5hVF
z--B%3d&hy@^xE7M@@ZLX-S$!NA^2EFn?7zVb?Z}PC-Em@yJ_UwJT&HlIWY2iMR$-w
zR6H5%;bBmBlYAQ452fOKa2KTkt*2c-cd52n9KQDRV_>x<954}g0bG4CNq9moY|VN2
zM)(Ys6c&LOa($X(B?9%s4YV421X>JNk3dVrToGpgtd_=E3OCNJNt|Ulf`$mR9K4Jx
z0-Xw0Gtgn>(4Pi3Q5(^2?>%GGBf&GkG4!4@a%~R%C%~T7*2_I~6r$oM!7=ncyviMV
zip*p?C=F;m?FLyvsV!oh1y;L>QGEygE5T|`#YX(k2K#z7tL1g$rx0G|dWGX$9D&XQ
zM=#C=%cB>c0Y@)96Xn`mxSs>N7){ReQ64cb07nPUcm5Tov9zrCdGP*}HfB&O`>1W8
zb11b(BNu{g#C77`=Sy4#*G1go!smZW{cL=U|7E!K)JHg-w4Z$i!pLN^O9vaf1Wi4%
zz6=~$Uka9o?Fw*=(&b=zB=A*mjKq~-xi)vw)!@8`KQ?$3r9xD^7Hp5TT|+6KmJO@-
z;yUn$2w;*XW1|K)hQ2Xc`bE62fz#3YI-JqUn}+KKL=7=qtHD-OHxNa36Mv$&H-hCc
z1vi7MQ*aBKx=DS5QZDx9wA%SMuzP<E!kLsBy;I4>-lft*<XiB*(r+zTuHWsH!?{gP
z<8!8WV*fUL8l_3vunij5c-GT@W=_TH0XoNl^Bu6$ayyly*WZP!$2svmuv(lG-v_IC
zPMFLcU^QcUEByi3c7~ClG2NDT!gCGo$-5|hu_x<>|ARlz<(3pjaz6wc=wtXsazBEr
z+wk3#a{axd-3!+LywcwT=svhQ{&{u}K*0*$mwpVkLT_2YZSxbjx((b<DUXDH3f6x~
z=?~0)#vgV4AE1=S7Jm@z7B|s*oPPuAWN&Qj=ipPg&LtuFLtrbZN0Pq)+vt|%aO(Fk
zTs`Xj5^P;{6In;87BPMWzCP#AJCg(B*KiG1c!W|OJ$(#Z?djua>iR!QDG&eOfb~zO
z>It~I{_81og~;eBuocpw|1DhI3QtnX_4kqDcVPYJf*m~%l?`xp{hy|k$H@L3>?mk^
zh7z7{K2-jI;Gtr#?TOjhph0xDl9lx{pj-BjU{`uH@F(y&To;y8_h+!0eo^NyVC#6s
zjHCVRImmTv8x0ZYuV5RCKz{?P>ASKF{&%nqXfwHIDb+TyW86*d9CuJO{10%N>_6e>
zIRDYe3t&YZqtc7uH?z&Mm*6I=9`*hOz6(uTB=>Ky@w7#9YH4yNnJb(PFx!_YZI~i^
zg+E7gS$QL+T$}s%Rd8=<+e9hX<}UaTcur}1jZz*l-vFOb+FqxGJO7Pa?|%{8mo{cl
zE9(^5YmY{Jz_Sq-;>DDM;00xR>m7`y9`}+VVC$*ZZ@ti38}lExUL9<#g|fyKS+{{B
z>-s}?VtWfXM#%?oc_cX;93$bwxLljNq#fKt!u9jtCv%0UxFy)dWHNs0B9B||R$zCD
zNt%p}8r&HA#%Sr6POVcM@jI{?|8Pd{IJeO@2#UTG)kc+?qZ8WbQe&;L|J&+stvk`I
zufKK|r%8+icdp%bx8lhBKF&AT=J(rv!;*5pT?yWe-?Ir<_dAxbPlfv(OK?lSUkTm~
z_xqLLlzIKjl@NR*>z6CRE&XyOcsHCOXySgi5_S{tyOrRUez%fxzgr2u3uBQDE7n}l
zkvsm=alf19_M|+tT=_qQt9kiy$Q|O?-}j*F<L5cCzwZUR=e0T9>nPQ1gQ?B#2Omor
z{KqxMp%394I;X==aL@@uJ%E#>W-uqnCmt8jPr;rImM;_hLCT+V`O^MSX}65VegQT{
z@Q1<o@u;8OM&mwt{1QPY4L)$lf5v5S8xu$6Ux8;*=d3dEU&GZdLkpir;dgO`&tqWy
z)MwG%6YzbU&jhj_KrfdLQF%T1aV~rAQj~}7H(<3J%fz1mtHnE+r@+4KgtjNS)a-=V
z5sFUb8Y1x1U;{^XzXL~d+QM%GSX(6U3|K7^_yaf+(Dr+-zj2v>IO6=t`L{uP>4rk!
zP-#5j{24rvDC$=59RCaW{giQhJ_pxN-573CHL)AgeQ$3~$i__~8vi@^5$8X8`#eJQ
zR%1B+1FS82`%kc%Z@qm;eG%--;nwy7mzoWVBhJ6T(b<>4@@aY5+kZpst%kS}ybN~R
z&F0dcm!q%|tSx#hw-HasSHSUp!4Z%<0+EnqIwHA46B)h+jtu?oS02;xAMo}xpl-vS
zXKGRRzjeJ~^XQUmbJ_-R^f+zSqrY`t+IXvh;Jj({Op|N0H!Wa$q0RG69u2mE-Ot+U
zXI)}@3)r(mo9CWf?Dxs(yP@GN{r0eN*qWIM*pLCOXay^JI1dMVZ}*+c2(ViE&ZQkq
z{RWcvJlO)Qwwk?eXSM`yQ9Qh=Bi{;S?esx?Yc%yZUq^z~tQF(f0iH#q;M>3*x>zuy
z;IUw|T}-yNJQ{3W?IW_bL+WBDMCTn#hs)V3(fAl_CZLavO~<DTyeDPcAjZPgx{5Uy
zb>`zhE{S-bF&?gmdT85%jjS!YFaaE0Fx820v-$v+w(#4o;x{Sr!<N?@F~Ig145CAP
zHnjs-Jucs$x-Q>}W>VUtp~>KNbR_O+Z-cAp>q^k3=1TB(+6{i)W8@MH2Jt?&BccW?
zxJKn++X;LZTHF@i4p;Ly(O;Wd_)jVQgYOJK7T;S)z-2ZSJ|*Xm2G65iD1CVzX?zEl
zn&*)?J^t0@-aNHi%Du75y-nD#qqQr(>)>yoi+5w9-dm1janHpE<?lv}Ck#t}rxDzD
z-TqD^xTU|-2tEToBjMff0}`&EKiCL=?S~}%P}hLJ-3SMS%-?MU_YrAsg|DdaRSCC&
zYZGo9f3*?uwBMZY8ML3>k_bBZvkfc6+`Sh*8}2+iI&y8kf7uPZPib?c<WX;T@P4Ju
zQIp3<&(pzv^!y&zfE9JH0jEP_tkgZgYU#&DGvVs-3C{b$YVirqo?x}~BjZ_c<G5fW
z!4JT54H0NBuwn$-8?2TFnhiHl`q}e7aP^3@FIX+&><3nBeDvIS+TR~eqIqT`I>h6?
z3rb^Td64#U7+p;AxW63?o{UZ1(R1;siCt(u*Ba+|d=7{E+k{V+{0R8rEzG~pE<y#j
z(UFvHBTJuC=TIKS<xBg~rQI@ue+X=h;KzV%Y;C#UKMdDL-7PNvAlDq{-^L_S`6J*o
z)8pW3ChG2xo5)8gt!rtb$5Zxl`O<zuX}65nCxVR;eEvz0G}At~PU>bV@8L4Ijft)7
zu{{sGm@<N$40jazOZ$AVn)i}%#e<jZlBdgfAr>b#9?=%T)m)-qE61%LzJN=ct$0o^
z2B-Cwz}3E=)Ej_XS6kFu+LG<wRB;(b#O&^*;&Ql^wZ${Qso>?su9tP>r-4r4QgJps
zo77@JP6ww0at1sdkdMRF>H|Wnp8#7&J<>cAoObV%a5XmEKAW9fHmTEDa5X>Zjj>w^
zx3aeA%BR39>s>h;Wb-O^Wd)^Lbmbgy+Ld$RE}WR#^T2A+l~04MqaI!P3^>j5vv4(5
z!JA$AT*c{pxLUdlE`VEETXf~~;0x+qxe#RYDv|ydz;?+e0+;F+!D{+Och$oGB5>N>
z0-kpFVz^p#_e)^wpcfl2pOm}!qT63VPrH2yTrFK^m%_iyr7h}R22Sf;4p;N2jY+)%
zZe49r@5<`J{whYqrqys2+{)Tw2(JcTRUg7@Kz2#R;qj)b7Q=HL*u@_Fda%PA{A*zA
z#KYUy!Pe1Fn=!AYRJV?gCO3fhZ46sp7gi(a6i;zCf^|~2lAHe<;MtT0ya_B9-%P2$
ze$%nv3Z7BgZlRP%!)w3?l(yR_*LW9*4-dbI;B&0O4Qgebtb9EBTJUnp*azQ&t3}Um
z2dl*ukFDQEGq(0f<PPv5Tr1-Z<#!;8I@>FaYM$nv>>j|Dk<53&u2LUMP40VOwYgyH
zYg0?_7RQ(TC`#j5&WV8EhaAQg0e=8ii-6kH40t4^0p?IfkM0DUw2zy27VE#dSF!U|
z<Lf^mc>vX?Dt{{DW8Fg){&<CNsPN}1{P_xhvE*jrLb)4$5G6e+w!FH1@RC8rgsYDl
zw7OV+^<H^ts5|})$DeY!%i>do2jM;NUM}qs^ygr0j;$S%hwT^ObqRkMoVN2zxEe=v
zzPX`C5TYR+BG|9M+T#7jufaB;9#2`1g4O+8#Ut)9uv$0o*G<q7R*RVH!S~jA-Wa0a
zK++7KfU9|y#Yj8}j|8<xu&2P<BEjE+Z9qK|d>X7C3H}bO)}5CbI_HWJ^ck?j8vOU*
zG{HZ>)jUWe!Dr!-p!TTyN3ga?@K0dltLKs7pCK9|!@q#lVhCM?Y7z9WVCOjM{|&4b
z_5Ti5i~25FwW$9OFjJ6k4)9L|#R%{MSS<p$%GDykOJGMR68INbE$aUptQPg%6>7en
zaM!&IKG-)s@gU~H*@&pYM&z%6&74mi>U<M;5c-a#ulDeL73@L_-`7gt$@p4Ndo=zZ
z@WJS-i}lwH&tHeBM5H&sb~hsZ7aXnXt37<(xGtXX9R$~RGMDwVN2`Ouwi<6(?BNi<
zF47PIYhcGJ0=B@Tahx;l;oAy!VT5m6>1*TG(;jz&q2T(EQ0nKosJ2^HJahe`e7G{z
zJQTYryDEHa!u1=UaKC<-m~ideCER%1SNK~K&T`1Jw<UrBcC7H7621%eDG7HyO-;BB
z?w)YtO;5O=Cd^EDx4%xEl?YbYyX4NEd_=M2>m7MJ>Ikk__FI6};tl4OV72s(>Q?Zh
zh>*VH-5O0j;*12VMVt<>S{i4Y)~pzE!`AsIbnxc7qrqxXw-c<^c$3@sY1<gMxfxfx
z$Fg&-?sD=mXdL(mN^Q=!TpLBUEq{(|*my*OD8%pPCV;14w30RhxPa6nz$EYo%it~!
zc{IEOcur|^p~%BF8Eh<Lx@ab+KX2(qh>xpXKyn>jJaMi7v$yl7uWZ1DB-hVHv~$gl
zG=AQ)Gu+Q}P0&Pa(7494p8oZ(H(l;J$KrSg*eUj1PxN>fH1(L`cY@Vonsx=NIZbhD
zz6<Wh586!7Rjp<_uKNE0=Qf^xa{O+%hH!chSf6(GrOEg)-+STe@$~*au=Uja)NdN4
zFW+cu+l@=j$0~7jbcW}Z!P6gL>;cD6&)9t?w}SiZ{b2pi1Di}c<(_bLd+0ut>+in(
z09gOt(%*%-7hGNcS<b&gWHcLWh4i;F`@q$$;69eeWA(n^{RwKKHtxRHCl=g(V0VV^
zuWWpOuyxdpw|fpyj0y*Uk1n(INIwwnyv3Xz1a?l<;}i0O!Pe6jaSj1{YRQdrDA+hr
n=P<B7hiO<@W_LK)U>eQNMAUpNj`_2UMvegM<MA){Q`r9pFjs)6

delta 14259
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
Wm_AElwpDwx2Sg`t1LAGC%ltp}n{Q|U

diff --git a/shaders/rt_quad.frag b/shaders/rt_quad.frag
index aca2709..848e342 100644
--- a/shaders/rt_quad.frag
+++ b/shaders/rt_quad.frag
@@ -377,7 +377,7 @@ vec3 get_lighting_color(uint volume_start, vec3 starting_pos, vec4 orig_color_sa
     uint light_num = 0;
 
     // initialize color
-    vec3 color_sum = vec3(0.0, 0.0, 0.0);// + (orig_color_sample.xyz * 0.01);
+    vec3 color_sum = vec3(0.0, 0.0, 0.0) + (orig_color_sample.xyz * 0.01);
 
     uint max_iterations = max_num_lights * max_iterations_per_light;
     uint iteration = 0;
diff --git a/src/main.rs b/src/main.rs
index 717dc60..a5923b6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -223,7 +223,8 @@ impl App {
         image::create_texture_image_view(&device, &mut data)?;
         image::create_texture_sampler(&device, &mut data)?;
         
-        generators::generate_test_scene(&mut scene_handler, &mut data)?;
+        let cur_pos = generators::generate_test_scene(&mut scene_handler, &mut data)?;
+        //let cur_pos = generators::generate_test_scene2(&mut scene_handler, &mut data, 1, 1,1, 1)?;
         scene_handler.prepare_data(&instance, &device, &mut data)?;
 
         buffer::create_uniform_buffers(&instance, &device, &mut data)?;
@@ -239,7 +240,7 @@ impl App {
             cam_angle_x: 0.0, cam_angle_y: 0.0, 
             last_pos: LogicalPosition::new(-1 as f32, -1 as f32), 
             view_direction: vertex::Vec3::new(0.0, 0.0, 0.0),
-            cur_pos: cgmath::point3(5.0, 5.0, 10.0),
+            cur_pos: cur_pos,
             scene_handler,
             show_frame_rate: false,
             synchronized: 0
diff --git a/src/scene/empty_volume.rs b/src/scene/empty_volume.rs
index 38b690a..42474c8 100644
--- a/src/scene/empty_volume.rs
+++ b/src/scene/empty_volume.rs
@@ -292,11 +292,11 @@ impl EmptyVolume {
                         for x in 0..x_size+1 {
                             for y in 0..y_size+1 {
                                 for z in 0..z_size+1 {
-                                    //neighbors.set_element(reference.clone(), reference.borrow().position.x + x, reference.borrow().position.y + y, reference.borrow().position.z + z);
+                                    neighbors.set_element(reference.clone(), reference.borrow().position.x + x, reference.borrow().position.y + y, reference.borrow().position.z + z);
                                     // fill only the edges
-                                    if x == 0 || x == x_size || y == 0 || y == y_size || z==0 || z == z_size {
+                                    /*if x == 0 || x == x_size || y == 0 || y == y_size || z==0 || z == z_size {
                                         neighbors.set_element(reference.clone(), reference.borrow().position.x + x, reference.borrow().position.y + y, reference.borrow().position.z + z)
-                                    }
+                                    }*/
                                 }   
                             }
                         }
diff --git a/src/scene/generators.rs b/src/scene/generators.rs
index 55fd6c7..07eb61c 100644
--- a/src/scene/generators.rs
+++ b/src/scene/generators.rs
@@ -8,9 +8,9 @@ use crate::app_data::AppData;
 extern crate rand;
 use rand::Rng;
 
-use anyhow::Result;
+use anyhow::{Ok, Result};
 
-use cgmath::{vec2, vec3, Vector3};
+use cgmath::{vec2, vec3, Vector3, Point3};
 
 use std::cell::RefCell;
 use std::rc::Rc;
@@ -18,9 +18,9 @@ use std::rc::Rc;
 use super::light::{DirectionalLight, PointLight};
 
 
-pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<()> {
+pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<(Point3<f32>)> {
     let mut rng = rand::thread_rng();
-        let grid_size = CHUNK_SIZE as i32;
+    let grid_size = CHUNK_SIZE as i32;
 
     let mut oct_tree1: OctTree<Cube> = OctTree::create(CHUNK_SIZE)?;
     let mut oct_tree2: OctTree<Cube> = OctTree::create(CHUNK_SIZE)?;
@@ -41,7 +41,7 @@ pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<()>
             let shade = (rng.gen_range(0..50) as f32) / 100.0;
             let cube = Cube {
                 pos: vec3(x_index as f32, y_index as f32, 6.0),
-                color: vec3(shade, shade, 0.0),
+                color: vec3(shade, 1.0, shade),
                 tex_coord: vec2(0.0, 0.0),
                 transparent: false,
                 roughness: 255,
@@ -73,7 +73,7 @@ pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<()>
 
     let cube = Cube {
         pos: vec3(10.0, 10.0, 10.0),
-        color: vec3(0.9, 0.9, 0.9),
+        color: vec3(0.9, 0.0, 0.0),
         tex_coord: vec2(0.0, 0.0),
         transparent: true,
         roughness: 32,
@@ -82,19 +82,19 @@ pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<()>
 
     let cube = Cube {
         pos: vec3(10.0, 10.0, 9.0),
-        color: vec3(0.9, 0.9, 0.9),
+        color: vec3(0.9, 0.0, 0.0),
         tex_coord: vec2(0.0, 0.0),
         transparent: true,
         roughness: 32,
     };
     oct_tree2.set_cube(cube.clone());
 
-    scene.point_lights.push(Rc::new(RefCell::new(PointLight { pos: vec3(11.0, 11.0, 11.0), color: vec3(1.0, 1.0, 1.0), memory_start: 0 })));
-    scene.point_lights.push(Rc::new(RefCell::new(PointLight { pos: vec3(9.0, 9.0, 11.0), color: vec3(0.5, 0.5, 0.5), memory_start: 0 })));
+    scene.point_lights.push(Rc::new(RefCell::new(PointLight { pos: vec3(11.0 + grid_size as f32, 11.0 + grid_size as f32, 11.0), color: vec3(1.0, 1.0, 1.0), memory_start: 0 })));
+    scene.point_lights.push(Rc::new(RefCell::new(PointLight { pos: vec3(9.0 + grid_size as f32, 9.0 + grid_size as f32, 11.0), color: vec3(0.5, 0.5, 0.5), memory_start: 0 })));
     scene.directional_lights.push(Rc::new(RefCell::new(DirectionalLight { direction: vec3(1.0, 1.0, -1.0), color: vec3(0.1, 0.1, 0.1), memory_start: 0 })));
 
     let cube = Cuboid {
-        pos: vec3(11.0, 11.0, 11.0),
+        pos: vec3(11.0 + grid_size as f32, 11.0 + grid_size as f32, 11.0),
         color: vec3(1.0, 1.0, 1.0),
         tex_coord: vec2(0.0, 0.0),
         size: Vector3 {x: 0.5, y: 0.5, z: 0.5}
@@ -103,7 +103,7 @@ pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<()>
     cube.draw(&data.topology, index, scene);
 
     let cube = Cuboid {
-        pos: vec3(9.0, 9.0, 11.0),
+        pos: vec3(9.0 + grid_size as f32, 9.0 + grid_size as f32, 11.0),
         color: vec3(1.0, 1.0, 1.0),
         tex_coord: vec2(0.0, 0.0),
         size: Vector3 {x: 0.5, y: 0.5, z: 0.5}
@@ -115,5 +115,94 @@ pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<()>
     let tree_ref_two = Rc::new(RefCell::new(oct_tree2.clone()));
     scene.oct_trees = vec![vec![vec![tree_ref_one.clone(), tree_ref_two.clone()], vec![tree_ref_two.clone(), tree_ref_two.clone()]], vec![vec![tree_ref_one.clone(), tree_ref_two.clone()], vec![tree_ref_two.clone(), tree_ref_two.clone()]]];
 
-    Ok(())
+    Ok((cgmath::point3(5.0, 5.0, 10.0)))
+}
+
+
+pub fn generate_test_scene2(scene: &mut Scene, data: &mut AppData, chunk_num_x: usize, chunk_num_y: usize, chunk_num_z: usize, num_gaussians: usize) -> Result<(Point3<f32>)> {
+    let mut rng = rand::thread_rng();
+    let grid_size = CHUNK_SIZE as i32;
+
+    let max_x = chunk_num_x * grid_size as usize;
+    let max_y = chunk_num_y * grid_size as usize;
+    let max_z = chunk_num_z * grid_size as usize;
+
+    let mut height_map = vec![vec![0.0; max_y]; max_x];
+
+    for i in 0..num_gaussians {
+        let height = rng.gen_range(0..max_z / 2) as f32;
+        let center_x = rng.gen_range(0..max_x) as f32;
+        let center_y = rng.gen_range(0..max_y) as f32;
+
+        let spread_x = rng.gen_range(0..max_x/2) as f32;
+        let spread_y = rng.gen_range(0..max_y/2) as f32;
+
+        for x in 0..max_x {
+            for y in 0..max_y {
+                height_map[x][y] += height * (-((x as f32 - center_x).powf(2.0)/(2.0 * spread_x.powf(2.0)) + (y as f32 - center_y).powf(2.0)/(2.0 * spread_y.powf(2.0)))).exp();
+            }
+        }
+    }
+
+    let oct_trees = vec![vec![vec![Rc::new(RefCell::new(OctTree::<Cube>::create(CHUNK_SIZE)?)); chunk_num_x]; chunk_num_y]; chunk_num_z];
+
+    for x in 0..max_x {
+        for y in 0..max_y {
+            let height = height_map[x][y].floor() as usize;
+            let mut pillar_height;
+            if height < max_z {
+                let shade = (rng.gen_range(0..50) as f32) / 100.0;
+                let cube = Cube {
+                    pos: vec3(x as f32, y as f32, (height % grid_size as usize) as f32),
+                    color: vec3(shade, 1.0, shade),
+                    tex_coord: vec2(0.0, 0.0),
+                    transparent: false,
+                    roughness: 255,
+                };
+
+                oct_trees[((height as f32) / (grid_size as f32)).floor() as usize][((y as f32) / (grid_size as f32)).floor() as usize][((x as f32) / (grid_size as f32)).floor() as usize].borrow_mut().set_cube(cube.clone());
+
+                pillar_height = height;
+            } else {
+                pillar_height = max_z;
+            }
+
+            while pillar_height > 0 {
+                pillar_height -= 1;
+                let shade = (rng.gen_range(1..50) as f32) / 100.0;
+                let cube = Cube {
+                    pos: vec3(x as f32, y as f32, (pillar_height % grid_size as usize) as f32),
+                    color: vec3(shade, shade / 2.0, 0.0),
+                    tex_coord: vec2(0.0, 0.0),
+                    transparent: false,
+                    roughness: 255,
+                };
+
+                //oct_trees[((pillar_height as f32) / (grid_size as f32)).floor() as usize][((y as f32) / (grid_size as f32)).floor() as usize][((x as f32) / (grid_size as f32)).floor() as usize].borrow_mut().set_cube(cube.clone());
+                
+            }
+        }
+    }
+
+    for i in 0..num_gaussians {
+        let height = rng.gen_range(1..8) as f32;
+        let center_x = rng.gen_range(0..max_x) as f32;
+        let center_y = rng.gen_range(0..max_y) as f32;
+        let final_height = height_map[center_x.floor() as usize][center_y.floor() as usize] + height;
+        scene.point_lights.push(Rc::new(RefCell::new(PointLight { pos: vec3(center_x, center_y, final_height), color: vec3(1.0, 1.0, 1.0), memory_start: 0 })));
+
+        let cube = Cuboid {
+            pos: vec3(center_x, center_y, final_height),
+            color: vec3(1.0, 1.0, 1.0),
+            tex_coord: vec2(0.0, 0.0),
+            size: Vector3 {x: 0.5, y: 0.5, z: 0.5}
+        };
+        let index = scene.sized_vertices.len();
+        cube.draw(&data.topology, index, scene);
+    }
+
+    scene.directional_lights.push(Rc::new(RefCell::new(DirectionalLight { direction: vec3(0.0, 0.0, -1.0), color: vec3(0.1, 0.1, 0.1), memory_start: 0 })));
+    scene.oct_trees = oct_trees;
+
+    Ok(cgmath::point3((max_x as f32 / 2.0) as f32, (max_y as f32 / 2.0) as f32, height_map[(max_x as f32 / 2.0).floor() as usize][(max_y as f32 / 2.0).floor() as usize] + 2.0))
 }
\ No newline at end of file
diff --git a/src/scene/oct_tree.rs b/src/scene/oct_tree.rs
index f0e5da6..a156557 100644
--- a/src/scene/oct_tree.rs
+++ b/src/scene/oct_tree.rs
@@ -7,7 +7,7 @@ use crate::primitives::cube::Cube;
 
 extern crate rand;
 
-pub const CHUNK_SIZE_EXPONENT: u32 = 4;
+pub const CHUNK_SIZE_EXPONENT: u32 = 6;
 pub const CHUNK_SIZE: usize = (2 as usize).pow(CHUNK_SIZE_EXPONENT);
 pub const MAX_TREE_DEPTH: usize = CHUNK_SIZE_EXPONENT as usize - 2;
 pub const MIN_CHUNK_SIZE: usize = CHUNK_SIZE / (2 as usize).pow(MAX_TREE_DEPTH as u32);
@@ -191,6 +191,9 @@ impl<T: Clone> OctTree<T> {
             }
         }
         else {
+            if let Some(_) = self.blocks[z * MIN_CHUNK_SIZE * MIN_CHUNK_SIZE + y * MIN_CHUNK_SIZE + x] {
+                println!("overwriting block!")
+            }
             self.blocks[z * MIN_CHUNK_SIZE * MIN_CHUNK_SIZE + y * MIN_CHUNK_SIZE + x] = Some(element);
         }
     }