]> git.saurik.com Git - wxWidgets.git/blobdiff - samples/opengl/cube/cube.cpp
fixed bug with the caret positioning after SetValue() introduced by the last commit
[wxWidgets.git] / samples / opengl / cube / cube.cpp
index 75dde17d4e38004988d7cc07c1cd5ef7229c9351..a617a4c7562dc950cd1de902c2a77cb0b65ff80d 100644 (file)
 #include "cube.h"
 
 #ifndef __WXMSW__     // for wxStopWatch, see remark below
-#include <sys/time.h>
-#include <sys/unistd.h>
+  #if defined(__WXMAC__) && !defined(__DARWIN__)
+    #include <utime.h>
+    #include <unistd.h>
+  #else
+    #include <sys/time.h>
+    #include <sys/unistd.h>
+  #endif
 #else
 #include <sys/timeb.h>
 #endif
@@ -128,20 +133,21 @@ unsigned long wxStopWatch( unsigned long *sec_base )
 {
   unsigned long secs,msec;
 
-#ifndef __WXMSW__        // think every unice has gettimeofday
-  struct timeval tv;
-  gettimeofday( &tv, (struct timezone *)NULL );
-  secs = tv.tv_sec;
-  msec = tv.tv_usec/1000;
-#else
+#if defined(__WXMSW__)
   struct timeb tb;
-
   ftime( &tb );
-
   secs = tb.time;
-
   msec = tb.millitm;
-
+#elif defined(__WXMAC__) && !defined(__DARWIN__)
+  wxLongLong tl = wxGetLocalTimeMillis();
+  secs = (unsigned long) (tl.GetValue() / 1000);
+  msec = (unsigned long) (tl.GetValue() - secs*1000);
+#else
+  // think every unice has gettimeofday
+  struct timeval tv;
+  gettimeofday( &tv, (struct timezone *)NULL );
+  secs = tv.tv_sec;
+  msec = tv.tv_usec/1000;
 #endif
 
   if( *sec_base == 0 )
@@ -209,6 +215,11 @@ void TestGLCanvas::Render()
         m_init = TRUE;
     }
 
+    glMatrixMode(GL_PROJECTION);
+    glLoadIdentity();
+    glFrustum(-0.5F, 0.5F, -0.5F, 0.5F, 1.0F, 3.0F);
+    glMatrixMode(GL_MODELVIEW);
+
     /* clear color and depth buffers */
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
@@ -264,15 +275,18 @@ void TestGLCanvas::OnPaint( wxPaintEvent& event )
 
 void TestGLCanvas::OnSize(wxSizeEvent& event)
 {
-    int width, height;
-    GetClientSize(& width, & height);
+    // this is also necessary to update the context on some platforms
+    wxGLCanvas::OnSize(event);
 
+    // set GL viewport (not called by wxGLCanvas::OnSize on all platforms...)
+               int w, h;
+               GetClientSize(&w, &h);
 #ifndef __WXMOTIF__
     if (GetContext())
 #endif
     {
         SetCurrent();
-        glViewport(0, 0, width, height);
+        glViewport(0, 0, (GLint) w, (GLint) h);
     }
 }
 
@@ -360,10 +374,7 @@ void TestGLCanvas::OnKeyDown( wxKeyEvent& event )
 
     unsigned long currTime = event.m_timeStamp - m_xsynct;
 
-    // we have to test for m_Key != 0 because otherwise the test would be
-    // always true because it is set to 0 in OnKeyUp() below - I don't know
-    // why is it like this, just fixing blindly (VZ)
-    if (evkey != m_Key && m_Key != 0)
+    if (evkey != m_Key)
     {
         m_Key = evkey;
         m_LastRedraw = m_StartTime = m_LastTime = currTime;
@@ -373,7 +384,11 @@ void TestGLCanvas::OnKeyDown( wxKeyEvent& event )
     {
         Action( m_Key, m_LastTime-m_StartTime, currTime-m_StartTime );
 
+#if defined(__WXMAC__) && !defined(__DARWIN__)
+        m_LastRedraw = currTime;       // wxStopWatch() doesn't work on Mac...
+#else
         m_LastRedraw = wxStopWatch(&m_secbase) - m_gsynct;
+#endif
         m_LastTime = currTime;
     }
 
@@ -425,7 +440,7 @@ void MyFrame::OnExit(wxCommandEvent& event)
     Destroy();
 }
 
-void MyFrame::OnNewWindow()
+void MyFrame::OnNewWindow(wxCommandEvent& event)
 {
   MyFrame *frame = new MyFrame(NULL, "Cube OpenGL Demo Clone",
                                wxPoint(50, 50), wxSize(400, 300));
@@ -450,13 +465,13 @@ void MyFrame::OnNewWindow()
   frame->SetMenuBar(menuBar);
 
   frame->m_canvas = new TestGLCanvas( frame, *m_canvas, -1,
-               wxPoint(0, 0), wxSize(200, 200) );
+               wxDefaultPosition, wxDefaultSize );
 
   // Show the frame
   frame->Show(TRUE);
 }
 
-void MyFrame::OnDefRotateLeftKey()
+void MyFrame::OnDefRotateLeftKey(wxCommandEvent& event)
 {
   ScanCodeDialog dial( this, -1, m_canvas->m_rleft,
                        wxString("Left"), "Define key" );
@@ -464,7 +479,7 @@ void MyFrame::OnDefRotateLeftKey()
   if( result == wxID_OK )
     m_canvas->m_rleft = dial.GetValue();
 }
-void MyFrame::OnDefRotateRightKey()
+void MyFrame::OnDefRotateRightKey(wxCommandEvent& event)
 {
   ScanCodeDialog dial( this, -1, m_canvas->m_rright,
                        wxString("Right"), "Define key" );
@@ -506,7 +521,7 @@ bool MyApp::OnInit(void)
 
   frame->SetMenuBar(menuBar);
 
-  frame->m_canvas = new TestGLCanvas(frame, -1, wxPoint(0, 0), wxSize(200, 200));
+  frame->m_canvas = new TestGLCanvas(frame, -1, wxDefaultPosition, wxDefaultSize);
 
   // Show the frame
   frame->Show(TRUE);