diff --git a/src/frag.glsl b/src/frag.glsl
index c16e5da43fe17ca20d18a7bcdc5f6ef66065e2d9..6a256fae4f183641bffd14343bc07bd8acdc7793 100644
--- a/src/frag.glsl
+++ b/src/frag.glsl
@@ -28,10 +28,12 @@ const uint MAX_STEPS=50;
 vec3 shading(vec3 normal)
 {
     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;
     
     for(int i=0;i<light_uniforms.light_count;i++)
     {
-        accum+=light_uniforms.col[i].xyz*((dot(normalize(normal),light_uniforms.pos[i].xyz)*.5)+.5);
+        accum+=light_uniforms.col[i].xyz*((dot(normalize(rotation*normal),normalize(light_uniforms.pos[i].xyz-position))*.5)+.5);
     }
     
     return accum;
@@ -69,15 +71,19 @@ 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.;
+    //#ifdef ssaa
+    //vec2 iuv=(gl_FragCoord.xy+gl_SamplePosition)/iResolution.xy*2.-1.;
+    //#else
+    vec2 iuv=(gl_FragCoord.xy)/iResolution.xy*2.-1.;
+    //#endif
     vec2 uv=iuv;
     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;
+    vec3 raydir=normalize(raypos-(inverse(pc.world)*vec4(camera_uniforms.campos,1)).xyz);
+    //raypos-=vec3(5);
+    
+    //f_color=vec4(raydir,1.);
+    //return;
     
     vec2 td=spheretracing(raypos,raydir,p);
     vec3 n=getNormal(p,td.y);
@@ -86,9 +92,8 @@ void main(){
         f_color=vec4(1.);
         f_color=vec4(shading(n),1.);
         
-        vec4 tpoint=camera_uniforms.proj*camera_uniforms.view*vec4(p,1);
+        vec4 tpoint=camera_uniforms.proj*camera_uniforms.view*pc.world*vec4(p,1);
         gl_FragDepth=(tpoint.z/tpoint.w);
-        //gl_FragDepth=gl_DepthRange.diff*(((tpoint.z/tpoint.w)+1.)*.5)+gl_DepthRange.near;
     }
     else
     {
diff --git a/src/gui.rs b/src/gui.rs
index 7649105489edeca0e1052da65699564e46a6ac86..7a8464d8188c31d2bac4f8c9574168b58fad71ad 100644
--- a/src/gui.rs
+++ b/src/gui.rs
@@ -63,6 +63,16 @@ pub fn gui_up(gui: &mut Gui, state: &mut GState) {
                             ui.add(egui::Slider::new(&mut mesh.rot.y.0, 0.0..=360.0).text("Rotation.y"));
                             ui.add(egui::Slider::new(&mut mesh.rot.z.0, 0.0..=360.0).text("Rotation.z"));
                         }
+                        ui.heading("Implicit Surfaces");
+                        for csg in &mut state.csg {
+                            ui.label(csg.name.clone());
+                            ui.add(egui::Slider::new(&mut csg.pos.x, -100.0..=100.0).text("Position.x"));
+                            ui.add(egui::Slider::new(&mut csg.pos.y, -100.0..=100.0).text("Position.y"));
+                            ui.add(egui::Slider::new(&mut csg.pos.z, -100.0..=100.0).text("Position.z"));
+                            ui.add(egui::Slider::new(&mut csg.rot.x.0, 0.0..=360.0).text("Rotation.x"));
+                            ui.add(egui::Slider::new(&mut csg.rot.y.0, 0.0..=360.0).text("Rotation.y"));
+                            ui.add(egui::Slider::new(&mut csg.rot.z.0, 0.0..=360.0).text("Rotation.z"));
+                        }
                         ui.heading("Lights");
                         for light in &mut state.lights {
                             ui.label("Light");
diff --git a/src/implicit.mesh.glsl b/src/implicit.mesh.glsl
index 13bcc97cf0ffe6e17060b137f91cefddf487e676..d68b11c61d6457a91660d65f89ea83eed026382a 100644
--- a/src/implicit.mesh.glsl
+++ b/src/implicit.mesh.glsl
@@ -14,21 +14,15 @@ layout(location=0)out VertexOutput
 }vertexOutput[];
 
 const vec4[8]positions={
-    vec4(0.,0.,0.,1.),
-    vec4(0.,0.,1.,1.),
-    vec4(0.,1.,0.,1.),
-    vec4(0.,1.,1.,1.),
-    vec4(1.,0.,0.,1.),
-    vec4(1.,0.,1.,1.),
-    vec4(1.,1.,0.,1.),
-    vec4(1.,1.,1.,1.),
+    vec4(-.5,-.5,-.5,1.),
+    vec4(-.5,-.5,.5,1.),
+    vec4(-.5,.5,-.5,1.),
+    vec4(-.5,.5,.5,1.),
+    vec4(.5,-.5,-.5,1.),
+    vec4(.5,-.5,.5,1.),
+    vec4(.5,.5,-.5,1.),
+    vec4(.5,.5,.5,1.),
 };
-const mat4 scale=mat4(
-    10.,0.,0.,0.,
-    0.,10.,0.,0.,
-    0.,0.,10.,0.,
-    0.,0.,0.,1.
-);
 
 void main()
 {
@@ -36,34 +30,47 @@ void main()
     
     vec4 offset=vec4(0.,0.,gl_GlobalInvocationID.x,0.);
     
-    SetMeshOutputsEXT(8,12);
-    mat4 mvp=camera_uniforms.proj*camera_uniforms.view*scale;
-    gl_MeshVerticesEXT[0].gl_Position=mvp*(positions[0]+offset);
-    gl_MeshVerticesEXT[1].gl_Position=mvp*(positions[1]+offset);
-    gl_MeshVerticesEXT[2].gl_Position=mvp*(positions[2]+offset);
-    gl_MeshVerticesEXT[3].gl_Position=mvp*(positions[3]+offset);
-    gl_MeshVerticesEXT[4].gl_Position=mvp*(positions[4]+offset);
-    gl_MeshVerticesEXT[5].gl_Position=mvp*(positions[5]+offset);
-    gl_MeshVerticesEXT[6].gl_Position=mvp*(positions[6]+offset);
-    gl_MeshVerticesEXT[7].gl_Position=mvp*(positions[7]+offset);
-    vertexOutput[0].position=scale*positions[0];
-    vertexOutput[1].position=scale*positions[1];
-    vertexOutput[2].position=scale*positions[2];
-    vertexOutput[3].position=scale*positions[3];
-    vertexOutput[4].position=scale*positions[4];
-    vertexOutput[5].position=scale*positions[5];
-    vertexOutput[6].position=scale*positions[6];
-    vertexOutput[7].position=scale*positions[7];
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+0]=uvec3(0,1,2);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+1]=uvec3(1,2,3);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+2]=uvec3(4,5,6);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+3]=uvec3(5,6,7);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+4]=uvec3(0,2,4);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+5]=uvec3(2,4,6);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+6]=uvec3(1,3,5);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+7]=uvec3(3,5,7);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+8]=uvec3(2,3,6);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+9]=uvec3(3,6,7);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+10]=uvec3(0,1,4);
-    gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+11]=uvec3(1,4,5);
+    vec3 signingvec=sign((inverse(pc.world)*vec4(camera_uniforms.campos,1)).xyz);
+    
+    SetMeshOutputsEXT(8,6);
+    mat4 mvp=camera_uniforms.proj*camera_uniforms.view*pc.world;
+    //mat4 sw=pc.world;
+    gl_MeshVerticesEXT[0].gl_Position=mvp*(positions[0]);
+    gl_MeshVerticesEXT[1].gl_Position=mvp*(positions[1]);
+    gl_MeshVerticesEXT[2].gl_Position=mvp*(positions[2]);
+    gl_MeshVerticesEXT[3].gl_Position=mvp*(positions[3]);
+    gl_MeshVerticesEXT[4].gl_Position=mvp*(positions[4]);
+    gl_MeshVerticesEXT[5].gl_Position=mvp*(positions[5]);
+    gl_MeshVerticesEXT[6].gl_Position=mvp*(positions[6]);
+    gl_MeshVerticesEXT[7].gl_Position=mvp*(positions[7]);
+    vertexOutput[0].position=(positions[0]);
+    vertexOutput[1].position=(positions[1]);
+    vertexOutput[2].position=(positions[2]);
+    vertexOutput[3].position=(positions[3]);
+    vertexOutput[4].position=(positions[4]);
+    vertexOutput[5].position=(positions[5]);
+    vertexOutput[6].position=(positions[6]);
+    vertexOutput[7].position=(positions[7]);
+    
+    if(signingvec.x>0){
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+0]=uvec3(4,5,6);
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+1]=uvec3(5,6,7);
+    }else{
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+0]=uvec3(0,1,2);
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+1]=uvec3(1,2,3);
+    }
+    if(signingvec.y>0){
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+2]=uvec3(2,3,6);
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+3]=uvec3(7,3,6);
+    }else{
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+2]=uvec3(0,1,4);
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+3]=uvec3(5,1,4);
+    }
+    if(signingvec.z>0){
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+4]=uvec3(1,3,5);
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+5]=uvec3(3,5,7);
+    }else{
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+4]=uvec3(0,2,4);
+        gl_PrimitiveTriangleIndicesEXT[gl_LocalInvocationIndex+5]=uvec3(2,4,6);
+    }
 }
\ No newline at end of file
diff --git a/src/main.rs b/src/main.rs
index de72adc0a1e1969002b01b71753ff9778390be5f..206b5fb38208ed1c0c5825e9c8fd456c2ef77d8a 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -89,7 +89,7 @@ fn main() {
 
     let event_loop = EventLoop::new();
     let surface = WindowBuilder::new()
-        .with_title("horizontally spinning bunny")
+        .with_title("Implicit Surfaces")
         .build_vk_surface(&event_loop, instance.clone())
         .unwrap();
 
@@ -124,7 +124,7 @@ fn main() {
                 _ => 5,
             }
         })
-        .expect("No suitable physical device found");
+        .expect("No suitable physical device found. Do you have a Mesh Shader capable GPU and are your drivers up to date?");
 
     // Some little debug infos.
     println!(
@@ -402,10 +402,10 @@ fn main() {
 
     gstate
         .lights
-        .push(Light::new([4., 6., 8.], [1., 1., 8.], 0.01));
+        .push(Light::new([4., 6., 8.], [1., 1., 8.], 0.05));
     gstate
         .lights
-        .push(Light::new([-4., 6., -8.], [8., 4., 1.], 0.01));
+        .push(Light::new([-4., 6., -8.], [8., 4., 1.], 0.05));
 
     event_loop.run(move |event, _, control_flow| {
         if let Event::WindowEvent { event: we, .. } = &event {
@@ -517,28 +517,28 @@ fn main() {
                             campos -= Matrix3::from_angle_y(camforward.y)
                                 * Matrix3::from_angle_x(camforward.x)
                                 * Vector3::unit_z()
-                                * 0.02
+                                * 0.01
                                 * gstate.move_speed;
                         }
                         if keys.s {
                             campos += Matrix3::from_angle_y(camforward.y)
                                 * Matrix3::from_angle_x(camforward.x)
                                 * Vector3::unit_z()
-                                * 0.02
+                                * 0.01
                                 * gstate.move_speed;
                         }
                         if keys.a {
                             campos += Matrix3::from_angle_y(camforward.y)
                                 * Matrix3::from_angle_x(camforward.x)
                                 * Vector3::unit_x()
-                                * 0.02
+                                * 0.01
                                 * gstate.move_speed;
                         }
                         if keys.d {
                             campos -= Matrix3::from_angle_y(camforward.y)
                                 * Matrix3::from_angle_x(camforward.x)
                                 * Vector3::unit_x()
-                                * 0.02
+                                * 0.01
                                 * gstate.move_speed;
                         }
                     } else {
@@ -559,11 +559,9 @@ fn main() {
                         near,
                         far,
                     );
-                    let scale = 0.01;
                     let view = Matrix4::from(camforward)
                         * Matrix4::from_angle_z(Deg(180f32))
-                        * Matrix4::from_translation(Point3::origin() - campos)
-                        * Matrix4::from_scale(scale);
+                        * Matrix4::from_translation(Point3::origin() - campos);
 
                     let pc = mesh_vs::ty::PushConstantData {
                         world: Matrix4::identity().into(),
@@ -572,7 +570,7 @@ fn main() {
                     let uniform_data = mesh_fs::ty::Camera {
                         view: view.into(),
                         proj: proj.into(),
-                        campos: (campos * (far - near)).into(),
+                        campos: (campos).into(),
                     };
 
                     let sub = uniform_buffer.allocate_sized().unwrap();
@@ -614,21 +612,21 @@ fn main() {
 
                     let parts = vec![
                         CSGPart::literal(0i8.into()),
-                        CSGPart::literal(2i8.into()),
+                        CSGPart::literal(f16::from_f32(0.2)),
                         CSGPart::literal(0i8.into()),
                         CSGPart::opcode(InstructionSet::OPDupVec3),
                         CSGPart::opcode(InstructionSet::OPPromoteFloatFloatFloatVec3),
                         CSGPart::opcode(InstructionSet::OPSubVec3Vec3),
-                        CSGPart::literal(3i8.into()),
+                        CSGPart::literal(f16::from_f32(0.3)),
                         CSGPart::opcode(InstructionSet::OPSDFSphere),
                         CSGPart::literal(0i8.into()),
-                        CSGPart::literal(2i8.into()),
+                        CSGPart::literal(f16::from_f32(0.2)),
                         CSGPart::literal(0i8.into()),
                         CSGPart::opcode(InstructionSet::OPPromoteFloatFloatFloatVec3),
                         CSGPart::opcode(InstructionSet::OPAddVec3Vec3),
-                        CSGPart::literal(3i8.into()),
+                        CSGPart::literal(f16::from_f32(0.3)),
                         CSGPart::opcode(InstructionSet::OPSDFSphere),
-                        CSGPart::literal(f16::from_f32(0.5)),
+                        CSGPart::literal(f16::from_f32(0.05)),
                         CSGPart::opcode(InstructionSet::OPSmoothMinFloat),
                         CSGPart::opcode(InstructionSet::OPStop),
                     ];
@@ -653,14 +651,7 @@ fn main() {
                         }
                     }
 
-                    //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]);
+                    //println!("data: {:?}, {:?}", data[0][0], data[0][1]);
 
                     let uniform_data = implicit_fs::ty::SceneDescription { d: data };
 
@@ -715,7 +706,7 @@ fn main() {
                 )
                 .unwrap();
 
-                let cb = gui.draw_on_subpass_image(dimensions.into());
+                let guicb = gui.draw_on_subpass_image(dimensions.into());
 
                 builder
                     .begin_render_pass(
@@ -743,7 +734,7 @@ fn main() {
 
                 for object in &gstate.meshes {
                     push_constants.world =
-                        (Matrix4::from_translation(object.pos - Point3::origin())
+                        (Matrix4::from_translation(object.pos * 0.01 - Point3::origin())
                             * Matrix4::from(object.rot)
                             * Matrix4::from_nonuniform_scale(
                                 object.scale.x,
@@ -759,8 +750,6 @@ fn main() {
                         .unwrap();
                 }
 
-                push_constants.world = Matrix4::identity().into();
-
                 builder
                     .bind_pipeline_graphics(implicit_pipeline.clone())
                     .bind_descriptor_sets(
@@ -768,15 +757,28 @@ fn main() {
                         implicit_pipeline.layout().clone(),
                         0,
                         implicit_set,
-                    )
-                    .push_constants(implicit_pipeline.layout().clone(), 0, push_constants);
+                    );
 
-                builder.draw_mesh([1, 1, 1]).unwrap();
+                for csg in &gstate.csg {
+                    push_constants.world =
+                        (Matrix4::from_translation(csg.pos * 0.01 - Point3::origin())
+                            * Matrix4::from(csg.rot)
+                            * Matrix4::from_nonuniform_scale(
+                                csg.scale.x,
+                                csg.scale.y,
+                                csg.scale.z,
+                            ))
+                        .into();
+                    builder
+                        .push_constants(implicit_pipeline.layout().clone(), 0, push_constants)
+                        .draw_mesh([1, 1, 1])
+                        .unwrap();
+                }
 
                 builder
                     .next_subpass(SubpassContents::SecondaryCommandBuffers)
                     .unwrap()
-                    .execute_commands(cb)
+                    .execute_commands(guicb)
                     .unwrap()
                     .end_render_pass()
                     .unwrap();
@@ -926,6 +928,8 @@ where
         .mesh_shader(implicit_ms.entry_point("main").unwrap(), ())
         .depth_stencil_state(DepthStencilState::simple_depth_test())
         .rasterization_state(RasterizationState {
+            //front_face: Fixed(Clockwise),
+            //cull_mode: Fixed(CullMode::Back),
             ..RasterizationState::default()
         })
         .multisample_state(MultisampleState {
diff --git a/src/triangle.vert.glsl b/src/triangle.vert.glsl
index e8ea796807d4bc4421796820ff1d45bb831e981f..b36aa50f863464c3e69b90602e42194724f199d4 100644
--- a/src/triangle.vert.glsl
+++ b/src/triangle.vert.glsl
@@ -9,5 +9,5 @@ layout(location=0)out vec3 v_normal;
 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*1000.,1.);
+    gl_Position=camera_uniforms.proj*worldview*vec4(position,1.);
 }
\ No newline at end of file