Merge pull request #113552 from arkology/cam_preview_take_2

Rework `Camera3D` preview
This commit is contained in:
Thaddeus Crews 2026-02-24 09:29:13 -06:00
commit 929dddcee3
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
2 changed files with 39 additions and 14 deletions

View file

@ -31,9 +31,10 @@
#include "camera_3d_editor_plugin.h"
#include "core/config/project_settings.h"
#include "editor/editor_node.h"
#include "node_3d_editor_plugin.h"
#include "scene/gui/texture_rect.h"
#include "scene/gui/aspect_ratio_container.h"
#include "scene/gui/foldable_container.h"
#include "scene/gui/subviewport_container.h"
#include "scene/main/viewport.h"
void Camera3DEditor::_node_removed(Node *p_node) {
@ -79,19 +80,40 @@ Camera3DEditor::Camera3DEditor() {
preview->connect(SceneStringName(pressed), callable_mp(this, &Camera3DEditor::_pressed));
}
bool Camera3DPreview::camera_preview_folded = false;
void Camera3DPreview::_update_sub_viewport_size() {
sub_viewport->set_size(Node3DEditor::get_camera_viewport_size(camera));
const Size2i camera_size = Node3DEditor::get_camera_viewport_size(camera);
centering_container->set_ratio(camera_size.aspect());
}
Camera3DPreview::Camera3DPreview(Camera3D *p_camera) :
TexturePreview(nullptr, false), camera(p_camera), sub_viewport(memnew(SubViewport)) {
RenderingServer::get_singleton()->viewport_attach_camera(sub_viewport->get_viewport_rid(), camera->get_camera());
add_child(sub_viewport);
void Camera3DPreview::_toggle_folding(bool p_folded) {
camera_preview_folded = p_folded;
}
TextureRect *display = get_texture_display();
display->set_texture(sub_viewport->get_texture());
sub_viewport->connect("size_changed", callable_mp((CanvasItem *)display, &CanvasItem::queue_redraw));
sub_viewport->get_texture()->connect_changed(callable_mp((TexturePreview *)this, &Camera3DPreview::_update_texture_display_ratio));
Camera3DPreview::Camera3DPreview(Camera3D *p_camera) {
camera = p_camera;
FoldableContainer *folder = memnew(FoldableContainer);
folder->set_title(TTRC("Camera Preview"));
folder->set_title_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS);
folder->set_folded(camera_preview_folded);
folder->connect("folding_changed", callable_mp(this, &Camera3DPreview::_toggle_folding));
add_child(folder);
centering_container = memnew(AspectRatioContainer);
centering_container->set_custom_minimum_size(Size2(0.0, 256.0) * EDSCALE);
folder->add_child(centering_container);
SubViewportContainer *sub_viewport_container = memnew(SubViewportContainer);
sub_viewport_container->set_stretch(true);
sub_viewport_container->set_texture_filter(TEXTURE_FILTER_NEAREST_WITH_MIPMAPS);
centering_container->add_child(sub_viewport_container);
sub_viewport = memnew(SubViewport);
sub_viewport_container->add_child(sub_viewport);
RenderingServer::get_singleton()->viewport_attach_camera(sub_viewport->get_viewport_rid(), camera->get_camera());
ProjectSettings::get_singleton()->connect("settings_changed", callable_mp(this, &Camera3DPreview::_project_settings_changed));
_project_settings_changed();

View file

@ -33,7 +33,6 @@
#include "editor/plugins/editor_plugin.h"
#include "editor/scene/texture/texture_editor_plugin.h"
class Camera3D;
class SubViewport;
class Camera3DEditor : public Control {
@ -52,14 +51,18 @@ public:
Camera3DEditor();
};
class Camera3DPreview : public TexturePreview {
GDCLASS(Camera3DPreview, TexturePreview);
class Camera3DPreview : public MarginContainer {
GDCLASS(Camera3DPreview, MarginContainer);
Camera3D *camera = nullptr;
AspectRatioContainer *centering_container = nullptr;
SubViewport *sub_viewport = nullptr;
static bool camera_preview_folded;
void _update_sub_viewport_size();
void _project_settings_changed();
void _toggle_folding(bool p_folded);
public:
Camera3DPreview(Camera3D *p_camera);