use super::*;
pub struct Environment {
id: Entity,
}
impl std::fmt::Debug for Environment {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Environment")
.field("entity", &self.id.name())
.finish_non_exhaustive()
}
}
impl Environment {
pub fn create(name: &str) -> Self {
let id = World::create_entity(name, ffi::EntityTemplate::Environment);
Self { id }
}
impl_world_accessor!(
Environment,
SunDirection,
Vec3,
sun_direction,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
SunSizeMultiplier,
f32,
sun_size_multiplier,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
GravityVector,
Vec3,
gravity_vector,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
FogDensity,
f32,
fog_density,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
FogHeight,
f32,
fog_height,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
FogHeightFalloff,
f32,
fog_height_falloff,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
FogStart,
f32,
fog_start,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
FogColor,
Vec4,
fog_color,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
Exposure,
f32,
exposure,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
GiVolumeSize,
f32,
gi_volume_size,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
SunColorMultiplier,
Vec3,
sun_color_multiplier,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
AmbientColor,
Vec3,
ambient_color,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
PlanetRadius,
f32,
planet_radius,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
AtmosphereDensity,
f32,
atmosphere_density,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
AtmosphereHeight,
f32,
atmosphere_height,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
RayleighHeight,
f32,
rayleigh_height,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
OzoneHeight,
f32,
ozone_height,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
MieHeight,
f32,
mie_height,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
OzoneWidth,
f32,
ozone_width,
ValueAccessorReadWriteAnimate
);
impl_world_accessor!(
Environment,
SkyExposure,
f32,
sky_exposure,
ValueAccessorReadWriteAnimate
);
pub fn set_collision_matrix(&self, matrix: &CollisionMatrix) {
ffi::v3::set_collision_matrix_rows(0, &matrix.hit);
}
pub fn set_active(&self) {
EntityMessenger::get()
.global_queue()
.set_active(self.id, ComponentType::Environment);
}
}
impl_world_component!(Environment);
#[derive(Clone, PartialEq, Eq)]
pub struct CollisionMatrix {
hit: [u64; 64],
}
impl CollisionMatrix {
pub fn new_full() -> Self {
Self { hit: [!0u64; 64] }
}
pub fn new_empty() -> Self {
Self { hit: [0u64; 64] }
}
pub fn set(&mut self, a: usize, b: usize, can_layers_collide: bool) {
if can_layers_collide {
self.hit[a] |= 1 << b;
self.hit[b] |= 1 << a;
} else {
self.hit[a] &= !(1 << b);
self.hit[b] &= !(1 << a);
}
}
pub fn get(&self, a: usize, b: usize) -> bool {
((self.hit[a] >> b) & 1) != 0
}
}