Document the bevy_render::camera module tree (#3528)

# Objective

Document most of the public items of the `bevy_render::camera` module and its
sub-modules.

## Solution

Add docs to most public items. Follow-up from #3447.
This commit is contained in:
Jerome Humbert 2022-09-03 14:30:44 +00:00
parent 0c98a2f0ca
commit 6a54683491
2 changed files with 38 additions and 7 deletions

View file

@ -70,6 +70,16 @@ pub struct ComputedCameraValues {
target_info: Option<RenderTargetInfo>, target_info: Option<RenderTargetInfo>,
} }
/// The defining component for camera entities, storing information about how and what to render
/// through this camera.
///
/// The [`Camera`] component is added to an entity to define the properties of the viewpoint from
/// which rendering occurs. It defines the position of the view to render, the projection method
/// to transform the 3D objects into a 2D image, as well as the render target into which that image
/// is produced.
///
/// Adding a camera is typically done by adding a bundle, either the `Camera2dBundle` or the
/// `Camera3dBundle`.
#[derive(Component, Debug, Reflect, FromReflect, Clone)] #[derive(Component, Debug, Reflect, FromReflect, Clone)]
#[reflect(Component)] #[reflect(Component)]
pub struct Camera { pub struct Camera {
@ -77,7 +87,7 @@ pub struct Camera {
pub viewport: Option<Viewport>, pub viewport: Option<Viewport>,
/// Cameras with a lower priority will be rendered before cameras with a higher priority. /// Cameras with a lower priority will be rendered before cameras with a higher priority.
pub priority: isize, pub priority: isize,
/// If this is set to true, this camera will be rendered to its specified [`RenderTarget`]. If false, this /// If this is set to `true`, this camera will be rendered to its specified [`RenderTarget`]. If `false`, this
/// camera will not be rendered. /// camera will not be rendered.
pub is_active: bool, pub is_active: bool,
/// Computed values for this camera, such as the projection matrix and the render target size. /// Computed values for this camera, such as the projection matrix and the render target size.
@ -305,6 +315,21 @@ impl RenderTarget {
} }
} }
/// System in charge of updating a [`Camera`] when its window or projection changes.
///
/// The system detects window creation and resize events to update the camera projection if
/// needed. It also queries any [`CameraProjection`] component associated with the same entity
/// as the [`Camera`] one, to automatically update the camera projection matrix.
///
/// The system function is generic over the camera projection type, and only instances of
/// [`OrthographicProjection`] and [`PerspectiveProjection`] are automatically added to
/// the app, as well as the runtime-selected [`Projection`]. The system runs during the
/// [`CoreStage::PostUpdate`] stage.
///
/// [`OrthographicProjection`]: crate::camera::OrthographicProjection
/// [`PerspectiveProjection`]: crate::camera::PerspectiveProjection
/// [`Projection`]: crate::camera::Projection
/// [`CoreStage::PostUpdate`]: bevy_app::CoreStage::PostUpdate
pub fn camera_system<T: CameraProjection + Component>( pub fn camera_system<T: CameraProjection + Component>(
mut window_resized_events: EventReader<WindowResized>, mut window_resized_events: EventReader<WindowResized>,
mut window_created_events: EventReader<WindowCreated>, mut window_created_events: EventReader<WindowCreated>,
@ -317,9 +342,9 @@ pub fn camera_system<T: CameraProjection + Component>(
)>, )>,
) { ) {
let mut changed_window_ids = Vec::new(); let mut changed_window_ids = Vec::new();
// handle resize events. latest events are handled first because we only want to resize each
// window once // Collect all unique window IDs of changed windows by inspecting created windows
for event in window_resized_events.iter().rev() { for event in window_created_events.iter() {
if changed_window_ids.contains(&event.id) { if changed_window_ids.contains(&event.id) {
continue; continue;
} }
@ -327,9 +352,8 @@ pub fn camera_system<T: CameraProjection + Component>(
changed_window_ids.push(event.id); changed_window_ids.push(event.id);
} }
// handle resize events. latest events are handled first because we only want to resize each // Collect all unique window IDs of changed windows by inspecting resized windows
// window once for event in window_resized_events.iter() {
for event in window_created_events.iter().rev() {
if changed_window_ids.contains(&event.id) { if changed_window_ids.contains(&event.id) {
continue; continue;
} }

View file

@ -38,6 +38,13 @@ impl<T: CameraProjection + Component + GetTypeRegistration> Plugin for CameraPro
} }
} }
/// Trait to control the projection matrix of a camera.
///
/// Components implementing this trait are automatically polled for changes, and used
/// to recompute the camera projection matrix of the [`Camera`] component attached to
/// the same entity as the component implementing this trait.
///
/// [`Camera`]: crate::camera::Camera
pub trait CameraProjection { pub trait CameraProjection {
fn get_projection_matrix(&self) -> Mat4; fn get_projection_matrix(&self) -> Mat4;
fn update(&mut self, width: f32, height: f32); fn update(&mut self, width: f32, height: f32);