mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Fixing all sites but bridges
This commit is contained in:
parent
4e528d1ad2
commit
05489e5b7e
@ -354,7 +354,7 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
|
||||
Arc<dyn Fn(Vec3<i32>) -> f32 + Send + Sync>,
|
||||
Arc<dyn Fn(Vec3<i32>) -> f32 + Send + Sync>,
|
||||
AltIndices,
|
||||
/* (f32, f32), */
|
||||
(f32, f32),
|
||||
),
|
||||
> {
|
||||
/* span!(
|
||||
@ -930,6 +930,11 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
|
||||
let mut opaque_shallow = Vec::new();
|
||||
let mut opaque_surface = Vec::new();
|
||||
let mut fluid_mesh = Mesh::new();
|
||||
let (underground_alt, deep_alt) = vol
|
||||
.get_key(vol.pos_key((range.min + range.max) / 2))
|
||||
.map_or((0.0, 0.0), |c| {
|
||||
(c.meta().alt() - SHALLOW_ALT, c.meta().alt() - DEEP_ALT)
|
||||
});
|
||||
let mut do_draw_greedy = #[inline(always)] |z_start: i32, z_end: i32| {
|
||||
// dbg!(range.min, z_start, z_end);
|
||||
let greedy_size = Vec3::new(range.size().w - 2, range.size().h - 2, z_end - z_start + 1);
|
||||
@ -948,11 +953,8 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
|
||||
|
||||
// NOTE: Conversion to f32 is fine since this i32 is actually in bounds for u16.
|
||||
let mesh_delta = Vec3::new(0.0, 0.0, (z_start + range.min.z) as f32);
|
||||
let (underground_alt, deep_alt) = vol
|
||||
.get_key(vol.pos_key((range.min + range.max) / 2))
|
||||
.map_or((0.0, 0.0), |c| {
|
||||
(c.meta().alt() - SHALLOW_ALT - mesh_delta.z, c.meta().alt() - DEEP_ALT - mesh_delta.z)
|
||||
});
|
||||
let underground_alt = underground_alt - mesh_delta.z;
|
||||
let deep_alt = deep_alt - mesh_delta.z;
|
||||
|
||||
let create_opaque =
|
||||
#[inline(always)] |atlas_pos, pos: Vec3<f32>, norm, meta| TerrainVertex::new(atlas_pos, pos + mesh_delta, norm, meta);
|
||||
@ -1129,7 +1131,7 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
|
||||
deep_end: deep_end * quad_mul,
|
||||
underground_end: underground_end * quad_mul,
|
||||
};
|
||||
// let sun_occluder_z_bounds = ((underground_alt + mesh_delta.z).max(bounds.min.z), bounds.max.z);
|
||||
let sun_occluder_z_bounds = (underground_alt.max(bounds.min.z), bounds.max.z);
|
||||
|
||||
(
|
||||
opaque_deep
|
||||
@ -1145,7 +1147,7 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
|
||||
Arc::new(light) as Arc<dyn Fn(Vec3<i32>) -> f32 + Send + Sync>,
|
||||
Arc::new(glow) as Arc<dyn Fn(Vec3<i32>) -> f32 + Send + Sync>,
|
||||
alt_indices,
|
||||
// sun_occluder_z_bounds,
|
||||
sun_occluder_z_bounds,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
@ -110,7 +110,7 @@ pub struct TerrainChunkData {
|
||||
can_shadow_sun: bool,
|
||||
z_bounds: (f32, f32),
|
||||
shadow_z_bounds: (f32, f32),
|
||||
// sun_occluder_z_bounds: (f32, f32),
|
||||
sun_occluder_z_bounds: (f32, f32),
|
||||
frustum_last_plane_index: u8,
|
||||
|
||||
alt_indices: AltIndices,
|
||||
@ -143,7 +143,7 @@ struct ChunkMeshState {
|
||||
pub struct MeshWorkerResponseMesh {
|
||||
z_bounds: (f32, f32),
|
||||
shadow_z_bounds: (f32, f32),
|
||||
// sun_occluder_z_bounds: (f32, f32),
|
||||
sun_occluder_z_bounds: (f32, f32),
|
||||
opaque_model: Option<Model<TerrainVertex>>,
|
||||
fluid_model: Option<Model<FluidVertex>>,
|
||||
/// NOTE: These are memory mapped, and must be unmapped!
|
||||
@ -303,7 +303,7 @@ async fn mesh_worker<'b>(
|
||||
opaque_mesh,
|
||||
fluid_mesh,
|
||||
_shadow_mesh,
|
||||
(bounds, col_lights_info, light_map, glow_map, alt_indices/*, sun_occluder_z_bounds*/),
|
||||
(bounds, col_lights_info, light_map, glow_map, alt_indices, sun_occluder_z_bounds),
|
||||
) = generate_mesh(
|
||||
&volume,
|
||||
move |size| async move {
|
||||
@ -334,7 +334,7 @@ async fn mesh_worker<'b>(
|
||||
// we can ignore such cases for the purposes of determining a shadow bounding box (but
|
||||
// not visibility, unfortunately).
|
||||
shadow_z_bounds: ((chunk.get_min_z() as f32).max(bounds.min.z), (chunk.get_max_z() as f32).min(bounds.max.z)),
|
||||
// sun_occluder_z_bounds,
|
||||
sun_occluder_z_bounds,
|
||||
opaque_model: create_opaque(&opaque_mesh),
|
||||
fluid_model: create_fluid(&fluid_mesh),
|
||||
/* locals: create_locals(), */
|
||||
@ -1627,7 +1627,7 @@ impl/*<V: RectRasterableVol>*/ Terrain<V> {
|
||||
blocks_of_interest: response.blocks_of_interest,
|
||||
z_bounds: mesh.z_bounds,
|
||||
shadow_z_bounds: mesh.shadow_z_bounds,
|
||||
// sun_occluder_z_bounds: mesh.sun_occluder_z_bounds,
|
||||
sun_occluder_z_bounds: mesh.sun_occluder_z_bounds,
|
||||
frustum_last_plane_index: 0,
|
||||
alt_indices: mesh.alt_indices,
|
||||
});
|
||||
@ -1707,20 +1707,20 @@ impl/*<V: RectRasterableVol>*/ Terrain<V> {
|
||||
|
||||
chunk.frustum_last_plane_index = last_plane_index;
|
||||
chunk.visible.in_frustum = in_frustum;
|
||||
let chunk_box = Aabb {
|
||||
/* let chunk_box = Aabb {
|
||||
min: Vec3::from(chunk_min),
|
||||
max: Vec3::from(chunk_max),
|
||||
};
|
||||
/* let chunk_area = Aabr {
|
||||
}; */
|
||||
let chunk_area = Aabr {
|
||||
min: chunk_pos,
|
||||
max: chunk_pos + chunk_sz,
|
||||
}; */
|
||||
};
|
||||
|
||||
if in_frustum {
|
||||
let visible_box = /* Aabb {
|
||||
let visible_box = Aabb {
|
||||
min: chunk_area.min.with_z(chunk.sun_occluder_z_bounds.0),
|
||||
max: chunk_area.max.with_z(chunk.sun_occluder_z_bounds.1),
|
||||
} */chunk_box;
|
||||
}/* chunk_box */;
|
||||
visible_bounding_box = visible_bounding_box
|
||||
.map(|e| e.union(visible_box))
|
||||
.or(Some(visible_box));
|
||||
|
@ -202,6 +202,16 @@ impl Civs {
|
||||
)?,
|
||||
SiteKind::Castle,
|
||||
), */
|
||||
0..=5 => (
|
||||
find_site_loc(
|
||||
&mut ctx,
|
||||
&ProximityRequirements::new()
|
||||
.avoid_all_of(this.castle_enemies(), 40)
|
||||
.close_to_one_of(this.towns(), 20),
|
||||
SiteKind::Citadel,
|
||||
)?,
|
||||
SiteKind::Citadel,
|
||||
),
|
||||
28..=31 => {
|
||||
/* if index.features().site2_giant_trees */{
|
||||
(
|
||||
|
@ -645,17 +645,22 @@ impl<'a, 'b, F: Filler> FillFn<'a, 'b, F> {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn brick(&self, bk: BlockKind, col: Rgb<u8>, range: u8) -> impl Fill + Copy {
|
||||
// FIXME: Statically cache somewhere, or maybe just remove in favor of
|
||||
// Sampling.
|
||||
FillVar(move |pos: Vec3<i32>| {
|
||||
pub fn brick_fn(&self, bk: BlockKind, col: Rgb<u8>, range: u8) -> impl Fn(Vec3<i32>) -> Option<Block> + Copy {
|
||||
move |pos: Vec3<i32>| {
|
||||
Some(Block::new(
|
||||
bk,
|
||||
col + (RandomField::new(13)
|
||||
.get((pos + Vec3::new(pos.z, pos.z, 0)) / Vec3::new(2, 2, 1))
|
||||
% range as u32) as u8,
|
||||
))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn brick(&self, bk: BlockKind, col: Rgb<u8>, range: u8) -> impl Fill + Copy {
|
||||
// FIXME: Statically cache somewhere, or maybe just remove in favor of
|
||||
// Sampling.
|
||||
FillVar(self.brick_fn(bk, col, range))
|
||||
}
|
||||
|
||||
#[inline]
|
||||
@ -952,12 +957,17 @@ impl Painter<'_> {
|
||||
},
|
||||
Node::Cylinder(aabb) => {
|
||||
(!Check::CHECK_AABR || (aabb.min.z..aabb.max.z).contains(&pos.z))
|
||||
&& (pos
|
||||
.xy()
|
||||
.as_()
|
||||
.distance_squared(aabb.as_().center().xy() - 0.5)
|
||||
as f32)
|
||||
<= (aabb.size().w.min(aabb.size().h) as f32 / 2.0).powi(2)
|
||||
&& /*{
|
||||
let fpos = pos.as_::<f32>().xy() - aabb.as_::<f32>().center().xy() + 0.5;
|
||||
let size = Vec2::from(aabb.size().as_::<f32>());
|
||||
(2.0 * fpos / size).magnitude_squared() <= 1.0
|
||||
}*/
|
||||
(pos
|
||||
.xy()
|
||||
.as_()
|
||||
.distance_squared(aabb.as_().center().xy() - 0.5)
|
||||
as f32)
|
||||
<= (aabb.size().w.min(aabb.size().h) as f32 / 2.0).powi(2)
|
||||
},
|
||||
Node::Cone(aabb) => {
|
||||
(!Check::CHECK_AABR || (aabb.min.z..aabb.max.z).contains(&pos.z))
|
||||
@ -2406,15 +2416,48 @@ impl Painter<'_> {
|
||||
)
|
||||
},
|
||||
Node::Cylinder(aabb) => {
|
||||
let center = aabb.as_().center().xy() - 0.5;
|
||||
let radius_2 = (aabb.size().w.min(aabb.size().h) as f32 / 2.0).powi(2);
|
||||
return aabb_iter(
|
||||
*aabb,
|
||||
mat,
|
||||
mask,
|
||||
|pos| pos.xy().as_().distance_squared(center) < radius_2,
|
||||
hit,
|
||||
)
|
||||
let aabr: Aabr<i32> = (*aabb).into();
|
||||
let aabr_size = aabr.size();
|
||||
if aabr_size.w == aabr_size.h {
|
||||
let center = aabr.as_().center() - 0.5;
|
||||
let radius_2 = (aabr_size.w.min(aabr_size.h) as f32 / 2.0).powi(2);
|
||||
return aabb_iter(
|
||||
*aabb,
|
||||
mat,
|
||||
mask,
|
||||
|pos| pos.xy().as_().distance_squared(center) < radius_2,
|
||||
hit,
|
||||
)
|
||||
} else {
|
||||
// Reverse translation from center.
|
||||
let center = aabr.center()/*.map(|e| e as f32)*/;
|
||||
mat = mat * Mat4::<i32>::translation_2d(center);
|
||||
let mut aabb = Aabb {
|
||||
// TODO: Try to avoid generating 3/4 of the circle; the interaction with
|
||||
// masking will require care.
|
||||
min: aabb.min - center,
|
||||
max: aabb.max - center,
|
||||
};
|
||||
let mut a_ = aabb.max.x;
|
||||
let mut b_ = aabb.max.y;
|
||||
let a: f32 = a_ as f32/* - center.x as f32 */- 0.5;
|
||||
let b: f32 = b_ as f32/* - center.y as f32 */- 0.5;
|
||||
// NOTE: Guaranteed positive since a,b are all positive (due to AABB being
|
||||
// enforced valid at construction time).
|
||||
let a_inv_pow = a.recip().powi(2);
|
||||
let b_inv_pow = b.recip().powi(2);
|
||||
let ab_inv_pow = Vec2::new(a_inv_pow, b_inv_pow);
|
||||
return aabb_iter(
|
||||
aabb,
|
||||
mat,
|
||||
mask,
|
||||
|pos| {
|
||||
let rpos = pos.xy().as_::<f32>();
|
||||
(rpos * rpos).dot(ab_inv_pow) < 1.0
|
||||
},
|
||||
hit,
|
||||
)
|
||||
}
|
||||
},
|
||||
Node::Sphere(aabb) => {
|
||||
let center = aabb.as_().center() - 0.5;
|
||||
|
@ -98,7 +98,7 @@ impl BridgeKind {
|
||||
}
|
||||
}
|
||||
|
||||
/* fn aabb(min: Vec3<i32>, max: Vec3<i32>) -> Aabb<i32> {
|
||||
fn aabb(min: Vec3<i32>, max: Vec3<i32>) -> Aabb<i32> {
|
||||
let aabb = Aabb { min, max }.made_valid();
|
||||
Aabb {
|
||||
min: aabb.min,
|
||||
@ -106,15 +106,15 @@ impl BridgeKind {
|
||||
}
|
||||
}
|
||||
|
||||
fn render_short(bridge: &Bridge, painter: &Painter) {
|
||||
/* fn render_short(bridge: &Bridge, painter: &Painter) {
|
||||
let (bridge_fill, edge_fill) = match bridge.biome {
|
||||
BiomeKind::Desert => (
|
||||
Fill::Block(Block::new(BlockKind::Rock, Rgb::new(212, 191, 142))),
|
||||
Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(190))),
|
||||
filler.block(Block::new(BlockKind::Rock, Rgb::new(212, 191, 142))),
|
||||
filler.block(Block::new(BlockKind::Rock, Rgb::gray(190))),
|
||||
),
|
||||
_ => (
|
||||
Fill::Brick(BlockKind::Rock, Rgb::gray(70), 25),
|
||||
Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(130))),
|
||||
filler.brick(BlockKind::Rock, Rgb::gray(70), 25),
|
||||
filler.block(Block::new(BlockKind::Rock, Rgb::gray(130))),
|
||||
),
|
||||
};
|
||||
|
||||
@ -191,7 +191,7 @@ fn render_short(bridge: &Bridge, painter: &Painter) {
|
||||
)
|
||||
.translate(Vec3::new(0, 0, t))
|
||||
.without(b)
|
||||
.clear();
|
||||
.clear(filler);
|
||||
*/
|
||||
|
||||
b.without(remove).fill(bridge_fill);
|
||||
@ -208,8 +208,8 @@ fn render_short(bridge: &Bridge, painter: &Painter) {
|
||||
}
|
||||
|
||||
fn render_flat(bridge: &Bridge, painter: &Painter) {
|
||||
let rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(50)));
|
||||
let light_rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(130)));
|
||||
let rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(50)));
|
||||
let light_rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(130)));
|
||||
|
||||
let orth_dir = bridge.dir.orthogonal();
|
||||
|
||||
@ -244,11 +244,11 @@ fn render_flat(bridge: &Bridge, painter: &Painter) {
|
||||
))
|
||||
};
|
||||
|
||||
ramp_prim(ramp_aabr, 1).fill(light_rock.clone());
|
||||
ramp_prim(ramp_aabr, 1).fill(light_rock, filler);
|
||||
|
||||
let ramp_aabr = orth_dir.trim_aabr(ramp_aabr, 1);
|
||||
ramp_prim(ramp_aabr, 5).clear();
|
||||
ramp_prim(ramp_aabr, 0).fill(rock.clone());
|
||||
ramp_prim(ramp_aabr, 5).clear(filler);
|
||||
ramp_prim(ramp_aabr, 0).fill(rock, filler);
|
||||
|
||||
let vault_width = 12;
|
||||
let vault_offset = 5;
|
||||
@ -285,7 +285,7 @@ fn render_flat(bridge: &Bridge, painter: &Painter) {
|
||||
aabr.min.with_z(bridge.end.z + 1),
|
||||
aabr.max.with_z(bridge.end.z + 8),
|
||||
))
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
painter
|
||||
.aabb(aabb(
|
||||
@ -296,8 +296,8 @@ fn render_flat(bridge: &Bridge, painter: &Painter) {
|
||||
}
|
||||
|
||||
fn render_heightened_viaduct(bridge: &Bridge, painter: &Painter, data: &HeightenedViaduct) {
|
||||
let rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(50)));
|
||||
let light_rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(130)));
|
||||
let rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(50)));
|
||||
let light_rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(130)));
|
||||
let orth_dir = bridge.dir.orthogonal();
|
||||
|
||||
let orthogonal = orth_dir.to_vec2();
|
||||
@ -456,7 +456,7 @@ fn render_heightened_viaduct(bridge: &Bridge, painter: &Painter, data: &Heighten
|
||||
|
||||
br.translate(Vec3::unit_z() * 5)
|
||||
.without(br.translate(-Vec3::unit_z()))
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
/*
|
||||
let place_lights = |center: Vec3<i32>| {
|
||||
@ -512,8 +512,8 @@ fn render_heightened_viaduct(bridge: &Bridge, painter: &Painter, data: &Heighten
|
||||
}
|
||||
|
||||
fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
let rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(50)));
|
||||
let wood = Fill::Block(Block::new(BlockKind::Wood, Rgb::new(40, 28, 20)));
|
||||
let rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(50)));
|
||||
let wood = filler.block(Block::new(BlockKind::Wood, Rgb::new(40, 28, 20)));
|
||||
|
||||
let tower_size = 5;
|
||||
|
||||
@ -541,14 +541,14 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
tower_aabr.min.with_z(bridge.start.z - 5),
|
||||
tower_aabr.max.with_z(tower_end),
|
||||
))
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
|
||||
painter
|
||||
.aabb(aabb(
|
||||
(tower_aabr.min + 1).with_z(bridge.start.z),
|
||||
(tower_aabr.max - 1).with_z(tower_end - 1),
|
||||
))
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
let c = (-bridge.dir).select_aabr_with(tower_aabr, tower_aabr.center());
|
||||
painter
|
||||
@ -556,7 +556,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
(c - orthogonal).with_z(bridge.start.z),
|
||||
(c + orthogonal).with_z(bridge.start.z + 2),
|
||||
))
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
let ramp_height = 8;
|
||||
|
||||
@ -568,7 +568,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
painter
|
||||
.aabb(ramp_aabb)
|
||||
.without(painter.ramp(ramp_aabb, -bridge.dir))
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
let c = bridge.dir.select_aabr_with(tower_aabr, tower_aabr.center());
|
||||
painter
|
||||
@ -576,7 +576,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
(c - orthogonal).with_z(bridge.end.z),
|
||||
(c + orthogonal).with_z(bridge.end.z + 2),
|
||||
))
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
let stair_thickness = 2;
|
||||
painter
|
||||
@ -588,7 +588,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
stair_thickness,
|
||||
bridge.dir.rotated_ccw(),
|
||||
)
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
let aabr = bridge
|
||||
.dir
|
||||
.rotated_cw()
|
||||
@ -599,14 +599,14 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
aabr.min.with_z(bridge.end.z - 1),
|
||||
aabr.max.with_z(bridge.end.z - 1),
|
||||
))
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
|
||||
painter
|
||||
.aabb(aabb(
|
||||
tower_aabr.center().with_z(bridge.start.z),
|
||||
tower_aabr.center().with_z(bridge.end.z - 1),
|
||||
))
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
|
||||
let offset = tower_size * 2 - 2;
|
||||
let d = tweak!(2);
|
||||
@ -635,7 +635,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
(tower_aabr.min - 1).with_z(tower_end + 1),
|
||||
(tower_aabr.max + 1).with_z(tower_end + 2),
|
||||
))
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
|
||||
painter
|
||||
.aabbs_around_aabb(
|
||||
@ -646,14 +646,14 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
1,
|
||||
1,
|
||||
)
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
|
||||
painter
|
||||
.aabb(aabb(
|
||||
tower_aabr.min.with_z(tower_end + 2),
|
||||
tower_aabr.max.with_z(tower_end + 2),
|
||||
))
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
painter
|
||||
.aabbs_around_aabb(
|
||||
@ -664,7 +664,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
1,
|
||||
4,
|
||||
)
|
||||
.fill(Fill::Sprite(SpriteKind::FireBowlGround));
|
||||
.fill(filler.sprite(SpriteKind::FireBowlGround));
|
||||
},
|
||||
RoofKind::Hipped => {
|
||||
painter
|
||||
@ -711,7 +711,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
(start - orthogonal * bridge_width).with_z(bridge.end.z),
|
||||
(bridge.end + orthogonal * bridge_width).with_z(bridge.end.z + 5),
|
||||
))
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
let light_spacing = 10;
|
||||
let n = len / light_spacing;
|
||||
@ -725,16 +725,16 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
|
||||
painter.sprite(c + orthogonal * bridge_width, SpriteKind::StreetLamp);
|
||||
painter.sprite(c - orthogonal * bridge_width, SpriteKind::StreetLamp);
|
||||
}
|
||||
}
|
||||
} */
|
||||
|
||||
fn render_hang(bridge: &Bridge, painter: &Painter) {
|
||||
fn render_hang<'a, F: Filler>(bridge: &Bridge, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) {
|
||||
let orth_dir = bridge.dir.orthogonal();
|
||||
|
||||
let orthogonal = orth_dir.to_vec2();
|
||||
let forward = bridge.dir.to_vec2();
|
||||
|
||||
let rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(50)));
|
||||
let wood = Fill::Block(Block::new(BlockKind::Wood, Rgb::new(133, 94, 66)));
|
||||
let rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(50)));
|
||||
let wood = filler.block(Block::new(BlockKind::Wood, Rgb::new(133, 94, 66)));
|
||||
|
||||
let bridge_width = bridge.width();
|
||||
let side = orthogonal * bridge_width;
|
||||
@ -755,14 +755,14 @@ fn render_hang(bridge: &Bridge, painter: &Painter) {
|
||||
ramp_f.min.with_z(bridge.start.z - 10),
|
||||
ramp_f.max.with_z(bridge.start.z),
|
||||
))
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
painter
|
||||
.ramp_inset(
|
||||
aabb(ramp_f.min.with_z(bridge.start.z), ramp_f.max.with_z(top)),
|
||||
top - bridge.start.z + 1,
|
||||
bridge.dir,
|
||||
)
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
|
||||
let [ramp_b, aabr] = (-bridge.dir).split_aabr(aabr, top_offset + 1);
|
||||
painter
|
||||
@ -770,13 +770,13 @@ fn render_hang(bridge: &Bridge, painter: &Painter) {
|
||||
ramp_b.min.with_z(bridge.end.z - 10),
|
||||
ramp_b.max.with_z(bridge.end.z),
|
||||
))
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
painter
|
||||
.ramp(
|
||||
aabb(ramp_b.min.with_z(bridge.end.z), ramp_b.max.with_z(top)),
|
||||
-bridge.dir,
|
||||
)
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
|
||||
let len = bridge.dir.select(aabr.size());
|
||||
|
||||
@ -797,34 +797,56 @@ fn render_hang(bridge: &Bridge, painter: &Painter) {
|
||||
let c = aabr.center();
|
||||
|
||||
let cylinder = painter
|
||||
.horizontal_cylinder(
|
||||
.aabb(aabb(
|
||||
aabr.min.with_z(bottom),
|
||||
aabr.max.with_z(bottom + h),
|
||||
)).as_kind()
|
||||
.intersect(painter.horizontal_cylinder(
|
||||
aabb(
|
||||
(c - forward * w - side).with_z(bottom),
|
||||
(c + forward * w + side).with_z(bottom + h * 2),
|
||||
),
|
||||
orth_dir,
|
||||
)
|
||||
.intersect(painter.aabb(aabb(
|
||||
aabr.min.with_z(bottom),
|
||||
aabr.max.with_z(bottom + h * 2),
|
||||
)));
|
||||
));
|
||||
|
||||
cylinder.fill(wood.clone());
|
||||
/* cylinder.fill(wood, filler);
|
||||
|
||||
cylinder.translate(Vec3::unit_z()).clear();
|
||||
cylinder.translate(Vec3::unit_z()).clear(filler); */
|
||||
cylinder.fill(wood, filler);
|
||||
|
||||
let edges = cylinder
|
||||
.without(cylinder.translate(Vec3::unit_z()))
|
||||
let edges = painter.union_all([
|
||||
painter.aabb(aabb(
|
||||
(c - forward * w - side).with_z(bottom + 1),
|
||||
(c + forward * w - orthogonal * (bridge_width - 1)).with_z(bottom + h + 1),
|
||||
)),
|
||||
painter.aabb(aabb(
|
||||
(c - forward * w + orthogonal * (bridge_width - 1)).with_z(bottom + 1),
|
||||
(c + forward * w + side).with_z(bottom + h + 1),
|
||||
)),
|
||||
].into_iter()).as_kind();
|
||||
|
||||
let edges_clear =
|
||||
painter.aabb(aabb(
|
||||
(c - forward * w - orthogonal * (bridge_width - 1)).with_z(bottom + 1),
|
||||
(c + forward * w + orthogonal * (bridge_width - 1)).with_z(bottom + h + 1),
|
||||
)).as_kind().intersect(cylinder.translate(Vec3::unit_z()))
|
||||
.union(edges.translate(Vec3::unit_z() * 2).intersect(cylinder.translate(Vec3::unit_z() * 3)));
|
||||
/* .without(cylinder.translate(Vec3::unit_z()))
|
||||
.without(painter.aabb(aabb(
|
||||
(c - forward * w - orthogonal * (bridge_width - 1)).with_z(bottom),
|
||||
(c + forward * w + orthogonal * (bridge_width - 1)).with_z(bottom + h * 2),
|
||||
)));
|
||||
))) */;
|
||||
|
||||
edges
|
||||
edges.intersect(cylinder.translate(Vec3::unit_z()))
|
||||
.fill(filler.sprite(SpriteKind::Rope), filler);
|
||||
edges.translate(Vec3::unit_z()).intersect(cylinder.translate(Vec3::unit_z() * 2))
|
||||
.fill(wood, filler);
|
||||
|
||||
/* edges_clear
|
||||
.translate(Vec3::unit_z())
|
||||
.fill(Fill::Sprite(SpriteKind::Rope));
|
||||
|
||||
edges.translate(Vec3::unit_z() * 2).fill(wood);
|
||||
.clear(filler); */
|
||||
edges_clear
|
||||
.clear(filler);
|
||||
|
||||
let column_height = 3;
|
||||
let column_range = top..=top + column_height;
|
||||
@ -833,26 +855,26 @@ fn render_hang(bridge: &Bridge, painter: &Painter) {
|
||||
bridge.dir.select_aabr_with(ramp_f, ramp_f.min),
|
||||
column_range.clone(),
|
||||
)
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
painter
|
||||
.column(
|
||||
bridge.dir.select_aabr_with(ramp_f, ramp_f.max),
|
||||
column_range.clone(),
|
||||
)
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
painter
|
||||
.column(
|
||||
(-bridge.dir).select_aabr_with(ramp_b, ramp_b.min),
|
||||
column_range.clone(),
|
||||
)
|
||||
.fill(rock.clone());
|
||||
.fill(rock, filler);
|
||||
painter
|
||||
.column(
|
||||
(-bridge.dir).select_aabr_with(ramp_b, ramp_b.max),
|
||||
column_range,
|
||||
)
|
||||
.fill(rock);
|
||||
} */
|
||||
.fill(rock, filler);
|
||||
}
|
||||
|
||||
pub struct Bridge {
|
||||
pub(crate) start: Vec3<i32>,
|
||||
@ -948,13 +970,14 @@ impl<F: Filler> Structure<F> for Bridge {
|
||||
const UPDATE_FN: &'static [u8] = b"render_bridge\0";
|
||||
|
||||
#[cfg_attr(feature = "be-dyn-lib", export_name = "render_bridge")]
|
||||
fn render_inner<'a>(&self, _site: &Site, land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) {
|
||||
/* match &self.kind {
|
||||
BridgeKind::Flat => render_flat(self, painter),
|
||||
fn render_inner<'a>(&self, _site: &Site, _land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) {
|
||||
match &self.kind {
|
||||
/* BridgeKind::Flat => render_flat(self, painter),
|
||||
BridgeKind::Tower(roof) => render_tower(self, painter, roof),
|
||||
BridgeKind::Short => render_short(self, painter),
|
||||
BridgeKind::HeightenedViaduct(data) => render_heightened_viaduct(self, painter, data),
|
||||
BridgeKind::HangBridge => render_hang(self, painter),
|
||||
} */
|
||||
BridgeKind::HeightenedViaduct(data) => render_heightened_viaduct(self, painter, data), */
|
||||
BridgeKind::HangBridge => render_hang(self, painter, filler),
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -43,7 +43,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
|
||||
#[cfg_attr(feature = "be-dyn-lib", export_name = "render_desertcitytemple")]
|
||||
fn render_inner<'a>(&self, _site: &Site, land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) {
|
||||
/* let sandstone = Fill::Sampling(Arc::new(|center| {
|
||||
let sandstone_fn = |center| {
|
||||
Some(match (RandomField::new(0).get(center)) % 37 {
|
||||
0..=8 => Block::new(BlockKind::Rock, Rgb::new(245, 212, 129)),
|
||||
9..=17 => Block::new(BlockKind::Rock, Rgb::new(246, 214, 133)),
|
||||
@ -51,8 +51,9 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
27..=35 => Block::new(BlockKind::Rock, Rgb::new(248, 219, 142)),
|
||||
_ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)),
|
||||
})
|
||||
}));
|
||||
let sandstone_broken = Fill::Sampling(Arc::new(|center| {
|
||||
};
|
||||
let sandstone = filler.sampling(&sandstone_fn);
|
||||
let sandstone_broken_fn = |center| {
|
||||
Some(match (RandomField::new(0).get(center)) % 42 {
|
||||
0..=8 => Block::new(BlockKind::Rock, Rgb::new(245, 212, 129)),
|
||||
9..=17 => Block::new(BlockKind::Rock, Rgb::new(246, 214, 133)),
|
||||
@ -61,69 +62,79 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
36..=40 => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)),
|
||||
_ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)),
|
||||
})
|
||||
}));
|
||||
};
|
||||
let sandstone_broken = filler.sampling(&sandstone_broken_fn);
|
||||
let base = self.alt + 1;
|
||||
let center = self.bounds.center();
|
||||
let diameter =
|
||||
10 + (self.bounds.max.x - self.bounds.min.x).min(self.bounds.max.y - self.bounds.min.y);
|
||||
// Fence
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: (self.bounds.min + 1).with_z(base - 20),
|
||||
max: (self.bounds.max).with_z(base + 2),
|
||||
})
|
||||
.without(painter.aabb(Aabb {
|
||||
min: (self.bounds.min + 2).with_z(base - 20),
|
||||
max: (self.bounds.max - 1).with_z(base + 2),
|
||||
}))
|
||||
.fill(sandstone_broken);
|
||||
painter.union_all([
|
||||
painter.aabb(Aabb {
|
||||
min: Vec2::new(self.bounds.min.x + 1, self.bounds.min.y + 1).with_z(base - 20),
|
||||
max: Vec2::new(self.bounds.min.x + 2, self.bounds.max.y).with_z(base + 2),
|
||||
}),
|
||||
painter.aabb(Aabb {
|
||||
min: Vec2::new(self.bounds.max.x - 1, self.bounds.min.y + 1).with_z(base - 20),
|
||||
max: Vec2::new(self.bounds.max.x, self.bounds.max.y).with_z(base + 2),
|
||||
}),
|
||||
painter.aabb(Aabb {
|
||||
min: Vec2::new(self.bounds.min.x + 1, self.bounds.min.y + 1).with_z(base - 20),
|
||||
max: Vec2::new(self.bounds.max.x, self.bounds.min.y + 2).with_z(base + 2),
|
||||
}),
|
||||
painter.aabb(Aabb {
|
||||
min: Vec2::new(self.bounds.min.x + 1, self.bounds.max.y - 1).with_z(base - 20),
|
||||
max: Vec2::new(self.bounds.max.x, self.bounds.max.y).with_z(base + 2),
|
||||
}),
|
||||
].into_iter())
|
||||
.fill(sandstone_broken, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(self.bounds.min.x + 1, center.y - 8).with_z(base),
|
||||
max: Vec2::new(self.bounds.max.x, center.y + 8).with_z(base + 7),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - 7, self.bounds.min.y + 1).with_z(base),
|
||||
max: Vec2::new(center.x + 9, self.bounds.max.y).with_z(base + 7),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
// Foundation
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: (self.bounds.min + 1).with_z(base - 20),
|
||||
max: (self.bounds.max).with_z(base),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
|
||||
// Temple
|
||||
let temple_color = match (RandomField::new(0).get((center - 3).with_z(base))) % 2 {
|
||||
0 => Fill::Brick(BlockKind::Rock, Rgb::new(100, 101, 250), 3),
|
||||
_ => Fill::Brick(BlockKind::Rock, Rgb::new(63, 49, 63), 24),
|
||||
0 => filler.brick(BlockKind::Rock, Rgb::new(100, 101, 250), 3),
|
||||
_ => filler.brick(BlockKind::Rock, Rgb::new(63, 49, 63), 24),
|
||||
};
|
||||
let temple_size = diameter / 3;
|
||||
let floaty_block = Fill::Brick(BlockKind::GlowingWeakRock, Rgb::new(253, 240, 149), 2);
|
||||
let floaty_block = filler.brick(BlockKind::GlowingWeakRock, Rgb::new(253, 240, 149), 2);
|
||||
let temple = Aabb {
|
||||
min: (center - temple_size).with_z(base),
|
||||
max: (center + temple_size - 1).with_z(base + temple_size + 1),
|
||||
};
|
||||
|
||||
// temple with roof carve out
|
||||
painter.aabb(temple).fill(sandstone.clone());
|
||||
painter.aabb(temple).fill(sandstone, filler);
|
||||
// roof decoration
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: (center - temple_size - 1).with_z(base + temple_size + 1),
|
||||
max: (center + temple_size).with_z(base + temple_size + 4),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: (center - temple_size).with_z(base + temple_size + 2),
|
||||
max: (center + temple_size - 1).with_z(base + temple_size + 4),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size - 1, center.y - (temple_size / 4) - 2)
|
||||
@ -131,7 +142,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
max: Vec2::new(center.x + temple_size, center.y + (temple_size / 4) + 1)
|
||||
.with_z(base + temple_size + 4),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - (temple_size / 4) - 2, center.y - temple_size - 1)
|
||||
@ -139,7 +150,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
max: Vec2::new(center.x + (temple_size / 4) + 1, center.y + temple_size)
|
||||
.with_z(base + temple_size + 4),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
// roof carve out
|
||||
painter
|
||||
@ -147,7 +158,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: (center - temple_size + 1).with_z(base + temple_size),
|
||||
max: (center + temple_size - 2).with_z(base + temple_size + 3),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
//corner pillars
|
||||
for dir in SQUARE_4 {
|
||||
let corner_pos = center - temple_size;
|
||||
@ -158,7 +169,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: (pillar_center - 4).with_z(base),
|
||||
max: (pillar_center + 4).with_z(base + 4),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
|
||||
// Pillar
|
||||
painter
|
||||
@ -166,21 +177,21 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: (pillar_center - 3).with_z(base + 4),
|
||||
max: (pillar_center + 3).with_z(base + temple_size + 3),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
// Pillar Top
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: (pillar_center - 4).with_z(base + temple_size + 3),
|
||||
max: (pillar_center + 4).with_z(base + temple_size + 6),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: (pillar_center - 3).with_z(base + temple_size + 4),
|
||||
max: (pillar_center + 3).with_z(base + temple_size + 6),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
// clear parts of pillar top for roof carve out
|
||||
painter
|
||||
@ -188,7 +199,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: (center - temple_size).with_z(base + temple_size + 3),
|
||||
max: (center + temple_size - 1).with_z(base + temple_size + 6),
|
||||
})
|
||||
.clear()
|
||||
.clear(filler)
|
||||
}
|
||||
|
||||
// temple decor carve out
|
||||
@ -217,7 +228,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
)
|
||||
.with_z(base + temple_size - 1),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
}
|
||||
for c in 0..(temple_size - 5) {
|
||||
painter
|
||||
@ -233,7 +244,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
)
|
||||
.with_z(base + temple_size - 1),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
}
|
||||
},
|
||||
1 => {
|
||||
@ -249,7 +260,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
)
|
||||
.with_z(base + 3 + ((spread + 2) * c) + spread_select),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
}
|
||||
for c in 0..((temple_size / 2) - 2) {
|
||||
painter
|
||||
@ -262,7 +273,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
)
|
||||
.with_z(base + 3 + ((spread + 2) * c) + spread_select),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
}
|
||||
},
|
||||
_ => {},
|
||||
@ -273,105 +284,86 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 2)
|
||||
.with_z(base + 2),
|
||||
max: Vec2::new(center.x + temple_size - 3, center.y - temple_size + 3)
|
||||
.with_z(base + temple_size - 1),
|
||||
})
|
||||
.fill(temple_color, filler);
|
||||
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 2, center.y + temple_size - 4)
|
||||
.with_z(base + 2),
|
||||
max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 3)
|
||||
.with_z(base + temple_size - 1),
|
||||
})
|
||||
.without(
|
||||
painter.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 3)
|
||||
.with_z(base + 2),
|
||||
max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 4)
|
||||
.with_z(base + temple_size - 1),
|
||||
}),
|
||||
)
|
||||
.fill(temple_color.clone());
|
||||
.fill(temple_color, filler);
|
||||
// color inlays2
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 2)
|
||||
.with_z(base + 2),
|
||||
max: Vec2::new(center.x - temple_size + 3, center.y + temple_size - 3)
|
||||
.with_z(base + temple_size - 1),
|
||||
})
|
||||
.fill(temple_color, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x + temple_size - 4, center.y - temple_size + 2)
|
||||
.with_z(base + 2),
|
||||
max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 3)
|
||||
.with_z(base + temple_size - 1),
|
||||
})
|
||||
.without(
|
||||
painter.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 3, center.y - temple_size + 2)
|
||||
.with_z(base + 2),
|
||||
max: Vec2::new(center.x + temple_size - 4, center.y + temple_size - 3)
|
||||
.with_z(base + temple_size - 1),
|
||||
}),
|
||||
)
|
||||
.fill(temple_color.clone());
|
||||
.fill(temple_color, filler);
|
||||
// carve outside plane1
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 6, center.y - temple_size).with_z(base + 3),
|
||||
max: Vec2::new(center.x + temple_size - 7, center.y + temple_size - 1)
|
||||
max: Vec2::new(center.x + temple_size - 7, center.y - temple_size + 1)
|
||||
.with_z(base + temple_size - 2),
|
||||
})
|
||||
.without(
|
||||
painter.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 6, center.y - temple_size + 1)
|
||||
.with_z(base + 3),
|
||||
max: Vec2::new(center.x + temple_size - 7, center.y + temple_size - 2)
|
||||
.with_z(base + temple_size - 2),
|
||||
}),
|
||||
)
|
||||
.clear();
|
||||
.clear(filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 6, center.y + temple_size - 3)
|
||||
.with_z(base + 3),
|
||||
max: Vec2::new(center.x + temple_size - 7, center.y + temple_size - 2)
|
||||
.with_z(base + temple_size - 2),
|
||||
})
|
||||
.clear(filler);
|
||||
// carve outside plane2
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size, center.y - temple_size + 6).with_z(base + 3),
|
||||
max: Vec2::new(center.x - temple_size + 1, center.y + temple_size - 7)
|
||||
.with_z(base + temple_size - 2),
|
||||
})
|
||||
.clear(filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x + temple_size - 2, center.y - temple_size + 6)
|
||||
.with_z(base + 3),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + temple_size - 7)
|
||||
.with_z(base + temple_size - 2),
|
||||
})
|
||||
.without(
|
||||
painter.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size + 1, center.y - temple_size + 6)
|
||||
.with_z(base + 3),
|
||||
max: Vec2::new(center.x + temple_size - 2, center.y + temple_size - 7)
|
||||
.with_z(base + temple_size - 2),
|
||||
}),
|
||||
)
|
||||
.clear();
|
||||
// Temple top
|
||||
.clear(filler);
|
||||
// Temple Top Socket
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - temple_size + 3).with_z(base),
|
||||
max: (center + temple_size - 4).with_z(base + (2 * temple_size) - 6),
|
||||
})
|
||||
.without(painter.aabb(Aabb {
|
||||
min: (center - temple_size + 2).with_z(base + 1),
|
||||
max: (center + temple_size - 3).with_z(base + temple_size - 3),
|
||||
}))
|
||||
.without(painter.aabb(Aabb {
|
||||
min: (center - temple_size + 1).with_z(base),
|
||||
max: (center + temple_size - 1).with_z(base + temple_size),
|
||||
}))
|
||||
// carve temple top
|
||||
.without(painter.sphere(Aabb {
|
||||
min: (center - temple_size + 5).with_z(base + 2),
|
||||
max: (center + temple_size - 6).with_z(base + (2 * temple_size) - 8),
|
||||
}))
|
||||
.fill(sandstone.clone());
|
||||
.cylinder(Aabb {
|
||||
min: (center - temple_size + 3).with_z(base + temple_size),
|
||||
max: (center + temple_size - 4).with_z(base + temple_size + 1),
|
||||
})
|
||||
.fill(sandstone, filler);
|
||||
// Temple Top
|
||||
let top = painter.sphere(Aabb {
|
||||
min: (center - temple_size + 3).with_z(base),
|
||||
max: (center + temple_size - 4).with_z(base + (2 * temple_size) - 6),
|
||||
});
|
||||
top.fill(sandstone, filler);
|
||||
|
||||
// temple top decoration
|
||||
// apply two decoration options (horizontal, vertical, none) with two spread
|
||||
// options for hor/ver options
|
||||
for s in 0..2 {
|
||||
let top = painter
|
||||
.sphere(Aabb {
|
||||
min: (center - temple_size + 3).with_z(base),
|
||||
max: (center + temple_size - 4).with_z(base + (2 * temple_size) - 6),
|
||||
})
|
||||
.without(painter.sphere(Aabb {
|
||||
min: (center - temple_size + 5).with_z(base + 2),
|
||||
max: (center + temple_size - 6).with_z(base + (2 * temple_size) - 8),
|
||||
}))
|
||||
.without(painter.aabb(Aabb {
|
||||
min: (center - temple_size + 1).with_z(base),
|
||||
max: (center + temple_size - 2).with_z(base + temple_size + 1),
|
||||
}));
|
||||
// decor carve out style
|
||||
let spread_select =
|
||||
((RandomField::new(0).get((center - 1 - s).with_z(base))) % 2) as i32;
|
||||
@ -394,9 +386,9 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
center.y + temple_size - 1,
|
||||
)
|
||||
.with_z(base + (2 * temple_size)),
|
||||
})
|
||||
}).as_kind()
|
||||
.intersect(top)
|
||||
.fill(temple_color.clone());
|
||||
.fill(temple_color, filler);
|
||||
}
|
||||
},
|
||||
1 => {
|
||||
@ -413,14 +405,28 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
center.y - temple_size + 3 + ((spread + 2) * c) + spread_select,
|
||||
)
|
||||
.with_z(base + (2 * temple_size)),
|
||||
})
|
||||
}).as_kind()
|
||||
.intersect(top)
|
||||
.fill(temple_color.clone());
|
||||
.fill(temple_color, filler);
|
||||
}
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
}
|
||||
// Temple Top Socket
|
||||
painter
|
||||
.cylinder(Aabb {
|
||||
min: (center - temple_size + 3).with_z(base + temple_size),
|
||||
max: (center + temple_size - 4).with_z(base + temple_size + 1),
|
||||
})
|
||||
.fill(sandstone, filler);
|
||||
// clear top
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - temple_size + 4).with_z(base + 1),
|
||||
max: (center + temple_size - 5).with_z(base + (2 * temple_size) - 7),
|
||||
})
|
||||
.clear(filler);
|
||||
|
||||
// round or rectangle entries
|
||||
let entry_select = ((RandomField::new(0).get((center + 1).with_z(base))) % 2) as i32;
|
||||
@ -432,46 +438,46 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: Vec2::new(center.x - 5, center.y - temple_size).with_z(base),
|
||||
max: Vec2::new(center.x + 4, center.y + temple_size - 1).with_z(base + 4),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - 4, center.y - temple_size).with_z(base),
|
||||
max: Vec2::new(center.x + 3, center.y + temple_size - 1).with_z(base + 4),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - 4, center.y - temple_size).with_z(base + 4),
|
||||
max: Vec2::new(center.x + 3, center.y + temple_size - 1).with_z(base + 7),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base + 4),
|
||||
max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 7),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base + 7),
|
||||
max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 9),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - 2, center.y - temple_size).with_z(base + 7),
|
||||
max: Vec2::new(center.x + 1, center.y + temple_size - 1).with_z(base + 9),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - 2, center.y - temple_size).with_z(base + 9),
|
||||
max: Vec2::new(center.x + 1, center.y + temple_size - 1).with_z(base + 10),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
|
||||
// round Temple entries2
|
||||
painter
|
||||
@ -479,46 +485,46 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 5).with_z(base),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 4).with_z(base + 4),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 4).with_z(base),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 3).with_z(base + 4),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 4).with_z(base + 4),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 3).with_z(base + 7),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base + 4),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 7),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base + 7),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 9),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 2).with_z(base + 7),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 1).with_z(base + 9),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 2).with_z(base + 9),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 1).with_z(base + 10),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
},
|
||||
_ => {
|
||||
//rectangle Temple entries1
|
||||
@ -527,13 +533,13 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: Vec2::new(center.x - 5, center.y - temple_size).with_z(base),
|
||||
max: Vec2::new(center.x + 4, center.y + temple_size - 1).with_z(base + 8),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base),
|
||||
max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 6),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
//rectangle Temple entries1
|
||||
painter
|
||||
@ -541,26 +547,15 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 5).with_z(base),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 4).with_z(base + 8),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.aabb(Aabb {
|
||||
min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base),
|
||||
max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 6),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
},
|
||||
}
|
||||
// Temple Top Socket
|
||||
painter
|
||||
.cylinder(Aabb {
|
||||
min: (center - temple_size + 3).with_z(base + temple_size),
|
||||
max: (center + temple_size - 4).with_z(base + temple_size + 1),
|
||||
})
|
||||
.without(painter.cylinder(Aabb {
|
||||
min: (center - temple_size + 5).with_z(base + temple_size),
|
||||
max: (center + temple_size - 6).with_z(base + temple_size + 1),
|
||||
}))
|
||||
.fill(sandstone.clone());
|
||||
|
||||
// carve temple
|
||||
painter
|
||||
@ -568,14 +563,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: (center - temple_size + 4).with_z(base),
|
||||
max: (center + temple_size - 5).with_z(base + temple_size - 1),
|
||||
})
|
||||
.clear();
|
||||
// carve round opening to dome
|
||||
painter
|
||||
.cylinder(Aabb {
|
||||
min: (center - temple_size + 6).with_z(base + temple_size - 1),
|
||||
max: (center + temple_size - 7).with_z(base + temple_size),
|
||||
})
|
||||
.clear();
|
||||
.clear(filler);
|
||||
|
||||
// floating sculpture, placeholder for sun god
|
||||
|
||||
@ -584,31 +572,31 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: (center - 3).with_z(base),
|
||||
max: (center + 2).with_z(base + 5),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - 3).with_z(base + 4),
|
||||
max: (center + 2).with_z(base + 9),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - 4).with_z(base + 8),
|
||||
max: (center + 3).with_z(base + 13),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - 4).with_z(base + 14),
|
||||
max: (center + 3).with_z(base + 15),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - 3).with_z(base + 16),
|
||||
max: (center + 2).with_z(base + 21),
|
||||
})
|
||||
.fill(floaty_block.clone());
|
||||
.fill(floaty_block, filler);
|
||||
|
||||
// floating sculptures
|
||||
for dir in SQUARE_4 {
|
||||
@ -620,31 +608,31 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: (sclpt_center - 2).with_z(base),
|
||||
max: (sclpt_center + 1).with_z(base + 3),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (sclpt_center - 2).with_z(base + 2),
|
||||
max: (sclpt_center + 1).with_z(base + 5),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (sclpt_center - 3).with_z(base + 5),
|
||||
max: (sclpt_center + 2).with_z(base + 6),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (sclpt_center - 3).with_z(base + 7),
|
||||
max: (sclpt_center + 2).with_z(base + 8),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (sclpt_center - 2).with_z(base + 9),
|
||||
max: (sclpt_center + 1).with_z(base + 12),
|
||||
})
|
||||
.fill(floaty_block.clone());
|
||||
.fill(floaty_block, filler);
|
||||
}
|
||||
|
||||
// floating sculpture, placeholder for sun god
|
||||
@ -654,30 +642,30 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
|
||||
min: (center - 3).with_z(base),
|
||||
max: (center + 2).with_z(base + 5),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - 3).with_z(base + 4),
|
||||
max: (center + 2).with_z(base + 9),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - 4).with_z(base + 8),
|
||||
max: (center + 3).with_z(base + 13),
|
||||
})
|
||||
.fill(sandstone.clone());
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - 4).with_z(base + 14),
|
||||
max: (center + 3).with_z(base + 15),
|
||||
})
|
||||
.fill(sandstone);
|
||||
.fill(sandstone, filler);
|
||||
painter
|
||||
.sphere(Aabb {
|
||||
min: (center - 3).with_z(base + 16),
|
||||
max: (center + 2).with_z(base + 21),
|
||||
})
|
||||
.fill(floaty_block); */
|
||||
.fill(floaty_block, filler);
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user