Load viking_room.obj and draw grid of them

This commit is contained in:
marceline-cramer 2022-01-30 23:55:35 -07:00
parent 59edbb10fe
commit 5d68d3f71d
5 changed files with 16117 additions and 7 deletions

10
Cargo.lock generated
View File

@ -270,6 +270,7 @@ dependencies = [
"glam",
"pollster",
"slab",
"tobj",
"wgpu",
"winit",
]
@ -1007,6 +1008,15 @@ dependencies = [
"syn",
]
[[package]]
name = "tobj"
version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "267a53ebc1139c69d3feedc33a381c382b2e3b0c47f44f48679e90c4a69b8dac"
dependencies = [
"ahash",
]
[[package]]
name = "toml"
version = "0.5.8"

View File

@ -8,5 +8,6 @@ bytemuck = { version="1.7", features=["derive"] }
glam = "0.20"
pollster = "0.2"
slab = "0.4"
tobj = "3.0"
wgpu = "0.12"
winit = "0.26"

View File

@ -100,7 +100,6 @@ impl Renderer {
label: Some("Meshes Buffer"),
size: 65536, // TODO resizable meshes buffer/gpu vectors
usage: wgpu::BufferUsages::STORAGE
| wgpu::BufferUsages::UNIFORM
| wgpu::BufferUsages::COPY_DST,
mapped_at_creation: false,
});
@ -121,7 +120,7 @@ impl Renderer {
});
let meshes_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor {
layout: &camera_bind_group_layout,
layout: &meshes_bind_group_layout,
entries: &[wgpu::BindGroupEntry {
binding: 0,
resource: meshes_buffer.as_entire_binding(),
@ -156,7 +155,7 @@ impl Renderer {
}],
}),
primitive: wgpu::PrimitiveState {
topology: wgpu::PrimitiveTopology::LineList,
topology: wgpu::PrimitiveTopology::TriangleList,
strip_index_format: None,
front_face: wgpu::FrontFace::Ccw,
cull_mode: None,
@ -311,7 +310,7 @@ impl MeshGroup {
let indices = device.create_buffer_init(&wgpu::util::BufferInitDescriptor {
label: Some("Index Buffer"),
contents: bytemuck::cast_slice(&data.indices),
usage: wgpu::BufferUsages::VERTEX,
usage: wgpu::BufferUsages::INDEX,
});
Self {
@ -398,13 +397,61 @@ struct 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() {
let mesh_data = load_model();
let event_loop = EventLoop::new();
let window = WindowBuilder::new().build(&event_loop).unwrap();
let mut camera = Flycam::new(10.0, 0.002);
let mut is_grabbed = false;
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::RedrawRequested(_) => match ren.render(&camera, &commands) {

View File

@ -22,7 +22,7 @@ struct VertexOutput {
var<uniform> camera: CameraUniform;
[[group(1), binding(0)]]
var<storage> meshes: MeshData;
var<storage,read> meshes: MeshData;
[[stage(vertex)]]
fn vs_main(
@ -31,7 +31,7 @@ fn vs_main(
) -> VertexOutput {
let transform = meshes.instances[mesh_idx].transform;
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;
}

16052
src/viking_room.obj Normal file

File diff suppressed because it is too large Load Diff