Closed Frank-Buss closed 1 year ago
I was just working on something similar and came up with an updated example so I thought I just paste it here in case anyone needs it in the future, it works in Bevy 0.10.1 using the "order" property on the camera to set the ordering of the two cameras, you also have to set the clear color of the 2d camera so it doesn't clear the screen below:
use bevy::prelude::*;
use bevy_prototype_lyon::prelude::*;
const SHOW_2D: bool = true;
const SHOW_3D: bool = true;
fn main() {
App::new()
.insert_resource(Msaa::Sample4)
.add_plugins(DefaultPlugins)
.add_plugin(ShapePlugin)
.add_startup_system(setup_system)
.run();
}
fn setup_system(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
if SHOW_2D {
let shape = shapes::RegularPolygon {
sides: 6,
feature: shapes::RegularPolygonFeature::Radius(200.0),
..shapes::RegularPolygon::default()
};
commands.spawn(Camera2dBundle {
camera: Camera {
order: 1,
..default()
},
camera_2d: Camera2d {
clear_color: ClearColorConfig::None,
..default()
},
..default()
});
commands.spawn((
ShapeBundle {
path: GeometryBuilder::build_as(&shape),
..default()
},
Fill::color(Color::CYAN),
Stroke::new(Color::BLACK, 10.0),
));
}
if SHOW_3D {
// cube
commands.spawn(PbrBundle {
mesh: meshes.add(Mesh::from(shape::Cube { size: 2.0 })),
material: materials.add(Color::rgb(0.8, 0.7, 0.6).into()),
..Default::default()
});
// light
commands.spawn(PointLightBundle {
transform: Transform::from_xyz(4.0, 8.0, 4.0),
..Default::default()
});
// camera
commands.spawn(Camera3dBundle {
transform: Transform::from_xyz(-3.0, 3.0, 5.0).looking_at(Vec3::ZERO, Vec3::Y),
camera: Camera {
order: 0,
..default()
},
..default()
});
}
}
if you don't set the order you get this error in the console:
WARN bevy_render::camera::camera: Camera order ambiguities detected for active cameras with the
following priorities: {(0, Some(Window(NormalizedWindowRef(0v0))))}. To fix this, ensure there is
exactly one Camera entity spawned with a given order for a given RenderTarget. Ambiguities should
be resolved because either (1) multiple active cameras were spawned accidentally, which will result
in rendering multiple instances of the scene or (2) for cases where multiple active cameras is
intentional, ambiguities could result in unpredictable render results.
So this all fixed and working nicely now, thanks all involved in fixing this!
Thanks @mattzque. Verified. Closing this.
Here is a simple example which demonstrate the problem:
and the Cargo.toml file:
When I start it, it shows only the cube. But when I set SHOW_3D to false, it shows the 2D triangle. How can I show both? The triangle in the foreground.