diff --git a/test/burningship.nas b/test/burningship.nas index 357b131..277396c 100644 --- a/test/burningship.nas +++ b/test/burningship.nas @@ -16,8 +16,8 @@ var ppm = func(filename, width, height, RGB) { io.close(fd); } -var width = 1920; -var height = 1080; +var width = 1920 * 2; +var height = 1080 * 2; var bar = (os.platform()=="windows")? process_bar.bar(front:"sharp", back:"point", sep:"line", length:50): process_bar.high_resolution_bar(50); diff --git a/test/console3D.nas b/test/console3D.nas index f4a2afa..abf4933 100644 --- a/test/console3D.nas +++ b/test/console3D.nas @@ -31,7 +31,8 @@ func() { runtime.gc.extend("vec", 8); }(); -var (max,min,sqrt,sin,cos,abs)=( +# alias +var (max, min, sqrt, sin, cos, abs) = ( math.max, math.min, math.sqrt, @@ -40,12 +41,12 @@ var (max,min,sqrt,sin,cos,abs)=( math.abs ); -var (vec2,vec3)=( +var (vec2, vec3) = ( libmat.vec2.new, libmat.vec3.new ); -var (vec2add,vec2sub,vec2mul,vec2div,vec2len)=( +var (vec2add, vec2sub, vec2mul, vec2div, vec2len) = ( libmat.vec2.add, libmat.vec2.sub, libmat.vec2.mul, @@ -53,7 +54,7 @@ var (vec2add,vec2sub,vec2mul,vec2div,vec2len)=( libmat.vec2.len ); -var (vec3add,vec3sub,vec3mul,vec3div,vec3neg,vec3norm,vec3len,vec3dot)=( +var (vec3add, vec3sub, vec3mul, vec3div, vec3neg, vec3norm, vec3len, vec3dot) = ( libmat.vec3.add, libmat.vec3.sub, libmat.vec3.mul, @@ -64,116 +65,147 @@ var (vec3add,vec3sub,vec3mul,vec3div,vec3neg,vec3norm,vec3len,vec3dot)=( libmat.vec3.dot ); -var (rotateX,rotateY,rotateZ)=( +var (rotateX, rotateY, rotateZ) = ( libmat.vec3.rx, libmat.vec3.ry, libmat.vec3.rz, ); var use_raw = func() { - vec2 = func(x,y) {return [x,y];} - vec2add = func(v1,v2) {return [v1[0]+v2[0],v1[1]+v2[1]];} - vec2sub = func(v1,v2) {return [v1[0]-v2[0],v1[1]-v2[1]];} - vec2mul = func(v1,v2) {return [v1[0]*v2[0],v1[1]*v2[1]];} - vec2div = func(v1,v2) {return [v1[0]/v2[0],v1[1]/v2[1]];} - vec3 = func(x,y,z) {return [x,y,z];} - vec3add = func(v1,v2) {return [v1[0]+v2[0],v1[1]+v2[1],v1[2]+v2[2]];} - vec3sub = func(v1,v2) {return [v1[0]-v2[0],v1[1]-v2[1],v1[2]-v2[2]];} - vec3mul = func(v1,v2) {return [v1[0]*v2[0],v1[1]*v2[1],v1[2]*v2[2]];} - vec3div = func(v1,v2) {return [v1[0]/v2[0],v1[1]/v2[1],v1[2]/v2[2]];} - vec3neg = func(v) {return [-v[0],-v[1],-v[2]];} + vec2 = func(x, y) {return [x,y];} + vec2add = func(v1, v2) {return [v1[0]+v2[0],v1[1]+v2[1]];} + vec2sub = func(v1, v2) {return [v1[0]-v2[0],v1[1]-v2[1]];} + vec2mul = func(v1, v2) {return [v1[0]*v2[0],v1[1]*v2[1]];} + vec2div = func(v1, v2) {return [v1[0]/v2[0],v1[1]/v2[1]];} vec2len = func(v) {var (x,y)=(v[0],v[1]); return sqrt(x*x+y*y);} + + vec3 = func(x, y, z) {return [x,y,z];} + vec3add = func(v1, v2) {return [v1[0]+v2[0],v1[1]+v2[1],v1[2]+v2[2]];} + vec3sub = func(v1, v2) {return [v1[0]-v2[0],v1[1]-v2[1],v1[2]-v2[2]];} + vec3mul = func(v1, v2) {return [v1[0]*v2[0],v1[1]*v2[1],v1[2]*v2[2]];} + vec3div = func(v1, v2) {return [v1[0]/v2[0],v1[1]/v2[1],v1[2]/v2[2]];} + vec3neg = func(v) {return [-v[0],-v[1],-v[2]];} vec3len = func(v) {var (x,y,z)=(v[0],v[1],v[2]); return sqrt(x*x+y*y+z*z);} vec3norm = func(v) {var t=vec3len(v); return vec3div(v,[t,t,t]);} - vec3dot = func(a,b) {return a[0]*b[0]+a[1]*b[1]+a[2]*b[2];} - rotateX = func(a,angle) {return [a[0],a[2]*sin(angle)+a[1]*cos(angle),a[2]*cos(angle)-a[1]*sin(angle)];} - rotateY = func(a,angle) {return [a[0]*cos(angle)-a[2]*sin(angle),a[1],a[0]*sin(angle)+a[2]*cos(angle)];} - rotateZ = func(a,angle) {return [a[0]*cos(angle)-a[1]*sin(angle),a[0]*sin(angle)+a[1]*cos(angle),a[2]];} + vec3dot = func(a, b) { + return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; + } + + rotateX = func(a, angle) { + return [ + a[0], + a[2] * sin(angle) + a[1] * cos(angle), + a[2] * cos(angle) - a[1] * sin(angle) + ]; + } + rotateY = func(a, angle) { + return [ + a[0] * cos(angle) - a[2] * sin(angle), + a[1], + a[0] * sin(angle) + a[2] * cos(angle) + ]; + } + rotateZ = func(a, angle) { + return [ + a[0] * cos(angle) - a[1] * sin(angle), + a[0] * sin(angle) + a[1] * cos(angle), + a[2] + ]; + } } -var clamp = func(value,_min,_max) { - return max(min(value,_max),_min); +var clamp = func(value, _min, _max) { + return max(min(value, _max), _min); } var sign = func(a) { - return (0edge; +var step = func(edge, x) { + return x > edge; } var vec3abs = func(v) { - return [abs(v[0]),abs(v[1]),abs(v[2])]; + return [abs(v[0]), abs(v[1]), abs(v[2])]; } var vec3sign = func(v) { - return [sign(v[0]),sign(v[1]),sign(v[2])]; + return [sign(v[0]), sign(v[1]), sign(v[2])]; } -var vec3step = func(edge,v) { - return [step(edge[0],v[0]),step(edge[1],v[1]),step(edge[2],v[2])]; +var vec3step = func(edge, v) { + return [ + step(edge[0], v[0]), + step(edge[1], v[1]), + step(edge[2], v[2]) + ]; } -var vec3reflect = func(rd,n) { - var d=vec3dot(n,rd); - return vec3sub(rd,vec3mul(n,vec3mul([2,2,2],[d,d,d]))); +var vec3reflect = func(rd, n) { + var d = vec3dot(n, rd); + return vec3sub(rd, vec3mul(n, vec3mul([2, 2, 2], [d, d, d]))); } -var sphere = func(ro,rd,r) { - var b=vec3dot(ro,rd); - var c=vec3dot(ro,ro)-r*r; - var h=b*b-c; - if (h<0.0) return [-1.0,-1.0]; - h=sqrt(h); - return [-b-h,-b+h]; +var sphere = func(ro, rd, r) { + var b = vec3dot(ro, rd); + var c = vec3dot(ro, ro) - r * r; + var h = b * b - c; + if (h < 0.0) + return [-1.0, -1.0]; + h = sqrt(h); + return [-b - h, -b + h]; } -var box = func(ro,rd,boxSize,outNormal) { - var m=vec3div([1.0,1.0,1.0],rd); - var n=vec3mul(m,ro); - var k=vec3mul(vec3abs(m),boxSize); - var t1=vec3sub(vec3neg(n),k); - var t2=vec3add(vec3neg(n),k); - var tN=max(max(t1[0],t1[1]),t1[2]); - var tF=min(min(t2[0],t2[1]),t2[2]); - if (tN>tF or tF<0.0) return [-1.0,-1.0]; - var yzx=[t1[1],t1[2],t1[0]]; - var zxy=[t1[2],t1[0],t1[1]]; - var tmp=vec3mul(vec3mul(vec3neg(vec3sign(rd)), vec3step(yzx,t1)),vec3step(zxy,t1)); - outNormal[0]=tmp[0]; - outNormal[1]=tmp[1]; - outNormal[2]=tmp[2]; +var box = func(ro, rd, boxSize, outNormal) { + var m = vec3div([1.0, 1.0, 1.0], rd); + var n = vec3mul(m, ro); + var k = vec3mul(vec3abs(m), boxSize); + var t1 = vec3sub(vec3neg(n), k); + var t2 = vec3add(vec3neg(n), k); + var tN = max(max(t1[0], t1[1]), t1[2]); + var tF = min(min(t2[0], t2[1]), t2[2]); + if (tN>tF or tF<0.0) + return [-1.0, -1.0]; + var yzx = [t1[1], t1[2], t1[0]]; + var zxy = [t1[2], t1[0], t1[1]]; + var tmp = vec3mul( + vec3mul(vec3neg(vec3sign(rd)), vec3step(yzx, t1)), + vec3step(zxy, t1) + ); + outNormal[0] = tmp[0]; + outNormal[1] = tmp[1]; + outNormal[2] = tmp[2]; return [tN, tF]; } -var plane = func(ro,rd,p,w) { - return -(vec3dot(ro,p)+w)/vec3dot(rd,p); +var plane = func(ro, rd, p, w) { + return -(vec3dot(ro, p) + w) / vec3dot(rd, p); } var main = func(frame) { - var height=15*2; - var width=int(height*1/0.618)*2; + var height = 15*2; + var width = int(height*1/0.618)*2; - var aspect=width/height; - var pixelAspect=11.0/24.0; + var aspect = width/height; + var pixelAspect = 11.0/24.0; - var gradient=split(""," .:!/r(l1Z4H9W8$"); - var gradientSize=size(gradient)-1; + var gradient = split("", " .:!/r(l1Z4H9W8$"); + var gradientSize = size(gradient)-1; - var screen=[]; - setsize(screen,width*height); + var screen = []; + setsize(screen, width*height); - var light=vec3norm([-0.5,0.5,-1.0]); - var spherePos=[0,3,0]; - var vec2_2_2=[2,2]; - var vec2_1_1=[1,1]; - var vec3_000=[0,0,0]; - var vec3_00n1=[0,0,-1]; - var vec3_111=[1,1,1]; + var light = vec3norm([-0.5, 0.5, -1.0]); + var spherePos = [0, 3, 0]; + var vec2_2_2 = [2, 2]; + var vec2_1_1 = [1, 1]; + var vec3_000 = [0, 0, 0]; + var vec3_00n1 = [0, 0, -1]; + var vec3_111 = [1, 1, 1]; print("\e[2J"); - var stamp=maketimestamp(); - for(var t=0;t