🚀 add test file `console3D.nas`
This commit is contained in:
parent
aaccfbda11
commit
cedb5e12f5
|
@ -211,7 +211,7 @@ void debugger::run(
|
|||
const linker& linker,
|
||||
const std::vector<string>& argv)
|
||||
{
|
||||
detail_info=true;
|
||||
verbose=true;
|
||||
fsize=linker.filelist().size();
|
||||
init(gen.strs(),gen.nums(),gen.codes(),linker.filelist(),argv);
|
||||
u64 count[op_ret+1]={0};
|
||||
|
|
|
@ -37,7 +37,7 @@ protected:
|
|||
const std::vector<string>&,
|
||||
const std::vector<string>&);
|
||||
/* debug functions */
|
||||
bool detail_info;
|
||||
bool verbose;
|
||||
void valinfo(var&);
|
||||
void traceback();
|
||||
void stackinfo(const u32);
|
||||
|
@ -131,7 +131,7 @@ public:
|
|||
upvalr(nil),canary(nullptr),top(stack),
|
||||
cnum(nullptr),cstr(nullptr),
|
||||
ngc(pc,localr,memr,funcr,upvalr,canary,top,stack),
|
||||
files(nullptr),bytecode(nullptr),detail_info(false){}
|
||||
files(nullptr),bytecode(nullptr),verbose(false){}
|
||||
void run(
|
||||
const codegen&,
|
||||
const linker&,
|
||||
|
@ -314,7 +314,7 @@ void vm::die(const string& str)
|
|||
std::cout<<"[vm] error: "<<str<<"\n";
|
||||
traceback();
|
||||
stackinfo();
|
||||
if(detail_info)
|
||||
if(verbose)
|
||||
detail();
|
||||
if(ngc.stack==stack){
|
||||
std::exit(1);
|
||||
|
@ -935,7 +935,7 @@ void vm::run(
|
|||
const std::vector<string>& argv,
|
||||
const bool detail)
|
||||
{
|
||||
detail_info=detail;
|
||||
verbose=detail;
|
||||
init(gen.strs(),gen.nums(),gen.codes(),linker.filelist(),argv);
|
||||
#ifndef _MSC_VER
|
||||
const void* oprs[]=
|
||||
|
|
|
@ -0,0 +1,233 @@
|
|||
# ray tracing example
|
||||
# modified from Artem Yashin's project Console3D
|
||||
|
||||
# MIT License
|
||||
# Copyright (c) 2021 Artem Yashin
|
||||
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
var t=[];
|
||||
for(var i=0;i<8192;i+=1)
|
||||
append(t,{});
|
||||
t=[];
|
||||
|
||||
var vec2=func(x,y){
|
||||
return {x:x,y:y};
|
||||
}
|
||||
var vec2add=func(v1,v2){
|
||||
return vec2(v1.x+v2.x,v1.y+v2.y);
|
||||
}
|
||||
var vec2sub=func(v1,v2){
|
||||
return vec2(v1.x-v2.x,v1.y-v2.y);
|
||||
}
|
||||
var vec2mul=func(v1,v2){
|
||||
return vec2(v1.x*v2.x,v1.y*v2.y);
|
||||
}
|
||||
var vec2div=func(v1,v2){
|
||||
return vec2(v1.x/v2.x,v1.y/v2.y);
|
||||
}
|
||||
|
||||
var vec3=func(x,y,z){
|
||||
return {x:x,y:y,z:z};
|
||||
}
|
||||
var vec3add=func(v1,v2){
|
||||
return vec3(v1.x+v2.x,v1.y+v2.y,v1.z+v2.z);
|
||||
}
|
||||
var vec3sub=func(v1,v2){
|
||||
return vec3(v1.x-v2.x,v1.y-v2.y,v1.z-v2.z);
|
||||
}
|
||||
var vec3mul=func(v1,v2){
|
||||
return vec3(v1.x*v2.x,v1.y*v2.y,v1.z*v2.z);
|
||||
}
|
||||
var vec3div=func(v1,v2){
|
||||
return vec3(v1.x/v2.x,v1.y/v2.y,v1.z/v2.z);
|
||||
}
|
||||
var vec3neg=func(v){
|
||||
return vec3(-v.x,-v.y,-v.z);
|
||||
}
|
||||
|
||||
var clamp=func(value,_min,_max){
|
||||
return math.max(math.min(value,_max),_min);
|
||||
}
|
||||
var sign=func(a){
|
||||
return (0<a)-(a<0);
|
||||
}
|
||||
var step=func(edge,x){
|
||||
return x>edge;
|
||||
}
|
||||
var vec2len=func(v){
|
||||
return math.sqrt(v.x*v.x+v.y*v.y);
|
||||
}
|
||||
var vec3len=func(v){
|
||||
return math.sqrt(v.x*v.x+v.y*v.y+v.z*v.z);
|
||||
}
|
||||
|
||||
var vec3norm=func(v){
|
||||
var t=vec3len(v);
|
||||
return vec3div(v,vec3(t,t,t));
|
||||
}
|
||||
var vec3dot=func(a,b){
|
||||
return a.x*b.x+a.y*b.y+a.z*b.z;
|
||||
}
|
||||
var vec3abs=func(v){
|
||||
return vec3(math.abs(v.x),math.abs(v.y),math.abs(v.z));
|
||||
}
|
||||
var vec3sign=func(v){
|
||||
return vec3(sign(v.x),sign(v.y),sign(v.z));
|
||||
}
|
||||
var vec3step=func(edge,v){
|
||||
return vec3(step(edge.x,v.x),step(edge.y,v.y),step(edge.z,v.z));
|
||||
}
|
||||
var vec3reflect=func(rd,n){
|
||||
var d=vec3dot(n,rd);
|
||||
return vec3sub(rd,vec3mul(n,vec3mul(vec3(2,2,2),vec3(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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
var box=func(ro,rd,boxSize,outNormal) {
|
||||
var m=vec3div(vec3(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 plane=func(ro,rd,p,w) {
|
||||
return -(vec3dot(ro,p)+w)/vec3dot(rd,p);
|
||||
}
|
||||
|
||||
var main=func() {
|
||||
var width=68*2;
|
||||
var height=17*2;
|
||||
|
||||
var aspect=width/height;
|
||||
var pixelAspect=11.0/24.0;
|
||||
|
||||
var gradient=split(""," .:!/r(l1Z4H9W8$@");
|
||||
var gradientSize=size(gradient)-2;
|
||||
|
||||
var screen=[];
|
||||
setsize(screen,width*height);
|
||||
|
||||
print("\e[2J");
|
||||
var stamp=maketimestamp();
|
||||
for(var t=0;t<10000;t+=1){
|
||||
stamp.stamp();
|
||||
var light=vec3norm(vec3(-0.5,0.5,-1.0));
|
||||
var spherePos=vec3(0,3,0);
|
||||
for(var i=0;i<width;i+=1){
|
||||
for(var j=0;j<height;j+=1){
|
||||
var uv=vec2sub(vec2mul(vec2div(vec2(i,j),vec2(width,height)),vec2(2.0,2.0)),vec2(1.0,1.0));
|
||||
uv.x*=aspect*pixelAspect;
|
||||
var ro=vec3(-6,0,0);
|
||||
var rd=vec3norm(vec3(2,uv.x,uv.y));
|
||||
ro=rotateY(ro,0.25);
|
||||
rd=rotateY(rd,0.25);
|
||||
ro=rotateZ(ro,t*0.025);
|
||||
rd=rotateZ(rd,t*0.025);
|
||||
var diff = 1;
|
||||
for (var k=0;k<5;k+=1){
|
||||
var minIt=99999;
|
||||
var intersection=sphere(vec3sub(ro,spherePos),rd,1);
|
||||
var n=vec3(0,0,0);
|
||||
var albedo=1;
|
||||
if(intersection.x>0){
|
||||
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.x<minIt){
|
||||
minIt=intersection.x;
|
||||
n=boxN;
|
||||
}
|
||||
var tmp=plane(ro,rd,vec3(0,0,-1),1);
|
||||
intersection=vec2(tmp,tmp);
|
||||
if(intersection.x>0 and intersection.x<minIt){
|
||||
minIt=intersection.x;
|
||||
n=vec3(0,0,-1);
|
||||
albedo=0.5;
|
||||
}
|
||||
if(minIt<99999){
|
||||
diff*=(vec3dot(n,light)*0.5+0.5)*albedo;
|
||||
ro=vec3add(ro,vec3mul(rd,vec3(minIt-0.01,minIt-0.01,minIt-0.01)));
|
||||
rd=vec3reflect(rd, n);
|
||||
}
|
||||
else break;
|
||||
}
|
||||
var color=int(diff*20);
|
||||
color=clamp(color,0,gradientSize);
|
||||
screen[i+j*width]=gradient[color];
|
||||
}
|
||||
}
|
||||
var s="";
|
||||
forindex(var index;screen){
|
||||
s~=screen[index];
|
||||
if(index+1-int((index+1)/width)*width==0)
|
||||
s~="\n";
|
||||
}
|
||||
var elt=stamp.elapsedMSec()/1000;
|
||||
println("\e[H",1/elt," fps\n",s);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
|
@ -4,6 +4,7 @@ var mod=func(n,a){
|
|||
|
||||
var main=func(run_time){
|
||||
var (sin,cos)=(math.sin,math.cos);
|
||||
var chars=split("",".,-~:;=!*#$@");
|
||||
|
||||
var (A,B)=(0,0);
|
||||
var (z,b)=([],[]);
|
||||
|
@ -12,10 +13,10 @@ var main=func(run_time){
|
|||
|
||||
print("\e[2J");
|
||||
for(var run=0;run<run_time;run+=1){
|
||||
forindex(var i;b)
|
||||
b[i]=32;
|
||||
forindex(var i;z)
|
||||
forindex(var i;b){
|
||||
b[i]=" ";
|
||||
z[i]=0;
|
||||
}
|
||||
for(var j=0;j<6.28;j+=0.07){
|
||||
for(var i=0;i<6.28;i+=0.02){
|
||||
var (c,d,e,f,g)=(sin(i),cos(j),sin(A),sin(j),cos(A));
|
||||
|
@ -29,14 +30,14 @@ var main=func(run_time){
|
|||
var N=int(8*((f*e-c*d*g)*m-c*d*e-f*g-l*d*n));
|
||||
if(22>y and y>0 and x>0 and 80>x and D>z[o]){
|
||||
z[o]=D;
|
||||
b[o]=".,-~:;=!*#$@"[N>0?N:0];
|
||||
b[o]=chars[N>0?N:0];
|
||||
}
|
||||
}
|
||||
}
|
||||
print("\e[H");
|
||||
var screen="";
|
||||
for(var k=0;k<1761;k+=1) {
|
||||
screen~=(mod(k,80)?chr(b[k]):chr(10));
|
||||
screen~=(mod(k,80)?b[k]:"\n");
|
||||
A+=0.00004;
|
||||
B+=0.00002;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue