Skip to content

Commit

Permalink
使用 glam 替换 hdr 示例中的 cgmath
Browse files Browse the repository at this point in the history
  • Loading branch information
jinleili committed Jan 1, 2024
1 parent d0ad9fa commit 23c5b94
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 87 deletions.
1 change: 0 additions & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion code/intermediate/hdr/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ glam.workspace = true
utils.workspace = true
cfg-if = "1"
anyhow = "1.0"
cgmath = "0.18"
tobj = { version = "3.2", features = ["async"] }
instant = "0.1"
image = { workspace = true, default_features = false, features = [
Expand Down
62 changes: 28 additions & 34 deletions code/intermediate/hdr/src/camera.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
use cgmath::*;
use std::f32::consts::FRAC_PI_2;
use std::time::Duration;
use winit::dpi::PhysicalPosition;
Expand All @@ -8,48 +7,44 @@ const SAFE_FRAC_PI_2: f32 = FRAC_PI_2 - 0.0001;

#[derive(Debug)]
pub struct Camera {
pub position: Point3<f32>,
yaw: Rad<f32>,
pitch: Rad<f32>,
pub position: glam::Vec3,
yaw: f32,
pitch: f32,
}

impl Camera {
pub fn new<V: Into<Point3<f32>>, Y: Into<Rad<f32>>, P: Into<Rad<f32>>>(
position: V,
yaw: Y,
pitch: P,
) -> Self {
pub fn new<V: Into<glam::Vec3>>(position: V, yaw: f32, pitch: f32) -> Self {
Self {
position: position.into(),
yaw: yaw.into(),
pitch: pitch.into(),
yaw: yaw.to_radians(),
pitch: pitch.to_radians(),
}
}

pub fn calc_matrix(&self) -> Matrix4<f32> {
let (sin_pitch, cos_pitch) = self.pitch.0.sin_cos();
let (sin_yaw, cos_yaw) = self.yaw.0.sin_cos();
pub fn calc_matrix(&self) -> glam::Mat4 {
let (sin_pitch, cos_pitch) = self.pitch.sin_cos();
let (sin_yaw, cos_yaw) = self.yaw.sin_cos();

Matrix4::look_to_rh(
glam::Mat4::look_to_rh(
self.position,
Vector3::new(cos_pitch * cos_yaw, sin_pitch, cos_pitch * sin_yaw).normalize(),
Vector3::unit_y(),
glam::Vec3::new(cos_pitch * cos_yaw, sin_pitch, cos_pitch * sin_yaw).normalize(),
glam::Vec3::Y,
)
}
}

pub struct Projection {
aspect: f32,
fovy: Rad<f32>,
fovy: f32,
znear: f32,
zfar: f32,
}

impl Projection {
pub fn new<F: Into<Rad<f32>>>(width: u32, height: u32, fovy: F, znear: f32, zfar: f32) -> Self {
pub fn new(width: u32, height: u32, fovy: f32, znear: f32, zfar: f32) -> Self {
Self {
aspect: width as f32 / height as f32,
fovy: fovy.into(),
fovy: fovy.to_radians(),
znear,
zfar,
}
Expand All @@ -59,9 +54,8 @@ impl Projection {
self.aspect = width as f32 / height as f32;
}

pub fn calc_matrix(&self) -> Matrix4<f32> {
// UDPATE
perspective(self.fovy, self.aspect, self.znear, self.zfar)
pub fn calc_matrix(&self) -> glam::Mat4 {
glam::Mat4::perspective_rh(self.fovy, self.aspect, self.znear, self.zfar)
}
}

Expand Down Expand Up @@ -149,19 +143,19 @@ impl CameraController {
let dt = dt.as_secs_f32();

// Move forward/backward and left/right
let (yaw_sin, yaw_cos) = camera.yaw.0.sin_cos();
let forward = Vector3::new(yaw_cos, 0.0, yaw_sin).normalize();
let right = Vector3::new(-yaw_sin, 0.0, yaw_cos).normalize();
let (yaw_sin, yaw_cos) = camera.yaw.sin_cos();
let forward = glam::Vec3::new(yaw_cos, 0.0, yaw_sin).normalize();
let right = glam::Vec3::new(-yaw_sin, 0.0, yaw_cos).normalize();
camera.position += forward * (self.amount_forward - self.amount_backward) * self.speed * dt;
camera.position += right * (self.amount_right - self.amount_left) * self.speed * dt;

// Move in/out (aka. "zoom")
// Note: this isn't an actual zoom. The camera's position
// changes when zooming. I've added this to make it easier
// to get closer to an object you want to focus on.
let (pitch_sin, pitch_cos) = camera.pitch.0.sin_cos();
let (pitch_sin, pitch_cos) = camera.pitch.sin_cos();
let scrollward =
Vector3::new(pitch_cos * yaw_cos, pitch_sin, pitch_cos * yaw_sin).normalize();
glam::Vec3::new(pitch_cos * yaw_cos, pitch_sin, pitch_cos * yaw_sin).normalize();
camera.position += scrollward * self.scroll * self.speed * self.sensitivity * dt;
self.scroll = 0.0;

Expand All @@ -170,8 +164,8 @@ impl CameraController {
camera.position.y += (self.amount_up - self.amount_down) * self.speed * dt;

// Rotate
camera.yaw += Rad(self.rotate_horizontal) * self.sensitivity * dt;
camera.pitch += Rad(-self.rotate_vertical) * self.sensitivity * dt;
camera.yaw += self.rotate_horizontal * self.sensitivity * dt;
camera.pitch += -self.rotate_vertical * self.sensitivity * dt;

// If process_mouse isn't called every frame, these values
// will not get set to zero, and the camera will rotate
Expand All @@ -180,10 +174,10 @@ impl CameraController {
self.rotate_vertical = 0.0;

// Keep the camera's angle from going too high/low.
if camera.pitch < -Rad(SAFE_FRAC_PI_2) {
camera.pitch = -Rad(SAFE_FRAC_PI_2);
} else if camera.pitch > Rad(SAFE_FRAC_PI_2) {
camera.pitch = Rad(SAFE_FRAC_PI_2);
if camera.pitch < -SAFE_FRAC_PI_2 {
camera.pitch = -SAFE_FRAC_PI_2;
} else if camera.pitch > SAFE_FRAC_PI_2 {
camera.pitch = SAFE_FRAC_PI_2;
}
}
}
54 changes: 26 additions & 28 deletions code/intermediate/hdr/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use app_surface::{AppSurface, SurfaceFrame};
use cgmath::prelude::*;
use std::iter;
use wgpu::util::DeviceExt;
use winit::{dpi::PhysicalSize, event::*, window::WindowId};
Expand Down Expand Up @@ -34,38 +33,38 @@ impl CameraUniform {
fn new() -> Self {
Self {
view_position: [0.0; 4],
view: cgmath::Matrix4::identity().into(), // NEW!
view_proj: cgmath::Matrix4::identity().into(),
inv_proj: cgmath::Matrix4::identity().into(), // NEW!
inv_view: cgmath::Matrix4::identity().into(), // NEW!
view: glam::Mat4::IDENTITY.to_cols_array_2d(), // NEW!
view_proj: glam::Mat4::IDENTITY.to_cols_array_2d(),
inv_proj: glam::Mat4::IDENTITY.to_cols_array_2d(), // NEW!
inv_view: glam::Mat4::IDENTITY.to_cols_array_2d(), // NEW!
}
}

// UPDATED!
fn update_view_proj(&mut self, camera: &camera::Camera, projection: &camera::Projection) {
self.view_position = camera.position.to_homogeneous().into();
self.view_position = camera.position.extend(1.0).into();
let proj = projection.calc_matrix();
let view = camera.calc_matrix();
let view_proj = proj * view;
self.view = view.into();
self.view_proj = view_proj.into();
self.inv_proj = proj.invert().unwrap().into();
self.inv_view = view.transpose().into();
self.view = view.to_cols_array_2d();
self.view_proj = view_proj.to_cols_array_2d();
self.inv_proj = proj.inverse().to_cols_array_2d();
self.inv_view = view.transpose().to_cols_array_2d();
}
}

struct Instance {
position: cgmath::Vector3<f32>,
rotation: cgmath::Quaternion<f32>,
position: glam::Vec3,
rotation: glam::Quat,
}

impl Instance {
fn to_raw(&self) -> InstanceRaw {
InstanceRaw {
model: (cgmath::Matrix4::from_translation(self.position)
* cgmath::Matrix4::from(self.rotation))
.into(),
normal: cgmath::Matrix3::from(self.rotation).into(),
model: (glam::Mat4::from_translation(self.position)
* glam::Mat4::from_quat(self.rotation))
.to_cols_array_2d(),
normal: glam::Mat3::from_mat4(glam::Mat4::from_quat(self.rotation)).to_cols_array_2d(),
}
}
}
Expand Down Expand Up @@ -282,9 +281,8 @@ impl State {
label: Some("texture_bind_group_layout"),
});

let camera = camera::Camera::new((0.0, 5.0, 10.0), cgmath::Deg(-90.0), cgmath::Deg(-20.0));
let projection =
camera::Projection::new(config.width, config.height, cgmath::Deg(45.0), 0.1, 100.0);
let camera = camera::Camera::new((0.0, 5.0, 10.0), -90.0, -20.0);
let projection = camera::Projection::new(config.width, config.height, 45.0, 0.1, 100.0);
let camera_controller = camera::CameraController::new(4.0, 0.4);

let mut camera_uniform = CameraUniform::new();
Expand All @@ -303,15 +301,15 @@ impl State {
let x = SPACE_BETWEEN * (x as f32 - NUM_INSTANCES_PER_ROW as f32 / 2.0);
let z = SPACE_BETWEEN * (z as f32 - NUM_INSTANCES_PER_ROW as f32 / 2.0);

let position = cgmath::Vector3 { x, y: 0.0, z };
let position = glam::Vec3 { x, y: 0.0, z };

let rotation = if position.is_zero() {
cgmath::Quaternion::from_axis_angle(
cgmath::Vector3::unit_z(),
cgmath::Deg(0.0),
)
let rotation = if position.length().abs() <= std::f32::EPSILON {
glam::Quat::from_axis_angle(glam::Vec3::Z, 0.0)
} else {
cgmath::Quaternion::from_axis_angle(position.normalize(), cgmath::Deg(45.0))
glam::Quat::from_axis_angle(
position.normalize(),
std::f32::consts::FRAC_PI_4,
)
};

Instance { position, rotation }
Expand Down Expand Up @@ -643,9 +641,9 @@ impl State {
);

// Update the light
let old_position: cgmath::Vector3<_> = self.light_uniform.position.into();
let old_position: glam::Vec3 = self.light_uniform.position.into();
self.light_uniform.position =
(cgmath::Quaternion::from_axis_angle((0.0, 1.0, 0.0).into(), cgmath::Deg(1.0))
(glam::Quat::from_axis_angle(glam::Vec3::Y, 1.0f32.to_radians())
* old_position)
.into();
self.app.queue.write_buffer(
Expand Down
28 changes: 14 additions & 14 deletions code/intermediate/hdr/src/resources.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,13 @@ pub async fn load_model(
let v1 = vertices[c[1] as usize];
let v2 = vertices[c[2] as usize];

let pos0: cgmath::Vector3<_> = v0.position.into();
let pos1: cgmath::Vector3<_> = v1.position.into();
let pos2: cgmath::Vector3<_> = v2.position.into();
let pos0: glam::Vec3 = v0.position.into();
let pos1: glam::Vec3 = v1.position.into();
let pos2: glam::Vec3 = v2.position.into();

let uv0: cgmath::Vector2<_> = v0.tex_coords.into();
let uv1: cgmath::Vector2<_> = v1.tex_coords.into();
let uv2: cgmath::Vector2<_> = v2.tex_coords.into();
let uv0: glam::Vec2 = v0.tex_coords.into();
let uv1: glam::Vec2 = v1.tex_coords.into();
let uv2: glam::Vec2 = v2.tex_coords.into();

// Calculate the edges of the triangle
let delta_pos1 = pos1 - pos0;
Expand All @@ -185,17 +185,17 @@ pub async fn load_model(

// We'll use the same tangent/bitangent for each vertex in the triangle
vertices[c[0] as usize].tangent =
(tangent + cgmath::Vector3::from(vertices[c[0] as usize].tangent)).into();
(tangent + glam::Vec3::from(vertices[c[0] as usize].tangent)).into();
vertices[c[1] as usize].tangent =
(tangent + cgmath::Vector3::from(vertices[c[1] as usize].tangent)).into();
(tangent + glam::Vec3::from(vertices[c[1] as usize].tangent)).into();
vertices[c[2] as usize].tangent =
(tangent + cgmath::Vector3::from(vertices[c[2] as usize].tangent)).into();
(tangent + glam::Vec3::from(vertices[c[2] as usize].tangent)).into();
vertices[c[0] as usize].bitangent =
(bitangent + cgmath::Vector3::from(vertices[c[0] as usize].bitangent)).into();
(bitangent + glam::Vec3::from(vertices[c[0] as usize].bitangent)).into();
vertices[c[1] as usize].bitangent =
(bitangent + cgmath::Vector3::from(vertices[c[1] as usize].bitangent)).into();
(bitangent + glam::Vec3::from(vertices[c[1] as usize].bitangent)).into();
vertices[c[2] as usize].bitangent =
(bitangent + cgmath::Vector3::from(vertices[c[2] as usize].bitangent)).into();
(bitangent + glam::Vec3::from(vertices[c[2] as usize].bitangent)).into();

// Used to average the tangents/bitangents
triangles_included[c[0] as usize] += 1;
Expand All @@ -207,8 +207,8 @@ pub async fn load_model(
for (i, n) in triangles_included.into_iter().enumerate() {
let denom = 1.0 / n as f32;
let v = &mut vertices[i];
v.tangent = (cgmath::Vector3::from(v.tangent) * denom).into();
v.bitangent = (cgmath::Vector3::from(v.bitangent) * denom).into();
v.tangent = (glam::Vec3::from(v.tangent) * denom).into();
v.bitangent = (glam::Vec3::from(v.bitangent) * denom).into();
}

let vertex_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
Expand Down
18 changes: 9 additions & 9 deletions docs/intermediate/hdr/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -994,23 +994,23 @@ impl CameraUniform {
fn new() -> Self {
Self {
view_position: [0.0; 4],
view: cgmath::Matrix4::identity().into(),
view_proj: cgmath::Matrix4::identity().into(),
inv_proj: cgmath::Matrix4::identity().into(), // NEW!
inv_view: cgmath::Matrix4::identity().into(), // NEW!
view: glam::Mat4::IDENTITY.to_cols_array_2d(),
view_proj: glam::Mat4::IDENTITY.to_cols_array_2d(),
inv_proj: glam::Mat4::IDENTITY.to_cols_array_2d(), // NEW!
inv_view: glam::Mat4::IDENTITY.to_cols_array_2d(), // NEW!
}
}

// 这里是变更
fn update_view_proj(&mut self, camera: &camera::Camera, projection: &camera::Projection) {
self.view_position = camera.position.to_homogeneous().into();
self.view_position = camera.position.extend(1.0).into();
let proj = projection.calc_matrix();
let view = camera.calc_matrix();
let view_proj = proj * view;
self.view = view.into();
self.view_proj = view_proj.into();
self.inv_proj = proj.invert().unwrap().into();
self.inv_view = view.transpose().into();
self.view = view.to_cols_array_2d();
self.view_proj = view_proj.to_cols_array_2d();
self.inv_proj = proj.inverse().to_cols_array_2d();
self.inv_view = view.transpose().to_cols_array_2d();
}
}
```
Expand Down

0 comments on commit 23c5b94

Please sign in to comment.