veloren_world/site/plot/
glider_platform.rs

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