diff --git a/src/frag.glsl b/src/frag.glsl index 65dd9c29a501b4a5d63e7d24ea038021940ccab7..a5985b2abd473b59cf22b79cd8cb6a822260e12a 100644 --- a/src/frag.glsl +++ b/src/frag.glsl @@ -12,23 +12,23 @@ layout (constant_id = 0) const bool DISABLE_TRACE = false; layout(location=0)in VertexInput { vec4 position; - vec3 globaloffset; }vertexInput; #else layout(location=0)in vec3 tri_normal; +layout(location=1)in vec4 tri_pos; #endif layout(location=0)out vec4 f_color; /// SHARED CODE /// -vec3 shading(vec3 normal) +vec3 shading(vec3 normal, vec3 position) { vec3 accum=vec3(0.,0.,0.); mat3 rotation=mat3(pc.world[0].xyz,pc.world[1].xyz,pc.world[2].xyz); - vec3 position=pc.world[3].xyz; + //vec3 position=pc.world[3].xyz; for(int i=0;i<light_uniforms.light_count;i++) { @@ -57,7 +57,7 @@ const uint MAX_STEPS=50; #define gl_GlobalInvocationID uvec3(1) #endif #define interval_frags -#include "intervals.glsl" +#include "interpreter.glsl" layout(set=0,binding=20, std430)restrict readonly buffer fragmentMasks{ uint8_t masks[][masklen]; @@ -66,20 +66,20 @@ layout(set=0,binding=20, std430)restrict readonly buffer fragmentMasks{ #ifdef debug vec3 getNormal(vec3 p,float dens){ vec3 n; - n.x=sceneoverride(vec3(p.x+EPSILON,p.y,p.z),false).x; - n.y=sceneoverride(vec3(p.x,p.y+EPSILON,p.z),false).x; - n.z=sceneoverride(vec3(p.x,p.y,p.z+EPSILON),false).x; - return normalize(n-(sceneoverride(p,false).x)); + n.x=scene(vec3(p.x+EPSILON,p.y,p.z),false).x; + n.y=scene(vec3(p.x,p.y+EPSILON,p.z),false).x; + n.z=scene(vec3(p.x,p.y,p.z+EPSILON),false).x; + return normalize(n-(scene(p,false).x)); } vec2 spheretracing(vec3 ori,vec3 dir,out vec3 p){ vec2 td=vec2(NEARPLANE,1.); p=ori; - td.y=sceneoverride(p,false).x; + td.y=scene(p,false).x; td.x+=(td.y)*.9; p=ori+dir*td.x; for(int i=0;i<MAX_STEPS&&td.y>EPSILON&&td.x<FARPLANE;i++){ - td.y=sceneoverride(p,false).x; + td.y=scene(p,false).x; td.x+=(td.y)*.9; p=ori+dir*td.x; } @@ -88,17 +88,17 @@ vec2 spheretracing(vec3 ori,vec3 dir,out vec3 p){ #else vec3 getNormal(vec3 p,float dens){ vec3 n; - n.x=sceneoverride(vec3(p.x+EPSILON,p.y,p.z),false); - n.y=sceneoverride(vec3(p.x,p.y+EPSILON,p.z),false); - n.z=sceneoverride(vec3(p.x,p.y,p.z+EPSILON),false); - return normalize(n-(sceneoverride(p,false))); + n.x=scene(vec3(p.x+EPSILON,p.y,p.z),false); + n.y=scene(vec3(p.x,p.y+EPSILON,p.z),false); + n.z=scene(vec3(p.x,p.y,p.z+EPSILON),false); + return normalize(n-(scene(p,false))); } vec2 spheretracing(vec3 ori,vec3 dir,out vec3 p){ vec2 td=vec2(NEARPLANE,1.); p=ori; for(int i=0;i<MAX_STEPS&&td.y>EPSILON&&td.x<FARPLANE;i++){ - td.y=sceneoverride(p,false); + td.y=scene(p,false); td.x+=(td.y)*.9; p=ori+dir*td.x; } @@ -113,7 +113,6 @@ void main(){ vec3 raypos=vertexInput.position.xyz; vec3 p; vec3 raydir=normalize(raypos-(inverse(pc.world)*vec4(camera_uniforms.campos,1)).xyz); - raypos+=vertexInput.globaloffset; //f_color=vec4(raydir,1.); @@ -123,7 +122,7 @@ void main(){ } #ifdef debug - f_color=vec4(sceneoverride(raypos,false),1); + f_color=vec4(scene(raypos,false),1); return; #endif @@ -136,7 +135,7 @@ void main(){ { vec3 n=getNormal(p,td.y); //f_color=vec4(1.); - f_color=vec4(shading(n),1.); + f_color=vec4(shading(n, p),1.); vec4 tpoint=camera_uniforms.proj*camera_uniforms.view*pc.world*vec4(p,1); gl_FragDepth=(tpoint.z/tpoint.w); @@ -152,7 +151,7 @@ void main(){ //Mesh Surface Entrypoint void main(){ - f_color=vec4(shading(tri_normal),1.); + f_color=vec4(shading(tri_normal, tri_pos.xyz),1.); } #endif \ No newline at end of file diff --git a/src/implicit.mesh.glsl b/src/implicit.mesh.glsl index b7623a7b9c72c99d67467353320555727412ffab..adcb1f7cb2370f65566a84385c3ec57f40128a25 100644 --- a/src/implicit.mesh.glsl +++ b/src/implicit.mesh.glsl @@ -18,7 +18,6 @@ layout(triangles,max_vertices=256,max_primitives=192)out; layout(location=0)out VertexOutput { vec4 position; - vec3 globaloffset; }vertexOutput[]; struct MeshMasks @@ -28,8 +27,7 @@ struct MeshMasks vec3 bottomleft; //12 vec3 topright; //12 uint globalindex; //4 - vec3 globaloffset; //12 -}; //total = 1000 bytes +}; //total = 988 bytes taskPayloadSharedEXT MeshMasks meshmasks; layout(set=0,binding=20, std430)restrict writeonly buffer fragmentMasks{ @@ -127,22 +125,6 @@ void main() vertexOutput[vindex+5].position=(positions[5]); vertexOutput[vindex+6].position=(positions[6]); vertexOutput[vindex+7].position=(positions[7]); - vertexOutput[vindex+0].globaloffset=(meshmasks.globaloffset); - vertexOutput[vindex+1].globaloffset=(meshmasks.globaloffset); - vertexOutput[vindex+2].globaloffset=(meshmasks.globaloffset); - vertexOutput[vindex+3].globaloffset=(meshmasks.globaloffset); - vertexOutput[vindex+4].globaloffset=(meshmasks.globaloffset); - vertexOutput[vindex+5].globaloffset=(meshmasks.globaloffset); - vertexOutput[vindex+6].globaloffset=(meshmasks.globaloffset); - vertexOutput[vindex+7].globaloffset=(meshmasks.globaloffset); - /*vertexOutput[vindex+0].position=vec4(bottomleft,1.); - vertexOutput[vindex+1].position=vec4(bottomleft.x,bottomleft.y,topright.z,1.); - vertexOutput[vindex+2].position=vec4(bottomleft.x,topright.y,bottomleft.z,1.); - vertexOutput[vindex+3].position=vec4(bottomleft.x,topright.y,topright.z,1.); - vertexOutput[vindex+4].position=vec4(topright.x,bottomleft.y,bottomleft.z,1.); - vertexOutput[vindex+5].position=vec4(topright.x,bottomleft.y,topright.z,1.); - vertexOutput[vindex+6].position=vec4(topright.x,topright.y,bottomleft.z,1.); - vertexOutput[vindex+7].position=vec4(topright,1.);*/ if(signingvec.x){ gl_PrimitiveTriangleIndicesEXT[pindex+0]=uvec3(4,5,6)+uvec3(vindex); diff --git a/src/implicit.task.glsl b/src/implicit.task.glsl index 34a5fcdc035b7bb79a7b88356d1ab2bd8ca40bcf..488b20b48bdd124484271676f46bb13b01c6a83f 100644 --- a/src/implicit.task.glsl +++ b/src/implicit.task.glsl @@ -19,8 +19,7 @@ struct MeshMasks vec3 bottomleft; //12 vec3 topright; //12 uint globalindex; //4 - vec3 globaloffset; //12 -}; //total = 1000 bytes +}; //total = 988 bytes taskPayloadSharedEXT MeshMasks meshmasks; shared uint index; @@ -36,33 +35,10 @@ void main() index=0; } - //#define CLIPCHECK 65536 - - /*float[6]bounds={ - CLIPCHECK-sceneoverride(vec3(CLIPCHECK,0,0),false), - CLIPCHECK-sceneoverride(vec3(0,CLIPCHECK,0),false), - CLIPCHECK-sceneoverride(vec3(0,0,CLIPCHECK),false), - -CLIPCHECK+sceneoverride(vec3(-CLIPCHECK,0,0),false), - -CLIPCHECK+sceneoverride(vec3(0,-CLIPCHECK,0),false), - -CLIPCHECK+sceneoverride(vec3(0,0,-CLIPCHECK),false), - };*/ - /*const float[6]bounds={ - 1,1,1,-1,-1,-1, - };*/ - float[6]bounds=scene_description.desc[gl_WorkGroupID.x+1].bounds; - - - /*bounds[0] += abs(bounds[0] * 0.01); - bounds[1] += abs(bounds[1] * 0.01); - bounds[2] += abs(bounds[2] * 0.01); - bounds[3] -= abs(bounds[3] * 0.01); - bounds[4] -= abs(bounds[4] * 0.01); - bounds[5] -= abs(bounds[5] * 0.01);*/ vec3 bottomleft = vec3(bounds[3],bounds[4],bounds[5]); vec3 topright = vec3(bounds[0],bounds[1],bounds[2]); - vec3 globaloffset = vec3(0);//(topright+bottomleft)/2.; #define adjust(var) \ var *= vec3(0.25,0.25,0.25);\ @@ -77,35 +53,24 @@ void main() bool triangle_fine; if (!DISABLE_TRACE) { - float[2] check = scene(vec3[2](bottomleft+globaloffset,topright+globaloffset), true); + float[2] check = scene(vec3[2](bottomleft,topright), true); triangle_fine = (check[0] <= 0) && (check[1] >= 0); } else { triangle_fine = true; } - //default_mask(); - //float[2] check = scene(vec3[2](bottomleft,topright), false); - //float[2] check = scene(vec3[2](bottomleft-globaloffset,topright-globaloffset), false); - //float[2] check = scene(vec3[2](vec3(bounds[3],bounds[4],bounds[5]),vec3(bounds[0],bounds[1],bounds[2])), false); - - //if (((check[0] <= 0) && (check[1] >= 0)) )//|| ((check[1] <= 0) && ())) - //if ((bottomleft.x >= -1) && (bottomleft.y >= -1) && (bottomleft.z >= -1) && (topright.x <= 1) && (topright.y <= 1) && (topright.z <= 1)) - //if ((gl_LocalInvocationID.x == 0) && (bottomleft.x >= 0)) if (triangle_fine) { uint localindex = atomicAdd(index, 1); - //if (localindex < 32) { meshmasks.masks[localindex]=mask; meshmasks.enabled[localindex]=uint8_t(gl_LocalInvocationID.x); - //} } if (gl_LocalInvocationID.x==0) { - meshmasks.bottomleft = vec3(bounds[3],bounds[4],(bounds[5]*0.5) + ((bounds[2]-bounds[5])*0.5 * (-0.5+gl_WorkGroupID.z))); - meshmasks.topright = vec3(bounds[0],bounds[1],(bounds[2]*0.5) + ((bounds[2]-bounds[5])*0.5 * (-0.5+gl_WorkGroupID.z))); + meshmasks.bottomleft = vec3(bounds[3],bounds[4],(bounds[5]*0.5) + ((bounds[2]-bounds[5])*0.5 * (-0.5+gl_WorkGroupID.z)) + ((bounds[2]+bounds[5])*0.25)); + meshmasks.topright = vec3(bounds[0],bounds[1],(bounds[2]*0.5) + ((bounds[2]-bounds[5])*0.5 * (-0.5+gl_WorkGroupID.z)) + ((bounds[2]+bounds[5])*0.25)); meshmasks.globalindex = gl_WorkGroupID.x*2+gl_WorkGroupID.z; - meshmasks.globaloffset = globaloffset/0.25; } barrier(); diff --git a/src/interpreter.glsl b/src/interpreter.glsl index 1cf01fa6ad32bc3135268f918db8cb175c86626d..7061b0284b52b3695dab8cc0e14bf0fd7d22ca34 100644 --- a/src/interpreter.glsl +++ b/src/interpreter.glsl @@ -1,4 +1,3 @@ -//#extension GL_EXT_shader_16bit_storage:require #extension GL_EXT_shader_explicit_arithmetic_types:require #ifndef interpreter @@ -6,36 +5,62 @@ #include "instructionset.glsl" -layout(set=0,binding=2, std430)uniform SceneDescription{ - u32vec4 d[13];//stored packed for space efficiency, 8 per index +struct Description{ + uint scene; + uint floats; + uint vec2s; + uint vec4s; + uint mat2s; + uint mat3s; + uint mat4s; + uint mats; + uint dependencies; + float[6] bounds; +}; +Description desc; + +layout(set=0,binding=2, std430)restrict readonly buffer SceneDescription{ + Description desc[]; }scene_description; -// unpack as both integers and floats -#define get_caches u32vec4 major_unpack=scene_description.d[major_position];\ -f16vec2 minor_float_unpack=unpackFloat2x16(major_unpack.x);\ -minor_float_cache[0]=minor_float_unpack.x;\ -minor_float_cache[1]=minor_float_unpack.y;\ -minor_float_unpack=unpackFloat2x16(major_unpack.y);\ -minor_float_cache[2]=minor_float_unpack.x;\ -minor_float_cache[3]=minor_float_unpack.y;\ -minor_float_unpack=unpackFloat2x16(major_unpack.z);\ -minor_float_cache[4]=minor_float_unpack.x;\ -minor_float_cache[5]=minor_float_unpack.y;\ -minor_float_unpack=unpackFloat2x16(major_unpack.w);\ -minor_float_cache[6]=minor_float_unpack.x;\ -minor_float_cache[7]=minor_float_unpack.y;\ -u16vec2 minor_integer_unpack=unpackUint2x16(major_unpack.x);\ -minor_integer_cache[0]=minor_integer_unpack.x;\ -minor_integer_cache[1]=minor_integer_unpack.y;\ -minor_integer_unpack=unpackUint2x16(major_unpack.y);\ -minor_integer_cache[2]=minor_integer_unpack.x;\ -minor_integer_cache[3]=minor_integer_unpack.y;\ -minor_integer_unpack=unpackUint2x16(major_unpack.z);\ -minor_integer_cache[4]=minor_integer_unpack.x;\ -minor_integer_cache[5]=minor_integer_unpack.y;\ -minor_integer_unpack=unpackUint2x16(major_unpack.w);\ -minor_integer_cache[6]=minor_integer_unpack.x;\ -minor_integer_cache[7]=minor_integer_unpack.y; +layout(set=0,binding=3, std430)restrict readonly buffer SceneBuf{ + u32vec4 opcodes[]; +}scenes; +layout(set=0,binding=4, std430)restrict readonly buffer FloatConst{ + float floats[]; +}fconst; +layout(set=0,binding=5, std430)restrict readonly buffer Vec2Const{ + vec2 vec2s[]; +}v2const; +layout(set=0,binding=7, std430)restrict readonly buffer Vec4Const{ + vec4 vec4s[]; +}v4const; +layout(set=0,binding=8, std430)restrict readonly buffer Mat2Const{ + mat2 mat2s[]; +}m2const; +layout(set=0,binding=9, std430)restrict readonly buffer Mat3Const{ + mat3 mat3s[]; +}m3const; +layout(set=0,binding=10, std430)restrict readonly buffer Mat4Const{ + mat4 mat4s[]; +}m4const; +layout(set=0,binding=11, std430)restrict readonly buffer MatConst{ + mat4 mats[]; +}matconst; +layout(set=0,binding=12, std430)restrict readonly buffer DepInfo{ + uint8_t dependencies[][2] ; +}depinfo; + +// unpack integers +#define get_caches u32vec4 major_unpack=scenes.opcodes[desc.scene+major_position];\ +minor_integer_cache[0]=major_unpack.x&65535;\ +minor_integer_cache[1]=major_unpack.x>>16;\ +minor_integer_cache[2]=major_unpack.y&65535;\ +minor_integer_cache[3]=major_unpack.y>>16;\ +minor_integer_cache[4]=major_unpack.z&65535;\ +minor_integer_cache[5]=major_unpack.z>>16;\ +minor_integer_cache[6]=major_unpack.w&65535;\ +minor_integer_cache[7]=major_unpack.w>>16; float float_stack[8]; uint float_stack_head=0; @@ -45,77 +70,142 @@ vec3 vec3_stack[8]; uint vec3_stack_head=0; vec4 vec4_stack[8]; uint vec4_stack_head=0; -mat2 mat2_stack[8]; +mat2 mat2_stack[1]; uint mat2_stack_head=0; -mat3 mat3_stack[8]; +mat3 mat3_stack[1]; uint mat3_stack_head=0; -mat4 mat4_stack[8]; +mat4 mat4_stack[1]; uint mat4_stack_head=0; -mat4 material_stack[8]; -uint material_stack_head=0; + +uint float_const_head=0; +uint vec2_const_head=0; +uint vec4_const_head=0; +uint mat2_const_head=0; +uint mat3_const_head=0; +uint mat4_const_head=0; +uint mat_const_head=0; + +#define vec3_const_head vec4_const_head +#define v3const v4const +#define vec3s vec4s void push_float(float f){ float_stack[float_stack_head++]=f; } -float pull_float(){ - return float_stack[--float_stack_head]; +float pull_float(bool c){ + if (c) { + return fconst.floats[desc.floats+float_const_head++]; + } + else { + return float_stack[--float_stack_head]; + } +} + +float cpull_float(){ + return fconst.floats[desc.floats+float_const_head++]; } void push_vec2(vec2 f){ vec2_stack[vec2_stack_head++]=f; } -vec2 pull_vec2(){ - return vec2_stack[--vec2_stack_head]; +vec2 pull_vec2(bool c){ + if (c) { + return v2const.vec2s[desc.vec2s+vec2_const_head++]; + } + else { + return vec2_stack[--vec2_stack_head]; + } +} + +vec2 cpull_vec2(){ + return v2const.vec2s[desc.vec2s+vec2_const_head++]; } void push_vec3(vec3 f){ vec3_stack[vec3_stack_head++]=f; } -vec3 pull_vec3(){ - return vec3_stack[--vec3_stack_head]; +vec3 pull_vec3(bool c){ + if (c) { + return v3const.vec3s[desc.vec3s+vec3_const_head++].xyz; + } + else { + return vec3_stack[--vec3_stack_head]; + } +} + +vec3 cpull_vec3(){ + return v3const.vec3s[desc.vec3s+vec3_const_head++].xyz; } void push_vec4(vec4 f){ vec4_stack[vec4_stack_head++]=f; } -vec4 pull_vec4(){ - return vec4_stack[--vec4_stack_head]; +vec4 pull_vec4(bool c){ + if (c) { + return v4const.vec4s[desc.vec4s+vec4_const_head++]; + } + else { + return vec4_stack[--vec4_stack_head]; + } +} + +vec4 cpull_vec4(){ + return v4const.vec4s[desc.vec4s+vec4_const_head++]; } void push_mat2(mat2 f){ mat2_stack[mat2_stack_head++]=f; } -mat2 pull_mat2(){ - return mat2_stack[--mat2_stack_head]; +mat2 pull_mat2(bool c){ + if (c) { + return m2const.mat2s[desc.mat2s+mat2_const_head++]; + } + else { + return mat2_stack[--mat2_stack_head]; + } +} + +mat2 cpull_mat2(){ + return m2const.mat2s[desc.mat2s+mat2_const_head++]; } void push_mat3(mat3 f){ mat3_stack[mat3_stack_head++]=f; } -mat3 pull_mat3(){ - return mat3_stack[--mat3_stack_head]; +mat3 pull_mat3(bool c){ + if (c) { + return m3const.mat3s[desc.mat3s+mat3_const_head++];; + } + else { + return mat3_stack[--mat3_stack_head]; + } } -void push_mat4(mat4 f){ - mat4_stack[mat4_stack_head++]=f; +mat3 cpull_mat3(){ + return m3const.mat3s[desc.mat3s+mat3_const_head++]; } -mat4 pull_mat4(){ - return mat4_stack[--mat4_stack_head]; +void push_mat4(mat4 f){ + mat4_stack[mat4_stack_head++]=f; } -void push_material(mat4 f){ - material_stack[material_stack_head++]=f; +mat4 pull_mat4(bool c){ + if (c) { + return m4const.mat4s[desc.mat4s+mat4_const_head++]; + } + else { + return mat4_stack[--mat4_stack_head]; + } } -mat4 pull_material(){ - return material_stack[--material_stack_head]; +mat4 cpull_mat4(){ + return m4const.mat4s[desc.mat4s+mat4_const_head++]; } void clear_stacks() @@ -127,1319 +217,2195 @@ void clear_stacks() mat2_stack_head=0; mat3_stack_head=0; mat4_stack_head=0; - material_stack_head=0; + float_const_head=0; + vec2_const_head=0; + vec3_const_head=0; + vec4_const_head=0; + mat2_const_head=0; + mat3_const_head=0; + mat4_const_head=0; + mat_const_head=0; } -uint8_t mask[13]; +const int masklen = 29; +uint8_t mask[masklen]; void default_mask() { - mask=uint8_t[13](uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255),uint8_t(255)); + mask=uint8_t[29]( + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255), + uint8_t(255) + ); +} + +//monotonic +#define multiply {\ + in1 *= in2;\ +} +//monotonic +#define divide {\ + in1 /= in2;\ +} +//monotonic +#define add {\ + in1 += in2;\ +} +//monotonic +#define subtract {\ + in1 -= in2;\ +} +#define modulo {\ + in1 = mod(in1,in2);\ +} +//always monotonic for x>0 +#define power {\ + in1 = pow(in1,in2);\ +} +//handled +#define dist {\ + out1 = distance(in1,in2);\ +} +//variable +#define dotprod {\ + out1 = dot(in1,in2);\ +} +//monotonic +#define clampof {\ + in1=clamp(in1,in2,in3);\ +} +//monotonic +#define mixof {\ + in1=mix(in1,in2,in3);\ +} +//monotonic +#define fmaof {\ + multiply;\ + in2=in3;\ + add;\ +} +//variable +#define square {\ + in1=in1*in1;\ +} +//monotonic +#define cube {\ + in1=in1*in1*in1;\ +} +//mess +#define len {\ + out1 = length(in1);\ +} +//monotonic +#define mattranspose {\ + in1=transpose(in1);\ +} +//unused +#define matdeterminant {\ + in1=determinant(in1);\ +} +//unused +#define matinvert {\ + in1=inverse(in1);\ +} +//handled +#define absolute {\ + in1=abs(in1);\ +} +//monotonic +#define signof {\ + in1=sign(in1);\ +} +//monotonic +#define floorof {\ + in1=floor(in1);\ +} +//monotonic +#define ceilingof {\ + in1=ceil(in1);\ +} +//handled +//If the integer component changes across the interval, then we've managed to hit +//a discontinuity, and the max and min are constant. +//Otherwise, it's monotonic. +#define fractionalof {\ + in1=fract(in1);\ +} +//monotonic +#define squarerootof {\ + in1=sqrt(in1);\ +} +//monotonic +#define inversesquarerootof {\ + in1=inversesqrt(in1);\ +} +//monotonic +#define exponentof {\ + in1=exp(in1);\ +} +//monotonic +#define exponent2of {\ + in1=exp2(in1);\ +} +//monotonic +#define logarithmof {\ + in1=log(in1);\ +} +//monotonic +#define logarithm2of {\ + in1=log2(in1);\ +} +#define PI 3.1415926536 +//handled +#define sineof {\ + in1=sin(in1);\ +} +//handled +#define cosineof {\ + in1=cos(in1);\ +} +//handled +#define tangentof {\ + in1=tan(in1);\ +} +//monotonic +#define arcsineof {\ + in1=asin(in1);\ +} +//negatively monotonic +#define arccosineof {\ + in1=acos(in1);\ +} +//monotonic +#define arctangentof {\ + in1=atan(in1);\ +} +//monotonic +#define hyperbolicsineof {\ + in1=sinh(in1);\ +} +//handled +#define hyperboliccosineof {\ + in1=cosh(in1);\ +} +//monotonic +#define hyperbolictangentof {\ + in1=tanh(in1);\ +} +//monotonic +#define hyperbolicarcsineof {\ + in1=asinh(in1);\ +} +//monotonic +#define hyperbolicarccosineof {\ + in1=acosh(in1);\ +} +//monotonic +#define hyperbolicarctangentof {\ + in1=atanh(in1);\ +} +//obvious +#define minimum {\ + in1=min(in1,in2);\ +} +//obvious +#define maximum {\ + in1=max(in1,in2);\ +} +//monotonic +#define roundof {\ + in1=round(in1);\ +} +//truncate +#define truncof {\ + in1=trunc(in1);\ } -float scene(vec3 p,bool material) +#define maskdefine (mask[major_position]&(1<<minor_position))==0 +#define inputmask1(m_in_1) if(maskdefine){\ + if(ifconst(0)) {m_in_1++;}\ + break;\ +} +#define inputmask2(m_in_1,m_in_2) if(maskdefine){\ + if(ifconst(0)) {m_in_1++;}\ + if(ifconst(1)) {m_in_2++;}\ + break;\ +} +#define inputmask3(m_in_1,m_in_2,m_in_3) if(maskdefine){\ + if(ifconst(0)) {m_in_1++;}\ + if(ifconst(1)) {m_in_2++;}\ + if(ifconst(2)) {m_in_3++;}\ + break;\ +} +#define inputmask4(m_in_1,m_in_2,m_in_3,m_in_4) if(maskdefine){\ + if(ifconst(0)) {m_in_1++;}\ + if(ifconst(1)) {m_in_2++;}\ + if(ifconst(2)) {m_in_3++;}\ + if(ifconst(3)) {m_in_4++;}\ + break;\ +} +#define inputmask5(m_in_1,m_in_2,m_in_3,m_in_4,m_in_5) if(maskdefine){\ + if(ifconst(0)) {m_in_1++;}\ + if(ifconst(1)) {m_in_2++;}\ + if(ifconst(2)) {m_in_3++;}\ + if(ifconst(3)) {m_in_4++;}\ + if(ifconst(4)) {m_in_5++;}\ + break;\ +} +#define inputmask6(m_in_1,m_in_2,m_in_3,m_in_4,m_in_5,m_in_6) if(maskdefine){\ + if(ifconst(0)) {m_in_1++;}\ + if(ifconst(1)) {m_in_2++;}\ + if(ifconst(2)) {m_in_3++;}\ + if(ifconst(3)) {m_in_4++;}\ + if(ifconst(4)) {m_in_5++;}\ + if(ifconst(5)) {m_in_6++;}\ + break;\ +} + +#ifdef debug +vec3 scene(vec3 p, bool materials) +#else +float scene(vec3 p, bool materials) +#endif { uint major_position=0; uint minor_position=0; - float16_t minor_float_cache[8]; - uint16_t minor_integer_cache[8]; + uint minor_integer_cache[8]; + + desc = scene_description.desc[(DescriptionIndex)+1]; clear_stacks(); push_vec3(p); - bool cont=true; - - while(cont){ + while(true){ if(minor_position==0){ get_caches; } - /*if(float(minor_float_cache[minor_position])==5) - return vec3(0.,0.,1.); - if(isnan(minor_float_cache[minor_position+1])) - return vec3(0.,1.,0.); - if(isnan(minor_float_cache[minor_position+2])) - return vec3(1.,0.,0.); - if(isnan(minor_float_cache[minor_position+3])) - return vec3(1.,0.,1.); - if(isnan(minor_float_cache[minor_position+4])) - return vec3(0.,1.,1.); - if(isnan(minor_float_cache[minor_position+5])) - return vec3(1.,1.,0.); - //if (float(minor_float_cache[minor_position+5]) == 5) - return vec3(1.,1.,1.); - - return vec3(float(minor_float_cache[minor_position]),float(minor_float_cache[minor_position+1]),float(minor_float_cache[minor_position+2])); - */ - if((mask[major_position]&(1<<minor_position))>0) - { - //return vec3(1.,1.,0.); - if(isnan(minor_float_cache[minor_position])) - { - float floattemp; - vec2 vec2temp; - vec3 vec3temp; - vec4 vec4temp; - mat2 mat2temp; - mat3 mat3temp; - mat4 mat4temp; - - switch(uint(minor_integer_cache[minor_position])&511) + /*#ifdef implicit + if (mask[major_position] != 255) discard; + if (mask[major_position+1] != 255) discard; + if (mask[major_position+2] != 255) discard; + if (mask[major_position+3] != 255) discard; + #endif*/ + #ifdef debug + /*if((minor_integer_cache[minor_position]&1023)==OPStop) { + return vec3(0.,0.,1.); + } + if((minor_integer_cache[minor_position]&1023)==OPSDFSphere) { + return vec3(1.,0.,0.); + }*/ + /*if((minor_integer_cache[minor_position] & (1 << (15 - 1))) > 0) { + return vec3(1.,0.,0.); + } + if((minor_integer_cache[minor_position] & (1 << (15 - 0))) > 0) { + return vec3(0.,0.,1.); + }*/ + //return vec3(0.,1.,0.); + return vec3(desc.floats,desc.scene,DescriptionIndex); + #endif + + switch(minor_integer_cache[minor_position]&1023) { - case OPAddFloatFloat: - push_float(pull_float()+pull_float()); - break; - case OPAddVec2Vec2: - push_vec2(pull_vec2()+pull_vec2()); - break; - case OPAddVec2Float: - push_vec2(pull_vec2()+pull_float()); - break; - case OPAddVec3Vec3: - push_vec3(pull_vec3()+pull_vec3()); - break; - case OPAddVec3Float: - push_vec3(pull_vec3()+pull_float()); - break; - case OPAddVec4Vec4: - push_vec4(pull_vec4()+pull_vec4()); - break; - case OPAddVec4Float: - push_vec4(pull_vec4()+pull_float()); - break; - case OPAddMat2Mat2: - push_mat2(pull_mat2()+pull_mat2()); - break; - case OPAddMat2Float: - push_mat2(pull_mat2()+pull_float()); - break; - case OPAddMat3Mat3: - push_mat3(pull_mat3()+pull_mat3()); - break; - case OPAddMat3Float: - push_mat3(pull_mat3()+pull_float()); - break; - case OPAddMat4Mat4: - push_mat4(pull_mat4()+pull_mat4()); - break; - case OPAddMat4Float: - push_mat4(pull_mat4()+pull_float()); - break; - - case OPMulFloatFloat: - push_float(pull_float()*pull_float()); - break; - case OPMulVec2Vec2: - push_vec2(pull_vec2()*pull_vec2()); - break; - case OPMulVec2Float: - push_vec2(pull_vec2()*pull_float()); - break; - case OPMulVec3Vec3: - push_vec3(pull_vec3()*pull_vec3()); - break; - case OPMulVec3Float: - push_vec3(pull_vec3()*pull_float()); - break; - case OPMulVec4Vec4: - push_vec4(pull_vec4()*pull_vec4()); - break; - case OPMulVec4Float: - push_vec4(pull_vec4()*pull_float()); + #define ifconst(pos) (minor_integer_cache[minor_position] & (1 << (15 - pos))) > 0 + #define OPPos int((major_position<<3)|minor_position) + case OPAddFloatFloat:{ + inputmask2(float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + add; + push_float(in1); + } break; - case OPMulMat2Mat2: - push_mat2(pull_mat2()*pull_mat2()); + case OPAddVec2Vec2:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + add; + push_vec2(in1); + } break; - case OPMulMat2Float: - push_mat2(pull_mat2()*pull_float()); + case OPAddVec2Float:{ + inputmask2(vec2_const_head,float_const_head); + vec2 in1=pull_vec2(ifconst(0)); + float in2=pull_float(ifconst(1)); + add; + push_vec2(in1); + } break; - case OPMulMat3Mat3: - push_mat3(pull_mat3()*pull_mat3()); + case OPAddVec3Vec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + add; + push_vec3(in1); + } break; - case OPMulMat3Float: - push_mat3(pull_mat3()*pull_float()); + case OPAddVec3Float:{ + inputmask2(vec3_const_head,float_const_head); + vec3 in1=pull_vec3(ifconst(0)); + float in2=pull_float(ifconst(1)); + add; + push_vec3(in1); + } break; - case OPMulMat4Mat4: - push_mat4(pull_mat4()*pull_mat4()); + case OPAddVec4Vec4:{ + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + add; + push_vec4(in1); + } break; - case OPMulMat4Float: - push_mat4(pull_mat4()*pull_float()); + case OPAddVec4Float:{ + inputmask2(vec4_const_head,float_const_head); + vec4 in1=pull_vec4(ifconst(0)); + float in2=pull_float(ifconst(1)); + add; + push_vec4(in1); + } break; - case OPSubFloatFloat: - push_float(pull_float()-pull_float()); - break; - case OPSubVec2Vec2: - push_vec2(pull_vec2()-pull_vec2()); - break; - case OPSubVec2Float: - push_vec2(pull_vec2()-pull_float()); - break; - case OPSubVec3Vec3: - push_vec3(pull_vec3()-pull_vec3()); - break; - case OPSubVec3Float: - push_vec3(pull_vec3()-pull_float()); - break; - case OPSubVec4Vec4: - push_vec4(pull_vec4()-pull_vec4()); - break; - case OPSubVec4Float: - push_vec4(pull_vec4()-pull_float()); + case OPSubFloatFloat:{ + inputmask2(float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + subtract; + push_float(in1); + } break; - case OPSubMat2Mat2: - push_mat2(pull_mat2()-pull_mat2()); + case OPSubVec2Vec2:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + subtract; + push_vec2(in1); + } break; - case OPSubMat2Float: - push_mat2(pull_mat2()-pull_float()); + case OPSubVec2Float:{ + inputmask2(vec2_const_head,float_const_head); + vec2 in1=pull_vec2(ifconst(0)); + float in2=pull_float(ifconst(1)); + subtract; + push_vec2(in1); + } break; - case OPSubMat3Mat3: - push_mat3(pull_mat3()-pull_mat3()); + case OPSubVec3Vec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + subtract; + push_vec3(in1); + } break; - case OPSubMat3Float: - push_mat3(pull_mat3()-pull_float()); + case OPSubVec3Float:{ + inputmask2(vec3_const_head,float_const_head); + vec3 in1=pull_vec3(ifconst(0)); + float in2=pull_float(ifconst(1)); + subtract; + push_vec3(in1); + } break; - case OPSubMat4Mat4: - push_mat4(pull_mat4()-pull_mat4()); + case OPSubVec4Vec4:{ + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + subtract; + push_vec4(in1); + } break; - case OPSubMat4Float: - push_mat4(pull_mat4()-pull_float()); + case OPSubVec4Float:{ + inputmask2(vec4_const_head,float_const_head); + vec4 in1=pull_vec4(ifconst(0)); + float in2=pull_float(ifconst(1)); + subtract; + push_vec4(in1); + } break; - case OPDivFloatFloat: - push_float(pull_float()/pull_float()); - break; - case OPDivVec2Vec2: - push_vec2(pull_vec2()/pull_vec2()); - break; - case OPDivVec2Float: - push_vec2(pull_vec2()/pull_float()); - break; - case OPDivVec3Vec3: - push_vec3(pull_vec3()/pull_vec3()); - break; - case OPDivVec3Float: - push_vec3(pull_vec3()/pull_float()); - break; - case OPDivVec4Vec4: - push_vec4(pull_vec4()/pull_vec4()); - break; - case OPDivVec4Float: - push_vec4(pull_vec4()/pull_float()); + case OPMulFloatFloat:{ + inputmask2(float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + multiply; + push_float(in1); + } break; - case OPDivMat2Mat2: - push_mat2(pull_mat2()/pull_mat2()); + case OPMulVec2Vec2:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + multiply; + push_vec2(in1); + } break; - case OPDivMat2Float: - push_mat2(pull_mat2()/pull_float()); + case OPMulVec2Float:{ + inputmask2(vec2_const_head,float_const_head); + vec2 in1=pull_vec2(ifconst(0)); + float in2=pull_float(ifconst(1)); + multiply; + push_vec2(in1); + } break; - case OPDivMat3Mat3: - push_mat3(pull_mat3()/pull_mat3()); + case OPMulVec3Vec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + multiply; + push_vec3(in1); + } break; - case OPDivMat3Float: - push_mat3(pull_mat3()/pull_float()); + case OPMulVec3Float:{ + inputmask2(vec3_const_head,float_const_head); + vec3 in1=pull_vec3(ifconst(0)); + float in2=pull_float(ifconst(1)); + multiply; + push_vec3(in1); + } break; - case OPDivMat4Mat4: - push_mat4(pull_mat4()/pull_mat4()); + case OPMulVec4Vec4:{ + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + multiply; + push_vec4(in1); + } break; - case OPDivMat4Float: - push_mat4(pull_mat4()/pull_float()); + case OPMulVec4Float:{ + inputmask2(vec4_const_head,float_const_head); + vec4 in1=pull_vec4(ifconst(0)); + float in2=pull_float(ifconst(1)); + multiply; + push_vec4(in1); + } break; - case OPModFloatFloat: - push_float(mod(pull_float(),pull_float())); - break; - case OPModVec2Vec2: - push_vec2(mod(pull_vec2(),pull_vec2())); - break; - case OPModVec3Vec3: - push_vec3(mod(pull_vec3(),pull_vec3())); - break; - case OPModVec4Vec4: - push_vec4(mod(pull_vec4(),pull_vec4())); - break; - case OPModVec2Float: - push_vec2(mod(pull_vec2(),pull_float())); + case OPDivFloatFloat:{ + inputmask2(float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + divide; + push_float(in1); + } break; - case OPModVec3Float: - push_vec3(mod(pull_vec3(),pull_float())); + case OPDivVec2Vec2:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + divide; + push_vec2(in1); + } break; - case OPModVec4Float: - push_vec4(mod(pull_vec4(),pull_float())); + case OPDivVec2Float:{ + inputmask2(vec2_const_head,float_const_head); + vec2 in1=pull_vec2(ifconst(0)); + float in2=pull_float(ifconst(1)); + divide; + push_vec2(in1); + } break; - - case OPPowFloatFloat: - push_float(pow(pull_float(),pull_float())); + case OPDivVec3Vec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + divide; + push_vec3(in1); + } break; - case OPPowVec2Vec2: - push_vec2(pow(pull_vec2(),pull_vec2())); + case OPDivVec3Float:{ + inputmask2(vec3_const_head,float_const_head); + vec3 in1=pull_vec3(ifconst(0)); + float in2=pull_float(ifconst(1)); + divide; + push_vec3(in1); + } break; - case OPPowVec3Vec3: - push_vec3(pow(pull_vec3(),pull_vec3())); + case OPDivVec4Vec4:{ + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + divide; + push_vec4(in1); + } break; - case OPPowVec4Vec4: - push_vec4(pow(pull_vec4(),pull_vec4())); + case OPDivVec4Float:{ + inputmask2(vec4_const_head,float_const_head); + vec4 in1=pull_vec4(ifconst(0)); + float in2=pull_float(ifconst(1)); + divide; + push_vec4(in1); + } break; - case OPCrossVec3: - push_vec3(cross(pull_vec3(),pull_vec3())); - break; - case OPDotVec2: - push_float(dot(pull_vec2(),pull_vec2())); - break; - case OPDotVec3: - push_float(dot(pull_vec3(),pull_vec3())); - break; - case OPDotVec4: - push_float(dot(pull_vec4(),pull_vec4())); - break; - case OPDistanceVec2: - push_float(distance(pull_vec2(),pull_vec2())); - break; - case OPDistanceVec3: - push_float(distance(pull_vec3(),pull_vec3())); - break; - case OPDistanceVec4: - push_float(distance(pull_vec4(),pull_vec4())); - break; - case OPLengthVec2: - push_float(length(pull_vec2())); - break; - case OPLengthVec3: - push_float(length(pull_vec3())); - break; - case OPLengthVec4: - push_float(length(pull_vec4())); - break; - case OPNormalizeVec2: - push_vec2(normalize(pull_vec2())); - break; - case OPNormalizeVec3: - push_vec3(normalize(pull_vec3())); - break; - case OPNormalizeVec4: - push_vec4(normalize(pull_vec4())); - break; - case OPTransposeMat2: - push_mat2(transpose(pull_mat2())); - break; - case OPTransposeMat3: - push_mat3(transpose(pull_mat3())); - break; - case OPTransposeMat4: - push_mat4(transpose(pull_mat4())); - break; - case OPInvertMat2: - push_mat2(inverse(pull_mat2())); - break; - case OPInvertMat3: - push_mat3(inverse(pull_mat3())); - break; - case OPInvertMat4: - push_mat4(inverse(pull_mat4())); + case OPPowFloatFloat:{ + inputmask2(float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + power; + push_float(in1); + } break; - case OPDeterminantMat2: - push_float(determinant(pull_mat2())); + case OPPowVec2Vec2:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + power; + push_vec2(in1); + } break; - case OPDeterminantMat3: - push_float(determinant(pull_mat3())); + case OPPowVec3Vec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + power; + push_vec3(in1); + } break; - case OPDeterminantMat4: - push_float(determinant(pull_mat4())); + case OPPowVec4Vec4:{ + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + power; + push_vec4(in1); + } break; - case OPAbsFloat: - push_float(abs(pull_float())); - break; - case OPSignFloat: - push_float(sign(pull_float())); + case OPModFloatFloat:{ + inputmask2(float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + modulo; + push_float(in1); + } break; - case OPFloorFloat: - push_float(floor(pull_float())); + case OPModVec2Vec2:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + modulo; + push_vec2(in1); + } break; - case OPCeilFloat: - push_float(ceil(pull_float())); + case OPModVec2Float:{ + inputmask2(vec2_const_head,float_const_head); + vec2 in1=pull_vec2(ifconst(0)); + float in2=pull_float(ifconst(1)); + modulo; + push_vec2(in1); + } break; - case OPFractFloat: - push_float(fract(pull_float())); + case OPModVec3Vec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + modulo; + push_vec3(in1); + } break; - case OPSqrtFloat: - push_float(sqrt(pull_float())); + case OPModVec3Float:{ + inputmask2(vec3_const_head,float_const_head); + vec3 in1=pull_vec3(ifconst(0)); + float in2=pull_float(ifconst(1)); + modulo; + push_vec3(in1); + } break; - case OPInverseSqrtFloat: - push_float(inversesqrt(pull_float())); + case OPModVec4Vec4:{ + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + modulo; + push_vec4(in1); + } break; - case OPExpFloat: - push_float(exp(pull_float())); + case OPModVec4Float:{ + inputmask2(vec4_const_head,float_const_head); + vec4 in1=pull_vec4(ifconst(0)); + float in2=pull_float(ifconst(1)); + modulo; + push_vec4(in1); + } break; - case OPExp2Float: - push_float(exp2(pull_float())); + + + case OPCrossVec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + push_vec3(cross(in1,in2)); + } break; - case OPLogFloat: - push_float(log(pull_float())); + + case OPDotVec2:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + float out1; + dotprod; + push_float(out1); + } break; - case OPLog2Float: - push_float(log2(pull_float())); + case OPDotVec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + float out1; + dotprod; + push_float(out1); + } break; - case OPSinFloat: - push_float(sin(pull_float())); + case OPDotVec4:{ + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + float out1; + dotprod; + push_float(out1); + } break; - case OPCosFloat: - push_float(cos(pull_float())); + + case OPLengthVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + float out1; + len; + push_float(out1); + } break; - case OPTanFloat: - push_float(tan(pull_float())); + case OPLengthVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + float out1; + len; + push_float(out1); + } break; - case OPAsinFloat: - push_float(asin(pull_float())); + case OPLengthVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + float out1; + len; + push_float(out1); + } break; - case OPAcosFloat: - push_float(acos(pull_float())); + + case OPDistanceVec2:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + float out1; + dist; + push_float(out1); + } break; - case OPAtanFloat: - push_float(atan(pull_float())); + case OPDistanceVec3:{ + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + float out1; + len; + push_float(out1); + } break; - case OPAsinhFloat: - push_float(asinh(pull_float())); + case OPDistanceVec4:{ + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + float out1; + dist; + push_float(out1); + } break; - case OPAcoshFloat: - push_float(acosh(pull_float())); + + case OPAbsFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + absolute; + push_float(in1); + } break; - case OPAtanhFloat: - push_float(atanh(pull_float())); + case OPSignFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + signof; + push_float(in1); + } break; - case OPSinhFloat: - push_float(sinh(pull_float())); + case OPFloorFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + floorof; + push_float(in1); + } break; - case OPCoshFloat: - push_float(cosh(pull_float())); + case OPCeilFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + ceilingof; + push_float(in1); + } break; - case OPTanhFloat: - push_float(tanh(pull_float())); + case OPFractFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + fractionalof;\ + push_float(in1); + } break; - case OPRoundFloat: - push_float(round(pull_float())); + case OPSqrtFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + squarerootof; + push_float(in1); + } break; - case OPTruncFloat: - push_float(trunc(pull_float())); + case OPInverseSqrtFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + inversesquarerootof; + push_float(in1); + } break; - case OPSwap2Float: - floattemp=float_stack[float_stack_head-1]; - float_stack[float_stack_head-1]=float_stack[float_stack_head-2]; - float_stack[float_stack_head-2]=floattemp; + case OPExpFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + exponentof; + push_float(in1); + } break; - case OPSwap3Float: - floattemp=float_stack[float_stack_head-1]; - float_stack[float_stack_head-1]=float_stack[float_stack_head-3]; - float_stack[float_stack_head-3]=floattemp; + case OPExp2Float: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + exponent2of; + push_float(in1); + } break; - case OPSwap4Float: - floattemp=float_stack[float_stack_head-1]; - float_stack[float_stack_head-1]=float_stack[float_stack_head-4]; - float_stack[float_stack_head-4]=floattemp; + case OPLogFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + logarithmof; + push_float(in1); + } break; - case OPDupFloat: - push_float(float_stack[float_stack_head-1]); + case OPLog2Float: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + logarithm2of; + push_float(in1); + } break; - case OPDup2Float: - push_float(float_stack[float_stack_head-2]); + case OPSinFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + sineof; + push_float(in1); + } break; - case OPDup3Float: - push_float(float_stack[float_stack_head-3]); + case OPCosFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + cosineof; + push_float(in1); + } break; - case OPDup4Float: - push_float(float_stack[float_stack_head-4]); + case OPTanFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + tangentof; + push_float(in1); + } break; - case OPDropFloat: - float_stack_head--; + case OPAsinFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + arcsineof; + push_float(in1); + } break; - case OPDrop2Float: - float_stack[float_stack_head-2]=float_stack[float_stack_head-1]; - float_stack_head--; + case OPAcosFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + arccosineof; + push_float(in1); + } break; - case OPDrop3Float: - float_stack[float_stack_head-3]=float_stack[float_stack_head-2]; - float_stack[float_stack_head-2]=float_stack[float_stack_head-1]; - float_stack_head--; + case OPAtanFloat: { + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + arctangentof; + push_float(in1); + } break; - case OPDrop4Float: - float_stack[float_stack_head-4]=float_stack[float_stack_head-3]; - float_stack[float_stack_head-3]=float_stack[float_stack_head-2]; - float_stack[float_stack_head-2]=float_stack[float_stack_head-1]; - float_stack_head--; + case OPAcoshFloat:{ + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + hyperbolicarccosineof; + push_float(in1); + } break; - - case OPAbsVec2: - push_vec2(abs(pull_vec2())); + case OPAsinhFloat:{ + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + hyperbolicarcsineof; + push_float(in1); + } break; - case OPSignVec2: - push_vec2(sign(pull_vec2())); + case OPAtanhFloat:{ + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + hyperbolicarctangentof; + push_float(in1); + } break; - case OPFloorVec2: - push_vec2(floor(pull_vec2())); + case OPCoshFloat:{ + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + hyperboliccosineof; + push_float(in1); + } break; - case OPCeilVec2: - push_vec2(ceil(pull_vec2())); + case OPSinhFloat:{ + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + hyperbolicsineof; + push_float(in1); + } break; - case OPFractVec2: - push_vec2(fract(pull_vec2())); + case OPTanhFloat:{ + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + hyperbolictangentof; + push_float(in1); + } break; - case OPSqrtVec2: - push_vec2(sqrt(pull_vec2())); + case OPRoundFloat:{ + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + roundof; + push_float(in1); + } break; - case OPInverseSqrtVec2: - push_vec2(inversesqrt(pull_vec2())); + case OPTruncFloat:{ + inputmask1(float_const_head); + float in1=pull_float(ifconst(0)); + truncof; + push_float(in1); + } break; - case OPExpVec2: - push_vec2(exp(pull_vec2())); + case OPMinMaterialFloat: + case OPMinFloat: { + inputmask2(float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + minimum; + push_float(in1); + } break; - case OPExp2Vec2: - push_vec2(exp2(pull_vec2())); + case OPMaxMaterialFloat: + case OPMaxFloat: { + inputmask2(float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + maximum; + push_float(in1); + } break; - case OPLogVec2: - push_vec2(log(pull_vec2())); + case OPFMAFloat: { + inputmask3(float_const_head,float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + float in3=pull_float(ifconst(2)); + fmaof; + push_float(in1); + } break; - case OPLog2Vec2: - push_vec2(log2(pull_vec2())); + + case OPAbsVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + absolute; + push_vec2(in1); + } break; - case OPSinVec2: - push_vec2(sin(pull_vec2())); + case OPSignVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + signof; + push_vec2(in1); + } break; - case OPCosVec2: - push_vec2(cos(pull_vec2())); + case OPFloorVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + floorof; + push_vec2(in1); + } break; - case OPTanVec2: - push_vec2(tan(pull_vec2())); + case OPCeilVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + ceilingof; + push_vec2(in1); + } break; - case OPAsinVec2: - push_vec2(asin(pull_vec2())); + case OPFractVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + fractionalof; + push_vec2(in1); + } break; - case OPAcosVec2: - push_vec2(acos(pull_vec2())); + case OPSqrtVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + squarerootof; + push_vec2(in1); + } break; - case OPAtanVec2: - push_vec2(atan(pull_vec2())); + case OPInverseSqrtVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + inversesquarerootof; + push_vec2(in1); + } break; - case OPAsinhVec2: - push_vec2(asinh(pull_vec2())); + case OPExpVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + exponentof; + push_vec2(in1); + } break; - case OPAcoshVec2: - push_vec2(acosh(pull_vec2())); + case OPExp2Vec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + exponent2of; + push_vec2(in1); + } break; - case OPAtanhVec2: - push_vec2(atanh(pull_vec2())); + case OPLogVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + logarithmof; + push_vec2(in1); + } break; - case OPSinhVec2: - push_vec2(sinh(pull_vec2())); + case OPLog2Vec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + logarithm2of; + push_vec2(in1); + } break; - case OPCoshVec2: - push_vec2(cosh(pull_vec2())); + case OPSinVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + sineof; + push_vec2(in1); + } break; - case OPTanhVec2: - push_vec2(tanh(pull_vec2())); + case OPCosVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + cosineof; + push_vec2(in1); + } break; - case OPRoundVec2: - push_vec2(round(pull_vec2())); + case OPTanVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + tangentof; + push_vec2(in1); + } break; - case OPTruncVec2: - push_vec2(trunc(pull_vec2())); + case OPAsinVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + arcsineof; + push_vec2(in1); + } break; - case OPSwap2Vec2: - vec2temp=vec2_stack[vec2_stack_head-1]; - vec2_stack[vec2_stack_head-1]=vec2_stack[vec2_stack_head-2]; - vec2_stack[vec2_stack_head-2]=vec2temp; + case OPAcosVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + arccosineof; + push_vec2(in1); + } break; - case OPSwap3Vec2: - vec2temp=vec2_stack[vec2_stack_head-1]; - vec2_stack[vec2_stack_head-1]=vec2_stack[vec2_stack_head-3]; - vec2_stack[vec2_stack_head-3]=vec2temp; + case OPAtanVec2: { + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + arctangentof; + push_vec2(in1); + } break; - case OPSwap4Vec2: - vec2temp=vec2_stack[vec2_stack_head-1]; - vec2_stack[vec2_stack_head-1]=vec2_stack[vec2_stack_head-4]; - vec2_stack[vec2_stack_head-4]=vec2temp; + case OPAcoshVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + hyperbolicarccosineof; + push_vec2(in1); + } break; - case OPDupVec2: - push_vec2(vec2_stack[vec2_stack_head-1]); + case OPAsinhVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + hyperbolicarcsineof; + push_vec2(in1); + } break; - case OPDup2Vec2: - push_vec2(vec2_stack[vec2_stack_head-2]); + case OPAtanhVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + hyperbolicarctangentof; + push_vec2(in1); + } break; - case OPDup3Vec2: - push_vec2(vec2_stack[vec2_stack_head-3]); + case OPCoshVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + hyperboliccosineof; + push_vec2(in1); + } break; - case OPDup4Vec2: - push_vec2(vec2_stack[vec2_stack_head-4]); + case OPSinhVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + hyperbolicsineof; + push_vec2(in1); + } break; - case OPDropVec2: - vec2_stack_head--; + case OPTanhVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + hyperbolictangentof; + push_vec2(in1); + } break; - case OPDrop2Vec2: - vec2_stack[vec2_stack_head-2]=vec2_stack[vec2_stack_head-1]; - vec2_stack_head--; + case OPRoundVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + roundof; + push_vec2(in1); + } break; - case OPDrop3Vec2: - vec2_stack[vec2_stack_head-3]=vec2_stack[vec2_stack_head-2]; - vec2_stack[vec2_stack_head-2]=vec2_stack[vec2_stack_head-1]; - vec2_stack_head--; + case OPTruncVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + truncof; + push_vec2(in1); + } break; - case OPDrop4Vec2: - vec2_stack[vec2_stack_head-4]=vec2_stack[vec2_stack_head-3]; - vec2_stack[vec2_stack_head-3]=vec2_stack[vec2_stack_head-2]; - vec2_stack[vec2_stack_head-2]=vec2_stack[vec2_stack_head-1]; - vec2_stack_head--; + case OPMinVec2: { + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + minimum; + push_vec2(in1); + } break; - - case OPAbsVec3: - push_vec3(abs(pull_vec3())); + case OPMaxVec2: { + inputmask2(vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + maximum; + push_vec2(in1); + } break; - case OPSignVec3: - push_vec3(sign(pull_vec3())); + case OPFMAVec2: { + inputmask3(vec2_const_head,vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + vec2 in3=pull_vec2(ifconst(2)); + fmaof; + push_vec2(in1); + } break; - case OPFloorVec3: - push_vec3(floor(pull_vec3())); + + case OPAbsVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + absolute; + push_vec3(in1); + } break; - case OPCeilVec3: - push_vec3(ceil(pull_vec3())); + case OPSignVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + signof; + push_vec3(in1); + } break; - case OPFractVec3: - push_vec3(fract(pull_vec3())); + case OPFloorVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + floorof; + push_vec3(in1); + } break; - case OPSqrtVec3: - push_vec3(sqrt(pull_vec3())); + case OPCeilVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + ceilingof; + push_vec3(in1); + } break; - case OPInverseSqrtVec3: - push_vec3(inversesqrt(pull_vec3())); + case OPFractVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + fractionalof; + push_vec3(in1); + } break; - case OPExpVec3: - push_vec3(exp(pull_vec3())); + case OPSqrtVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + squarerootof; + push_vec3(in1); + } break; - case OPExp2Vec3: - push_vec3(exp2(pull_vec3())); + case OPInverseSqrtVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + inversesquarerootof; + push_vec3(in1); + } break; - case OPLogVec3: - push_vec3(log(pull_vec3())); + case OPExpVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + exponentof; + push_vec3(in1); + } break; - case OPLog2Vec3: - push_vec3(log2(pull_vec3())); + case OPExp2Vec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + exponent2of; + push_vec3(in1); + } break; - case OPSinVec3: - push_vec3(sin(pull_vec3())); + case OPLogVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + logarithmof; + push_vec3(in1); + } break; - case OPCosVec3: - push_vec3(cos(pull_vec3())); + case OPLog2Vec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + logarithm2of; + push_vec3(in1); + } break; - case OPTanVec3: - push_vec3(tan(pull_vec3())); + case OPSinVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + sineof; + push_vec3(in1); + } break; - case OPAsinVec3: - push_vec3(asin(pull_vec3())); + case OPCosVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + cosineof; + push_vec3(in1); + } break; - case OPAcosVec3: - push_vec3(acos(pull_vec3())); + case OPTanVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + tangentof; + push_vec3(in1); + } break; - case OPAtanVec3: - push_vec3(atan(pull_vec3())); + case OPAsinVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + arcsineof; + push_vec3(in1); + } break; - case OPAsinhVec3: - push_vec3(asinh(pull_vec3())); + case OPAcosVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + arccosineof; + push_vec3(in1); + } break; - case OPAcoshVec3: - push_vec3(acosh(pull_vec3())); + case OPAtanVec3: { + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + arctangentof; + push_vec3(in1); + } break; - case OPAtanhVec3: - push_vec3(atanh(pull_vec3())); + case OPAcoshVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + hyperbolicarccosineof; + push_vec3(in1); + } break; - case OPSinhVec3: - push_vec3(sinh(pull_vec3())); + case OPAsinhVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + hyperbolicarcsineof; + push_vec3(in1); + } break; - case OPCoshVec3: - push_vec3(cosh(pull_vec3())); + case OPAtanhVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + hyperbolicarctangentof; + push_vec3(in1); + } break; - case OPTanhVec3: - push_vec3(tanh(pull_vec3())); + case OPCoshVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + hyperboliccosineof; + push_vec3(in1); + } break; - case OPRoundVec3: - push_vec3(round(pull_vec3())); + case OPSinhVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + hyperbolicsineof; + push_vec3(in1); + } break; - case OPTruncVec3: - push_vec3(trunc(pull_vec3())); + case OPTanhVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + hyperbolictangentof; + push_vec3(in1); + } break; - case OPSwap2Vec3: - vec3temp=vec3_stack[vec3_stack_head-1]; - vec3_stack[vec3_stack_head-1]=vec3_stack[vec3_stack_head-2]; - vec3_stack[vec3_stack_head-2]=vec3temp; + case OPRoundVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + roundof; + push_vec3(in1); + } break; - case OPSwap3Vec3: - vec3temp=vec3_stack[vec3_stack_head-1]; - vec3_stack[vec3_stack_head-1]=vec3_stack[vec3_stack_head-3]; - vec3_stack[vec3_stack_head-3]=vec3temp; + case OPTruncVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + truncof; + push_vec3(in1); + } break; - case OPSwap4Vec3: - vec3temp=vec3_stack[vec3_stack_head-1]; - vec3_stack[vec3_stack_head-1]=vec3_stack[vec3_stack_head-4]; - vec3_stack[vec3_stack_head-4]=vec3temp; + case OPMinVec3: { + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + minimum; + push_vec3(in1); + } break; - case OPDupVec3: - push_vec3(vec3_stack[vec3_stack_head-1]); + case OPMaxVec3: { + inputmask2(vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + maximum; + push_vec3(in1); + } break; - case OPDup2Vec3: - push_vec3(vec3_stack[vec3_stack_head-2]); + case OPFMAVec3: { + inputmask3(vec3_const_head,vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + vec3 in3=pull_vec3(ifconst(2)); + fmaof; + push_vec3(in1); + } break; - case OPDup3Vec3: - push_vec3(vec3_stack[vec3_stack_head-3]); + + case OPAbsVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + absolute; + push_vec4(in1); + } break; - case OPDup4Vec3: - push_vec3(vec3_stack[vec3_stack_head-4]); + case OPSignVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + signof; + push_vec4(in1); + } break; - case OPDropVec3: - vec3_stack_head--; + case OPFloorVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + floorof; + push_vec4(in1); + } break; - case OPDrop2Vec3: - vec3_stack[vec3_stack_head-2]=vec3_stack[vec3_stack_head-1]; - vec3_stack_head--; + case OPCeilVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + ceilingof; + push_vec4(in1); + } break; - case OPDrop3Vec3: - vec3_stack[vec3_stack_head-3]=vec3_stack[vec3_stack_head-2]; - vec3_stack[vec3_stack_head-2]=vec3_stack[vec3_stack_head-1]; - vec3_stack_head--; + case OPFractVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + fractionalof; + push_vec4(in1); + } break; - case OPDrop4Vec3: - vec3_stack[vec3_stack_head-4]=vec3_stack[vec3_stack_head-3]; - vec3_stack[vec3_stack_head-3]=vec3_stack[vec3_stack_head-2]; - vec3_stack[vec3_stack_head-2]=vec3_stack[vec3_stack_head-1]; - vec3_stack_head--; + case OPSqrtVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + squarerootof; + push_vec4(in1); + } break; - - case OPAbsVec4: - push_vec4(abs(pull_vec4())); + case OPInverseSqrtVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + inversesquarerootof; + push_vec4(in1); + } break; - case OPSignVec4: - push_vec4(sign(pull_vec4())); + case OPExpVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + exponentof; + push_vec4(in1); + } break; - case OPFloorVec4: - push_vec4(floor(pull_vec4())); + case OPExp2Vec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + exponent2of; + push_vec4(in1); + } break; - case OPCeilVec4: - push_vec4(ceil(pull_vec4())); + case OPLogVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + logarithmof; + push_vec4(in1); + } break; - case OPFractVec4: - push_vec4(fract(pull_vec4())); + case OPLog2Vec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + logarithm2of; + push_vec4(in1); + } break; - case OPSqrtVec4: - push_vec4(sqrt(pull_vec4())); + case OPSinVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + sineof; + push_vec4(in1); + } break; - case OPInverseSqrtVec4: - push_vec4(inversesqrt(pull_vec4())); + case OPCosVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + cosineof; + push_vec4(in1); + } break; - case OPExpVec4: - push_vec4(exp(pull_vec4())); + case OPTanVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + tangentof; + push_vec4(in1); + } break; - case OPExp2Vec4: - push_vec4(exp2(pull_vec4())); + case OPAsinVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + arcsineof; + push_vec4(in1); + } break; - case OPLogVec4: - push_vec4(log(pull_vec4())); + case OPAcosVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + arccosineof; + push_vec4(in1); + } break; - case OPLog2Vec4: - push_vec4(log2(pull_vec4())); + case OPAtanVec4: { + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + arctangentof; + push_vec4(in1); + } break; - case OPSinVec4: - push_vec4(sin(pull_vec4())); + case OPAcoshVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + hyperbolicarccosineof; + push_vec4(in1); + } break; - case OPCosVec4: - push_vec4(cos(pull_vec4())); + case OPAsinhVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + hyperbolicarcsineof; + push_vec4(in1); + } break; - case OPTanVec4: - push_vec4(tan(pull_vec4())); + case OPAtanhVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + hyperbolicarctangentof; + push_vec4(in1); + } break; - case OPAsinVec4: - push_vec4(asin(pull_vec4())); + case OPCoshVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + hyperboliccosineof; + push_vec4(in1); + } break; - case OPAcosVec4: - push_vec4(acos(pull_vec4())); + case OPSinhVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + hyperbolicsineof; + push_vec4(in1); + } break; - case OPAtanVec4: - push_vec4(atan(pull_vec4())); + case OPTanhVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + hyperbolictangentof; + push_vec4(in1); + } break; - case OPAsinhVec4: - push_vec4(asinh(pull_vec4())); + case OPRoundVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + roundof; + push_vec4(in1); + } break; - case OPAcoshVec4: - push_vec4(acosh(pull_vec4())); + case OPTruncVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + truncof; + push_vec4(in1); + } break; - case OPAtanhVec4: - push_vec4(atanh(pull_vec4())); + case OPMinVec4: { + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + minimum; + push_vec4(in1); + } break; - case OPSinhVec4: - push_vec4(sinh(pull_vec4())); + case OPMaxVec4: { + inputmask2(vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + maximum; + push_vec4(in1); + } break; - case OPCoshVec4: - push_vec4(cosh(pull_vec4())); + case OPFMAVec4: { + inputmask3(vec4_const_head,vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + vec4 in3=pull_vec4(ifconst(2)); + fmaof; + push_vec4(in1); + } break; - case OPTanhVec4: - push_vec4(tanh(pull_vec4())); + + case OPClampFloatFloat:{ + inputmask3(float_const_head,float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + float in3=pull_float(ifconst(2)); + clampof; + push_float(in1); + } break; - case OPRoundVec4: - push_vec4(round(pull_vec4())); + case OPMixFloatFloat:{ + inputmask3(float_const_head,float_const_head,float_const_head); + float in1=pull_float(ifconst(0)); + float in2=pull_float(ifconst(1)); + float in3=pull_float(ifconst(2)); + mixof; + push_float(in1); + } break; - case OPTruncVec4: - push_vec4(trunc(pull_vec4())); + case OPClampVec2Vec2:{ + inputmask3(vec2_const_head,vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + vec2 in3=pull_vec2(ifconst(2)); + clampof; + push_vec2(in1); + } break; - case OPSwap2Vec4: - vec4temp=vec4_stack[vec4_stack_head-1]; - vec4_stack[vec4_stack_head-1]=vec4_stack[vec4_stack_head-2]; - vec4_stack[vec4_stack_head-2]=vec4temp; + case OPMixVec2Vec2:{ + inputmask3(vec2_const_head,vec2_const_head,vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + vec2 in3=pull_vec2(ifconst(2)); + mixof; + push_vec2(in1); + } break; - case OPSwap3Vec4: - vec4temp=vec4_stack[vec4_stack_head-1]; - vec4_stack[vec4_stack_head-1]=vec4_stack[vec4_stack_head-3]; - vec4_stack[vec4_stack_head-3]=vec4temp; + case OPClampVec2Float:{ + inputmask3(vec2_const_head,float_const_head,float_const_head); + vec2 in1=pull_vec2(ifconst(0)); + float in2=pull_float(ifconst(1)); + float in3=pull_float(ifconst(2)); + clampof; + push_vec2(in1); + } break; - case OPSwap4Vec4: - vec4temp=vec4_stack[vec4_stack_head-1]; - vec4_stack[vec4_stack_head-1]=vec4_stack[vec4_stack_head-4]; - vec4_stack[vec4_stack_head-4]=vec4temp; + case OPMixVec2Float:{ + inputmask3(vec2_const_head,vec2_const_head,float_const_head); + vec2 in1=pull_vec2(ifconst(0)); + vec2 in2=pull_vec2(ifconst(1)); + float in3=pull_float(ifconst(2)); + mixof; + push_vec2(in1); + } break; - case OPDupVec4: - push_vec4(vec4_stack[vec4_stack_head-1]); + case OPClampVec3Vec3:{ + inputmask3(vec3_const_head,vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + vec3 in3=pull_vec3(ifconst(2)); + clampof; + push_vec3(in1); + } break; - case OPDup2Vec4: - push_vec4(vec4_stack[vec4_stack_head-2]); + case OPMixVec3Vec3:{ + inputmask3(vec3_const_head,vec3_const_head,vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + vec3 in3=pull_vec3(ifconst(2)); + mixof; + push_vec3(in1); + } break; - case OPDup3Vec4: - push_vec4(vec4_stack[vec4_stack_head-3]); + case OPClampVec3Float:{ + inputmask3(vec3_const_head,float_const_head,float_const_head); + vec3 in1=pull_vec3(ifconst(0)); + float in2=pull_float(ifconst(1)); + float in3=pull_float(ifconst(2)); + clampof; + push_vec3(in1); + } break; - case OPDup4Vec4: - push_vec4(vec4_stack[vec4_stack_head-4]); + case OPMixVec3Float:{ + inputmask3(vec3_const_head,vec3_const_head,float_const_head); + vec3 in1=pull_vec3(ifconst(0)); + vec3 in2=pull_vec3(ifconst(1)); + float in3=pull_float(ifconst(2)); + mixof; + push_vec3(in1); + } break; - case OPDropVec4: - vec4_stack_head--; + case OPClampVec4Vec4:{ + inputmask3(vec4_const_head,vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + vec4 in3=pull_vec4(ifconst(2)); + clampof; + push_vec4(in1); + } break; - case OPDrop2Vec4: - vec4_stack[vec4_stack_head-2]=vec4_stack[vec4_stack_head-1]; - vec4_stack_head--; + case OPMixVec4Vec4:{ + inputmask3(vec4_const_head,vec4_const_head,vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + vec4 in3=pull_vec4(ifconst(2)); + mixof; + push_vec4(in1); + } break; - case OPDrop3Vec4: - vec4_stack[vec4_stack_head-3]=vec4_stack[vec4_stack_head-2]; - vec4_stack[vec4_stack_head-2]=vec4_stack[vec4_stack_head-1]; - vec4_stack_head--; + case OPClampVec4Float:{ + inputmask3(vec4_const_head,float_const_head,float_const_head); + vec4 in1=pull_vec4(ifconst(0)); + float in2=pull_float(ifconst(1)); + float in3=pull_float(ifconst(2)); + clampof; + push_vec4(in1); + } break; - case OPDrop4Vec4: - vec4_stack[vec4_stack_head-4]=vec4_stack[vec4_stack_head-3]; - vec4_stack[vec4_stack_head-3]=vec4_stack[vec4_stack_head-2]; - vec4_stack[vec4_stack_head-2]=vec4_stack[vec4_stack_head-1]; - vec4_stack_head--; + case OPMixVec4Float:{ + inputmask3(vec4_const_head,vec4_const_head,float_const_head); + vec4 in1=pull_vec4(ifconst(0)); + vec4 in2=pull_vec4(ifconst(1)); + float in3=pull_float(ifconst(2)); + mixof; + push_vec4(in1); + } break; - case OPSwap2Mat2: - mat2temp=mat2_stack[mat2_stack_head-1]; - mat2_stack[mat2_stack_head-1]=mat2_stack[mat2_stack_head-2]; - mat2_stack[mat2_stack_head-2]=mat2temp; - break; - case OPSwap3Mat2: - mat2temp=mat2_stack[mat2_stack_head-1]; - mat2_stack[mat2_stack_head-1]=mat2_stack[mat2_stack_head-3]; - mat2_stack[mat2_stack_head-3]=mat2temp; - break; - case OPSwap4Mat2: - mat2temp=mat2_stack[mat2_stack_head-1]; - mat2_stack[mat2_stack_head-1]=mat2_stack[mat2_stack_head-4]; - mat2_stack[mat2_stack_head-4]=mat2temp; - break; - case OPDupMat2: - push_mat2(mat2_stack[mat2_stack_head-1]); - break; - case OPDup2Mat2: - push_mat2(mat2_stack[mat2_stack_head-2]); - break; - case OPDup3Mat2: - push_mat2(mat2_stack[mat2_stack_head-3]); - break; - case OPDup4Mat2: - push_mat2(mat2_stack[mat2_stack_head-4]); - break; - case OPDropMat2: - mat2_stack_head--; - break; - case OPDrop2Mat2: - mat2_stack[mat2_stack_head-2]=mat2_stack[mat2_stack_head-1]; - mat2_stack_head--; - break; - case OPDrop3Mat2: - mat2_stack[mat2_stack_head-3]=mat2_stack[mat2_stack_head-2]; - mat2_stack[mat2_stack_head-2]=mat2_stack[mat2_stack_head-1]; - mat2_stack_head--; + case OPNormalizeVec2:{ + inputmask1(vec2_const_head); + vec2 in1=pull_vec2(ifconst(0)); + push_vec2(normalize(in1)); + } break; - case OPDrop4Mat2: - mat2_stack[mat2_stack_head-4]=mat2_stack[mat2_stack_head-3]; - mat2_stack[mat2_stack_head-3]=mat2_stack[mat2_stack_head-2]; - mat2_stack[mat2_stack_head-2]=mat2_stack[mat2_stack_head-1]; - mat2_stack_head--; + case OPNormalizeVec3:{ + inputmask1(vec3_const_head); + vec3 in1=pull_vec3(ifconst(0)); + push_vec3(normalize(in1)); + } break; - - case OPSwap2Mat3: - mat3temp=mat3_stack[mat3_stack_head-1]; - mat3_stack[mat3_stack_head-1]=mat3_stack[mat3_stack_head-2]; - mat3_stack[mat3_stack_head-2]=mat3temp; + case OPNormalizeVec4:{ + inputmask1(vec4_const_head); + vec4 in1=pull_vec4(ifconst(0)); + push_vec4(normalize(in1)); + } break; - case OPSwap3Mat3: - mat3temp=mat3_stack[mat3_stack_head-1]; - mat3_stack[mat3_stack_head-1]=mat3_stack[mat3_stack_head-3]; - mat3_stack[mat3_stack_head-3]=mat3temp; + + case OPPromoteFloatFloatVec2:{ + inputmask2(float_const_head,float_const_head); + float a = pull_float(ifconst(0)); + float b = pull_float(ifconst(1)); + push_vec2(vec2 (a,b)); + } break; - case OPSwap4Mat3: - mat3temp=mat3_stack[mat3_stack_head-1]; - mat3_stack[mat3_stack_head-1]=mat3_stack[mat3_stack_head-4]; - mat3_stack[mat3_stack_head-4]=mat3temp; + case OPPromoteFloatFloatFloatVec3:{ + inputmask3(float_const_head,float_const_head,float_const_head); + float a = pull_float(ifconst(0)); + float b = pull_float(ifconst(1)); + float c = pull_float(ifconst(2)); + push_vec3(vec3 (a,b,c)); + } break; - case OPDupMat3: - push_mat3(mat3_stack[mat3_stack_head-1]); + case OPPromoteVec2FloatVec3:{ + inputmask2(vec2_const_head,float_const_head); + vec2 a = pull_vec2(ifconst(0)); + float b = pull_float(ifconst(1)); + push_vec3(vec3 (a,b)); + } break; - case OPDup2Mat3: - push_mat3(mat3_stack[mat3_stack_head-2]); + case OPPromoteFloatFloatFloatFloatVec4:{ + inputmask4(float_const_head,float_const_head,float_const_head,float_const_head); + float a = pull_float(ifconst(0)); + float b = pull_float(ifconst(1)); + float c = pull_float(ifconst(2)); + float d = pull_float(ifconst(3)); + push_vec4(vec4 (a,b,c,d)); + } break; - case OPDup3Mat3: - push_mat3(mat3_stack[mat3_stack_head-3]); + case OPPromoteVec2FloatFloatVec4:{ + inputmask3(vec2_const_head,float_const_head,float_const_head); + vec2 a = pull_vec2(ifconst(0)); + float b = pull_float(ifconst(1)); + float c = pull_float(ifconst(2)); + push_vec4(vec4 (a,b,c)); + } break; - case OPDup4Mat3: - push_mat3(mat3_stack[mat3_stack_head-4]); + case OPPromoteVec3FloatVec4:{ + inputmask2(vec3_const_head,float_const_head); + vec3 a = pull_vec3(ifconst(0)); + float b = pull_float(ifconst(1)); + push_vec4(vec4 (a,b)); + } break; - case OPDropMat3: - mat3_stack_head--; + case OPPromoteVec2Vec2Vec4:{ + inputmask2(vec2_const_head,vec2_const_head); + vec2 a = pull_vec2(ifconst(0)); + vec2 b = pull_vec2(ifconst(1)); + push_vec4(vec4 (a,b)); + } break; - case OPDrop2Mat3: - mat3_stack[mat3_stack_head-2]=mat3_stack[mat3_stack_head-1]; - mat3_stack_head--; + + /* + case OPDemoteMat2Float:{ + mat2 mat2temp=pull_mat2(ifconst(0)); + push_float(float (mat2temp[0][1].y,mat2temp[1][1].y)); + push_float(float (mat2temp[0][1].x,mat2temp[1][1].x)); + push_float(float (mat2temp[0][0].y,mat2temp[1][0].y)); + push_float(float (mat2temp[0][0].x,mat2temp[1][0].x)); + } break; - case OPDrop3Mat3: - mat3_stack[mat3_stack_head-3]=mat3_stack[mat3_stack_head-2]; - mat3_stack[mat3_stack_head-2]=mat3_stack[mat3_stack_head-1]; - mat3_stack_head--; + case OPDemoteMat2Vec2:{ + mat2 mat2temp=pull_mat2(ifconst(0)); + push_vec2(vec2 (mat2temp[0][1],mat2temp[1][1])); + push_vec2(vec2 (mat2temp[0][0],mat2temp[1][0])); + } break; - case OPDrop4Mat3: - mat3_stack[mat3_stack_head-4]=mat3_stack[mat3_stack_head-3]; - mat3_stack[mat3_stack_head-3]=mat3_stack[mat3_stack_head-2]; - mat3_stack[mat3_stack_head-2]=mat3_stack[mat3_stack_head-1]; - mat3_stack_head--; + case OPDemoteMat3Vec3:{ + mat3 mat3temp=pull_mat3(ifconst(0)); + push_vec3(vec3 (mat3temp[0] ,mat3temp[1] )); + push_vec3(vec3 (mat3temp[0][1],mat3temp[1][1])); + push_vec3(vec3 (mat3temp[0][0],mat3temp[1][0])); + } break; - - case OPSwap2Mat4: - mat4temp=mat4_stack[mat4_stack_head-1]; - mat4_stack[mat4_stack_head-1]=mat4_stack[mat4_stack_head-2]; - mat4_stack[mat4_stack_head-2]=mat4temp; + case OPDemoteMat4Vec4:{ + mat4 mat4temp=pull_mat4(ifconst(0)); + push_vec4(vec4 (mat4temp[0][3],mat4temp[1][3])); + push_vec4(vec4 (mat4temp[0] ,mat4temp[1] )); + push_vec4(vec4 (mat4temp[0][1],mat4temp[1][1])); + push_vec4(vec4 (mat4temp[0][0],mat4temp[1][0])); + } break; - case OPSwap3Mat4: - mat4temp=mat4_stack[mat4_stack_head-1]; - mat4_stack[mat4_stack_head-1]=mat4_stack[mat4_stack_head-3]; - mat4_stack[mat4_stack_head-3]=mat4temp; + case OPDemoteMat2Vec4:{ + mat2 mat2temp=pull_mat2(ifconst(0)); + push_vec4(vec4 (vec4(mat2temp[0][0],mat2temp[0][1]),vec4(mat2temp[1][0],mat2temp[1][1]))); + } break; - case OPSwap4Mat4: - mat4temp=mat4_stack[mat4_stack_head-1]; - mat4_stack[mat4_stack_head-1]=mat4_stack[mat4_stack_head-4]; - mat4_stack[mat4_stack_head-4]=mat4temp; + case OPDemoteVec2FloatFloat:{ + vec2 vec2temp=pull_vec2(ifconst(0)); + push_float(float (vec2temp[0].y,vec2temp[1].y)); + push_float(float (vec2temp[0].x,vec2temp[1].x)); + } break; - case OPDupMat4: - push_mat4(mat4_stack[mat4_stack_head-1]); + case OPDemoteVec3FloatFloatFloat:{ + vec3 vec3temp=pull_vec3(ifconst(0)); + push_float(float (vec3temp[0].z,vec3temp[1].z)); + push_float(float (vec3temp[0].y,vec3temp[1].y)); + push_float(float (vec3temp[0].x,vec3temp[1].x)); + } break; - case OPDup2Mat4: - push_mat4(mat4_stack[mat4_stack_head-2]); + case OPDemoteVec4FloatFloatFloatFloat:{ + vec4 vec4temp=pull_vec4(ifconst(0)); + push_float(float (vec4temp[0].w,vec4temp[1].w)); + push_float(float (vec4temp[0].z,vec4temp[1].z)); + push_float(float (vec4temp[0].y,vec4temp[1].y)); + push_float(float (vec4temp[0].x,vec4temp[1].x)); + } break; - case OPDup3Mat4: - push_mat4(mat4_stack[mat4_stack_head-3]); + */ + + case OPSquareFloat:{ + inputmask1(float_const_head); + float in1 = pull_float(ifconst(0)); + square; + push_float(in1); + } break; - case OPDup4Mat4: - push_mat4(mat4_stack[mat4_stack_head-4]); + case OPCubeFloat:{ + inputmask1(float_const_head); + float in1 = pull_float(ifconst(0)); + cube; + push_float(in1); + } break; - case OPDropMat4: - mat4_stack_head--; + case OPSquareVec2:{ + inputmask1(vec2_const_head); + vec2 in1 = pull_vec2(ifconst(0)); + square; + push_vec2(in1); + } break; - case OPDrop2Mat4: - mat4_stack[mat4_stack_head-2]=mat4_stack[mat4_stack_head-1]; - mat4_stack_head--; + case OPCubeVec2:{ + inputmask1(vec2_const_head); + vec2 in1 = pull_vec2(ifconst(0)); + cube; + push_vec2(in1); + } break; - case OPDrop3Mat4: - mat4_stack[mat4_stack_head-3]=mat4_stack[mat4_stack_head-2]; - mat4_stack[mat4_stack_head-2]=mat4_stack[mat4_stack_head-1]; - mat4_stack_head--; + case OPSquareVec3:{ + inputmask1(vec3_const_head); + vec3 in1 = pull_vec3(ifconst(0)); + square; + push_vec3(in1); + } break; - case OPDrop4Mat4: - mat4_stack[mat4_stack_head-4]=mat4_stack[mat4_stack_head-3]; - mat4_stack[mat4_stack_head-3]=mat4_stack[mat4_stack_head-2]; - mat4_stack[mat4_stack_head-2]=mat4_stack[mat4_stack_head-1]; - mat4_stack_head--; + case OPCubeVec3:{ + inputmask1(vec3_const_head); + vec3 in1 = pull_vec3(ifconst(0)); + cube; + push_vec3(in1); + } break; - - case OPMinFloat: - push_float(min(pull_float(),pull_float())); + case OPSquareVec4:{ + inputmask1(vec4_const_head); + vec4 in1 = pull_vec4(ifconst(0)); + square; + push_vec4(in1); + } break; - case OPMaxFloat: - push_float(max(pull_float(),pull_float())); + case OPCubeVec4:{ + inputmask1(vec4_const_head); + vec4 in1 = pull_vec4(ifconst(0)); + cube; + push_vec4(in1); + } break; + + case OPSmoothMinMaterialFloat: case OPSmoothMinFloat:{ - float k=pull_float(); - float a=pull_float(); - float b=pull_float(); - float h=max(k-abs(a-b),0.)/k; - push_float(min(a,b)-h*h*k*(1./4.)); - } - break; - case OPSmoothMinMaterialFloat:{ - float k=pull_float(); - float a=pull_float(); - float b=pull_float(); - float h=max(k-abs(a-b),0.)/k; - float m=h*h*.5; - float s=m*k*(1./2.); - push_float(min(a,b)-s); - if(material){ - m=(a<b)?m:1.-m; - push_material((pull_material()*m)+(pull_material()*(1-m))); - } + inputmask3(float_const_head,float_const_head,float_const_head); + float k=pull_float(ifconst(0)); + float a=pull_float(ifconst(1)); + float b=pull_float(ifconst(2)); + float h=max(k-abs(a-b),0.); + float s=min(a,b)-h*h*.25/k; + push_float(s); } break; + case OPSmoothMaxMaterialFloat: case OPSmoothMaxFloat:{ - float k=pull_float(); - float a=pull_float(); - float b=pull_float(); - float h=max(k-abs(a-b),0.)/k; - push_float(max(a,b)+h*h*k*(1./4.)); - } - break; - case OPSmoothMaxMaterialFloat:{ - float k=pull_float(); - float a=pull_float(); - float b=pull_float(); - float h=max(k-abs(a-b),0.)/k; - float m=h*h*.5; - float s=m*k*(1./2.); - push_float(max(a,b)+s); - if(material){ - m=(a>b)?m:1.-m; - push_material((pull_material()*m)+(pull_material()*(1-m))); - } + inputmask3(float_const_head,float_const_head,float_const_head); + float k=pull_float(ifconst(0)); + float a=pull_float(ifconst(1)); + float b=pull_float(ifconst(2)); + float h=max(k-abs(a-b),0.); + float s=max(a,b)+h*h*.25/k; + push_float(s); } break; - - case OPMinMaterialFloat: - { - float a=pull_float(); - float b=pull_float(); - push_float(min(a,b)); - if(material){ - material_stack_head--; - if(a<b){ - material_stack[material_stack_head-1]=material_stack[material_stack_head]; - } - } + + /* + case OPSwap2Float:{ + float floattemp=float_stack[float_stack_head-1]; + float_stack[float_stack_head-1]=float_stack[float_stack_head-2]; } break; - case OPMaxMaterialFloat: - { - float a=pull_float(); - float b=pull_float(); - push_float(max(a,b)); - if(material){ - material_stack_head--; - if(a>b){ - material_stack[material_stack_head-1]=material_stack[material_stack_head]; - } - } + case OPSwap3Float:{ + float floattemp=float_stack[float_stack_head-1]; + float_stack[float_stack_head-1]=float_stack[float_stack_head-3]; } break; - - case OPPromoteFloatFloatVec2: - push_vec2(vec2(pull_float(),pull_float())); - break; - case OPPromoteFloatFloatFloatVec3: - push_vec3(vec3(pull_float(),pull_float(),pull_float())); - break; - case OPPromoteVec2FloatVec3: - push_vec3(vec3(pull_vec2(),pull_float())); - break; - case OPPromoteFloatFloatFloatFloatVec4: - push_vec4(vec4(pull_float(),pull_float(),pull_float(),pull_float())); - break; - case OPPromoteVec2FloatFloatVec4: - push_vec4(vec4(pull_vec2(),pull_float(),pull_float())); - break; - case OPPromoteVec3FloatVec4: - push_vec4(vec4(pull_vec3(),pull_float())); - break; - case OPPromoteVec2Vec2Vec4: - push_vec4(vec4(pull_vec2(),pull_vec2())); - break; - case OPPromote2Vec2Mat2: - push_mat2(mat2(pull_vec2(),pull_vec2())); - break; - case OPPromote4FloatMat2: - push_mat2(mat2(pull_float(),pull_float(),pull_float(),pull_float())); - break; - case OPPromoteVec4Mat2: - push_mat2(mat2(pull_vec4())); - break; - case OPPromote3Vec3Mat3: - push_mat3(mat3(pull_vec3(),pull_vec3(),pull_vec3())); - break; - case OPPromote4Vec4Mat4: - push_mat4(mat4(pull_vec4(),pull_vec4(),pull_vec4(),pull_vec4())); - break; - case OPPromoteMat2Mat3: - push_mat3(mat3(pull_mat2())); - break; - case OPPromoteMat2Mat4: - push_mat4(mat4(pull_mat2())); - break; - case OPPromoteMat3Mat4: - push_mat4(mat4(pull_mat3())); - break; - - case OPDemoteMat2Float: - mat2temp=pull_mat2(); - push_float(mat2temp[1].y); - push_float(mat2temp[1].x); - push_float(mat2temp[0].y); - push_float(mat2temp[0].x); - break; - case OPDemoteMat2Vec2: - mat2temp=pull_mat2(); - push_vec2(mat2temp[1]); - push_vec2(mat2temp[0]); - break; - case OPDemoteMat3Vec3: - mat3temp=pull_mat3(); - push_vec3(mat3temp[2]); - push_vec3(mat3temp[1]); - push_vec3(mat3temp[0]); - break; - case OPDemoteMat4Vec4: - mat4temp=pull_mat4(); - push_vec4(mat4temp[3]); - push_vec4(mat4temp[2]); - push_vec4(mat4temp[1]); - push_vec4(mat4temp[0]); - break; - case OPDemoteMat2Vec4: - mat2temp=pull_mat2(); - push_vec4(vec4(mat2temp[0],mat2temp[1])); - break; - case OPDemoteVec2FloatFloat: - vec2temp=pull_vec2(); - push_float(vec2temp.y); - push_float(vec2temp.x); - break; - case OPDemoteVec3FloatFloatFloat: - vec3temp=pull_vec3(); - push_float(vec3temp.z); - push_float(vec3temp.y); - push_float(vec3temp.x); - break; - case OPDemoteVec4FloatFloatFloatFloat: - vec4temp=pull_vec4(); - push_float(vec4temp.w); - push_float(vec4temp.z); - push_float(vec4temp.y); - push_float(vec4temp.x); - break; - - case OPMinVec2: - push_vec2(min(pull_vec2(),pull_vec2())); - break; - case OPMaxVec2: - push_vec2(max(pull_vec2(),pull_vec2())); - break; - case OPMinVec3: - push_vec3(min(pull_vec3(),pull_vec3())); - break; - case OPMaxVec3: - push_vec3(max(pull_vec3(),pull_vec3())); - break; - case OPMinVec4: - push_vec4(min(pull_vec4(),pull_vec4())); - break; - case OPMaxVec4: - push_vec4(max(pull_vec4(),pull_vec4())); + case OPSwap4Float:{ + float floattemp=float_stack[float_stack_head-1]; + float_stack[float_stack_head-1]=float_stack[float_stack_head-4]; + } + */ break; - - case OPFMAFloat: - push_float(fma(pull_float(),pull_float(),pull_float())); + case OPDupFloat:{ + inputmask1(float_const_head); + push_float(float_stack[float_stack_head-1]); + } break; - case OPFMAVec2: - push_vec2(fma(pull_vec2(),pull_vec2(),pull_vec2())); + case OPDup2Float:{ + inputmask1(float_const_head); + push_float(float_stack[float_stack_head-2]); + } break; - case OPFMAVec3: - push_vec3(fma(pull_vec3(),pull_vec3(),pull_vec3())); + case OPDup3Float:{ + inputmask1(float_const_head); + push_float(float_stack[float_stack_head-3]); + } break; - case OPFMAVec4: - push_vec4(fma(pull_vec4(),pull_vec4(),pull_vec4())); + case OPDup4Float:{ + inputmask1(float_const_head); + push_float(float_stack[float_stack_head-4]); + } break; - - case OPOuterProductMat2: - push_mat2(outerProduct(pull_vec2(),pull_vec2())); + /* + case OPDropFloat:{ + float_stack_head--; + } break; - case OPOuterProductMat3: - push_mat3(outerProduct(pull_vec3(),pull_vec3())); + case OPDrop2Float:{ + float_stack[float_stack_head-2]=float_stack[float_stack_head-1]; + float_stack_head--; + } break; - case OPOuterProductMat4: - push_mat4(outerProduct(pull_vec4(),pull_vec4())); + case OPDrop3Float:{ + float_stack[float_stack_head-3]=float_stack[float_stack_head-2]; + float_stack[float_stack_head-2]=float_stack[float_stack_head-1]; + float_stack_head--; + } break; - - case OPCompMultMat2: - push_mat2(matrixCompMult(pull_mat2(),pull_mat2())); + case OPDrop4Float:{ + float_stack[float_stack_head-4]=float_stack[float_stack_head-3]; + float_stack[float_stack_head-3]=float_stack[float_stack_head-2]; + float_stack[float_stack_head-2]=float_stack[float_stack_head-1]; + float_stack_head--; + } break; - case OPCompMultMat3: - push_mat3(matrixCompMult(pull_mat3(),pull_mat3())); + */ + /* + case OPSwap2Vec2:{ + vec2 vec2temp=vec2_stack[vec2_stack_head-1]; + vec2_stack[vec2_stack_head-1]=vec2_stack[vec2_stack_head-2]; + } break; - case OPCompMultMat4: - push_mat4(matrixCompMult(pull_mat4(),pull_mat4())); + case OPSwap3Vec2:{ + vec2 vec2temp=vec2_stack[vec2_stack_head-1]; + vec2_stack[vec2_stack_head-1]=vec2_stack[vec2_stack_head-3]; + } break; - - case OPClampFloatFloat: - push_float(clamp(pull_float(),pull_float(),pull_float())); + case OPSwap4Vec2:{ + vec2 vec2temp=vec2_stack[vec2_stack_head-1]; + vec2_stack[vec2_stack_head-1]=vec2_stack[vec2_stack_head-4]; + } break; - case OPClampVec2Vec2: - push_vec2(clamp(pull_vec2(),pull_vec2(),pull_vec2())); + */ + case OPDupVec2:{ + inputmask1(vec2_const_head); + push_vec2(vec2_stack[vec2_stack_head-1]); + } break; - case OPClampVec3Vec3: - push_vec3(clamp(pull_vec3(),pull_vec3(),pull_vec3())); + case OPDup2Vec2:{ + inputmask1(vec2_const_head); + push_vec2(vec2_stack[vec2_stack_head-2]); + } break; - case OPClampVec4Vec4: - push_vec4(clamp(pull_vec4(),pull_vec4(),pull_vec4())); + case OPDup3Vec2:{ + inputmask1(vec2_const_head); + push_vec2(vec2_stack[vec2_stack_head-3]); + } break; - case OPClampVec2Float: - push_vec2(clamp(pull_vec2(),pull_float(),pull_float())); + case OPDup4Vec2:{ + inputmask1(vec2_const_head); + push_vec2(vec2_stack[vec2_stack_head-4]); + } break; - case OPClampVec3Float: - push_vec3(clamp(pull_vec3(),pull_float(),pull_float())); + /* + case OPDropVec2:{ + vec2_stack_head--; + } break; - case OPClampVec4Float: - push_vec4(clamp(pull_vec4(),pull_float(),pull_float())); + case OPDrop2Vec2:{ + vec2_stack[vec2_stack_head-2]=vec2_stack[vec2_stack_head-1]; + vec2_stack_head--; + } break; - - case OPMixFloatFloat: - push_float(mix(pull_float(),pull_float(),pull_float())); + case OPDrop3Vec2:{ + vec2_stack[vec2_stack_head-3]=vec2_stack[vec2_stack_head-2]; + vec2_stack[vec2_stack_head-2]=vec2_stack[vec2_stack_head-1]; + vec2_stack_head--; + } break; - case OPMixVec2Vec2: - push_vec2(mix(pull_vec2(),pull_vec2(),pull_vec2())); + case OPDrop4Vec2:{ + vec2_stack[vec2_stack_head-4]=vec2_stack[vec2_stack_head-3]; + vec2_stack[vec2_stack_head-3]=vec2_stack[vec2_stack_head-2]; + vec2_stack[vec2_stack_head-2]=vec2_stack[vec2_stack_head-1]; + vec2_stack_head--; + } break; - case OPMixVec3Vec3: - push_vec3(mix(pull_vec3(),pull_vec3(),pull_vec3())); + */ + /* + case OPSwap2Vec3:{ + vec3 vec3temp=vec3_stack[vec3_stack_head-1]; + vec3_stack[vec3_stack_head-1]=vec3_stack[vec3_stack_head-2]; + } break; - case OPMixVec4Vec4: - push_vec4(mix(pull_vec4(),pull_vec4(),pull_vec4())); + case OPSwap3Vec3:{ + vec3 vec3temp=vec3_stack[vec3_stack_head-1]; + vec3_stack[vec3_stack_head-1]=vec3_stack[vec3_stack_head-3]; + } break; - case OPMixVec2Float: - push_vec2(mix(pull_vec2(),pull_vec2(),pull_float())); + case OPSwap4Vec3:{ + vec3 vec3temp=vec3_stack[vec3_stack_head-1]; + vec3_stack[vec3_stack_head-1]=vec3_stack[vec3_stack_head-4]; + } break; - case OPMixVec3Float: - push_vec3(mix(pull_vec3(),pull_vec3(),pull_float())); + */ + case OPDupVec3:{ + inputmask1(vec3_const_head); + push_vec3(vec3_stack[vec3_stack_head-1]); + } break; - case OPMixVec4Float: - push_vec4(mix(pull_vec4(),pull_vec4(),pull_float())); + case OPDup2Vec3:{ + inputmask1(vec3_const_head); + push_vec3(vec3_stack[vec3_stack_head-2]); + } break; - - case OPSquareFloat: - floattemp=pull_float(); - push_float(floattemp*floattemp); + case OPDup3Vec3:{ + inputmask1(vec3_const_head); + push_vec3(vec3_stack[vec3_stack_head-3]); + } break; - case OPCubeFloat: - floattemp=pull_float(); - push_float(floattemp*floattemp*floattemp); + case OPDup4Vec3:{ + inputmask1(vec3_const_head); + push_vec3(vec3_stack[vec3_stack_head-4]); + } break; - case OPSquareVec2: - vec2temp=pull_vec2(); - push_vec2(vec2temp*vec2temp); + /* + case OPDropVec3:{ + vec3_stack_head--; + } break; - case OPCubeVec2: - vec2temp=pull_vec2(); - push_vec2(vec2temp*vec2temp*vec2temp); + case OPDrop2Vec3:{ + vec3_stack[vec3_stack_head-2]=vec3_stack[vec3_stack_head-1]; + vec3_stack_head--; + } break; - case OPSquareVec3: - vec3temp=pull_vec3(); - push_vec3(vec3temp*vec3temp); + case OPDrop3Vec3:{ + vec3_stack[vec3_stack_head-3]=vec3_stack[vec3_stack_head-2]; + vec3_stack[vec3_stack_head-2]=vec3_stack[vec3_stack_head-1]; + vec3_stack_head--; + } break; - case OPCubeVec3: - vec3temp=pull_vec3(); - push_vec3(vec3temp*vec3temp*vec3temp); + case OPDrop4Vec3:{ + vec3_stack[vec3_stack_head-4]=vec3_stack[vec3_stack_head-3]; + vec3_stack[vec3_stack_head-3]=vec3_stack[vec3_stack_head-2]; + vec3_stack[vec3_stack_head-2]=vec3_stack[vec3_stack_head-1]; + vec3_stack_head--; + } break; - case OPSquareVec4: - vec4temp=pull_vec4(); - push_vec4(vec4temp*vec4temp); + */ + /* + case OPSwap2Vec4:{ + vec4 vec4temp=vec4_stack[vec4_stack_head-1]; + vec4_stack[vec4_stack_head-1]=vec4_stack[vec4_stack_head-2]; + } break; - case OPCubeVec4: - vec4temp=pull_vec4(); - push_vec4(vec4temp*vec4temp*vec4temp); + case OPSwap3Vec4:{ + vec4 vec4temp=vec4_stack[vec4_stack_head-1]; + vec4_stack[vec4_stack_head-1]=vec4_stack[vec4_stack_head-3]; + } break; - case OPSquareMat2: - mat2temp=pull_mat2(); - push_mat2(mat2temp*mat2temp); + case OPSwap4Vec4:{ + vec4 vec4temp=vec4_stack[vec4_stack_head-1]; + vec4_stack[vec4_stack_head-1]=vec4_stack[vec4_stack_head-4]; + } break; - case OPCubeMat2: - mat2temp=pull_mat2(); - push_mat2(mat2temp*mat2temp*mat2temp); + */ + case OPDupVec4:{ + inputmask1(vec4_const_head); + push_vec4(vec4_stack[vec4_stack_head-1]); + } break; - case OPSquareMat3: - mat3temp=pull_mat3(); - push_mat3(mat3temp*mat3temp); + case OPDup2Vec4:{ + inputmask1(vec4_const_head); + push_vec4(vec4_stack[vec4_stack_head-2]); + } break; - case OPCubeMat3: - mat3temp=pull_mat3(); - push_mat3(mat3temp*mat3temp*mat3temp); + case OPDup3Vec4:{ + inputmask1(vec4_const_head); + push_vec4(vec4_stack[vec4_stack_head-3]); + } break; - case OPSquareMat4: - mat4temp=pull_mat4(); - push_mat4(mat4temp*mat4temp); + case OPDup4Vec4:{ + inputmask1(vec4_const_head); + push_vec4(vec4_stack[vec4_stack_head-4]); + } break; - case OPCubeMat4: - mat4temp=pull_mat4(); - push_mat4(mat4temp*mat4temp*mat4temp); + /* + case OPDropVec4:{ + vec4_stack_head--; + } break; - - case OPMulMat2Vec2: - push_vec2(pull_mat2()*pull_vec2()); + case OPDrop2Vec4:{ + vec4_stack[vec4_stack_head-2]=vec4_stack[vec4_stack_head-1]; + vec4_stack_head--; + } break; - case OPMulMat3Vec3: - push_vec3(pull_mat3()*pull_vec3()); + case OPDrop3Vec4:{ + vec4_stack[vec4_stack_head-3]=vec4_stack[vec4_stack_head-2]; + vec4_stack[vec4_stack_head-2]=vec4_stack[vec4_stack_head-1]; + vec4_stack_head--; + } break; - case OPMulMat4Vec4: - push_vec4(pull_mat4()*pull_vec4()); + case OPDrop4Vec4:{ + vec4_stack[vec4_stack_head-4]=vec4_stack[vec4_stack_head-3]; + vec4_stack[vec4_stack_head-3]=vec4_stack[vec4_stack_head-2]; + vec4_stack[vec4_stack_head-2]=vec4_stack[vec4_stack_head-1]; + vec4_stack_head--; + } break; + */ + case OPSDFSphere: { - float r=pull_float(); - vec3 p=pull_vec3(); - - push_float(length(p)-r); - if(material){ - push_material(pull_mat4()); + inputmask2(float_const_head,vec3_const_head); + float in2=pull_float(ifconst(0)); + /*#ifdef debug + if (in2[0] == in2[1] && in2[0] == 0.2) + {return vec3(in2[0],in2[1],0.); + }else{ + return vec3(in2[0],in2[1],1.); } - //return p; - //return vec3(0.,1.,1.); + #endif*/ + vec3 in1=pull_vec3(ifconst(1)); + /*#ifdef debug + return in1[0]; + #endif*/ + + push_float(length(in1)-in2); + } + break; + + case OPSDFTorus: + { + inputmask2(vec2_const_head,vec3_const_head); + vec2 t=pull_vec2(ifconst(0)); //t + vec3 p=pull_vec3(ifconst(1)); //p + + vec2 q = vec2(length(p.xz)-t.x,p.y); + push_float(length(q)-t.y); + } + break; + + //this doesn't work internally but it's probably fiiiine + case OPSDFBox: + { + inputmask2(vec3_const_head,vec3_const_head); + vec3 b=pull_vec3(ifconst(0)); //r + vec3 p=pull_vec3(ifconst(1)); //p + + vec3 q = abs(p) - b; + + push_float(length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0)); } break; case OPNop: break; case OPStop: - return pull_float(); + #ifdef debug + return vec3(pull_float(ifconst(0))); + #else + return pull_float(ifconst(0)); + #endif case OPInvalid: default: - return float(minor_float_cache[minor_position]); + #ifdef debug + return vec3(float(minor_integer_cache[minor_position])); + #else + return float (-1); + #endif } - }else{ - //return vec3(float(minor_float_cache[minor_position])); - push_float(float(minor_float_cache[minor_position])); - } - } + minor_position++; if(minor_position==8) { minor_position=0; major_position++; - if(major_position==13) + if(major_position==masklen) { - return pull_float(); + #ifdef debug + return vec3(pull_float(false)); + #else + return pull_float(false); + #endif } } } diff --git a/src/intervals.glsl b/src/intervals.glsl index 8b7ef5a452ad3759e473c52f886416c74f09f08b..07abdcbb5091921802b1297971edf98b31930b7a 100644 --- a/src/intervals.glsl +++ b/src/intervals.glsl @@ -3197,17 +3197,4 @@ float[2]scene(vec3 p[2], bool prune) } } } - -#ifdef debug -vec3 sceneoverride(vec3 p, bool m) -{ - return scene(vec3[2](p,p), false); -} -#else -float sceneoverride(vec3 p, bool m) -{ - return scene(vec3[2](p,p), false)[0]; -} -#endif - #endif//ifndef intervals \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 3b8bdc9166953040a49466bbc1aa3f40c8ef500b..1d54f80aaaac01e0a8e54cf2e616413584fb3766 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1295,6 +1295,7 @@ fn object_size_dependent_setup( //CSGPart::opcode(InstructionSet::OPAddVec3Vec3, vec![Inputs::Variable, Inputs::Vec3([-0.0, -0.0, -0.0].into())]), //CSGPart::opcode(InstructionSet::OPSDFSphere,vec![Inputs::Float(1.2), Inputs::Variable]), CSGPart::opcode(InstructionSet::OPSDFTorus, vec![Inputs::Vec2([0.7, 0.4].into()), Inputs::Variable]), + //CSGPart::opcode(InstructionSet::OPSDFBox, vec![Inputs::Vec3([0.7, 0.4, 0.7].into()), Inputs::Variable]), CSGPart::opcode(InstructionSet::OPMinFloat, vec![Inputs::Variable,Inputs::Variable]), CSGPart::opcode(InstructionSet::OPDivFloatFloat, vec![Inputs::Variable, Inputs::Float(0.9)]), CSGPart::opcode(InstructionSet::OPStop, vec![Inputs::Variable]), diff --git a/src/triangle.vert.glsl b/src/triangle.vert.glsl index 7141fb41310e8228270fdb1635a8e1fb40a8acfc..d50bd83de2456f4a3514db6a2622dd8941551d6e 100644 --- a/src/triangle.vert.glsl +++ b/src/triangle.vert.glsl @@ -5,9 +5,11 @@ layout(location=0)in vec3 position; layout(location=1)in vec3 normal; layout(location=0)out vec3 v_normal; +layout(location=1)out vec4 pos; void main(){ mat4 worldview=camera_uniforms.view*pc.world; v_normal=normal;//normalize(transpose(inverse(mat3(worldview))) * normal); - gl_Position=camera_uniforms.proj*worldview*vec4(position,1.); + pos = worldview*vec4(position,1.); + gl_Position=camera_uniforms.proj*pos; } \ No newline at end of file