Fixing all sites but bridges

This commit is contained in:
Joshua Yanovski 2023-04-03 00:18:50 -07:00
parent 4e528d1ad2
commit 05489e5b7e
9 changed files with 1840 additions and 1720 deletions

View File

@ -354,7 +354,7 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
Arc<dyn Fn(Vec3<i32>) -> f32 + Send + Sync>,
Arc<dyn Fn(Vec3<i32>) -> f32 + Send + Sync>,
AltIndices,
/* (f32, f32), */
(f32, f32),
),
> {
/* span!(
@ -930,6 +930,11 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
let mut opaque_shallow = Vec::new();
let mut opaque_surface = Vec::new();
let mut fluid_mesh = Mesh::new();
let (underground_alt, deep_alt) = vol
.get_key(vol.pos_key((range.min + range.max) / 2))
.map_or((0.0, 0.0), |c| {
(c.meta().alt() - SHALLOW_ALT, c.meta().alt() - DEEP_ALT)
});
let mut do_draw_greedy = #[inline(always)] |z_start: i32, z_end: i32| {
// dbg!(range.min, z_start, z_end);
let greedy_size = Vec3::new(range.size().w - 2, range.size().h - 2, z_end - z_start + 1);
@ -948,11 +953,8 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
// NOTE: Conversion to f32 is fine since this i32 is actually in bounds for u16.
let mesh_delta = Vec3::new(0.0, 0.0, (z_start + range.min.z) as f32);
let (underground_alt, deep_alt) = vol
.get_key(vol.pos_key((range.min + range.max) / 2))
.map_or((0.0, 0.0), |c| {
(c.meta().alt() - SHALLOW_ALT - mesh_delta.z, c.meta().alt() - DEEP_ALT - mesh_delta.z)
});
let underground_alt = underground_alt - mesh_delta.z;
let deep_alt = deep_alt - mesh_delta.z;
let create_opaque =
#[inline(always)] |atlas_pos, pos: Vec3<f32>, norm, meta| TerrainVertex::new(atlas_pos, pos + mesh_delta, norm, meta);
@ -1129,7 +1131,7 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
deep_end: deep_end * quad_mul,
underground_end: underground_end * quad_mul,
};
// let sun_occluder_z_bounds = ((underground_alt + mesh_delta.z).max(bounds.min.z), bounds.max.z);
let sun_occluder_z_bounds = (underground_alt.max(bounds.min.z), bounds.max.z);
(
opaque_deep
@ -1145,7 +1147,7 @@ pub async fn generate_mesh<'a, F: Future<Output=Option<Model<[u8; 4]>>> + 'a>(
Arc::new(light) as Arc<dyn Fn(Vec3<i32>) -> f32 + Send + Sync>,
Arc::new(glow) as Arc<dyn Fn(Vec3<i32>) -> f32 + Send + Sync>,
alt_indices,
// sun_occluder_z_bounds,
sun_occluder_z_bounds,
),
)
}

View File

@ -110,7 +110,7 @@ pub struct TerrainChunkData {
can_shadow_sun: bool,
z_bounds: (f32, f32),
shadow_z_bounds: (f32, f32),
// sun_occluder_z_bounds: (f32, f32),
sun_occluder_z_bounds: (f32, f32),
frustum_last_plane_index: u8,
alt_indices: AltIndices,
@ -143,7 +143,7 @@ struct ChunkMeshState {
pub struct MeshWorkerResponseMesh {
z_bounds: (f32, f32),
shadow_z_bounds: (f32, f32),
// sun_occluder_z_bounds: (f32, f32),
sun_occluder_z_bounds: (f32, f32),
opaque_model: Option<Model<TerrainVertex>>,
fluid_model: Option<Model<FluidVertex>>,
/// NOTE: These are memory mapped, and must be unmapped!
@ -303,7 +303,7 @@ async fn mesh_worker<'b>(
opaque_mesh,
fluid_mesh,
_shadow_mesh,
(bounds, col_lights_info, light_map, glow_map, alt_indices/*, sun_occluder_z_bounds*/),
(bounds, col_lights_info, light_map, glow_map, alt_indices, sun_occluder_z_bounds),
) = generate_mesh(
&volume,
move |size| async move {
@ -334,7 +334,7 @@ async fn mesh_worker<'b>(
// we can ignore such cases for the purposes of determining a shadow bounding box (but
// not visibility, unfortunately).
shadow_z_bounds: ((chunk.get_min_z() as f32).max(bounds.min.z), (chunk.get_max_z() as f32).min(bounds.max.z)),
// sun_occluder_z_bounds,
sun_occluder_z_bounds,
opaque_model: create_opaque(&opaque_mesh),
fluid_model: create_fluid(&fluid_mesh),
/* locals: create_locals(), */
@ -1627,7 +1627,7 @@ impl/*<V: RectRasterableVol>*/ Terrain<V> {
blocks_of_interest: response.blocks_of_interest,
z_bounds: mesh.z_bounds,
shadow_z_bounds: mesh.shadow_z_bounds,
// sun_occluder_z_bounds: mesh.sun_occluder_z_bounds,
sun_occluder_z_bounds: mesh.sun_occluder_z_bounds,
frustum_last_plane_index: 0,
alt_indices: mesh.alt_indices,
});
@ -1707,20 +1707,20 @@ impl/*<V: RectRasterableVol>*/ Terrain<V> {
chunk.frustum_last_plane_index = last_plane_index;
chunk.visible.in_frustum = in_frustum;
let chunk_box = Aabb {
/* let chunk_box = Aabb {
min: Vec3::from(chunk_min),
max: Vec3::from(chunk_max),
};
/* let chunk_area = Aabr {
}; */
let chunk_area = Aabr {
min: chunk_pos,
max: chunk_pos + chunk_sz,
}; */
};
if in_frustum {
let visible_box = /* Aabb {
let visible_box = Aabb {
min: chunk_area.min.with_z(chunk.sun_occluder_z_bounds.0),
max: chunk_area.max.with_z(chunk.sun_occluder_z_bounds.1),
} */chunk_box;
}/* chunk_box */;
visible_bounding_box = visible_bounding_box
.map(|e| e.union(visible_box))
.or(Some(visible_box));

View File

@ -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 */{
(

View File

@ -645,17 +645,22 @@ impl<'a, 'b, F: Filler> FillFn<'a, 'b, F> {
}
#[inline]
pub fn brick(&self, bk: BlockKind, col: Rgb<u8>, range: u8) -> impl Fill + Copy {
// FIXME: Statically cache somewhere, or maybe just remove in favor of
// Sampling.
FillVar(move |pos: Vec3<i32>| {
pub fn brick_fn(&self, bk: BlockKind, col: Rgb<u8>, range: u8) -> impl Fn(Vec3<i32>) -> Option<Block> + Copy {
move |pos: Vec3<i32>| {
Some(Block::new(
bk,
col + (RandomField::new(13)
.get((pos + Vec3::new(pos.z, pos.z, 0)) / Vec3::new(2, 2, 1))
% range as u32) as u8,
))
})
}
}
#[inline]
pub fn brick(&self, bk: BlockKind, col: Rgb<u8>, range: u8) -> impl Fill + Copy {
// FIXME: Statically cache somewhere, or maybe just remove in favor of
// Sampling.
FillVar(self.brick_fn(bk, col, range))
}
#[inline]
@ -952,12 +957,17 @@ impl Painter<'_> {
},
Node::Cylinder(aabb) => {
(!Check::CHECK_AABR || (aabb.min.z..aabb.max.z).contains(&pos.z))
&& (pos
.xy()
.as_()
.distance_squared(aabb.as_().center().xy() - 0.5)
as f32)
<= (aabb.size().w.min(aabb.size().h) as f32 / 2.0).powi(2)
&& /*{
let fpos = pos.as_::<f32>().xy() - aabb.as_::<f32>().center().xy() + 0.5;
let size = Vec2::from(aabb.size().as_::<f32>());
(2.0 * fpos / size).magnitude_squared() <= 1.0
}*/
(pos
.xy()
.as_()
.distance_squared(aabb.as_().center().xy() - 0.5)
as f32)
<= (aabb.size().w.min(aabb.size().h) as f32 / 2.0).powi(2)
},
Node::Cone(aabb) => {
(!Check::CHECK_AABR || (aabb.min.z..aabb.max.z).contains(&pos.z))
@ -2406,15 +2416,48 @@ impl Painter<'_> {
)
},
Node::Cylinder(aabb) => {
let center = aabb.as_().center().xy() - 0.5;
let radius_2 = (aabb.size().w.min(aabb.size().h) as f32 / 2.0).powi(2);
return aabb_iter(
*aabb,
mat,
mask,
|pos| pos.xy().as_().distance_squared(center) < radius_2,
hit,
)
let aabr: Aabr<i32> = (*aabb).into();
let aabr_size = aabr.size();
if aabr_size.w == aabr_size.h {
let center = aabr.as_().center() - 0.5;
let radius_2 = (aabr_size.w.min(aabr_size.h) as f32 / 2.0).powi(2);
return aabb_iter(
*aabb,
mat,
mask,
|pos| pos.xy().as_().distance_squared(center) < radius_2,
hit,
)
} else {
// Reverse translation from center.
let center = aabr.center()/*.map(|e| e as f32)*/;
mat = mat * Mat4::<i32>::translation_2d(center);
let mut aabb = Aabb {
// TODO: Try to avoid generating 3/4 of the circle; the interaction with
// masking will require care.
min: aabb.min - center,
max: aabb.max - center,
};
let mut a_ = aabb.max.x;
let mut b_ = aabb.max.y;
let a: f32 = a_ as f32/* - center.x as f32 */- 0.5;
let b: f32 = b_ as f32/* - center.y as f32 */- 0.5;
// NOTE: Guaranteed positive since a,b are all positive (due to AABB being
// enforced valid at construction time).
let a_inv_pow = a.recip().powi(2);
let b_inv_pow = b.recip().powi(2);
let ab_inv_pow = Vec2::new(a_inv_pow, b_inv_pow);
return aabb_iter(
aabb,
mat,
mask,
|pos| {
let rpos = pos.xy().as_::<f32>();
(rpos * rpos).dot(ab_inv_pow) < 1.0
},
hit,
)
}
},
Node::Sphere(aabb) => {
let center = aabb.as_().center() - 0.5;

View File

@ -98,7 +98,7 @@ impl BridgeKind {
}
}
/* fn aabb(min: Vec3<i32>, max: Vec3<i32>) -> Aabb<i32> {
fn aabb(min: Vec3<i32>, max: Vec3<i32>) -> Aabb<i32> {
let aabb = Aabb { min, max }.made_valid();
Aabb {
min: aabb.min,
@ -106,15 +106,15 @@ impl BridgeKind {
}
}
fn render_short(bridge: &Bridge, painter: &Painter) {
/* fn render_short(bridge: &Bridge, painter: &Painter) {
let (bridge_fill, edge_fill) = match bridge.biome {
BiomeKind::Desert => (
Fill::Block(Block::new(BlockKind::Rock, Rgb::new(212, 191, 142))),
Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(190))),
filler.block(Block::new(BlockKind::Rock, Rgb::new(212, 191, 142))),
filler.block(Block::new(BlockKind::Rock, Rgb::gray(190))),
),
_ => (
Fill::Brick(BlockKind::Rock, Rgb::gray(70), 25),
Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(130))),
filler.brick(BlockKind::Rock, Rgb::gray(70), 25),
filler.block(Block::new(BlockKind::Rock, Rgb::gray(130))),
),
};
@ -191,7 +191,7 @@ fn render_short(bridge: &Bridge, painter: &Painter) {
)
.translate(Vec3::new(0, 0, t))
.without(b)
.clear();
.clear(filler);
*/
b.without(remove).fill(bridge_fill);
@ -208,8 +208,8 @@ fn render_short(bridge: &Bridge, painter: &Painter) {
}
fn render_flat(bridge: &Bridge, painter: &Painter) {
let rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(50)));
let light_rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(130)));
let rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(50)));
let light_rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(130)));
let orth_dir = bridge.dir.orthogonal();
@ -244,11 +244,11 @@ fn render_flat(bridge: &Bridge, painter: &Painter) {
))
};
ramp_prim(ramp_aabr, 1).fill(light_rock.clone());
ramp_prim(ramp_aabr, 1).fill(light_rock, filler);
let ramp_aabr = orth_dir.trim_aabr(ramp_aabr, 1);
ramp_prim(ramp_aabr, 5).clear();
ramp_prim(ramp_aabr, 0).fill(rock.clone());
ramp_prim(ramp_aabr, 5).clear(filler);
ramp_prim(ramp_aabr, 0).fill(rock, filler);
let vault_width = 12;
let vault_offset = 5;
@ -285,7 +285,7 @@ fn render_flat(bridge: &Bridge, painter: &Painter) {
aabr.min.with_z(bridge.end.z + 1),
aabr.max.with_z(bridge.end.z + 8),
))
.clear();
.clear(filler);
painter
.aabb(aabb(
@ -296,8 +296,8 @@ fn render_flat(bridge: &Bridge, painter: &Painter) {
}
fn render_heightened_viaduct(bridge: &Bridge, painter: &Painter, data: &HeightenedViaduct) {
let rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(50)));
let light_rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(130)));
let rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(50)));
let light_rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(130)));
let orth_dir = bridge.dir.orthogonal();
let orthogonal = orth_dir.to_vec2();
@ -456,7 +456,7 @@ fn render_heightened_viaduct(bridge: &Bridge, painter: &Painter, data: &Heighten
br.translate(Vec3::unit_z() * 5)
.without(br.translate(-Vec3::unit_z()))
.clear();
.clear(filler);
/*
let place_lights = |center: Vec3<i32>| {
@ -512,8 +512,8 @@ fn render_heightened_viaduct(bridge: &Bridge, painter: &Painter, data: &Heighten
}
fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
let rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(50)));
let wood = Fill::Block(Block::new(BlockKind::Wood, Rgb::new(40, 28, 20)));
let rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(50)));
let wood = filler.block(Block::new(BlockKind::Wood, Rgb::new(40, 28, 20)));
let tower_size = 5;
@ -541,14 +541,14 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
tower_aabr.min.with_z(bridge.start.z - 5),
tower_aabr.max.with_z(tower_end),
))
.fill(rock.clone());
.fill(rock, filler);
painter
.aabb(aabb(
(tower_aabr.min + 1).with_z(bridge.start.z),
(tower_aabr.max - 1).with_z(tower_end - 1),
))
.clear();
.clear(filler);
let c = (-bridge.dir).select_aabr_with(tower_aabr, tower_aabr.center());
painter
@ -556,7 +556,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
(c - orthogonal).with_z(bridge.start.z),
(c + orthogonal).with_z(bridge.start.z + 2),
))
.clear();
.clear(filler);
let ramp_height = 8;
@ -568,7 +568,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
painter
.aabb(ramp_aabb)
.without(painter.ramp(ramp_aabb, -bridge.dir))
.clear();
.clear(filler);
let c = bridge.dir.select_aabr_with(tower_aabr, tower_aabr.center());
painter
@ -576,7 +576,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
(c - orthogonal).with_z(bridge.end.z),
(c + orthogonal).with_z(bridge.end.z + 2),
))
.clear();
.clear(filler);
let stair_thickness = 2;
painter
@ -588,7 +588,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
stair_thickness,
bridge.dir.rotated_ccw(),
)
.fill(rock.clone());
.fill(rock, filler);
let aabr = bridge
.dir
.rotated_cw()
@ -599,14 +599,14 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
aabr.min.with_z(bridge.end.z - 1),
aabr.max.with_z(bridge.end.z - 1),
))
.fill(rock.clone());
.fill(rock, filler);
painter
.aabb(aabb(
tower_aabr.center().with_z(bridge.start.z),
tower_aabr.center().with_z(bridge.end.z - 1),
))
.fill(rock.clone());
.fill(rock, filler);
let offset = tower_size * 2 - 2;
let d = tweak!(2);
@ -635,7 +635,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
(tower_aabr.min - 1).with_z(tower_end + 1),
(tower_aabr.max + 1).with_z(tower_end + 2),
))
.fill(rock.clone());
.fill(rock, filler);
painter
.aabbs_around_aabb(
@ -646,14 +646,14 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
1,
1,
)
.fill(rock.clone());
.fill(rock, filler);
painter
.aabb(aabb(
tower_aabr.min.with_z(tower_end + 2),
tower_aabr.max.with_z(tower_end + 2),
))
.clear();
.clear(filler);
painter
.aabbs_around_aabb(
@ -664,7 +664,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
1,
4,
)
.fill(Fill::Sprite(SpriteKind::FireBowlGround));
.fill(filler.sprite(SpriteKind::FireBowlGround));
},
RoofKind::Hipped => {
painter
@ -711,7 +711,7 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
(start - orthogonal * bridge_width).with_z(bridge.end.z),
(bridge.end + orthogonal * bridge_width).with_z(bridge.end.z + 5),
))
.clear();
.clear(filler);
let light_spacing = 10;
let n = len / light_spacing;
@ -725,16 +725,16 @@ fn render_tower(bridge: &Bridge, painter: &Painter, roof_kind: &RoofKind) {
painter.sprite(c + orthogonal * bridge_width, SpriteKind::StreetLamp);
painter.sprite(c - orthogonal * bridge_width, SpriteKind::StreetLamp);
}
}
} */
fn render_hang(bridge: &Bridge, painter: &Painter) {
fn render_hang<'a, F: Filler>(bridge: &Bridge, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) {
let orth_dir = bridge.dir.orthogonal();
let orthogonal = orth_dir.to_vec2();
let forward = bridge.dir.to_vec2();
let rock = Fill::Block(Block::new(BlockKind::Rock, Rgb::gray(50)));
let wood = Fill::Block(Block::new(BlockKind::Wood, Rgb::new(133, 94, 66)));
let rock = filler.block(Block::new(BlockKind::Rock, Rgb::gray(50)));
let wood = filler.block(Block::new(BlockKind::Wood, Rgb::new(133, 94, 66)));
let bridge_width = bridge.width();
let side = orthogonal * bridge_width;
@ -755,14 +755,14 @@ fn render_hang(bridge: &Bridge, painter: &Painter) {
ramp_f.min.with_z(bridge.start.z - 10),
ramp_f.max.with_z(bridge.start.z),
))
.fill(rock.clone());
.fill(rock, filler);
painter
.ramp_inset(
aabb(ramp_f.min.with_z(bridge.start.z), ramp_f.max.with_z(top)),
top - bridge.start.z + 1,
bridge.dir,
)
.fill(rock.clone());
.fill(rock, filler);
let [ramp_b, aabr] = (-bridge.dir).split_aabr(aabr, top_offset + 1);
painter
@ -770,13 +770,13 @@ fn render_hang(bridge: &Bridge, painter: &Painter) {
ramp_b.min.with_z(bridge.end.z - 10),
ramp_b.max.with_z(bridge.end.z),
))
.fill(rock.clone());
.fill(rock, filler);
painter
.ramp(
aabb(ramp_b.min.with_z(bridge.end.z), ramp_b.max.with_z(top)),
-bridge.dir,
)
.fill(rock.clone());
.fill(rock, filler);
let len = bridge.dir.select(aabr.size());
@ -797,34 +797,56 @@ fn render_hang(bridge: &Bridge, painter: &Painter) {
let c = aabr.center();
let cylinder = painter
.horizontal_cylinder(
.aabb(aabb(
aabr.min.with_z(bottom),
aabr.max.with_z(bottom + h),
)).as_kind()
.intersect(painter.horizontal_cylinder(
aabb(
(c - forward * w - side).with_z(bottom),
(c + forward * w + side).with_z(bottom + h * 2),
),
orth_dir,
)
.intersect(painter.aabb(aabb(
aabr.min.with_z(bottom),
aabr.max.with_z(bottom + h * 2),
)));
));
cylinder.fill(wood.clone());
/* cylinder.fill(wood, filler);
cylinder.translate(Vec3::unit_z()).clear();
cylinder.translate(Vec3::unit_z()).clear(filler); */
cylinder.fill(wood, filler);
let edges = cylinder
.without(cylinder.translate(Vec3::unit_z()))
let edges = painter.union_all([
painter.aabb(aabb(
(c - forward * w - side).with_z(bottom + 1),
(c + forward * w - orthogonal * (bridge_width - 1)).with_z(bottom + h + 1),
)),
painter.aabb(aabb(
(c - forward * w + orthogonal * (bridge_width - 1)).with_z(bottom + 1),
(c + forward * w + side).with_z(bottom + h + 1),
)),
].into_iter()).as_kind();
let edges_clear =
painter.aabb(aabb(
(c - forward * w - orthogonal * (bridge_width - 1)).with_z(bottom + 1),
(c + forward * w + orthogonal * (bridge_width - 1)).with_z(bottom + h + 1),
)).as_kind().intersect(cylinder.translate(Vec3::unit_z()))
.union(edges.translate(Vec3::unit_z() * 2).intersect(cylinder.translate(Vec3::unit_z() * 3)));
/* .without(cylinder.translate(Vec3::unit_z()))
.without(painter.aabb(aabb(
(c - forward * w - orthogonal * (bridge_width - 1)).with_z(bottom),
(c + forward * w + orthogonal * (bridge_width - 1)).with_z(bottom + h * 2),
)));
))) */;
edges
edges.intersect(cylinder.translate(Vec3::unit_z()))
.fill(filler.sprite(SpriteKind::Rope), filler);
edges.translate(Vec3::unit_z()).intersect(cylinder.translate(Vec3::unit_z() * 2))
.fill(wood, filler);
/* edges_clear
.translate(Vec3::unit_z())
.fill(Fill::Sprite(SpriteKind::Rope));
edges.translate(Vec3::unit_z() * 2).fill(wood);
.clear(filler); */
edges_clear
.clear(filler);
let column_height = 3;
let column_range = top..=top + column_height;
@ -833,26 +855,26 @@ fn render_hang(bridge: &Bridge, painter: &Painter) {
bridge.dir.select_aabr_with(ramp_f, ramp_f.min),
column_range.clone(),
)
.fill(rock.clone());
.fill(rock, filler);
painter
.column(
bridge.dir.select_aabr_with(ramp_f, ramp_f.max),
column_range.clone(),
)
.fill(rock.clone());
.fill(rock, filler);
painter
.column(
(-bridge.dir).select_aabr_with(ramp_b, ramp_b.min),
column_range.clone(),
)
.fill(rock.clone());
.fill(rock, filler);
painter
.column(
(-bridge.dir).select_aabr_with(ramp_b, ramp_b.max),
column_range,
)
.fill(rock);
} */
.fill(rock, filler);
}
pub struct Bridge {
pub(crate) start: Vec3<i32>,
@ -948,13 +970,14 @@ impl<F: Filler> Structure<F> for Bridge {
const UPDATE_FN: &'static [u8] = b"render_bridge\0";
#[cfg_attr(feature = "be-dyn-lib", export_name = "render_bridge")]
fn render_inner<'a>(&self, _site: &Site, land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) {
/* match &self.kind {
BridgeKind::Flat => render_flat(self, painter),
fn render_inner<'a>(&self, _site: &Site, _land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) {
match &self.kind {
/* BridgeKind::Flat => render_flat(self, painter),
BridgeKind::Tower(roof) => render_tower(self, painter, roof),
BridgeKind::Short => render_short(self, painter),
BridgeKind::HeightenedViaduct(data) => render_heightened_viaduct(self, painter, data),
BridgeKind::HangBridge => render_hang(self, painter),
} */
BridgeKind::HeightenedViaduct(data) => render_heightened_viaduct(self, painter, data), */
BridgeKind::HangBridge => render_hang(self, painter, filler),
_ => {},
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -43,7 +43,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
#[cfg_attr(feature = "be-dyn-lib", export_name = "render_desertcitytemple")]
fn render_inner<'a>(&self, _site: &Site, land: Land, painter: &Painter<'a>, filler: &mut FillFn<'a, '_, F>) {
/* let sandstone = Fill::Sampling(Arc::new(|center| {
let sandstone_fn = |center| {
Some(match (RandomField::new(0).get(center)) % 37 {
0..=8 => Block::new(BlockKind::Rock, Rgb::new(245, 212, 129)),
9..=17 => Block::new(BlockKind::Rock, Rgb::new(246, 214, 133)),
@ -51,8 +51,9 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
27..=35 => Block::new(BlockKind::Rock, Rgb::new(248, 219, 142)),
_ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)),
})
}));
let sandstone_broken = Fill::Sampling(Arc::new(|center| {
};
let sandstone = filler.sampling(&sandstone_fn);
let sandstone_broken_fn = |center| {
Some(match (RandomField::new(0).get(center)) % 42 {
0..=8 => Block::new(BlockKind::Rock, Rgb::new(245, 212, 129)),
9..=17 => Block::new(BlockKind::Rock, Rgb::new(246, 214, 133)),
@ -61,69 +62,79 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
36..=40 => Block::new(BlockKind::Air, Rgb::new(0, 0, 0)),
_ => Block::new(BlockKind::Rock, Rgb::new(235, 178, 99)),
})
}));
};
let sandstone_broken = filler.sampling(&sandstone_broken_fn);
let base = self.alt + 1;
let center = self.bounds.center();
let diameter =
10 + (self.bounds.max.x - self.bounds.min.x).min(self.bounds.max.y - self.bounds.min.y);
// Fence
painter
.aabb(Aabb {
min: (self.bounds.min + 1).with_z(base - 20),
max: (self.bounds.max).with_z(base + 2),
})
.without(painter.aabb(Aabb {
min: (self.bounds.min + 2).with_z(base - 20),
max: (self.bounds.max - 1).with_z(base + 2),
}))
.fill(sandstone_broken);
painter.union_all([
painter.aabb(Aabb {
min: Vec2::new(self.bounds.min.x + 1, self.bounds.min.y + 1).with_z(base - 20),
max: Vec2::new(self.bounds.min.x + 2, self.bounds.max.y).with_z(base + 2),
}),
painter.aabb(Aabb {
min: Vec2::new(self.bounds.max.x - 1, self.bounds.min.y + 1).with_z(base - 20),
max: Vec2::new(self.bounds.max.x, self.bounds.max.y).with_z(base + 2),
}),
painter.aabb(Aabb {
min: Vec2::new(self.bounds.min.x + 1, self.bounds.min.y + 1).with_z(base - 20),
max: Vec2::new(self.bounds.max.x, self.bounds.min.y + 2).with_z(base + 2),
}),
painter.aabb(Aabb {
min: Vec2::new(self.bounds.min.x + 1, self.bounds.max.y - 1).with_z(base - 20),
max: Vec2::new(self.bounds.max.x, self.bounds.max.y).with_z(base + 2),
}),
].into_iter())
.fill(sandstone_broken, filler);
painter
.aabb(Aabb {
min: Vec2::new(self.bounds.min.x + 1, center.y - 8).with_z(base),
max: Vec2::new(self.bounds.max.x, center.y + 8).with_z(base + 7),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - 7, self.bounds.min.y + 1).with_z(base),
max: Vec2::new(center.x + 9, self.bounds.max.y).with_z(base + 7),
})
.clear();
.clear(filler);
// Foundation
painter
.aabb(Aabb {
min: (self.bounds.min + 1).with_z(base - 20),
max: (self.bounds.max).with_z(base),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
// Temple
let temple_color = match (RandomField::new(0).get((center - 3).with_z(base))) % 2 {
0 => Fill::Brick(BlockKind::Rock, Rgb::new(100, 101, 250), 3),
_ => Fill::Brick(BlockKind::Rock, Rgb::new(63, 49, 63), 24),
0 => filler.brick(BlockKind::Rock, Rgb::new(100, 101, 250), 3),
_ => filler.brick(BlockKind::Rock, Rgb::new(63, 49, 63), 24),
};
let temple_size = diameter / 3;
let floaty_block = Fill::Brick(BlockKind::GlowingWeakRock, Rgb::new(253, 240, 149), 2);
let floaty_block = filler.brick(BlockKind::GlowingWeakRock, Rgb::new(253, 240, 149), 2);
let temple = Aabb {
min: (center - temple_size).with_z(base),
max: (center + temple_size - 1).with_z(base + temple_size + 1),
};
// temple with roof carve out
painter.aabb(temple).fill(sandstone.clone());
painter.aabb(temple).fill(sandstone, filler);
// roof decoration
painter
.aabb(Aabb {
min: (center - temple_size - 1).with_z(base + temple_size + 1),
max: (center + temple_size).with_z(base + temple_size + 4),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: (center - temple_size).with_z(base + temple_size + 2),
max: (center + temple_size - 1).with_z(base + temple_size + 4),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size - 1, center.y - (temple_size / 4) - 2)
@ -131,7 +142,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
max: Vec2::new(center.x + temple_size, center.y + (temple_size / 4) + 1)
.with_z(base + temple_size + 4),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - (temple_size / 4) - 2, center.y - temple_size - 1)
@ -139,7 +150,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
max: Vec2::new(center.x + (temple_size / 4) + 1, center.y + temple_size)
.with_z(base + temple_size + 4),
})
.clear();
.clear(filler);
// roof carve out
painter
@ -147,7 +158,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: (center - temple_size + 1).with_z(base + temple_size),
max: (center + temple_size - 2).with_z(base + temple_size + 3),
})
.clear();
.clear(filler);
//corner pillars
for dir in SQUARE_4 {
let corner_pos = center - temple_size;
@ -158,7 +169,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: (pillar_center - 4).with_z(base),
max: (pillar_center + 4).with_z(base + 4),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
// Pillar
painter
@ -166,21 +177,21 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: (pillar_center - 3).with_z(base + 4),
max: (pillar_center + 3).with_z(base + temple_size + 3),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
// Pillar Top
painter
.aabb(Aabb {
min: (pillar_center - 4).with_z(base + temple_size + 3),
max: (pillar_center + 4).with_z(base + temple_size + 6),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: (pillar_center - 3).with_z(base + temple_size + 4),
max: (pillar_center + 3).with_z(base + temple_size + 6),
})
.clear();
.clear(filler);
// clear parts of pillar top for roof carve out
painter
@ -188,7 +199,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: (center - temple_size).with_z(base + temple_size + 3),
max: (center + temple_size - 1).with_z(base + temple_size + 6),
})
.clear()
.clear(filler)
}
// temple decor carve out
@ -217,7 +228,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
)
.with_z(base + temple_size - 1),
})
.clear();
.clear(filler);
}
for c in 0..(temple_size - 5) {
painter
@ -233,7 +244,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
)
.with_z(base + temple_size - 1),
})
.clear();
.clear(filler);
}
},
1 => {
@ -249,7 +260,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
)
.with_z(base + 3 + ((spread + 2) * c) + spread_select),
})
.clear();
.clear(filler);
}
for c in 0..((temple_size / 2) - 2) {
painter
@ -262,7 +273,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
)
.with_z(base + 3 + ((spread + 2) * c) + spread_select),
})
.clear();
.clear(filler);
}
},
_ => {},
@ -273,105 +284,86 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 2)
.with_z(base + 2),
max: Vec2::new(center.x + temple_size - 3, center.y - temple_size + 3)
.with_z(base + temple_size - 1),
})
.fill(temple_color, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 2, center.y + temple_size - 4)
.with_z(base + 2),
max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 3)
.with_z(base + temple_size - 1),
})
.without(
painter.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 3)
.with_z(base + 2),
max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 4)
.with_z(base + temple_size - 1),
}),
)
.fill(temple_color.clone());
.fill(temple_color, filler);
// color inlays2
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 2, center.y - temple_size + 2)
.with_z(base + 2),
max: Vec2::new(center.x - temple_size + 3, center.y + temple_size - 3)
.with_z(base + temple_size - 1),
})
.fill(temple_color, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x + temple_size - 4, center.y - temple_size + 2)
.with_z(base + 2),
max: Vec2::new(center.x + temple_size - 3, center.y + temple_size - 3)
.with_z(base + temple_size - 1),
})
.without(
painter.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 3, center.y - temple_size + 2)
.with_z(base + 2),
max: Vec2::new(center.x + temple_size - 4, center.y + temple_size - 3)
.with_z(base + temple_size - 1),
}),
)
.fill(temple_color.clone());
.fill(temple_color, filler);
// carve outside plane1
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 6, center.y - temple_size).with_z(base + 3),
max: Vec2::new(center.x + temple_size - 7, center.y + temple_size - 1)
max: Vec2::new(center.x + temple_size - 7, center.y - temple_size + 1)
.with_z(base + temple_size - 2),
})
.without(
painter.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 6, center.y - temple_size + 1)
.with_z(base + 3),
max: Vec2::new(center.x + temple_size - 7, center.y + temple_size - 2)
.with_z(base + temple_size - 2),
}),
)
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 6, center.y + temple_size - 3)
.with_z(base + 3),
max: Vec2::new(center.x + temple_size - 7, center.y + temple_size - 2)
.with_z(base + temple_size - 2),
})
.clear(filler);
// carve outside plane2
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size, center.y - temple_size + 6).with_z(base + 3),
max: Vec2::new(center.x - temple_size + 1, center.y + temple_size - 7)
.with_z(base + temple_size - 2),
})
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x + temple_size - 2, center.y - temple_size + 6)
.with_z(base + 3),
max: Vec2::new(center.x + temple_size - 1, center.y + temple_size - 7)
.with_z(base + temple_size - 2),
})
.without(
painter.aabb(Aabb {
min: Vec2::new(center.x - temple_size + 1, center.y - temple_size + 6)
.with_z(base + 3),
max: Vec2::new(center.x + temple_size - 2, center.y + temple_size - 7)
.with_z(base + temple_size - 2),
}),
)
.clear();
// Temple top
.clear(filler);
// Temple Top Socket
painter
.sphere(Aabb {
min: (center - temple_size + 3).with_z(base),
max: (center + temple_size - 4).with_z(base + (2 * temple_size) - 6),
})
.without(painter.aabb(Aabb {
min: (center - temple_size + 2).with_z(base + 1),
max: (center + temple_size - 3).with_z(base + temple_size - 3),
}))
.without(painter.aabb(Aabb {
min: (center - temple_size + 1).with_z(base),
max: (center + temple_size - 1).with_z(base + temple_size),
}))
// carve temple top
.without(painter.sphere(Aabb {
min: (center - temple_size + 5).with_z(base + 2),
max: (center + temple_size - 6).with_z(base + (2 * temple_size) - 8),
}))
.fill(sandstone.clone());
.cylinder(Aabb {
min: (center - temple_size + 3).with_z(base + temple_size),
max: (center + temple_size - 4).with_z(base + temple_size + 1),
})
.fill(sandstone, filler);
// Temple Top
let top = painter.sphere(Aabb {
min: (center - temple_size + 3).with_z(base),
max: (center + temple_size - 4).with_z(base + (2 * temple_size) - 6),
});
top.fill(sandstone, filler);
// temple top decoration
// apply two decoration options (horizontal, vertical, none) with two spread
// options for hor/ver options
for s in 0..2 {
let top = painter
.sphere(Aabb {
min: (center - temple_size + 3).with_z(base),
max: (center + temple_size - 4).with_z(base + (2 * temple_size) - 6),
})
.without(painter.sphere(Aabb {
min: (center - temple_size + 5).with_z(base + 2),
max: (center + temple_size - 6).with_z(base + (2 * temple_size) - 8),
}))
.without(painter.aabb(Aabb {
min: (center - temple_size + 1).with_z(base),
max: (center + temple_size - 2).with_z(base + temple_size + 1),
}));
// decor carve out style
let spread_select =
((RandomField::new(0).get((center - 1 - s).with_z(base))) % 2) as i32;
@ -394,9 +386,9 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
center.y + temple_size - 1,
)
.with_z(base + (2 * temple_size)),
})
}).as_kind()
.intersect(top)
.fill(temple_color.clone());
.fill(temple_color, filler);
}
},
1 => {
@ -413,14 +405,28 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
center.y - temple_size + 3 + ((spread + 2) * c) + spread_select,
)
.with_z(base + (2 * temple_size)),
})
}).as_kind()
.intersect(top)
.fill(temple_color.clone());
.fill(temple_color, filler);
}
},
_ => {},
}
}
// Temple Top Socket
painter
.cylinder(Aabb {
min: (center - temple_size + 3).with_z(base + temple_size),
max: (center + temple_size - 4).with_z(base + temple_size + 1),
})
.fill(sandstone, filler);
// clear top
painter
.sphere(Aabb {
min: (center - temple_size + 4).with_z(base + 1),
max: (center + temple_size - 5).with_z(base + (2 * temple_size) - 7),
})
.clear(filler);
// round or rectangle entries
let entry_select = ((RandomField::new(0).get((center + 1).with_z(base))) % 2) as i32;
@ -432,46 +438,46 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: Vec2::new(center.x - 5, center.y - temple_size).with_z(base),
max: Vec2::new(center.x + 4, center.y + temple_size - 1).with_z(base + 4),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - 4, center.y - temple_size).with_z(base),
max: Vec2::new(center.x + 3, center.y + temple_size - 1).with_z(base + 4),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - 4, center.y - temple_size).with_z(base + 4),
max: Vec2::new(center.x + 3, center.y + temple_size - 1).with_z(base + 7),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base + 4),
max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 7),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base + 7),
max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 9),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - 2, center.y - temple_size).with_z(base + 7),
max: Vec2::new(center.x + 1, center.y + temple_size - 1).with_z(base + 9),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - 2, center.y - temple_size).with_z(base + 9),
max: Vec2::new(center.x + 1, center.y + temple_size - 1).with_z(base + 10),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
// round Temple entries2
painter
@ -479,46 +485,46 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: Vec2::new(center.x - temple_size, center.y - 5).with_z(base),
max: Vec2::new(center.x + temple_size - 1, center.y + 4).with_z(base + 4),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size, center.y - 4).with_z(base),
max: Vec2::new(center.x + temple_size - 1, center.y + 3).with_z(base + 4),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size, center.y - 4).with_z(base + 4),
max: Vec2::new(center.x + temple_size - 1, center.y + 3).with_z(base + 7),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base + 4),
max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 7),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base + 7),
max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 9),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size, center.y - 2).with_z(base + 7),
max: Vec2::new(center.x + temple_size - 1, center.y + 1).with_z(base + 9),
})
.clear();
.clear(filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size, center.y - 2).with_z(base + 9),
max: Vec2::new(center.x + temple_size - 1, center.y + 1).with_z(base + 10),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
},
_ => {
//rectangle Temple entries1
@ -527,13 +533,13 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: Vec2::new(center.x - 5, center.y - temple_size).with_z(base),
max: Vec2::new(center.x + 4, center.y + temple_size - 1).with_z(base + 8),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - 3, center.y - temple_size).with_z(base),
max: Vec2::new(center.x + 2, center.y + temple_size - 1).with_z(base + 6),
})
.clear();
.clear(filler);
//rectangle Temple entries1
painter
@ -541,26 +547,15 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: Vec2::new(center.x - temple_size, center.y - 5).with_z(base),
max: Vec2::new(center.x + temple_size - 1, center.y + 4).with_z(base + 8),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.aabb(Aabb {
min: Vec2::new(center.x - temple_size, center.y - 3).with_z(base),
max: Vec2::new(center.x + temple_size - 1, center.y + 2).with_z(base + 6),
})
.clear();
.clear(filler);
},
}
// Temple Top Socket
painter
.cylinder(Aabb {
min: (center - temple_size + 3).with_z(base + temple_size),
max: (center + temple_size - 4).with_z(base + temple_size + 1),
})
.without(painter.cylinder(Aabb {
min: (center - temple_size + 5).with_z(base + temple_size),
max: (center + temple_size - 6).with_z(base + temple_size + 1),
}))
.fill(sandstone.clone());
// carve temple
painter
@ -568,14 +563,7 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: (center - temple_size + 4).with_z(base),
max: (center + temple_size - 5).with_z(base + temple_size - 1),
})
.clear();
// carve round opening to dome
painter
.cylinder(Aabb {
min: (center - temple_size + 6).with_z(base + temple_size - 1),
max: (center + temple_size - 7).with_z(base + temple_size),
})
.clear();
.clear(filler);
// floating sculpture, placeholder for sun god
@ -584,31 +572,31 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: (center - 3).with_z(base),
max: (center + 2).with_z(base + 5),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (center - 3).with_z(base + 4),
max: (center + 2).with_z(base + 9),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (center - 4).with_z(base + 8),
max: (center + 3).with_z(base + 13),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (center - 4).with_z(base + 14),
max: (center + 3).with_z(base + 15),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (center - 3).with_z(base + 16),
max: (center + 2).with_z(base + 21),
})
.fill(floaty_block.clone());
.fill(floaty_block, filler);
// floating sculptures
for dir in SQUARE_4 {
@ -620,31 +608,31 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: (sclpt_center - 2).with_z(base),
max: (sclpt_center + 1).with_z(base + 3),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (sclpt_center - 2).with_z(base + 2),
max: (sclpt_center + 1).with_z(base + 5),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (sclpt_center - 3).with_z(base + 5),
max: (sclpt_center + 2).with_z(base + 6),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (sclpt_center - 3).with_z(base + 7),
max: (sclpt_center + 2).with_z(base + 8),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (sclpt_center - 2).with_z(base + 9),
max: (sclpt_center + 1).with_z(base + 12),
})
.fill(floaty_block.clone());
.fill(floaty_block, filler);
}
// floating sculpture, placeholder for sun god
@ -654,30 +642,30 @@ impl<F: Filler> Structure<F> for DesertCityTemple {
min: (center - 3).with_z(base),
max: (center + 2).with_z(base + 5),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (center - 3).with_z(base + 4),
max: (center + 2).with_z(base + 9),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (center - 4).with_z(base + 8),
max: (center + 3).with_z(base + 13),
})
.fill(sandstone.clone());
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (center - 4).with_z(base + 14),
max: (center + 3).with_z(base + 15),
})
.fill(sandstone);
.fill(sandstone, filler);
painter
.sphere(Aabb {
min: (center - 3).with_z(base + 16),
max: (center + 2).with_z(base + 21),
})
.fill(floaty_block); */
.fill(floaty_block, filler);
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff