// -*- coding: utf-8 -*- // // Copyright 2021-2023 Michael Büsch // // Licensed under the Apache License version 2.0 // or the MIT license, at your option. // SPDX-License-Identifier: Apache-2.0 OR MIT // use crate::point::Point3D; pub trait View3D { fn set_position(&mut self, pos: &Point3D); fn get_position(&self) -> Point3D; fn set_view_distance(&mut self, view_dist: i32); fn get_view_distance(&self) -> i32; fn set_fov_angle(&mut self, fov_angle: f32); fn get_fov_angle(&self) -> f32; fn set_yaw_angle(&mut self, yaw_angle: f32); fn get_yaw_angle(&self) -> f32; fn set_roll_angle(&mut self, roll_angle: f32); fn get_roll_angle(&self) -> f32; fn set_pitch_angle(&mut self, pitch_angle: f32); fn get_pitch_angle(&self) -> f32; } pub trait Render3D: View3D { fn calc_scene_dimensions(&self, desired_width: usize, desired_height: usize) -> (usize, usize) { (desired_width, desired_height) } fn render_scene(&mut self, render_buf: &mut [u32], image_width: usize, image_height: usize); fn render_scene_u8(&mut self, render_buf: &mut [u8], image_width: usize, image_height: usize) { let (pfx, render_buf_u32, sfx) = unsafe { render_buf.align_to_mut() }; assert!(pfx.is_empty()); assert!(sfx.is_empty()); self.render_scene(render_buf_u32, image_width, image_height); } } pub trait Landscape3D: View3D { fn get_terrain_height_at(&self, point: Point3D) -> f32; fn get_terrain_height(&self) -> f32 { self.get_terrain_height_at(self.get_position()) } fn get_height_above_ground(&self) -> f32 { self.get_position().y() - self.get_terrain_height() } } // vim: ts=4 sw=4 expandtab