veloren_world/site2/plot/
glider_platform.rs1use super::*;
2use crate::{
3 Land,
4 site2::{gen::PrimitiveTransform, util::Dir},
5};
6use common::terrain::BlockKind;
7use rand::prelude::*;
8use vek::*;
9
10pub struct GliderPlatform {
12 center: Vec2<i32>,
14 direction: Dir,
15 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 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 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}