veloren_world/site2/plot/
glider_platform.rs

1use super::*;
2use crate::{
3    Land,
4    site2::{gen::PrimitiveTransform, util::Dir},
5};
6use common::terrain::BlockKind;
7use rand::prelude::*;
8use vek::*;
9
10/// Represents house data generated by the `generate()` method
11pub struct GliderPlatform {
12    /// Location of center of ring post
13    center: Vec2<i32>,
14    direction: Dir,
15    /// Approximate altitude of the door tile
16    pub(crate) alt: i32,
17}
18
19impl GliderPlatform {
20    pub fn generate(
21        land: &Land,
22        _rng: &mut impl Rng,
23        _site: &Site,
24        wpos: Vec2<i32>,
25        direction: Dir,
26    ) -> Self {
27        // FIXME this should be fed into this function
28        Self {
29            center: wpos,
30            direction,
31            alt: land.get_alt_approx(wpos) as i32,
32        }
33    }
34}
35
36impl Structure for GliderPlatform {
37    #[cfg(feature = "use-dyn-lib")]
38    const UPDATE_FN: &'static [u8] = b"render_glider_platform\0";
39
40    #[cfg_attr(feature = "be-dyn-lib", export_name = "render_glider_platform")]
41    fn render_inner(&self, _site: &Site, _land: &Land, painter: &Painter) {
42        let rotate_turns = match self.direction {
43            Dir::X => 0,
44            Dir::Y => 1,
45            Dir::NegX => 2,
46            Dir::NegY => 3,
47        };
48        let rotation_center = Vec3::new(self.center.x, self.center.y, self.alt);
49
50        let white = Fill::Brick(BlockKind::GlowingRock, Rgb::new(200, 200, 200), 24);
51        let wood = Fill::Brick(BlockKind::Wood, Rgb::new(55, 25, 8), 24);
52
53        let base = self.alt + 8;
54        // Base
55        let above_platform = painter.aabb(Aabb {
56            min: Vec2::new(self.center.x - 10, self.center.y - 4).with_z(base + 1),
57            max: Vec2::new(self.center.x + 15, self.center.y + 5).with_z(base + 10),
58        });
59
60        let platform = painter.aabb(Aabb {
61            min: Vec2::new(self.center.x - 10, self.center.y - 4).with_z(base),
62            max: Vec2::new(self.center.x + 15, self.center.y + 5).with_z(base + 1),
63        });
64        let stairs = painter.plane(
65            Aabr {
66                min: Vec2::new(self.center.x - 30, self.center.y - 4),
67                max: Vec2::new(self.center.x - 10, self.center.y + 5),
68            },
69            Vec3::new(self.center.x - 30, self.center.y - 4, base - 20),
70            Vec2::new(1.0, 0.0),
71        );
72        let leg_0 = painter.aabb(Aabb {
73            min: Vec2::new(self.center.x + 14, self.center.y - 4).with_z(base - 50),
74            max: Vec2::new(self.center.x + 15, self.center.y - 3).with_z(base),
75        });
76        let leg_1 = painter.aabb(Aabb {
77            min: Vec2::new(self.center.x - 10, self.center.y - 4).with_z(base - 50),
78            max: Vec2::new(self.center.x - 9, self.center.y - 3).with_z(base),
79        });
80        let leg_2 = painter.aabb(Aabb {
81            min: Vec2::new(self.center.x + 14, self.center.y + 4).with_z(base - 50),
82            max: Vec2::new(self.center.x + 15, self.center.y + 5).with_z(base),
83        });
84        let leg_3 = painter.aabb(Aabb {
85            min: Vec2::new(self.center.x - 10, self.center.y + 4).with_z(base - 50),
86            max: Vec2::new(self.center.x - 9, self.center.y + 5).with_z(base),
87        });
88        let arrow_shaft = painter.aabb(Aabb {
89            min: Vec2::new(self.center.x + 8, self.center.y + 0).with_z(base),
90            max: Vec2::new(self.center.x + 14, self.center.y + 1).with_z(base + 1),
91        });
92        let arrow_head_0 = painter.aabb(Aabb {
93            min: Vec2::new(self.center.x + 11, self.center.y - 2).with_z(base),
94            max: Vec2::new(self.center.x + 12, self.center.y + 3).with_z(base + 1),
95        });
96        let arrow_head_1 = painter.aabb(Aabb {
97            min: Vec2::new(self.center.x + 12, self.center.y - 1).with_z(base),
98            max: Vec2::new(self.center.x + 13, self.center.y + 2).with_z(base + 1),
99        });
100
101        let clears = [above_platform];
102        let wood_fills = [platform, stairs, leg_0, leg_1, leg_2, leg_3];
103        let white_fills = [arrow_shaft, arrow_head_0, arrow_head_1];
104
105        let fills = [
106            (&wood_fills as &[_], Some(wood)),
107            (&white_fills, Some(white.clone())),
108            (&clears, None),
109        ];
110        for (primitives, fill_color_maybe) in fills {
111            for prim in primitives {
112                if let Some(fill_color) = &fill_color_maybe {
113                    prim.rotate_z_90_about(rotate_turns, rotation_center)
114                        .fill(fill_color.clone());
115                } else {
116                    prim.rotate_z_90_about(rotate_turns, rotation_center)
117                        .clear();
118                }
119            }
120        }
121    }
122}