mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Added windows to buildings and scarecrows
This commit is contained in:
parent
e242604a4c
commit
77d0292e91
@ -111,6 +111,10 @@ impl BlockKind {
|
|||||||
BlockKind::Radish => true,
|
BlockKind::Radish => true,
|
||||||
BlockKind::Turnip => true,
|
BlockKind::Turnip => true,
|
||||||
BlockKind::Coconut => true,
|
BlockKind::Coconut => true,
|
||||||
|
BlockKind::Window1 => true,
|
||||||
|
BlockKind::Window2 => true,
|
||||||
|
BlockKind::Window3 => true,
|
||||||
|
BlockKind::Window4 => true,
|
||||||
BlockKind::Scarecrow => true,
|
BlockKind::Scarecrow => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
@ -230,6 +234,7 @@ impl BlockKind {
|
|||||||
match self {
|
match self {
|
||||||
BlockKind::Tomato => 1.65,
|
BlockKind::Tomato => 1.65,
|
||||||
BlockKind::LargeCactus => 2.5,
|
BlockKind::LargeCactus => 2.5,
|
||||||
|
BlockKind::Scarecrow => 3.0,
|
||||||
_ => 1.0,
|
_ => 1.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -280,6 +285,16 @@ impl Block {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_ori(&self) -> Option<u8> {
|
||||||
|
match self.kind {
|
||||||
|
BlockKind::Window1
|
||||||
|
| BlockKind::Window2
|
||||||
|
| BlockKind::Window3
|
||||||
|
| BlockKind::Window4 => Some(self.color[0] & 0b111),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn kind(&self) -> BlockKind { self.kind }
|
pub fn kind(&self) -> BlockKind { self.kind }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,16 +262,19 @@ fn mesh_worker<V: BaseVol<Vox = Block> + RectRasterableVol + ReadVol + Debug>(
|
|||||||
let wpos = Vec3::from(pos * V::RECT_SIZE.map(|e: u32| e as i32))
|
let wpos = Vec3::from(pos * V::RECT_SIZE.map(|e: u32| e as i32))
|
||||||
+ Vec3::new(x, y, z);
|
+ Vec3::new(x, y, z);
|
||||||
|
|
||||||
let kind = volume.get(wpos).unwrap_or(&Block::empty()).kind();
|
let block = volume.get(wpos).ok().copied().unwrap_or(Block::empty());
|
||||||
|
|
||||||
if let Some(cfg) = sprite_config_for(kind) {
|
if let Some(cfg) = sprite_config_for(block.kind()) {
|
||||||
let seed = wpos.x as u64 * 3
|
let seed = wpos.x as u64 * 3
|
||||||
+ wpos.y as u64 * 7
|
+ wpos.y as u64 * 7
|
||||||
+ wpos.x as u64 * wpos.y as u64; // Awful PRNG
|
+ wpos.x as u64 * wpos.y as u64; // Awful PRNG
|
||||||
|
let ori = block
|
||||||
|
.get_ori()
|
||||||
|
.unwrap_or((seed % 8) as u8);
|
||||||
|
|
||||||
let instance = SpriteInstance::new(
|
let instance = SpriteInstance::new(
|
||||||
Mat4::identity()
|
Mat4::identity()
|
||||||
.rotated_z(f32::consts::PI * 0.5 * (seed % 4) as f32)
|
.rotated_z(f32::consts::PI * 0.25 * ori as f32)
|
||||||
.translated_3d(
|
.translated_3d(
|
||||||
wpos.map(|e| e as f32) + Vec3::new(0.5, 0.5, 0.0),
|
wpos.map(|e| e as f32) + Vec3::new(0.5, 0.5, 0.0),
|
||||||
),
|
),
|
||||||
@ -280,7 +283,7 @@ fn mesh_worker<V: BaseVol<Vox = Block> + RectRasterableVol + ReadVol + Debug>(
|
|||||||
);
|
);
|
||||||
|
|
||||||
instances
|
instances
|
||||||
.entry((kind, seed as usize % cfg.variations))
|
.entry((block.kind(), seed as usize % cfg.variations))
|
||||||
.or_insert_with(|| Vec::new())
|
.or_insert_with(|| Vec::new())
|
||||||
.push(instance);
|
.push(instance);
|
||||||
}
|
}
|
||||||
@ -340,28 +343,28 @@ impl<V: RectRasterableVol> Terrain<V> {
|
|||||||
(BlockKind::Window1, 0),
|
(BlockKind::Window1, 0),
|
||||||
make_model(
|
make_model(
|
||||||
"voxygen.voxel.sprite.window.window-0",
|
"voxygen.voxel.sprite.window.window-0",
|
||||||
Vec3::new(-6.0, -6.0, 0.0),
|
Vec3::new(-5.5, -5.5, 0.0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
(BlockKind::Window2, 0),
|
(BlockKind::Window2, 0),
|
||||||
make_model(
|
make_model(
|
||||||
"voxygen.voxel.sprite.window.window-1",
|
"voxygen.voxel.sprite.window.window-1",
|
||||||
Vec3::new(-6.0, -6.0, 0.0),
|
Vec3::new(-5.5, -5.5, 0.0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
(BlockKind::Window3, 0),
|
(BlockKind::Window3, 0),
|
||||||
make_model(
|
make_model(
|
||||||
"voxygen.voxel.sprite.window.window-2",
|
"voxygen.voxel.sprite.window.window-2",
|
||||||
Vec3::new(-6.0, -6.0, 0.0),
|
Vec3::new(-5.5, -5.5, 0.0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
(BlockKind::Window4, 0),
|
(BlockKind::Window4, 0),
|
||||||
make_model(
|
make_model(
|
||||||
"voxygen.voxel.sprite.window.window-3",
|
"voxygen.voxel.sprite.window.window-3",
|
||||||
Vec3::new(-6.0, -6.0, 0.0),
|
Vec3::new(-5.5, -5.5, 0.0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// Cacti
|
// Cacti
|
||||||
|
@ -491,6 +491,7 @@ fn walk_in_dir(sim: &WorldSim, a: Vec2<i32>, dir: Vec2<i32>) -> Option<f32> {
|
|||||||
if loc_suitable_for_walking(sim, a) && loc_suitable_for_walking(sim, a + dir) {
|
if loc_suitable_for_walking(sim, a) && loc_suitable_for_walking(sim, a + dir) {
|
||||||
let a_alt = sim.get(a)?.alt;
|
let a_alt = sim.get(a)?.alt;
|
||||||
let b_alt = sim.get(a + dir)?.alt;
|
let b_alt = sim.get(a + dir)?.alt;
|
||||||
|
let water_cost = if sim.get(a + dir)?.river.near_water() { 25.0 } else { 0.0 };
|
||||||
Some((b_alt - a_alt).abs() / 2.5)
|
Some((b_alt - a_alt).abs() / 2.5)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
|
@ -165,10 +165,18 @@ impl Archetype for House {
|
|||||||
bound_offset: Vec2<i32>,
|
bound_offset: Vec2<i32>,
|
||||||
center_offset: Vec2<i32>,
|
center_offset: Vec2<i32>,
|
||||||
z: i32,
|
z: i32,
|
||||||
|
ori: Ori,
|
||||||
branch: &Branch<Self::Attr>,
|
branch: &Branch<Self::Attr>,
|
||||||
) -> BlockMask {
|
) -> BlockMask {
|
||||||
let profile = Vec2::new(bound_offset.x, z);
|
let profile = Vec2::new(bound_offset.x, z);
|
||||||
|
|
||||||
|
let make_meta = |ori| {
|
||||||
|
Rgb::new(match ori {
|
||||||
|
Ori::East => 0,
|
||||||
|
Ori::North => 2,
|
||||||
|
}, 0, 0)
|
||||||
|
};
|
||||||
|
|
||||||
let make_block = |r, g, b| {
|
let make_block = |r, g, b| {
|
||||||
let nz = self
|
let nz = self
|
||||||
.noise
|
.noise
|
||||||
@ -196,6 +204,7 @@ impl Archetype for House {
|
|||||||
.with_priority(facade_layer);
|
.with_priority(facade_layer);
|
||||||
let empty = BlockMask::nothing();
|
let empty = BlockMask::nothing();
|
||||||
let internal = BlockMask::new(Block::empty(), structural_layer);
|
let internal = BlockMask::new(Block::empty(), structural_layer);
|
||||||
|
let end_window = BlockMask::new(Block::new(BlockKind::Window1, make_meta(ori.flip())), facade_layer);
|
||||||
let fire = BlockMask::new(Block::new(BlockKind::Ember, Rgb::white()), foundation_layer);
|
let fire = BlockMask::new(Block::new(BlockKind::Ember, Rgb::white()), foundation_layer);
|
||||||
|
|
||||||
let ceil_height = 6;
|
let ceil_height = 6;
|
||||||
@ -301,21 +310,21 @@ impl Archetype for House {
|
|||||||
} else if !branch.attr.storey_fill.has_upper() {
|
} else if !branch.attr.storey_fill.has_upper() {
|
||||||
return Some(empty);
|
return Some(empty);
|
||||||
} else {
|
} else {
|
||||||
let frame_bounds = if profile.y >= ceil_height {
|
let (frame_bounds, frame_borders) = if profile.y >= ceil_height {
|
||||||
Aabr {
|
(Aabr {
|
||||||
min: Vec2::new(-1, ceil_height + 2),
|
min: Vec2::new(-1, ceil_height + 2),
|
||||||
max: Vec2::new(1, ceil_height + 5),
|
max: Vec2::new(1, ceil_height + 5),
|
||||||
}
|
}, Vec2::new(1, 1))
|
||||||
} else {
|
} else {
|
||||||
Aabr {
|
(Aabr {
|
||||||
min: Vec2::new(2, foundation_height + 2),
|
min: Vec2::new(2, foundation_height + 2),
|
||||||
max: Vec2::new(width - 2, ceil_height - 2),
|
max: Vec2::new(width - 2, ceil_height - 2),
|
||||||
}
|
}, Vec2::new(1, 0))
|
||||||
};
|
};
|
||||||
let window_bounds = Aabr {
|
let window_bounds = Aabr {
|
||||||
min: (frame_bounds.min + 1)
|
min: (frame_bounds.min + frame_borders)
|
||||||
.map2(frame_bounds.center(), |a, b| a.min(b)),
|
.map2(frame_bounds.center(), |a, b| a.min(b)),
|
||||||
max: (frame_bounds.max - 1)
|
max: (frame_bounds.max - frame_borders)
|
||||||
.map2(frame_bounds.center(), |a, b| a.max(b)),
|
.map2(frame_bounds.center(), |a, b| a.max(b)),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -324,9 +333,9 @@ impl Archetype for House {
|
|||||||
// Window frame is large enough for a window
|
// Window frame is large enough for a window
|
||||||
let surface_pos = Vec2::new(bound_offset.x, profile.y);
|
let surface_pos = Vec2::new(bound_offset.x, profile.y);
|
||||||
if window_bounds.contains_point(surface_pos) {
|
if window_bounds.contains_point(surface_pos) {
|
||||||
return Some(internal);
|
return Some(end_window);
|
||||||
} else if frame_bounds.contains_point(surface_pos) {
|
} else if frame_bounds.contains_point(surface_pos) {
|
||||||
return Some(log.with_priority(3));
|
return Some(log.with_priority(facade_layer));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ impl Archetype for Keep {
|
|||||||
bound_offset: Vec2<i32>,
|
bound_offset: Vec2<i32>,
|
||||||
center_offset: Vec2<i32>,
|
center_offset: Vec2<i32>,
|
||||||
z: i32,
|
z: i32,
|
||||||
|
ori: Ori,
|
||||||
branch: &Branch<Self::Attr>,
|
branch: &Branch<Self::Attr>,
|
||||||
) -> BlockMask {
|
) -> BlockMask {
|
||||||
let profile = Vec2::new(bound_offset.x, z);
|
let profile = Vec2::new(bound_offset.x, z);
|
||||||
|
@ -18,6 +18,7 @@ pub trait Archetype {
|
|||||||
bound_offset: Vec2<i32>,
|
bound_offset: Vec2<i32>,
|
||||||
center_offset: Vec2<i32>,
|
center_offset: Vec2<i32>,
|
||||||
z: i32,
|
z: i32,
|
||||||
|
ori: Ori,
|
||||||
branch: &Branch<Self::Attr>,
|
branch: &Branch<Self::Attr>,
|
||||||
) -> BlockMask;
|
) -> BlockMask;
|
||||||
}
|
}
|
||||||
|
@ -50,9 +50,9 @@ impl<A: Archetype> Building<A> {
|
|||||||
pub fn sample(&self, pos: Vec3<i32>) -> Option<Block> {
|
pub fn sample(&self, pos: Vec3<i32>) -> Option<Block> {
|
||||||
let rpos = pos - self.origin;
|
let rpos = pos - self.origin;
|
||||||
self.skel
|
self.skel
|
||||||
.sample_closest(rpos.into(), |dist, bound_offset, center_offset, branch| {
|
.sample_closest(rpos.into(), |dist, bound_offset, center_offset, ori, branch| {
|
||||||
self.archetype
|
self.archetype
|
||||||
.draw(dist, bound_offset, center_offset, rpos.z, branch)
|
.draw(dist, bound_offset, center_offset, rpos.z, ori, branch)
|
||||||
})
|
})
|
||||||
.finish()
|
.finish()
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,7 @@ impl<T> Skeleton<T> {
|
|||||||
pub fn sample_closest(
|
pub fn sample_closest(
|
||||||
&self,
|
&self,
|
||||||
pos: Vec2<i32>,
|
pos: Vec2<i32>,
|
||||||
mut f: impl FnMut(i32, Vec2<i32>, Vec2<i32>, &Branch<T>) -> BlockMask,
|
mut f: impl FnMut(i32, Vec2<i32>, Vec2<i32>, Ori, &Branch<T>) -> BlockMask,
|
||||||
) -> BlockMask {
|
) -> BlockMask {
|
||||||
let mut min = None::<(_, BlockMask)>;
|
let mut min = None::<(_, BlockMask)>;
|
||||||
self.for_each(|node, ori, branch, is_child, parent_locus| {
|
self.for_each(|node, ori, branch, is_child, parent_locus| {
|
||||||
@ -115,7 +115,7 @@ impl<T> Skeleton<T> {
|
|||||||
}
|
}
|
||||||
|| true
|
|| true
|
||||||
{
|
{
|
||||||
let new_bm = f(dist, bound_offset, center_offset, branch);
|
let new_bm = f(dist, bound_offset, center_offset, ori, branch);
|
||||||
min = min
|
min = min
|
||||||
.map(|(_, bm)| (dist_locus, bm.resolve_with(new_bm)))
|
.map(|(_, bm)| (dist_locus, bm.resolve_with(new_bm)))
|
||||||
.or(Some((dist_locus, new_bm)));
|
.or(Some((dist_locus, new_bm)));
|
||||||
|
@ -611,6 +611,11 @@ impl Settlement {
|
|||||||
Crop::Sunflower => Some(BlockKind::Sunflower),
|
Crop::Sunflower => Some(BlockKind::Sunflower),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
.or_else(|| if roll(9, 256) == 0 {
|
||||||
|
Some(BlockKind::Scarecrow)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
})
|
||||||
.map(|kind| Block::new(kind, Rgb::white()));
|
.map(|kind| Block::new(kind, Rgb::white()));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user