Browse Source

iphone orientation

David Rose 16 years ago
parent
commit
8358dfc7b7

+ 1 - 1
panda/src/display/graphicsEngine.cxx

@@ -1907,7 +1907,7 @@ do_add_gsg(GraphicsStateGuardian *gsg, GraphicsPipe *pipe,
 void GraphicsEngine::
 void GraphicsEngine::
 do_remove_window(GraphicsOutput *window, Thread *current_thread) {
 do_remove_window(GraphicsOutput *window, Thread *current_thread) {
   PT(GraphicsPipe) pipe = window->get_pipe();
   PT(GraphicsPipe) pipe = window->get_pipe();
-  window->_pipe = (GraphicsPipe *)NULL;
+  window->clear_pipe();
 
 
   if (!_windows_sorted) {
   if (!_windows_sorted) {
     do_resort_windows();
     do_resort_windows();

+ 13 - 1
panda/src/display/graphicsOutput.cxx

@@ -974,7 +974,7 @@ set_close_now() {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: GraphicsOutput::reset_window
 //     Function: GraphicsOutput::reset_window
 //       Access: Protected, Virtual
 //       Access: Protected, Virtual
-//  Description: resets the window framebuffer from its derived
+//  Description: Resets the window framebuffer from its derived
 //               children. Does nothing here.
 //               children. Does nothing here.
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void GraphicsOutput::
 void GraphicsOutput::
@@ -983,6 +983,18 @@ reset_window(bool swapchain) {
     << "Resetting " << get_type() << "\n";
     << "Resetting " << get_type() << "\n";
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: GraphicsOutput::clear_pipe
+//       Access: Protected, Virtual
+//  Description: Sets the window's _pipe pointer to NULL; this is
+//               generally called only as a precursor to deleting the
+//               window.
+////////////////////////////////////////////////////////////////////
+void GraphicsOutput::
+clear_pipe() {
+  _pipe = (GraphicsPipe *)NULL;
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: GraphicsOutput::begin_frame
 //     Function: GraphicsOutput::begin_frame
 //       Access: Public, Virtual
 //       Access: Public, Virtual

+ 1 - 0
panda/src/display/graphicsOutput.h

@@ -195,6 +195,7 @@ public:
 
 
   virtual void set_close_now();
   virtual void set_close_now();
   virtual void reset_window(bool swapchain);
   virtual void reset_window(bool swapchain);
+  virtual void clear_pipe();
 
 
   void set_size_and_recalc(int x, int y);
   void set_size_and_recalc(int x, int y);
   
   

+ 8 - 0
panda/src/framework/pandaFramework.cxx

@@ -1492,6 +1492,7 @@ event_window_event(const Event *event, void *data) {
 
 
     } else {
     } else {
       if (!win->is_valid()) {
       if (!win->is_valid()) {
+        // The window has been closed.
         int window_index = self->find_window(win);
         int window_index = self->find_window(win);
         while (window_index != -1) {
         while (window_index != -1) {
           self->close_window(window_index);
           self->close_window(window_index);
@@ -1507,6 +1508,13 @@ event_window_event(const Event *event, void *data) {
             << "Last window was closed by user.\n";
             << "Last window was closed by user.\n";
           self->_exit_flag = true;
           self->_exit_flag = true;
         }
         }
+      } else {
+        // 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();
+          }
+        }
       }
       }
     }
     }
   }
   }

+ 43 - 0
panda/src/framework/windowFramework.cxx

@@ -769,6 +769,49 @@ set_anim_controls(bool enable) {
   }
   }
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: WindowFramework::adjust_aspect_ratio
+//       Access: Public
+//  Description: Reevaluates the aspect ratio 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
+//               new window shape, or new config setting.
+////////////////////////////////////////////////////////////////////
+void WindowFramework::
+adjust_aspect_ratio() {
+  float this_aspect_ratio = aspect_ratio;
+  int x_size = 0, y_size = 0;
+  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_x_size();
+      y_size = _window->get_y_size();
+      if (y_size != 0) {
+        this_aspect_ratio = (float)x_size / (float)y_size;
+      }
+    }
+  }
+
+  if (!_aspect_2d.is_empty()) {
+    _aspect_2d.set_scale(1.0f / this_aspect_ratio, 1.0f, 1.0f);
+  }
+
+  Cameras::iterator ci;
+  for (ci = _cameras.begin(); ci != _cameras.end(); ++ci) {
+    Lens *lens = (*ci)->get_lens();
+    if (lens != (Lens *)NULL) {
+      if (y_size != 0) {
+        lens->set_film_size(x_size, y_size);
+      } else {
+        lens->set_aspect_ratio(this_aspect_ratio);
+      }
+    }
+  }
+}
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: WindowFramework::split_window
 //     Function: WindowFramework::split_window
 //       Access: Public
 //       Access: Public

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

@@ -96,6 +96,7 @@ public:
   void next_anim_control();
   void next_anim_control();
   void set_anim_controls(bool enable);
   void set_anim_controls(bool enable);
   INLINE bool get_anim_controls() const;
   INLINE bool get_anim_controls() const;
+  void adjust_aspect_ratio();
 
 
   enum BackgroundType {
   enum BackgroundType {
     BT_other = 0,
     BT_other = 0,

+ 2 - 0
panda/src/iphone/config_iphone.h

@@ -19,6 +19,8 @@
 
 
 NotifyCategoryDecl(iphone, EXPCL_PANDAGL, EXPTP_PANDAGL);
 NotifyCategoryDecl(iphone, EXPCL_PANDAGL, EXPTP_PANDAGL);
 
 
+extern ConfigVariableBool iphone_autorotate_view;
+
 extern EXPCL_PANDAGL void init_libiphone();
 extern EXPCL_PANDAGL void init_libiphone();
 extern "C" EXPCL_PANDAGL int get_pipe_type_iphone();
 extern "C" EXPCL_PANDAGL int get_pipe_type_iphone();
 
 

+ 6 - 0
panda/src/iphone/config_iphone.mm

@@ -30,6 +30,12 @@ ConfigureFn(config_iphone) {
   init_libiphone();
   init_libiphone();
 }
 }
 
 
+ConfigVariableBool iphone_autorotate_view
+("iphone-autorotate-view", true,
+ PRC_DESC("Set this true to enable the iphone application to rotate its "
+          "view automatically according to the phone's orientation, or "
+          "false for its view to remain fixed."));
+
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: init_libiphone
 //     Function: init_libiphone
 //  Description: Initializes the library.  This must be called at
 //  Description: Initializes the library.  This must be called at

+ 18 - 12
panda/src/iphone/eaglView.h

@@ -12,30 +12,36 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
+#include "pandabase.h"
 #import <UIKit/UIKit.h>
 #import <UIKit/UIKit.h>
 #import <OpenGLES/EAGL.h>
 #import <OpenGLES/EAGL.h>
 #import <OpenGLES/ES1/gl.h>
 #import <OpenGLES/ES1/gl.h>
 #import <OpenGLES/ES1/glext.h>
 #import <OpenGLES/ES1/glext.h>
 
 
+class IPhoneGraphicsWindow;
+
 /*
 /*
 This class wraps the CAEAGLLayer from CoreAnimation into a convenient UIView subclass.
 This class wraps the CAEAGLLayer from CoreAnimation into a convenient UIView subclass.
 The view content is basically an EAGL surface you render your OpenGL scene into.
 The view content is basically an EAGL surface you render your OpenGL scene into.
 Note that setting the view non-opaque will only work if the EAGL surface has an alpha channel.
 Note that setting the view non-opaque will only work if the EAGL surface has an alpha channel.
 */
 */
 @interface EAGLView : UIView {
 @interface EAGLView : UIView {
-    
+
+@public
+  IPhoneGraphicsWindow *_window;
 @private
 @private
-    /* The pixel dimensions of the backbuffer */
-    GLint backingWidth;
-    GLint backingHeight;
-    
-    EAGLContext *context;
-    
-    /* OpenGL names for the renderbuffer and framebuffers used to render to this view */
-    GLuint viewRenderbuffer, viewFramebuffer;
-    
-    /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */
-    GLuint depthRenderbuffer;
+
+  /* The pixel dimensions of the backbuffer */
+  GLint backingWidth;
+ GLint backingHeight;
+ 
+ EAGLContext *context;
+ 
+ /* OpenGL names for the renderbuffer and framebuffers used to render to this view */
+ GLuint viewRenderbuffer, viewFramebuffer;
+ 
+ /* OpenGL name for the depth buffer that is attached to viewFramebuffer, if it exists (0 if it does not exist) */
+ GLuint depthRenderbuffer;
 }
 }
 
 
 - (void)presentView;
 - (void)presentView;

+ 70 - 57
panda/src/iphone/eaglView.mm

@@ -12,10 +12,14 @@
 //
 //
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 
 
+#import "EAGLView.h"
+
 #import <QuartzCore/QuartzCore.h>
 #import <QuartzCore/QuartzCore.h>
 #import <OpenGLES/EAGLDrawable.h>
 #import <OpenGLES/EAGLDrawable.h>
 
 
-#import "EAGLView.h"
+#include "pandabase.h"
+#include "pnotify.h"
+#include "iPhoneGraphicsWindow.h"
 
 
 #define USE_DEPTH_BUFFER 1
 #define USE_DEPTH_BUFFER 1
 
 
@@ -42,86 +46,95 @@
 
 
 
 
 - (id)initWithFrame:(CGRect)frame {
 - (id)initWithFrame:(CGRect)frame {
+  if ((self = [super initWithFrame:frame])) {
+    // Get the layer
+    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
+    
+    eaglLayer.opaque = YES;
+    eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
+                                                   [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
+    
+    context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
     
     
-    if ((self = [super initWithFrame:frame])) {
-        // Get the layer
-        CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
-        
-        eaglLayer.opaque = YES;
-        eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
-                                        [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
-        
-        context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
-        
-        if (!context || ![EAGLContext setCurrentContext:context]) {
-            [self release];
-            return nil;
-        }
+    if (!context || ![EAGLContext setCurrentContext:context]) {
+      [self release];
+      return nil;
     }
     }
-    return self;
+    _window = NULL;
+    viewFramebuffer = 0;
+    viewRenderbuffer = 0;
+    depthRenderbuffer = 0;
+  }
+  return self;
 }
 }
 
 
 
 
 - (void)presentView {
 - (void)presentView {
-    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
+  [context presentRenderbuffer:GL_RENDERBUFFER_OES];
 }
 }
 
 
 
 
 - (void)layoutSubviews {
 - (void)layoutSubviews {
-    [EAGLContext setCurrentContext:context];
-    [self destroyFramebuffer];
-    [self createFramebuffer];
-    //    [self drawView];
+  [EAGLContext setCurrentContext:context];
+  [self destroyFramebuffer];
+  [self createFramebuffer];
+
+  if (_window != NULL) {
+    _window->rotate_window();
+  }
 }
 }
 
 
 
 
 - (BOOL)createFramebuffer {
 - (BOOL)createFramebuffer {
-    
-    glGenFramebuffersOES(1, &viewFramebuffer);
-    glGenRenderbuffersOES(1, &viewRenderbuffer);
-    
-    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
+  glGenFramebuffersOES(1, &viewFramebuffer);
+  glGenRenderbuffersOES(1, &viewRenderbuffer);
+  
+  glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
+  glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
+  [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
+  glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
+  
+  glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
+  glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
+  
+  if (USE_DEPTH_BUFFER) {
+    glGenRenderbuffersOES(1, &depthRenderbuffer);
+    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
+    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
+    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
-    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
-    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);
-    
-    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
-    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
-    
-    if (USE_DEPTH_BUFFER) {
-        glGenRenderbuffersOES(1, &depthRenderbuffer);
-        glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer);
-        glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
-        glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer);
-        glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
-    }
-    
-    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
-        NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
-        return NO;
-    }
-
-    // Make sure the buffer is initially cleared, so we don't look at
-    // whatever happened to be in the framebuffer.
-    glClearColor(0, 0, 0, 1);
-    glClear(GL_COLOR_BUFFER_BIT);
-    [context presentRenderbuffer:GL_RENDERBUFFER_OES];
-    
-    return YES;
+  }
+  
+  if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) {
+    NSLog(@"failed to make complete framebuffer object %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES));
+    return NO;
+  }
+  
+  // Make sure the buffer is initially cleared, so we don't look at
+  // whatever happened to be in the framebuffer.
+  glClearColor(0, 0, 0, 1);
+  glClear(GL_COLOR_BUFFER_BIT);
+  [context presentRenderbuffer:GL_RENDERBUFFER_OES];
+  
+  return YES;
 }
 }
 
 
 
 
 - (void)destroyFramebuffer {
 - (void)destroyFramebuffer {
-    
+  if (viewFramebuffer != 0) {
     glDeleteFramebuffersOES(1, &viewFramebuffer);
     glDeleteFramebuffersOES(1, &viewFramebuffer);
     viewFramebuffer = 0;
     viewFramebuffer = 0;
+  }
+
+  if (viewRenderbuffer != 0) {
     glDeleteRenderbuffersOES(1, &viewRenderbuffer);
     glDeleteRenderbuffersOES(1, &viewRenderbuffer);
     viewRenderbuffer = 0;
     viewRenderbuffer = 0;
+  }
     
     
-    if(depthRenderbuffer) {
-        glDeleteRenderbuffersOES(1, &depthRenderbuffer);
-        depthRenderbuffer = 0;
-    }
+  if (depthRenderbuffer) {
+    glDeleteRenderbuffersOES(1, &depthRenderbuffer);
+    depthRenderbuffer = 0;
+  }
 }
 }
 
 
 - (void)dealloc {
 - (void)dealloc {

+ 7 - 0
panda/src/iphone/iPhoneGraphicsPipe.h

@@ -17,10 +17,12 @@
 
 
 #include "pandabase.h"
 #include "pandabase.h"
 #include "graphicsPipe.h"
 #include "graphicsPipe.h"
+#include "pset.h"
 #import "viewController.h"
 #import "viewController.h"
 #import <UIKit/UIKit.h>
 #import <UIKit/UIKit.h>
 
 
 class IPhoneGraphicsStateGuardian;
 class IPhoneGraphicsStateGuardian;
+class IPhoneGraphicsWindow;
 class PNMImage;
 class PNMImage;
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -38,6 +40,8 @@ public:
   static PT(GraphicsPipe) pipe_constructor();
   static PT(GraphicsPipe) pipe_constructor();
   virtual PreferredWindowThread get_preferred_window_thread() const;
   virtual PreferredWindowThread get_preferred_window_thread() const;
 
 
+  void rotate_windows();
+
 protected:
 protected:
   virtual PT(GraphicsOutput) make_output(const string &name,
   virtual PT(GraphicsOutput) make_output(const string &name,
                                          const FrameBufferProperties &fb_prop,
                                          const FrameBufferProperties &fb_prop,
@@ -53,6 +57,9 @@ public:
   UIWindow *_window; 
   UIWindow *_window; 
   ControllerDemoViewController *_view_controller;
   ControllerDemoViewController *_view_controller;
 
 
+  typedef pset<IPhoneGraphicsWindow *> GraphicsWindows;
+  GraphicsWindows _graphics_windows;
+
 private:
 private:
   static IPhoneGraphicsPipe *_global_ptr;
   static IPhoneGraphicsPipe *_global_ptr;
 
 

+ 17 - 1
panda/src/iphone/iPhoneGraphicsPipe.mm

@@ -33,7 +33,7 @@ IPhoneGraphicsPipe() {
   CGRect screenBounds = [ [ UIScreen mainScreen ] bounds ]; 
   CGRect screenBounds = [ [ UIScreen mainScreen ] bounds ]; 
 
 
   _window = [ [ UIWindow alloc ] initWithFrame: screenBounds ];
   _window = [ [ UIWindow alloc ] initWithFrame: screenBounds ];
-  _view_controller = [ [ ControllerDemoViewController alloc ] init ]; 
+  _view_controller = [ [ ControllerDemoViewController alloc ] initWithPipe: this ]; 
 
 
   [ _window addSubview:_view_controller.view ]; 
   [ _window addSubview:_view_controller.view ]; 
   [ _window makeKeyAndVisible ];
   [ _window makeKeyAndVisible ];
@@ -97,6 +97,22 @@ IPhoneGraphicsPipe::get_preferred_window_thread() const {
   return PWT_app;
   return PWT_app;
 }
 }
 
 
+////////////////////////////////////////////////////////////////////
+//     Function: IPhoneGraphicsPipe::rotate_windows
+//       Access: Public, Virtual
+//  Description: Called in response to an orientation change event,
+//               this tells all of the windows created on the pipe to
+//               resize themselves according to the new orientation.
+////////////////////////////////////////////////////////////////////
+void IPhoneGraphicsPipe::
+rotate_windows() {
+  GraphicsWindows::iterator gwi;
+  for (gwi = _graphics_windows.begin(); gwi != _graphics_windows.end(); ++gwi) {
+    IPhoneGraphicsWindow *win = (*gwi);
+    win->rotate_window();
+  }
+}
+
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 //     Function: IPhoneGraphicsPipe::make_output
 //     Function: IPhoneGraphicsPipe::make_output

+ 3 - 0
panda/src/iphone/iPhoneGraphicsWindow.h

@@ -44,6 +44,9 @@ public:
   virtual void process_events();
   virtual void process_events();
 
 
   virtual void set_properties_now(WindowProperties &properties);
   virtual void set_properties_now(WindowProperties &properties);
+  virtual void clear_pipe();
+
+  void rotate_window();
 
 
 protected:
 protected:
   virtual void close_window();
   virtual void close_window();

+ 41 - 5
panda/src/iphone/iPhoneGraphicsWindow.mm

@@ -17,10 +17,10 @@
 // gets included later (in particular, TCP_NODELAY must not be a
 // gets included later (in particular, TCP_NODELAY must not be a
 // #define symbol for these headers to be included properly).
 // #define symbol for these headers to be included properly).
 
 
-//#include <ApplicationServices/ApplicationServices.h>
 #include <UIKit/UIKit.h>
 #include <UIKit/UIKit.h>
 
 
 #include "iPhoneGraphicsWindow.h"
 #include "iPhoneGraphicsWindow.h"
+#include "dcast.h"
 #include "config_iphone.h"
 #include "config_iphone.h"
 #include "iPhoneGraphicsPipe.h"
 #include "iPhoneGraphicsPipe.h"
 #include "pStatTimer.h"
 #include "pStatTimer.h"
@@ -53,6 +53,9 @@ IPhoneGraphicsWindow(GraphicsEngine *engine, GraphicsPipe *pipe,
                      GraphicsOutput *host) :
                      GraphicsOutput *host) :
   GraphicsWindow(engine, pipe, name, fb_prop, win_prop, flags, gsg, host)
   GraphicsWindow(engine, pipe, name, fb_prop, win_prop, flags, gsg, host)
 {
 {
+  IPhoneGraphicsPipe *ipipe;
+  DCAST_INTO_V(ipipe, _pipe);
+  ipipe->_graphics_windows.insert(this);
   _gl_view = nil;
   _gl_view = nil;
 
 
   GraphicsWindowInputDevice device =
   GraphicsWindowInputDevice device =
@@ -196,23 +199,24 @@ close_window() {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 bool IPhoneGraphicsWindow::
 bool IPhoneGraphicsWindow::
 open_window() {
 open_window() {
-  iphone_cat.info() << "open_window\n";
-
   nassertr(_gsg == (GraphicsStateGuardian *)NULL, false);
   nassertr(_gsg == (GraphicsStateGuardian *)NULL, false);
 
 
   _gl_view = [ [ EAGLView alloc ] initWithFrame: 
   _gl_view = [ [ EAGLView alloc ] initWithFrame: 
         [ [ UIScreen mainScreen ] applicationFrame ] 
         [ [ UIScreen mainScreen ] applicationFrame ] 
     ]; 
     ]; 
+  _gl_view->_window = this;
+  
   IPhoneGraphicsPipe *iphonepipe = DCAST(IPhoneGraphicsPipe, _pipe);
   IPhoneGraphicsPipe *iphonepipe = DCAST(IPhoneGraphicsPipe, _pipe);
   nassertr(iphonepipe != NULL, false);
   nassertr(iphonepipe != NULL, false);
 
 
   iphonepipe->_view_controller.view = _gl_view;
   iphonepipe->_view_controller.view = _gl_view;
   [ _gl_view layoutSubviews ];
   [ _gl_view layoutSubviews ];
 
 
-  WindowProperties req_properties = _properties;
-
   _gsg = new IPhoneGraphicsStateGuardian(_engine, _pipe, NULL);
   _gsg = new IPhoneGraphicsStateGuardian(_engine, _pipe, NULL);
 
 
+  CGRect bounds = [_gl_view bounds];
+
+  _properties.set_size(bounds.size.width, bounds.size.height);
   _properties.set_foreground(true);
   _properties.set_foreground(true);
   _properties.set_minimized(false);
   _properties.set_minimized(false);
   _properties.set_open(true);
   _properties.set_open(true);
@@ -262,3 +266,35 @@ set_properties_now(WindowProperties &properties) {
  
  
   GraphicsWindow::set_properties_now(properties);
   GraphicsWindow::set_properties_now(properties);
 }
 }
+
+////////////////////////////////////////////////////////////////////
+//     Function: IPhoneGraphicsWindow::clear_pipe
+//       Access: Protected, Virtual
+//  Description: Sets the window's _pipe pointer to NULL; this is
+//               generally called only as a precursor to deleting the
+//               window.
+////////////////////////////////////////////////////////////////////
+void IPhoneGraphicsWindow::
+clear_pipe() {
+  IPhoneGraphicsPipe *ipipe;
+  DCAST_INTO_V(ipipe, _pipe);
+  ipipe->_graphics_windows.erase(this);
+
+  GraphicsWindow::clear_pipe();
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: IPhoneGraphicsWindow::rotate_window
+//       Access: Public, Virtual
+//  Description: Called in response to an orientation change event,
+//               this tells the window to resize itself according to
+//               the new orientation.
+////////////////////////////////////////////////////////////////////
+void IPhoneGraphicsWindow::
+rotate_window() {
+  CGRect bounds = [_gl_view bounds];
+
+  WindowProperties properties;
+  properties.set_size(bounds.size.width, bounds.size.height);
+  system_changed_properties(properties);
+}

+ 7 - 2
panda/src/iphone/pview_delegate.mm

@@ -108,7 +108,7 @@ signal_handler(int i) {
     // load the models.  We have this funny deferred-window technique,
     // load the models.  We have this funny deferred-window technique,
     // so SpringBoard will see that the app has fully initialized and
     // so SpringBoard will see that the app has fully initialized and
     // won't kill us if we take a while loading models.
     // won't kill us if we take a while loading models.
-    WindowFramework *window = framework.open_window();
+    framework.open_window();
     startup = 1;
     startup = 1;
 
 
   } else if (startup == 1) {
   } else if (startup == 1) {
@@ -148,9 +148,14 @@ signal_handler(int i) {
   }
   }
 }
 }
 
 
-- (void)dealloc { 
+- (void)applicationWillTerminate:
+(UIApplication *)application
+{
   [self stopAnimation];
   [self stopAnimation];
   framework.close_framework();
   framework.close_framework();
+}
+
+- (void)dealloc { 
   [super dealloc]; 
   [super dealloc]; 
 } 
 } 
 
 

+ 6 - 1
panda/src/iphone/viewController.h

@@ -17,8 +17,13 @@
 #import <UIKit/UIKit.h> 
 #import <UIKit/UIKit.h> 
 #import <UIKit/UITextView.h> 
 #import <UIKit/UITextView.h> 
 
 
+class IPhoneGraphicsPipe;
+
 @interface ControllerDemoViewController : UIViewController { 
 @interface ControllerDemoViewController : UIViewController { 
-  //    NSString *helloWorld, *woahDizzy; 
+
+@private
+  IPhoneGraphicsPipe *_pipe;
 } 
 } 
 
 
+- (id)initWithPipe: (IPhoneGraphicsPipe *)pipe;
 @end 
 @end 

+ 19 - 42
panda/src/iphone/viewController.mm

@@ -14,66 +14,43 @@
 
 
 #import "viewController.h" 
 #import "viewController.h" 
 #include "pnotify.h"
 #include "pnotify.h"
+#include "iPhoneGraphicsPipe.h"
+#include "config_iphone.h"
 
 
 @implementation ControllerDemoViewController 
 @implementation ControllerDemoViewController 
 
 
-- (id)init { 
-
-    self = [ super init ]; 
-
-    /*
-    if (self != nil) { 
-        helloWorld = [ [ NSString alloc ] initWithString: @"Hello, World!" ]; 
-        woahDizzy = [ [ NSString alloc ] initWithString: @"Woah, I'm Dizzy!" ]; 
-    } 
-    */
-
-    return self; 
-} 
-
-- (void)loadView { 
-
-    [ super loadView ]; 
-
-    /*
-    glView = [ [ EAGLView alloc ] initWithFrame: 
-        [ [ UIScreen mainScreen ] applicationFrame ] 
-    ];
-    //    [ glView startAnimation ];
-
-   self.view = glView; 
-    */
+- (id)initWithPipe:
+  (IPhoneGraphicsPipe *)pipe
+{ 
+  self = [ super init ]; 
+  _pipe = pipe;
+  return self; 
 } 
 } 
 
 
-/*
--(BOOL)shouldAutorotateToInterfaceOrientation: 
-(UIInterfaceOrientation)interfaceOrientation 
+- (BOOL)shouldAutorotateToInterfaceOrientation:
+  (UIInterfaceOrientation)interfaceOrientation 
 { 
 { 
-  return YES; 
+  return iphone_autorotate_view;
 } 
 } 
-*/
 
 
--  (void)didRotateFromInterfaceOrientation: 
-(UIInterfaceOrientation)fromInterfaceOrientation 
+- (void)didRotateFromInterfaceOrientation: 
+  (UIInterfaceOrientation)fromInterfaceOrientation 
 { 
 { 
+  _pipe->rotate_windows();
 } 
 } 
 
 
 - (void)viewDidLoad { 
 - (void)viewDidLoad { 
-    [ super viewDidLoad ]; 
-    /* Add custom post-load code here */ 
+  [ super viewDidLoad ]; 
+  /* Add custom post-load code here */ 
 } 
 } 
 
 
 - (void)didReceiveMemoryWarning { 
 - (void)didReceiveMemoryWarning { 
-    [ super didReceiveMemoryWarning ]; 
-    /* Add custom low-memory code here */ 
-    nout << "low-memory handler in view controller\n";
+  [ super didReceiveMemoryWarning ]; 
+  /* Add custom low-memory code here */ 
+  nout << "low-memory handler in view controller\n";
 } 
 } 
 
 
 - (void)dealloc { 
 - (void)dealloc { 
-    /* Here, the objects we've allocated are released */ 
-  //[ helloWorld release ]; 
-  //    [ woahDizzy release ]; 
-  //    [ glView release ]; 
   [ super dealloc ]; 
   [ super dealloc ]; 
 } 
 }