1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
// -*- coding: utf-8 -*-
//
// Copyright 2021-2023 Michael Büsch <m@bues.ch>
//
// 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
|