瀏覽代碼

pick up and fix G0gg's C++ pixel2d changes

rdb 14 年之前
父節點
當前提交
fa50a04775
共有 3 個文件被更改,包括 59 次插入13 次删除
  1. 1 1
      panda/src/framework/pandaFramework.cxx
  2. 55 11
      panda/src/framework/windowFramework.cxx
  3. 3 1
      panda/src/framework/windowFramework.h

+ 1 - 1
panda/src/framework/pandaFramework.cxx

@@ -1527,7 +1527,7 @@ event_window_event(const Event *event, void *data) {
         // Adjust aspect ratio.
         for (int n = 0; n < (int)self->_windows.size(); n++) {
           if (self->_windows[n]->get_graphics_output() == win) {
-            return self->_windows[n]->adjust_aspect_ratio();
+            self->_windows[n]->adjust_dimensions();
           }
         }
       }

+ 55 - 11
panda/src/framework/windowFramework.cxx

@@ -348,6 +348,37 @@ get_aspect_2d() {
   return _aspect_2d;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: WindowFramework::get_pixel_2d
+//       Access: Public
+//  Description: Returns a special root that uses units in pixels that
+//               are relative to the window. The upperleft corner of
+//               the window is (0, 0), the lowerleft corner is
+//               (xsize, -ysize), in this coordinate system.
+////////////////////////////////////////////////////////////////////
+NodePath WindowFramework::
+get_pixel_2d() {
+  if (_pixel_2d.is_empty()) {
+    PGTop *top = new PGTop("pixel_2d");
+    _pixel_2d = get_render_2d().attach_new_node(top);
+    _pixel_2d.set_pos(-1, 0, 1);
+  
+    if (_window->has_size()) {
+      int x_size = _window->get_sbs_left_x_size();
+      int y_size = _window->get_sbs_left_y_size();
+      if (x_size > 0){
+        _pixel_2d.set_sx(2.0f / (float)x_size);
+      }
+      _pixel_2d.set_sy(1.0f);
+      if (y_size > 0){
+        _pixel_2d.set_sz(2.0f / (float)y_size);
+      }
+    }
+  }
+
+  return _pixel_2d;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: WindowFramework::get_mouse
 //       Access: Public
@@ -796,28 +827,30 @@ set_anim_controls(bool enable) {
 }
 
 ////////////////////////////////////////////////////////////////////
-//     Function: WindowFramework::adjust_aspect_ratio
+//     Function: WindowFramework::adjust_dimensions
 //       Access: Public
-//  Description: Reevaluates the aspect ratio of the window,
+//  Description: 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 and aspect2d scale as necessary according to the
+//               size, aspect2d scale (aspect ratio) and the
+//               dimensionsas of pixel_2d according to the
 //               new window shape, or new config setting.
 ////////////////////////////////////////////////////////////////////
 void WindowFramework::
-adjust_aspect_ratio() {
+adjust_dimensions() {
   PN_stdfloat this_aspect_ratio = aspect_ratio;
+
   int x_size = 0, y_size = 0;
+  if (_window->has_size()) {
+    x_size = _window->get_sbs_left_x_size();
+    y_size = _window->get_sbs_left_y_size();
+  }
+  
   if (this_aspect_ratio == 0.0f) {
     // An aspect ratio of 0.0 means to try to infer it.
     this_aspect_ratio = 1.0f;
-    
-    if (_window->has_size()) {
-      x_size = _window->get_sbs_left_x_size();
-      y_size = _window->get_sbs_left_y_size();
-      if (y_size != 0) {
-        this_aspect_ratio = (PN_stdfloat)x_size / (PN_stdfloat)y_size;
-      }
+    if (y_size != 0) {
+      this_aspect_ratio = (float)x_size / (float)y_size;
     }
   }
 
@@ -825,6 +858,17 @@ adjust_aspect_ratio() {
     _aspect_2d.set_scale(1.0f / this_aspect_ratio, 1.0f, 1.0f);
   }
 
+  if (!_pixel_2d.is_empty()) {
+    // Adjust the pixel 2d scale
+    if (x_size > 0){
+      _pixel_2d.set_sx(2.0f / (float)x_size);
+    }
+    _pixel_2d.set_sy(1.0f);
+    if (y_size > 0){
+      _pixel_2d.set_sz(2.0f / (float)y_size);
+    }
+  }
+
   Cameras::iterator ci;
   for (ci = _cameras.begin(); ci != _cameras.end(); ++ci) {
     Lens *lens = (*ci)->get_lens();

+ 3 - 1
panda/src/framework/windowFramework.h

@@ -81,6 +81,7 @@ public:
   NodePath get_render();
   NodePath get_render_2d();
   NodePath get_aspect_2d();
+  NodePath get_pixel_2d();
   NodePath get_mouse();
   NodePath get_button_thrower();
 
@@ -101,7 +102,7 @@ public:
   void next_anim_control();
   void set_anim_controls(bool enable);
   INLINE bool get_anim_controls() const;
-  void adjust_aspect_ratio();
+  void adjust_dimensions();
 
   enum BackgroundType {
     BT_other = 0,
@@ -174,6 +175,7 @@ private:
   NodePath _render;
   NodePath _render_2d;
   NodePath _aspect_2d;
+  NodePath _pixel_2d;
 
   AnimControlCollection _anim_controls;
   bool _anim_controls_enabled;