From 05489e5b7e9e03e8e805a0786b47d20abe02bec8 Mon Sep 17 00:00:00 2001 From: Joshua Yanovski Date: Mon, 3 Apr 2023 00:18:50 -0700 Subject: [PATCH] Fixing all sites but bridges --- voxygen/src/mesh/terrain.rs | 18 +- voxygen/src/scene/terrain.rs | 22 +- world/src/civ/mod.rs | 10 + world/src/site2/gen.rs | 83 +- world/src/site2/plot/bridge.rs | 153 +- world/src/site2/plot/desert_city_multiplot.rs | 663 +++---- world/src/site2/plot/desert_city_temple.rs | 308 ++-- world/src/site2/plot/savannah_pit.rs | 736 ++++---- world/src/site2/plot/sea_chapel.rs | 1567 +++++++++-------- 9 files changed, 1840 insertions(+), 1720 deletions(-) diff --git a/voxygen/src/mesh/terrain.rs b/voxygen/src/mesh/terrain.rs index 0210cf7f52..aac8b64fbf 100644 --- a/voxygen/src/mesh/terrain.rs +++ b/voxygen/src/mesh/terrain.rs @@ -354,7 +354,7 @@ pub async fn generate_mesh<'a, F: Future>> + 'a>( Arc) -> f32 + Send + Sync>, Arc) -> f32 + Send + Sync>, AltIndices, - /* (f32, f32), */ + (f32, f32), ), > { /* span!( @@ -930,6 +930,11 @@ pub async fn generate_mesh<'a, F: Future>> + '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>> + '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, norm, meta| TerrainVertex::new(atlas_pos, pos + mesh_delta, norm, meta); @@ -1129,7 +1131,7 @@ pub async fn generate_mesh<'a, F: Future>> + '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>> + 'a>( Arc::new(light) as Arc) -> f32 + Send + Sync>, Arc::new(glow) as Arc) -> f32 + Send + Sync>, alt_indices, - // sun_occluder_z_bounds, + sun_occluder_z_bounds, ), ) } diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index f10a342b01..fed86ab2e8 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -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>, fluid_model: Option>, /// 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/**/ Terrain { 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/**/ Terrain { 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)); diff --git a/world/src/civ/mod.rs b/world/src/civ/mod.rs index 5290793215..416090c720 100644 --- a/world/src/civ/mod.rs +++ b/world/src/civ/mod.rs @@ -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 */{ ( diff --git a/world/src/site2/gen.rs b/world/src/site2/gen.rs index 59423cde4e..2c951dfa46 100644 --- a/world/src/site2/gen.rs +++ b/world/src/site2/gen.rs @@ -645,17 +645,22 @@ impl<'a, 'b, F: Filler> FillFn<'a, 'b, F> { } #[inline] - pub fn brick(&self, bk: BlockKind, col: Rgb, range: u8) -> impl Fill + Copy { - // FIXME: Statically cache somewhere, or maybe just remove in favor of - // Sampling. - FillVar(move |pos: Vec3| { + pub fn brick_fn(&self, bk: BlockKind, col: Rgb, range: u8) -> impl Fn(Vec3) -> Option + Copy { + move |pos: Vec3| { 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, 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_::().xy() - aabb.as_::().center().xy() + 0.5; + let size = Vec2::from(aabb.size().as_::()); + (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 = (*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::::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_::(); + (rpos * rpos).dot(ab_inv_pow) < 1.0 + }, + hit, + ) + } }, Node::Sphere(aabb) => { let center = aabb.as_().center() - 0.5; diff --git a/world/src/site2/plot/bridge.rs b/world/src/site2/plot/bridge.rs index de2f328b02..0e029b3965 100644 --- a/world/src/site2/plot/bridge.rs +++ b/world/src/site2/plot/bridge.rs @@ -98,7 +98,7 @@ impl BridgeKind { } } -/* fn aabb(min: Vec3, max: Vec3) -> Aabb { +fn aabb(min: Vec3, max: Vec3) -> Aabb { 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| { @@ -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, @@ -948,13 +970,14 @@ impl Structure 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), + _ => {}, + } } } diff --git a/world/src/site2/plot/desert_city_multiplot.rs b/world/src/site2/plot/desert_city_multiplot.rs index 7c521aba15..69630193e8 100644 --- a/world/src/site2/plot/desert_city_multiplot.rs +++ b/world/src/site2/plot/desert_city_multiplot.rs @@ -134,7 +134,7 @@ impl Structure for DesertCityMultiPlot { #[cfg_attr(feature = "be-dyn-lib", export_name = "render_desertcitymultiplot")] 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)), @@ -142,8 +142,9 @@ impl Structure for DesertCityMultiPlot { 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)), @@ -152,104 +153,115 @@ impl Structure for DesertCityMultiPlot { 36..=40 => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)), _ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)), }) - })); - let wood = Fill::Brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12); + }; + let sandstone_broken = filler.sampling(&sandstone_broken_fn); + let wood = filler.brick(BlockKind::Wood, Rgb::new(71, 33, 11), 12); let base = self.alt + 1; let center = self.bounds.center(); // 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.clone()); + 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); + // Gate1 painter .aabb(Aabb { min: Vec2::new(self.bounds.min.x + 1, center.y - 3).with_z(base - 20), max: Vec2::new(self.bounds.max.x, center.y + 3).with_z(base + 10), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new(self.bounds.min.x + 1, center.y - 3).with_z(base + 9), max: Vec2::new(self.bounds.max.x, center.y - 1).with_z(base + 10), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(self.bounds.min.x + 1, center.y + 1).with_z(base + 9), max: Vec2::new(self.bounds.max.x, center.y + 3).with_z(base + 10), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(self.bounds.min.x + 2, center.y - 3).with_z(base + 8), max: Vec2::new(self.bounds.max.x - 1, center.y + 3).with_z(base + 10), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(self.bounds.min.x + 3, center.y - 3).with_z(base - 20), max: Vec2::new(self.bounds.max.x - 2, center.y + 3).with_z(base + 10), }) - .clear(); + .clear(filler); // Gate2 painter .aabb(Aabb { min: Vec2::new(center.x - 2, self.bounds.min.y + 1).with_z(base - 20), max: Vec2::new(center.x + 4, self.bounds.max.y).with_z(base + 10), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new(center.x + 2, self.bounds.min.y + 1).with_z(base + 9), max: Vec2::new(center.x + 4, self.bounds.max.y).with_z(base + 10), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(center.x - 2, self.bounds.min.y + 1).with_z(base + 9), max: Vec2::new(center.x, self.bounds.max.y).with_z(base + 10), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(center.x - 2, self.bounds.min.y + 2).with_z(base + 8), max: Vec2::new(center.x + 4, self.bounds.max.y - 1).with_z(base + 10), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(center.x - 2, self.bounds.min.y + 3).with_z(base - 20), max: Vec2::new(center.x + 4, self.bounds.max.y - 2).with_z(base + 10), }) - .clear(); + .clear(filler); // gate clear painter .aabb(Aabb { min: Vec2::new(self.bounds.min.x + 1, center.y - 2).with_z(base), max: Vec2::new(self.bounds.max.x, center.y + 2).with_z(base + 7), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(center.x - 1, self.bounds.min.y + 1).with_z(base), max: Vec2::new(center.x + 3, 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); // buildings match &self.plot_kind { @@ -267,7 +279,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + room_length + 1, center.y + 2) .with_z(floor_level + 2), }) - .fill(wood.clone()); + .fill(wood, filler); // Room painter .aabb(Aabb { @@ -276,7 +288,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + room_length, center.y + room_length - 1) .with_z(floor_level + room_height), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Window Sprites painter .aabb(Aabb { @@ -285,9 +297,9 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + room_length, center.y + 2) .with_z(floor_level + 5), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic).with_ori(4).unwrap(), - )); + ), filler); // Clear Room painter .aabb(Aabb { @@ -296,7 +308,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + room_length - 1, center.y + room_length - 2) .with_z(floor_level + room_height - 2), }) - .clear(); + .clear(filler); // Overhang1 painter .aabb(Aabb { @@ -305,7 +317,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + room_length - 1, center.y + room_length) .with_z(floor_level + room_height), }) - .fill(wood.clone()); + .fill(wood, filler); // Overhang2 painter .aabb(Aabb { @@ -314,7 +326,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + room_length + 1, center.y + room_length - 2) .with_z(floor_level + room_height), }) - .fill(wood.clone()); + .fill(wood, filler); // Overhang3 painter .aabb(Aabb { @@ -323,7 +335,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x - room_length, center.y + room_length - 2) .with_z(floor_level + room_height), }) - .fill(wood.clone()); + .fill(wood, filler); // Door Frame painter .aabb(Aabb { @@ -332,7 +344,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + 2, center.y + room_length) .with_z(floor_level + 5), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Clear Door painter .aabb(Aabb { @@ -341,7 +353,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + 1, center.y + room_length) .with_z(floor_level + 4), }) - .clear(); + .clear(filler); // Remove Terrain in front of doors painter .aabb(Aabb { @@ -350,7 +362,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + 2, center.y + room_length + 4) .with_z(floor_level + 5), }) - .clear(); + .clear(filler); // Stairs for each storey painter .ramp_inset( @@ -363,7 +375,7 @@ impl Structure for DesertCityMultiPlot { 2 * room_length, Dir::X, ) - .fill(sandstone.clone()); + .fill(sandstone, filler); //interior room compartment with entries painter .aabb(Aabb { @@ -378,7 +390,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height - 2), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { @@ -393,7 +405,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height - 2), }) - .clear(); + .clear(filler); painter .aabb(Aabb { @@ -408,7 +420,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + 3), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -422,47 +434,53 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + 3), }) - .clear(); + .clear(filler); // interior room Wall Lamps painter .aabb(Aabb { min: Vec2::new(center.x - 1, center.y - (2 * room_length / 3) + 5) .with_z(floor_level + 4), + max: Vec2::new(center.x + 1, center.y - (2 * room_length / 3) + 6) + .with_z(floor_level + 5), + }) + .fill(filler.block( + Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), + ), filler); + + painter + .aabb(Aabb { + min: Vec2::new(center.x - 1, center.y + (2 * room_length / 3) - 2) + .with_z(floor_level + 4), max: Vec2::new(center.x + 1, center.y + (2 * room_length / 3) - 1) .with_z(floor_level + 5), }) - .without( - painter.aabb(Aabb { - min: Vec2::new(center.x - 1, center.y - (2 * room_length / 3) + 6) - .with_z(floor_level + 4), - max: Vec2::new(center.x + 1, center.y + (2 * room_length / 3) - 2) - .with_z(floor_level + 5), - }), - ) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), - )); + ), filler); // Wall Lamps painter .aabb(Aabb { min: Vec2::new(center.x - 1, center.y - room_length + 4) .with_z(floor_level + 4), + max: Vec2::new(center.x + 1, center.y - room_length + 5) + .with_z(floor_level + 5), + }) + .fill(filler.block( + Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), + ), filler); + + painter + .aabb(Aabb { + min: Vec2::new(center.x - 1, center.y + room_length) + .with_z(floor_level + 4), max: Vec2::new(center.x + 1, center.y + room_length + 1) .with_z(floor_level + 5), }) - .without( - painter.aabb(Aabb { - min: Vec2::new(center.x - 1, center.y - room_length + 5) - .with_z(floor_level + 4), - max: Vec2::new(center.x + 1, center.y + room_length) - .with_z(floor_level + 5), - }), - ) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), - )); + ), filler); // Floor specific stuff match floor { @@ -470,11 +488,11 @@ impl Structure for DesertCityMultiPlot { 0 => { for dir in NEIGHBORS { let pos = center + dir * 4; - painter.sprite(pos.with_z(floor_level), SpriteKind::Crate); + painter.sprite(pos.with_z(floor_level), SpriteKind::Crate, filler); } for dir in NEIGHBORS { let pos = center + dir * 8; - painter.sprite(pos.with_z(floor_level), SpriteKind::DrawerSmall); + painter.sprite(pos.with_z(floor_level), SpriteKind::DrawerSmall, filler); } for dir in SQUARE_4 { @@ -488,6 +506,7 @@ impl Structure for DesertCityMultiPlot { planter_pos.with_z(floor_level), SpriteKind::DrawerMedium, 4 - (4 * dir.y) as u8, + filler, ); } }, @@ -495,7 +514,7 @@ impl Structure for DesertCityMultiPlot { 1 => { for dir in NEIGHBORS { let pos = center + dir * 7; - painter.sprite(pos.with_z(floor_level), SpriteKind::Planter); + painter.sprite(pos.with_z(floor_level), SpriteKind::Planter, filler); } for dir in SQUARE_4 { @@ -509,6 +528,7 @@ impl Structure for DesertCityMultiPlot { planter_pos.with_z(floor_level), SpriteKind::DrawerSmall, 4 - (4 * dir.y) as u8, + filler, ); } }, @@ -529,7 +549,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -543,7 +563,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height), }) - .clear(); + .clear(filler); // Roof Ornament painter .aabb(Aabb { @@ -552,7 +572,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + room_length, center.y + room_length - 1) .with_z(floor_level + room_height + 2), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -566,7 +586,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height + 3), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new(center.x - 2, center.y + room_length - 2) @@ -574,7 +594,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(center.x + 2, center.y + room_length - 1) .with_z(floor_level + room_height + 4), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Wood Beams for dir in SQUARE_4 { let corner_pos = @@ -589,7 +609,7 @@ impl Structure for DesertCityMultiPlot { max: (pos + 1) .with_z(floor_level + room_height + (room_height / 2)), }) - .fill(wood.clone()); + .fill(wood, filler); } painter .aabb(Aabb { @@ -604,7 +624,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height + (room_height / 2)), }) - .fill(wood.clone()); + .fill(wood, filler); painter .aabb(Aabb { @@ -619,7 +639,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height + (room_height / 2)), }) - .clear(); + .clear(filler); for b in 0..(room_length - 3) { painter @@ -635,7 +655,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height + (room_height / 2) + 1), }) - .fill(wood.clone()); + .fill(wood, filler); } // roof furniture for d in 0..2 { @@ -644,6 +664,7 @@ impl Structure for DesertCityMultiPlot { painter.sprite( pos.with_z(floor_level + room_height - 1), SpriteKind::Planter, + filler, ); } } @@ -666,7 +687,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 9 + (h * (tower.height / 5))), }) - .fill(wood.clone()); + .fill(wood, filler); } for h in 0..4 { painter @@ -682,7 +703,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 9 + (h * (tower.height / 5))), }) - .fill(wood.clone()); + .fill(wood, filler); } // Tower base painter @@ -690,14 +711,14 @@ impl Structure for DesertCityMultiPlot { min: (tower_center - tower.length - 1).with_z(base - 10), max: (tower_center + tower.length + 1).with_z(base + 6), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Tower painter .aabb(Aabb { min: (tower_center - tower.length).with_z(base), max: (tower_center + tower.length).with_z(base + tower.height), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Tower Windows for h in 0..4 { painter @@ -707,9 +728,9 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(tower_center.x + 1, tower_center.y + tower.length) .with_z(base + 12 + (h * (tower.height / 5))), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic).with_ori(2).unwrap(), - )); + ), filler); } for h in 0..4 { painter @@ -719,9 +740,9 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(tower_center.x + tower.length, tower_center.y + 1) .with_z(base + 12 + (h * (tower.height / 5))), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic).with_ori(4).unwrap(), - )); + ), filler); } // Tower entries1 painter @@ -731,7 +752,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(tower_center.x + tower.length + 2, tower_center.y + 2) .with_z(base + 5), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new(tower_center.x - tower.length - 4, tower_center.y - 1) @@ -739,7 +760,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(tower_center.x + tower.length + 4, tower_center.y + 1) .with_z(base + 4), }) - .clear(); + .clear(filler); // Tower entries2 painter .aabb(Aabb { @@ -748,7 +769,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(tower_center.x + 2, tower_center.y + tower.length + 2) .with_z(base + 5), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new(tower_center.x - 1, tower_center.y - tower.length - 4) @@ -756,7 +777,14 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(tower_center.x + 1, tower_center.y + tower.length + 4) .with_z(base + 4), }) - .clear(); + .clear(filler); + // clear Tower base + painter + .aabb(Aabb { + min: (tower_center - tower.length).with_z(base), + max: (tower_center + tower.length).with_z(base + 5), + }) + .clear(filler); // Tower Entry Lamps for d in 0..2 { painter @@ -774,11 +802,11 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 5), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WallLampSmall) .with_ori(0 + (4 * d) as u8) .unwrap(), - )); + ), filler); } // Platform painter @@ -786,13 +814,13 @@ impl Structure for DesertCityMultiPlot { min: (tower_center - tower.length - 2).with_z(base + tower.height), max: (tower_center + tower.length + 2).with_z(base + tower.height + 4), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: (tower_center - tower.length - 1).with_z(base + tower.height + 2), max: (tower_center + tower.length + 1).with_z(base + tower.height + 4), }) - .clear(); + .clear(filler); painter .aabb(Aabb { @@ -801,7 +829,7 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(tower_center.x + tower.length + 2, tower_center.y + 2) .with_z(base + tower.height + 4), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(tower_center.x - 2, tower_center.y - tower.length - 2) @@ -809,51 +837,29 @@ impl Structure for DesertCityMultiPlot { max: Vec2::new(tower_center.x + 2, tower_center.y + tower.length + 2) .with_z(base + tower.height + 4), }) - .clear(); + .clear(filler); // clear Tower let tower_clear = painter.aabb(Aabb { min: (tower_center - tower.length + 1).with_z(base), max: (tower_center + tower.length - 1).with_z(base + tower.height + 3), }); - tower_clear.clear(); + tower_clear.clear(filler); // stairway let stair_radius = tower.length + 1; let stairs_clear = painter.aabb(Aabb { min: (tower_center - stair_radius).with_z(base), max: (tower_center + stair_radius).with_z(base + tower.height + 2), }); + let stair_fill = spiral_staircase( + tower_center.with_z(base + tower.height + 2), + stair_radius as f32, + 0.5, + (2 * tower.length) as f32, + ); stairs_clear - .sample(spiral_staircase( - tower_center.with_z(base + tower.height + 2), - stair_radius as f32, - 0.5, - (2 * tower.length) as f32, - )) .intersect(tower_clear) - .fill(sandstone.clone()); - //make some room for base entries - painter - .aabb(Aabb { - min: (tower_center - tower.length).with_z(base), - max: (tower_center + tower.length).with_z(base + 5), - }) - .without(painter.aabb(Aabb { - min: (tower_center - tower.length + 1).with_z(base), - max: (tower_center + tower.length - 1).with_z(base + 5), - })) - .clear(); - // clear some steps at the bottom for tower entries - painter - .aabb(Aabb { - min: (tower_center - tower.length + 1).with_z(base + 1), - max: (tower_center + tower.length - 1).with_z(base + 2), - }) - .without(painter.aabb(Aabb { - min: (tower_center - tower.length + 2).with_z(base + 1), - max: (tower_center + tower.length - 2).with_z(base + 2), - })) - .clear(); + .fill(filler.sampling(&move |pos| if stair_fill(pos) { sandstone_fn(pos) } else { None }), filler); } }, PlotKind::Multiple { subplots } => { @@ -880,7 +886,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + 2), }) - .fill(wood.clone()); + .fill(wood, filler); // Room painter .aabb(Aabb { @@ -895,7 +901,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Window Sprites painter .aabb(Aabb { @@ -910,9 +916,9 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + 5), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic).with_ori(4).unwrap(), - )); + ), filler); // Clear Room painter .aabb(Aabb { @@ -927,7 +933,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height - 2), }) - .clear(); + .clear(filler); // Overhang1 painter .aabb(Aabb { @@ -942,7 +948,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height), }) - .fill(wood.clone()); + .fill(wood, filler); // Overhang2 painter .aabb(Aabb { @@ -957,7 +963,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height), }) - .fill(wood.clone()); + .fill(wood, filler); // Overhang3 painter .aabb(Aabb { @@ -972,7 +978,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height), }) - .fill(wood.clone()); + .fill(wood, filler); // Door Frame painter .aabb(Aabb { @@ -987,7 +993,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + 5), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Clear Door painter .aabb(Aabb { @@ -1002,7 +1008,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + 4), }) - .clear(); + .clear(filler); // Remove Terrain in front of doors painter .aabb(Aabb { @@ -1017,7 +1023,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + 5), }) - .clear(); + .clear(filler); // Stairs for each storey painter .ramp_inset( @@ -1036,7 +1042,7 @@ impl Structure for DesertCityMultiPlot { 2 * room_length, Dir::X, ) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Carve Roof Terrace if floor == floors - 1 { painter @@ -1052,7 +1058,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -1066,7 +1072,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height), }) - .clear(); + .clear(filler); // Roof Ornament painter .aabb(Aabb { @@ -1081,7 +1087,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height + 2), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -1095,7 +1101,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height + 3), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -1109,7 +1115,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(floor_level + room_height + 4), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); }; // furniture if *floors == 1 { @@ -1120,7 +1126,7 @@ impl Structure for DesertCityMultiPlot { max: (subplot_center + 2) .with_z(floor_level + room_height + 1), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { @@ -1128,20 +1134,20 @@ impl Structure for DesertCityMultiPlot { max: (subplot_center + 2) .with_z(floor_level + room_height - 2), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: (subplot_center - 1).with_z(floor_level), max: (subplot_center + 1) .with_z(floor_level + room_height + 1), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: (subplot_center - 1).with_z(floor_level - 1), max: (subplot_center + 1).with_z(floor_level), }) - .fill(Fill::Block(Block::air(SpriteKind::Ember))); + .fill(filler.block(Block::air(SpriteKind::Ember)), filler); let mut stations = vec![ SpriteKind::CraftingBench, SpriteKind::Forge, @@ -1163,7 +1169,7 @@ impl Structure for DesertCityMultiPlot { % stations.len(), ); painter - .sprite(position.with_z(floor_level), cr_station); + .sprite(position.with_z(floor_level), cr_station, filler); } } } else { @@ -1187,6 +1193,7 @@ impl Structure for DesertCityMultiPlot { _ => SpriteKind::OvenArabic, }, 4, + filler, ); let b_pos = Vec2::new( subplot_center.x + 3 - (d * 6), @@ -1204,6 +1211,7 @@ impl Structure for DesertCityMultiPlot { _ => SpriteKind::JugArabic, }, 0, + filler, ); // wall tables with varying items let c_pos = Vec2::new( @@ -1216,6 +1224,7 @@ impl Structure for DesertCityMultiPlot { c_pos.with_z(floor_level), SpriteKind::WallTableArabic, 6 - (4 * d) as u8, + filler, ); painter.rotated_sprite( c_pos.with_z(floor_level + 1), @@ -1230,16 +1239,19 @@ impl Structure for DesertCityMultiPlot { _ => SpriteKind::VialEmpty, }, 6 - (4 * d) as u8, + filler, ); } // CookingPot, Cauldron painter.sprite( (subplot_center - 2).with_z(floor_level), SpriteKind::CookingPot, + filler, ); painter.sprite( (subplot_center + 2).with_z(floor_level), SpriteKind::Cauldron, + filler, ); }, 1 => { @@ -1256,6 +1268,7 @@ impl Structure for DesertCityMultiPlot { a_pos.with_z(floor_level), SpriteKind::CanapeArabic, (4 * d) as u8, + filler, ); // other sprites @@ -1278,6 +1291,7 @@ impl Structure for DesertCityMultiPlot { 4 => SpriteKind::TableArabicSmall, _ => SpriteKind::SepareArabic, }, + filler, ) } }, @@ -1296,6 +1310,7 @@ impl Structure for DesertCityMultiPlot { a_pos.with_z(floor_level), SpriteKind::WallTableArabic, 6 - (4 * d) as u8, + filler, ); painter.rotated_sprite( a_pos.with_z(floor_level + 1), @@ -1309,11 +1324,13 @@ impl Structure for DesertCityMultiPlot { _ => SpriteKind::JugAndBowlArabic, }, 6 - (4 * d) as u8, + filler, ); // fountain painter.sprite( subplot_center.with_z(floor_level), SpriteKind::FountainArabic, + filler, ) } }, @@ -1327,29 +1344,31 @@ impl Structure for DesertCityMultiPlot { subplot_center.y - room_length + 4, ) .with_z(floor_level + 4), + max: Vec2::new( + subplot_center.x + 1, + subplot_center.y - room_length + 5, + ) + .with_z(floor_level + 5), + }) + .fill(filler.block( + Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), + ), filler); + painter + .aabb(Aabb { + min: Vec2::new( + subplot_center.x - 1, + subplot_center.y + room_length, + ) + .with_z(floor_level + 4), max: Vec2::new( subplot_center.x + 1, subplot_center.y + room_length + 1, ) .with_z(floor_level + 5), }) - .without( - painter.aabb(Aabb { - min: Vec2::new( - subplot_center.x - 1, - subplot_center.y - room_length + 5, - ) - .with_z(floor_level + 4), - max: Vec2::new( - subplot_center.x + 1, - subplot_center.y + room_length, - ) - .with_z(floor_level + 5), - }), - ) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WallLampSmall).with_ori(4).unwrap(), - )); + ), filler); } }, SubPlotKind::Library => { @@ -1391,7 +1410,7 @@ impl Structure for DesertCityMultiPlot { base + 2 + (n * (tower_height / 2)) + (h * 4), ), }) - .fill(wood.clone()); + .fill(wood, filler); } } } @@ -1410,7 +1429,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 2 + (n * (tower_height / 2)) + (h * 4)), }) - .fill(wood.clone()); + .fill(wood, filler); } } // Library @@ -1420,7 +1439,7 @@ impl Structure for DesertCityMultiPlot { max: (bldg_b_center + (2 * tower_length)) .with_z(base + tower_height), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Library windows for dir in SQUARE_4 { for h in 0..2 { @@ -1444,11 +1463,11 @@ impl Structure for DesertCityMultiPlot { + (h * 4), ), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic) .with_ori(2) .unwrap(), - )); + ), filler); } } } @@ -1461,35 +1480,35 @@ impl Structure for DesertCityMultiPlot { bldg_b_center.y - 4, ) .with_z(base + 2 + (n * (tower_height / 2)) + (h * 4)), + max: Vec2::new( + bldg_b_center.x + (2 * tower_length), + bldg_b_center.y - 2, + ) + .with_z(base + 5 + (n * (tower_height / 2)) + (h * 4)), + }) + .fill(filler.block( + Block::air(SpriteKind::WindowArabic) + .with_ori(4) + .unwrap(), + ), filler); + painter + .aabb(Aabb { + min: Vec2::new( + bldg_b_center.x + (2 * tower_length) - 1, + bldg_b_center.y + 2, + ) + .with_z(base + 2 + (n * (tower_height / 2)) + (h * 4)), max: Vec2::new( bldg_b_center.x + (2 * tower_length), bldg_b_center.y + 4, ) .with_z(base + 5 + (n * (tower_height / 2)) + (h * 4)), }) - .without( - painter.aabb(Aabb { - min: Vec2::new( - bldg_b_center.x + (2 * tower_length) - 1, - bldg_b_center.y - 2, - ) - .with_z( - base + 2 + (n * (tower_height / 2)) + (h * 4), - ), - max: Vec2::new( - bldg_b_center.x + (2 * tower_length), - bldg_b_center.y + 2, - ) - .with_z( - base + 5 + (n * (tower_height / 2)) + (h * 4), - ), - }), - ) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic) .with_ori(4) .unwrap(), - )); + ), filler); } } // roof carve out @@ -1506,7 +1525,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height), }) - .clear(); + .clear(filler); // Clear Library painter @@ -1515,7 +1534,7 @@ impl Structure for DesertCityMultiPlot { max: (bldg_b_center + (2 * tower_length) - 1) .with_z(base + tower_height - 2), }) - .clear(); + .clear(filler); // Library Floor painter .aabb(Aabb { @@ -1524,7 +1543,7 @@ impl Structure for DesertCityMultiPlot { max: (bldg_b_center + (2 * tower_length)) .with_z(base + (tower_height / 2)), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // furniture for h in 0..2 { for dir in NEIGHBORS { @@ -1541,6 +1560,7 @@ impl Structure for DesertCityMultiPlot { 4 => SpriteKind::ChairDouble, _ => SpriteKind::TableDining, }, + filler, ); } @@ -1557,6 +1577,7 @@ impl Structure for DesertCityMultiPlot { a_pos.with_z(base + 1 + ((tower_height / 2) * h)), SpriteKind::BookshelfArabic, 4 - (4 * d) as u8, + filler, ); } } @@ -1577,11 +1598,11 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 5 + (n * (tower_height / 2)) + (h * 4)), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WallLampSmall) .with_ori(6) .unwrap(), - )); + ), filler); } } // Library Roof Overhangs @@ -1601,7 +1622,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height), }) - .fill(wood.clone()); + .fill(wood, filler); } painter .aabb(Aabb { @@ -1616,7 +1637,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height), }) - .fill(wood.clone()); + .fill(wood, filler); // Stairs to Tower Top painter .ramp( @@ -1634,7 +1655,7 @@ impl Structure for DesertCityMultiPlot { }, Dir::NegX, ) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Library Top Room painter .aabb(Aabb { @@ -1649,7 +1670,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + tower_length), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -1663,7 +1684,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + tower_length - 2), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -1677,7 +1698,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + tower_length), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -1691,7 +1712,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + 2), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -1705,7 +1726,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + 2), }) - .clear(); + .clear(filler); // Library Top Room Overhangs for d in 0..2 { @@ -1724,7 +1745,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + tower_length), }) - .fill(wood.clone()); + .fill(wood, filler); } painter .aabb(Aabb { @@ -1739,7 +1760,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + tower_length), }) - .fill(wood.clone()); + .fill(wood, filler); // Library Top Room Roof Ornament painter .aabb(Aabb { @@ -1754,7 +1775,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + tower_length + 2), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -1768,7 +1789,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + tower_length + 3), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -1782,7 +1803,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + tower_length + 4), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Stairway Tower windowsills for h in 0..2 { painter @@ -1798,7 +1819,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + (tower_height / 2) - 3 + (h * 6)), }) - .fill(wood.clone()); + .fill(wood, filler); } // Stairway Tower base painter @@ -1806,14 +1827,14 @@ impl Structure for DesertCityMultiPlot { min: (bldg_a_center - tower_length - 1).with_z(base), max: (bldg_a_center + tower_length + 1).with_z(base + 6), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Tower painter .aabb(Aabb { min: (bldg_a_center - tower_length).with_z(base), max: (bldg_a_center + tower_length).with_z(base + tower_height), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // Stairway Tower windows for h in 0..2 { painter @@ -1829,9 +1850,9 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + (tower_height / 2) + (h * 6)), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic).with_ori(2).unwrap(), - )); + ), filler); } // Stairway Tower entry painter @@ -1847,7 +1868,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 5), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // clear Stairway Tower entry painter .aabb(Aabb { @@ -1862,7 +1883,14 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 4), }) - .clear(); + .clear(filler); + // clear Stairway Tower base + painter + .aabb(Aabb { + min: (bldg_a_center - tower_length).with_z(base), + max: (bldg_a_center + tower_length).with_z(base + 6), + }) + .clear(filler); // Stairway Tower Entry Lamps for d in 0..2 { painter @@ -1880,11 +1908,11 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 5), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WallLampSmall) .with_ori(0 + (4 * d) as u8) .unwrap(), - )); + ), filler); } // Library entries from Stairway Tower for h in 0..2 { @@ -1901,7 +1929,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + (h * (tower_height / 2)) + 3), }) - .clear(); + .clear(filler); } // Stairway Tower Platform painter @@ -1911,7 +1939,7 @@ impl Structure for DesertCityMultiPlot { max: (bldg_a_center + tower_length + 2) .with_z(base + tower_height + 3), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { @@ -1920,7 +1948,7 @@ impl Structure for DesertCityMultiPlot { max: (bldg_a_center + tower_length + 1) .with_z(base + tower_height + 3), }) - .clear(); + .clear(filler); painter .aabb(Aabb { @@ -1935,40 +1963,29 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower_height + 3), }) - .clear(); + .clear(filler); // clear Tower let tower_clear = painter.aabb(Aabb { min: (bldg_a_center - tower_length + 1).with_z(base), max: (bldg_a_center + tower_length - 1) .with_z(base + tower_height + 3), }); - tower_clear.clear(); + tower_clear.clear(filler); // stairway let stair_radius = tower_length + 1; let stairs_clear = painter.aabb(Aabb { min: (bldg_a_center - stair_radius).with_z(base), max: (bldg_a_center + stair_radius).with_z(base + tower_height + 2), }); + let stair_fill = spiral_staircase( + bldg_a_center.with_z(base + tower_height + 2), + stair_radius as f32, + 0.5, + ((2 * tower_length) - 1) as f32, + ); stairs_clear - .sample(spiral_staircase( - bldg_a_center.with_z(base + tower_height + 2), - stair_radius as f32, - 0.5, - ((2 * tower_length) - 1) as f32, - )) .intersect(tower_clear) - .fill(sandstone.clone()); - // make some room for base entries - painter - .aabb(Aabb { - min: (bldg_a_center - tower_length).with_z(base), - max: (bldg_a_center + tower_length).with_z(base + 5), - }) - .without(painter.aabb(Aabb { - min: (bldg_a_center - tower_length + 1).with_z(base), - max: (bldg_a_center + tower_length - 1).with_z(base + 5), - })) - .clear(); + .fill(filler.sampling(&move |pos| if stair_fill(pos) { sandstone_fn(pos) } else { None }), filler); }, SubPlotKind::WatchTower(tower) => { // WatchTower Windowsills @@ -1986,7 +2003,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 9 + (h * (tower.height / 5))), }) - .fill(wood.clone()); + .fill(wood, filler); } for h in 0..4 { painter @@ -2002,7 +2019,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 9 + (h * (tower.height / 5))), }) - .fill(wood.clone()); + .fill(wood, filler); } // Watch Tower base painter @@ -2010,7 +2027,7 @@ impl Structure for DesertCityMultiPlot { min: (subplot_center - tower.length - 1).with_z(base), max: (subplot_center + tower.length + 1).with_z(base + 6), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // WatchTower painter .aabb(Aabb { @@ -2018,7 +2035,7 @@ impl Structure for DesertCityMultiPlot { max: (subplot_center + tower.length) .with_z(base + tower.height), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); // WatchTower Windows for h in 0..4 { painter @@ -2034,9 +2051,9 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 12 + (h * (tower.height / 5))), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic).with_ori(2).unwrap(), - )); + ), filler); } for h in 0..4 { painter @@ -2052,9 +2069,9 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 12 + (h * (tower.height / 5))), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WindowArabic).with_ori(4).unwrap(), - )); + ), filler); } // Watch Tower entries painter @@ -2070,7 +2087,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 5), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -2084,7 +2101,14 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 4), }) - .clear(); + .clear(filler); + // clear Watch Tower base + painter + .aabb(Aabb { + min: (subplot_center - tower.length).with_z(base), + max: (subplot_center + tower.length).with_z(base + 5), + }) + .clear(filler); // WatchTower Entry Lamps for d in 0..2 { painter @@ -2102,11 +2126,11 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 5), }) - .fill(Fill::Block( + .fill(filler.block( Block::air(SpriteKind::WallLampSmall) .with_ori(0 + (4 * d) as u8) .unwrap(), - )); + ), filler); } // Watchtower Platform painter @@ -2116,7 +2140,7 @@ impl Structure for DesertCityMultiPlot { max: (subplot_center + tower.length + 2) .with_z(base + tower.height + 4), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { @@ -2125,7 +2149,7 @@ impl Structure for DesertCityMultiPlot { max: (subplot_center + tower.length + 1) .with_z(base + tower.height + 4), }) - .clear(); + .clear(filler); painter .aabb(Aabb { @@ -2140,7 +2164,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower.height + 4), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -2154,7 +2178,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + tower.height + 4), }) - .clear(); + .clear(filler); // clear Tower let tower_clear = painter.aabb(Aabb { @@ -2162,7 +2186,7 @@ impl Structure for DesertCityMultiPlot { max: (subplot_center + tower.length - 1) .with_z(base + tower.height + 3), }); - tower_clear.clear(); + tower_clear.clear(filler); // stairway let stair_radius = tower.length + 1; let stairs_clear = painter.aabb(Aabb { @@ -2170,70 +2194,71 @@ impl Structure for DesertCityMultiPlot { max: (subplot_center + stair_radius) .with_z(base + tower.height + 2), }); + let stair_fill = spiral_staircase( + subplot_center.with_z(base + tower.height + 2), + stair_radius as f32, + 0.5, + (2 * tower.length) as f32, + ); stairs_clear - .sample(spiral_staircase( - subplot_center.with_z(base + tower.height + 2), - stair_radius as f32, - 0.5, - (2 * tower.length) as f32, - )) .intersect(tower_clear) - .fill(sandstone.clone()); - //make some room for base entries - painter - .aabb(Aabb { - min: (subplot_center - tower.length).with_z(base), - max: (subplot_center + tower.length).with_z(base + 5), - }) - .without(painter.aabb(Aabb { - min: (subplot_center - tower.length + 1).with_z(base), - max: (subplot_center + tower.length - 1).with_z(base + 5), - })) - .clear(); - // clear some steps at the bottom for tower entries - painter - .aabb(Aabb { - min: (subplot_center - tower.length + 1).with_z(base + 1), - max: (subplot_center + tower.length - 1).with_z(base + 2), - }) - .without(painter.aabb(Aabb { - min: (subplot_center - tower.length + 2).with_z(base + 1), - max: (subplot_center + tower.length - 2).with_z(base + 2), - })) - .clear(); + .fill(filler.sampling(&move |pos| if stair_fill(pos) { sandstone_fn(pos) } else { None }), filler); }, SubPlotKind::AnimalShed => { // fenced animal shed let shed_length = self.diameter / 14; // small fence - painter - .aabb(Aabb { + painter.union_all([ + painter.aabb(Aabb { min: Vec2::new( subplot_center.x - (2 * shed_length), subplot_center.y - (2 * shed_length) - 1, ) .with_z(base), + max: Vec2::new( + subplot_center.x - (2 * shed_length) + 1, + subplot_center.y + (2 * shed_length) + 1, + ) + .with_z(base + 2), + }), + painter.aabb(Aabb { + min: Vec2::new( + subplot_center.x + (2 * shed_length) + 1, + subplot_center.y - (2 * shed_length) - 1, + ) + .with_z(base), max: Vec2::new( subplot_center.x + (2 * shed_length) + 2, subplot_center.y + (2 * shed_length) + 1, ) .with_z(base + 2), - }) - .without( - painter.aabb(Aabb { - min: Vec2::new( - subplot_center.x - (2 * shed_length) + 1, - subplot_center.y - (2 * shed_length), - ) - .with_z(base), - max: Vec2::new( - subplot_center.x + (2 * shed_length) + 1, - subplot_center.y + (2 * shed_length), - ) - .with_z(base + 2), - }), - ) - .fill(sandstone_broken.clone()); + }), + painter.aabb(Aabb { + min: Vec2::new( + subplot_center.x - (2 * shed_length), + subplot_center.y - (2 * shed_length) - 1, + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + (2 * shed_length) + 2, + subplot_center.y - (2 * shed_length), + ) + .with_z(base + 2), + }), + painter.aabb(Aabb { + min: Vec2::new( + subplot_center.x - (2 * shed_length), + subplot_center.y + (2 * shed_length), + ) + .with_z(base), + max: Vec2::new( + subplot_center.x + (2 * shed_length) + 2, + subplot_center.y + (2 * shed_length) + 1, + ) + .with_z(base + 2), + }), + ].into_iter()) + .fill(sandstone_broken, filler); // shed painter .aabb(Aabb { @@ -2248,7 +2273,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + shed_length + 1), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -2262,7 +2287,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + shed_length - 1), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -2276,7 +2301,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + shed_length + 1), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -2290,7 +2315,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 3), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new( @@ -2304,7 +2329,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + 3), }) - .clear(); + .clear(filler); // Shed Overhangs for d in 0..2 { painter @@ -2322,7 +2347,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + shed_length), }) - .fill(wood.clone()); + .fill(wood, filler); } painter .aabb(Aabb { @@ -2337,7 +2362,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + shed_length), }) - .fill(wood.clone()); + .fill(wood, filler); // Shed Roof Ornament painter .aabb(Aabb { @@ -2352,7 +2377,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + shed_length + 2), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -2366,7 +2391,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + shed_length + 3), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .aabb(Aabb { min: Vec2::new( @@ -2380,7 +2405,7 @@ impl Structure for DesertCityMultiPlot { ) .with_z(base + shed_length + 4), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); }, SubPlotKind::PalmTree => { // Palm @@ -2389,13 +2414,13 @@ impl Structure for DesertCityMultiPlot { min: (subplot_center - 8).with_z(base), max: (subplot_center + 14).with_z(base + 1), }) - .fill(sandstone.clone()); + .fill(sandstone, filler); painter .cylinder(Aabb { min: (subplot_center - 7).with_z(base), max: (subplot_center + 13).with_z(base + 1), }) - .fill(Fill::Brick(BlockKind::Rock, Rgb::new(235, 178, 99), 12)); + .fill(filler.brick(BlockKind::Rock, Rgb::new(235, 178, 99), 12), filler); for p in 0..2 { let palm_pos = (subplot_center + 3 + (2 * p)).with_z(base); lazy_static! { @@ -2403,12 +2428,12 @@ impl Structure for DesertCityMultiPlot { PrefabStructure::load_group("trees.palms"); } let rng = RandomField::new(0).get(palm_pos) % 10; - let palm = PALM.read(); - let palm = palm[rng as usize % palm.len()].clone(); + let palm = PALM.get(); + let palm = &palm[rng as usize % palm.len()]; painter - .prim(Primitive::Prefab(Box::new(palm.clone()))) + .prefab(palm) .translate(palm_pos) - .fill(Fill::Prefab(Box::new(palm), palm_pos, rng)); + .fill(filler.prefab(palm, palm_pos, rng), filler); } }, } @@ -2416,9 +2441,9 @@ impl Structure for DesertCityMultiPlot { // spawn campfire in some multiplots that are not markethall let campfire_pos = (center).with_z(base + 1); if self.campfire { - painter.spawn(EntityInfo::at(campfire_pos.map(|e| e as f32)).into_waypoint()) + filler.spawn(EntityInfo::at(campfire_pos.map(|e| e as f32)).into_waypoint()) } }, - } */ + } } } diff --git a/world/src/site2/plot/desert_city_temple.rs b/world/src/site2/plot/desert_city_temple.rs index 296a956753..bbf2eacbc1 100644 --- a/world/src/site2/plot/desert_city_temple.rs +++ b/world/src/site2/plot/desert_city_temple.rs @@ -43,7 +43,7 @@ impl Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure for DesertCityTemple { ) .with_z(base + temple_size - 1), }) - .clear(); + .clear(filler); } for c in 0..(temple_size - 5) { painter @@ -233,7 +244,7 @@ impl Structure for DesertCityTemple { ) .with_z(base + temple_size - 1), }) - .clear(); + .clear(filler); } }, 1 => { @@ -249,7 +260,7 @@ impl Structure 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 Structure for DesertCityTemple { ) .with_z(base + 3 + ((spread + 2) * c) + spread_select), }) - .clear(); + .clear(filler); } }, _ => {}, @@ -273,105 +284,86 @@ impl Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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 Structure 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); } } diff --git a/world/src/site2/plot/savannah_pit.rs b/world/src/site2/plot/savannah_pit.rs index 4d7dbdd973..8fc02fda95 100644 --- a/world/src/site2/plot/savannah_pit.rs +++ b/world/src/site2/plot/savannah_pit.rs @@ -40,9 +40,9 @@ impl Structure for SavannahPit { #[cfg_attr(feature = "be-dyn-lib", export_name = "render_savannahpit")] fn render_inner<'a>(&self, _site: &Site, land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) { - /* let base = self.alt + 1; + let base = self.alt + 1; let center = self.bounds.center(); - let sprite_fill = Fill::Sampling(Arc::new(|wpos| { + let sprite_fill = filler.sampling(&|wpos| { Some(match (RandomField::new(0).get(wpos)) % 50 { 0 => Block::air(SpriteKind::Bowl), 1 => Block::air(SpriteKind::VialEmpty), @@ -51,12 +51,13 @@ impl Structure for SavannahPit { 4 => Block::air(SpriteKind::Crate), _ => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)), }) - })); - let wood_light = Fill::Brick(BlockKind::Misc, Rgb::new(179, 125, 64), 12); - let wood_dark = Fill::Brick(BlockKind::Misc, Rgb::new(142, 67, 27), 12); - let reed = Fill::Brick(BlockKind::Misc, Rgb::new(72, 55, 46), 22); - let clay = Fill::Brick(BlockKind::Misc, Rgb::new(209, 124, 57), 22); - let color = Fill::Sampling(Arc::new(|center| { + }); + let wood_light = filler.brick(BlockKind::Misc, Rgb::new(179, 125, 64), 12); + let wood_dark_fn = filler.brick_fn(BlockKind::Misc, Rgb::new(142, 67, 27), 12); + let wood_dark = filler.brick(BlockKind::Misc, Rgb::new(142, 67, 27), 12); + let reed = filler.brick(BlockKind::Misc, Rgb::new(72, 55, 46), 22); + let clay = filler.brick(BlockKind::Misc, Rgb::new(209, 124, 57), 22); + let color = filler.sampling(&|center| { Some(match (RandomField::new(0).get(center)) % 7 { 0 => Block::new(BlockKind::GlowingRock, Rgb::new(153, 82, 40)), 1 => Block::new(BlockKind::GlowingRock, Rgb::new(172, 104, 57)), @@ -66,8 +67,8 @@ impl Structure for SavannahPit { 5 => Block::new(BlockKind::GlowingRock, Rgb::new(73, 53, 42)), _ => Block::new(BlockKind::GlowingRock, Rgb::new(178, 124, 90)), }) - })); - let snow_fill = Fill::Block(Block::new(BlockKind::Snow, Rgb::new(255, 255, 255))); + }); + let snow_fill = filler.block(Block::new(BlockKind::Snow, Rgb::new(255, 255, 255))); let length = 9; // foundation painter @@ -78,26 +79,26 @@ impl Structure for SavannahPit { }, 5.0, ) - .fill(clay.clone()); + .fill(clay, filler); // outside cylinder and decor painter .cylinder(Aabb { min: (center - (3 * length) - 3).with_z(base - 1), max: (center + (3 * length) + 3).with_z(base), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .cylinder(Aabb { min: (center - (3 * length) - 2).with_z(base - (1 * length)), max: (center + (3 * length) + 2).with_z(base + 1), }) - .fill(clay.clone()); + .fill(clay, filler); painter .cylinder(Aabb { min: (center - (7 * length)).with_z(base - (6 * length) - 3), max: (center + (7 * length)).with_z(base - (1 * length)), }) - .fill(clay.clone()); + .fill(clay, filler); // decor inlays let decor_var = RandomField::new(0).get(center.with_z(base)) % 5; for s in 0..3 { @@ -113,20 +114,20 @@ impl Structure for SavannahPit { }; match decor_var { 0 => { - painter.cone(decor1).fill(color.clone()); - painter.cone(decor2).fill(clay.clone()) + painter.cone(decor1).fill(color, filler); + painter.cone(decor2).fill(clay, filler) }, 1 => { - painter.aabb(decor1).fill(color.clone()); - painter.aabb(decor2).fill(clay.clone()) + painter.aabb(decor1).fill(color, filler); + painter.aabb(decor2).fill(clay, filler) }, 2 => { - painter.cylinder(decor1).fill(color.clone()); - painter.cylinder(decor2).fill(clay.clone()) + painter.cylinder(decor1).fill(color, filler); + painter.cylinder(decor2).fill(clay, filler) }, _ => { - painter.sphere(decor1).fill(color.clone()); - painter.sphere(decor2).fill(clay.clone()) + painter.sphere(decor1).fill(color, filler); + painter.sphere(decor2).fill(clay, filler) }, }; } @@ -143,20 +144,20 @@ impl Structure for SavannahPit { }; match decor_var { 0 => { - painter.cone(decor1).fill(color.clone()); - painter.cone(decor2).fill(clay.clone()) + painter.cone(decor1).fill(color, filler); + painter.cone(decor2).fill(clay, filler) }, 1 => { - painter.aabb(decor1).fill(color.clone()); - painter.aabb(decor2).fill(clay.clone()) + painter.aabb(decor1).fill(color, filler); + painter.aabb(decor2).fill(clay, filler) }, 2 => { - painter.cylinder(decor1).fill(color.clone()); - painter.cylinder(decor2).fill(clay.clone()) + painter.cylinder(decor1).fill(color, filler); + painter.cylinder(decor2).fill(clay, filler) }, _ => { - painter.sphere(decor1).fill(color.clone()); - painter.sphere(decor2).fill(clay.clone()) + painter.sphere(decor1).fill(color, filler); + painter.sphere(decor2).fill(clay, filler) }, }; } @@ -174,20 +175,20 @@ impl Structure for SavannahPit { }; match decor_var { 0 => { - painter.cone(decor1).fill(color.clone()); - painter.cone(decor2).fill(clay.clone()) + painter.cone(decor1).fill(color, filler); + painter.cone(decor2).fill(clay, filler) }, 1 => { - painter.aabb(decor1).fill(color.clone()); - painter.aabb(decor2).fill(clay.clone()) + painter.aabb(decor1).fill(color, filler); + painter.aabb(decor2).fill(clay, filler) }, 2 => { - painter.cylinder(decor1).fill(color.clone()); - painter.cylinder(decor2).fill(clay.clone()) + painter.cylinder(decor1).fill(color, filler); + painter.cylinder(decor2).fill(clay, filler) }, _ => { - painter.sphere(decor1).fill(color.clone()); - painter.sphere(decor2).fill(clay.clone()) + painter.sphere(decor1).fill(color, filler); + painter.sphere(decor2).fill(clay, filler) }, }; } @@ -203,20 +204,20 @@ impl Structure for SavannahPit { }; match decor_var { 0 => { - painter.cone(decor1).fill(color.clone()); - painter.cone(decor2).fill(clay.clone()) + painter.cone(decor1).fill(color, filler); + painter.cone(decor2).fill(clay, filler) }, 1 => { - painter.aabb(decor1).fill(color.clone()); - painter.aabb(decor2).fill(clay.clone()) + painter.aabb(decor1).fill(color, filler); + painter.aabb(decor2).fill(clay, filler) }, 2 => { - painter.cylinder(decor1).fill(color.clone()); - painter.cylinder(decor2).fill(clay.clone()) + painter.cylinder(decor1).fill(color, filler); + painter.cylinder(decor2).fill(clay, filler) }, _ => { - painter.sphere(decor1).fill(color.clone()); - painter.sphere(decor2).fill(clay.clone()) + painter.sphere(decor1).fill(color, filler); + painter.sphere(decor2).fill(clay, filler) }, }; } @@ -226,42 +227,42 @@ impl Structure for SavannahPit { min: (center - (3 * length) - 1).with_z(base), max: (center + (3 * length) + 1).with_z(base + 1), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); // floor 0 ring painter .cylinder(Aabb { min: (center - (2 * length) - 1).with_z(base - length - 1), max: (center + (2 * length) + 1).with_z(base - length), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); // floor -1 inner ring painter .cylinder(Aabb { min: (center - length - 1).with_z(base - (2 * length) - 1), max: (center + length + 1).with_z(base - (2 * length)), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); // floor 0 outer ring painter .cylinder(Aabb { min: (center - (3 * length) - 1).with_z(base - length + (length / 2) - 1), max: (center + (3 * length) + 1).with_z(base - length + (length / 2)), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); // floor -1 inner ring painter .cylinder(Aabb { min: (center - (4 * length) - 1).with_z(base - (2 * length) + (length / 2) - 1), max: (center + (4 * length) + 1).with_z(base - (2 * length) + (length / 2)), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); // floor -2 inner ring painter .cylinder(Aabb { min: (center - (4 * length) - 1).with_z(base - (3 * length) + (length / 2) - 1), max: (center + (4 * length) + 1).with_z(base - (3 * length) + (length / 2)), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); // floor 0 painter @@ -269,21 +270,150 @@ impl Structure for SavannahPit { min: (center - (3 * length)).with_z(base - length), max: (center + (3 * length)).with_z(base + 25), }) - .clear(); + .clear(filler); // floor -1 painter .cylinder(Aabb { min: (center - (2 * length)).with_z(base - (2 * length)), max: (center + (2 * length)).with_z(base - length), }) - .clear(); + .clear(filler); // floor -2 painter .cylinder(Aabb { min: (center - length).with_z(base - (3 * length)), max: (center + length).with_z(base - (2 * length)), }) - .clear(); + .clear(filler); + // floor -1 donut room & floor -2 donut room + let rooms_clear = painter + .cylinder(Aabb { + min: (center - (4 * length)).with_z(base - (2 * length)), + max: (center + (4 * length)).with_z(base - length - 1), + }) + .union(painter.cylinder(Aabb { + min: (center - (4 * length)).with_z(base - (3 * length)), + max: (center + (4 * length)).with_z(base - (2 * length) - 1), + })); + + let rooms = painter + .cylinder(Aabb { + min: (center - (2 * length) - 2).with_z(base - (2 * length)), + max: (center + (2 * length) + 2).with_z(base - length - 1), + }) + .union(painter.cylinder(Aabb { + min: (center - length - 2).with_z(base - (3 * length)), + max: (center + length + 2).with_z(base - (2 * length) - 1), + })); + rooms_clear/*.without(rooms)*/.clear(filler); + + // floor 0 wood ring + painter + .cylinder(Aabb { + min: (center - (3 * length)).with_z(base - length + (length / 2) - 3), + max: (center + (3 * length)).with_z(base - length + (length / 2) - 2), + }) + .fill(wood_light, filler); + painter + .cylinder(Aabb { + min: (center - (3 * length) + 1).with_z(base - length + (length / 2) - 3), + max: (center + (3 * length) - 1).with_z(base - length + (length / 2) - 2), + }) + .clear(filler); + // floor -1 wood ring + painter + .cylinder(Aabb { + min: (center - (4 * length)).with_z(base - (2 * length) + (length / 2) - 3), + max: (center + (4 * length)).with_z(base - (2 * length) + (length / 2) - 2), + }) + .fill(wood_light, filler); + painter + .cylinder(Aabb { + min: (center - (4 * length) + 1).with_z(base - (2 * length) + (length / 2) - 3), + max: (center + (4 * length) - 1).with_z(base - (2 * length) + (length / 2) - 2), + }) + .clear(filler); + // floor -1 wood ring sprites + painter + .cylinder(Aabb { + min: (center - (4 * length)).with_z(base - (2 * length) + (length / 2) - 2), + max: (center + (4 * length)).with_z(base - (2 * length) + (length / 2) - 1), + }) + .fill(sprite_fill, filler); + painter + .cylinder(Aabb { + min: (center - (4 * length) + 1).with_z(base - (2 * length) + (length / 2) - 2), + max: (center + (4 * length) - 1).with_z(base - (2 * length) + (length / 2) - 1), + }) + .clear(filler); + // floor -1 center decor ring + painter + .cylinder(Aabb { + min: (center - (2 * length) - 2).with_z(base - (2 * length) + (length / 2) - 3), + max: (center + (2 * length) + 2).with_z(base - (2 * length) + (length / 2) - 1), + }) + .fill(color, filler); + painter + .cylinder(Aabb { + min: (center - (2 * length)).with_z(base - (2 * length) + (length / 2) - 3), + max: (center + (2 * length)).with_z(base - (2 * length) + (length / 2) - 1), + }) + .clear(filler); + // floor -1 room entry + let room1_entry_pos = Vec2::new(center.x, center.y - (2 * length)); + painter + .sphere(Aabb { + min: (room1_entry_pos - 5).with_z(base - (2 * length)), + max: (room1_entry_pos + 5).with_z(base - (2 * length) + 5), + }) + .clear(filler); + // floor -2 wood ring + painter + .cylinder(Aabb { + min: (center - (4 * length)).with_z(base - (3 * length) + (length / 2) - 3), + max: (center + (4 * length)).with_z(base - (3 * length) + (length / 2) - 2), + }) + .fill(wood_light, filler); + painter + .cylinder(Aabb { + min: (center - (4 * length) + 1).with_z(base - (3 * length) + (length / 2) - 3), + max: (center + (4 * length) - 1).with_z(base - (3 * length) + (length / 2) - 2), + }) + .clear(filler); + // floor -2 wood ring sprites + painter + .cylinder(Aabb { + min: (center - (4 * length)).with_z(base - (3 * length) + (length / 2) - 2), + max: (center + (4 * length)).with_z(base - (3 * length) + (length / 2) - 1), + }) + .fill(sprite_fill, filler); + painter + .cylinder(Aabb { + min: (center - (4 * length) + 1).with_z(base - (3 * length) + (length / 2) - 2), + max: (center + (4 * length) - 1).with_z(base - (3 * length) + (length / 2) - 1), + }) + .clear(filler); + // floor -2 center decor ring + painter + .cylinder(Aabb { + min: (center - length - 2).with_z(base - (3 * length) + (length / 2) - 3), + max: (center + length + 2).with_z(base - (3 * length) + (length / 2) - 1), + }) + .fill(color, filler); + painter + .cylinder(Aabb { + min: (center - length).with_z(base - (3 * length) + (length / 2) - 3), + max: (center + length).with_z(base - (3 * length) + (length / 2) - 1), + }) + .clear(filler); + // floor -2 room entry + let room2_entry_pos = Vec2::new(center.x, center.y - length); + painter + .sphere(Aabb { + min: (room2_entry_pos - 5).with_z(base - (3 * length)), + max: (room2_entry_pos + 5).with_z(base - (3 * length) + 5), + }) + .clear(filler); // floor stairs lamps for dir in SQUARE_4 { @@ -297,6 +427,7 @@ impl Structure for SavannahPit { lamp_pos1.with_z(base - length + 9), SpriteKind::WallLampSmall, 4 - (4 * dir.y) as u8, + filler, ); let corner_pos2 = Vec2::new(center.x - (3 * length) + 1, center.y - 1); let lamp_pos2 = Vec2::new( @@ -307,6 +438,7 @@ impl Structure for SavannahPit { lamp_pos2.with_z(base - length + 9), SpriteKind::WallLampSmall, 2 + (4 * dir.x) as u8, + filler, ); } @@ -321,6 +453,7 @@ impl Structure for SavannahPit { lamp_pos1.with_z(base - (2 * length) + 8), SpriteKind::WallLampSmall, 4 - (4 * dir.y) as u8, + filler, ); let corner_pos2 = Vec2::new(center.x - (2 * length), center.y - 1); let lamp_pos2 = Vec2::new( @@ -331,6 +464,7 @@ impl Structure for SavannahPit { lamp_pos2.with_z(base - (2 * length) + 8), SpriteKind::WallLampSmall, 2 + (4 * dir.x) as u8, + filler, ); } for dir in SQUARE_4 { @@ -344,6 +478,7 @@ impl Structure for SavannahPit { lamp_pos1.with_z(base - (3 * length) + 8), SpriteKind::WallLampSmall, 4 - (4 * dir.y) as u8, + filler, ); let corner_pos2 = Vec2::new(center.x - length, center.y - 1); let lamp_pos2 = Vec2::new( @@ -354,171 +489,68 @@ impl Structure for SavannahPit { lamp_pos2.with_z(base - (3 * length) + 8), SpriteKind::WallLampSmall, 2 + (4 * dir.x) as u8, + filler, ); } let stair_radius0 = ((3 * length) + 1) as f32; - let stairs_clear0 = painter.prim(Primitive::Cylinder(Aabb { + let stairs_clear0 = painter.cylinder(Aabb { min: (center - (3 * length)).with_z(base - length), max: (center + (3 * length)).with_z(base), - })); - painter - .prim(Primitive::sampling( - stairs_clear0, - dungeon::spiral_staircase( - center.with_z(base - length), - stair_radius0, - 2.5, - (2 * length) as f32, - ), - )) - .fill(wood_dark.clone()); + }); + let stair_fill = dungeon::spiral_staircase( + center.with_z(base - length), + stair_radius0, + 2.5, + (2 * length) as f32, + ); + stairs_clear0 + .fill(filler.sampling(&move |pos| if stair_fill(pos) { wood_dark_fn(pos) } else { None }), filler); let stair_radius1 = ((2 * length) + 1) as f32; - let stairs_clear1 = painter.prim(Primitive::Cylinder(Aabb { + let stairs_clear1 = painter.cylinder(Aabb { min: (center - (3 * length)).with_z(base - (2 * length)), max: (center + (3 * length)).with_z(base - length), - })); - painter - .prim(Primitive::sampling( - stairs_clear1, - dungeon::spiral_staircase( - center.with_z(base - (2 * length)), - stair_radius1, - 2.5, - (2 * length) as f32, - ), - )) - .fill(wood_dark.clone()); + }); + let stair_fill = dungeon::spiral_staircase( + center.with_z(base - (2 * length)), + stair_radius1, + 2.5, + (2 * length) as f32, + ); + stairs_clear1 + .fill(filler.sampling(&move |pos| if stair_fill(pos) { wood_dark_fn(pos) } else { None }), filler); let stair_radius2 = ((2 * length) + 1) as f32; - let stairs_clear2 = painter.prim(Primitive::Cylinder(Aabb { - min: (center - (3 * length)).with_z(base - (3 * length)), - max: (center + (3 * length)).with_z(base - (2 * length)), - })); - painter - .prim(Primitive::sampling( - stairs_clear2, - dungeon::spiral_staircase( - center.with_z(base - (3 * length)), - stair_radius2, - 2.5, - (2 * length) as f32, - ), - )) - .fill(wood_dark.clone()); - // floor -1 donut room - painter - .cylinder(Aabb { - min: (center - (4 * length)).with_z(base - (2 * length)), - max: (center + (4 * length)).with_z(base - length - 1), - }) - .without(painter.cylinder(Aabb { - min: (center - (2 * length) - 2).with_z(base - (2 * length)), - max: (center + (2 * length) + 2).with_z(base - length - 1), - })) - .clear(); - // floor -1 room entry - let room1_entry_pos = Vec2::new(center.x, center.y - (2 * length)); - painter - .sphere(Aabb { - min: (room1_entry_pos - 5).with_z(base - (2 * length)), - max: (room1_entry_pos + 5).with_z(base - (2 * length) + 5), - }) - .clear(); - - // floor -2 donut room - painter - .cylinder(Aabb { - min: (center - (4 * length)).with_z(base - (3 * length)), - max: (center + (4 * length)).with_z(base - (2 * length) - 1), - }) - .without(painter.cylinder(Aabb { - min: (center - length - 2).with_z(base - (3 * length)), - max: (center + length + 2).with_z(base - (2 * length) - 1), - })) - .clear(); - // floor -2 room entry - let room2_entry_pos = Vec2::new(center.x, center.y - length); - painter - .sphere(Aabb { - min: (room2_entry_pos - 5).with_z(base - (3 * length)), - max: (room2_entry_pos + 5).with_z(base - (3 * length) + 5), - }) - .clear(); - // floor 0 wood ring - painter - .cylinder(Aabb { - min: (center - (3 * length)).with_z(base - length + (length / 2) - 3), - max: (center + (3 * length)).with_z(base - length + (length / 2) - 2), - }) - .without(painter.cylinder(Aabb { - min: (center - (3 * length) + 1).with_z(base - length + (length / 2) - 3), - max: (center + (3 * length) - 1).with_z(base - length + (length / 2) - 2), - })) - .fill(wood_light.clone()); - // floor -1 wood ring - painter - .cylinder(Aabb { - min: (center - (4 * length)).with_z(base - (2 * length) + (length / 2) - 3), - max: (center + (4 * length)).with_z(base - (2 * length) + (length / 2) - 2), - }) - .without(painter.cylinder(Aabb { - min: (center - (4 * length) + 1).with_z(base - (2 * length) + (length / 2) - 3), - max: (center + (4 * length) - 1).with_z(base - (2 * length) + (length / 2) - 2), - })) - .fill(wood_light.clone()); - // floor -2 wood ring - painter - .cylinder(Aabb { - min: (center - (4 * length)).with_z(base - (3 * length) + (length / 2) - 3), - max: (center + (4 * length)).with_z(base - (3 * length) + (length / 2) - 2), - }) - .without(painter.cylinder(Aabb { - min: (center - (4 * length) + 1).with_z(base - (3 * length) + (length / 2) - 3), - max: (center + (4 * length) - 1).with_z(base - (3 * length) + (length / 2) - 2), - })) - .fill(wood_light.clone()); - // floor -1 wood ring sprites - painter - .cylinder(Aabb { - min: (center - (4 * length)).with_z(base - (2 * length) + (length / 2) - 2), - max: (center + (4 * length)).with_z(base - (2 * length) + (length / 2) - 1), - }) - .without(painter.cylinder(Aabb { - min: (center - (4 * length) + 1).with_z(base - (2 * length) + (length / 2) - 2), - max: (center + (4 * length) - 1).with_z(base - (2 * length) + (length / 2) - 1), - })) - .fill(sprite_fill.clone()); - // floor -2 wood ring sprites - painter - .cylinder(Aabb { - min: (center - (4 * length)).with_z(base - (3 * length) + (length / 2) - 2), - max: (center + (4 * length)).with_z(base - (3 * length) + (length / 2) - 1), - }) - .without(painter.cylinder(Aabb { - min: (center - (4 * length) + 1).with_z(base - (3 * length) + (length / 2) - 2), - max: (center + (4 * length) - 1).with_z(base - (3 * length) + (length / 2) - 1), - })) - .fill(sprite_fill.clone()); - + let stairs_clear2 = painter.cylinder(Aabb { + min: (center - length).with_z(base - (3 * length)), + max: (center + length).with_z(base - (2 * length)), + }); + let stair_fill = dungeon::spiral_staircase( + center.with_z(base - (3 * length)), + stair_radius2, + 2.5, + (2 * length) as f32, + ); + stairs_clear2 + .fill(filler.sampling(&move |pos| if stair_fill(pos) { wood_dark_fn(pos) } else { None }), filler); // top wood cone painter .cone(Aabb { min: (center - (4 * length)).with_z(base + length), max: (center + (4 * length)).with_z(base + (3 * length)), }) - .fill(reed.clone()); + .fill(reed, filler); painter .cone(Aabb { min: (center - (4 * length)).with_z(base + length - 1), max: (center + (4 * length)).with_z(base + (3 * length) - 1), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (center - 2).with_z(base), max: (center + 2).with_z(base + (3 * length) - 1), }) - .fill(wood_dark.clone()); + .fill(wood_dark, filler); for dir in CARDINALS { let outer_support = center + dir * ((3 * length) + 2); painter @@ -526,7 +558,7 @@ impl Structure for SavannahPit { min: (outer_support - 3).with_z(base - length), max: (outer_support + 3).with_z(base + length + 2), }) - .fill(wood_dark.clone()); + .fill(wood_dark, filler); } // wood platform painter @@ -534,7 +566,7 @@ impl Structure for SavannahPit { min: (center - length).with_z(base + length + 1), max: (center + length).with_z(base + length + 2), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); // small stairs let small_stairs_pos = center - 5; let small_stair_radius = 4.0; @@ -542,19 +574,17 @@ impl Structure for SavannahPit { min: (small_stairs_pos + 1 - small_stair_radius as i32).with_z(base), max: (small_stairs_pos - 1 + small_stair_radius as i32).with_z(base + length + 3), }); - small_stairs_clear.clear(); - painter - .prim(Primitive::sampling( - small_stairs_clear, - dungeon::spiral_staircase( - small_stairs_pos.with_z(base), - small_stair_radius, - 0.5, - (length - 2) as f32, - ), - )) - .fill(wood_dark.clone()); + small_stairs_clear.clear(filler); + let stair_fill = dungeon::spiral_staircase( + small_stairs_pos.with_z(base), + small_stair_radius, + 0.5, + (length - 2) as f32, + ); + small_stairs_clear + .fill(filler.sampling(&move |pos| if stair_fill(pos) { wood_dark_fn(pos) } else { None }), filler); + let mut rng = thread_rng(); // small outer rooms 1 for dir in CARDINALS { let room_center = center + dir * ((4 * length) - (length / 4)); @@ -565,44 +595,43 @@ impl Structure for SavannahPit { min: (room_center - length - 1).with_z(base - ((1 + f) * length)), max: (room_center + length + 1).with_z(base - (length * f) - 1), }) - .fill(clay.clone()); + .fill(clay, filler); painter .cylinder(Aabb { min: (room_center - length).with_z(base - ((1 + f) * length)), max: (room_center + length).with_z(base - (length * f) - 1), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (room_center - length).with_z(base - ((1 + f) * length) + 1), max: (room_center + length).with_z(base - ((1 + f) * length) + 2), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .cylinder(Aabb { min: (room_center - length).with_z(base - ((1 + f) * length) + 2), max: (room_center + length).with_z(base - ((1 + f) * length) + 3), }) - .fill(sprite_fill.clone()); + .fill(sprite_fill, filler); painter .cylinder(Aabb { min: (room_center - length + 1).with_z(base - ((1 + f) * length) + 1), max: (room_center + length - 1).with_z(base - ((1 + f) * length) + 3), }) - .clear(); + .clear(filler); painter .sphere(Aabb { min: (entries_clear - 2).with_z(base - ((1 + f) * length)), max: (entries_clear + 2).with_z(base - ((1 + f) * length) + 4), }) - .clear(); + .clear(filler); // villagers in each room let spawn_pos = (room_center - 3).with_z(base - ((1 + f) * length)); let npc_amount = RandomField::new(0).get(spawn_pos) % 3; for _ in 0..npc_amount { - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.villager", &mut rng), ); @@ -614,7 +643,7 @@ impl Structure for SavannahPit { min: (room_center - length + 1).with_z(base + length), max: (room_center + length - 1).with_z(base + length + 1), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); //small top cones let top_var = RandomField::new(0).get(room_center.with_z(base)) % 4; if let 0..=2 = top_var { @@ -625,7 +654,7 @@ impl Structure for SavannahPit { max: (room_center + length) .with_z(base + (2 * length) + (length / 2) + 2 + (3 * top_var) as i32), }) - .fill(reed.clone()); + .fill(reed, filler); painter .cone(Aabb { min: (room_center - length) @@ -633,27 +662,26 @@ impl Structure for SavannahPit { max: (room_center + length) .with_z(base + (2 * length) + (length / 2) + 1 + (3 * top_var) as i32), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: (room_center - 1).with_z(base + length + 1), max: (room_center + 1) .with_z(base + (2 * length) + 5 + (3 * top_var) as i32), }) - .fill(wood_dark.clone()); + .fill(wood_dark, filler); } // villagers on platforms let spawn_pos = (room_center - 2).with_z(base + length + 2); let npc_amount = RandomField::new(0).get(spawn_pos) % 3; for _ in 0..npc_amount { - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.villager", &mut rng), ); } let lantern_pos = center + dir * ((4 * length) - (length / 4) + 4); - painter.sprite(lantern_pos.with_z(base + length + 1), SpriteKind::Lantern); + painter.sprite(lantern_pos.with_z(base + length + 1), SpriteKind::Lantern, filler); } // small outer rooms 2 @@ -666,44 +694,43 @@ impl Structure for SavannahPit { min: (room_center - length - 1).with_z(base - ((1 + f) * length)), max: (room_center + length + 1).with_z(base - (length * f) - 1), }) - .fill(clay.clone()); + .fill(clay, filler); painter .cylinder(Aabb { min: (room_center - length).with_z(base - ((1 + f) * length)), max: (room_center + length).with_z(base - (length * f) - 1), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (room_center - length).with_z(base - ((1 + f) * length) + 1), max: (room_center + length).with_z(base - ((1 + f) * length) + 2), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .cylinder(Aabb { min: (room_center - length).with_z(base - ((1 + f) * length) + 2), max: (room_center + length).with_z(base - ((1 + f) * length) + 3), }) - .fill(sprite_fill.clone()); + .fill(sprite_fill, filler); painter .cylinder(Aabb { min: (room_center - length + 1).with_z(base - ((1 + f) * length) + 1), max: (room_center + length - 1).with_z(base - ((1 + f) * length) + 3), }) - .clear(); + .clear(filler); painter .sphere(Aabb { min: (entries_clear - 3).with_z(base - ((1 + f) * length)), max: (entries_clear + 3).with_z(base - ((1 + f) * length) + 4), }) - .clear(); + .clear(filler); // villagers in each room let spawn_pos = (room_center - 3).with_z(base - ((1 + f) * length)); let npc_amount = RandomField::new(0).get(spawn_pos) % 3; for _ in 0..npc_amount { - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.villager", &mut rng), ); @@ -730,7 +757,7 @@ impl Structure for SavannahPit { RandomField::new(0).get(position.with_z(base)) as usize % sprites.len(), ); - painter.sprite(position.with_z(base - ((1 + f) * length)), sprite); + painter.sprite(position.with_z(base - ((1 + f) * length)), sprite, filler); } } }, @@ -756,7 +783,7 @@ impl Structure for SavannahPit { RandomField::new(0).get(position.with_z(base)) as usize % sprites.len(), ); - painter.sprite(position.with_z(base - ((1 + f) * length)), sprite); + painter.sprite(position.with_z(base - ((1 + f) * length)), sprite, filler); } } }, @@ -769,25 +796,22 @@ impl Structure for SavannahPit { min: (room_center - length + 1).with_z(base + length), max: (room_center + length - 1).with_z(base + length + 1), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); let small_stairs_pos = room_center; let small_stair_radius = 4.0; let small_stairs_clear = painter.cylinder(Aabb { min: (small_stairs_pos + 1 - small_stair_radius as i32).with_z(base - (3 * length)), max: (small_stairs_pos - 1 + small_stair_radius as i32).with_z(base + length + 3), }); - small_stairs_clear.clear(); - painter - .prim(Primitive::sampling( - small_stairs_clear, - dungeon::spiral_staircase( - small_stairs_pos.with_z(base - (3 * length)), - small_stair_radius, - 0.5, - (length - 2) as f32, - ), - )) - .fill(wood_dark.clone()); + small_stairs_clear.clear(filler); + let stair_fill = dungeon::spiral_staircase( + small_stairs_pos.with_z(base - (3 * length)), + small_stair_radius, + 0.5, + (length - 2) as f32, + ); + small_stairs_clear + .fill(filler.sampling(&move |pos| if stair_fill(pos) { wood_dark_fn(pos) } else { None }), filler); //small top cones let top_var = RandomField::new(0).get(room_center.with_z(base)) % 4; if let 0..=2 = top_var { @@ -798,7 +822,7 @@ impl Structure for SavannahPit { max: (room_center + length) .with_z(base + (2 * length) + (length / 2) + 2 + (3 * top_var) as i32), }) - .fill(reed.clone()); + .fill(reed, filler); painter .cone(Aabb { min: (room_center - length) @@ -806,27 +830,26 @@ impl Structure for SavannahPit { max: (room_center + length) .with_z(base + (2 * length) + (length / 2) + 1 + (3 * top_var) as i32), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: (room_center - 1).with_z(base + length + 1), max: (room_center + 1) .with_z(base + (2 * length) + 5 + (3 * top_var) as i32), }) - .fill(wood_dark.clone()); + .fill(wood_dark, filler); } // villagers on platforms let spawn_pos = (room_center - 2).with_z(base + length + 2); let npc_amount = RandomField::new(0).get(spawn_pos) % 3; for _ in 0..npc_amount { - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.villager", &mut rng), ); } let lantern_pos = center + dir * ((3 * length) - (length / 3) + 4); - painter.sprite(lantern_pos.with_z(base + length + 1), SpriteKind::Lantern); + painter.sprite(lantern_pos.with_z(base + length + 1), SpriteKind::Lantern, filler); } // floor room lamps for dir in SQUARE_4 { @@ -841,6 +864,7 @@ impl Structure for SavannahPit { lamp_pos1.with_z(base - (f * length) + 5), SpriteKind::WallLampSmall, 4 - (4 * dir.y) as u8, + filler, ); let corner_pos2 = Vec2::new(center.x - (2 * length) - 6, center.y - 1); let lamp_pos2 = Vec2::new( @@ -851,6 +875,7 @@ impl Structure for SavannahPit { lamp_pos2.with_z(base - (f * length) + 5), SpriteKind::WallLampSmall, 2 + (4 * dir.x) as u8, + filler, ); } } @@ -866,20 +891,20 @@ impl Structure for SavannahPit { min: (ws_center - 2).with_z(base - (f * length)), max: (ws_center + 2).with_z(base - (f * length) + 2), }) - .fill(clay.clone()); + .fill(clay, filler); painter .aabb(Aabb { min: (ws_center - 1).with_z(base - (f * length) + 1), max: (ws_center + 1).with_z(base - (f * length) + 2), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: (ws_center - 1).with_z(base - (f * length)), max: (ws_center + 1).with_z(base - (f * length) + 1), }) - .fill(Fill::Block(Block::air(SpriteKind::Ember))); + .fill(filler.block(Block::air(SpriteKind::Ember)), filler); let mut stations = vec![ SpriteKind::CraftingBench, SpriteKind::Forge, @@ -899,7 +924,7 @@ impl Structure for SavannahPit { RandomField::new(0).get(position.with_z(base)) as usize % stations.len(), ); - painter.sprite(position.with_z(base - (f * length)), cr_station); + painter.sprite(position.with_z(base - (f * length)), cr_station, filler); } } @@ -913,20 +938,20 @@ impl Structure for SavannahPit { min: (k_center - 2).with_z(base - (f * length)), max: (k_center + 2).with_z(base - (f * length) + 2), }) - .fill(clay.clone()); + .fill(clay, filler); painter .aabb(Aabb { min: (k_center - 1).with_z(base - (f * length) + 1), max: (k_center + 1).with_z(base - (f * length) + 2), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: (k_center - 1).with_z(base - (f * length)), max: (k_center + 1).with_z(base - (f * length) + 1), }) - .fill(Fill::Block(Block::air(SpriteKind::Ember))); + .fill(filler.block(Block::air(SpriteKind::Ember)), filler); let mut stations = vec![SpriteKind::CookingPot, SpriteKind::Cauldron]; 'outer2: for d in 0..2 { for dir in NEIGHBORS { @@ -938,7 +963,7 @@ impl Structure for SavannahPit { RandomField::new(0).get(position.with_z(base)) as usize % stations.len(), ); - painter.sprite(position.with_z(base - (f * length)), cr_station); + painter.sprite(position.with_z(base - (f * length)), cr_station, filler); } } } @@ -948,8 +973,7 @@ impl Structure for SavannahPit { let spawn_pos = (center - 5).with_z(base + length - (length * a)); let npc_amount = RandomField::new(0).get(spawn_pos) % 4; for _ in 0..npc_amount { - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.villager", &mut rng), ); @@ -959,7 +983,7 @@ impl Structure for SavannahPit { // campfire let campfire_pos = (center - 10).with_z(base); - painter.spawn(EntityInfo::at(campfire_pos.map(|e| e as f32)).into_waypoint()); + filler.spawn(EntityInfo::at(campfire_pos.map(|e| e as f32)).into_waypoint()); // underground market hall let stairs_pos = Vec2::new(center.x, center.y - (2 * length) + 1); @@ -972,33 +996,33 @@ impl Structure for SavannahPit { min: (stairs_pos - (length / 2) - 1).with_z(base - (5 * length) + 3), max: (stairs_pos + (length / 2) + 1).with_z(base - (3 * length)), }) - .clear(); + .clear(filler); // market hall room painter .cylinder(Aabb { min: (center - (4 * length) + 1).with_z(base - (5 * length) + 3), max: (center + (4 * length) - 1).with_z(base - (3 * length) - 2), }) - .clear(); + .clear(filler); // wood ring with sprites painter .cylinder(Aabb { min: (center - (4 * length) + 1).with_z(base - (5 * length) + 4), max: (center + (4 * length) - 1).with_z(base - (5 * length) + 5), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .cylinder(Aabb { min: (center - (4 * length) + 1).with_z(base - (5 * length) + 5), max: (center + (4 * length) - 1).with_z(base - (5 * length) + 6), }) - .fill(sprite_fill); + .fill(sprite_fill, filler); painter .cylinder(Aabb { min: (center - (4 * length) + 2).with_z(base - (5 * length) + 3), max: (center + (4 * length) - 2).with_z(base - (5 * length) + 6), }) - .clear(); + .clear(filler); // market hall lamps for dir in SQUARE_4 { let corner_pos1 = Vec2::new(center.x - 1, center.y - (3 * length) - 4); @@ -1011,6 +1035,7 @@ impl Structure for SavannahPit { lamp_pos1.with_z(base - (5 * length) + 8), SpriteKind::WallLampSmall, 4 - (4 * dir.y) as u8, + filler, ); let corner_pos2 = Vec2::new(center.x - (3 * length) - 4, center.y - 1); let lamp_pos2 = Vec2::new( @@ -1021,6 +1046,7 @@ impl Structure for SavannahPit { lamp_pos2.with_z(base - (5 * length) + 8), SpriteKind::WallLampSmall, 2 + (4 * dir.x) as u8, + filler, ); } // market hall entry stairs @@ -1029,13 +1055,13 @@ impl Structure for SavannahPit { min: (cone_pos - (3 * length)).with_z(base - (5 * length) + 3), max: (cone_pos + (3 * length)).with_z(base - (3 * length)), }) - .fill(clay.clone()); + .fill(clay, filler); painter .cylinder(Aabb { min: (cyl_pos - (2 * length)).with_z(base - (5 * length) + 3), max: (cyl_pos + (2 * length)).with_z(base - (3 * length) - 1), }) - .fill(clay.clone()); + .fill(clay, filler); // crates for dir in CARDINALS { let crate_pos = crates_pos + dir * length; @@ -1044,30 +1070,30 @@ impl Structure for SavannahPit { min: (crate_pos - 3).with_z(base - (5 * length) + 3), max: (crate_pos + 3).with_z(base - (5 * length) + 4), }) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .cylinder(Aabb { min: (crate_pos - 3).with_z(base - (5 * length) + 4), max: (crate_pos + 3).with_z(base - (5 * length) + 5), }) // placeholder for market items - .fill(Fill::Block(Block::air(SpriteKind::Planter))); + .fill(filler.block(Block::air(SpriteKind::Planter)), filler); painter .cylinder(Aabb { min: (crate_pos - 2).with_z(base - (5 * length) + 3), max: (crate_pos + 2).with_z(base - (5 * length) + 5), }) - .clear(); + .clear(filler); // villager and lantern in each stand let spawn_pos = (crate_pos - 1).with_z(base - (5 * length) + 3); - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.villager", &mut rng), ); painter.sprite( (crate_pos + 1).with_z(base - (5 * length) + 3), SpriteKind::Lantern, + filler, ); } // fridges @@ -1081,28 +1107,27 @@ impl Structure for SavannahPit { min: (fridge_pos - 1).with_z(base - (5 * length) + 3), max: (fridge_pos + 2).with_z(base - (5 * length) + 6), }) - .fill(snow_fill.clone()); + .fill(snow_fill, filler); painter .aabb(Aabb { min: Vec2::new(fridge_pos.x, fridge_pos.y - 1).with_z(base - (5 * length) + 4), max: Vec2::new(fridge_pos.x + 1, fridge_pos.y + 2) .with_z(base - (5 * length) + 5), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec2::new(fridge_pos.x, fridge_pos.y - 1).with_z(base - (5 * length) + 4), max: Vec2::new(fridge_pos.x + 1, fridge_pos.y + 2).with_z(base - (5 * length) + 5), }) // placeholder for market items - .fill(Fill::Block(Block::air(SpriteKind::Crate))); + .fill(filler.block(Block::air(SpriteKind::Crate)), filler); } // villagers in market hall let spawn_pos = (center + 10).with_z(base - (5 * length) + 4); let npc_amount = RandomField::new(0).get(spawn_pos) % 12; for _ in 0..npc_amount { - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.villager", &mut rng), ); @@ -1115,7 +1140,7 @@ impl Structure for SavannahPit { min: (outer_support - 3).with_z(base - (5 * length) + 3), max: (outer_support + 3).with_z(base - (3 * length) - 2), }) - .fill(wood_dark.clone()); + .fill(wood_dark, filler); } // wall @@ -1132,7 +1157,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height / 2) - ((wall_height / 2) * w)), wall_size, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( (center - (6 * wall_length)).with_z(base - ((wall_height / 2) * w)), @@ -1140,7 +1165,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height / 2) - ((wall_height / 2) * w)), wall_size, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x - (7 * wall_length), center.y) @@ -1149,7 +1174,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height / 2) - ((wall_height / 2) * w)), wall_size, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x - (6 * wall_length), center.y + (6 * wall_length)) @@ -1158,7 +1183,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height / 2) - ((wall_height / 2) * w)), wall_size, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x, center.y + (7 * wall_length)) @@ -1166,7 +1191,7 @@ impl Structure for SavannahPit { (center + (6 * wall_length)).with_z(base - ((wall_height / 2) * w)), wall_size, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( (center + (6 * wall_length)).with_z(base - ((wall_height / 2) * w)), @@ -1174,7 +1199,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height / 2) - ((wall_height / 2) * w)), wall_size, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x + (7 * wall_length), center.y) @@ -1183,7 +1208,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height / 2) - ((wall_height / 2) * w)), wall_size, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x + (6 * wall_length), center.y - (6 * wall_length)) @@ -1192,7 +1217,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height / 2) - ((wall_height / 2) * w)), wall_size, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); } for w in 0..2 { // upper wall @@ -1203,7 +1228,7 @@ impl Structure for SavannahPit { (center - (6 * wall_length)).with_z(base + (wall_height * w)), wall_size + (2 * w) as f32, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( (center - (6 * wall_length)).with_z(base + (wall_height * w)), @@ -1211,7 +1236,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height * w)), wall_size + (2 * w) as f32, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x - (7 * wall_length), center.y) @@ -1220,7 +1245,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height * w)), wall_size + (2 * w) as f32, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x - (6 * wall_length), center.y + (6 * wall_length)) @@ -1229,7 +1254,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height * w)), wall_size + (2 * w) as f32, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x, center.y + (7 * wall_length)) @@ -1237,7 +1262,7 @@ impl Structure for SavannahPit { (center + (6 * wall_length)).with_z(base + (wall_height * w)), wall_size + (2 * w) as f32, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( (center + (6 * wall_length)).with_z(base + (wall_height * w)), @@ -1245,7 +1270,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height * w)), wall_size + (2 * w) as f32, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x + (7 * wall_length), center.y) @@ -1254,7 +1279,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height * w)), wall_size + (2 * w) as f32, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); painter .line( Vec2::new(center.x + (6 * wall_length), center.y - (6 * wall_length)) @@ -1263,7 +1288,7 @@ impl Structure for SavannahPit { .with_z(base + (wall_height * w)), wall_size + (2 * w) as f32, ) - .fill(wood_light.clone()); + .fill(wood_light, filler); } // cut out for walk painter @@ -1272,14 +1297,14 @@ impl Structure for SavannahPit { (center - (6 * wall_length)).with_z(base + 3 + wall_height), wall_size + 3_f32, ) - .clear(); + .clear(filler); painter .line( (center - (6 * wall_length)).with_z(base + 3 + wall_height), Vec2::new(center.x - (7 * wall_length), center.y).with_z(base + 3 + wall_height), wall_size + 3_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x - (7 * wall_length), center.y).with_z(base + 3 + wall_height), @@ -1287,7 +1312,7 @@ impl Structure for SavannahPit { .with_z(base + 3 + wall_height), wall_size + 3_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x - (6 * wall_length), center.y + (6 * wall_length)) @@ -1295,21 +1320,21 @@ impl Structure for SavannahPit { Vec2::new(center.x, center.y + (7 * wall_length)).with_z(base + 3 + wall_height), wall_size + 3_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x, center.y + (7 * wall_length)).with_z(base + 3 + wall_height), (center + (6 * wall_length)).with_z(base + 3 + wall_height), wall_size + 3_f32, ) - .clear(); + .clear(filler); painter .line( (center + (6 * wall_length)).with_z(base + 3 + wall_height), Vec2::new(center.x + (7 * wall_length), center.y).with_z(base + 3 + wall_height), wall_size + 3_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x + (7 * wall_length), center.y).with_z(base + 3 + wall_height), @@ -1317,7 +1342,7 @@ impl Structure for SavannahPit { .with_z(base + 3 + wall_height), wall_size + 3_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x + (6 * wall_length), center.y - (6 * wall_length)) @@ -1325,7 +1350,7 @@ impl Structure for SavannahPit { Vec2::new(center.x, center.y - (7 * wall_length)).with_z(base + 3 + wall_height), wall_size + 3_f32, ) - .clear(); + .clear(filler); // wall tunnel @@ -1335,14 +1360,14 @@ impl Structure for SavannahPit { (center - (6 * wall_length)).with_z(base - (2 * length)), wall_size * 3_f32, ) - .fill(clay.clone()); + .fill(clay, filler); painter .line( (center - (6 * wall_length)).with_z(base - (2 * length)), Vec2::new(center.x - (7 * wall_length), center.y).with_z(base - (2 * length)), wall_size * 3_f32, ) - .fill(clay.clone()); + .fill(clay, filler); painter .line( Vec2::new(center.x - (7 * wall_length), center.y).with_z(base - (2 * length)), @@ -1350,7 +1375,7 @@ impl Structure for SavannahPit { .with_z(base - (2 * length)), wall_size * 3_f32, ) - .fill(clay.clone()); + .fill(clay, filler); painter .line( Vec2::new(center.x - (6 * wall_length), center.y + (6 * wall_length)) @@ -1358,21 +1383,21 @@ impl Structure for SavannahPit { Vec2::new(center.x, center.y + (7 * wall_length)).with_z(base - (2 * length)), wall_size * 3_f32, ) - .fill(clay.clone()); + .fill(clay, filler); painter .line( Vec2::new(center.x, center.y + (7 * wall_length)).with_z(base - (2 * length)), (center + (6 * wall_length)).with_z(base - (2 * length)), wall_size * 3_f32, ) - .fill(clay.clone()); + .fill(clay, filler); painter .line( (center + (6 * wall_length)).with_z(base - (2 * length)), Vec2::new(center.x + (7 * wall_length), center.y).with_z(base - (2 * length)), wall_size * 3_f32, ) - .fill(clay.clone()); + .fill(clay, filler); painter .line( Vec2::new(center.x + (7 * wall_length), center.y).with_z(base - (2 * length)), @@ -1380,7 +1405,7 @@ impl Structure for SavannahPit { .with_z(base - (2 * length)), wall_size * 3_f32, ) - .fill(clay.clone()); + .fill(clay, filler); painter .line( Vec2::new(center.x + (6 * wall_length), center.y - (6 * wall_length)) @@ -1388,7 +1413,7 @@ impl Structure for SavannahPit { Vec2::new(center.x, center.y - (7 * wall_length)).with_z(base - (2 * length)), wall_size * 3_f32, ) - .fill(clay.clone()); + .fill(clay, filler); painter .line( @@ -1396,14 +1421,14 @@ impl Structure for SavannahPit { (center - (6 * wall_length)).with_z(base - (2 * length)), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( (center - (6 * wall_length)).with_z(base - (2 * length)), Vec2::new(center.x - (7 * wall_length), center.y).with_z(base - (2 * length)), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x - (7 * wall_length), center.y).with_z(base - (2 * length)), @@ -1411,7 +1436,7 @@ impl Structure for SavannahPit { .with_z(base - (2 * length)), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x - (6 * wall_length), center.y + (6 * wall_length)) @@ -1419,21 +1444,21 @@ impl Structure for SavannahPit { Vec2::new(center.x, center.y + (7 * wall_length)).with_z(base - (2 * length)), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x, center.y + (7 * wall_length)).with_z(base - (2 * length)), (center + (6 * wall_length)).with_z(base - (2 * length)), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( (center + (6 * wall_length)).with_z(base - (2 * length)), Vec2::new(center.x + (7 * wall_length), center.y).with_z(base - (2 * length)), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x + (7 * wall_length), center.y).with_z(base - (2 * length)), @@ -1441,7 +1466,7 @@ impl Structure for SavannahPit { .with_z(base - (2 * length)), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x + (6 * wall_length), center.y - (6 * wall_length)) @@ -1449,7 +1474,7 @@ impl Structure for SavannahPit { Vec2::new(center.x, center.y - (7 * wall_length)).with_z(base - (2 * length)), wall_size * 2_f32, ) - .clear(); + .clear(filler); // passages to rooms painter .line( @@ -1458,14 +1483,14 @@ impl Structure for SavannahPit { .with_z(base - (2 * length) + 2), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( (center - (6 * wall_length)).with_z(base - (2 * length)), (center - (4 * wall_length) + 1).with_z(base - (2 * length) + 2), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x - (7 * wall_length), center.y).with_z(base - (2 * length)), @@ -1473,7 +1498,7 @@ impl Structure for SavannahPit { .with_z(base - (2 * length) + 2), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x - (6 * wall_length), center.y + (6 * wall_length)) @@ -1485,7 +1510,7 @@ impl Structure for SavannahPit { .with_z(base - (2 * length) + 2), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x, center.y + (7 * wall_length)).with_z(base - (2 * length)), @@ -1493,14 +1518,14 @@ impl Structure for SavannahPit { .with_z(base - (2 * length) + 2), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( (center + (6 * wall_length)).with_z(base - (2 * length)), (center + (4 * wall_length) - 1).with_z(base - (2 * length) + 2), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x + (7 * wall_length), center.y).with_z(base - (2 * length)), @@ -1508,7 +1533,7 @@ impl Structure for SavannahPit { .with_z(base - (2 * length) + 2), wall_size * 2_f32, ) - .clear(); + .clear(filler); painter .line( Vec2::new(center.x + (6 * wall_length), center.y - (6 * wall_length)) @@ -1520,7 +1545,7 @@ impl Structure for SavannahPit { .with_z(base - (2 * length) + 2), wall_size * 2_f32, ) - .clear(); + .clear(filler); // watchtowers for dir in DIAGONALS { @@ -1534,18 +1559,15 @@ impl Structure for SavannahPit { max: (small_stairs_pos - 1 + small_stair_radius as i32) .with_z(base + (length / 2) + 2), }); - small_stairs_clear.clear(); - painter - .prim(Primitive::sampling( - small_stairs_clear, - dungeon::spiral_staircase( - small_stairs_pos.with_z(base - (2 * length) - 2), - small_stair_radius, - 0.5, - (length - 2) as f32, - ), - )) - .fill(wood_dark.clone()); + small_stairs_clear.clear(filler); + let stair_fill = dungeon::spiral_staircase( + small_stairs_pos.with_z(base - (2 * length) - 2), + small_stair_radius, + 0.5, + (length - 2) as f32, + ); + small_stairs_clear + .fill(filler.sampling(&move |pos| if stair_fill(pos) { wood_dark_fn(pos) } else { None }), filler); // top cone let top_var = RandomField::new(0).get(tower_center.with_z(base)) % 4; if let 0..=2 = top_var { @@ -1556,7 +1578,7 @@ impl Structure for SavannahPit { max: (tower_center + length + 2) .with_z(base + (2 * length) + (length / 2) + (3 * top_var) as i32), }) - .fill(reed.clone()); + .fill(reed, filler); painter .cone(Aabb { min: (tower_center - length - 2) @@ -1564,32 +1586,32 @@ impl Structure for SavannahPit { max: (tower_center + length + 2) .with_z(base + (2 * length) + (length / 2) - 1 + (3 * top_var) as i32), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (tower_center - 1).with_z(base + (length / 2) - 1), max: (tower_center + 1) .with_z(base + (2 * length) + (length / 2) - 2 + (3 * top_var) as i32), }) - .fill(wood_dark.clone()); + .fill(wood_dark, filler); } // guards and lanterns on towers let spawn_pos = (tower_center - 2).with_z(base + (length / 2) + 2); let npc_amount = 1 + RandomField::new(0).get(spawn_pos) % 3; for _ in 1..(npc_amount + 1) { - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.guard", &mut rng), ); } let lantern_pos = tower_center - 3; - painter.sprite(lantern_pos.with_z(base + (length / 2)), SpriteKind::Lantern); + painter.sprite(lantern_pos.with_z(base + (length / 2)), SpriteKind::Lantern, filler); // tunnel lanterns let tunnel_lantern_pos = tower_center - 3; painter.sprite( tunnel_lantern_pos.with_z(base - (2 * length) - 2), SpriteKind::Lantern, + filler, ); } // watchtowers with entries @@ -1601,20 +1623,20 @@ impl Structure for SavannahPit { min: (tower_center - (2 * length)).with_z(base - length), max: (tower_center + (2 * length)).with_z(base), }) - .fill(clay.clone()); + .fill(clay, filler); painter .cylinder(Aabb { min: (tower_center - (length / 2) - 2).with_z(base - 1), max: (tower_center + (length / 2) + 2).with_z(base + 2), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (tower_center - (length / 2)).with_z(base + 2), max: (tower_center + (length / 2)).with_z(base + 3), }) - .clear(); + .clear(filler); // top cone let top_var = RandomField::new(0).get(tower_center.with_z(base)) % 4; if let 0..=2 = top_var { @@ -1625,7 +1647,7 @@ impl Structure for SavannahPit { max: (tower_center + length + 2) .with_z(base + (2 * length) + (length / 2) + (3 * top_var) as i32), }) - .fill(reed.clone()); + .fill(reed, filler); painter .cone(Aabb { min: (tower_center - length - 2) @@ -1633,33 +1655,33 @@ impl Structure for SavannahPit { max: (tower_center + length + 2) .with_z(base + (2 * length) + (length / 2) - 1 + (3 * top_var) as i32), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (tower_center - 1).with_z(base + (length / 2) - 1), max: (tower_center + 1) .with_z(base + (2 * length) + (length / 2) - 2 + (3 * top_var) as i32), }) - .fill(wood_dark.clone()); + .fill(wood_dark, filler); } // guards and lanterns on towers let spawn_pos = (tower_center - 2).with_z(base + (length / 2) + 2); let npc_amount = 1 + RandomField::new(0).get(spawn_pos) % 3; for _ in 1..(npc_amount + 1) { - let mut rng = thread_rng(); - painter.spawn( + filler.spawn( EntityInfo::at(spawn_pos.map(|e| e as f32)) .with_asset_expect("common.entity.village.guard", &mut rng), ); } let lantern_pos = center + dir * (7 * wall_length); - painter.sprite(lantern_pos.with_z(base + (length / 2)), SpriteKind::Lantern); + painter.sprite(lantern_pos.with_z(base + (length / 2)), SpriteKind::Lantern, filler); // tunnel lanterns let tunnel_lantern_pos = tower_center; painter.sprite( tunnel_lantern_pos.with_z(base - (2 * length) - 2), SpriteKind::Lantern, + filler, ); - } */ + } } } diff --git a/world/src/site2/plot/sea_chapel.rs b/world/src/site2/plot/sea_chapel.rs index c0d09d6fb5..ecb9d6ee10 100644 --- a/world/src/site2/plot/sea_chapel.rs +++ b/world/src/site2/plot/sea_chapel.rs @@ -35,8 +35,35 @@ impl Structure for SeaChapel { const UPDATE_FN: &'static [u8] = b"render_seachapel\0"; #[cfg_attr(feature = "be-dyn-lib", export_name = "render_seachapel")] - fn render_inner<'a>(&self, _site: &Site, land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) { - /* let base = self.alt + 1; + fn render_inner<'a>(&self, _site: &Site, _land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) { + let base = self.alt + 1; + let center = self.bounds.center(); + match (RandomField::new(0).get(center.with_z(base - 1))) % 2 { + 0 => self.render_chapel(painter, Self::white_polished_fn(filler), filler), + _ => self.render_chapel(painter, Self::white_coral_fn, filler), + } + } +} + +impl SeaChapel { + #[inline(always)] + fn white_coral_fn(center: Vec3) -> Option { + let c = (RandomField::new(0).get(center) % 13) as u8 * 10 + 120; + Some(Block::new(BlockKind::Rock, Rgb::new(c, c, c))) + } + + #[inline(always)] + fn white_polished_fn(filler: &mut FillFn<'_, '_, F>) -> impl Fn(Vec3) -> Option + Copy { + filler.brick_fn(BlockKind::Rock, Rgb::new(202, 202, 202), 24) + } + + fn render_chapel<'a, F: Filler>( + &self, + painter: &Painter<'a>, + white_fn: impl Fn(Vec3) -> Option + Copy, + filler: &mut FillFn<'a, '_, F>, + ) { + let base = self.alt + 1; let center = self.bounds.center(); let diameter = 54; let mut rng = thread_rng(); @@ -45,43 +72,38 @@ impl Structure for SeaChapel { 0 => { //color_scheme_1 blue ( - Fill::Brick(BlockKind::Rock, Rgb::new(0, 51, 209), 24), - Fill::Brick(BlockKind::Rock, Rgb::new(24, 115, 242), 12), + filler.brick(BlockKind::Rock, Rgb::new(0, 51, 209), 24), + filler.brick(BlockKind::Rock, Rgb::new(24, 115, 242), 12), ) }, _ => { //color_scheme_2 turquoise ( - Fill::Brick(BlockKind::Rock, Rgb::new(0, 55, 71), 24), - Fill::Brick(BlockKind::Rock, Rgb::new(2, 106, 129), 24), + filler.brick(BlockKind::Rock, Rgb::new(0, 55, 71), 24), + filler.brick(BlockKind::Rock, Rgb::new(2, 106, 129), 24), ) }, }; - let water = Fill::Block(Block::new(BlockKind::Water, Rgb::zero())); - let rope = Fill::Block(Block::air(SpriteKind::Rope)); - let ropefix1 = Fill::Brick(BlockKind::Rock, Rgb::new(80, 75, 35), 24); - let ropefix2 = Fill::Brick(BlockKind::Rock, Rgb::new(172, 172, 172), 4); - let white_polished = Fill::Brick(BlockKind::Rock, Rgb::new(202, 202, 202), 24); - let white_coral = Fill::Sampling(Arc::new(|center| { - let c = (RandomField::new(0).get(center) % 13) as u8 * 10 + 120; - Some(Block::new(BlockKind::Rock, Rgb::new(c, c, c))) - })); - let white = match (RandomField::new(0).get(center.with_z(base - 1))) % 2 { - 0 => white_polished, - _ => white_coral.clone(), - }; - let gold = Fill::Brick(BlockKind::GlowingRock, Rgb::new(245, 232, 0), 10); - let gold_chain = Fill::Block(Block::air(SpriteKind::SeaDecorChain)); - let gold_decor = Fill::Block(Block::air(SpriteKind::SeaDecorBlock)); - let window_hor = Fill::Block(Block::air(SpriteKind::SeaDecorWindowHor)); - let window_ver = Fill::Block(Block::air(SpriteKind::SeaDecorWindowVer)); - let window_ver2 = Fill::Block( + let water = filler.block(Block::new(BlockKind::Water, Rgb::zero())); + let rope = filler.block(Block::air(SpriteKind::Rope)); + let ropefix1 = filler.brick(BlockKind::Rock, Rgb::new(80, 75, 35), 24); + let ropefix2 = filler.brick(BlockKind::Rock, Rgb::new(172, 172, 172), 4); + let white_polished_fn = Self::white_polished_fn(filler); + let white_polished = filler.sampling(white_polished_fn); + let white_coral = filler.sampling(Self::white_coral_fn); + let white = filler.sampling(white_fn); + let gold = filler.brick(BlockKind::GlowingRock, Rgb::new(245, 232, 0), 10); + let gold_chain = filler.block(Block::air(SpriteKind::SeaDecorChain)); + let gold_decor = filler.block(Block::air(SpriteKind::SeaDecorBlock)); + let window_hor = filler.block(Block::air(SpriteKind::SeaDecorWindowHor)); + let window_ver = filler.block(Block::air(SpriteKind::SeaDecorWindowVer)); + let window_ver2 = filler.block( Block::air(SpriteKind::SeaDecorWindowVer) .with_ori(2) .unwrap(), ); - let glass_barrier = Fill::Block(Block::air(SpriteKind::GlassBarrier)); - let sea_urchins = Fill::Block(Block::air(SpriteKind::SeaUrchin)); + let glass_barrier = filler.block(Block::air(SpriteKind::GlassBarrier)); + let sea_urchins = filler.block(Block::air(SpriteKind::SeaUrchin)); // random exit from water basin to side building let mut connect_gate_types = vec![ SpriteKind::GlassBarrier, @@ -99,7 +121,7 @@ impl Structure for SeaChapel { max: (center_b1 + (diameter / 3) - 2) .with_z(base - (diameter / 8) + (diameter / 2) - 7), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_b1 - (diameter / 3) + 1) @@ -107,7 +129,7 @@ impl Structure for SeaChapel { max: (center_b1 + (diameter / 3) - 1) .with_z(base - (diameter / 8) + (diameter / 2) - 6), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_b1 - (diameter / 3)) @@ -115,7 +137,7 @@ impl Structure for SeaChapel { max: (center_b1 + (diameter / 3)) .with_z(base - (diameter / 8) + (diameter / 2) - 5), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_b1 - (diameter / 3) - 1) @@ -123,7 +145,7 @@ impl Structure for SeaChapel { max: (center_b1 + (diameter / 3) + 1) .with_z(base - (diameter / 8) + (diameter / 2) - 4), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_b1 - (diameter / 3)) @@ -131,7 +153,7 @@ impl Structure for SeaChapel { max: (center_b1 + (diameter / 3)) .with_z(base - (diameter / 8) + (diameter / 2) - 4), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (center_b1 - (diameter / 3) - 2) @@ -139,7 +161,7 @@ impl Structure for SeaChapel { max: (center_b1 + (diameter / 3) + 2) .with_z(base - (diameter / 8) + (diameter / 2) - 3), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .cylinder(Aabb { min: (center_b1 - (diameter / 3) - 1) @@ -147,7 +169,7 @@ impl Structure for SeaChapel { max: (center_b1 + (diameter / 3) + 1) .with_z(base - (diameter / 8) + (diameter / 2) - 3), }) - .clear(); + .clear(filler); // balcony2 let center_b2 = Vec2::new(center.x, center.y + (diameter / 2) - (diameter / 4)); painter @@ -157,7 +179,7 @@ impl Structure for SeaChapel { max: (center_b2 + (diameter / 3) - 2) .with_z(base - (diameter / 8) + (diameter / 2) - 7), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_b2 - (diameter / 3) + 1) @@ -165,7 +187,7 @@ impl Structure for SeaChapel { max: (center_b2 + (diameter / 3) - 1) .with_z(base - (diameter / 8) + (diameter / 2) - 6), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_b2 - (diameter / 3)) @@ -173,7 +195,7 @@ impl Structure for SeaChapel { max: (center_b2 + (diameter / 3)) .with_z(base - (diameter / 8) + (diameter / 2) - 5), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_b2 - (diameter / 3) - 1) @@ -181,7 +203,7 @@ impl Structure for SeaChapel { max: (center_b2 + (diameter / 3) + 1) .with_z(base - (diameter / 8) + (diameter / 2) - 4), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_b2 - (diameter / 3)) @@ -189,7 +211,7 @@ impl Structure for SeaChapel { max: (center_b2 + (diameter / 3)) .with_z(base - (diameter / 8) + (diameter / 2) - 4), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (center_b2 - (diameter / 3) - 2) @@ -197,7 +219,7 @@ impl Structure for SeaChapel { max: (center_b2 + (diameter / 3) + 2) .with_z(base - (diameter / 8) + (diameter / 2) - 3), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .cylinder(Aabb { min: (center_b2 - (diameter / 3) - 1) @@ -205,14 +227,14 @@ impl Structure for SeaChapel { max: (center_b2 + (diameter / 3) + 1) .with_z(base - (diameter / 8) + (diameter / 2) - 3), }) - .clear(); + .clear(filler); // chapel bottom painter .sphere(Aabb { min: (center - (diameter / 2)).with_z(base - (2 * (diameter / 3))), max: (center + (diameter / 2)).with_z(base - (2 * (diameter / 3)) + diameter), }) - .fill(white.clone()); + .fill(white, filler); // chapel clear bottom painter .sphere(Aabb { @@ -220,14 +242,14 @@ impl Structure for SeaChapel { max: (center + (diameter / 2) - 1) .with_z(base - (2 * (diameter / 3)) + diameter - 1), }) - .clear(); + .clear(filler); // chapel main room painter .sphere(Aabb { min: (center - (diameter / 2)).with_z(base - (diameter / 8)), max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), }) - .fill(white.clone()); + .fill(white, filler); // chapel main room entry1 stairs1 // entry1 white floor painter @@ -243,7 +265,7 @@ impl Structure for SeaChapel { base + (diameter / 8) - 1, ), }) - .fill(white.clone()); + .fill(white, filler); painter .ramp_inset( Aabb { @@ -261,7 +283,7 @@ impl Structure for SeaChapel { 14, Dir::X, ) - .fill(white.clone()); + .fill(white, filler); // chapel main room entry2 stairs // entry2 white floor painter @@ -277,7 +299,7 @@ impl Structure for SeaChapel { base + (diameter / 8) - 1, ), }) - .fill(white.clone()); + .fill(white, filler); painter .ramp_inset( Aabb { @@ -295,29 +317,34 @@ impl Structure for SeaChapel { 14, Dir::NegX, ) - .fill(white.clone()); + .fill(white, filler); + let main_upper_half = painter.cylinder(Aabb { + min: (center - (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)), + max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), + }); // chapel 1st washed out top painter .sphere(Aabb { min: (center - (diameter / 2)).with_z(base - (diameter / 8)), max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), }) - .without(painter.cylinder(Aabb { - min: (center - (diameter / 2)).with_z(base - (diameter / 8)), - max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)), - })) - .fill(washed.clone()); + .intersect(main_upper_half) + .fill(washed, filler); // chapel 1st top painter .sphere(Aabb { min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8)), max: (center + (diameter / 2)).with_z(base - (diameter / 8) + diameter), }) - .without(painter.cylinder(Aabb { + .intersect(main_upper_half) + .fill(top, filler); + painter + .cylinder(Aabb { min: (center - (diameter / 2)).with_z(base - (diameter / 8)), max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2)), - })) - .fill(top.clone()); + }) + .intersect(main_upper_half) + .clear(filler); // chapel small top room painter .sphere(Aabb { @@ -326,7 +353,12 @@ impl Structure for SeaChapel { max: (center + (diameter / 3)) .with_z(base - (diameter / 8) + diameter + (diameter / 3)), }) - .fill(white.clone()); + .fill(white, filler); + let small_upper_half = painter.cylinder(Aabb { + min: (center - (diameter / 3)).with_z(base - (diameter / 8) + diameter), + max: (center + (diameter / 3)) + .with_z(base - (diameter / 8) + diameter + (diameter / 3)), + }); // chapel small washed out top painter .sphere(Aabb { @@ -335,14 +367,8 @@ impl Structure for SeaChapel { max: (center + (diameter / 3)) .with_z(base - (diameter / 8) + diameter + (diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (center - (diameter / 3)) - .with_z(base - (diameter / 8) + diameter - (diameter / 3)), - max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter), - }), - ) - .fill(washed.clone()); + .intersect(small_upper_half) + .fill(washed, filler); // chapel small top painter .sphere(Aabb { @@ -351,14 +377,18 @@ impl Structure for SeaChapel { max: (center + (diameter / 3)) .with_z(base - (diameter / 8) + diameter + (diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (center - (diameter / 3)) - .with_z(base - (diameter / 8) + diameter - (diameter / 3)), - max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter), - }), - ) - .fill(top.clone()); + .intersect(small_upper_half) + .fill(top, filler); + + painter + .cylinder(Aabb { + min: (center - (diameter / 3)) + .with_z(base - (diameter / 8) + diameter - (diameter / 3)), + max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter), + }) + .intersect(small_upper_half) + .clear(filler); + // ground to top room stairway3 let center_s3 = Vec2::new(center.x, center.y - (diameter / 2)); // stairway3 top room @@ -369,7 +399,13 @@ impl Structure for SeaChapel { max: (center_s3 + (diameter / 6)) .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), }) - .fill(white.clone()); + .fill(white, filler); + let stairway3_upper_half = painter.cylinder(Aabb { + min: (center_s3 - (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 3), + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), + }); // stairway3 top washed out painter .sphere(Aabb { @@ -378,15 +414,8 @@ impl Structure for SeaChapel { max: (center_s3 + (diameter / 6)) .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), }) - .without( - painter.cylinder(Aabb { - min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 3), - }), - ) - .fill(washed.clone()); + .intersect(stairway3_upper_half) + .fill(washed, filler); // stairway3 top painter .sphere(Aabb { @@ -395,15 +424,17 @@ impl Structure for SeaChapel { max: (center_s3 + (diameter / 6)) .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), }) - .without( - painter.cylinder(Aabb { - min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) - 3), - max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 3), - }), - ) - .fill(top.clone()); + .intersect(stairway3_upper_half) + .fill(top, filler); + painter + .cylinder(Aabb { + min: (center_s3 - (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) - 3), + max: (center_s3 + (diameter / 6)) + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 3), + }) + .intersect(stairway3_upper_half) + .clear(filler); // stairway3 top gold ring painter .cylinder(Aabb { @@ -412,7 +443,7 @@ impl Structure for SeaChapel { max: (center_s3 + (diameter / 6)) .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 1), }) - .fill(gold.clone()); + .fill(gold, filler); // stairway3 clear top halfway painter .sphere(Aabb { @@ -421,16 +452,15 @@ impl Structure for SeaChapel { max: (center_s3 + (diameter / 6) - 1) .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 4), }) - .without( + .intersect( painter.cylinder(Aabb { min: (center_s3 - (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2)) - - 2, + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 7), max: (center_s3 + (diameter / 6)) - .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 10) - 3), + .with_z(base - (diameter / 8) + (diameter / 2) + (diameter / 3) - 3), }), ) - .clear(); + .clear(filler); // stairway3 top window1 painter .aabb(Aabb { @@ -445,7 +475,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // stairway3 top window2 painter .aabb(Aabb { @@ -460,7 +490,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // stairway3 top window3 painter @@ -476,7 +506,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) + (diameter / 6) - 4, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // chapel clear room painter @@ -484,7 +514,7 @@ impl Structure for SeaChapel { min: (center - (diameter / 2) + 1).with_z(base - (diameter / 8) + 1), max: (center + (diameter / 2) - 1).with_z(base - (diameter / 8) + diameter - 1), }) - .clear(); + .clear(filler); // chapel main room entry1 gold door frame painter .aabb(Aabb { @@ -499,7 +529,7 @@ impl Structure for SeaChapel { base + (diameter / 8) + 6, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -513,7 +543,7 @@ impl Structure for SeaChapel { base + (diameter / 8) + 5, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -527,7 +557,7 @@ impl Structure for SeaChapel { base + (diameter / 8) + 3, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); // chapel main room entry2 gold door frame painter .aabb(Aabb { @@ -542,7 +572,7 @@ impl Structure for SeaChapel { base + (diameter / 8) + 6, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -556,7 +586,7 @@ impl Structure for SeaChapel { base + (diameter / 8) + 5, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -570,7 +600,7 @@ impl Structure for SeaChapel { base + (diameter / 8) + 3, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); // chapel main room clear entries painter .aabb(Aabb { @@ -585,7 +615,7 @@ impl Structure for SeaChapel { base + (diameter / 8) + 4, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -599,7 +629,7 @@ impl Structure for SeaChapel { base + (diameter / 8) + 5, ), }) - .clear(); + .clear(filler); // chapel main room mobilees let mbl_corner = center - 5; for dir in SQUARE_4 { @@ -613,7 +643,7 @@ impl Structure for SeaChapel { max: (mbl_center + 3) .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset + 2), }) - .fill(top.clone()); + .fill(top, filler); painter .cylinder(Aabb { min: (mbl_center - 2) @@ -621,7 +651,7 @@ impl Structure for SeaChapel { max: (mbl_center + 3) .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: (mbl_center - 1) @@ -629,7 +659,7 @@ impl Structure for SeaChapel { max: (mbl_center + 2) .with_z(base - (diameter / 8) + (diameter / 3) + 2 + mbl_offset), }) - .clear(); + .clear(filler); // chapel main room mobilee chains painter .aabb(Aabb { @@ -644,7 +674,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) + 1, ), }) - .fill(gold_chain.clone()); + .fill(gold_chain, filler); } // chapel main room window1 painter @@ -660,7 +690,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 1, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); painter .aabb(Aabb { @@ -675,7 +705,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 2, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); painter .aabb(Aabb { min: Vec3::new( @@ -689,7 +719,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 3, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // chapel main room window2 to balcony1 painter @@ -705,7 +735,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 1, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -719,7 +749,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 2, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -733,7 +763,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 3, ), }) - .clear(); + .clear(filler); // chapel main room window3 to balcony2 painter .aabb(Aabb { @@ -748,7 +778,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 1, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -762,7 +792,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 2, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -776,14 +806,14 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 3, ), }) - .clear(); + .clear(filler); // chapel gold ring and white floor painter .cylinder(Aabb { min: (center - (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 1), max: (center + (diameter / 2)).with_z(base - (diameter / 8) + (diameter / 2) + 2), }) - .fill(gold.clone()); + .fill(gold, filler); painter .cylinder(Aabb { min: (center - (diameter / 2) + 1) @@ -791,7 +821,7 @@ impl Structure for SeaChapel { max: (center + (diameter / 2) - 1) .with_z(base - (diameter / 8) + (diameter / 2) + 2), }) - .fill(white.clone()); + .fill(white, filler); // chapel main room organ podium let center_o = Vec2::new(center.x - (diameter / 4), center.y + (diameter / 4)); painter @@ -799,28 +829,28 @@ impl Structure for SeaChapel { min: (center_o - 2).with_z(base), max: (center_o + 2).with_z(base + (diameter / 8) - 2), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_o - 3).with_z(base + (diameter / 8) - 2), max: (center_o + 3).with_z(base + (diameter / 8) - 1), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center_o - 4).with_z(base + (diameter / 8) - 1), max: (center_o + 4).with_z(base + (diameter / 8)), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .cylinder(Aabb { min: (center_o - 3).with_z(base + (diameter / 8) - 1), max: (center_o + 3).with_z(base + (diameter / 8)), }) - .fill(white.clone()); + .fill(white, filler); // organ on chapel main room organ podium let main_room_organ_pos = center_o.with_z(base + (diameter / 8)); - painter.spawn( + filler.spawn( EntityInfo::at(main_room_organ_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), ); @@ -828,7 +858,7 @@ impl Structure for SeaChapel { let main_room_sea_clerics_pos = (center_o - 2).with_z(base + (diameter / 8)); for _ in 0..(4 + ((RandomField::new(0).get((main_room_sea_clerics_pos).with_z(base))) % 4)) { - painter.spawn( + filler.spawn( EntityInfo::at(main_room_sea_clerics_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), ) @@ -840,16 +870,16 @@ impl Structure for SeaChapel { min: (center_o2 - 4).with_z(base - (diameter / 8) + (diameter / 2) + 2), max: (center_o2 + 4).with_z(base - (diameter / 8) + (diameter / 2) + 3), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .cylinder(Aabb { min: (center_o2 - 3).with_z(base - (diameter / 8) + (diameter / 2) + 2), max: (center_o2 + 3).with_z(base - (diameter / 8) + (diameter / 2) + 3), }) - .fill(white.clone()); + .fill(white, filler); // organ on chapel first floor organ podium let first_floor_organ_pos = center_o2.with_z(base - (diameter / 8) + (diameter / 2) + 2); - painter.spawn( + filler.spawn( EntityInfo::at(first_floor_organ_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.organ", &mut rng), ); @@ -859,7 +889,7 @@ impl Structure for SeaChapel { for _ in 0..(3 + ((RandomField::new(0).get((first_floor_sea_clerics_pos).with_z(base))) % 3)) { - painter.spawn( + filler.spawn( EntityInfo::at(first_floor_sea_clerics_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), ) @@ -877,7 +907,13 @@ impl Structure for SeaChapel { max: (center_s1 + (diameter / 6)) .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), }) - .fill(white.clone()); + .fill(white, filler); + let stairway1_upper_half = painter.cylinder(Aabb { + min: (center_s1 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6)), + max: (center_s1 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), + }); // stairway1 top washed out painter .sphere(Aabb { @@ -886,15 +922,8 @@ impl Structure for SeaChapel { max: (center_s1 + (diameter / 6)) .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (center_s1 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4)), - max: (center_s1 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6)), - }), - ) - .fill(washed.clone()); + .intersect(stairway1_upper_half) + .fill(washed, filler); // stairway1 top painter .sphere(Aabb { @@ -903,15 +932,17 @@ impl Structure for SeaChapel { max: (center_s1 + (diameter / 6)) .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (center_s1 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4)), - max: (center_s1 + (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6)), - }), - ) - .fill(top.clone()); + .intersect(stairway1_upper_half) + .fill(top, filler); + painter + .cylinder(Aabb { + min: (center_s1 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4)), + max: (center_s1 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6)), + }) + .intersect(stairway1_upper_half) + .clear(filler); // stairway1 top gold ring painter .cylinder(Aabb { @@ -920,7 +951,7 @@ impl Structure for SeaChapel { max: (center_s1 + (diameter / 6)) .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) + 2), }) - .fill(gold.clone()); + .fill(gold, filler); // stairway1 top window1 painter .aabb(Aabb { @@ -935,7 +966,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // stairway1 top window2 painter @@ -951,7 +982,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // stairway1 top window3 painter @@ -967,7 +998,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 6) - 1, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // ground to top room stairway2 let center_s2 = Vec2::new( @@ -982,7 +1013,13 @@ impl Structure for SeaChapel { max: (center_s2 + (diameter / 6)) .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), }) - .fill(white.clone()); + .fill(white, filler); + let stairway2_upper_half = painter.cylinder(Aabb { + min: (center_s2 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6)), + max: (center_s2 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), + }); // stairway2 top washed out painter .sphere(Aabb { @@ -991,16 +1028,8 @@ impl Structure for SeaChapel { max: (center_s2 + (diameter / 6)) .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (center_s2 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10)), - max: (center_s2 + (diameter / 6)).with_z( - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6), - ), - }), - ) - .fill(washed.clone()); + .intersect(stairway2_upper_half) + .fill(washed, filler); // stairway2 top painter .sphere(Aabb { @@ -1009,16 +1038,17 @@ impl Structure for SeaChapel { max: (center_s2 + (diameter / 6)) .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (center_s2 - (diameter / 6)) - .with_z(base - (diameter / 8) + diameter - (diameter / 10)), - max: (center_s2 + (diameter / 6)).with_z( - base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6), - ), - }), - ) - .fill(top.clone()); + .intersect(stairway2_upper_half) + .fill(top, filler); + painter + .cylinder(Aabb { + min: (center_s2 - (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10)), + max: (center_s2 + (diameter / 6)) + .with_z(base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6)), + }) + .intersect(stairway2_upper_half) + .clear(filler); // stairway2 top gold ring painter .cylinder(Aabb { @@ -1029,7 +1059,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) + 2, ), }) - .fill(gold.clone()); + .fill(gold, filler); // chapel clear top room painter .sphere(Aabb { @@ -1038,7 +1068,7 @@ impl Structure for SeaChapel { max: (center + (diameter / 3) - 1) .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 1), }) - .clear(); + .clear(filler); // stairway1 clear top halfway painter .sphere(Aabb { @@ -1047,15 +1077,16 @@ impl Structure for SeaChapel { max: (center_s1 + (diameter / 6) - 1) .with_z(base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3) - 1), }) - .without( - painter.sphere(Aabb { + .intersect( + painter.cylinder(Aabb { min: (center_s1 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 4) + 1), - max: (center_s1 + (diameter / 6) - 1) .with_z(base - (diameter / 8) + diameter - (diameter / 8)), + max: (center_s1 + (diameter / 6) - 1).with_z( + base - (diameter / 8) + diameter - (diameter / 4) + (diameter / 3) - 1, + ), }), ) - .clear(); + .clear(filler); // stairway2 clear top halfway painter .sphere(Aabb { @@ -1065,15 +1096,13 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3) - 1, ), }) - .without( - painter.sphere(Aabb { - min: (center_s2 - (diameter / 6) + 1) - .with_z(base - (diameter / 8) + diameter - (diameter / 10) + 1), - max: (center_s2 + (diameter / 6) - 1) - .with_z(base - (diameter / 8) + diameter + 2), - }), - ) - .clear(); + .intersect(painter.cylinder(Aabb { + min: (center_s2 - (diameter / 6) + 1).with_z(base - (diameter / 8) + diameter + 2), + max: (center_s2 + (diameter / 6) - 1).with_z( + base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 3) - 1, + ), + })) + .clear(filler); // stairway2 top window1 painter .aabb(Aabb { @@ -1088,7 +1117,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 1, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // stairway2 top window2 painter @@ -1104,21 +1133,21 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 10) + (diameter / 6) - 1, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // chapel tube1 / NPC-fence painter .cylinder(Aabb { min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 2) + 2), max: (center + (diameter / 6)).with_z(base - (diameter / 8) + diameter + 1), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center - (diameter / 6) + 1) .with_z(base - (diameter / 8) + (diameter / 2) + 2), max: (center + (diameter / 6) - 1).with_z(base - (diameter / 8) + diameter + 1), }) - .clear(); + .clear(filler); // chapel tube1 gold window painter .aabb(Aabb { @@ -1133,7 +1162,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 6, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1147,7 +1176,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 5, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1161,7 +1190,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 5, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -1175,7 +1204,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 4, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1189,7 +1218,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 4, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -1203,7 +1232,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 2, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1217,7 +1246,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 2, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -1231,7 +1260,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 1, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1245,7 +1274,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 4, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1259,7 +1288,7 @@ impl Structure for SeaChapel { base + (diameter / 2) + 5, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // chapel floor1 mobilees and cages let floor1_corner = center - (diameter / 5); for dir in SQUARE_4 { @@ -1292,10 +1321,10 @@ impl Structure for SeaChapel { max: (floor1_pos) .with_z(base - (diameter / 8) + diameter - (diameter / 8) - 1), }; - painter.cone(floor1_mbl_top).fill(top.clone()); - floor1_mbl_gold.fill(gold_decor.clone()); - floor1_mbl_gold_clear.clear(); - painter.aabb(floor1_mbl_chain).fill(gold_chain.clone()); + painter.cone(floor1_mbl_top).fill(top, filler); + floor1_mbl_gold.fill(gold_decor, filler); + floor1_mbl_gold_clear.clear(filler); + painter.aabb(floor1_mbl_chain).fill(gold_chain, filler); }, _ => { // chapel floor1 hanging cages @@ -1394,18 +1423,18 @@ impl Structure for SeaChapel { ); painter .cylinder(cage_glass_barriers) - .fill(glass_barrier.clone()); - painter.aabb(cage_clear1).clear(); - painter.cylinder(cage_clear2).clear(); - painter.aabb(cage_windows).fill(window_hor.clone()); - painter.aabb(cage_platform).fill(gold_decor.clone()); - painter.aabb(cage_chain).fill(gold_chain.clone()); - painter.aabb(cage_chain_fix).fill(gold_decor.clone()); + .fill(glass_barrier, filler); + painter.aabb(cage_clear1).clear(filler); + painter.cylinder(cage_clear2).clear(filler); + painter.aabb(cage_windows).fill(window_hor, filler); + painter.aabb(cage_platform).fill(gold_decor, filler); + painter.aabb(cage_chain).fill(gold_chain, filler); + painter.aabb(cage_chain_fix).fill(gold_decor, filler); painter .aabb(cage_coral_chest_podium) - .fill(gold_decor.clone()); - painter.rotated_sprite(cage_coral_chest_pos, SpriteKind::CoralChest, 2); - painter.spawn(EntityInfo::at(cage_sea_cleric_pos.as_()).with_asset_expect( + .fill(gold_decor, filler); + painter.rotated_sprite(cage_coral_chest_pos, SpriteKind::CoralChest, 2, filler); + filler.spawn(EntityInfo::at(cage_sea_cleric_pos.as_()).with_asset_expect( "common.entity.dungeon.sea_chapel.sea_cleric_sceptre", &mut rng, )); @@ -1427,7 +1456,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 1, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); painter .aabb(Aabb { @@ -1442,7 +1471,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 2, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // chapel floor1 window2 painter @@ -1458,7 +1487,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 1, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); painter .aabb(Aabb { @@ -1473,7 +1502,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 2, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // chapel floor1 window3 painter @@ -1489,7 +1518,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 1, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); painter .aabb(Aabb { @@ -1504,7 +1533,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 2, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // chapel floor1 window4 painter @@ -1520,7 +1549,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 1, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); painter .aabb(Aabb { @@ -1535,7 +1564,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 2, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // chapel floor1 painter @@ -1543,13 +1572,13 @@ impl Structure for SeaChapel { min: (center - (diameter / 3)).with_z(base - (diameter / 8) + diameter + 1), max: (center + (diameter / 3)).with_z(base - (diameter / 8) + diameter + 2), }) - .fill(gold.clone()); + .fill(gold, filler); painter .cylinder(Aabb { min: (center - (diameter / 3) + 1).with_z(base - (diameter / 8) + diameter + 1), max: (center + (diameter / 3) - 1).with_z(base - (diameter / 8) + diameter + 2), }) - .fill(white.clone()); + .fill(white, filler); // chapel tube2 / NPC-fence painter .cylinder(Aabb { @@ -1557,14 +1586,14 @@ impl Structure for SeaChapel { max: (center + (diameter / 6)) .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center - (diameter / 6) + 1).with_z(base - (diameter / 8) + diameter + 2), max: (center + (diameter / 6) - 1) .with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), }) - .clear(); + .clear(filler); // chapel tube2 gold door painter .aabb(Aabb { @@ -1579,7 +1608,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + 6, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1593,7 +1622,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + 7, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1607,7 +1636,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + 5, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -1621,7 +1650,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + 6, ), }) - .clear(); + .clear(filler); //chapel floor2 painter .cylinder(Aabb { @@ -1630,15 +1659,17 @@ impl Structure for SeaChapel { max: (center + (diameter / 3) - 1) .with_z(base - (diameter / 8) + diameter - (diameter / 8)), }) - .fill(white.clone()); + .fill(white, filler); //chapel floor2 drawer and potion painter.sprite( (center - (diameter / 8)).with_z(base - (diameter / 8) + diameter - (diameter / 8)), SpriteKind::DrawerSmall, + filler, ); painter.sprite( (center - (diameter / 8)).with_z(base - (diameter / 8) + diameter - (diameter / 8) + 1), SpriteKind::PotionMinor, + filler, ); //chapel main room pillars1 for dir in SQUARE_4 { @@ -1648,7 +1679,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.y * ((diameter / 2) + 2)), base - (diameter / 8) + (diameter / 6), ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); + painter.sprite(pos, SpriteKind::SeaDecorPillar, filler); } //chapel main room pillars2 for dir in SQUARE_4 { @@ -1658,7 +1689,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.y * 7), base - (diameter / 8) + (diameter / 6) + 2, ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); + painter.sprite(pos, SpriteKind::SeaDecorPillar, filler); } //chapel floor1 pillars inside tube for dir in SQUARE_4 { @@ -1668,7 +1699,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.y * 5), base - (diameter / 8) + (diameter / 2) + 2, ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); + painter.sprite(pos, SpriteKind::SeaDecorPillar, filler); } //chapel floor1 pillars outside tube for dir in SQUARE_4 { @@ -1678,7 +1709,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.y * 7), base - (diameter / 8) + (diameter / 2) + 2, ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); + painter.sprite(pos, SpriteKind::SeaDecorPillar, filler); } //chapel floor2/3 pillars inside tube for dir in SQUARE_4 { @@ -1689,7 +1720,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.y * 5), base - (diameter / 8) + diameter - (diameter / 8) + (f * ((diameter / 8) + 2)), ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); + painter.sprite(pos, SpriteKind::SeaDecorPillar, filler); } } //chapel floor2/3 pillars outside tube @@ -1701,14 +1732,14 @@ impl Structure for SeaChapel { sq_corner.y + (dir.y * 7), base - (diameter / 8) + diameter - (diameter / 8) + (f * ((diameter / 8) + 2)), ); - painter.sprite(pos, SpriteKind::SeaDecorPillar); + painter.sprite(pos, SpriteKind::SeaDecorPillar, filler); } } // floor2 tube Sea Clerics let fl2_tb_sea_clerics_pos = (center + (diameter / 8) - 2) .with_z(base - (diameter / 8) + diameter - (diameter / 8) + 1); for _ in 0..(1 + (RandomField::new(0).get((fl2_tb_sea_clerics_pos).with_z(base))) % 3) { - painter.spawn( + filler.spawn( EntityInfo::at(fl2_tb_sea_clerics_pos.as_()).with_asset_expect( "common.entity.dungeon.sea_chapel.sea_cleric_sceptre", &mut rng, @@ -1731,7 +1762,7 @@ impl Structure for SeaChapel { min: (floor3_exit_center - 2).with_z(base - (diameter / 8) + diameter + 1), max: (floor3_exit_center + 2).with_z(base - (diameter / 8) + diameter + 2), }) - .fill(glass_barrier.clone()); + .fill(glass_barrier, filler); // floor2 exit painter .cylinder(Aabb { @@ -1740,7 +1771,7 @@ impl Structure for SeaChapel { max: (floor2_exit_center + 2) .with_z(base - (diameter / 8) + diameter - (diameter / 8)), }) - .fill(glass_barrier.clone()); + .fill(glass_barrier, filler); // floor 2 Sea Clerics let fl2_sea_clerics_pos = Vec3::new( center.x - 3, @@ -1748,7 +1779,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 8) + 1, ); for _ in 0..(2 + ((RandomField::new(0).get((fl2_sea_clerics_pos).with_z(base))) % 4)) { - painter.spawn( + filler.spawn( EntityInfo::at(fl2_sea_clerics_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), ) @@ -1757,7 +1788,7 @@ impl Structure for SeaChapel { let fl3_sea_clerics_pos = (center - (diameter / 6)).with_z(base - (diameter / 8) + diameter + 2); for _ in 0..(2 + ((RandomField::new(0).get((fl3_sea_clerics_pos).with_z(base))) % 2)) { - painter.spawn( + filler.spawn( EntityInfo::at(fl3_sea_clerics_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), ) @@ -1776,7 +1807,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 11, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1790,7 +1821,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 11, ), }) - .clear(); + .clear(filler); // chapel gold top emblem5 painter .aabb(Aabb { @@ -1805,7 +1836,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 13, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1819,7 +1850,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 13, ), }) - .clear(); + .clear(filler); // chapel gold top emblem6 painter .aabb(Aabb { @@ -1834,7 +1865,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 17, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1848,7 +1879,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 17, ), }) - .clear(); + .clear(filler); // chapel gold top emblem7 painter .aabb(Aabb { @@ -1863,7 +1894,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 19, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1877,7 +1908,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 19, ), }) - .clear(); + .clear(filler); // chapel gold top emblem8 painter .aabb(Aabb { @@ -1892,7 +1923,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 21, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1906,7 +1937,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 21, ), }) - .clear(); + .clear(filler); // chapel gold top emblem9 painter .aabb(Aabb { @@ -1921,7 +1952,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 23, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1935,7 +1966,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 23, ), }) - .clear(); + .clear(filler); // chapel gold top emblem10 painter .aabb(Aabb { @@ -1950,7 +1981,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 25, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1964,7 +1995,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 25, ), }) - .clear(); + .clear(filler); // chapel gold top emblem11 painter .aabb(Aabb { @@ -1979,7 +2010,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 27, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -1993,7 +2024,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 27, ), }) - .clear(); + .clear(filler); // chapel gold top emblem12 painter .aabb(Aabb { @@ -2008,7 +2039,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 29, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -2022,7 +2053,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 29, ), }) - .clear(); + .clear(filler); // chapel gold top emblem13 painter .aabb(Aabb { @@ -2037,7 +2068,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 31, ), }) - .fill(gold.clone()); + .fill(gold, filler); painter .aabb(Aabb { min: Vec3::new( @@ -2051,21 +2082,21 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 31, ), }) - .clear(); + .clear(filler); // chapel gold top sphere painter .sphere(Aabb { min: (center - 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), max: (center + 4).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5), }) - .fill(gold.clone()); + .fill(gold, filler); // chapel gold top pole painter .aabb(Aabb { min: (center - 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 5), max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) + 21), }) - .fill(gold.clone()); + .fill(gold, filler); // chapel gold top emblem1 painter .aabb(Aabb { @@ -2080,7 +2111,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 19, ), }) - .fill(gold.clone()); + .fill(gold, filler); // chapel gold top emblem2 painter .aabb(Aabb { @@ -2095,7 +2126,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 23, ), }) - .fill(gold.clone()); + .fill(gold, filler); // chapel gold top emblem3 painter .aabb(Aabb { @@ -2110,27 +2141,27 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + (diameter / 3) + 9, ), }) - .fill(gold.clone()); + .fill(gold, filler); // chapel main room pulpit painter .sphere(Aabb { min: (center - (diameter / 6)).with_z(base - (diameter / 8)), max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 3)), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6)), max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 3)), }) - .clear(); + .clear(filler); // chapel main room pulpit gold ring painter .sphere(Aabb { min: (center - (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6)), max: (center + (diameter / 6)).with_z(base - (diameter / 8) + (diameter / 6) + 1), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .cylinder(Aabb { @@ -2138,42 +2169,42 @@ impl Structure for SeaChapel { max: (center + (diameter / 6) - 1) .with_z(base - (diameter / 8) + (diameter / 6) + 1), }) - .clear(); + .clear(filler); // chapel clear rope & platform entries painter .cylinder(Aabb { min: (center - 3).with_z(base - (2 * (diameter / 3)) + 3), max: (center + 3).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 2), }) - .clear(); + .clear(filler); //chapel main room gold window downwards painter .cylinder(Aabb { min: (center - 3).with_z(base - (diameter / 8)), max: (center + 3).with_z(base - (diameter / 8) + 1), }) - .fill(window_hor.clone()); + .fill(window_hor, filler); // chapel Ropefix1 painter .cylinder(Aabb { min: (center - 2).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), max: (center + 2).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 2), }) - .fill(ropefix1.clone()); + .fill(ropefix1, filler); // chapel Ropefix2 painter .cylinder(Aabb { min: (center).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 4), max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 3), }) - .fill(ropefix2.clone()); + .fill(ropefix2, filler); // chapel rope painter .cylinder(Aabb { min: (center).with_z(base - (diameter / 8) + (diameter / 2) - 5), max: (center + 1).with_z(base - (diameter / 8) + diameter + (diameter / 3) - 4), }) - .fill(rope.clone()); + .fill(rope, filler); // chapel floor1 to cellar1 tube (access to dagons room) let t_center = Vec2::new(center.x + (diameter / 4) + 2, center.y + (diameter / 4) + 4); painter @@ -2181,32 +2212,32 @@ impl Structure for SeaChapel { min: (t_center - 2).with_z(base - (diameter / 8)), max: (t_center + 2).with_z(base - (diameter / 8) + (diameter / 2) + 2), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: (t_center - 1).with_z(base - (diameter / 8)), max: (t_center + 1).with_z(base - (diameter / 8) + (diameter / 2) + 2), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (t_center - 1).with_z(base - (diameter / 8) + (diameter / 2) + 1), max: (t_center + 1).with_z(base - (diameter / 8) + (diameter / 2) + 2), }) - .fill(glass_barrier.clone()); + .fill(glass_barrier, filler); // chapel cellar2 water painter .cylinder(Aabb { min: (center - 5).with_z(base - (2 * (diameter / 3)) + 1), max: (center + 5).with_z(base - (2 * (diameter / 3)) + 2), }) - .fill(water.clone()); + .fill(water, filler); painter .cylinder(Aabb { min: (center - 11).with_z(base - (2 * (diameter / 3)) + 2), max: (center + 11).with_z(base - (2 * (diameter / 3)) + 3), }) - .fill(water.clone()); + .fill(water, filler); // chapel cellar to basin glass barrier barricade downwards & miniboss // cellar floor painter @@ -2214,9 +2245,9 @@ impl Structure for SeaChapel { min: (center - (2 * (diameter / 3))).with_z(base - (2 * (diameter / 3)) + 10), max: (center + (2 * (diameter / 3))).with_z(base - (2 * (diameter / 3)) + 16), }) - .fill(white_coral.clone()); + .fill(white_coral, filler); // exit to water basin - let exit = Fill::Sampling(Arc::new(|center| { + let exit = filler.sampling(|center| { let c = RandomField::new(0).get(center - 6) % 11; Some(if c < 8 { let c = c as u8 * 10 + 120; @@ -2224,57 +2255,59 @@ impl Structure for SeaChapel { } else { Block::air(SpriteKind::GlassBarrier) }) - })); + }); // glass barriers with center clearance for dagon painter .cylinder(Aabb { min: (center - 9).with_z(base - (2 * (diameter / 3)) + 10), max: (center + 9).with_z(base - (2 * (diameter / 3)) + 16), }) - .fill(glass_barrier.clone()); + .fill(glass_barrier, filler); painter .cylinder(Aabb { min: (center - 9).with_z(base - (2 * (diameter / 3)) + 13), max: (center + 9).with_z(base - (2 * (diameter / 3)) + 14), }) - .without(painter.cylinder(Aabb { + .fill(exit, filler); + painter + .cylinder(Aabb { min: (center - 8).with_z(base - (2 * (diameter / 3)) + 13), max: (center + 8).with_z(base - (2 * (diameter / 3)) + 14), - })) - .fill(exit); + }) + .fill(white, filler); painter .cylinder(Aabb { min: (center - 8).with_z(base - (2 * (diameter / 3)) + 14), max: (center + 8).with_z(base - (2 * (diameter / 3)) + 16), }) - .fill(white_coral.clone()); + .fill(white_coral, filler); painter .cylinder(Aabb { min: (center - 9).with_z(base - (2 * (diameter / 3)) + 16), max: (center + 9).with_z(base - (2 * (diameter / 3)) + 18), }) - .fill(sea_urchins); + .fill(sea_urchins, filler); painter .cylinder(Aabb { min: (center - 8).with_z(base - (2 * (diameter / 3)) + 16), max: (center + 8).with_z(base - (2 * (diameter / 3)) + 18), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: (center - 8).with_z(base - (2 * (diameter / 3)) + 10), max: (center + 8).with_z(base - (2 * (diameter / 3)) + 14), }) - .fill(white_coral); + .fill(white_coral, filler); let cellar_miniboss_pos = center.with_z(base - (2 * (diameter / 3)) + 17); - painter.spawn( + filler.spawn( EntityInfo::at(cellar_miniboss_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.dagon", &mut rng), ); // cellar 2 sea crocodiles let cellar_sea_croc_pos = (center - 12).with_z(base - (2 * (diameter / 3)) + 8); for _ in 0..(3 + ((RandomField::new(0).get((cellar_sea_croc_pos).with_z(base))) % 5)) { - painter.spawn( + filler.spawn( EntityInfo::at(cellar_sea_croc_pos.as_()) .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), ) @@ -2285,21 +2318,21 @@ impl Structure for SeaChapel { min: (center - diameter + (diameter / 5) + 1).with_z(base - (4 * diameter / 3)), max: (center + diameter - (diameter / 5) - 1).with_z(base + 1), }) - .without(painter.cylinder(Aabb { - min: (center - diameter + (diameter / 5) + 1).with_z(base - (2 * diameter / 3) + 1), - max: (center + diameter - (diameter / 5) - 1).with_z(base + 1), + .intersect(painter.cylinder(Aabb { + min: (center - diameter + (diameter / 5) + 1).with_z(base - (4 * diameter / 3)), + max: (center + diameter - (diameter / 5) - 1).with_z(base - (2 * diameter / 3) + 1), })) - .fill(white.clone()); + .fill(white, filler); painter .sphere(Aabb { min: (center - diameter + (diameter / 5) + 2).with_z(base - (4 * diameter / 3) + 1), max: (center + diameter - (diameter / 5) - 2).with_z(base + 1), }) - .without(painter.cylinder(Aabb { - min: (center - diameter + (diameter / 5) + 2).with_z(base - (2 * diameter / 3) + 1), - max: (center + diameter - (diameter / 5) - 2).with_z(base + 1), + .intersect(painter.cylinder(Aabb { + min: (center - diameter + (diameter / 5) + 2).with_z(base - (4 * diameter / 3) + 1), + max: (center + diameter - (diameter / 5) - 2).with_z(base - (2 * diameter / 3) + 1), })) - .fill(water.clone()); + .fill(water, filler); // stairway1 bottom painter .sphere(Aabb { @@ -2307,7 +2340,7 @@ impl Structure for SeaChapel { .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 2)), max: (center_s1 + (diameter / 4)).with_z(base - (2 * (diameter / 3)) + 3), }) - .fill(white.clone()); + .fill(white, filler); // stairway1 bottom gold ring painter .cylinder(Aabb { @@ -2316,14 +2349,14 @@ impl Structure for SeaChapel { max: (center_s1 + (diameter / 4)) .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4) + 1), }) - .fill(gold.clone()); + .fill(gold, filler); painter .sphere(Aabb { min: (center_s1 - (diameter / 4) + 1) .with_z(base - (2 * (diameter / 3)) + 4 - (diameter / 2)), max: (center_s1 + (diameter / 4) - 1).with_z(base - (2 * (diameter / 3)) + 2), }) - .clear(); + .clear(filler); // stairway1 bottom clear entry painter .cylinder(Aabb { @@ -2338,7 +2371,7 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) + 2, ), }) - .clear(); + .clear(filler); // stairway1 bottom window to basin painter .cylinder(Aabb { @@ -2353,7 +2386,7 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) + 5 - (diameter / 2), ), }) - .fill(window_hor); + .fill(window_hor, filler); // stairway1 tube painter .cylinder(Aabb { @@ -2368,7 +2401,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 8), ), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { @@ -2383,7 +2416,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 8), ), }) - .clear(); + .clear(filler); // stairway1 tube window1 painter .aabb(Aabb { @@ -2394,7 +2427,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - (diameter / 4) + 1, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // stairway1 stairs let stair_radius1 = 4.5; @@ -2404,14 +2437,14 @@ impl Structure for SeaChapel { max: (center_s1 + stair_radius1 as i32) .with_z(base - (diameter / 8) + diameter - (diameter / 8)), }); + let stair_fill = spiral_staircase( + center_s1.with_z(base - (diameter / 8) + diameter - (diameter / 8)), + stair_radius1, + 0.5, + 7.0, + ); stairs_clear1 - .sample(spiral_staircase( - center_s1.with_z(base - (diameter / 8) + diameter - (diameter / 8)), - stair_radius1, - 0.5, - 7.0, - )) - .fill(white.clone()); + .fill(filler.sampling(move |pos| if stair_fill(pos) { white_fn(pos) } else { None }), filler); // coral chest podium painter .aabb(Aabb { @@ -2426,7 +2459,7 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) - (diameter / 2) + 13, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); // coral chest painter.rotated_sprite( Vec3::new( @@ -2436,6 +2469,7 @@ impl Structure for SeaChapel { ), SpriteKind::CoralChest, 2, + filler, ); // cardinals room next to stairway1 bottom let cr_center = Vec2::new(center.x - diameter - 3, center.y - (diameter / 5) + 1); @@ -2445,7 +2479,7 @@ impl Structure for SeaChapel { .with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 5), max: (cr_center + (diameter / 3)).with_z(base - (2 * (diameter / 3)) + 3), }) - .fill(white.clone()); + .fill(white, filler); // cardinals room gold ring painter .cylinder(Aabb { @@ -2454,7 +2488,7 @@ impl Structure for SeaChapel { max: (cr_center + (diameter / 3)) .with_z(base - (2 * (diameter / 3)) - (diameter / 4) + 4), }) - .fill(gold.clone()); + .fill(gold, filler); // clear cardinals room painter .cylinder(Aabb { @@ -2462,33 +2496,33 @@ impl Structure for SeaChapel { .with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4), max: (cr_center + (diameter / 3) - 1).with_z(base - (2 * (diameter / 3)) + 2), }) - .clear(); + .clear(filler); // Cardinals room chamber mobile1 painter .cone(Aabb { min: (cr_center - 2).with_z(base - (2 * (diameter / 3)) - 7), max: (cr_center + 3).with_z(base - (2 * (diameter / 3)) - 5), }) - .fill(top.clone()); + .fill(top, filler); painter .cylinder(Aabb { min: (cr_center - 2).with_z(base - (2 * (diameter / 3)) - 8), max: (cr_center + 3).with_z(base - (2 * (diameter / 3)) - 7), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: (cr_center - 1).with_z(base - (2 * (diameter / 3)) - 8), max: (cr_center + 2).with_z(base - (2 * (diameter / 3)) - 7), }) - .clear(); + .clear(filler); // Cardinals room mobile1 chain painter .aabb(Aabb { min: cr_center.with_z(base - (2 * (diameter / 3)) - 5), max: (cr_center + 1).with_z(base - (2 * (diameter / 3)) + 2), }) - .fill(gold_chain.clone()); + .fill(gold_chain, filler); // passage from stairway1 bottom to cardinals room painter .aabb(Aabb { @@ -2503,7 +2537,7 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) - (diameter / 4) + 5, ), }) - .fill(white.clone()); + .fill(white, filler); painter .aabb(Aabb { min: Vec3::new( @@ -2517,7 +2551,7 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) - (diameter / 4) + 6, ), }) - .fill(white.clone()); + .fill(white, filler); // passage from stairway1 bottom to cardinals room gold stripes painter .aabb(Aabb { @@ -2532,7 +2566,7 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) - (diameter / 4) + 4, ), }) - .fill(gold.clone()); + .fill(gold, filler); // clear passage from stairway1 bottom to cardinals room painter .aabb(Aabb { @@ -2547,12 +2581,12 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) - (diameter / 4) + 5, ), }) - .clear(); + .clear(filler); // Cardinals room Sea Clerics let cr_sea_clerics_pos = (cr_center - 2).with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4); for _ in 0..(2 + ((RandomField::new(0).get((fl2_sea_clerics_pos).with_z(base))) % 3)) { - painter.spawn( + filler.spawn( EntityInfo::at(cr_sea_clerics_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), ) @@ -2560,7 +2594,7 @@ impl Structure for SeaChapel { // Cardinal let cr_cardinal_pos = (cr_center + 2).with_z(base - (2 * (diameter / 3)) - (diameter / 4) - 4); - painter.spawn( + filler.spawn( EntityInfo::at(cr_cardinal_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.cardinal", &mut rng), ); @@ -2571,7 +2605,7 @@ impl Structure for SeaChapel { .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 2)), max: (center_s2 + (diameter / 4)).with_z(base - (2 * (diameter / 3)) + 3), }) - .fill(white.clone()); + .fill(white, filler); // stairway2 bottom gold ring painter .cylinder(Aabb { @@ -2580,14 +2614,14 @@ impl Structure for SeaChapel { max: (center_s2 + (diameter / 4)) .with_z(base - (2 * (diameter / 3)) + 3 - (diameter / 4) + 1), }) - .fill(gold.clone()); + .fill(gold, filler); painter .sphere(Aabb { min: (center_s2 - (diameter / 4) + 1) .with_z(base - (2 * (diameter / 3)) + 4 - (diameter / 2)), max: (center_s2 + (diameter / 4) - 1).with_z(base - (2 * (diameter / 3)) + 2), }) - .fill(water.clone()); + .fill(water, filler); // stairway2 bottom clear entry painter .cylinder(Aabb { @@ -2602,7 +2636,7 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) + 2, ), }) - .clear(); + .clear(filler); // stairway2 bottom water to basin painter .cylinder(Aabb { @@ -2617,7 +2651,7 @@ impl Structure for SeaChapel { base - (2 * (diameter / 3)) + 5 - (diameter / 2), ), }) - .fill(water.clone()); + .fill(water, filler); // stairway2 tube painter .cylinder(Aabb { @@ -2632,7 +2666,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + 2, ), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { min: Vec3::new( @@ -2646,7 +2680,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + 1, ), }) - .clear(); + .clear(filler); painter .cylinder(Aabb { min: Vec3::new( @@ -2660,7 +2694,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter + 2, ), }) - .clear(); + .clear(filler); // stairway2 tube window1 painter .aabb(Aabb { @@ -2675,7 +2709,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + diameter - 4, ), }) - .fill(window_ver2.clone()); + .fill(window_ver2, filler); // chest painter.rotated_sprite( Vec3::new( @@ -2685,11 +2719,12 @@ impl Structure for SeaChapel { ), SpriteKind::DungeonChest1, 2, + filler, ); // bottom 2 sea crocodiles let bt_sea_croc_pos = center_s2.with_z(base - (2 * (diameter / 3)) - (diameter / 2) + 11); for _ in 0..(2 + ((RandomField::new(0).get((bt_sea_croc_pos).with_z(base))) % 3)) { - painter.spawn( + filler.spawn( EntityInfo::at(bt_sea_croc_pos.as_()) .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), ) @@ -2700,15 +2735,15 @@ impl Structure for SeaChapel { min: (center - (diameter / 3)).with_z(base - (4 * diameter / 3) - (diameter / 6)), max: (center + (diameter / 3)).with_z(base - (2 * diameter / 3) - (diameter / 6)), }) - .without( - painter.sphere(Aabb { - min: (center - (diameter / 3) + 1) - .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), - max: (center + (diameter / 3) - 1) - .with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), - }), - ) - .fill(white.clone()); + .fill(white, filler); + painter + .sphere(Aabb { + min: (center - (diameter / 3) + 1) + .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), + max: (center + (diameter / 3) - 1) + .with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), + }) + .fill(water, filler); // underwater chamber entries painter .aabb(Aabb { @@ -2723,7 +2758,7 @@ impl Structure for SeaChapel { base - (3 * diameter / 3) - (diameter / 6) - 2, ), }) - .fill(water.clone()); + .fill(water, filler); // underwater chamber entries painter .aabb(Aabb { @@ -2738,7 +2773,7 @@ impl Structure for SeaChapel { base - (3 * diameter / 3) - (diameter / 6) - 1, ), }) - .fill(water.clone()); + .fill(water, filler); // underwater chamber gold ring white floor painter .cylinder(Aabb { @@ -2746,7 +2781,7 @@ impl Structure for SeaChapel { max: (center + (diameter / 3)) .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), }) - .fill(gold.clone()); + .fill(gold, filler); painter .cylinder(Aabb { min: (center - (diameter / 3) + 1) @@ -2754,14 +2789,14 @@ impl Structure for SeaChapel { max: (center + (diameter / 3) - 1) .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), }) - .fill(white.clone()); + .fill(white, filler); // underwater chamber floor entry painter .cylinder(Aabb { min: (center - 2).with_z(base - (3 * diameter / 3) - (diameter / 6)), max: (center + 2).with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), }) - .fill(water.clone()); + .fill(water, filler); // fill underwater chamber halfway with air painter .sphere(Aabb { @@ -2770,41 +2805,41 @@ impl Structure for SeaChapel { max: (center + (diameter / 3) - 1) .with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), }) - .without( + .intersect( painter.cylinder(Aabb { min: (center - (diameter / 3) + 1) - .with_z(base - (4 * diameter / 3) - (diameter / 6) + 1), - max: (center + (diameter / 3) - 1) .with_z(base - (3 * diameter / 3) - (diameter / 6) + 1), + max: (center + (diameter / 3) - 1) + .with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), }), ) - .clear(); + .clear(filler); // chapel underwater chamber mobile1 painter .cone(Aabb { min: (center - 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), max: (center + 3).with_z(base - (2 * diameter / 3) - (diameter / 6) - 5), }) - .fill(top.clone()); + .fill(top, filler); painter .cylinder(Aabb { min: (center - 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 8), max: (center + 3).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: (center - 1).with_z(base - (2 * diameter / 3) - (diameter / 6) - 8), max: (center + 2).with_z(base - (2 * diameter / 3) - (diameter / 6) - 7), }) - .clear(); + .clear(filler); // chapel underwater chamber mobile1 chain painter .aabb(Aabb { min: center.with_z(base - (2 * diameter / 3) - (diameter / 6) - 5), max: (center + 1).with_z(base - (2 * diameter / 3) - (diameter / 6) - 1), }) - .fill(gold_chain); + .fill(gold_chain, filler); // underwater chamber coral chest painter .cylinder(Aabb { @@ -2813,7 +2848,7 @@ impl Structure for SeaChapel { max: (center - (diameter / 6) + 3) .with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: (center - (diameter / 6)) @@ -2821,18 +2856,19 @@ impl Structure for SeaChapel { max: (center - (diameter / 6) + 2) .with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), }) - .fill(white.clone()); + .fill(white, filler); // coral chest painter.rotated_sprite( (center - (diameter / 6)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2), SpriteKind::CoralChest, 2, + filler, ); // underwater chamber sea crocodiles & sea clerics let uwc_sea_croc_pos = (center + (diameter / 8)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2); for _ in 0..(3 + ((RandomField::new(0).get((uwc_sea_croc_pos).with_z(base))) % 5)) { - painter.spawn( + filler.spawn( EntityInfo::at(uwc_sea_croc_pos.as_()) .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), ) @@ -2840,7 +2876,7 @@ impl Structure for SeaChapel { let uwc_sea_clerics_pos = (center + (diameter / 7)).with_z(base - (3 * diameter / 3) - (diameter / 6) + 2); for _ in 0..(2 + ((RandomField::new(0).get((uwc_sea_clerics_pos).with_z(base))) % 2)) { - painter.spawn( + filler.spawn( EntityInfo::at(uwc_sea_clerics_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), ); @@ -2859,7 +2895,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 4), ), }) - .fill(white.clone()); + .fill(white, filler); painter .sphere(Aabb { min: Vec3::new( @@ -2873,7 +2909,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 4) - 1, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -2887,7 +2923,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 2, ), }) - .clear(); + .clear(filler); painter.sprite( Vec3::new( center.x - (diameter / 2) - (diameter / 16) + 4, @@ -2895,6 +2931,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 16) - 1, ), SpriteKind::DungeonChest1, + filler, ); // Holding Cell2 glass barriers painter @@ -2910,7 +2947,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 3, ), }) - .fill(glass_barrier.clone()); + .fill(glass_barrier, filler); // Holding Cell3 painter .sphere(Aabb { @@ -2925,7 +2962,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 4), ), }) - .fill(white.clone()); + .fill(white, filler); painter .sphere(Aabb { min: Vec3::new( @@ -2939,7 +2976,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 4) - 1, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -2953,7 +2990,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 4) - (diameter / 16) - 2, ), }) - .clear(); + .clear(filler); painter.sprite( Vec3::new( center.x + (diameter / 2), @@ -2961,6 +2998,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + 2, ), SpriteKind::DungeonChest1, + filler, ); // Holding Cell3 glass barriers painter @@ -2976,7 +3014,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 16) + 4, ), }) - .fill(glass_barrier.clone()); + .fill(glass_barrier, filler); // Holding Cell1 painter .sphere(Aabb { @@ -2991,7 +3029,7 @@ impl Structure for SeaChapel { base - (diameter / 4) + (diameter / 2), ), }) - .fill(white.clone()); + .fill(white, filler); painter .sphere(Aabb { min: Vec3::new( @@ -3005,19 +3043,19 @@ impl Structure for SeaChapel { base - (diameter / 4) + (diameter / 2) - 1, ), }) - .without(painter.cylinder(Aabb { + .intersect(painter.cylinder(Aabb { min: Vec3::new( center.x - (diameter / 4) + 1, center.y - (diameter / 2) - (diameter / 4) + 1, - base - (diameter / 4) + 1, + base - 1, ), max: Vec3::new( center.x + (diameter / 4 - 1), center.y - (diameter / 2) + (diameter / 4) - 1, - base - 1, + base - (diameter / 4) + (diameter / 2) - 1, ), })) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -3031,7 +3069,7 @@ impl Structure for SeaChapel { base + 3, ), }) - .clear(); + .clear(filler); // Holding Cell1 windows painter .aabb(Aabb { @@ -3046,7 +3084,7 @@ impl Structure for SeaChapel { base + 3, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -3060,7 +3098,7 @@ impl Structure for SeaChapel { base + 2, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // chapel main room pulpit stairs1 painter .ramp_inset( @@ -3071,7 +3109,7 @@ impl Structure for SeaChapel { 5, Dir::X, ) - .fill(white.clone()); + .fill(white, filler); // chapel main room pulpit stairs2 painter .ramp_inset( @@ -3082,7 +3120,7 @@ impl Structure for SeaChapel { 5, Dir::NegX, ) - .fill(white.clone()); + .fill(white, filler); // chapel main room pulpit stairs2 painter .ramp_inset( @@ -3093,7 +3131,7 @@ impl Structure for SeaChapel { 5, Dir::X, ) - .fill(white.clone()); + .fill(white, filler); // chapel main room pulpit stairs4 painter .ramp_inset( @@ -3104,7 +3142,7 @@ impl Structure for SeaChapel { 5, Dir::NegX, ) - .fill(white.clone()); + .fill(white, filler); // Holding Cell1 passage to main room painter .aabb(Aabb { @@ -3119,7 +3157,7 @@ impl Structure for SeaChapel { base + 3, ), }) - .fill(white.clone()); + .fill(white, filler); painter .aabb(Aabb { min: Vec3::new( @@ -3133,7 +3171,7 @@ impl Structure for SeaChapel { base, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -3147,7 +3185,7 @@ impl Structure for SeaChapel { base, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -3161,7 +3199,7 @@ impl Structure for SeaChapel { base + 1, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -3175,7 +3213,7 @@ impl Structure for SeaChapel { base + 1, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter .aabb(Aabb { min: Vec3::new( @@ -3189,7 +3227,7 @@ impl Structure for SeaChapel { base, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // holding cell1 coral chest painter .aabb(Aabb { @@ -3204,7 +3242,7 @@ impl Structure for SeaChapel { base, ), }) - .fill(gold_decor.clone()); + .fill(gold_decor, filler); painter.rotated_sprite( Vec3::new( center.x, @@ -3213,12 +3251,13 @@ impl Structure for SeaChapel { ), SpriteKind::CoralChest, 0, + filler, ); // Holding Cell1 Sea Clerics let hc1_sea_clerics_pos = Vec3::new(center.x, center.y - (diameter / 3), base + 3); for _ in 0..(3 + ((RandomField::new(0).get((hc1_sea_clerics_pos).with_z(base))) % 3)) { - painter.spawn( + filler.spawn( EntityInfo::at(hc1_sea_clerics_pos.as_()) .with_asset_expect("common.entity.dungeon.sea_chapel.sea_cleric", &mut rng), ); @@ -3237,7 +3276,7 @@ impl Structure for SeaChapel { base - (diameter / 4) + (diameter / 2), ), }) - .fill(white.clone()); + .fill(white, filler); painter .sphere(Aabb { min: Vec3::new( @@ -3251,19 +3290,19 @@ impl Structure for SeaChapel { base - (diameter / 4) + (diameter / 2) - 1, ), }) - .without(painter.cylinder(Aabb { + .intersect(painter.cylinder(Aabb { min: Vec3::new( center.x - (diameter / 4) + 1, center.y + (diameter / 2) - (diameter / 4) + 1, - base - (diameter / 4) + 1, + base - 1, ), max: Vec3::new( center.x + (diameter / 4 - 1), center.y + (diameter / 2) + (diameter / 4) - 1, - base - 1, + base - (diameter / 4) + (diameter / 2) - 1, ), })) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -3277,7 +3316,7 @@ impl Structure for SeaChapel { base + 3, ), }) - .clear(); + .clear(filler); // Holding Cell glass barriers painter .aabb(Aabb { @@ -3292,7 +3331,7 @@ impl Structure for SeaChapel { base + 2, ), }) - .fill(glass_barrier.clone()); + .fill(glass_barrier, filler); // Holding Cell passage to main room painter .aabb(Aabb { @@ -3307,7 +3346,7 @@ impl Structure for SeaChapel { base + 3, ), }) - .fill(white.clone()); + .fill(white, filler); painter .aabb(Aabb { min: Vec3::new( @@ -3321,7 +3360,7 @@ impl Structure for SeaChapel { base, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -3335,7 +3374,7 @@ impl Structure for SeaChapel { base, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -3349,7 +3388,7 @@ impl Structure for SeaChapel { base + 1, ), }) - .clear(); + .clear(filler); painter .aabb(Aabb { min: Vec3::new( @@ -3363,7 +3402,7 @@ impl Structure for SeaChapel { base, ), }) - .fill(glass_barrier.clone()); + .fill(glass_barrier, filler); // stairway3 tube painter .cylinder(Aabb { @@ -3374,7 +3413,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) + 2, ), }) - .fill(white.clone()); + .fill(white, filler); painter .cylinder(Aabb { @@ -3385,7 +3424,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) + 2, ), }) - .clear(); + .clear(filler); // stairway3 tube window1 painter .aabb(Aabb { @@ -3396,7 +3435,7 @@ impl Structure for SeaChapel { base - (diameter / 8) + (diameter / 2) - 2, ), }) - .fill(window_ver.clone()); + .fill(window_ver, filler); // stairway3 stairs let stair_radius3 = 4.5; @@ -3405,14 +3444,14 @@ impl Structure for SeaChapel { max: (center_s3 + stair_radius3 as i32) .with_z(base - (diameter / 8) + (diameter / 2) + 2), }); + let stair_fill = spiral_staircase( + center_s3.with_z(base - (diameter / 8) + (diameter / 2) + 2), + stair_radius3, + 0.5, + 7.0, + ); stairs_clear3 - .sample(spiral_staircase( - center_s3.with_z(base - (diameter / 8) + (diameter / 2) + 2), - stair_radius3, - 0.5, - 7.0, - )) - .fill(white.clone()); + .fill(filler.sampling(move |pos| if stair_fill(pos) { white_fn(pos) } else { None }), filler); // stairway4 let center_s4 = Vec2::new(center.x + (diameter / 2) + 2, center.y + (diameter / 8)); // stairway4 balcony2 entry @@ -3421,7 +3460,7 @@ impl Structure for SeaChapel { min: (center_s4 - 2).with_z(base - (diameter / 8) + (diameter / 2) - 7), max: (center_s4 + 3).with_z(base - (diameter / 8) + (diameter / 2) - 5), }) - .clear(); + .clear(filler); // stairway4 stairs let stair_radius4 = 3.0; let stairs_clear4 = painter.cylinder(Aabb { @@ -3429,14 +3468,14 @@ impl Structure for SeaChapel { max: (center_s4 + stair_radius4 as i32) .with_z(base - (diameter / 8) + (diameter / 2) - 4), }); + let stair_fill = spiral_staircase( + center_s4.with_z(base - (diameter / 8) + (diameter / 2) - 4), + stair_radius4, + 0.5, + 7.0, + ); stairs_clear4 - .sample(spiral_staircase( - center_s4.with_z(base - (diameter / 8) + (diameter / 2) - 4), - stair_radius4, - 0.5, - 7.0, - )) - .fill(white.clone()); + .fill(filler.sampling(move |pos| if stair_fill(pos) { white_fn(pos) } else { None }), filler); // entry lanterns for dir in SQUARE_4 { let sq_corner = Vec2::new(center.x - (diameter / 2) + 3, center.y - 5); @@ -3445,7 +3484,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.y * 9), base + 5, ); - painter.sprite(pos, SpriteKind::SeashellLantern); + painter.sprite(pos, SpriteKind::SeashellLantern, filler); } // main room lanterns for dir in SQUARE_4 { @@ -3455,7 +3494,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.x * (diameter - 10)), base + 12, ); - painter.sprite(pos, SpriteKind::SeashellLantern); + painter.sprite(pos, SpriteKind::SeashellLantern, filler); } // first floor lanterns for dir in SQUARE_4 { @@ -3466,7 +3505,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), base - (diameter / 8) + (diameter / 2) + 2, ); - painter.sprite(pos, SpriteKind::SeashellLantern); + painter.sprite(pos, SpriteKind::SeashellLantern, filler); } } // small floor lanterns @@ -3478,7 +3517,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), base + diameter - (diameter / 4) + 1, ); - painter.sprite(pos, SpriteKind::SeashellLantern); + painter.sprite(pos, SpriteKind::SeashellLantern, filler); } } @@ -3491,7 +3530,7 @@ impl Structure for SeaChapel { sq_corner.y + (dir.x * ((diameter / 4) + 2 + (2 * d))), base - (diameter / 8) + diameter + 2, ); - painter.sprite(pos, SpriteKind::SeashellLantern); + painter.sprite(pos, SpriteKind::SeashellLantern, filler); } } // main room emblems 1 @@ -3501,7 +3540,7 @@ impl Structure for SeaChapel { center.y + (diameter / 3) + 6 - (d * (2 * (diameter / 3) + 10)), base + (diameter / 4) + 1, ); - painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 4 - (4 * d) as u8); + painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 4 - (4 * d) as u8, filler); } // main room emblems 2 for d in 0..2 { @@ -3510,7 +3549,7 @@ impl Structure for SeaChapel { center.y - d, base + (diameter / 4) + 1, ); - painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 6 - (4 * d) as u8); + painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 6 - (4 * d) as u8, filler); } // first floor emblems / top floor emblems for d in 0..2 { @@ -3520,7 +3559,7 @@ impl Structure for SeaChapel { center.y - (diameter / 8) - 4 + (d * ((diameter / 4) + 6)), base + (diameter / 2) + 1 + (e * (diameter / 2)), ); - painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 4 - (4 * d) as u8); + painter.rotated_sprite(emblem_pos, SpriteKind::SeaDecorEmblem, 4 - (4 * d) as u8, filler); } } @@ -3642,59 +3681,50 @@ impl Structure for SeaChapel { base + (bldg_diameter / 15) + 6, ), }; - let bldg_room_windows = painter - .aabb(Aabb { - min: Vec3::new( - bldg_center.x - 1, - bldg_center.y - (bldg_diameter / 4), - base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, - ), - max: Vec3::new( - bldg_center.x + 1, - bldg_center.y + (bldg_diameter / 4), - base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, - ), - }) - .without(painter.aabb(Aabb { - min: Vec3::new( - bldg_center.x - 1, - bldg_center.y - (bldg_diameter / 4) + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, - ), - max: Vec3::new( - bldg_center.x + 1, - bldg_center.y + (bldg_diameter / 4) - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, - ), - })); + let bldg_room_windows_1 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - (bldg_diameter / 4), + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y - (bldg_diameter / 4) + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, + ), + }); + let bldg_room_windows_2 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y + (bldg_diameter / 4) - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + (bldg_diameter / 4), + base - (bldg_diameter / 15) + (bldg_diameter / 4) - 1, + ), + }); + let bldg_top_half = painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)), + max: (bldg_center + (bldg_diameter / 4)) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + }); let bldg_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)), max: (bldg_center + (bldg_diameter / 4)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), }) - .without( - painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 4)) - .with_z(base - (bldg_diameter / 15)), - max: (bldg_center + (bldg_diameter / 4)) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)), - }), - ); + .intersect(bldg_top_half); let bldg_washed_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 4)).with_z(base - (bldg_diameter / 15)), max: (bldg_center + (bldg_diameter / 4) - 1) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), }) - .without( - painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 4)) - .with_z(base - (bldg_diameter / 15)), - max: (bldg_center + (bldg_diameter / 4)) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4)), - }), - ); + .intersect(bldg_top_half); let bldg_room_goldring = painter.cylinder(Aabb { min: (bldg_center - (bldg_diameter / 4)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 4) + 1), @@ -3732,56 +3762,61 @@ impl Structure for SeaChapel { base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), ), }; - let bldg_room2_windows1 = painter - .aabb(Aabb { - min: Vec3::new( - bldg_center.x - 1, - bldg_center.y - (bldg_diameter / 6), - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, - ), - max: Vec3::new( - bldg_center.x + 1, - bldg_center.y + (bldg_diameter / 6), - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, - ), - }) - .without(painter.aabb(Aabb { - min: Vec3::new( - bldg_center.x - 1, - bldg_center.y - (bldg_diameter / 6) + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, - ), - max: Vec3::new( - bldg_center.x + 1, - bldg_center.y + (bldg_diameter / 6) - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, - ), - })); - let bldg_room2_windows2 = painter - .aabb(Aabb { - min: Vec3::new( - bldg_center.x - (bldg_diameter / 6), - bldg_center.y - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, - ), - max: Vec3::new( - bldg_center.x + (bldg_diameter / 6), - bldg_center.y + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, - ), - }) - .without(painter.aabb(Aabb { - min: Vec3::new( - bldg_center.x - (bldg_diameter / 6) + 1, - bldg_center.y - 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, - ), - max: Vec3::new( - bldg_center.x + (bldg_diameter / 6) - 1, - bldg_center.y + 1, - base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, - ), - })); + let bldg_room2_windows1 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y - (bldg_diameter / 6), + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y - (bldg_diameter / 6) + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }); + let bldg_room2_windows2 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - 1, + bldg_center.y + (bldg_diameter / 6) - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + 1, + bldg_center.y + (bldg_diameter / 6), + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }); + let bldg_room2_windows3 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x - (bldg_diameter / 6), + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x - (bldg_diameter / 6) + 1, + bldg_center.y + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }); + let bldg_room2_windows4 = painter.aabb(Aabb { + min: Vec3::new( + bldg_center.x + (bldg_diameter / 6) - 1, + bldg_center.y - 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 2, + ), + max: Vec3::new( + bldg_center.x + (bldg_diameter / 6), + bldg_center.y + 1, + base - (bldg_diameter / 15) + (bldg_diameter / 2) - 1, + ), + }); + let bldg_room2_top_half = painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 6) + 1) + .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), + max: (bldg_center + (bldg_diameter / 6)).with_z( + base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), + ), + }); let bldg_room2_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 6) + 1).with_z( @@ -3791,15 +3826,7 @@ impl Structure for SeaChapel { base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), ), }) - .without( - painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 6)).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), - ), - max: (bldg_center + (bldg_diameter / 6)) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), - }), - ); + .intersect(bldg_room2_top_half); let bldg_room2_washed_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 6)).with_z( @@ -3809,15 +3836,7 @@ impl Structure for SeaChapel { base - (bldg_diameter / 15) + (bldg_diameter / 2) + (bldg_diameter / 6), ), }) - .without( - painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 6)).with_z( - base - (bldg_diameter / 15) + (bldg_diameter / 2) - (bldg_diameter / 6), - ), - max: (bldg_center + (bldg_diameter / 6)) - .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2)), - }), - ); + .intersect(bldg_room2_top_half); let bldg_room2_goldring = painter.cylinder(Aabb { min: (bldg_center - (bldg_diameter / 6)) .with_z(base - (bldg_diameter / 15) + (bldg_diameter / 2) + 1), @@ -3919,6 +3938,22 @@ impl Structure for SeaChapel { - 2, ), }; + let bldg_room3_washed_top_half = painter.cylinder(Aabb { + min: (bldg_center - (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 2, + ), + max: (bldg_center + (bldg_diameter / 7)).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (2 * (bldg_diameter / 7)) + - 2, + ), + }); let bldg_room3_washed_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 7)).with_z( @@ -3932,18 +3967,7 @@ impl Structure for SeaChapel { - 2, ), }) - .without(painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 7)).with_z( - base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, - ), - max: (bldg_center + (bldg_diameter / 7)).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 2, - ), - })); + .intersect(bldg_room3_washed_top_half); let bldg_room3_top = painter .sphere(Aabb { min: (bldg_center - (bldg_diameter / 7) + 1).with_z( @@ -3957,18 +3981,7 @@ impl Structure for SeaChapel { - 2, ), }) - .without(painter.cylinder(Aabb { - min: (bldg_center - (bldg_diameter / 7)).with_z( - base - (bldg_diameter / 15) + tower_height + (bldg_diameter / 4) - 2, - ), - max: (bldg_center + (bldg_diameter / 7)).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 2, - ), - })); + .intersect(bldg_room3_washed_top_half); let bldg_room3_goldring = Aabb { min: (bldg_center - (bldg_diameter / 7)).with_z( base - (bldg_diameter / 15) @@ -3995,39 +4008,38 @@ impl Structure for SeaChapel { - 3, ), }; - let bldg_room3_floor = painter - .sphere(Aabb { - min: (bldg_center - 3).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 8, - ), - max: (bldg_center + 3).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 7, - ), - }) - .without(painter.cylinder(Aabb { - min: (bldg_center - 2).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 8, - ), - max: (bldg_center + 2).with_z( - base - (bldg_diameter / 15) - + tower_height - + (bldg_diameter / 4) - + (bldg_diameter / 7) - - 7, - ), - })); + let bldg_room3_floor = painter.sphere(Aabb { + min: (bldg_center - 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 8, + ), + max: (bldg_center + 3).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 7, + ), + }); + let bldg_room3_floor_clear = painter.cylinder(Aabb { + min: (bldg_center - 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 8, + ), + max: (bldg_center + 2).with_z( + base - (bldg_diameter / 15) + + tower_height + + (bldg_diameter / 4) + + (bldg_diameter / 7) + - 7, + ), + }); let bldg_tower_floors_clear = Aabb { min: (bldg_center - 3).with_z(base - (bldg_diameter / 3) + 2), max: (bldg_center + 3).with_z( @@ -4500,7 +4512,7 @@ impl Structure for SeaChapel { for _ in 0..(1 + ((RandomField::new(0).get((bldg_cellar_sea_croc_pos).with_z(base))) % 2)) { - painter.spawn( + filler.spawn( EntityInfo::at(bldg_cellar_sea_croc_pos.as_()) .with_asset_expect("common.entity.wild.aggressive.sea_crocodile", &mut rng), ) @@ -4508,37 +4520,38 @@ impl Structure for SeaChapel { match bldg_variant { 0..=2 => { // paint SeaHut - painter.sphere(bldg_cellar).fill(white.clone()); - painter.sphere(bldg_cellar_clear).clear(); - painter.sphere(bldg_room).fill(white.clone()); - painter.aabb(bldg_hut_entry_clear1).clear(); - painter.aabb(bldg_hut_entry_clear2).clear(); - bldg_room_windows.fill(window_ver.clone()); - bldg_top.fill(top.clone()); - bldg_washed_top.fill(washed.clone()); - painter.sphere(bldg_room_clear).clear(); - bldg_room_goldring.fill(gold.clone()); - bldg_room_goldring_clear.clear(); - painter.cylinder(bldg_room_floor).fill(white.clone()); - painter.cylinder(bldg_hut_floors_clear).clear(); - painter.cylinder(bldg_hut_ropefix1).fill(ropefix1.clone()); - painter.aabb(bldg_hut_ropefix2).fill(ropefix2.clone()); - painter.aabb(bldg_hut_rope).fill(rope.clone()); - painter.cylinder(bldg_water_puddle).fill(water.clone()); - painter.cylinder(bldg_connect_tube).fill(white.clone()); - painter.cylinder(bldg_connect_water).fill(water.clone()); - painter.cylinder(bldg_connect_entry).fill(white.clone()); - painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); - painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern); - painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); - painter.sprite(bldg_floor_bed_pos, SpriteKind::Bed); - painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerSmall); - painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor); + painter.sphere(bldg_cellar).fill(white, filler); + painter.sphere(bldg_cellar_clear).clear(filler); + painter.sphere(bldg_room).fill(white, filler); + painter.aabb(bldg_hut_entry_clear1).clear(filler); + painter.aabb(bldg_hut_entry_clear2).clear(filler); + bldg_room_windows_1.fill(window_ver, filler); + bldg_room_windows_2.fill(window_ver, filler); + bldg_top.fill(top, filler); + bldg_washed_top.fill(washed, filler); + painter.sphere(bldg_room_clear).clear(filler); + bldg_room_goldring.fill(gold, filler); + bldg_room_goldring_clear.clear(filler); + painter.cylinder(bldg_room_floor).fill(white, filler); + painter.cylinder(bldg_hut_floors_clear).clear(filler); + painter.cylinder(bldg_hut_ropefix1).fill(ropefix1, filler); + painter.aabb(bldg_hut_ropefix2).fill(ropefix2, filler); + painter.aabb(bldg_hut_rope).fill(rope, filler); + painter.cylinder(bldg_water_puddle).fill(water, filler); + painter.cylinder(bldg_connect_tube).fill(white, filler); + painter.cylinder(bldg_connect_water).fill(water, filler); + painter.cylinder(bldg_connect_entry).fill(white, filler); + painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern, filler); + painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern, filler); + painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1, filler); + painter.sprite(bldg_floor_bed_pos, SpriteKind::Bed, filler); + painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerSmall, filler); + painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor, filler); // bldg floor Sea Clerics for _ in 0..(1 + ((RandomField::new(0).get((bldg_floor_sea_cleric_pos).with_z(base))) % 2)) { - painter.spawn( + filler.spawn( EntityInfo::at(bldg_floor_sea_cleric_pos.as_()).with_asset_expect( "common.entity.dungeon.sea_chapel.sea_cleric", &mut rng, @@ -4548,112 +4561,116 @@ impl Structure for SeaChapel { }, 3..=5 => { // paint SeaPavillon - painter.sphere(bldg_cellar).fill(white.clone()); - painter.sphere(bldg_cellar_clear).clear(); - painter.sphere(bldg_room).fill(white.clone()); - painter.aabb(bldg_pavillon_entry_clear1).clear(); - painter.aabb(bldg_pavillon_entry_clear2).clear(); - painter.aabb(bldg_pavillon_entry_clear3).clear(); - painter.aabb(bldg_pavillon_entry_clear4).clear(); - painter.aabb(bldg_pavillon_entry_clear5).clear(); - painter.aabb(bldg_pavillon_entry_clear6).clear(); - bldg_top.fill(top.clone()); - bldg_washed_top.fill(washed.clone()); - painter.sphere(bldg_room_clear).clear(); - bldg_room_goldring.fill(gold.clone()); - bldg_room_goldring_clear.clear(); - painter.cylinder(bldg_hut_floors_clear).clear(); - painter.cylinder(bldg_hut_ropefix1).fill(ropefix1.clone()); - painter.aabb(bldg_hut_ropefix2).fill(ropefix2.clone()); - painter.aabb(bldg_hut_rope).fill(rope.clone()); - painter.cylinder(bldg_water_puddle).fill(water.clone()); - painter.cylinder(bldg_connect_tube).fill(white.clone()); - painter.cylinder(bldg_connect_water).fill(water.clone()); - painter.cylinder(bldg_connect_entry).fill(white.clone()); - painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); - painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); + painter.sphere(bldg_cellar).fill(white, filler); + painter.sphere(bldg_cellar_clear).clear(filler); + painter.sphere(bldg_room).fill(white, filler); + painter.aabb(bldg_pavillon_entry_clear1).clear(filler); + painter.aabb(bldg_pavillon_entry_clear2).clear(filler); + painter.aabb(bldg_pavillon_entry_clear3).clear(filler); + painter.aabb(bldg_pavillon_entry_clear4).clear(filler); + painter.aabb(bldg_pavillon_entry_clear5).clear(filler); + painter.aabb(bldg_pavillon_entry_clear6).clear(filler); + bldg_top.fill(top, filler); + bldg_washed_top.fill(washed, filler); + painter.sphere(bldg_room_clear).clear(filler); + bldg_room_goldring.fill(gold, filler); + bldg_room_goldring_clear.clear(filler); + painter.cylinder(bldg_hut_floors_clear).clear(filler); + painter.cylinder(bldg_hut_ropefix1).fill(ropefix1, filler); + painter.aabb(bldg_hut_ropefix2).fill(ropefix2, filler); + painter.aabb(bldg_hut_rope).fill(rope, filler); + painter.cylinder(bldg_water_puddle).fill(water, filler); + painter.cylinder(bldg_connect_tube).fill(white, filler); + painter.cylinder(bldg_connect_water).fill(water, filler); + painter.cylinder(bldg_connect_entry).fill(white, filler); + painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern, filler); + painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1, filler); }, 6..=9 => { // paint SeaTower - painter.sphere(bldg_cellar).fill(white.clone()); - painter.sphere(bldg_cellar_clear).clear(); - painter.sphere(bldg_room).fill(white.clone()); - painter.aabb(bldg_hut_entry_clear1).clear(); - painter.aabb(bldg_hut_entry_clear2).clear(); - bldg_room_windows.fill(window_ver.clone()); - bldg_top.fill(top.clone()); - bldg_washed_top.fill(washed.clone()); - painter.sphere(bldg_room2).fill(white.clone()); - bldg_room2_windows1.fill(window_ver.clone()); - bldg_room2_windows2.fill(window_ver2.clone()); - bldg_room2_washed_top.fill(washed.clone()); - bldg_room2_top.fill(top.clone()); - painter.sphere(bldg_room2_clear).clear(); - bldg_room2_goldring.fill(gold.clone()); - bldg_room2_goldring_clear.clear(); - painter.sphere(bldg_room_clear).clear(); - bldg_room_goldring.fill(gold.clone()); - bldg_room_goldring_clear.clear(); - painter.cylinder(bldg_room_floor).fill(white.clone()); - painter.cylinder(bldg_room2_floor).fill(white.clone()); - bldg_tube.fill(white.clone()); - bldg_tube_clear.clear(); - painter.aabb(bldg_tube_windows1).fill(window_ver2.clone()); - painter.aabb(bldg_tube_windows2).fill(window_ver2.clone()); - painter.aabb(bldg_tube_windows3).fill(window_ver.clone()); - painter.aabb(bldg_tube_windows4).fill(window_ver.clone()); - painter.sphere(bldg_room3).fill(white.clone()); - bldg_room3_washed_top.fill(washed.clone()); - bldg_room3_top.fill(top.clone()); - painter.cylinder(bldg_room3_goldring).fill(gold.clone()); - painter.sphere(bldg_room3_clear).clear(); - painter.aabb(bldg_room3_entry_clear1).clear(); - painter.aabb(bldg_room3_entry_clear2).clear(); - painter.aabb(bldg_room3_entry_clear3).clear(); - painter.aabb(bldg_room3_entry_clear4).clear(); - painter.cylinder(bldg_floor2_wall).fill(white.clone()); + painter.sphere(bldg_cellar).fill(white, filler); + painter.sphere(bldg_cellar_clear).clear(filler); + painter.sphere(bldg_room).fill(white, filler); + painter.aabb(bldg_hut_entry_clear1).clear(filler); + painter.aabb(bldg_hut_entry_clear2).clear(filler); + bldg_room_windows_1.fill(window_ver, filler); + bldg_room_windows_2.fill(window_ver, filler); + bldg_top.fill(top, filler); + bldg_washed_top.fill(washed, filler); + painter.sphere(bldg_room2).fill(white, filler); + bldg_room2_windows1.fill(window_ver, filler); + bldg_room2_windows2.fill(window_ver, filler); + bldg_room2_windows3.fill(window_ver2, filler); + bldg_room2_windows4.fill(window_ver2, filler); + bldg_room2_washed_top.fill(washed, filler); + bldg_room2_top.fill(top, filler); + painter.sphere(bldg_room2_clear).clear(filler); + bldg_room2_goldring.fill(gold, filler); + bldg_room2_goldring_clear.clear(filler); + painter.sphere(bldg_room_clear).clear(filler); + bldg_room_goldring.fill(gold, filler); + bldg_room_goldring_clear.clear(filler); + painter.cylinder(bldg_room_floor).fill(white, filler); + painter.cylinder(bldg_room2_floor).fill(white, filler); + bldg_tube.fill(white, filler); + bldg_tube_clear.clear(filler); + painter.aabb(bldg_tube_windows1).fill(window_ver2, filler); + painter.aabb(bldg_tube_windows2).fill(window_ver2, filler); + painter.aabb(bldg_tube_windows3).fill(window_ver, filler); + painter.aabb(bldg_tube_windows4).fill(window_ver, filler); + painter.sphere(bldg_room3).fill(white, filler); + bldg_room3_washed_top.fill(washed, filler); + bldg_room3_top.fill(top, filler); + painter.cylinder(bldg_room3_goldring).fill(gold, filler); + painter.sphere(bldg_room3_clear).clear(filler); + painter.aabb(bldg_room3_entry_clear1).clear(filler); + painter.aabb(bldg_room3_entry_clear2).clear(filler); + painter.aabb(bldg_room3_entry_clear3).clear(filler); + painter.aabb(bldg_room3_entry_clear4).clear(filler); + painter.cylinder(bldg_floor2_wall).fill(white, filler); painter .aabb(bldg_floor2_glass_barriers) - .fill(glass_barrier.clone()); - painter.cylinder(bldg_tower_floors_clear).clear(); - painter.aabb(bldg_floor2_step).fill(gold_decor.clone()); - bldg_room3_floor.fill(white.clone()); - painter.cylinder(bldg_tower_ropefix1).fill(ropefix1.clone()); - painter.aabb(bldg_tower_ropefix2).fill(ropefix2.clone()); - painter.aabb(bldg_tower_rope).fill(rope.clone()); - bldg_gold_top_antlers2.fill(gold.clone()); - bldg_gold_top_antlers2_clear.clear(); - bldg_gold_top_antlers4.fill(gold.clone()); - bldg_gold_top_antlers4_clear.clear(); - bldg_gold_top_antlers5.fill(gold.clone()); - bldg_gold_top_antlers5_clear.clear(); - painter.sphere(bldg_gold_top1).fill(gold.clone()); - painter.aabb(bldg_gold_top_pole).fill(gold.clone()); - painter.aabb(bldg_gold_top_antlers1).fill(gold.clone()); - painter.aabb(bldg_gold_top_antlers3).fill(gold.clone()); - painter.cylinder(bldg_water_puddle).fill(water.clone()); - painter.cylinder(bldg_connect_tube).fill(white.clone()); - painter.cylinder(bldg_connect_water).fill(water.clone()); - painter.cylinder(bldg_connect_entry).fill(white.clone()); - painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern); - painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern); - painter.sprite(bldg_floor2_lantern_pos, SpriteKind::SeashellLantern); - painter.sprite(bldg_floor3_lantern_pos, SpriteKind::SeashellLantern); - painter.sprite(bldg_floor3_drawer_pos, SpriteKind::DrawerSmall); - painter.sprite(bldg_floor3_potion_pos, SpriteKind::PotionMinor); - painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1); + .fill(glass_barrier, filler); + painter.cylinder(bldg_tower_floors_clear).clear(filler); + painter.aabb(bldg_floor2_step).fill(gold_decor, filler); + bldg_room3_floor.fill(white, filler); + bldg_room3_floor_clear.clear(filler); + painter.cylinder(bldg_tower_ropefix1).fill(ropefix1, filler); + painter.aabb(bldg_tower_ropefix2).fill(ropefix2, filler); + painter.aabb(bldg_tower_rope).fill(rope, filler); + bldg_gold_top_antlers2.fill(gold, filler); + bldg_gold_top_antlers2_clear.clear(filler); + bldg_gold_top_antlers4.fill(gold, filler); + bldg_gold_top_antlers4_clear.clear(filler); + bldg_gold_top_antlers5.fill(gold, filler); + bldg_gold_top_antlers5_clear.clear(filler); + painter.sphere(bldg_gold_top1).fill(gold, filler); + painter.aabb(bldg_gold_top_pole).fill(gold, filler); + painter.aabb(bldg_gold_top_antlers1).fill(gold, filler); + painter.aabb(bldg_gold_top_antlers3).fill(gold, filler); + painter.cylinder(bldg_water_puddle).fill(water, filler); + painter.cylinder(bldg_connect_tube).fill(white, filler); + painter.cylinder(bldg_connect_water).fill(water, filler); + painter.cylinder(bldg_connect_entry).fill(white, filler); + painter.sprite(bldg_room_lantern_pos, SpriteKind::SeashellLantern, filler); + painter.sprite(bldg_floor_lantern_pos, SpriteKind::SeashellLantern, filler); + painter.sprite(bldg_floor2_lantern_pos, SpriteKind::SeashellLantern, filler); + painter.sprite(bldg_floor3_lantern_pos, SpriteKind::SeashellLantern, filler); + painter.sprite(bldg_floor3_drawer_pos, SpriteKind::DrawerSmall, filler); + painter.sprite(bldg_floor3_potion_pos, SpriteKind::PotionMinor, filler); + painter.sprite(bldg_cellar_chest_pos, SpriteKind::DungeonChest1, filler); painter .aabb(bldg_floor2_coral_chest_podium) - .fill(gold_decor.clone()); - painter.rotated_sprite(bldg_floor2_coral_chest_pos, SpriteKind::CoralChest, 0); - painter.sprite(bldg_floor_bed_pos, SpriteKind::Bed); - painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerSmall); - painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor); + .fill(gold_decor, filler); + painter.rotated_sprite(bldg_floor2_coral_chest_pos, SpriteKind::CoralChest, 0, filler); + painter.sprite(bldg_floor_bed_pos, SpriteKind::Bed, filler); + painter.sprite(bldg_floor_drawer_pos, SpriteKind::DrawerSmall, filler); + painter.sprite(bldg_floor_potion_pos, SpriteKind::PotionMinor, filler); // bldg floor Sea Clerics for _ in 0..(1 + ((RandomField::new(0).get((bldg_floor_sea_cleric_pos).with_z(base))) % 2)) { - painter.spawn( + filler.spawn( EntityInfo::at(bldg_floor_sea_cleric_pos.as_()).with_asset_expect( "common.entity.dungeon.sea_chapel.sea_cleric", &mut rng, @@ -4665,7 +4682,7 @@ impl Structure for SeaChapel { + ((RandomField::new(0).get((bldg_floor3_sea_cleric_pos).with_z(base))) % 2)) { - painter.spawn( + filler.spawn( EntityInfo::at(bldg_floor3_sea_cleric_pos.as_()).with_asset_expect( "common.entity.dungeon.sea_chapel.sea_cleric", &mut rng, @@ -4681,7 +4698,7 @@ impl Structure for SeaChapel { ); painter .cylinder(bldg_connect_gate) - .fill(Fill::Block(Block::air(connect_gate_type))); + .fill(filler.block(Block::air(connect_gate_type)), filler); } // surrounding buildings foundling, small hut, small pavillon for dir in NEIGHBORS { @@ -4751,6 +4768,12 @@ impl Structure for SeaChapel { su_bldg_base + (su_bldg_diameter / 15) + 2, ), }; + let su_bldg_top_half = painter.cylinder(Aabb { + min: (su_bldg_center - (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6)), + max: (su_bldg_center + (su_bldg_diameter / 6)) + .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), + }); let su_bldg_top = painter .sphere(Aabb { min: (su_bldg_center - (su_bldg_diameter / 6)) @@ -4758,15 +4781,7 @@ impl Structure for SeaChapel { max: (su_bldg_center + (su_bldg_diameter / 6)) .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (su_bldg_center - (su_bldg_diameter / 6)) - .with_z(su_bldg_base - (su_bldg_diameter / 15)), - max: (su_bldg_center + (su_bldg_diameter / 6)).with_z( - su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6), - ), - }), - ); + .intersect(su_bldg_top_half); let su_bldg_washed_top = painter .sphere(Aabb { min: (su_bldg_center - (su_bldg_diameter / 6)) @@ -4774,15 +4789,7 @@ impl Structure for SeaChapel { max: (su_bldg_center + (su_bldg_diameter / 6) - 1) .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 3)), }) - .without( - painter.cylinder(Aabb { - min: (su_bldg_center - (su_bldg_diameter / 6)) - .with_z(su_bldg_base - (su_bldg_diameter / 15)), - max: (su_bldg_center + (su_bldg_diameter / 6)).with_z( - su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6), - ), - }), - ); + .intersect(su_bldg_top_half); let su_bldg_goldring = Aabb { min: (su_bldg_center - (su_bldg_diameter / 6)) .with_z(su_bldg_base - (su_bldg_diameter / 15) + (su_bldg_diameter / 6) + 1), @@ -4912,48 +4919,48 @@ impl Structure for SeaChapel { match su_bldg_variant { 0..=5 => { // common parts for small hut / small pavillon, - painter.sphere(su_bldg_bottom1).fill(white.clone()); - painter.sphere(su_bldg_bottom2).fill(white.clone()); - painter.sphere(su_bldg_room).fill(white.clone()); - su_bldg_top.fill(top.clone()); - su_bldg_washed_top.fill(washed.clone()); - painter.cylinder(su_bldg_goldring).fill(gold.clone()); - painter.sphere(su_bldg_room_clear).clear(); - painter.sprite(su_bldg_room_lantern_pos, SpriteKind::SeashellLantern); + painter.sphere(su_bldg_bottom1).fill(white, filler); + painter.sphere(su_bldg_bottom2).fill(white, filler); + painter.sphere(su_bldg_room).fill(white, filler); + su_bldg_top.fill(top, filler); + su_bldg_washed_top.fill(washed, filler); + painter.cylinder(su_bldg_goldring).fill(gold, filler); + painter.sphere(su_bldg_room_clear).clear(filler); + painter.sprite(su_bldg_room_lantern_pos, SpriteKind::SeashellLantern, filler); match su_bldg_variant { 0..=3 => { // small hut - painter.aabb(su_bldg_hut_entries1).clear(); - painter.aabb(su_bldg_hut_entries2).clear(); - painter.cylinder(su_bldg_floor).fill(white.clone()); - painter.cylinder(su_bldg_floor_entry).clear(); - painter.aabb(su_bldg_ropefix1).fill(ropefix1.clone()); - painter.aabb(su_bldg_ropefix2).fill(ropefix2.clone()); - painter.aabb(su_bldg_rope).fill(rope.clone()); - painter.sprite(su_bldg_floor_lantern_pos, SpriteKind::SeashellLantern); - painter.sprite(su_bldg_floor_drawer_pos, SpriteKind::DrawerSmall); - painter.sprite(su_bldg_floor_potion_pos, SpriteKind::PotionMinor); - painter.sprite(su_bldg_floor_bed_pos, SpriteKind::Bed); + painter.aabb(su_bldg_hut_entries1).clear(filler); + painter.aabb(su_bldg_hut_entries2).clear(filler); + painter.cylinder(su_bldg_floor).fill(white, filler); + painter.cylinder(su_bldg_floor_entry).clear(filler); + painter.aabb(su_bldg_ropefix1).fill(ropefix1, filler); + painter.aabb(su_bldg_ropefix2).fill(ropefix2, filler); + painter.aabb(su_bldg_rope).fill(rope, filler); + painter.sprite(su_bldg_floor_lantern_pos, SpriteKind::SeashellLantern, filler); + painter.sprite(su_bldg_floor_drawer_pos, SpriteKind::DrawerSmall, filler); + painter.sprite(su_bldg_floor_potion_pos, SpriteKind::PotionMinor, filler); + painter.sprite(su_bldg_floor_bed_pos, SpriteKind::Bed, filler); }, _ => { // small pavillon - painter.aabb(su_bldg_pavillon_entries1).clear(); - painter.aabb(su_bldg_pavillon_entries2).clear(); - painter.aabb(su_bldg_pavillon_entries3).clear(); - painter.aabb(su_bldg_pavillon_entries4).clear(); - painter.aabb(su_bldg_pavillon_entries5).clear(); - painter.aabb(su_bldg_pavillon_entries6).clear(); + painter.aabb(su_bldg_pavillon_entries1).clear(filler); + painter.aabb(su_bldg_pavillon_entries2).clear(filler); + painter.aabb(su_bldg_pavillon_entries3).clear(filler); + painter.aabb(su_bldg_pavillon_entries4).clear(filler); + painter.aabb(su_bldg_pavillon_entries5).clear(filler); + painter.aabb(su_bldg_pavillon_entries6).clear(filler); }, } }, 6..=7 => { // foundling - painter.sphere(foundling_bottom1).fill(white.clone()); - painter.sphere(foundling_bottom2).fill(white.clone()); - painter.sphere(foundling_top).fill(white.clone()); + painter.sphere(foundling_bottom1).fill(white, filler); + painter.sphere(foundling_bottom2).fill(white, filler); + painter.sphere(foundling_top).fill(white, filler); }, _ => {}, }; - } */ + } } }