Load viking_room.obj and draw grid of them
This commit is contained in:
parent
59edbb10fe
commit
5d68d3f71d
|
@ -270,6 +270,7 @@ dependencies = [
|
||||||
"glam",
|
"glam",
|
||||||
"pollster",
|
"pollster",
|
||||||
"slab",
|
"slab",
|
||||||
|
"tobj",
|
||||||
"wgpu",
|
"wgpu",
|
||||||
"winit",
|
"winit",
|
||||||
]
|
]
|
||||||
|
@ -1007,6 +1008,15 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tobj"
|
||||||
|
version = "3.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "267a53ebc1139c69d3feedc33a381c382b2e3b0c47f44f48679e90c4a69b8dac"
|
||||||
|
dependencies = [
|
||||||
|
"ahash",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "toml"
|
name = "toml"
|
||||||
version = "0.5.8"
|
version = "0.5.8"
|
||||||
|
|
|
@ -8,5 +8,6 @@ bytemuck = { version="1.7", features=["derive"] }
|
||||||
glam = "0.20"
|
glam = "0.20"
|
||||||
pollster = "0.2"
|
pollster = "0.2"
|
||||||
slab = "0.4"
|
slab = "0.4"
|
||||||
|
tobj = "3.0"
|
||||||
wgpu = "0.12"
|
wgpu = "0.12"
|
||||||
winit = "0.26"
|
winit = "0.26"
|
||||||
|
|
57
src/main.rs
57
src/main.rs
|
@ -100,7 +100,6 @@ impl Renderer {
|
||||||
label: Some("Meshes Buffer"),
|
label: Some("Meshes Buffer"),
|
||||||
size: 65536, // TODO resizable meshes buffer/gpu vectors
|
size: 65536, // TODO resizable meshes buffer/gpu vectors
|
||||||
usage: wgpu::BufferUsages::STORAGE
|
usage: wgpu::BufferUsages::STORAGE
|
||||||
| wgpu::BufferUsages::UNIFORM
|
|
||||||
| wgpu::BufferUsages::COPY_DST,
|
| wgpu::BufferUsages::COPY_DST,
|
||||||
mapped_at_creation: false,
|
mapped_at_creation: false,
|
||||||
});
|
});
|
||||||
|
@ -121,7 +120,7 @@ impl Renderer {
|
||||||
});
|
});
|
||||||
|
|
||||||
let meshes_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
|
let meshes_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
|
||||||
layout: &camera_bind_group_layout,
|
layout: &meshes_bind_group_layout,
|
||||||
entries: &[wgpu::BindGroupEntry {
|
entries: &[wgpu::BindGroupEntry {
|
||||||
binding: 0,
|
binding: 0,
|
||||||
resource: meshes_buffer.as_entire_binding(),
|
resource: meshes_buffer.as_entire_binding(),
|
||||||
|
@ -156,7 +155,7 @@ impl Renderer {
|
||||||
}],
|
}],
|
||||||
}),
|
}),
|
||||||
primitive: wgpu::PrimitiveState {
|
primitive: wgpu::PrimitiveState {
|
||||||
topology: wgpu::PrimitiveTopology::LineList,
|
topology: wgpu::PrimitiveTopology::TriangleList,
|
||||||
strip_index_format: None,
|
strip_index_format: None,
|
||||||
front_face: wgpu::FrontFace::Ccw,
|
front_face: wgpu::FrontFace::Ccw,
|
||||||
cull_mode: None,
|
cull_mode: None,
|
||||||
|
@ -311,7 +310,7 @@ impl MeshGroup {
|
||||||
let indices = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
let indices = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
|
||||||
label: Some("Index Buffer"),
|
label: Some("Index Buffer"),
|
||||||
contents: bytemuck::cast_slice(&data.indices),
|
contents: bytemuck::cast_slice(&data.indices),
|
||||||
usage: wgpu::BufferUsages::VERTEX,
|
usage: wgpu::BufferUsages::INDEX,
|
||||||
});
|
});
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
|
@ -398,13 +397,61 @@ struct MeshInstance {
|
||||||
|
|
||||||
type MeshCommands = Vec<MeshInstance>;
|
type MeshCommands = Vec<MeshInstance>;
|
||||||
|
|
||||||
|
fn load_model() -> MeshData {
|
||||||
|
use tobj::*;
|
||||||
|
|
||||||
|
let mut model_data = include_bytes!("viking_room.obj").to_vec();
|
||||||
|
let mut model_data = &mut model_data.as_slice();
|
||||||
|
|
||||||
|
let load_options = LoadOptions {
|
||||||
|
triangulate: true,
|
||||||
|
single_index: true,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
|
||||||
|
let (models, _mats) = load_obj_buf(model_data, &load_options, |_| unimplemented!()).unwrap();
|
||||||
|
|
||||||
|
let mut vertices = Vec::new();
|
||||||
|
let mut indices = Vec::new();
|
||||||
|
for m in models {
|
||||||
|
let index_base = vertices.len() as u32;
|
||||||
|
for i in 0..m.mesh.positions.len() / 3 {
|
||||||
|
let t = i * 3;
|
||||||
|
vertices.push(Vertex {
|
||||||
|
position: [
|
||||||
|
m.mesh.positions[t],
|
||||||
|
m.mesh.positions[t + 2],
|
||||||
|
-m.mesh.positions[t + 1],
|
||||||
|
],
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
indices.extend(m.mesh.indices.iter().map(|i| i + index_base));
|
||||||
|
}
|
||||||
|
|
||||||
|
MeshData { vertices, indices }
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
let mesh_data = load_model();
|
||||||
let event_loop = EventLoop::new();
|
let event_loop = EventLoop::new();
|
||||||
let window = WindowBuilder::new().build(&event_loop).unwrap();
|
let window = WindowBuilder::new().build(&event_loop).unwrap();
|
||||||
let mut camera = Flycam::new(10.0, 0.002);
|
let mut camera = Flycam::new(10.0, 0.002);
|
||||||
let mut is_grabbed = false;
|
let mut is_grabbed = false;
|
||||||
let mut ren = pollster::block_on(Renderer::new(&window));
|
let mut ren = pollster::block_on(Renderer::new(&window));
|
||||||
let commands = MeshCommands::new();
|
|
||||||
|
let mesh = ren.mesh_pool.allocate(&ren.device, &mesh_data);
|
||||||
|
let mut commands = Vec::new();
|
||||||
|
for x in -5..5 {
|
||||||
|
for y in -5..5 {
|
||||||
|
let translation = glam::Vec3::new(x as f32, 0.0, y as f32) * 3.0;
|
||||||
|
let transform = glam::Mat4::from_translation(translation);
|
||||||
|
commands.push(MeshInstance {
|
||||||
|
handle: mesh,
|
||||||
|
transform,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
event_loop.run(move |event, _, control_flow| match event {
|
event_loop.run(move |event, _, control_flow| match event {
|
||||||
Event::RedrawRequested(_) => match ren.render(&camera, &commands) {
|
Event::RedrawRequested(_) => match ren.render(&camera, &commands) {
|
||||||
|
|
|
@ -22,7 +22,7 @@ struct VertexOutput {
|
||||||
var<uniform> camera: CameraUniform;
|
var<uniform> camera: CameraUniform;
|
||||||
|
|
||||||
[[group(1), binding(0)]]
|
[[group(1), binding(0)]]
|
||||||
var<storage> meshes: MeshData;
|
var<storage,read> meshes: MeshData;
|
||||||
|
|
||||||
[[stage(vertex)]]
|
[[stage(vertex)]]
|
||||||
fn vs_main(
|
fn vs_main(
|
||||||
|
@ -31,7 +31,7 @@ fn vs_main(
|
||||||
) -> VertexOutput {
|
) -> VertexOutput {
|
||||||
let transform = meshes.instances[mesh_idx].transform;
|
let transform = meshes.instances[mesh_idx].transform;
|
||||||
var out: VertexOutput;
|
var out: VertexOutput;
|
||||||
out.clip_position = camera.vp * vec4<f32>(vertex.position, 1.0);
|
out.clip_position = camera.vp * transform * vec4<f32>(vertex.position, 1.0);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue