diff --git a/.vscode/third_year_project.code-workspace b/.vscode/third_year_project.code-workspace new file mode 100644 index 0000000000000000000000000000000000000000..bab1b7f616b360395e747dbbcd59ebadc307ad61 --- /dev/null +++ b/.vscode/third_year_project.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": ".." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/build.rs b/build.rs new file mode 100644 index 0000000000000000000000000000000000000000..a1bbbf1dcaae06d2ca8c4874a83c95e9a49f5fa5 --- /dev/null +++ b/build.rs @@ -0,0 +1,32 @@ +use std::env; +use std::fs; +use std::fs::File; +use std::io; +use std::io::BufRead; +use std::io::BufReader; +use std::path::Path; + +fn main() -> io::Result<()> { + println!("cargo:rerun-if-changed=src/instructionset.glsl"); + let out_dir = env::var_os("OUT_DIR").unwrap(); + let dest_path = Path::new(&out_dir).join("instructionset.rs"); + let f = File::open("src/instructionset.glsl")?; + let f = BufReader::new(f); + let mut out = " + #[repr(u16)] + pub enum InstructionSet{ + + " + .to_owned(); + + for l in f.lines() { + let line = l?; + out += &line[11..line.len() - 12]; + out += ",\n"; + } + out += "}"; + + fs::write(&dest_path, out).unwrap(); + println!("cargo:rerun-if-changed=build.rs"); + Ok(()) +} diff --git a/src/frag.glsl b/src/frag.glsl index fca2b23396e7d9cfdf7cc38a149c3e57529f91a7..c16e5da43fe17ca20d18a7bcdc5f6ef66065e2d9 100644 --- a/src/frag.glsl +++ b/src/frag.glsl @@ -47,17 +47,17 @@ vec3 shading(vec3 normal) vec3 getNormal(vec3 p,float dens){ vec3 n; - n.x=scene(vec3(p.x+EPSILON,p.y,p.z)); - n.y=scene(vec3(p.x,p.y+EPSILON,p.z)); - n.z=scene(vec3(p.x,p.y,p.z+EPSILON)); - return normalize(n-scene(p)); + 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; for(int i=0;i<MAX_STEPS&&td.y>EPSILON&&td.x<FARPLANE;i++){ - td.y=scene(p); + td.y=scene(p,false).x; td.x+=(td.y)*.9; p=ori+dir*td.x; } @@ -66,7 +66,7 @@ vec2 spheretracing(vec3 ori,vec3 dir,out vec3 p){ //Implicit Surface Entrypoint void main(){ - + default_mask(); vec3 raypos=vertexInput.position.xyz; vec2 iResolution=vec2(RES_X,RES_Y); vec2 iuv=(gl_FragCoord.xy+gl_SamplePosition)/iResolution.xy*2.-1.; @@ -74,10 +74,16 @@ void main(){ uv.x*=iResolution.x/iResolution.y; vec3 p; vec3 raydir=normalize(raypos-camera_uniforms.campos); + raypos-=vec3(5); + //scene(raypos,false); + //f_color=vec4(scene(raypos,false),1.); + ///return; + vec2 td=spheretracing(raypos,raydir,p); vec3 n=getNormal(p,td.y); if(td.y<EPSILON) { + f_color=vec4(1.); f_color=vec4(shading(n),1.); vec4 tpoint=camera_uniforms.proj*camera_uniforms.view*vec4(p,1); diff --git a/src/instructionset.glsl b/src/instructionset.glsl new file mode 100644 index 0000000000000000000000000000000000000000..5b6851cc19e1bde57fb27b18235b967a390b44eb --- /dev/null +++ b/src/instructionset.glsl @@ -0,0 +1,341 @@ +const uint OPInvalid=__LINE__-1; +const uint OPNop=__LINE__-1; +const uint OPStop=__LINE__-1; +const uint OPAddFloatFloat=__LINE__-1; +const uint OPAddVec2Vec2=__LINE__-1; +const uint OPAddVec2Float=__LINE__-1; +const uint OPAddVec3Vec3=__LINE__-1; +const uint OPAddVec3Float=__LINE__-1; +const uint OPAddVec4Vec4=__LINE__-1; +const uint OPAddVec4Float=__LINE__-1; +const uint OPAddMat2Mat2=__LINE__-1; +const uint OPAddMat2Float=__LINE__-1; +const uint OPAddMat3Mat3=__LINE__-1; +const uint OPAddMat3Float=__LINE__-1; +const uint OPAddMat4Mat4=__LINE__-1; +const uint OPAddMat4Float=__LINE__-1; +const uint OPSubFloatFloat=__LINE__-1; +const uint OPSubVec2Vec2=__LINE__-1; +const uint OPSubVec2Float=__LINE__-1; +const uint OPSubVec3Vec3=__LINE__-1; +const uint OPSubVec3Float=__LINE__-1; +const uint OPSubVec4Vec4=__LINE__-1; +const uint OPSubVec4Float=__LINE__-1; +const uint OPSubMat2Mat2=__LINE__-1; +const uint OPSubMat2Float=__LINE__-1; +const uint OPSubMat3Mat3=__LINE__-1; +const uint OPSubMat3Float=__LINE__-1; +const uint OPSubMat4Mat4=__LINE__-1; +const uint OPSubMat4Float=__LINE__-1; +const uint OPMulFloatFloat=__LINE__-1; +const uint OPMulVec2Vec2=__LINE__-1; +const uint OPMulVec2Float=__LINE__-1; +const uint OPMulVec3Vec3=__LINE__-1; +const uint OPMulVec3Float=__LINE__-1; +const uint OPMulVec4Vec4=__LINE__-1; +const uint OPMulVec4Float=__LINE__-1; +const uint OPMulMat2Mat2=__LINE__-1; +const uint OPMulMat2Float=__LINE__-1; +const uint OPMulMat3Mat3=__LINE__-1; +const uint OPMulMat3Float=__LINE__-1; +const uint OPMulMat4Mat4=__LINE__-1; +const uint OPMulMat4Float=__LINE__-1; +const uint OPDivFloatFloat=__LINE__-1; +const uint OPDivVec2Vec2=__LINE__-1; +const uint OPDivVec2Float=__LINE__-1; +const uint OPDivVec3Vec3=__LINE__-1; +const uint OPDivVec3Float=__LINE__-1; +const uint OPDivVec4Vec4=__LINE__-1; +const uint OPDivVec4Float=__LINE__-1; +const uint OPDivMat2Mat2=__LINE__-1; +const uint OPDivMat2Float=__LINE__-1; +const uint OPDivMat3Mat3=__LINE__-1; +const uint OPDivMat3Float=__LINE__-1; +const uint OPDivMat4Mat4=__LINE__-1; +const uint OPDivMat4Float=__LINE__-1; +const uint OPModFloatFloat=__LINE__-1; +const uint OPModVec2Vec2=__LINE__-1; +const uint OPModVec2Float=__LINE__-1; +const uint OPModVec3Vec3=__LINE__-1; +const uint OPModVec3Float=__LINE__-1; +const uint OPModVec4Vec4=__LINE__-1; +const uint OPModVec4Float=__LINE__-1; +const uint OPPowFloatFloat=__LINE__-1; +const uint OPPowVec2Vec2=__LINE__-1; +const uint OPPowVec3Vec3=__LINE__-1; +const uint OPPowVec4Vec4=__LINE__-1; +const uint OPCrossVec3=__LINE__-1; +const uint OPDotVec2=__LINE__-1; +const uint OPDotVec3=__LINE__-1; +const uint OPDotVec4=__LINE__-1; +const uint OPLengthVec2=__LINE__-1; +const uint OPLengthVec3=__LINE__-1; +const uint OPLengthVec4=__LINE__-1; +const uint OPDistanceVec2=__LINE__-1; +const uint OPDistanceVec3=__LINE__-1; +const uint OPDistanceVec4=__LINE__-1; +const uint OPNormalizeVec2=__LINE__-1; +const uint OPNormalizeVec3=__LINE__-1; +const uint OPNormalizeVec4=__LINE__-1; +const uint OPTransposeMat2=__LINE__-1; +const uint OPTransposeMat3=__LINE__-1; +const uint OPTransposeMat4=__LINE__-1; +const uint OPDeterminantMat2=__LINE__-1; +const uint OPDeterminantMat3=__LINE__-1; +const uint OPDeterminantMat4=__LINE__-1; +const uint OPInvertMat2=__LINE__-1; +const uint OPInvertMat3=__LINE__-1; +const uint OPInvertMat4=__LINE__-1; +const uint OPAbsFloat=__LINE__-1; +const uint OPSignFloat=__LINE__-1; +const uint OPFloorFloat=__LINE__-1; +const uint OPCeilFloat=__LINE__-1; +const uint OPFractFloat=__LINE__-1; +const uint OPSqrtFloat=__LINE__-1; +const uint OPInverseSqrtFloat=__LINE__-1; +const uint OPExpFloat=__LINE__-1; +const uint OPExp2Float=__LINE__-1; +const uint OPLogFloat=__LINE__-1; +const uint OPLog2Float=__LINE__-1; +const uint OPSinFloat=__LINE__-1; +const uint OPCosFloat=__LINE__-1; +const uint OPTanFloat=__LINE__-1; +const uint OPAsinFloat=__LINE__-1; +const uint OPAcosFloat=__LINE__-1; +const uint OPAtanFloat=__LINE__-1; +const uint OPMinFloat=__LINE__-1; +const uint OPMaxFloat=__LINE__-1; +const uint OPSmoothMinFloat=__LINE__-1; +const uint OPSmoothMaxFloat=__LINE__-1; +const uint OPMinMaterialFloat=__LINE__-1; +const uint OPMaxMaterialFloat=__LINE__-1; +const uint OPSmoothMinMaterialFloat=__LINE__-1; +const uint OPSmoothMaxMaterialFloat=__LINE__-1; +const uint OPSwap2Float=__LINE__-1; +const uint OPSwap3Float=__LINE__-1; +const uint OPSwap4Float=__LINE__-1; +const uint OPDupFloat=__LINE__-1; +const uint OPDup2Float=__LINE__-1; +const uint OPDup3Float=__LINE__-1; +const uint OPDup4Float=__LINE__-1; +const uint OPDropFloat=__LINE__-1; +const uint OPDrop2Float=__LINE__-1; +const uint OPDrop3Float=__LINE__-1; +const uint OPDrop4Float=__LINE__-1; +const uint OPAbsVec2=__LINE__-1; +const uint OPSignVec2=__LINE__-1; +const uint OPFloorVec2=__LINE__-1; +const uint OPCeilVec2=__LINE__-1; +const uint OPFractVec2=__LINE__-1; +const uint OPSqrtVec2=__LINE__-1; +const uint OPInverseSqrtVec2=__LINE__-1; +const uint OPExpVec2=__LINE__-1; +const uint OPExp2Vec2=__LINE__-1; +const uint OPLogVec2=__LINE__-1; +const uint OPLog2Vec2=__LINE__-1; +const uint OPSinVec2=__LINE__-1; +const uint OPCosVec2=__LINE__-1; +const uint OPTanVec2=__LINE__-1; +const uint OPAsinVec2=__LINE__-1; +const uint OPAcosVec2=__LINE__-1; +const uint OPAtanVec2=__LINE__-1; +const uint OPMinVec2=__LINE__-1; +const uint OPMaxVec2=__LINE__-1; +const uint OPSwap2Vec2=__LINE__-1; +const uint OPSwap3Vec2=__LINE__-1; +const uint OPSwap4Vec2=__LINE__-1; +const uint OPDupVec2=__LINE__-1; +const uint OPDup2Vec2=__LINE__-1; +const uint OPDup3Vec2=__LINE__-1; +const uint OPDup4Vec2=__LINE__-1; +const uint OPDropVec2=__LINE__-1; +const uint OPDrop2Vec2=__LINE__-1; +const uint OPDrop3Vec2=__LINE__-1; +const uint OPDrop4Vec2=__LINE__-1; +const uint OPAbsVec3=__LINE__-1; +const uint OPSignVec3=__LINE__-1; +const uint OPFloorVec3=__LINE__-1; +const uint OPCeilVec3=__LINE__-1; +const uint OPFractVec3=__LINE__-1; +const uint OPSqrtVec3=__LINE__-1; +const uint OPInverseSqrtVec3=__LINE__-1; +const uint OPExpVec3=__LINE__-1; +const uint OPExp2Vec3=__LINE__-1; +const uint OPLogVec3=__LINE__-1; +const uint OPLog2Vec3=__LINE__-1; +const uint OPSinVec3=__LINE__-1; +const uint OPCosVec3=__LINE__-1; +const uint OPTanVec3=__LINE__-1; +const uint OPAsinVec3=__LINE__-1; +const uint OPAcosVec3=__LINE__-1; +const uint OPAtanVec3=__LINE__-1; +const uint OPMinVec3=__LINE__-1; +const uint OPMaxVec3=__LINE__-1; +const uint OPSwap2Vec3=__LINE__-1; +const uint OPSwap3Vec3=__LINE__-1; +const uint OPSwap4Vec3=__LINE__-1; +const uint OPDupVec3=__LINE__-1; +const uint OPDup2Vec3=__LINE__-1; +const uint OPDup3Vec3=__LINE__-1; +const uint OPDup4Vec3=__LINE__-1; +const uint OPDropVec3=__LINE__-1; +const uint OPDrop2Vec3=__LINE__-1; +const uint OPDrop3Vec3=__LINE__-1; +const uint OPDrop4Vec3=__LINE__-1; +const uint OPAbsVec4=__LINE__-1; +const uint OPSignVec4=__LINE__-1; +const uint OPFloorVec4=__LINE__-1; +const uint OPCeilVec4=__LINE__-1; +const uint OPFractVec4=__LINE__-1; +const uint OPSqrtVec4=__LINE__-1; +const uint OPInverseSqrtVec4=__LINE__-1; +const uint OPExpVec4=__LINE__-1; +const uint OPExp2Vec4=__LINE__-1; +const uint OPLogVec4=__LINE__-1; +const uint OPLog2Vec4=__LINE__-1; +const uint OPSinVec4=__LINE__-1; +const uint OPCosVec4=__LINE__-1; +const uint OPTanVec4=__LINE__-1; +const uint OPAsinVec4=__LINE__-1; +const uint OPAcosVec4=__LINE__-1; +const uint OPAtanVec4=__LINE__-1; +const uint OPMinVec4=__LINE__-1; +const uint OPMaxVec4=__LINE__-1; +const uint OPSwap2Vec4=__LINE__-1; +const uint OPSwap3Vec4=__LINE__-1; +const uint OPSwap4Vec4=__LINE__-1; +const uint OPDupVec4=__LINE__-1; +const uint OPDup2Vec4=__LINE__-1; +const uint OPDup3Vec4=__LINE__-1; +const uint OPDup4Vec4=__LINE__-1; +const uint OPDropVec4=__LINE__-1; +const uint OPDrop2Vec4=__LINE__-1; +const uint OPDrop3Vec4=__LINE__-1; +const uint OPDrop4Vec4=__LINE__-1; +const uint OPSwap2Mat2=__LINE__-1; +const uint OPSwap3Mat2=__LINE__-1; +const uint OPSwap4Mat2=__LINE__-1; +const uint OPDupMat2=__LINE__-1; +const uint OPDup2Mat2=__LINE__-1; +const uint OPDup3Mat2=__LINE__-1; +const uint OPDup4Mat2=__LINE__-1; +const uint OPDropMat2=__LINE__-1; +const uint OPDrop2Mat2=__LINE__-1; +const uint OPDrop3Mat2=__LINE__-1; +const uint OPDrop4Mat2=__LINE__-1; +const uint OPSwap2Mat3=__LINE__-1; +const uint OPSwap3Mat3=__LINE__-1; +const uint OPSwap4Mat3=__LINE__-1; +const uint OPDupMat3=__LINE__-1; +const uint OPDup2Mat3=__LINE__-1; +const uint OPDup3Mat3=__LINE__-1; +const uint OPDup4Mat3=__LINE__-1; +const uint OPDropMat3=__LINE__-1; +const uint OPDrop2Mat3=__LINE__-1; +const uint OPDrop3Mat3=__LINE__-1; +const uint OPDrop4Mat3=__LINE__-1; +const uint OPSwap2Mat4=__LINE__-1; +const uint OPSwap3Mat4=__LINE__-1; +const uint OPSwap4Mat4=__LINE__-1; +const uint OPDupMat4=__LINE__-1; +const uint OPDup2Mat4=__LINE__-1; +const uint OPDup3Mat4=__LINE__-1; +const uint OPDup4Mat4=__LINE__-1; +const uint OPDropMat4=__LINE__-1; +const uint OPDrop2Mat4=__LINE__-1; +const uint OPDrop3Mat4=__LINE__-1; +const uint OPDrop4Mat4=__LINE__-1; +const uint OPPromoteFloatFloatVec2=__LINE__-1; +const uint OPPromoteFloatFloatFloatVec3=__LINE__-1; +const uint OPPromoteFloatFloatFloatFloatVec4=__LINE__-1; +const uint OPPromoteVec2FloatVec3=__LINE__-1; +const uint OPPromoteVec2FloatFloatVec4=__LINE__-1; +const uint OPPromoteVec2Vec2Vec4=__LINE__-1; +const uint OPPromoteVec3FloatVec4=__LINE__-1; +const uint OPPromote4FloatMat2=__LINE__-1; +const uint OPPromote2Vec2Mat2=__LINE__-1; +const uint OPPromoteVec4Mat2=__LINE__-1; +const uint OPPromote3Vec3Mat3=__LINE__-1; +const uint OPPromote4Vec4Mat4=__LINE__-1; +const uint OPPromoteMat2Mat3=__LINE__-1; +const uint OPPromoteMat2Mat4=__LINE__-1; +const uint OPPromoteMat3Mat4=__LINE__-1; +const uint OPDemoteVec2FloatFloat=__LINE__-1; +const uint OPDemoteVec3FloatFloatFloat=__LINE__-1; +const uint OPDemoteVec4FloatFloatFloatFloat=__LINE__-1; +const uint OPDemoteMat2Float=__LINE__-1; +const uint OPDemoteMat2Vec2=__LINE__-1; +const uint OPDemoteMat2Vec4=__LINE__-1; +const uint OPDemoteMat3Vec3=__LINE__-1; +const uint OPDemoteMat4Vec4=__LINE__-1; +const uint OPAcoshFloat=__LINE__-1; +const uint OPAcoshVec2=__LINE__-1; +const uint OPAcoshVec3=__LINE__-1; +const uint OPAcoshVec4=__LINE__-1; +const uint OPAsinhFloat=__LINE__-1; +const uint OPAsinhVec2=__LINE__-1; +const uint OPAsinhVec3=__LINE__-1; +const uint OPAsinhVec4=__LINE__-1; +const uint OPAtanhFloat=__LINE__-1; +const uint OPAtanhVec2=__LINE__-1; +const uint OPAtanhVec3=__LINE__-1; +const uint OPAtanhVec4=__LINE__-1; +const uint OPCoshFloat=__LINE__-1; +const uint OPCoshVec2=__LINE__-1; +const uint OPCoshVec3=__LINE__-1; +const uint OPCoshVec4=__LINE__-1; +const uint OPSinhFloat=__LINE__-1; +const uint OPSinhVec2=__LINE__-1; +const uint OPSinhVec3=__LINE__-1; +const uint OPSinhVec4=__LINE__-1; +const uint OPTanhFloat=__LINE__-1; +const uint OPTanhVec2=__LINE__-1; +const uint OPTanhVec3=__LINE__-1; +const uint OPTanhVec4=__LINE__-1; +const uint OPFMAFloat=__LINE__-1; +const uint OPFMAVec2=__LINE__-1; +const uint OPFMAVec3=__LINE__-1; +const uint OPFMAVec4=__LINE__-1; +const uint OPRoundFloat=__LINE__-1; +const uint OPRoundVec2=__LINE__-1; +const uint OPRoundVec3=__LINE__-1; +const uint OPRoundVec4=__LINE__-1; +const uint OPTruncFloat=__LINE__-1; +const uint OPTruncVec2=__LINE__-1; +const uint OPTruncVec3=__LINE__-1; +const uint OPTruncVec4=__LINE__-1; +const uint OPOuterProductMat2=__LINE__-1; +const uint OPOuterProductMat3=__LINE__-1; +const uint OPOuterProductMat4=__LINE__-1; +const uint OPCompMultMat2=__LINE__-1; +const uint OPCompMultMat3=__LINE__-1; +const uint OPCompMultMat4=__LINE__-1; +const uint OPClampFloatFloat=__LINE__-1; +const uint OPClampVec2Vec2=__LINE__-1; +const uint OPClampVec2Float=__LINE__-1; +const uint OPClampVec3Vec3=__LINE__-1; +const uint OPClampVec3Float=__LINE__-1; +const uint OPClampVec4Vec4=__LINE__-1; +const uint OPClampVec4Float=__LINE__-1; +const uint OPMixFloatFloat=__LINE__-1; +const uint OPMixVec2Vec2=__LINE__-1; +const uint OPMixVec2Float=__LINE__-1; +const uint OPMixVec3Vec3=__LINE__-1; +const uint OPMixVec3Float=__LINE__-1; +const uint OPMixVec4Vec4=__LINE__-1; +const uint OPMixVec4Float=__LINE__-1; +const uint OPSquareFloat=__LINE__-1; +const uint OPCubeFloat=__LINE__-1; +const uint OPSquareVec2=__LINE__-1; +const uint OPCubeVec2=__LINE__-1; +const uint OPSquareVec3=__LINE__-1; +const uint OPCubeVec3=__LINE__-1; +const uint OPSquareVec4=__LINE__-1; +const uint OPCubeVec4=__LINE__-1; +const uint OPSquareMat2=__LINE__-1; +const uint OPCubeMat2=__LINE__-1; +const uint OPSquareMat3=__LINE__-1; +const uint OPCubeMat3=__LINE__-1; +const uint OPSquareMat4=__LINE__-1; +const uint OPCubeMat4=__LINE__-1; +const uint OPSDFSphere=__LINE__-1; \ No newline at end of file diff --git a/src/interpreter.glsl b/src/interpreter.glsl index 90941bf9b8c28ed50efc57574b3a3d12d531c4cb..df402210749b7be06e6247984ad79a56961ae43d 100644 --- a/src/interpreter.glsl +++ b/src/interpreter.glsl @@ -1,7 +1,9 @@ //#extension GL_EXT_shader_16bit_storage:require #extension GL_EXT_shader_explicit_arithmetic_types:require -layout(set=1,binding=0)uniform SceneDescription{ +#include "instructionset.glsl" + +layout(set=0,binding=2)uniform SceneDescription{ u32vec4 d[13];//stored packed for space efficiency, 8 per index }scene_description; @@ -32,96 +34,1400 @@ minor_integer_unpack=unpackUint2x16(major_unpack.w);\ minor_integer_cache[6]=minor_integer_unpack.x;\ minor_integer_cache[7]=minor_integer_unpack.y; -uint major_position=0; -uint minor_position=0; - -float16_t float_stack[8]; +float float_stack[8]; uint float_stack_head=0; -f16vec2 vec2_stack[8]; +vec2 vec2_stack[8]; uint vec2_stack_head=0; -f16vec3 vec3_stack[8]; +vec3 vec3_stack[8]; uint vec3_stack_head=0; -f16vec4 vec4_stack[8]; +vec4 vec4_stack[8]; uint vec4_stack_head=0; -f16mat2 mat2_stack[8]; +mat2 mat2_stack[8]; uint mat2_stack_head=0; -f16mat3 mat3_stack[8]; +mat3 mat3_stack[8]; uint mat3_stack_head=0; -f16mat4 mat4_stack[8]; +mat4 mat4_stack[8]; uint mat4_stack_head=0; +mat4 material_stack[8]; +uint material_stack_head=0; -void push_float(float16_t f){ +void push_float(float f){ float_stack[float_stack_head++]=f; } -float16_t pull_float(){ +float pull_float(){ return float_stack[--float_stack_head]; } -void push_vec2(f16vec2 f){ +void push_vec2(vec2 f){ vec2_stack[vec2_stack_head++]=f; } -f16vec2 pull_vec2(){ +vec2 pull_vec2(){ return vec2_stack[--vec2_stack_head]; } -void push_vec3(f16vec3 f){ +void push_vec3(vec3 f){ vec3_stack[vec3_stack_head++]=f; } -f16vec3 pull_vec3(){ +vec3 pull_vec3(){ return vec3_stack[--vec3_stack_head]; } -void push_vec4(f16vec4 f){ +void push_vec4(vec4 f){ vec4_stack[vec4_stack_head++]=f; } -f16vec4 pull_vec4(){ +vec4 pull_vec4(){ return vec4_stack[--vec4_stack_head]; } -void push_mat2(f16mat2 f){ +void push_mat2(mat2 f){ mat2_stack[mat2_stack_head++]=f; } -f16mat2 pull_mat2(){ +mat2 pull_mat2(){ return mat2_stack[--mat2_stack_head]; } -void push_mat3(f16mat3 f){ +void push_mat3(mat3 f){ mat3_stack[mat3_stack_head++]=f; } -f16mat3 pull_mat3(){ +mat3 pull_mat3(){ return mat3_stack[--mat3_stack_head]; } -void push_mat4(f16mat4 f){ +void push_mat4(mat4 f){ mat4_stack[mat4_stack_head++]=f; } -f16mat4 pull_mat4(){ +mat4 pull_mat4(){ return mat4_stack[--mat4_stack_head]; } -float scene(vec3 p) +void push_material(mat4 f){ + material_stack[material_stack_head++]=f; +} + +mat4 pull_material(){ + return material_stack[--material_stack_head]; +} + +void clear_stacks() +{ + float_stack_head=0; + vec2_stack_head=0; + vec3_stack_head=0; + vec4_stack_head=0; + mat2_stack_head=0; + mat3_stack_head=0; + mat4_stack_head=0; + material_stack_head=0; +} + +uint8_t mask[13]; + +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)); +} + +vec3 scene(vec3 p,bool material) { - major_position=0; - minor_position=0; + uint major_position=0; + uint minor_position=0; float16_t minor_float_cache[8]; uint16_t minor_integer_cache[8]; - if(minor_position==0){ - get_caches; - } + clear_stacks(); + push_vec3(p); - if(isnan(minor_float_cache[minor_position])) - { + bool cont=true; + + while(cont){ + 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) + { + 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()); + break; + case OPMulMat2Mat2: + push_mat2(pull_mat2()*pull_mat2()); + break; + case OPMulMat2Float: + push_mat2(pull_mat2()*pull_float()); + break; + case OPMulMat3Mat3: + push_mat3(pull_mat3()*pull_mat3()); + break; + case OPMulMat3Float: + push_mat3(pull_mat3()*pull_float()); + break; + case OPMulMat4Mat4: + push_mat4(pull_mat4()*pull_mat4()); + break; + case OPMulMat4Float: + push_mat4(pull_mat4()*pull_float()); + 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()); + break; + case OPSubMat2Mat2: + push_mat2(pull_mat2()-pull_mat2()); + break; + case OPSubMat2Float: + push_mat2(pull_mat2()-pull_float()); + break; + case OPSubMat3Mat3: + push_mat3(pull_mat3()-pull_mat3()); + break; + case OPSubMat3Float: + push_mat3(pull_mat3()-pull_float()); + break; + case OPSubMat4Mat4: + push_mat4(pull_mat4()-pull_mat4()); + break; + case OPSubMat4Float: + push_mat4(pull_mat4()-pull_float()); + 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()); + break; + case OPDivMat2Mat2: + push_mat2(pull_mat2()/pull_mat2()); + break; + case OPDivMat2Float: + push_mat2(pull_mat2()/pull_float()); + break; + case OPDivMat3Mat3: + push_mat3(pull_mat3()/pull_mat3()); + break; + case OPDivMat3Float: + push_mat3(pull_mat3()/pull_float()); + break; + case OPDivMat4Mat4: + push_mat4(pull_mat4()/pull_mat4()); + break; + case OPDivMat4Float: + push_mat4(pull_mat4()/pull_float()); + 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())); + break; + case OPModVec3Float: + push_vec3(mod(pull_vec3(),pull_float())); + break; + case OPModVec4Float: + push_vec4(mod(pull_vec4(),pull_float())); + break; + + case OPPowFloatFloat: + push_float(pow(pull_float(),pull_float())); + break; + case OPPowVec2Vec2: + push_vec2(pow(pull_vec2(),pull_vec2())); + break; + case OPPowVec3Vec3: + push_vec3(pow(pull_vec3(),pull_vec3())); + break; + case OPPowVec4Vec4: + push_vec4(pow(pull_vec4(),pull_vec4())); + 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())); + break; + case OPDeterminantMat2: + push_float(determinant(pull_mat2())); + break; + case OPDeterminantMat3: + push_float(determinant(pull_mat3())); + break; + case OPDeterminantMat4: + push_float(determinant(pull_mat4())); + break; + + case OPAbsFloat: + push_float(abs(pull_float())); + break; + case OPSignFloat: + push_float(sign(pull_float())); + break; + case OPFloorFloat: + push_float(floor(pull_float())); + break; + case OPCeilFloat: + push_float(ceil(pull_float())); + break; + case OPFractFloat: + push_float(fract(pull_float())); + break; + case OPSqrtFloat: + push_float(sqrt(pull_float())); + break; + case OPInverseSqrtFloat: + push_float(inversesqrt(pull_float())); + break; + case OPExpFloat: + push_float(exp(pull_float())); + break; + case OPExp2Float: + push_float(exp2(pull_float())); + break; + case OPLogFloat: + push_float(log(pull_float())); + break; + case OPLog2Float: + push_float(log2(pull_float())); + break; + case OPSinFloat: + push_float(sin(pull_float())); + break; + case OPCosFloat: + push_float(cos(pull_float())); + break; + case OPTanFloat: + push_float(tan(pull_float())); + break; + case OPAsinFloat: + push_float(asin(pull_float())); + break; + case OPAcosFloat: + push_float(acos(pull_float())); + break; + case OPAtanFloat: + push_float(atan(pull_float())); + break; + case OPAsinhFloat: + push_float(asinh(pull_float())); + break; + case OPAcoshFloat: + push_float(acosh(pull_float())); + break; + case OPAtanhFloat: + push_float(atanh(pull_float())); + break; + case OPSinhFloat: + push_float(sinh(pull_float())); + break; + case OPCoshFloat: + push_float(cosh(pull_float())); + break; + case OPTanhFloat: + push_float(tanh(pull_float())); + break; + case OPRoundFloat: + push_float(round(pull_float())); + break; + case OPTruncFloat: + push_float(trunc(pull_float())); + 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; + 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; + 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; + break; + case OPDupFloat: + push_float(float_stack[float_stack_head-1]); + break; + case OPDup2Float: + push_float(float_stack[float_stack_head-2]); + break; + case OPDup3Float: + push_float(float_stack[float_stack_head-3]); + break; + case OPDup4Float: + push_float(float_stack[float_stack_head-4]); + break; + case OPDropFloat: + float_stack_head--; + break; + case OPDrop2Float: + float_stack[float_stack_head-2]=float_stack[float_stack_head-1]; + float_stack_head--; + 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--; + 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--; + break; + + case OPAbsVec2: + push_vec2(abs(pull_vec2())); + break; + case OPSignVec2: + push_vec2(sign(pull_vec2())); + break; + case OPFloorVec2: + push_vec2(floor(pull_vec2())); + break; + case OPCeilVec2: + push_vec2(ceil(pull_vec2())); + break; + case OPFractVec2: + push_vec2(fract(pull_vec2())); + break; + case OPSqrtVec2: + push_vec2(sqrt(pull_vec2())); + break; + case OPInverseSqrtVec2: + push_vec2(inversesqrt(pull_vec2())); + break; + case OPExpVec2: + push_vec2(exp(pull_vec2())); + break; + case OPExp2Vec2: + push_vec2(exp2(pull_vec2())); + break; + case OPLogVec2: + push_vec2(log(pull_vec2())); + break; + case OPLog2Vec2: + push_vec2(log2(pull_vec2())); + break; + case OPSinVec2: + push_vec2(sin(pull_vec2())); + break; + case OPCosVec2: + push_vec2(cos(pull_vec2())); + break; + case OPTanVec2: + push_vec2(tan(pull_vec2())); + break; + case OPAsinVec2: + push_vec2(asin(pull_vec2())); + break; + case OPAcosVec2: + push_vec2(acos(pull_vec2())); + break; + case OPAtanVec2: + push_vec2(atan(pull_vec2())); + break; + case OPAsinhVec2: + push_vec2(asinh(pull_vec2())); + break; + case OPAcoshVec2: + push_vec2(acosh(pull_vec2())); + break; + case OPAtanhVec2: + push_vec2(atanh(pull_vec2())); + break; + case OPSinhVec2: + push_vec2(sinh(pull_vec2())); + break; + case OPCoshVec2: + push_vec2(cosh(pull_vec2())); + break; + case OPTanhVec2: + push_vec2(tanh(pull_vec2())); + break; + case OPRoundVec2: + push_vec2(round(pull_vec2())); + break; + case OPTruncVec2: + push_vec2(trunc(pull_vec2())); + 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; + 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; + 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; + break; + case OPDupVec2: + push_vec2(vec2_stack[vec2_stack_head-1]); + break; + case OPDup2Vec2: + push_vec2(vec2_stack[vec2_stack_head-2]); + break; + case OPDup3Vec2: + push_vec2(vec2_stack[vec2_stack_head-3]); + break; + case OPDup4Vec2: + push_vec2(vec2_stack[vec2_stack_head-4]); + break; + case OPDropVec2: + vec2_stack_head--; + break; + case OPDrop2Vec2: + vec2_stack[vec2_stack_head-2]=vec2_stack[vec2_stack_head-1]; + vec2_stack_head--; + 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--; + 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--; + break; + + case OPAbsVec3: + push_vec3(abs(pull_vec3())); + break; + case OPSignVec3: + push_vec3(sign(pull_vec3())); + break; + case OPFloorVec3: + push_vec3(floor(pull_vec3())); + break; + case OPCeilVec3: + push_vec3(ceil(pull_vec3())); + break; + case OPFractVec3: + push_vec3(fract(pull_vec3())); + break; + case OPSqrtVec3: + push_vec3(sqrt(pull_vec3())); + break; + case OPInverseSqrtVec3: + push_vec3(inversesqrt(pull_vec3())); + break; + case OPExpVec3: + push_vec3(exp(pull_vec3())); + break; + case OPExp2Vec3: + push_vec3(exp2(pull_vec3())); + break; + case OPLogVec3: + push_vec3(log(pull_vec3())); + break; + case OPLog2Vec3: + push_vec3(log2(pull_vec3())); + break; + case OPSinVec3: + push_vec3(sin(pull_vec3())); + break; + case OPCosVec3: + push_vec3(cos(pull_vec3())); + break; + case OPTanVec3: + push_vec3(tan(pull_vec3())); + break; + case OPAsinVec3: + push_vec3(asin(pull_vec3())); + break; + case OPAcosVec3: + push_vec3(acos(pull_vec3())); + break; + case OPAtanVec3: + push_vec3(atan(pull_vec3())); + break; + case OPAsinhVec3: + push_vec3(asinh(pull_vec3())); + break; + case OPAcoshVec3: + push_vec3(acosh(pull_vec3())); + break; + case OPAtanhVec3: + push_vec3(atanh(pull_vec3())); + break; + case OPSinhVec3: + push_vec3(sinh(pull_vec3())); + break; + case OPCoshVec3: + push_vec3(cosh(pull_vec3())); + break; + case OPTanhVec3: + push_vec3(tanh(pull_vec3())); + break; + case OPRoundVec3: + push_vec3(round(pull_vec3())); + break; + case OPTruncVec3: + push_vec3(trunc(pull_vec3())); + 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; + 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; + 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; + break; + case OPDupVec3: + push_vec3(vec3_stack[vec3_stack_head-1]); + break; + case OPDup2Vec3: + push_vec3(vec3_stack[vec3_stack_head-2]); + break; + case OPDup3Vec3: + push_vec3(vec3_stack[vec3_stack_head-3]); + break; + case OPDup4Vec3: + push_vec3(vec3_stack[vec3_stack_head-4]); + break; + case OPDropVec3: + vec3_stack_head--; + break; + case OPDrop2Vec3: + vec3_stack[vec3_stack_head-2]=vec3_stack[vec3_stack_head-1]; + vec3_stack_head--; + 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--; + 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--; + break; + + case OPAbsVec4: + push_vec4(abs(pull_vec4())); + break; + case OPSignVec4: + push_vec4(sign(pull_vec4())); + break; + case OPFloorVec4: + push_vec4(floor(pull_vec4())); + break; + case OPCeilVec4: + push_vec4(ceil(pull_vec4())); + break; + case OPFractVec4: + push_vec4(fract(pull_vec4())); + break; + case OPSqrtVec4: + push_vec4(sqrt(pull_vec4())); + break; + case OPInverseSqrtVec4: + push_vec4(inversesqrt(pull_vec4())); + break; + case OPExpVec4: + push_vec4(exp(pull_vec4())); + break; + case OPExp2Vec4: + push_vec4(exp2(pull_vec4())); + break; + case OPLogVec4: + push_vec4(log(pull_vec4())); + break; + case OPLog2Vec4: + push_vec4(log2(pull_vec4())); + break; + case OPSinVec4: + push_vec4(sin(pull_vec4())); + break; + case OPCosVec4: + push_vec4(cos(pull_vec4())); + break; + case OPTanVec4: + push_vec4(tan(pull_vec4())); + break; + case OPAsinVec4: + push_vec4(asin(pull_vec4())); + break; + case OPAcosVec4: + push_vec4(acos(pull_vec4())); + break; + case OPAtanVec4: + push_vec4(atan(pull_vec4())); + break; + case OPAsinhVec4: + push_vec4(asinh(pull_vec4())); + break; + case OPAcoshVec4: + push_vec4(acosh(pull_vec4())); + break; + case OPAtanhVec4: + push_vec4(atanh(pull_vec4())); + break; + case OPSinhVec4: + push_vec4(sinh(pull_vec4())); + break; + case OPCoshVec4: + push_vec4(cosh(pull_vec4())); + break; + case OPTanhVec4: + push_vec4(tanh(pull_vec4())); + break; + case OPRoundVec4: + push_vec4(round(pull_vec4())); + break; + case OPTruncVec4: + push_vec4(trunc(pull_vec4())); + 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; + 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; + 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; + break; + case OPDupVec4: + push_vec4(vec4_stack[vec4_stack_head-1]); + break; + case OPDup2Vec4: + push_vec4(vec4_stack[vec4_stack_head-2]); + break; + case OPDup3Vec4: + push_vec4(vec4_stack[vec4_stack_head-3]); + break; + case OPDup4Vec4: + push_vec4(vec4_stack[vec4_stack_head-4]); + break; + case OPDropVec4: + vec4_stack_head--; + break; + case OPDrop2Vec4: + vec4_stack[vec4_stack_head-2]=vec4_stack[vec4_stack_head-1]; + vec4_stack_head--; + 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--; + 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--; + 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--; + 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--; + 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; + 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; + 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; + break; + case OPDupMat3: + push_mat3(mat3_stack[mat3_stack_head-1]); + break; + case OPDup2Mat3: + push_mat3(mat3_stack[mat3_stack_head-2]); + break; + case OPDup3Mat3: + push_mat3(mat3_stack[mat3_stack_head-3]); + break; + case OPDup4Mat3: + push_mat3(mat3_stack[mat3_stack_head-4]); + break; + case OPDropMat3: + mat3_stack_head--; + break; + case OPDrop2Mat3: + mat3_stack[mat3_stack_head-2]=mat3_stack[mat3_stack_head-1]; + mat3_stack_head--; + 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--; + 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--; + 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; + 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; + 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; + break; + case OPDupMat4: + push_mat4(mat4_stack[mat4_stack_head-1]); + break; + case OPDup2Mat4: + push_mat4(mat4_stack[mat4_stack_head-2]); + break; + case OPDup3Mat4: + push_mat4(mat4_stack[mat4_stack_head-3]); + break; + case OPDup4Mat4: + push_mat4(mat4_stack[mat4_stack_head-4]); + break; + case OPDropMat4: + mat4_stack_head--; + break; + case OPDrop2Mat4: + mat4_stack[mat4_stack_head-2]=mat4_stack[mat4_stack_head-1]; + mat4_stack_head--; + 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--; + 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--; + break; + + case OPMinFloat: + push_float(min(pull_float(),pull_float())); + break; + case OPMaxFloat: + push_float(max(pull_float(),pull_float())); + break; + 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))); + } + } + break; + 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))); + } + } + 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]; + } + } + } + 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]; + } + } + } + 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())); + break; + + case OPFMAFloat: + push_float(fma(pull_float(),pull_float(),pull_float())); + break; + case OPFMAVec2: + push_vec2(fma(pull_vec2(),pull_vec2(),pull_vec2())); + break; + case OPFMAVec3: + push_vec3(fma(pull_vec3(),pull_vec3(),pull_vec3())); + break; + case OPFMAVec4: + push_vec4(fma(pull_vec4(),pull_vec4(),pull_vec4())); + break; + + case OPOuterProductMat2: + push_mat2(outerProduct(pull_vec2(),pull_vec2())); + break; + case OPOuterProductMat3: + push_mat3(outerProduct(pull_vec3(),pull_vec3())); + break; + case OPOuterProductMat4: + push_mat4(outerProduct(pull_vec4(),pull_vec4())); + break; + + case OPCompMultMat2: + push_mat2(matrixCompMult(pull_mat2(),pull_mat2())); + break; + case OPCompMultMat3: + push_mat3(matrixCompMult(pull_mat3(),pull_mat3())); + break; + case OPCompMultMat4: + push_mat4(matrixCompMult(pull_mat4(),pull_mat4())); + break; + + case OPClampFloatFloat: + push_float(clamp(pull_float(),pull_float(),pull_float())); + break; + case OPClampVec2Vec2: + push_vec2(clamp(pull_vec2(),pull_vec2(),pull_vec2())); + break; + case OPClampVec3Vec3: + push_vec3(clamp(pull_vec3(),pull_vec3(),pull_vec3())); + break; + case OPClampVec4Vec4: + push_vec4(clamp(pull_vec4(),pull_vec4(),pull_vec4())); + break; + case OPClampVec2Float: + push_vec2(clamp(pull_vec2(),pull_float(),pull_float())); + break; + case OPClampVec3Float: + push_vec3(clamp(pull_vec3(),pull_float(),pull_float())); + break; + case OPClampVec4Float: + push_vec4(clamp(pull_vec4(),pull_float(),pull_float())); + break; + + case OPMixFloatFloat: + push_float(mix(pull_float(),pull_float(),pull_float())); + break; + case OPMixVec2Vec2: + push_vec2(mix(pull_vec2(),pull_vec2(),pull_vec2())); + break; + case OPMixVec3Vec3: + push_vec3(mix(pull_vec3(),pull_vec3(),pull_vec3())); + break; + case OPMixVec4Vec4: + push_vec4(mix(pull_vec4(),pull_vec4(),pull_vec4())); + break; + case OPMixVec2Float: + push_vec2(mix(pull_vec2(),pull_vec2(),pull_float())); + break; + case OPMixVec3Float: + push_vec3(mix(pull_vec3(),pull_vec3(),pull_float())); + break; + case OPMixVec4Float: + push_vec4(mix(pull_vec4(),pull_vec4(),pull_float())); + break; + + case OPSquareFloat: + floattemp=pull_float(); + push_float(floattemp*floattemp); + break; + case OPCubeFloat: + floattemp=pull_float(); + push_float(floattemp*floattemp*floattemp); + break; + case OPSquareVec2: + vec2temp=pull_vec2(); + push_vec2(vec2temp*vec2temp); + break; + case OPCubeVec2: + vec2temp=pull_vec2(); + push_vec2(vec2temp*vec2temp*vec2temp); + break; + case OPSquareVec3: + vec3temp=pull_vec3(); + push_vec3(vec3temp*vec3temp); + break; + case OPCubeVec3: + vec3temp=pull_vec3(); + push_vec3(vec3temp*vec3temp*vec3temp); + break; + case OPSquareVec4: + vec4temp=pull_vec4(); + push_vec4(vec4temp*vec4temp); + break; + case OPCubeVec4: + vec4temp=pull_vec4(); + push_vec4(vec4temp*vec4temp*vec4temp); + break; + case OPSquareMat2: + mat2temp=pull_mat2(); + push_mat2(mat2temp*mat2temp); + break; + case OPCubeMat2: + mat2temp=pull_mat2(); + push_mat2(mat2temp*mat2temp*mat2temp); + break; + case OPSquareMat3: + mat3temp=pull_mat3(); + push_mat3(mat3temp*mat3temp); + break; + case OPCubeMat3: + mat3temp=pull_mat3(); + push_mat3(mat3temp*mat3temp*mat3temp); + break; + case OPSquareMat4: + mat4temp=pull_mat4(); + push_mat4(mat4temp*mat4temp); + break; + case OPCubeMat4: + mat4temp=pull_mat4(); + push_mat4(mat4temp*mat4temp*mat4temp); + break; + + case OPSDFSphere: + { + float r=pull_float(); + vec3 p=pull_vec3(); + + push_float(length(p)-r); + if(material){ + push_material(pull_mat4()); + } + //return p; + //return vec3(0.,1.,1.); + } + break; + + case OPNop: + break; + case OPStop: + return vec3(pull_float()); + case OPInvalid: + default: + return vec3(float(minor_float_cache[minor_position])); + } + }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) + { + return vec3(pull_float()); + } + } } - - return length(p-vec3(5.))-5.; } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 901d1e0109574429cac4f0fd10b7b53ea2988f18..de72adc0a1e1969002b01b71753ff9778390be5f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use vulkano::descriptor_set::allocator::StandardDescriptorSetAllocator; use vulkano::descriptor_set::{PersistentDescriptorSet, WriteDescriptorSet}; use vulkano::device::{DeviceOwned, Features, QueueFlags}; use vulkano::format::Format; +use vulkano::half::f16; use vulkano::image::view::ImageViewCreateInfo; use vulkano::image::{AttachmentImage, SampleCount}; use vulkano::memory::allocator::StandardMemoryAllocator; @@ -61,6 +62,12 @@ mod objects; use crate::objects::*; mod mcsg_deserialise; +mod instruction_set { + include!(concat!(env!("OUT_DIR"), "/instructionset.rs")); +} + +use crate::instruction_set::InstructionSet; + pub type MemoryAllocator = StandardMemoryAllocator; fn main() { @@ -140,6 +147,7 @@ fn main() { sample_rate_shading: true, shader_float16: true, shader_int16: true, + shader_int8: true, ..Features::empty() }, ..Default::default() @@ -601,6 +609,66 @@ fn main() { sub }; + let csg_object = { + let mut data = [[0u32; 4]; 13]; + + let parts = vec![ + CSGPart::literal(0i8.into()), + CSGPart::literal(2i8.into()), + CSGPart::literal(0i8.into()), + CSGPart::opcode(InstructionSet::OPDupVec3), + CSGPart::opcode(InstructionSet::OPPromoteFloatFloatFloatVec3), + CSGPart::opcode(InstructionSet::OPSubVec3Vec3), + CSGPart::literal(3i8.into()), + CSGPart::opcode(InstructionSet::OPSDFSphere), + CSGPart::literal(0i8.into()), + CSGPart::literal(2i8.into()), + CSGPart::literal(0i8.into()), + CSGPart::opcode(InstructionSet::OPPromoteFloatFloatFloatVec3), + CSGPart::opcode(InstructionSet::OPAddVec3Vec3), + CSGPart::literal(3i8.into()), + CSGPart::opcode(InstructionSet::OPSDFSphere), + CSGPart::literal(f16::from_f32(0.5)), + CSGPart::opcode(InstructionSet::OPSmoothMinFloat), + CSGPart::opcode(InstructionSet::OPStop), + ]; + + let mut lower = true; + let mut minor = 0; + let mut major = 0; + + for part in parts { + data[major][minor] |= (part.code as u32) << (if lower { 0 } else { 16 }); + + lower = !lower; + if lower { + minor += 1; + if minor == 4 { + minor = 0; + major += 1; + if major == 13 { + panic!("CSGParts Too full!"); + } + } + } + } + + //01111101010101000000000000000000 + + /*data[0][0] = ((CSGPart::literal(5u8.into()).code as u32) << 0) + | ((CSGPart::opcode(InstructionSet::OPSDFSphere).code as u32) << 16); + data[0][1] = ((CSGPart::opcode(InstructionSet::OPStop).code as u32) << 16) + | (CSGPart::opcode(InstructionSet::OPStop).code as u32);*/ + + println!("data: {:?}, {:?}", data[0][0], data[0][1]); + + let uniform_data = implicit_fs::ty::SceneDescription { d: data }; + + let sub = uniform_buffer.allocate_sized().unwrap(); + *sub.write().unwrap() = uniform_data; + sub + }; + let mesh_layout = mesh_pipeline.layout().set_layouts().get(0).unwrap(); let mesh_set = PersistentDescriptorSet::new( &descriptor_set_allocator, @@ -619,6 +687,7 @@ fn main() { [ WriteDescriptorSet::buffer(0, uniform_buffer_subbuffer.clone()), WriteDescriptorSet::buffer(1, cam_set.clone()), + WriteDescriptorSet::buffer(2, csg_object.clone()), ], ) .unwrap(); diff --git a/src/objects.rs b/src/objects.rs index 1a94354fbf4e50e0e68e75583da1598cb6ba22f6..dc56801fc78973c18b5b8219ef61e72d4a05e3d1 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -2,7 +2,6 @@ use std::{ collections::HashMap, io::{Cursor, Read}, mem, - num::ParseFloatError, }; use bytemuck::{Pod, Zeroable}; @@ -15,10 +14,8 @@ use vulkano::{ pipeline::graphics::vertex_input::Vertex, }; -use crate::{ - mcsg_deserialise::{from_reader, Deserializer}, - MemoryAllocator, -}; +use crate::instruction_set::InstructionSet; +use crate::{mcsg_deserialise::from_reader, MemoryAllocator}; pub const PLATONIC_SOLIDS: [(&str, &[u8]); 1] = [("Buny", include_bytes!("bunny.obj"))]; pub const CSG_SOLIDS: [(&str, &[u8]); 1] = [("Primitives", include_bytes!("primitive.mcsg"))]; @@ -58,20 +55,11 @@ pub struct CSG { #[derive(Clone, Copy, Debug, Default, Zeroable, Pod, Vertex)] pub struct CSGPart { #[format(R16_SFLOAT)] - code: u16, -} - -#[repr(u8)] -#[derive(Copy, Clone, Debug, Default)] -pub enum CSGOpcode { - Infinity = 0, // 0 is actually FP16 infinity, perfectly normal representation - #[default] - None, - Const, + pub code: u16, } impl CSGPart { - pub fn opcode(opcode: CSGOpcode) -> CSGPart { + pub fn opcode(opcode: InstructionSet) -> CSGPart { CSGPart { code: opcode as u16 | 0b0111110000000000, }