diff --git a/scene.rhai b/scene.rhai index 6d014dd..2517286 100644 --- a/scene.rhai +++ b/scene.rhai @@ -1,71 +1,10 @@ -// engine -// .register_type::>() -// .register_fn("V", Vector3::::new); -// engine -// .register_type::>() -// .register_fn("P", Point3::::new); -// engine -// .register_type::() -// .register_fn("Scene", Scene::empty) -// .register_fn("addNode", Scene::add_node) -// .register_fn("addLight", Scene::add_light); - -// engine -// .register_type::() -// .register_fn("Node", Node::new) -// .register_fn("translate", Node::translate) -// .register_fn("rotate", Node::rotate) -// .register_fn("scale", Node::scale); -// engine -// .register_type::() -// .register_fn("Camera", Camera::new); -// engine -// .register_type::() -// .register_fn("Light", Light::new); -// engine -// .register_type::() -// .register_fn("Material", Material::new) -// .register_fn("MaterialRed", Material::red) -// .register_fn("MaterialBlue", Material::blue) -// .register_fn("MaterialGreen", Material::green) -// .register_fn("MaterialMagenta", Material::magenta) -// .register_fn("MaterialTurquoise", Material::turquoise); -// engine -// .register_type::() -// .register_fn("Sphere", Sphere::new) -// .register_fn("SphereUnit", Sphere::unit); -// engine -// .register_type::() -// .register_fn("Cube", Cube::new) -// .register_fn("CubeUnit", Cube::unit); -// engine -// .register_type::() -// .register_fn("Cone", Cone::new) -// .register_fn("ConeUnit", Cone::unit); -// engine -// .register_type::() -// .register_fn("Cylinder", Cylinder::new); -// engine -// .register_type::() -// .register_fn("Circle", Circle::new) -// .register_fn("CircleUnit", Circle::unit); -// engine -// .register_type::() -// .register_fn("Rectangle", Rectangle::new) -// .register_fn("RectangleUnit", Rectangle::unit); -// engine -// .register_type::() -// .register_fn("Steiner", SteinerSurface::new); -// engine -// .register_type::() -// .register_fn("Torus", Torus::new); - let scene = Scene(); let eye = P(0.0, 0.0, 3.0); let target = P(0.0, 0.0, 0.0); let up = V(0.0, 1.0, 3.0); -let cam = Camera(eye, target, up, 70.0, 1.0); + +let cam = Camera(eye, target, up, 70.0); let material = Material(V(0.5,0.5,0.5), V(0.8, 0.8, 0.8), 25.0); @@ -74,15 +13,19 @@ let ambient = Light(P(10.0,0.0,0.0), V(1.0,1.0,1.0), V(0.0, 0.0, 0.0)); let light2 = Light(P(0.0,0.0,10.0), V(0.0,1.0,1.0), V(0.1, 0.01, 0.001)); scene.addLight(light2); - scene.addLight(ambient); +scene.addLight(ambient); // let sphere = Sphere(P(0.0,0.0,0.0), 4.0, material); // let node = Node(sphere); // scene.addNode(node); -let stein = Steiner(material); -let node = Node(stein); +let sphere = Adam( material); +let node = Node(sphere); scene.addNode(node); +// let stein = Steiner(material); +// let node = Node(stein); +// scene.addNode(node); + scene \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 458cd96..69069c8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use crate::state::run; use error_iter::ErrorIter; -const EPSILON: f32 = 1e-6; +const EPSILON: f32 = 1e-9; const INFINITY: f32 = f32::MAX; const EPSILON_VECTOR: Vector3 = Vector3::new(EPSILON, EPSILON, EPSILON); static ZERO_VECTOR: Vector3 = Vector3::new(0.0, 0.0, 0.0); diff --git a/src/state.rs b/src/state.rs index 7b66cec..f261004 100644 --- a/src/state.rs +++ b/src/state.rs @@ -15,8 +15,8 @@ use winit::event::{Event, KeyboardInput, MouseButton, VirtualKeyCode, WindowEven use winit::event_loop::{ControlFlow, EventLoop}; use winit::window::{Window, WindowBuilder}; -const START_WIDTH: i32 = 800; -const START_HEIGHT: i32 = 800; +const START_WIDTH: i32 = 1400; +const START_HEIGHT: i32 = 1000; const COLOUR_CLEAR: [u8; 4] = [0x22, 0x00, 0x11, 0xff]; pub const INIT_FILE: &str = "scene.rhai"; @@ -88,25 +88,18 @@ pub struct State { scene: Scene, camera: Camera, window: Window, + buffer_width: u32, buffer_height: u32, + pixels: Arc>, gui: Gui, + index: usize, + finished: bool, } impl State { - pub fn import_rhai_from_file(&mut self, filename: &str) -> Result<(), Box> { - let script = std::fs::read_to_string(filename)?; - self.scene = Scene::from_rhai(&script)?.into(); - Ok(()) - } - - pub fn import_rhai(&mut self, script: &str) -> Result<(), Box> { - self.scene = Scene::from_rhai(&script)?.into(); - Ok(()) - } - pub fn new(window: Window, pixels: Pixels, gui: Gui) -> Self { let scene = Scene::empty(); let window_size = window.inner_size(); @@ -121,6 +114,7 @@ impl State { pixels: Arc::new(Mutex::new(pixels)), gui, index: 0, + finished: false, } } @@ -128,8 +122,11 @@ impl State { if let Some(event) = self.gui.event.take() { match event { GuiEvent::BufferResize(proportion) => self.resize_buffer(proportion)?, - GuiEvent::CameraUpdate(camera) => self.set_camera(camera), - GuiEvent::SceneLoad(script) => self.import_rhai(&script)?, + GuiEvent::CameraUpdate(camera) => self.set_camera(camera)?, + GuiEvent::SceneLoad(scene) => { + self.scene = scene; + self.clear()?; + } } }; Ok(()) @@ -143,6 +140,7 @@ impl State { self.camera.set_size(self.buffer_width, self.buffer_height); self.clear()?; + let mut pixels = self.pixels.lock().unwrap(); pixels.resize_buffer(self.buffer_width, self.buffer_height)?; Ok(()) @@ -173,13 +171,18 @@ impl State { let mut pixels = self.pixels.lock().unwrap(); let frame = pixels.frame_mut(); frame[i * 4..(i + 1) * 4].copy_from_slice(&rgba); - self.index = (self.index + 1) % (frame.len() / 4); + self.index = self.index + 1; + if self.index >= frame.len() / 4 { + self.finished = true; + return Ok(()); + }; } Ok(()) } fn clear(&mut self) -> Result<(), Box> { self.index = 0; + self.finished = false; let mut pixels = self.pixels.lock().unwrap(); let frame = pixels.frame_mut(); for pixel in frame.chunks_exact_mut(4) { @@ -188,14 +191,18 @@ impl State { Ok(()) } - fn set_camera(&mut self, camera: Camera) { + fn set_camera(&mut self, camera: Camera) -> Result<(), Box> { + self.clear()?; self.camera = camera; self.camera.set_size(self.buffer_width, self.buffer_height); + Ok(()) } fn render(&mut self) -> Result<(), Box> { self.update()?; //Update state - self.draw()?; //Draw to pixels + if !self.finished { + self.draw()?; + }; //Draw to pixels let pixels = self.pixels.lock().unwrap(); self.gui .prepare(&self.window)