From 1ced201cb5a97bc942e5b95ec9cd96121494c0e5 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Fri, 4 Nov 2022 21:36:54 +0800 Subject: [PATCH] :rocket: add gc time info --- nasal_gc.h | 12 ++- test/console3D.nas | 226 +++++++++++++++++++++++---------------------- 2 files changed, 127 insertions(+), 111 deletions(-) diff --git a/nasal_gc.h b/nasal_gc.h index 90145f5..7acaa63 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "nasal_err.h" @@ -482,10 +483,13 @@ struct gc u64 size[gc_tsize]; u64 count[gc_tsize]; u64 acnt[gc_tsize]; + i64 worktime; + gc(u32& _pc, var*& _localr, var*& _memr, var& _funcr, var& _upvalr, var*& _canary, var*& _top, var* _stk): pc(_pc),localr(_localr),memr(_memr),funcr(_funcr),upvalr(_upvalr), - canary(_canary),top(_top),stack(_stk),cort(nullptr),temp(nil){} + canary(_canary),top(_top),stack(_stk),cort(nullptr),temp(nil), + worktime(0){} void mark(); void sweep(); void init(const std::vector&,const std::vector&); @@ -573,6 +577,7 @@ void gc::init(const std::vector& s,const std::vector& argv) { // initiaize function register funcr=nil; + worktime=0; for(u8 i=0;iedge; } var vec2len=func(v){ - return math.sqrt(v.x*v.x+v.y*v.y); + return sqrt(v[0]*v[0]+v[1]*v[1]); } var vec3len=func(v){ - return math.sqrt(v.x*v.x+v.y*v.y+v.z*v.z); + return sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]); } var vec3norm=func(v){ var t=vec3len(v); - return vec3div(v,vec3(t,t,t)); + return vec3div(v,[t,t,t]); } var vec3dot=func(a,b){ - return a.x*b.x+a.y*b.y+a.z*b.z; + return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]; } var vec3abs=func(v){ - return vec3(math.abs(v.x),math.abs(v.y),math.abs(v.z)); + return [abs(v[0]),abs(v[1]),abs(v[2])]; } var vec3sign=func(v){ - return vec3(sign(v.x),sign(v.y),sign(v.z)); + return [sign(v[0]),sign(v[1]),sign(v[2])]; } var vec3step=func(edge,v){ - return vec3(step(edge.x,v.x),step(edge.y,v.y),step(edge.z,v.z)); + 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(vec3(2,2,2),vec3(d,d,d)))); + return vec3sub(rd,vec3mul(n,vec3mul([2,2,2],[d,d,d]))); } var rotateX=func(a,angle){ - var b=vec3(a.x,a.y,a.z); - b.z=a.z*math.cos(angle)-a.y*math.sin(angle); - b.y=a.z*math.sin(angle)+a.y*math.cos(angle); - return b; + return [ + a[0], + a[2]*sin(angle)+a[1]*cos(angle), + a[2]*cos(angle)-a[1]*sin(angle) + ]; } var rotateY=func(a,angle) { - var b=vec3(a.x,a.y,a.z); - b.x=a.x*math.cos(angle)-a.z*math.sin(angle); - b.z=a.x*math.sin(angle)+a.z*math.cos(angle); - return b; + return [ + a[0]*cos(angle)-a[2]*sin(angle), + a[1], + a[0]*sin(angle)+a[2]*cos(angle) + ]; } var rotateZ=func(a,angle) { - var b=vec3(a.x,a.y,a.z); - b.x=a.x*math.cos(angle)-a.y*math.sin(angle); - b.y=a.x*math.sin(angle)+a.y*math.cos(angle); - return b; + return [ + a[0]*cos(angle)-a[1]*sin(angle), + a[0]*sin(angle)+a[1]*cos(angle), + a[2] + ]; } 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 vec2(-1.0,-1.0); - h=math.sqrt(h); - return vec2(-b-h,-b+h); + 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(vec3(1.0,1.0,1.0),rd); + 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=math.max(math.max(t1.x,t1.y),t1.z); - var tF=math.min(math.min(t2.x,t2.y),t2.z); - if (tN>tF or tF<0.0) return vec2(-1.0,-1.0); - var yzx=vec3(t1.y,t1.z,t1.x); - var zxy=vec3(t1.z,t1.x,t1.y); - var tmp=vec3mul(vec3mul(vec3neg(vec3sign(rd)), vec3step(yzx,t1)),vec3step(zxy, t1)); - outNormal.x=tmp.x; - outNormal.y=tmp.y; - outNormal.z=tmp.z; - return vec2(tN, tF); + 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) { @@ -154,80 +162,80 @@ var plane=func(ro,rd,p,w) { } var main=func() { - var width=68*2; - var height=17*2; - var aspect=width/height; - var pixelAspect=11.0/24.0; + var height=15*2; + var width=int(height*1600/900)*2; - var gradient=split(""," .:!/r(l1Z4H9W8$@"); - var gradientSize=size(gradient)-2; + var aspect=width/height; + var pixelAspect=11.0/24.0; + + var gradient=split(""," .:!/r(l1Z4H9W8$"); + var gradientSize=size(gradient)-1; var screen=[]; setsize(screen,width*height); print("\e[2J"); var stamp=maketimestamp(); - for(var t=0;t<10000;t+=1){ + for(var t=0;t<1e3;t+=1){ stamp.stamp(); - var light=vec3norm(vec3(-0.5,0.5,-1.0)); - var spherePos=vec3(0,3,0); - for(var i=0;i0){ - var itPoint=vec3add(vec3sub(ro,spherePos),vec3mul(rd,vec3(intersection.x,intersection.x,intersection.x))); - minIt= intersection.x; - n=vec3norm(itPoint); - } - var boxN=vec3(0,0,0); - intersection=box(ro,rd,vec3(1,1,1),boxN); - if(intersection.x>0 and intersection.x0 and intersection.x0){ + var itPoint=vec3add(vec3sub(ro,spherePos),vec3mul(rd,[intersection[0],intersection[0],intersection[0]])); + minIt= intersection[0]; + n=vec3norm(itPoint); + } + var boxN=[0,0,0]; + intersection=box(ro,rd,[1,1,1],boxN); + if(intersection[0]>0 and intersection[0]0 and intersection[0]