import math
from pybevy.prelude import *
@component
class Movable(Component):
def setup(
commands: Commands,
meshes: ResMut[Assets[Mesh]],
materials: ResMut[Assets[StandardMaterial]],
):
commands.spawn(
Mesh3d(meshes.add(Plane3d().mesh().size(10.0, 10.0).build())),
MeshMaterial3d(
materials.add(
StandardMaterial(
base_color=Color.WHITE,
perceptual_roughness=1.0,
)
)
),
)
commands.spawn(
Mesh3d(meshes.add(Cuboid.from_size(Vec3(5.0, 0.15, 5.0)))),
MeshMaterial3d(
materials.add(
StandardMaterial(
base_color=Color.srgb(0.3, 0.0, 0.5), perceptual_roughness=1.0,
)
)
),
Transform.from_xyz(2.5, 2.5, 0.0).with_rotation(
Quat.from_rotation_z(math.pi / 2.0)
),
)
commands.spawn(
Mesh3d(meshes.add(Cuboid.from_size(Vec3(5.0, 0.15, 5.0)))),
MeshMaterial3d(
materials.add(
StandardMaterial(
base_color=Color.srgb(0.3, 0.0, 0.5), perceptual_roughness=1.0,
)
)
),
Transform.from_xyz(0.0, 2.5, -2.5).with_rotation(
Quat.from_rotation_x(math.pi / 2.0)
),
)
commands.spawn(
Mesh3d(meshes.add(Cuboid())),
MeshMaterial3d(
materials.add(
StandardMaterial(
base_color=Color.srgb(1.0, 0.08, 0.58), )
)
),
Transform.from_xyz(0.0, 0.5, 0.0),
Movable(),
)
commands.spawn(
Mesh3d(meshes.add(Sphere(0.5))),
MeshMaterial3d(
materials.add(
StandardMaterial(
base_color=Color.srgb(0.2, 1.0, 0.2), )
)
),
Transform.from_xyz(1.5, 1.0, 1.5),
Movable(),
)
commands.insert_resource(
GlobalAmbientLight(
color=Color.srgb(1.0, 0.27, 0.0), brightness=200.0,
)
)
_red_light = commands.spawn(
PointLight(
intensity=100_000.0,
color=Color.srgb(1.0, 0.0, 0.0),
shadows_enabled=True,
),
Transform.from_xyz(1.0, 2.0, 0.0),
)
commands.spawn(
Mesh3d(meshes.add(Sphere(0.1))),
MeshMaterial3d(
materials.add(
StandardMaterial(
base_color=Color.srgb(1.0, 0.0, 0.0),
emissive=LinearRgba.rgb(4.0, 0.0, 0.0),
)
)
),
Transform.from_xyz(1.0, 2.0, 0.0),
)
commands.spawn(
SpotLight(
intensity=100_000.0,
color=Color.srgb(0.0, 1.0, 0.0),
shadows_enabled=True,
inner_angle=0.6,
outer_angle=0.8,
),
Transform.from_xyz(-1.0, 2.0, 0.0).looking_at(Vec3(-1.0, 0.0, 0.0), Vec3.Z),
)
commands.spawn(
Mesh3d(meshes.add(Sphere(0.1))),
MeshMaterial3d(
materials.add(
StandardMaterial(
base_color=Color.srgb(0.0, 1.0, 0.0),
emissive=LinearRgba.rgb(0.0, 4.0, 0.0),
)
)
),
Transform.from_xyz(-1.0, 2.0, 0.0),
)
commands.spawn(
PointLight(
intensity=100_000.0,
color=Color.srgb(0.0, 0.0, 1.0),
shadows_enabled=True,
),
Transform.from_xyz(0.0, 4.0, 0.0),
)
commands.spawn(
Mesh3d(meshes.add(Sphere(0.1))),
MeshMaterial3d(
materials.add(
StandardMaterial(
base_color=Color.srgb(0.0, 0.0, 1.0),
emissive=LinearRgba.rgb(0.0, 0.0, 713.0),
)
)
),
Transform.from_xyz(0.0, 4.0, 0.0),
)
commands.spawn(
DirectionalLight(
illuminance=500.0, shadows_enabled=True,
),
Transform.from_xyz(0.0, 2.0, 0.0).with_rotation(
Quat.from_rotation_x(-math.pi / 4.0)
),
)
commands.spawn(
Camera3d(),
Transform.from_xyz(-2.0, 2.5, 5.0).looking_at(Vec3.ZERO, Vec3.Y),
)
def animate_light_direction(
time: Res[Time], query: Query[Mut[Transform], With[DirectionalLight]]
):
for transform in query:
transform.rotate_y(time.delta_secs() * 0.5)
def movement(input: Res[ButtonInput], time: Res[Time], query: Query[Mut[Transform], With[Movable]]):
for transform in query:
direction = Vec3.ZERO
if input.pressed(KeyCode.ArrowUp):
direction.y += 1.0
if input.pressed(KeyCode.ArrowDown):
direction.y -= 1.0
if input.pressed(KeyCode.ArrowLeft):
direction.x -= 1.0
if input.pressed(KeyCode.ArrowRight):
direction.x += 1.0
transform.translation += direction * time.delta_secs() * 2.0
@entrypoint
def main(app: App) -> App:
return (
app.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(
Update, (animate_light_direction, movement)
)
)
if __name__ == "__main__":
main().run()