Load viking_room.obj and draw grid of them
This commit is contained in:
parent
59edbb10fe
commit
5d68d3f71d
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
57
src/main.rs
57
src/main.rs
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue