summaryrefslogtreecommitdiffstats
path: root/graphics/src/traits.rs
blob: 01cf547da5e51cb6084be2abd61bf586d33a01dd (plain)
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
bues.ch cgit interface