Decouple model loading from spawning
This commit is contained in:
parent
f73f9c37f8
commit
a5047f5875
|
@ -113,7 +113,8 @@ impl Application {
|
||||||
ui::ImportKind::Gltf => import::load_gltf(path),
|
ui::ImportKind::Gltf => import::load_gltf(path),
|
||||||
};
|
};
|
||||||
|
|
||||||
let widgets = self.render_state.load_model(&model);
|
let loaded = self.render_state.load_model(&model);
|
||||||
|
let widgets = self.render_state.spawn_model(&loaded);
|
||||||
self.objects.extend(widgets.into_iter());
|
self.objects.extend(widgets.into_iter());
|
||||||
},
|
},
|
||||||
Err(crossbeam_channel::TryRecvError::Empty) => break,
|
Err(crossbeam_channel::TryRecvError::Empty) => break,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
use cyborg::storage::mesh::MeshHandle;
|
||||||
|
|
||||||
pub struct Model {
|
pub struct Model {
|
||||||
pub name: Option<String>,
|
pub name: Option<String>,
|
||||||
pub objects: Vec<Object>,
|
pub objects: Vec<Object>,
|
||||||
|
@ -19,6 +21,18 @@ pub struct BasicVertex {
|
||||||
pub position: glam::Vec3,
|
pub position: glam::Vec3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct LoadedModel {
|
||||||
|
pub name: Option<String>,
|
||||||
|
pub objects: Vec<LoadedObject>,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct LoadedObject {
|
||||||
|
pub name: Option<String>,
|
||||||
|
pub transform: Transform,
|
||||||
|
pub meshes: Vec<MeshHandle>,
|
||||||
|
pub children: Vec<LoadedObject>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub struct Transform {
|
pub struct Transform {
|
||||||
pub position: glam::Vec3,
|
pub position: glam::Vec3,
|
||||||
|
|
|
@ -166,7 +166,7 @@ impl RenderState {
|
||||||
output_format: wgpu::TextureFormat,
|
output_format: wgpu::TextureFormat,
|
||||||
render_pass: &mut egui_wgpu_backend::RenderPass,
|
render_pass: &mut egui_wgpu_backend::RenderPass,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
use cyborg::scene::{DebugDrawList, DebugIndex, DebugVertex};
|
use cyborg::scene::{DebugDrawList, DebugVertex};
|
||||||
use cyborg::shader::{ShaderStore, ShaderWatcher};
|
use cyborg::shader::{ShaderStore, ShaderWatcher};
|
||||||
|
|
||||||
let mut world = legion::World::default();
|
let mut world = legion::World::default();
|
||||||
|
@ -282,43 +282,23 @@ impl RenderState {
|
||||||
.execute(&mut self.world, &mut self.resources);
|
.execute(&mut self.world, &mut self.resources);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_model(&mut self, model: &model::Model) -> Vec<ObjectWidget> {
|
pub fn load_model(&mut self, model: &model::Model) -> model::LoadedModel {
|
||||||
// TODO use model name?
|
model::LoadedModel {
|
||||||
let mut objects = Vec::new();
|
name: model.name.clone(),
|
||||||
for object in model.objects.iter() {
|
objects: model.objects.iter().map(|o| self.load_object(o)).collect(),
|
||||||
objects.push(self.load_object(object));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
objects
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn load_object(&mut self, object: &model::Object) -> ObjectWidget {
|
pub fn load_object(&mut self, object: &model::Object) -> model::LoadedObject {
|
||||||
let transform = cyborg::scene::Transform {
|
model::LoadedObject {
|
||||||
transform: object.transform.to_mat4(),
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut entities = Vec::new();
|
|
||||||
for mesh in object.meshes.iter() {
|
|
||||||
let mesh = cyborg::scene::Mesh {
|
|
||||||
mesh: self.load_mesh(mesh),
|
|
||||||
};
|
|
||||||
|
|
||||||
let entity = self.world.push((mesh, transform.clone()));
|
|
||||||
entities.push(entity);
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut children = Vec::new();
|
|
||||||
for child in object.children.iter() {
|
|
||||||
children.push(self.load_object(child));
|
|
||||||
}
|
|
||||||
|
|
||||||
ObjectWidget {
|
|
||||||
name: object.name.clone(),
|
name: object.name.clone(),
|
||||||
transform: object.transform.clone(),
|
transform: object.transform.clone(),
|
||||||
entities,
|
meshes: object.meshes.iter().map(|m| self.load_mesh(m)).collect(),
|
||||||
children,
|
children: object
|
||||||
dirty: false,
|
.children
|
||||||
children_dirty: false,
|
.iter()
|
||||||
|
.map(|o| self.load_object(o))
|
||||||
|
.collect(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,4 +339,41 @@ impl RenderState {
|
||||||
|
|
||||||
mesh_pass.get_mesh_pool().load(mesh).unwrap()
|
mesh_pass.get_mesh_pool().load(mesh).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn spawn_model(&mut self, model: &model::LoadedModel) -> Vec<ObjectWidget> {
|
||||||
|
// TODO use model name?
|
||||||
|
let mut objects = Vec::new();
|
||||||
|
for object in model.objects.iter() {
|
||||||
|
objects.push(self.spawn_object(object));
|
||||||
|
}
|
||||||
|
|
||||||
|
objects
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn spawn_object(&mut self, object: &model::LoadedObject) -> ObjectWidget {
|
||||||
|
let transform = cyborg::scene::Transform {
|
||||||
|
transform: object.transform.to_mat4(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut entities = Vec::new();
|
||||||
|
for mesh in object.meshes.iter() {
|
||||||
|
let mesh = cyborg::scene::Mesh { mesh: *mesh };
|
||||||
|
let entity = self.world.push((mesh, transform.clone()));
|
||||||
|
entities.push(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut children = Vec::new();
|
||||||
|
for child in object.children.iter() {
|
||||||
|
children.push(self.spawn_object(child));
|
||||||
|
}
|
||||||
|
|
||||||
|
ObjectWidget {
|
||||||
|
name: object.name.clone(),
|
||||||
|
transform: object.transform.clone(),
|
||||||
|
entities,
|
||||||
|
children,
|
||||||
|
dirty: false,
|
||||||
|
children_dirty: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue