mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
banners, reworked huts/watchtowers/fencetowers
This commit is contained in:
@ -46,7 +46,7 @@ impl GnarlingStructure {
|
|||||||
match (self, other) {
|
match (self, other) {
|
||||||
(Self::Hut, Self::Hut) => 15,
|
(Self::Hut, Self::Hut) => 15,
|
||||||
(_, Self::Longhut) | (Self::Longhut, _) => 25,
|
(_, Self::Longhut) | (Self::Longhut, _) => 25,
|
||||||
(_, Self::Banner) | (Self::Banner, _) => 10,
|
(_, Self::Banner) | (Self::Banner, _) => 15,
|
||||||
|
|
||||||
(Self::Hut, Self::Totem) | (Self::Totem, Self::Hut) => 20,
|
(Self::Hut, Self::Totem) | (Self::Totem, Self::Hut) => 20,
|
||||||
(Self::Totem, Self::Totem) => 50,
|
(Self::Totem, Self::Totem) => 50,
|
||||||
@ -175,7 +175,7 @@ impl GnarlingFortification {
|
|||||||
let structure_kind = match rng.gen_range(0..10) {
|
let structure_kind = match rng.gen_range(0..10) {
|
||||||
0 => GnarlingStructure::Totem,
|
0 => GnarlingStructure::Totem,
|
||||||
1..=3 => GnarlingStructure::Longhut,
|
1..=3 => GnarlingStructure::Longhut,
|
||||||
//3..=8 => GnarlingStructure::Banner,
|
4..=5 => GnarlingStructure::Banner,
|
||||||
_ => GnarlingStructure::Hut,
|
_ => GnarlingStructure::Hut,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -541,13 +541,50 @@ impl Structure for GnarlingFortification {
|
|||||||
.prim(Primitive::cylinder(
|
.prim(Primitive::cylinder(
|
||||||
tower_base_pos,
|
tower_base_pos,
|
||||||
tower_radius,
|
tower_radius,
|
||||||
tower_depth as f32 + tower_height,
|
tower_depth as f32 + tower_height - 5.0,
|
||||||
))
|
))
|
||||||
.fill(Fill::Block(Block::new(
|
.fill(Fill::Block(Block::new(
|
||||||
BlockKind::Wood,
|
BlockKind::Wood,
|
||||||
Rgb::new(55, 25, 8),
|
Rgb::new(55, 25, 8), //dark brown
|
||||||
|
)));
|
||||||
|
painter
|
||||||
|
.prim(Primitive::cylinder(
|
||||||
|
wpos.with_z(
|
||||||
|
land.get_alt_approx(wpos) as i32 - tower_depth
|
||||||
|
+ tower_depth as i32
|
||||||
|
+ tower_height as i32
|
||||||
|
- 5,
|
||||||
|
),
|
||||||
|
tower_radius,
|
||||||
|
5.0,
|
||||||
|
))
|
||||||
|
.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Wood,
|
||||||
|
Rgb::new(115, 58, 26), //light brown
|
||||||
|
)));
|
||||||
|
painter
|
||||||
|
.prim(Primitive::cylinder(tower_base_pos, tower_radius + 1.0, 5.0))
|
||||||
|
.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Wood,
|
||||||
|
Rgb::new(22, 36, 20), //green
|
||||||
|
)));
|
||||||
|
let red_deco1 = painter.aabb(Aabb {
|
||||||
|
min: Vec2::new(wpos.x - 5, wpos.y - 1)
|
||||||
|
.with_z(land.get_alt_approx(wpos) as i32 - tower_depth),
|
||||||
|
max: Vec2::new(wpos.x + 5, wpos.y + 1)
|
||||||
|
.with_z(land.get_alt_approx(wpos) as i32 - tower_depth + 16),
|
||||||
|
});
|
||||||
|
let red_deco2 = painter.aabb(Aabb {
|
||||||
|
min: Vec2::new(wpos.x - 1, wpos.y - 5)
|
||||||
|
.with_z(land.get_alt_approx(wpos) as i32 - tower_depth),
|
||||||
|
max: Vec2::new(wpos.x + 1, wpos.y + 5)
|
||||||
|
.with_z(land.get_alt_approx(wpos) as i32 - tower_depth + 16),
|
||||||
|
});
|
||||||
|
let red_deco = red_deco1.union(red_deco2);
|
||||||
|
red_deco.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Wood,
|
||||||
|
Rgb::new(102, 31, 24), //red
|
||||||
)));
|
)));
|
||||||
|
|
||||||
// Tower cylinder
|
// Tower cylinder
|
||||||
let tower_floor_pos = wpos.with_z(land.get_alt_approx(wpos) as i32);
|
let tower_floor_pos = wpos.with_z(land.get_alt_approx(wpos) as i32);
|
||||||
|
|
||||||
@ -645,11 +682,46 @@ impl Structure for GnarlingFortification {
|
|||||||
|
|
||||||
// Wall
|
// Wall
|
||||||
let floor_pos = wpos.with_z(alt + 1);
|
let floor_pos = wpos.with_z(alt + 1);
|
||||||
|
//alternating colors for ring pattern on ceiling
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(floor_pos, hut_radius, hut_wall_height))
|
.prim(Primitive::cylinder(
|
||||||
|
floor_pos,
|
||||||
|
hut_radius,
|
||||||
|
hut_wall_height + 3.0,
|
||||||
|
))
|
||||||
.fill(Fill::Block(Block::new(
|
.fill(Fill::Block(Block::new(
|
||||||
BlockKind::Wood,
|
BlockKind::Wood,
|
||||||
Rgb::new(115, 58, 26),
|
Rgb::new(71, 33, 11),
|
||||||
|
)));
|
||||||
|
painter
|
||||||
|
.prim(Primitive::cylinder(
|
||||||
|
floor_pos,
|
||||||
|
hut_radius - 1.0,
|
||||||
|
hut_wall_height + 3.0,
|
||||||
|
))
|
||||||
|
.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Wood,
|
||||||
|
Rgb::new(55, 25, 8),
|
||||||
|
)));
|
||||||
|
painter
|
||||||
|
.prim(Primitive::cylinder(
|
||||||
|
floor_pos,
|
||||||
|
hut_radius - 2.0,
|
||||||
|
hut_wall_height + 3.0,
|
||||||
|
))
|
||||||
|
.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Wood,
|
||||||
|
Rgb::new(71, 33, 11),
|
||||||
|
)));
|
||||||
|
painter
|
||||||
|
.prim(Primitive::cylinder(
|
||||||
|
floor_pos,
|
||||||
|
hut_radius - 3.0,
|
||||||
|
hut_wall_height + 3.0,
|
||||||
|
))
|
||||||
|
.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Wood,
|
||||||
|
Rgb::new(55, 25, 8),
|
||||||
)));
|
)));
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cylinder(
|
.prim(Primitive::cylinder(
|
||||||
@ -689,26 +761,55 @@ impl Structure for GnarlingFortification {
|
|||||||
let roof_radius = hut_radius + roof_overhang;
|
let roof_radius = hut_radius + roof_overhang;
|
||||||
painter
|
painter
|
||||||
.prim(Primitive::cone(
|
.prim(Primitive::cone(
|
||||||
wpos.with_z(alt + 1 + hut_wall_height as i32),
|
wpos.with_z(alt + 3 + hut_wall_height as i32),
|
||||||
roof_radius,
|
roof_radius - 1.0,
|
||||||
roof_height,
|
roof_height - 1.0,
|
||||||
))
|
))
|
||||||
.fill(Fill::Block(Block::new(
|
.fill(Fill::Block(Block::new(
|
||||||
BlockKind::Leaves,
|
BlockKind::Leaves,
|
||||||
Rgb::new(22, 36, 20),
|
Rgb::new(22, 36, 20),
|
||||||
)));
|
)));
|
||||||
|
//small bits handing from huts
|
||||||
|
let tendril1 = painter.line(
|
||||||
|
Vec2::new(wpos.x - 3, wpos.y - 5).with_z(alt + 1 + hut_wall_height as i32),
|
||||||
|
Vec2::new(wpos.x - 3, wpos.y - 5).with_z(alt + 3 + hut_wall_height as i32),
|
||||||
|
1.0,
|
||||||
|
);
|
||||||
|
|
||||||
|
let tendril2 = painter.line(
|
||||||
|
Vec2::new(wpos.x + 4, wpos.y + 2).with_z(alt + 2 + hut_wall_height as i32),
|
||||||
|
Vec2::new(wpos.x + 4, wpos.y + 2).with_z(alt + 3 + hut_wall_height as i32),
|
||||||
|
1.0,
|
||||||
|
);
|
||||||
|
|
||||||
|
let tendril3 = tendril2.translate(Vec3::new(-7, 2, 0));
|
||||||
|
let tendril4 = tendril1.translate(Vec3::new(7, 4, 0));
|
||||||
|
let tendrils = tendril1.union(tendril2).union(tendril3).union(tendril4);
|
||||||
|
|
||||||
|
tendrils.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Leaves,
|
||||||
|
Rgb::new(22, 36, 20),
|
||||||
|
)));
|
||||||
|
//sphere to delete some hut
|
||||||
|
painter
|
||||||
|
.prim(Primitive::sphere(
|
||||||
|
Vec2::new(wpos.x + 1, wpos.y + 2)
|
||||||
|
.with_z(alt + 11 + hut_wall_height as i32),
|
||||||
|
8.5 as f32,
|
||||||
|
))
|
||||||
|
.fill(Fill::Block(Block::empty()));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_longhut(
|
fn generate_longhut(
|
||||||
painter: &Painter,
|
painter: &Painter,
|
||||||
wpos: Vec2<i32>,
|
wpos: Vec2<i32>,
|
||||||
alt: i32,
|
alt: i32,
|
||||||
door_dir: Ori,
|
_door_dir: Ori,
|
||||||
hut_radius: f32,
|
hut_radius: f32,
|
||||||
hut_wall_height: f32,
|
_hut_wall_height: f32,
|
||||||
door_height: i32,
|
_door_height: i32,
|
||||||
roof_height: f32,
|
roof_height: f32,
|
||||||
roof_overhang: f32,
|
_roof_overhang: f32,
|
||||||
) {
|
) {
|
||||||
// Floor
|
// Floor
|
||||||
let raise = 5;
|
let raise = 5;
|
||||||
@ -904,7 +1005,7 @@ impl Structure for GnarlingFortification {
|
|||||||
.with_z(alt + raise + height_1 as i32 + 7),
|
.with_z(alt + raise + height_1 as i32 + 7),
|
||||||
})
|
})
|
||||||
.fill(Fill::Block(Block::empty()));
|
.fill(Fill::Block(Block::empty()));
|
||||||
let rafter = painter
|
painter
|
||||||
.aabb(Aabb {
|
.aabb(Aabb {
|
||||||
min: Vec2::new(wpos.x - 15, wpos.y - 1)
|
min: Vec2::new(wpos.x - 15, wpos.y - 1)
|
||||||
.with_z(alt + raise + height_1 as i32 - 3),
|
.with_z(alt + raise + height_1 as i32 - 3),
|
||||||
@ -943,7 +1044,7 @@ impl Structure for GnarlingFortification {
|
|||||||
BlockKind::Leaves,
|
BlockKind::Leaves,
|
||||||
Rgb::new(55, 25, 8),
|
Rgb::new(55, 25, 8),
|
||||||
)));
|
)));
|
||||||
let color = painter
|
painter
|
||||||
.aabb(Aabb {
|
.aabb(Aabb {
|
||||||
min: Vec2::new(wpos.x - 1, wpos.y - 15)
|
min: Vec2::new(wpos.x - 1, wpos.y - 15)
|
||||||
.with_z(alt + raise + height_1 as i32 - 3),
|
.with_z(alt + raise + height_1 as i32 - 3),
|
||||||
@ -1054,39 +1155,75 @@ impl Structure for GnarlingFortification {
|
|||||||
},
|
},
|
||||||
|
|
||||||
GnarlingStructure::Banner => {
|
GnarlingStructure::Banner => {
|
||||||
painter
|
let flag = painter.aabb(Aabb {
|
||||||
.aabb(Aabb {
|
min: Vec2::new(wpos.x + 1, wpos.y - 1).with_z(alt + 8),
|
||||||
min: (wpos - 1).with_z(alt - 3),
|
max: Vec2::new(wpos.x + 8, wpos.y).with_z(alt + 38),
|
||||||
max: (wpos).with_z(alt + 30),
|
});
|
||||||
})
|
flag.fill(Fill::Block(Block::new(
|
||||||
.fill(Fill::Block(Block::new(
|
|
||||||
BlockKind::Leaves,
|
|
||||||
Rgb::new(55, 25, 8),
|
|
||||||
)));
|
|
||||||
|
|
||||||
painter
|
|
||||||
.line(
|
|
||||||
Vec2::new(wpos.x - 5, wpos.y - 1).with_z(alt + 25),
|
|
||||||
Vec2::new(wpos.x + 8, wpos.y - 1).with_z(alt + 38),
|
|
||||||
0.9,
|
|
||||||
)
|
|
||||||
.fill(Fill::Block(Block::new(
|
|
||||||
BlockKind::Leaves,
|
|
||||||
Rgb::new(55, 25, 8),
|
|
||||||
)));
|
|
||||||
painter
|
|
||||||
.plane(
|
|
||||||
Aabr {
|
|
||||||
min: Vec2::new(wpos.x + 1, wpos.y - 1),
|
|
||||||
max: Vec2::new(wpos.x + 8, wpos.y),
|
|
||||||
},
|
|
||||||
(wpos + 10).with_z(alt + 20),
|
|
||||||
Vec2::new(-1.0, 1.0),
|
|
||||||
)
|
|
||||||
.fill(Fill::Block(Block::new(
|
|
||||||
BlockKind::Leaves,
|
BlockKind::Leaves,
|
||||||
Rgb::new(102, 31, 24),
|
Rgb::new(102, 31, 24),
|
||||||
)));
|
)));
|
||||||
|
//add green streaks
|
||||||
|
let streak1 = painter
|
||||||
|
.line(
|
||||||
|
Vec2::new(wpos.x - 5, wpos.y - 1).with_z(alt + 20),
|
||||||
|
Vec2::new(wpos.x + 8, wpos.y - 1).with_z(alt + 33),
|
||||||
|
4.0,
|
||||||
|
)
|
||||||
|
.intersect(flag);
|
||||||
|
|
||||||
|
let streak2 = painter
|
||||||
|
.line(
|
||||||
|
Vec2::new(wpos.x - 5, wpos.y - 1).with_z(alt + 12),
|
||||||
|
Vec2::new(wpos.x + 8, wpos.y - 1).with_z(alt + 25),
|
||||||
|
1.5,
|
||||||
|
)
|
||||||
|
.intersect(flag);
|
||||||
|
let streak3 = painter
|
||||||
|
.line(
|
||||||
|
Vec2::new(wpos.x - 5, wpos.y - 1).with_z(alt + 8),
|
||||||
|
Vec2::new(wpos.x + 8, wpos.y - 1).with_z(alt + 21),
|
||||||
|
1.0,
|
||||||
|
)
|
||||||
|
.intersect(flag);
|
||||||
|
let streaks = streak1.union(streak2).union(streak3);
|
||||||
|
streaks.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Leaves,
|
||||||
|
Rgb::new(22, 36, 20),
|
||||||
|
)));
|
||||||
|
//erase from top and bottom of rectangle flag for shape
|
||||||
|
painter
|
||||||
|
.line(
|
||||||
|
Vec2::new(wpos.x - 5, wpos.y - 1).with_z(alt + 31),
|
||||||
|
Vec2::new(wpos.x + 8, wpos.y - 1).with_z(alt + 44),
|
||||||
|
5.0,
|
||||||
|
)
|
||||||
|
.intersect(flag)
|
||||||
|
.fill(Fill::Block(Block::empty()));
|
||||||
|
painter
|
||||||
|
.prim(Primitive::sphere(
|
||||||
|
Vec2::new(wpos.x + 8, wpos.y).with_z(alt + 8),
|
||||||
|
6.0 as f32,
|
||||||
|
))
|
||||||
|
.intersect(flag)
|
||||||
|
.fill(Fill::Block(Block::empty()));
|
||||||
|
|
||||||
|
//flagpole
|
||||||
|
let column = painter.aabb(Aabb {
|
||||||
|
min: (wpos - 1).with_z(alt - 3),
|
||||||
|
max: (wpos).with_z(alt + 30),
|
||||||
|
});
|
||||||
|
|
||||||
|
let arm = painter.line(
|
||||||
|
Vec2::new(wpos.x - 5, wpos.y - 1).with_z(alt + 26),
|
||||||
|
Vec2::new(wpos.x + 8, wpos.y - 1).with_z(alt + 39),
|
||||||
|
0.9,
|
||||||
|
);
|
||||||
|
let flagpole = column.union(arm);
|
||||||
|
flagpole.fill(Fill::Block(Block::new(
|
||||||
|
BlockKind::Leaves,
|
||||||
|
Rgb::new(55, 25, 8),
|
||||||
|
)));
|
||||||
},
|
},
|
||||||
GnarlingStructure::WatchTower => {
|
GnarlingStructure::WatchTower => {
|
||||||
let platform_1_height = 14;
|
let platform_1_height = 14;
|
||||||
@ -1112,17 +1249,17 @@ impl Structure for GnarlingFortification {
|
|||||||
let support_1 = painter.line(
|
let support_1 = painter.line(
|
||||||
wpos.with_z(alt),
|
wpos.with_z(alt),
|
||||||
(wpos + 2).with_z(alt + platform_1_height),
|
(wpos + 2).with_z(alt + platform_1_height),
|
||||||
0.9,
|
1.0,
|
||||||
);
|
);
|
||||||
let support_2 = support_1
|
let support_2 = support_1
|
||||||
.rotate(Mat3::new(1, 0, 0, 0, -1, 0, 0, 0, 1))
|
.rotate(Mat3::new(1, 0, 0, 0, -1, 0, 0, 0, 1))
|
||||||
.translate(Vec3::new(0, 11, 0));
|
.translate(Vec3::new(0, 13, 0));
|
||||||
let support_3 = support_1
|
let support_3 = support_1
|
||||||
.rotate(Mat3::new(-1, 0, 0, 0, 1, 0, 0, 0, 1))
|
.rotate(Mat3::new(-1, 0, 0, 0, 1, 0, 0, 0, 1))
|
||||||
.translate(Vec3::new(11, 0, 0));
|
.translate(Vec3::new(13, 0, 0));
|
||||||
let support_4 = support_1
|
let support_4 = support_1
|
||||||
.rotate(Mat3::new(-1, 0, 0, 0, -1, 0, 0, 0, 1))
|
.rotate(Mat3::new(-1, 0, 0, 0, -1, 0, 0, 0, 1))
|
||||||
.translate(Vec3::new(11, 11, 0));
|
.translate(Vec3::new(13, 13, 0));
|
||||||
|
|
||||||
let supports = support_1.union(support_2).union(support_3).union(support_4);
|
let supports = support_1.union(support_2).union(support_3).union(support_4);
|
||||||
|
|
||||||
@ -1279,20 +1416,63 @@ impl Structure for GnarlingFortification {
|
|||||||
.with_z(alt + roof_height),
|
.with_z(alt + roof_height),
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
//skirt
|
||||||
|
let skirt1 = painter
|
||||||
|
.aabb(Aabb {
|
||||||
|
min: Vec2::new(wpos.x + 1, wpos.y)
|
||||||
|
.with_z(alt + platform_1_height - 3),
|
||||||
|
max: Vec2::new(wpos.x + 4, wpos.y + 1)
|
||||||
|
.with_z(alt + platform_1_height + 1),
|
||||||
|
})
|
||||||
|
.without(painter.line(
|
||||||
|
Vec2::new(wpos.x + 1, wpos.y).with_z(alt + platform_1_height - 1),
|
||||||
|
Vec2::new(wpos.x + 1, wpos.y).with_z(alt + platform_1_height - 3),
|
||||||
|
1.0,
|
||||||
|
))
|
||||||
|
.without(painter.line(
|
||||||
|
Vec2::new(wpos.x + 3, wpos.y).with_z(alt + platform_1_height - 2),
|
||||||
|
Vec2::new(wpos.x + 3, wpos.y).with_z(alt + platform_1_height - 3),
|
||||||
|
1.0,
|
||||||
|
));
|
||||||
|
let skirt2 = skirt1
|
||||||
|
.translate(Vec3::new(6, 0, 0))
|
||||||
|
.rotate(Mat3::new(-1, 0, 0, 0, 1, 0, 0, 0, 1));
|
||||||
|
let skirt3 = skirt2.translate(Vec3::new(3, 0, 0));
|
||||||
|
|
||||||
let tower = platform_1
|
let skirtside1 = skirt1.union(skirt2).union(skirt3);
|
||||||
.union(platform_2)
|
let skirtside2 = skirtside1
|
||||||
.union(platform_3)
|
.rotate(Mat3::new(0, -1, 0, 1, 0, 0, 0, 0, 1))
|
||||||
.union(supports)
|
.translate(Vec3::new(-1, 2, 0));
|
||||||
|
|
||||||
|
let skirtcorner1 = skirtside1.union(skirtside2);
|
||||||
|
let skirtcorner2 = skirtcorner1
|
||||||
|
.rotate(Mat3::new(-1, 0, 0, 0, -1, 0, 0, 0, 1))
|
||||||
|
.translate(Vec3::new(13, 11, 0));
|
||||||
|
|
||||||
|
let skirt1 = skirtcorner1.union(skirtcorner2);
|
||||||
|
let skirt2 = skirt1
|
||||||
|
.rotate(Mat3::new(1, 0, 0, 0, -1, 0, 0, 0, 1))
|
||||||
|
.translate(Vec3::new(0, 11, 6));
|
||||||
|
|
||||||
|
let skirt = skirt1.union(skirt2).union(roof);
|
||||||
|
painter.fill(
|
||||||
|
skirt,
|
||||||
|
Fill::Block(Block::new(BlockKind::Leaves, Rgb::new(22, 36, 20))),
|
||||||
|
);
|
||||||
|
|
||||||
|
let towerplatform = platform_1.union(platform_2).union(platform_3);
|
||||||
|
|
||||||
|
painter.fill(
|
||||||
|
towerplatform,
|
||||||
|
Fill::Block(Block::new(BlockKind::Wood, Rgb::new(115, 58, 26))),
|
||||||
|
);
|
||||||
|
let towervertical = supports
|
||||||
.union(platform_1_supports)
|
.union(platform_1_supports)
|
||||||
// .union(platform_1_pillars)
|
|
||||||
.union(platform_2_supports)
|
.union(platform_2_supports)
|
||||||
// .union(platform_2_pillars)
|
|
||||||
.union(roof)
|
|
||||||
.union(roof_pillars);
|
.union(roof_pillars);
|
||||||
|
|
||||||
painter.fill(
|
painter.fill(
|
||||||
tower,
|
towervertical,
|
||||||
Fill::Block(Block::new(BlockKind::Wood, Rgb::new(55, 25, 8))),
|
Fill::Block(Block::new(BlockKind::Wood, Rgb::new(55, 25, 8))),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user