diff --git a/src/frag.glsl b/src/frag.glsl index fcb43d7c23c572d4a0a808a3b0aad222d042d286..fca2b23396e7d9cfdf7cc38a149c3e57529f91a7 100644 --- a/src/frag.glsl +++ b/src/frag.glsl @@ -43,10 +43,7 @@ vec3 shading(vec3 normal) #define NEARPLANE 0. #define FARPLANE length(vec3(10)) -float scene(vec3 p) -{ - return length(p-vec3(5.))-5.; -} +#include "interpreter.glsl" vec3 getNormal(vec3 p,float dens){ vec3 n; diff --git a/src/instructionset.md b/src/instructionset.md index a45eb460dab33fe72c8305bc6829c175ee138984..b1243f204b80a11bae0e06e13160c2cf668a4301 100644 --- a/src/instructionset.md +++ b/src/instructionset.md @@ -8,27 +8,72 @@ - Vec3Vec3 (returns vec3) - FloatVec3 (returns vec3) - Vec3Float (returns vec3) -- Mat2Mat2 + AddVec4Vec4 (returns mat2/vec4) -- Mat2Float + AddVec4Float (returns mat2/vec4) -- FloatMat2 + AddFloatVec4 (returns mat2/vec4) +- Vec4Vec4 (returns vec4) +- FloatVec4 (returns vec4) +- Vec4Float (returns vec4) +- Mat2Mat2 (returns mat2) +- Mat2Float (returns mat2) +- FloatMat2 (returns mat2) - Mat3Mat3 (returns mat3) - Mat3Float (returns mat3) - FloatMat3 (returns mat3) - Mat4Mat4 (returns mat4) - Mat4Float (returns mat4) - FloatMat4 (returns mat4) -### instructions +### duo instructions - Add - Sub - Mul - Div -### Extra Multiplication +- Mod +- Pow +### unary types +- Float +- Vec2 +- Vec3 +- Vec4 +- Mat2 +- Mat3 +- Mat4 +### unary instructions +- abs +- sign +- floor +- ceil +- fract +- sqrt +- inversesqrt +- exp +- exp2 +- log +- log2 +- sin +- cos +- tan +- asin +- acos +- atan +### Extra Matrix - MulMat2Vec2 (returns vec2) - MulVec2Mat2 (returns vec2) - MulMat3Vec3 (returns vec3) - MulVec3Mat3 (returns vec3) - MulMat4Vec4 (returns vec4) - MulVec4Mat4 (returns vec4) +### Extra Vector +- CrossVec3Vec3 (returns vec3) +- DotVec2Vec2 (returns vec2) +- DotVec3Vec3 (returns vec3) +- DotVec4Vec4 (returns vec4) +- LengthVec2 (returns float) +- LengthVec3 (returns float) +- LengthVec4 (returns float) +- DistanceVec2 (returns float) +- DistanceVec3 (returns float) +- DistanceVec4 (returns float) +- NormaliseVec2 (returns float) +- NormaliseVec3 (returns float) +- NormaliseVec4 (returns float) ## Matrix manipulation - TransposeMat2 - TransposeMat3 @@ -36,20 +81,52 @@ - InvertMat2 - InvertMat3 - InvertMat4 +## Promotion and Demotion +- PromoteFloatFloatVec2 +- PromoteFloatFloatFloatVec3 +- PromoteFloatFloatFloatFloatVec4 +- PromoteVec2FloatVec3 +- PromoteVec2FloatFloatVec4 +- PromoteVec2Vec2Vec4 +- PromoteVec3FloatVec4 +- Promote4FloatMat2 +- Promote2Vec2Mat2 +- PromoteVec4Mat2 +- Promote3Vec3Mat3 +- Promote4Vec4Mat4 +- PromoteMat2Mat3 +- PromoteMat2Mat4 +- Promote4Mat2Mat4 +- PromoteMat3Mat4 +- DemoteVec2FloatFloat +- DemoteVec3FloatFloatFloat +- DemoteVec4FloatFloatFloatFloat +- DemoteMat2Float +- DemoteMat2Vec2 +- DemoteMat2Vec4 +- DemoteMat3Vec3 +- DemoteMat4Vec4 ## Data manipulation ### Types - Float - Vec2 - Vec3 - Vec4 +- Mat2 - Mat3 - Mat4 -### Swaps -SWAP aaabbb -where a is type1 -where b is type2 - -### Dups -DUPLICATE aaaddddd -where a is type -where d is distance back in floats \ No newline at end of file +### Instructions +- Swap2 (a b -- b a) +- Swap3 (a b c -- c b a) +- [Swap4 (a b c d -- d b c a)] +- Dup (a -- a a) +- Dup2 (a b -- a b a) +- Dup3 (a b c -- a b c a) +- [Dup4 (a b c d-- a b c d a)] +- Drop (a -- ) +- Drop2 (a b -- b) +- Drop3 (a b c -- b c) +- [Drop4 (a b c d -- b c d)] +## Extra +- Stop +- Nop \ No newline at end of file diff --git a/src/interpreter.glsl b/src/interpreter.glsl new file mode 100644 index 0000000000000000000000000000000000000000..90941bf9b8c28ed50efc57574b3a3d12d531c4cb --- /dev/null +++ b/src/interpreter.glsl @@ -0,0 +1,127 @@ +//#extension GL_EXT_shader_16bit_storage:require +#extension GL_EXT_shader_explicit_arithmetic_types:require + +layout(set=1,binding=0)uniform SceneDescription{ + u32vec4 d[13];//stored packed for space efficiency, 8 per index +}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; + +uint major_position=0; +uint minor_position=0; + +float16_t float_stack[8]; +uint float_stack_head=0; +f16vec2 vec2_stack[8]; +uint vec2_stack_head=0; +f16vec3 vec3_stack[8]; +uint vec3_stack_head=0; +f16vec4 vec4_stack[8]; +uint vec4_stack_head=0; +f16mat2 mat2_stack[8]; +uint mat2_stack_head=0; +f16mat3 mat3_stack[8]; +uint mat3_stack_head=0; +f16mat4 mat4_stack[8]; +uint mat4_stack_head=0; + +void push_float(float16_t f){ + float_stack[float_stack_head++]=f; +} + +float16_t pull_float(){ + return float_stack[--float_stack_head]; +} + +void push_vec2(f16vec2 f){ + vec2_stack[vec2_stack_head++]=f; +} + +f16vec2 pull_vec2(){ + return vec2_stack[--vec2_stack_head]; +} + +void push_vec3(f16vec3 f){ + vec3_stack[vec3_stack_head++]=f; +} + +f16vec3 pull_vec3(){ + return vec3_stack[--vec3_stack_head]; +} + +void push_vec4(f16vec4 f){ + vec4_stack[vec4_stack_head++]=f; +} + +f16vec4 pull_vec4(){ + return vec4_stack[--vec4_stack_head]; +} + +void push_mat2(f16mat2 f){ + mat2_stack[mat2_stack_head++]=f; +} + +f16mat2 pull_mat2(){ + return mat2_stack[--mat2_stack_head]; +} + +void push_mat3(f16mat3 f){ + mat3_stack[mat3_stack_head++]=f; +} + +f16mat3 pull_mat3(){ + return mat3_stack[--mat3_stack_head]; +} + +void push_mat4(f16mat4 f){ + mat4_stack[mat4_stack_head++]=f; +} + +f16mat4 pull_mat4(){ + return mat4_stack[--mat4_stack_head]; +} + +float scene(vec3 p) +{ + major_position=0; + minor_position=0; + + float16_t minor_float_cache[8]; + uint16_t minor_integer_cache[8]; + + if(minor_position==0){ + get_caches; + } + + if(isnan(minor_float_cache[minor_position])) + { + + } + + return length(p-vec3(5.))-5.; +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 9ebea850ad6b694eaa2d431f0105b3e571df2cd5..901d1e0109574429cac4f0fd10b7b53ea2988f18 100644 --- a/src/main.rs +++ b/src/main.rs @@ -138,6 +138,8 @@ fn main() { mesh_shader: true, task_shader: true, sample_rate_shading: true, + shader_float16: true, + shader_int16: true, ..Features::empty() }, ..Default::default() @@ -372,8 +374,8 @@ fn main() { d: false, }; - gstate.meshes.push( - load_obj( + gstate.meshes.append( + &mut load_obj( &memory_allocator, &mut Cursor::new(PLATONIC_SOLIDS[0].1), PLATONIC_SOLIDS[0].0.to_string(), @@ -381,8 +383,8 @@ fn main() { .unwrap(), ); - gstate.csg.push( - load_csg( + gstate.csg.append( + &mut load_csg( &memory_allocator, &mut Cursor::new(CSG_SOLIDS[0].1), CSG_SOLIDS[0].0.to_string(), @@ -674,8 +676,12 @@ fn main() { push_constants.world = (Matrix4::from_translation(object.pos - Point3::origin()) * Matrix4::from(object.rot) - * object.scale) - .into(); + * Matrix4::from_nonuniform_scale( + object.scale.x, + object.scale.y, + object.scale.z, + )) + .into(); builder .bind_vertex_buffers(0, object.vertices.clone()) .bind_index_buffer(object.indices.clone()) diff --git a/src/objects.rs b/src/objects.rs index 55f866704ed3570ebfdca00dba32edc109591270..1a94354fbf4e50e0e68e75583da1598cb6ba22f6 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -88,7 +88,7 @@ pub fn load_obj( memory_allocator: &MemoryAllocator, input: &mut dyn Read, name: String, -) -> Result<Mesh, ObjError> { +) -> Result<Vec<Mesh>, ObjError> { let object = ObjData::load_buf_with_config(input, LoadConfig::default())?; let mut vertices = vec![]; @@ -141,7 +141,7 @@ pub fn load_obj( ) .unwrap(); - Ok(Mesh { + Ok(vec![Mesh { vertices: vertex_buffer, indices: index_buffer, pos: Point3 { @@ -156,7 +156,7 @@ pub fn load_obj( z: 1., }, name, - }) + }]) } #[derive(Serialize, Deserialize)] @@ -317,7 +317,7 @@ pub fn load_csg( .iter() .enumerate() .map(|(i, o)| { - let name = name + "_" + o.get("name").unwrap_or(&"unknown".to_owned()); + let name = name.clone() + "_" + o.get("name").unwrap_or(&"unknown".to_owned()); let trs = get_trs(&o)?; let color = get_color(&o)?;