struct Msaa { samples: u32, } impl Default for Msaa { fn default() -> Self { Self { samples: 4 } } } fn greet_pixels(query: Query<&Pixels>) { for px in query.iter() { let counter = 0; for i in px.0.iter() { println!("hello px:{}!", i); counter += 1; } } } } /* Input: Keyboard key state, as a binary Input value Input: Mouse button state, as a binary Input value Touches: The state of all fingers currently touching the touchscreen MouseButtonInput: Changes in the state of mouse buttons MouseWheel: KeyboardInput: Changes in the state of keyboard keys (keypresses, not text) ReceivedCharacter: Unicode text input from the OS (correct handling of the user's language and layout) TouchInput: Changx AppExit: Tell Bevy to shut down CloseWindow: Tell Bevy to close a window CreateWindow: Tell Bevy to open a new window Transform: Local transform (relative to parent, if any) Timer: Track if a time interval has elapsed Stopwatch: Track how much time has passed chiprs chippers bevy lox bevyclapchipnomloxrs chip8lors llvm? verilog? lol */ Create an orthographic projection camera to render 2D content. // The projection creates a camera space where X points to the right of the screen, Y points to the top of the screen, and Z points out of the screen (backward), forming a right-handed coordinate system. The center of the screen is at `X=0` and `Y=0`. // The default scaling mode is [`ScalingMode::WindowSize`], resulting in a resolution where 1 unit in X and Y in camera space corresponds to 1 logical pixel on the screen. That is, for a screen of 1920 pixels in width, the X coordinates visible on screen go from `X=-960` to `X=+960` in world space, left to right. This can be changed by changing the [`OrthographicProjection::scaling_mode`] field. // The camera is placed at `Z=+1000-0.1`, looking toward the world origin `(0,0,0)`. Its orthographic projection extends from `0.0` to `-1000.0` in camera view space, corresponding to `Z=+999.9` (closest to camera) to `Z=-0.1` (furthest away from camera) in world space. we want 0 to be "closest" and +far to be "farthest" in 2d, so we offset the camera's translation by far and use a right handed coordinate system let far = 1000.0; let orthographic_projection = OrthographicProjection { far, scaling_mode: ScalingMode::None, depth_calculation: DepthCalculation::ZDifference, left: 32.0 * 40.0, right: 32.0 * 40.0, top: 16.0 * 40.0, bottom: 16.0 * 40.0, ..Default::default() }; let transform = Transform::from_xyz(0.0, 0.0, far - 0.1); let view_projection = CameraProjection::get_projection_matrix(&orthographic_projection) * transform.compute_matrix().inverse(); let frustum = Frustum::from_view_projection( * 40.0 &view_projection, &transform.translation, &transform.back(), orthographic_projection.far(), ); commands.spawn_bundle(OrthographicCameraBundle { camera: Camera { name: Some(CameraPlugin::CAMERA_2D.to_string()), near: orthographic_projection.near, far: orthographic_projection.far, ..Default::default() }, orthographic_projection, visible_entities: VisibleEntities::default(), frustum, transform, global_transform: Default::default(), }); commands.spawn_bundle(GeometryBuilder::build_as( &shape, DrawMode::Outlined { fill_mode: FillMode::color(Color::CYAN), outline_mode: StrokeMode::new(Color::BLACK, 1.0), }, std::ops::Fn::call(&Transform::from_xyz, (-0.0, -0.0, 0.0)), )); commands.spawn_bundle(GeometryBuilder::build_as( &shape, DrawMode::Outlined { fill_mode: FillMode::color(Color::CYAN), outline_mode: StrokeMode::new(Color::BLACK, 5.0), }, std::ops::Fn::call(&Transform::from_xyz, (00.0, 00.0, 0.0)), )); commands.spawn_bundle(GeometryBuilder::build_as( &shape, DrawMode::Outlined { fill_mode: FillMode::color(Color::CYAN), outline_mode: StrokeMode::new(Color::BLACK, 5.0), }, std::ops::Fn::call(&Transform::from_xyz, (750.0, 750.0, 0.0)), )); commands.spawn_bundle(GeometryBuilder::build_as( &shape, DrawMode::Outlined { fill_mode: FillMode::color(Color::CYAN), outline_mode: StrokeMode::new(Color::BLACK, 5.0), }, std::ops::Fn::call(&Transform::from_xyz, (750.0, -750.0, 0.0)), )); commands.spawn_bundle(GeometryBuilder::build_as( &shape, DrawMode::Outlined { fill_mode: FillMode::color(Color::CYAN), outline_mode: StrokeMode::new(Color::BLACK, 5.0), }, std::ops::Fn::call(&Transform::from_xyz, (-750.0, 750.0, 0.0)), )); } fn setup_screen(mut commands: Commands, asset_server: Res) { let mut contributor_selection = ContributorSelection { order: vec![], idx: 0, }; let mut rnd = rand::thread_rng(); for name in contribs { let pos = (rnd.gen_range(-400.0..400.0), rnd.gen_range(0.0..400.0)); let dir = rnd.gen_range(-1.0..1.0); let velocity = Vec3::new(dir * 500.0, 0.0, 0.0); let hue = rnd.gen_range(0.0..=360.0); some sprites should be flipped let flipped = rnd.gen_bool(0.5); let transform = Transform::from_xyz(pos.0, pos.1, 0.0); let entity = commands .spawn() .insert_bundle(( Contributor { hue }, Velocity { translation: velocity, rotation: -dir * 5.0, }, )) .insert_bundle(SpriteBundle { sprite: Sprite { custom_size: Some(Vec2::new(1.0, 1.0) * SPRITE_SIZE), color: Color::hsla(hue, SATURATION_DESELECTED, LIGHTNESS_DESELECTED, ALPHA), flip_x: flipped, ..Default::default() }, texture: texture_handle.clone(), transform, ..Default::default() }) .id(); contributor_selection.order.push((name, entity)); } contributor_selection.order.shuffle(&mut rnd); commands.insert_resource(contributor_selection); } fn setup(mut commands: Commands, asset_server: Res) { commands.spawn_bundle(OrthographicCameraBundle::new_2d()); commands.spawn_bundle(UiCameraBundle::default()); commands.spawn_bundle((SelectTimer, Timer::from_seconds(SHOWCASE_TIMER_SECS, true))); commands .spawn() .insert(ContributorDisplay) .insert_bundle(TextBundle { style: Style { align_self: AlignSelf::FlexEnd, ..Default::default() }, text: Text { sections: vec![ TextSection { value: "Contributor showcase".to_string(), style: TextStyle { font: asset_server.load("fonts/FiraSans-Bold.ttf"), font_size: 60.0, color: Color::WHITE, }, }, TextSection { value: "".to_string(), style: TextStyle { font: asset_server.load("fonts/FiraSans-Bold.ttf"), font_size: 60.0, color: Color::WHITE, }, }, ], ..Default::default() }, ..Default::default() }); } // if disabled.is_none() { // commands.remove_component::(pixel.0); // commands.insert_component(pixel.0, Disabled()); // } // commands.insert_component( // pixel.0, // Transform::from_xyz(xyz_from_i(pixel.1, cpu.counter), 0.0, 0.0), // ); // } // for i in 0..PIXELS { // if cpu.screen[i] { // println!("hello px:{:?}!", pixels.0[i]); // } else { // commands.entity(pixel.0[i]).insert(Disabled()); // } // } // }