From 70cdbae24747fb8504db53e4fa60bb3fbe2ef0e1 Mon Sep 17 00:00:00 2001 From: Max Rodriguez Date: Wed, 2 Aug 2023 08:20:25 +0200 Subject: [PATCH] framework: Create aspect2d child nodes & update on win resize Closes #1510 Fixes #1508 --- panda/src/framework/windowFramework.I | 96 +++++++++++++++++++++++++ panda/src/framework/windowFramework.cxx | 60 +++++++++++++++- panda/src/framework/windowFramework.h | 18 +++++ 3 files changed, 172 insertions(+), 2 deletions(-) diff --git a/panda/src/framework/windowFramework.I b/panda/src/framework/windowFramework.I index 5fa4caafe8..2cc805758c 100644 --- a/panda/src/framework/windowFramework.I +++ b/panda/src/framework/windowFramework.I @@ -75,6 +75,102 @@ get_display_region_3d() const { return _display_region_3d; } +/** + * Returns the child node of aspect_2d which is positioned + * on the top center of the screen. + */ +INLINE NodePath WindowFramework:: +get_a2d_top_center() { + if (_aspect_2d.is_empty()) { + get_aspect_2d(); + } + return _a2d_top_center; +} + +/** + * Returns the child node of aspect_2d which is positioned + * on the bottom center of the screen. + */ +INLINE NodePath WindowFramework:: +get_a2d_bottom_center() { + if (_aspect_2d.is_empty()) { + get_aspect_2d(); + } + return _a2d_bottom_center; +} + +/** + * Returns the child node of aspect_2d which is positioned + * on the left center of the screen. + */ +INLINE NodePath WindowFramework:: +get_a2d_left_center() { + if (_aspect_2d.is_empty()) { + get_aspect_2d(); + } + return _a2d_left_center; +} + +/** + * Returns the child node of aspect_2d which is positioned + * on the right center of the screen. + */ +INLINE NodePath WindowFramework:: +get_a2d_right_center() { + if (_aspect_2d.is_empty()) { + get_aspect_2d(); + } + return _a2d_right_center; +} + +/** + * Returns the child node of aspect_2d which is positioned + * on the top left of the screen. + */ +INLINE NodePath WindowFramework:: +get_a2d_top_left() { + if (_aspect_2d.is_empty()) { + get_aspect_2d(); + } + return _a2d_top_left; +} + +/** + * Returns the child node of aspect_2d which is positioned + * on the top right of the screen. + */ +INLINE NodePath WindowFramework:: +get_a2d_top_right() { + if (_aspect_2d.is_empty()) { + get_aspect_2d(); + } + return _a2d_top_right; +} + +/** + * Returns the child node of aspect_2d which is positioned + * on the bottom left of the screen. + */ +INLINE NodePath WindowFramework:: +get_a2d_bottom_left() { + if (_aspect_2d.is_empty()) { + get_aspect_2d(); + } + return _a2d_bottom_left; +} + +/** + * Returns the child node of aspect_2d which is positioned + * on the bottom right of the screen. + */ +INLINE NodePath WindowFramework:: +get_a2d_bottom_right() { + if (_aspect_2d.is_empty()) { + get_aspect_2d(); + } + return _a2d_bottom_right; +} + /** * Returns the current state of the anim_controls flag. */ diff --git a/panda/src/framework/windowFramework.cxx b/panda/src/framework/windowFramework.cxx index c2fd0f6582..f28c05f3d7 100644 --- a/panda/src/framework/windowFramework.cxx +++ b/panda/src/framework/windowFramework.cxx @@ -323,6 +323,31 @@ get_aspect_2d() { } _aspect_2d.set_scale(1.0f / this_aspect_ratio, 1.0f, 1.0f); + + // Create child nodes of aspect_2d anchored to edges/corners of the window. + _a2d_top_center = _aspect_2d.attach_new_node("a2dTopCenter"); + _a2d_bottom_center = _aspect_2d.attach_new_node("a2dBottomCenter"); + _a2d_left_center = _aspect_2d.attach_new_node("a2dLeftCenter"); + _a2d_right_center = _aspect_2d.attach_new_node("a2dRightCenter"); + _a2d_top_left = _aspect_2d.attach_new_node("a2dTopLeft"); + _a2d_top_right = _aspect_2d.attach_new_node("a2dTopRight"); + _a2d_bottom_left = _aspect_2d.attach_new_node("a2dBottomLeft"); + _a2d_bottom_right = _aspect_2d.attach_new_node("a2dBottomRight"); + + PN_stdfloat a2d_top = 1.0f; + PN_stdfloat a2d_bottom = -1.0f; + PN_stdfloat a2d_left = this_aspect_ratio * -1.0f; + PN_stdfloat a2d_right = this_aspect_ratio; + + // Position nodes to their corresponding places + _a2d_top_center.set_pos(0.0f, 0.0f, a2d_top); + _a2d_bottom_center.set_pos(0.0f, 0.0f, a2d_bottom); + _a2d_left_center.set_pos(a2d_left, 0.0f, 0.0f); + _a2d_right_center.set_pos(a2d_right, 0.0f, 0.0f); + _a2d_top_left.set_pos(a2d_left, 0.0f, a2d_top); + _a2d_top_right.set_pos(a2d_right, 0.0f, a2d_top); + _a2d_bottom_left.set_pos(a2d_left, 0.0f, a2d_bottom); + _a2d_bottom_right.set_pos(a2d_right, 0.0f, a2d_bottom); } return _aspect_2d; @@ -794,7 +819,7 @@ set_anim_controls(bool enable) { /** * Reevaluates the dimensions of the window, presumably after the window has * been resized by the user or some other force. Adjusts the render film - * size, aspect2d scale (aspect ratio) and the dimensionsas of pixel_2d + * size, aspect2d scale (aspect ratio) and the dimensions of pixel_2d * according to the new window shape, or new config setting. */ void WindowFramework:: @@ -816,7 +841,38 @@ adjust_dimensions() { } if (!_aspect_2d.is_empty()) { - _aspect_2d.set_scale(1.0f / this_aspect_ratio, 1.0f, 1.0f); + PN_stdfloat a2d_top; + PN_stdfloat a2d_bottom; + PN_stdfloat a2d_left; + PN_stdfloat a2d_right; + + if (this_aspect_ratio < 1) { + // If the window is TALL, lets expand the top and bottom + _aspect_2d.set_scale(1.0f, this_aspect_ratio, this_aspect_ratio); + + a2d_top = 1.0f / this_aspect_ratio; + a2d_bottom = -1.0f / this_aspect_ratio; + a2d_left = -1.0f; + a2d_right = 1.0f; + } else { + // If the window is WIDE, lets expand the left and right + _aspect_2d.set_scale(1.0f / this_aspect_ratio, 1.0f, 1.0f); + + a2d_top = 1.0f; + a2d_bottom = -1.0f; + a2d_left = this_aspect_ratio * -1.0f; + a2d_right = this_aspect_ratio; + } + + // Adjust aspect_2d child nodes to new aspect ratio + _a2d_top_center.set_pos(0.0f, 0.0f, a2d_top); + _a2d_bottom_center.set_pos(0.0f, 0.0f, a2d_bottom); + _a2d_left_center.set_pos(a2d_left, 0.0f, 0.0f); + _a2d_right_center.set_pos(a2d_right, 0.0f, 0.0f); + _a2d_top_left.set_pos(a2d_left, 0.0f, a2d_top); + _a2d_top_right.set_pos(a2d_right, 0.0f, a2d_top); + _a2d_bottom_left.set_pos(a2d_left, 0.0f, a2d_bottom); + _a2d_bottom_right.set_pos(a2d_right, 0.0f, a2d_bottom); } if (!_pixel_2d.is_empty()) { diff --git a/panda/src/framework/windowFramework.h b/panda/src/framework/windowFramework.h index 2308cb1ff8..84f7e163c7 100644 --- a/panda/src/framework/windowFramework.h +++ b/panda/src/framework/windowFramework.h @@ -84,6 +84,15 @@ public: NodePath get_mouse(); NodePath get_button_thrower(); + INLINE NodePath get_a2d_top_center(); + INLINE NodePath get_a2d_bottom_center(); + INLINE NodePath get_a2d_left_center(); + INLINE NodePath get_a2d_right_center(); + INLINE NodePath get_a2d_top_left(); + INLINE NodePath get_a2d_top_right(); + INLINE NodePath get_a2d_bottom_left(); + INLINE NodePath get_a2d_bottom_right(); + void enable_keyboard(); void setup_trackball(); void center_trackball(const NodePath &object); @@ -175,6 +184,15 @@ private: NodePath _aspect_2d; NodePath _pixel_2d; + NodePath _a2d_top_center; + NodePath _a2d_bottom_center; + NodePath _a2d_left_center; + NodePath _a2d_right_center; + NodePath _a2d_top_left; + NodePath _a2d_top_right; + NodePath _a2d_bottom_left; + NodePath _a2d_bottom_right; + AnimControlCollection _anim_controls; bool _anim_controls_enabled; int _anim_index;