mirror of
https://github.com/bevyengine/bevy
synced 2024-11-26 22:50:19 +00:00
28fb0fdfc8
Must follow VertexBufferDescriptorName_AttributeName format I_VertexBufferDescriptorName_AttributeName indicates that an attribute is instanced Currently all attributes must be defined in shaders or offsets will be incorrect.
107 lines
3.6 KiB
Rust
107 lines
3.6 KiB
Rust
use bevy::prelude::*;
|
|
use rand::{rngs::StdRng, Rng, SeedableRng};
|
|
|
|
fn main() {
|
|
AppBuilder::new()
|
|
.add_defaults()
|
|
.add_system(build_move_system())
|
|
.add_system(bevy::diagnostics::build_fps_printer_system())
|
|
.setup_world(setup)
|
|
.run();
|
|
}
|
|
|
|
fn build_move_system() -> Box<dyn Schedulable> {
|
|
SystemBuilder::new("Move")
|
|
.read_resource::<Time>()
|
|
.write_resource::<AssetStorage<StandardMaterial>>()
|
|
.with_query(<(Write<Translation>, Read<Handle<StandardMaterial>>)>::query())
|
|
.build(move |_, world, (time, material_storage), person_query| {
|
|
for (mut translation, material_handle) in person_query.iter_mut(world) {
|
|
let material = material_storage.get_mut(&material_handle).unwrap();
|
|
translation.0 += math::vec3(1.0, 0.0, 0.0) * time.delta_seconds;
|
|
if let ColorSource::Color(ref mut color) = material.albedo {
|
|
*color = *color
|
|
+ Color::rgb(-time.delta_seconds, -time.delta_seconds, time.delta_seconds);
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
fn setup(world: &mut World, resources: &mut Resources) {
|
|
let mut mesh_storage = resources.get_mut::<AssetStorage<Mesh>>().unwrap();
|
|
let mut material_storage = resources
|
|
.get_mut::<AssetStorage<StandardMaterial>>()
|
|
.unwrap();
|
|
let cube_handle = mesh_storage.add(Mesh::load(MeshType::Cube));
|
|
let plane_handle = mesh_storage.add(Mesh::load(MeshType::Plane { size: 10.0 }));
|
|
let cube_material_handle = material_storage.add(StandardMaterial {
|
|
albedo: Color::rgb(0.5, 0.4, 0.3).into(),
|
|
});
|
|
let plane_material_handle = material_storage.add(StandardMaterial {
|
|
albedo: Color::rgb(0.1, 0.2, 0.1).into(),
|
|
});
|
|
|
|
let mut builder = world
|
|
.build()
|
|
// plane
|
|
.add_entity(MeshEntity {
|
|
mesh: plane_handle,
|
|
material: plane_material_handle,
|
|
..Default::default()
|
|
})
|
|
// cube
|
|
.add_entity(MeshEntity {
|
|
mesh: cube_handle,
|
|
material: cube_material_handle,
|
|
translation: Translation::new(0.0, 0.0, 1.0),
|
|
..Default::default()
|
|
})
|
|
// light
|
|
.add_entity(LightEntity {
|
|
translation: Translation::new(4.0, -4.0, 5.0),
|
|
..Default::default()
|
|
})
|
|
// camera
|
|
.add_entity(CameraEntity {
|
|
camera: Camera::new(CameraType::Projection {
|
|
fov: std::f32::consts::PI / 4.0,
|
|
near: 1.0,
|
|
far: 1000.0,
|
|
aspect_ratio: 1.0,
|
|
}),
|
|
active_camera: ActiveCamera,
|
|
local_to_world: LocalToWorld(Mat4::look_at_rh(
|
|
Vec3::new(3.0, 8.0, 5.0),
|
|
Vec3::new(0.0, 0.0, 0.0),
|
|
Vec3::new(0.0, 0.0, 1.0),
|
|
)),
|
|
});
|
|
|
|
let mut rng = StdRng::from_entropy();
|
|
for _ in 0..500 {
|
|
let spawned_material_handle = material_storage.add(StandardMaterial {
|
|
albedo: Color::rgb(
|
|
rng.gen_range(0.0, 1.0),
|
|
rng.gen_range(0.0, 1.0),
|
|
rng.gen_range(0.0, 1.0),
|
|
)
|
|
.into(),
|
|
});
|
|
builder = builder.add_entity(MeshEntity {
|
|
mesh: cube_handle,
|
|
material: spawned_material_handle,
|
|
translation: Translation::new(
|
|
rng.gen_range(-50.0, 50.0),
|
|
rng.gen_range(-50.0, 50.0),
|
|
0.0,
|
|
),
|
|
renderable: Renderable {
|
|
instanced: true,
|
|
..Default::default()
|
|
},
|
|
..Default::default()
|
|
})
|
|
}
|
|
|
|
builder.build();
|
|
}
|