from pybevy.prelude import *
@resource
class FogSettings(Resource):
def __init__(self):
self.mode = 0 self.density = 0.05
def setup(
commands: Commands,
meshes: ResMut[Assets[Mesh]],
materials: ResMut[Assets[StandardMaterial]],
) -> None:
commands.spawn(
Camera3d(),
DistanceFog(
color=Color.srgb(0.5, 0.5, 0.6), falloff=FogFalloff.Linear(10.0, 50.0), ),
Transform.from_xyz(0.0, 2.0, 10.0).looking_at(Vec3.ZERO, Vec3.Y),
)
red_mat = materials.add(StandardMaterial(
base_color=Color.srgb(1.0, 0.2, 0.2),
))
green_mat = materials.add(StandardMaterial(
base_color=Color.srgb(0.2, 1.0, 0.2),
))
blue_mat = materials.add(StandardMaterial(
base_color=Color.srgb(0.2, 0.2, 1.0),
))
sphere = meshes.add(Sphere(1.0))
for i in range(15):
z = -i * 5.0 material = [red_mat, green_mat, blue_mat][i % 3]
commands.spawn(
Mesh3d(sphere),
MeshMaterial3d(material),
Transform.from_xyz(0.0, 0.0, z),
)
ground = materials.add(StandardMaterial(
base_color=Color.srgb(0.3, 0.3, 0.3),
))
commands.spawn(
Mesh3d(meshes.add(Plane3d(Vec3.Y, Vec2(25.0, 25.0)))),
MeshMaterial3d(ground),
Transform.from_xyz(0.0, -1.0, -30.0),
)
commands.spawn(
Text2d("1: Linear Fog\n2: Exponential Fog\n3: Atmospheric Fog\nUp/Down: Adjust Density"),
TextFont.from_font_size(20.0),
TextColor.WHITE,
Transform.from_xyz(0.0, 400.0, 0.0),
)
commands.insert_resource(FogSettings())
def toggle_fog_mode(
keyboard: Res[ButtonInput],
fog_query: Query[Mut[DistanceFog]],
settings: ResMut[FogSettings],
) -> None:
for fog in fog_query:
if keyboard.just_pressed(KeyCode.Digit1):
fog.falloff = FogFalloff.Linear(10.0, 50.0)
settings.mode = 0
elif keyboard.just_pressed(KeyCode.Digit2):
fog.falloff = FogFalloff.Exponential(0.05)
settings.mode = 1
elif keyboard.just_pressed(KeyCode.Digit3):
fog.falloff = FogFalloff.Atmospheric(
Vec3(0.35, 0.35, 0.4), Vec3(0.25, 0.25, 0.3), )
settings.mode = 2
if settings.mode == 1:
if keyboard.pressed(KeyCode.ArrowUp):
settings.density = min(0.2, settings.density * 1.05)
fog.falloff = FogFalloff.Exponential(settings.density)
elif keyboard.pressed(KeyCode.ArrowDown):
settings.density = max(0.001, settings.density * 0.95)
fog.falloff = FogFalloff.Exponential(settings.density)
@entrypoint
def main(app: App) -> App:
return (
app.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(Update, toggle_fog_mode)
)
if __name__ == "__main__":
main().run()