Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/examples/window/multiple_windows.rs
9308 views
1
//! Uses two windows to visualize a 3D model from different angles.
2
3
use bevy::{camera::RenderTarget, prelude::*, window::WindowRef};
4
5
fn main() {
6
App::new()
7
// By default, a primary window gets spawned by `WindowPlugin`, contained in `DefaultPlugins`
8
.add_plugins(DefaultPlugins)
9
.add_systems(Startup, setup_scene)
10
.run();
11
}
12
13
fn setup_scene(mut commands: Commands, asset_server: Res<AssetServer>) {
14
// add entities to the world
15
commands.spawn(SceneRoot(
16
asset_server.load(GltfAssetLabel::Scene(0).from_asset("models/torus/torus.gltf")),
17
));
18
// light
19
commands.spawn((
20
DirectionalLight::default(),
21
Transform::from_xyz(3.0, 3.0, 3.0).looking_at(Vec3::ZERO, Vec3::Y),
22
));
23
24
let first_window_camera = commands
25
.spawn((
26
Camera3d::default(),
27
Transform::from_xyz(0.0, 0.0, 6.0).looking_at(Vec3::ZERO, Vec3::Y),
28
))
29
.id();
30
31
// Spawn a second window
32
let second_window = commands
33
.spawn(Window {
34
title: "Second window".to_owned(),
35
..default()
36
})
37
.id();
38
39
let second_window_camera = commands
40
.spawn((
41
Camera3d::default(),
42
Transform::from_xyz(6.0, 0.0, 0.0).looking_at(Vec3::ZERO, Vec3::Y),
43
RenderTarget::Window(WindowRef::Entity(second_window)),
44
))
45
.id();
46
47
let node = Node {
48
position_type: PositionType::Absolute,
49
top: px(12),
50
left: px(12),
51
..default()
52
};
53
54
commands
55
.spawn((
56
node.clone(),
57
// Since we are using multiple cameras, we need to specify which camera UI should be rendered to
58
UiTargetCamera(first_window_camera),
59
))
60
.with_child((Text::new("First window"), TextShadow::default()));
61
62
commands
63
.spawn((node, UiTargetCamera(second_window_camera)))
64
.with_child((Text::new("Second window"), TextShadow::default()));
65
}
66
67