Starts to work better
This commit is contained in:
parent
ef667b5a02
commit
fdcc580d14
|
@ -2,9 +2,8 @@
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use glium::texture::SrgbTexture2d;
|
|
||||||
|
|
||||||
/// A 3D material.
|
/// A 3D material.
|
||||||
|
#[derive(Clone)]
|
||||||
pub struct Material {
|
pub struct Material {
|
||||||
|
|
||||||
/// The name of the material.
|
/// The name of the material.
|
||||||
|
@ -17,9 +16,6 @@ pub struct Material {
|
||||||
///
|
///
|
||||||
/// They might be necessary for the export though.
|
/// They might be necessary for the export though.
|
||||||
pub unknown_instructions: Vec<String>,
|
pub unknown_instructions: Vec<String>,
|
||||||
|
|
||||||
/// The texture that will be used for rendering.
|
|
||||||
pub rendering_texture: Option<SrgbTexture2d>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Material {
|
impl Material {
|
||||||
|
@ -30,7 +26,6 @@ impl Material {
|
||||||
name: name.to_owned(),
|
name: name.to_owned(),
|
||||||
textures: HashMap::new(),
|
textures: HashMap::new(),
|
||||||
unknown_instructions: vec![],
|
unknown_instructions: vec![],
|
||||||
rendering_texture: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ use std::collections::HashMap;
|
||||||
use std::collections::hash_map::Entry;
|
use std::collections::hash_map::Entry;
|
||||||
|
|
||||||
use glium::VertexBuffer;
|
use glium::VertexBuffer;
|
||||||
|
use glium::texture::SrgbTexture2d;
|
||||||
|
|
||||||
use parser::{parse, ParserError};
|
use parser::{parse, ParserError};
|
||||||
|
|
||||||
|
@ -89,6 +90,9 @@ pub struct Model {
|
||||||
/// Map associating the name of a material to the real material.
|
/// Map associating the name of a material to the real material.
|
||||||
pub materials: HashMap<String, Material>,
|
pub materials: HashMap<String, Material>,
|
||||||
|
|
||||||
|
/// Map associating the name of a texture and the real texture.
|
||||||
|
pub textures: HashMap<String, Option<SrgbTexture2d>>,
|
||||||
|
|
||||||
/// The list of parts of the model.
|
/// The list of parts of the model.
|
||||||
pub parts: Vec<Part>,
|
pub parts: Vec<Part>,
|
||||||
|
|
||||||
|
@ -119,6 +123,7 @@ impl Model {
|
||||||
parts: vec![],
|
parts: vec![],
|
||||||
faces: vec![],
|
faces: vec![],
|
||||||
current_part_index: None,
|
current_part_index: None,
|
||||||
|
textures: HashMap::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,15 +398,21 @@ impl Model {
|
||||||
|
|
||||||
/// Builds the textures of all materials.
|
/// Builds the textures of all materials.
|
||||||
pub fn build_textures(&mut self, renderer: &Renderer) {
|
pub fn build_textures(&mut self, renderer: &Renderer) {
|
||||||
for (_, ref mut material) in &mut self.materials {
|
for (_, material) in self.materials.clone() {
|
||||||
Model::build_texture_for_material(material, renderer);
|
self.build_texture_for_material(&material, renderer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Builds the SrgbTextures for rendering.
|
/// Builds the SrgbTextures for rendering.
|
||||||
pub fn build_texture_for_material(material: &mut Material, renderer: &Renderer) {
|
pub fn build_texture_for_material(&mut self, material: &Material, renderer: &Renderer) {
|
||||||
if let Some(path) = material.textures.get("map_Kd") {
|
if let Some(path) = material.textures.get("map_Kd") {
|
||||||
material.rendering_texture = Some(renderer.make_texture(path));
|
let texture = renderer.make_texture(path);
|
||||||
|
self.textures.insert(path.to_owned(), Some(texture));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the rendering texture.
|
||||||
|
pub fn get_texture_by_name(&self, name: &str) -> Option<&SrgbTexture2d> {
|
||||||
|
self.textures[name].as_ref()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -160,8 +160,12 @@ impl Renderer {
|
||||||
fn get_texture_of_part<'a>(&self, model: &'a Model, part: &Part) -> Option<&'a SrgbTexture2d> {
|
fn get_texture_of_part<'a>(&self, model: &'a Model, part: &Part) -> Option<&'a SrgbTexture2d> {
|
||||||
if let Some(ref material_name) = part.material_name {
|
if let Some(ref material_name) = part.material_name {
|
||||||
if let Some(ref material) = model.materials.get(material_name) {
|
if let Some(ref material) = model.materials.get(material_name) {
|
||||||
if let Some(ref texture) = material.rendering_texture {
|
if let Some(texture) = material.textures.get("map_Kd") {
|
||||||
Some(texture)
|
if let Some(ref texture) = model.get_texture_by_name(&texture) {
|
||||||
|
Some(texture)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,3 +43,11 @@ impl IntoIterator for Scene {
|
||||||
self.models.into_iter()
|
self.models.into_iter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<Vec<Model>> for Scene {
|
||||||
|
fn from(input: Vec<Model>) -> Scene {
|
||||||
|
Scene {
|
||||||
|
models: input.into_iter().map(|x| Rc::new(RefCell::new(x))).collect(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue