use super::Scene; use super::oct_tree::{CHUNK_SIZE, OctTree}; use crate::primitives::cube::Cube; use crate::primitives::rec_cuboid::Cuboid; use crate::primitives::drawable::Drawable; use crate::app_data::AppData; extern crate rand; use rand::Rng; use anyhow::Result; use cgmath::{vec2, vec3, Vector3}; use std::cell::RefCell; use std::rc::Rc; use super::light::{DirectionalLight, PointLight}; pub fn generate_test_scene(scene: &mut Scene, data: &mut AppData) -> Result<()> { let mut rng = rand::thread_rng(); let grid_size = CHUNK_SIZE as i32; let mut oct_tree1: OctTree<Cube> = OctTree::create(CHUNK_SIZE)?; let mut oct_tree2: OctTree<Cube> = OctTree::create(CHUNK_SIZE)?; for x_index in 0..grid_size { for y_index in 0..grid_size { let shade = (rng.gen_range(0..50) as f32) / 100.0; let cube = Cube { pos: vec3(x_index as f32, y_index as f32, 5.0), color: vec3(shade, 1.0, shade), tex_coord: vec2(0.0, 0.0), transparent: false, roughness: 255, }; oct_tree1.set_cube(cube.clone()); let shade = (rng.gen_range(0..50) as f32) / 100.0; let cube = Cube { pos: vec3(x_index as f32, y_index as f32, 6.0), color: vec3(shade, shade, 0.0), tex_coord: vec2(0.0, 0.0), transparent: false, roughness: 255, }; oct_tree2.set_cube(cube.clone()); } } let shade = (rng.gen_range(0..25) as f32) / 100.0; let cube = Cube { pos: vec3(10.0, 10.0, 10.0), color: vec3(0.9, 0.9, 0.9), tex_coord: vec2(0.0, 0.0), transparent: true, roughness: 32, }; oct_tree1.set_cube(cube.clone()); let cube = Cube { pos: vec3(10.0, 10.0, 9.0), color: vec3(0.9, 0.9, 0.9), tex_coord: vec2(0.0, 0.0), transparent: true, roughness: 32, }; oct_tree1.set_cube(cube.clone()); let cube = Cube { pos: vec3(10.0, 10.0, 10.0), color: vec3(0.9, 0.9, 0.9), tex_coord: vec2(0.0, 0.0), transparent: true, roughness: 32, }; oct_tree2.set_cube(cube.clone()); let cube = Cube { pos: vec3(10.0, 10.0, 9.0), color: vec3(0.9, 0.9, 0.9), tex_coord: vec2(0.0, 0.0), transparent: true, roughness: 32, }; oct_tree2.set_cube(cube.clone()); scene.point_lights.push(Rc::new(RefCell::new(PointLight { pos: vec3(11.0, 11.0, 11.0), color: vec3(1.0, 1.0, 1.0), memory_start: 0 }))); scene.point_lights.push(Rc::new(RefCell::new(PointLight { pos: vec3(9.0, 9.0, 11.0), color: vec3(0.5, 0.5, 0.5), memory_start: 0 }))); scene.directional_lights.push(Rc::new(RefCell::new(DirectionalLight { direction: vec3(1.0, 1.0, -1.0), color: vec3(0.1, 0.1, 0.1), memory_start: 0 }))); let cube = Cuboid { pos: vec3(11.0, 11.0, 11.0), color: vec3(1.0, 1.0, 1.0), tex_coord: vec2(0.0, 0.0), size: Vector3 {x: 0.5, y: 0.5, z: 0.5} }; let index = scene.sized_vertices.len(); cube.draw(&data.topology, index, scene); let cube = Cuboid { pos: vec3(9.0, 9.0, 11.0), color: vec3(1.0, 1.0, 1.0), tex_coord: vec2(0.0, 0.0), size: Vector3 {x: 0.5, y: 0.5, z: 0.5} }; let index = scene.sized_vertices.len(); cube.draw(&data.topology, index, scene); let tree_ref_one = Rc::new(RefCell::new(oct_tree1)); let tree_ref_two = Rc::new(RefCell::new(oct_tree2)); scene.oct_trees = vec![vec![vec![tree_ref_one.clone(), tree_ref_two.clone()]]]; Ok(()) }