]> git.nega.tv - josh/narcissus/commitdiff
Fix matrix handling now cross-product works
authorJoshua Simmons <josh@nega.tv>
Sun, 13 Nov 2022 22:29:24 +0000 (23:29 +0100)
committerJoshua Simmons <josh@nega.tv>
Sun, 13 Nov 2022 22:29:24 +0000 (23:29 +0100)
narcissus/src/main.rs
narcissus/src/shaders/basic.vert.glsl
narcissus/src/shaders/basic.vert.spv

index fa969eebed994b05606dca164710d49efb8b6cc4..5452fbccf74f0b35af5347f87ed93d8872244780 100644 (file)
@@ -269,7 +269,7 @@ pub fn main() {
         topology: Topology::Triangles,
         polygon_mode: PolygonMode::Fill,
         culling_mode: CullingMode::Back,
-        front_face: FrontFace::Clockwise,
+        front_face: FrontFace::CounterClockwise,
         depth_bias: None,
         depth_compare_op: CompareOp::GreaterOrEqual,
         depth_test_enable: true,
@@ -307,7 +307,7 @@ pub fn main() {
     let mut depth_height = 0;
     let mut depth_image = default();
 
-    let shark_distance = 8.0;
+    let shark_distance = 4.0;
 
     let mut rng = Pcg64::new();
 
@@ -361,18 +361,18 @@ pub fn main() {
         for (i, transform) in shark_transforms.iter_mut().enumerate() {
             let direction = if i & 1 == 0 { 1.0 } else { -1.0 };
             let (s, _) = sin_cos_pi_f32(frame_start + (i as f32) * 0.125);
-            transform.translate.y = 0.0 + s;
+            transform.translate.y = s;
             transform.matrix *= Mat3::from_axis_rotation(Vec3::Y, HalfTurn::new(0.005 * direction))
         }
 
         transforms.write_slice(&shark_transforms);
 
-        let (s, c) = sin_cos_pi_f32(frame_start);
-        let camera_height = c * 5.0;
-        let camera_radius = 50.0;
+        let (s, c) = sin_cos_pi_f32(frame_start * 0.2);
+        let camera_height = c * 8.0;
+        let camera_radius = 20.0;
         let eye = Point3::new(s * camera_radius, camera_height, c * camera_radius);
         let center = Point3::ZERO;
-        let camera_from_model = Mat4::look_at(eye, center, -Vec3::Y);
+        let camera_from_model = Mat4::look_at(eye, center, Vec3::Y);
         let clip_from_camera =
             Mat4::perspective_rev_inf_zo(Deg::new(45.0).into(), width as f32 / height as f32, 0.01);
         let clip_from_model = clip_from_camera * camera_from_model;
index a869c90876b165953f89633677e169e225727ca4..c065c3fdbf7bf15226e4bd57072820d89ce2bf46 100644 (file)
@@ -28,9 +28,14 @@ void main() {
     TransformData td = transforms[gl_InstanceIndex];
     VertexData vd = vertices[gl_VertexIndex];
 
-    vec4 posLocal = vec4(vd.position.xyz, 1.0);
-    vec3 posWorld = mat4x3(td.transform[0], td.transform[1], td.transform[2]) * posLocal;
-    vec4 posClip = vec4(posWorld, 1.0) * viewProj;
+    mat3 modelRot = mat3(
+        td.transform[0].x, td.transform[0].y, td.transform[0].z,
+        td.transform[0].w, td.transform[1].x, td.transform[1].y,
+        td.transform[1].z, td.transform[1].w, td.transform[2].x
+    );
+    vec3 modelOff = vec3(td.transform[2].y, td.transform[2].z, td.transform[2].w);
+    vec3 posWorld = transpose(modelRot) * vd.position.xyz + modelOff;
+    vec4 posClip = transpose(viewProj) * vec4(posWorld, 1.0);
 
     gl_Position = posClip;
     fragColor = vd.normal.xyz * 0.5 + 0.5;
index 9ab0390c3198ae6a94929ecbae33b973d52bdce9..fab7758c2cf485ec896a6dcf892a27a660ef0350 100644 (file)
Binary files a/narcissus/src/shaders/basic.vert.spv and b/narcissus/src/shaders/basic.vert.spv differ