should a directional light even have roll?
This commit is contained in:
12
src/light.rs
12
src/light.rs
@@ -4,7 +4,7 @@ use cgmath::Point3;
|
|||||||
use crate::render::OPENGL_TO_WGPU_MATRIX;
|
use crate::render::OPENGL_TO_WGPU_MATRIX;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use wgpu::TextureView;
|
use wgpu::TextureView;
|
||||||
use crate::components::RangeCopy;
|
use crate::components::{RangeCopy, Position};
|
||||||
|
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
@@ -25,14 +25,16 @@ pub struct DirectionalLight {
|
|||||||
pub fov: f32,
|
pub fov: f32,
|
||||||
pub depth: RangeCopy<f32>,
|
pub depth: RangeCopy<f32>,
|
||||||
pub target_view: Arc<TextureView>,
|
pub target_view: Arc<TextureView>,
|
||||||
|
pub pos: Position,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DirectionalLight {
|
impl DirectionalLight {
|
||||||
pub fn to_raw(&self, pos: Point3<f32>) -> LightRaw {
|
pub fn to_raw(&self) -> LightRaw {
|
||||||
use cgmath::{Deg, EuclideanSpace, Matrix4, PerspectiveFov, Point3, Vector3};
|
use cgmath::{Deg, EuclideanSpace, Matrix4, PerspectiveFov, Point3, Vector3};
|
||||||
|
|
||||||
//let pos = cgmath::Point3::new(pos.x, pos.y, pos.z);
|
let point3d = Point3::new(self.pos.x, self.pos.y, self.pos.z);
|
||||||
let mx_view = Matrix4::look_at(pos, Point3::origin(), Vector3::unit_z());
|
let mx_view = Matrix4::look_at(point3d, Point3::origin(), Vector3::unit_y());
|
||||||
|
|
||||||
let projection = PerspectiveFov {
|
let projection = PerspectiveFov {
|
||||||
fovy: Deg(self.fov).into(),
|
fovy: Deg(self.fov).into(),
|
||||||
aspect: 1.0,
|
aspect: 1.0,
|
||||||
@@ -44,7 +46,7 @@ impl DirectionalLight {
|
|||||||
mx_correction * cgmath::Matrix4::from(projection.to_perspective()) * mx_view;
|
mx_correction * cgmath::Matrix4::from(projection.to_perspective()) * mx_view;
|
||||||
LightRaw {
|
LightRaw {
|
||||||
proj: *mx_view_proj.as_ref(),
|
proj: *mx_view_proj.as_ref(),
|
||||||
pos: [pos.x, pos.y, pos.z, 1.0],
|
pos: [self.pos.x, self.pos.y, self.pos.z, 1.0],
|
||||||
color: [
|
color: [
|
||||||
self.color.r as f32,
|
self.color.r as f32,
|
||||||
self.color.g as f32,
|
self.color.g as f32,
|
||||||
|
|||||||
13
src/main.rs
13
src/main.rs
@@ -265,10 +265,15 @@ pub fn entity_loading(world: &mut World, renderer: &mut Renderer) {
|
|||||||
let light_mesh = renderer.load_mesh_to_buffer("./resources/light.obj");
|
let light_mesh = renderer.load_mesh_to_buffer("./resources/light.obj");
|
||||||
|
|
||||||
let light_entity: Entity = world.push((
|
let light_entity: Entity = world.push((
|
||||||
cgmath::Point3 {
|
Position {
|
||||||
x: 5.0 as f32,
|
x: 0.0,
|
||||||
y: 5.0 as f32,
|
y: 0.0,
|
||||||
z: 5.0 as f32,
|
z: 0.0,
|
||||||
|
rot: Euler {
|
||||||
|
x: Deg(0.0),
|
||||||
|
y: Deg(-25.0),
|
||||||
|
z: Deg(0.0)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Color {
|
Color {
|
||||||
r: 1.0,
|
r: 1.0,
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ use winit::window::Window;
|
|||||||
use crate::camera::{Camera, CameraController};
|
use crate::camera::{Camera, CameraController};
|
||||||
use crate::components::{Color, Mesh, Position, RangeCopy};
|
use crate::components::{Color, Mesh, Position, RangeCopy};
|
||||||
use crate::geometry::{create_plane, import_mesh, vertex, Vertex};
|
use crate::geometry::{create_plane, import_mesh, vertex, Vertex};
|
||||||
use crate::light::{LightRaw, DirectionalLight};
|
use crate::light::{DirectionalLight, LightRaw};
|
||||||
|
|
||||||
#[cfg_attr(rustfmt, rustfmt_skip)]
|
#[cfg_attr(rustfmt, rustfmt_skip)]
|
||||||
#[allow(unused)]
|
#[allow(unused)]
|
||||||
@@ -109,7 +109,7 @@ pub fn render_test(world: &mut SubWorld, #[resource] renderer: &mut Renderer) {
|
|||||||
let d = Decomposed {
|
let d = Decomposed {
|
||||||
scale: 1.0,
|
scale: 1.0,
|
||||||
rot: Quaternion::from(pos.rot),
|
rot: Quaternion::from(pos.rot),
|
||||||
disp: Vector3::new(pos.x, pos.y, pos.z)
|
disp: Vector3::new(pos.x, pos.y, pos.z),
|
||||||
};
|
};
|
||||||
let m = Matrix4::from(d);
|
let m = Matrix4::from(d);
|
||||||
let data = EntityUniforms {
|
let data = EntityUniforms {
|
||||||
@@ -135,7 +135,7 @@ pub fn render_test(world: &mut SubWorld, #[resource] renderer: &mut Renderer) {
|
|||||||
renderer.queue.write_buffer(
|
renderer.queue.write_buffer(
|
||||||
&renderer.light_uniform_buf,
|
&renderer.light_uniform_buf,
|
||||||
(i * mem::size_of::<LightRaw>()) as wgpu::BufferAddress,
|
(i * mem::size_of::<LightRaw>()) as wgpu::BufferAddress,
|
||||||
bytemuck::bytes_of(&light.to_raw(*pos)),
|
bytemuck::bytes_of(&light.to_raw()),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -337,6 +337,16 @@ impl Renderer {
|
|||||||
end: 20.0,
|
end: 20.0,
|
||||||
},
|
},
|
||||||
target_view: target.clone(),
|
target_view: target.clone(),
|
||||||
|
pos: Position {
|
||||||
|
x: 0.0,
|
||||||
|
y: 0.0,
|
||||||
|
z: 0.0,
|
||||||
|
rot: Euler {
|
||||||
|
x: Deg(0.0),
|
||||||
|
y: Deg(-25.0),
|
||||||
|
z: Deg(0.0),
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,7 +381,6 @@ impl Renderer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn init(window: &Window) -> Renderer {
|
pub fn init(window: &Window) -> Renderer {
|
||||||
|
|
||||||
// Grab the GPU instance, and query its features
|
// Grab the GPU instance, and query its features
|
||||||
let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY);
|
let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY);
|
||||||
let (size, surface) = unsafe {
|
let (size, surface) = unsafe {
|
||||||
|
|||||||
Reference in New Issue
Block a user