1use super::*;
2use crate::{Land, site::generation::PrimitiveTransform};
3use common::terrain::BlockKind;
4use rand::prelude::*;
5use vek::*;
6
7pub struct GliderPlatform {
9 center: Vec2<i32>,
11 direction: Dir2,
12 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 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 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}