From ef667b5a0210ea02c7903daeaba5aa6d25b33e64 Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Wed, 18 Apr 2018 10:26:40 +0200 Subject: [PATCH] Better struct for scene --- src/programs/viewer.rs | 8 +++----- src/scene.rs | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/programs/viewer.rs b/src/programs/viewer.rs index 5e8b73c..bead8c7 100644 --- a/src/programs/viewer.rs +++ b/src/programs/viewer.rs @@ -4,8 +4,6 @@ extern crate glium; extern crate verbose_log; extern crate model_converter; -use std::rc::Rc; -use std::cell::RefCell; use std::process::exit; use std::time::{Instant, Duration}; @@ -22,7 +20,7 @@ use glium::glutin::Event; use glium::glutin::WindowEvent; use glium::glutin::VirtualKeyCode; - +use model_converter::scene::Scene; use model_converter::math::bounding_box::BoundingBox3; use model_converter::math::vector::Vector3; use model_converter::parser::parse; @@ -89,7 +87,7 @@ fn main() { let display = Display::new(window, context, &events_loop).unwrap(); let mut renderer = Renderer::new(display); - let mut scene = vec![]; + let mut scene = Scene::new(); let mut before; let mut duration; @@ -110,7 +108,7 @@ fn main() { model.build_vertex_buffers(&renderer); duration = Instant::now().duration_since(before); - scene.push(Rc::new(RefCell::new(model))); + scene.emplace(model); logln!(" done in {}ms.\nFinished", as_millis(duration)); } diff --git a/src/scene.rs b/src/scene.rs index c757b5f..f681a51 100644 --- a/src/scene.rs +++ b/src/scene.rs @@ -1,8 +1,45 @@ //! This module contains everything related to scenes. +use std::slice::Iter; +use std::vec::IntoIter; use std::rc::Rc; use std::cell::RefCell; use model::Model; /// Represents a 3D scene with models. -pub type Scene = Vec>>; +pub struct Scene { + models: Vec>>, +} + +impl Scene { + /// Creates a new empty scene. + pub fn new() -> Scene { + Scene { + models: vec![], + } + } + + /// Adds a model to the scene. + pub fn push(&mut self, model: Rc>) { + self.models.push(model); + } + + /// Converts the model to a Rc> and adds it to the scene. + pub fn emplace(&mut self, model: Model) { + self.models.push(Rc::new(RefCell::new(model))); + } + + /// Returns an iterator to the models of the scene. + pub fn iter(&self) -> Iter>> { + self.models.iter() + } +} + +impl IntoIterator for Scene { + type IntoIter = IntoIter>>; + type Item = Rc>; + + fn into_iter(self) -> Self::IntoIter { + self.models.into_iter() + } +}