init
This commit is contained in:
commit
87bff164f1
416 files changed
+279512
No files matched your search
@@ -0,0 +1,121 @@
|
||||
// Native C++ Lua bytecode target. Only self/owner handles are visible.
|
||||
struct NgpValue { uint tag; float n; uint s; };
|
||||
struct NgpTuple { NgpValue v[8]; int count; };
|
||||
FProj ngp_proj;
|
||||
vec3 ngp_owner;
|
||||
float ngp_owner_id;
|
||||
bool ngp_failed, ngp_loaded;
|
||||
uint ngp_line;
|
||||
uvec4 ngp_error;
|
||||
vec3 ngp_surface(vec2 start,vec2 end);
|
||||
|
||||
NgpValue ngp_nil() { return NgpValue(0u,0.0,0u); }
|
||||
NgpValue ngp_num(float n) { return NgpValue(1u,n,0u); }
|
||||
NgpValue ngp_bool(bool b) { return NgpValue(2u,b?1.0:0.0,0u); }
|
||||
NgpValue ngp_string(uint s) { return NgpValue(3u,0.0,s); }
|
||||
NgpTuple ngp_empty() { NgpTuple t;t.count=0;for(int i=0;i<8;i++)t.v[i]=ngp_nil();return t; }
|
||||
NgpTuple ngp_one(NgpValue v) { NgpTuple t=ngp_empty();t.count=1;t.v[0]=v;return t; }
|
||||
void ngp_fault(uint code) {if(!ngp_failed)ngp_error=uvec4(code,ngp_line,1u,0u);ngp_failed=true;}
|
||||
bool ngp_truth(NgpValue v) {return v.tag!=0u&&!(v.tag==2u&&v.n==0.0);}
|
||||
bool ngp_equal(NgpValue a,NgpValue b) {return a.tag==b.tag&&(a.tag==0u||(a.tag>=3u?a.s==b.s:a.n==b.n));}
|
||||
float ngp_number(NgpValue v) {
|
||||
float n;if(v.tag==1u)return v.n;
|
||||
if(v.tag==3u&&ngp_parse_number(v.s,n))return n;
|
||||
ngp_fault(1u);return 0.0;
|
||||
}
|
||||
bool ngp_less(NgpValue a,NgpValue b,bool equal) {
|
||||
if(a.tag==3u&&b.tag==3u)return equal?ngp_rank(a.s)<=ngp_rank(b.s):ngp_rank(a.s)<ngp_rank(b.s);
|
||||
if(a.tag!=1u||b.tag!=1u){ngp_fault(1u);return false;}
|
||||
return equal?a.n<=b.n:a.n<b.n;
|
||||
}
|
||||
float ngp_pow(float a,float b) {
|
||||
if(b==0.0)return 1.0;
|
||||
if(a<0.0){if(floor(b)!=b)return uintBitsToFloat(0x7fc00000u);return (mod(abs(b),2.0)==0.0?1.0:-1.0)*pow(-a,b);}
|
||||
return pow(a,b);
|
||||
}
|
||||
NgpValue ngp_arithmetic(int op,NgpValue a,NgpValue b) {
|
||||
float x=ngp_number(a),y=ngp_number(b);
|
||||
if(op==0)return ngp_num(x+y);if(op==1)return ngp_num(x-y);
|
||||
if(op==2)return ngp_num(x*y);if(op==3)return ngp_num(x/y);
|
||||
if(op==4)return ngp_num(x-floor(x/y)*y);return ngp_num(ngp_pow(x,y));
|
||||
}
|
||||
NgpTuple ngp_call(NgpValue f,NgpTuple a) {
|
||||
if(f.tag!=4u){ngp_fault(1u);return ngp_empty();}
|
||||
uint api=f.s;
|
||||
if(api==1u){if(a.count!=0)ngp_fault(2u);return ngp_one(ngp_num(16777216.0));}
|
||||
if(api==2u){
|
||||
if(a.count!=1){ngp_fault(2u);return ngp_empty();}
|
||||
float e=ngp_number(a.v[0]);
|
||||
if(e!=16777216.0&&e!=ngp_owner_id){ngp_fault(3u);return ngp_empty();}
|
||||
vec3 tr=e==16777216.0?vec3(ngp_proj.a.xy,ngp_proj.e.x):ngp_owner;
|
||||
NgpTuple r=ngp_empty();r.count=5;
|
||||
r.v[0]=ngp_num(tr.x);r.v[1]=ngp_num(tr.y);r.v[2]=ngp_num(tr.z);r.v[3]=ngp_num(1.0);r.v[4]=ngp_num(1.0);return r;
|
||||
}
|
||||
if(api==3u){
|
||||
if(a.count!=2){ngp_fault(2u);return ngp_empty();}
|
||||
if(ngp_number(a.v[0])!=16777216.0||a.v[1].tag!=3u){ngp_fault(3u);return ngp_empty();}
|
||||
if(a.v[1].s==NGP_PROJECTILE)return ngp_one(ngp_num(1.0));
|
||||
if(a.v[1].s==NGP_VELOCITY)return ngp_one(ngp_num(2.0));
|
||||
ngp_fault(3u);return ngp_empty();
|
||||
}
|
||||
if(api==4u){
|
||||
if(a.count!=2){ngp_fault(2u);return ngp_empty();}
|
||||
if(ngp_number(a.v[0])==2.0&&a.v[1].tag==3u&&a.v[1].s==NGP_MOTION){
|
||||
NgpTuple r=ngp_empty();r.count=2;
|
||||
r.v[0]=ngp_num(ngp_proj.a.z*60.0);r.v[1]=ngp_num(ngp_proj.a.w*60.0);return r;
|
||||
}
|
||||
if(ngp_number(a.v[0])!=1.0||a.v[1].tag!=3u||a.v[1].s!=NGP_WHO){ngp_fault(3u);return ngp_empty();}
|
||||
return ngp_one(ngp_num(ngp_owner_id));
|
||||
}
|
||||
if(api==5u){
|
||||
if(a.count==4&&ngp_number(a.v[0])==2.0&&a.v[1].tag==3u&&a.v[1].s==NGP_MOTION){
|
||||
vec2 velocity=vec2(ngp_number(a.v[2]),ngp_number(a.v[3]));
|
||||
if(!ngp_failed)ngp_proj.a.zw=velocity/60.0;return ngp_empty();
|
||||
}
|
||||
if(a.count!=3){ngp_fault(2u);return ngp_empty();}
|
||||
if(ngp_number(a.v[0])!=2.0||a.v[1].tag!=3u||a.v[1].s!=NGP_GRAVITY){ngp_fault(3u);return ngp_empty();}
|
||||
float gravity=ngp_number(a.v[2]);if(!ngp_failed)ngp_proj.b.z=gravity/3600.0;
|
||||
return ngp_empty();
|
||||
}
|
||||
if(api==6u||api==7u){
|
||||
if(a.count!=1||a.v[0].tag!=3u||a.v[0].s!=NGP_UTIL){ngp_fault(3u);return ngp_empty();}
|
||||
if(api==7u||!ngp_loaded){ngp_module_init();ngp_loaded=true;}return ngp_empty();
|
||||
}
|
||||
if(api==8u){
|
||||
if(a.count!=4){ngp_fault(2u);return ngp_empty();}
|
||||
vec2 start=vec2(ngp_number(a.v[0]),ngp_number(a.v[1]));
|
||||
vec2 end=vec2(ngp_number(a.v[2]),ngp_number(a.v[3]));
|
||||
if(ngp_failed)return ngp_empty();
|
||||
vec3 hit=ngp_surface(start,end);
|
||||
if(hit.z<0.0){ngp_fault(15u);return ngp_empty();}
|
||||
NgpTuple r=ngp_empty();r.count=3;
|
||||
r.v[0]=ngp_bool(hit.z!=0.0);r.v[1]=ngp_num(hit.x);r.v[2]=ngp_num(hit.y);return r;
|
||||
}
|
||||
if(api==9u){
|
||||
// Reviewed cloud script sets only position, retaining angle and scale.
|
||||
if(a.count!=3){ngp_fault(2u);return ngp_empty();}
|
||||
if(ngp_number(a.v[0])!=16777216.0){ngp_fault(3u);return ngp_empty();}
|
||||
vec2 position=vec2(ngp_number(a.v[1]),ngp_number(a.v[2]));
|
||||
if(!ngp_failed)ngp_proj.a.xy=position;
|
||||
return ngp_empty();
|
||||
}
|
||||
if(api>=10u&&api<=15u){
|
||||
int count=(api==12u||api==15u)?2:1;
|
||||
if(a.count!=count){ngp_fault(2u);return ngp_empty();}
|
||||
float x=ngp_number(a.v[0]), y=count==2?ngp_number(a.v[1]):0.0, value=0.0;
|
||||
if(api==10u)value=abs(x);
|
||||
if(api==11u)value=sqrt(x);
|
||||
// GLSL atan(0,0) is undefined; LuaJIT/libm returns signed zero or pi.
|
||||
if(api==12u){
|
||||
if(x==0.0)value=(floatBitsToUint(y)&0x80000000u)!=0u?3.141592653589793:0.0;
|
||||
else if(y==0.0)value=1.5707963267948966;
|
||||
else value=atan(abs(x),y);
|
||||
if((floatBitsToUint(x)&0x80000000u)!=0u)value=-value;
|
||||
}
|
||||
if(api==13u)value=cos(x);
|
||||
if(api==14u)value=sin(x);
|
||||
if(api==15u)value=max(x,y);
|
||||
return ngp_one(ngp_num(value));
|
||||
}
|
||||
ngp_fault(3u);return ngp_empty();
|
||||
}
|
||||
Reference in new issue
Block a user