This commit is contained in:
Gaël committed 2026-10-19 20:59:15 +02:00
commit 87bff164f1
416 files changed
+279512

No files matched your search

+121
View File
@@ -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();
}