Browse Source

framework: Create aspect2d child nodes & update on win resize

Closes #1510
Fixes #1508
Max Rodriguez 2 years ago
parent
commit
70cdbae247

+ 96 - 0
panda/src/framework/windowFramework.I

@@ -75,6 +75,102 @@ get_display_region_3d() const {
   return _display_region_3d;
   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.
  * Returns the current state of the anim_controls flag.
  */
  */

+ 58 - 2
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);
     _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;
   return _aspect_2d;
@@ -794,7 +819,7 @@ set_anim_controls(bool enable) {
 /**
 /**
  * Reevaluates the dimensions of the window, presumably after the window has
  * Reevaluates the dimensions of the window, presumably after the window has
  * been resized by the user or some other force.  Adjusts the render film
  * 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.
  * according to the new window shape, or new config setting.
  */
  */
 void WindowFramework::
 void WindowFramework::
@@ -816,7 +841,38 @@ adjust_dimensions() {
   }
   }
 
 
   if (!_aspect_2d.is_empty()) {
   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()) {
   if (!_pixel_2d.is_empty()) {

+ 18 - 0
panda/src/framework/windowFramework.h

@@ -84,6 +84,15 @@ public:
   NodePath get_mouse();
   NodePath get_mouse();
   NodePath get_button_thrower();
   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 enable_keyboard();
   void setup_trackball();
   void setup_trackball();
   void center_trackball(const NodePath &object);
   void center_trackball(const NodePath &object);
@@ -175,6 +184,15 @@ private:
   NodePath _aspect_2d;
   NodePath _aspect_2d;
   NodePath _pixel_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;
   AnimControlCollection _anim_controls;
   bool _anim_controls_enabled;
   bool _anim_controls_enabled;
   int _anim_index;
   int _anim_index;