home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / samples / opengl / penguin / penguin.cpp < prev    next >
C/C++ Source or Header  |  2002-03-17  |  6KB  |  252 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        penguin.cpp
  3. // Purpose:     wxGLCanvas demo program
  4. // Author:      Robert Roebling
  5. // Modified by:
  6. // Created:     04/01/98
  7. // RCS-ID:      $Id: penguin.cpp,v 1.6 2002/03/17 14:15:54 VZ Exp $
  8. // Copyright:   (c) Robert Roebling
  9. // Licence:     wxWindows licence
  10. /////////////////////////////////////////////////////////////////////////////
  11.  
  12. #ifdef __GNUG__
  13. #pragma implementation
  14. #pragma interface
  15. #endif
  16.  
  17. // For compilers that support precompilation, includes "wx.h".
  18. #include "wx/wxprec.h"
  19.  
  20. #ifdef __BORLANDC__
  21. #pragma hdrstop
  22. #endif
  23.  
  24. #ifndef WX_PRECOMP
  25. #include "wx/wx.h"
  26. #endif
  27.  
  28. #if !wxUSE_GLCANVAS
  29. #error Please set wxUSE_GLCANVAS to 1 in setup.h.
  30. #endif
  31.  
  32. #include "penguin.h"
  33. #ifdef __WXMAC__
  34. #  ifdef __DARWIN__
  35. #    include <OpenGL/glu.h>
  36. #  else
  37. #    include <glu.h>
  38. #  endif
  39. #else
  40. #  include <GL/glu.h>
  41. #endif
  42.  
  43. #define VIEW_ASPECT 1.3
  44.  
  45. /* `Main program' equivalent, creating windows and returning main app frame */
  46. bool MyApp::OnInit(void)
  47. {
  48.  
  49.   /* Create the main frame window */
  50.   MyFrame *frame = new MyFrame(NULL, "wxWindows OpenGL Demo", wxPoint(50, 50), wxSize(400, 300));
  51.  
  52.   /* Make a menubar */
  53.   wxMenu *fileMenu = new wxMenu;
  54.  
  55.   fileMenu->Append(wxID_EXIT, "E&xit");
  56.   wxMenuBar *menuBar = new wxMenuBar;
  57.   menuBar->Append(fileMenu, "&File");
  58.   frame->SetMenuBar(menuBar);
  59.  
  60.   frame->m_canvas = new TestGLCanvas(frame, -1, wxPoint(0, 0), wxSize(200, 200), wxSUNKEN_BORDER);
  61.  
  62.   /* Load file wiht mesh data */
  63.   frame->m_canvas->LoadLWO( "penguin.lwo" );
  64.  
  65.   /* Show the frame */
  66.   frame->Show(TRUE);
  67.   
  68.   return TRUE;
  69. }
  70.  
  71. IMPLEMENT_APP(MyApp)
  72.  
  73. BEGIN_EVENT_TABLE(MyFrame, wxFrame)
  74.     EVT_MENU(wxID_EXIT, MyFrame::OnExit)
  75. END_EVENT_TABLE()
  76.  
  77. /* My frame constructor */
  78. MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos,
  79.     const wxSize& size, long style):
  80.   wxFrame(frame, -1, title, pos, size, style)
  81. {
  82.     m_canvas = NULL;
  83. }
  84.  
  85. /* Intercept menu commands */
  86. void MyFrame::OnExit(wxCommandEvent& event)
  87. {
  88.     Destroy();
  89. }
  90.  
  91. BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas)
  92.     EVT_SIZE(TestGLCanvas::OnSize)
  93.     EVT_PAINT(TestGLCanvas::OnPaint)
  94.     EVT_ERASE_BACKGROUND(TestGLCanvas::OnEraseBackground)
  95.     EVT_MOUSE_EVENTS(TestGLCanvas::OnMouse)
  96. END_EVENT_TABLE()
  97.  
  98. TestGLCanvas::TestGLCanvas(wxWindow *parent, wxWindowID id,
  99.     const wxPoint& pos, const wxSize& size, long style, const wxString& name):
  100.   wxGLCanvas(parent, id, pos, size, style, name)
  101. {
  102.    block = FALSE;
  103. }
  104.  
  105. TestGLCanvas::~TestGLCanvas(void)
  106. {
  107.     /* destroy mesh */
  108.     lw_object_free(info.lwobject);
  109. }
  110.  
  111. void TestGLCanvas::OnPaint( wxPaintEvent& event )
  112. {
  113.     /* must always be here */
  114.     wxPaintDC dc(this);
  115.  
  116. #ifndef __WXMOTIF__
  117.     if (!GetContext()) return;
  118. #endif
  119.  
  120.     SetCurrent();
  121.     
  122.     /* initialize OpenGL */
  123.     if (info.do_init == TRUE) 
  124.     {
  125.         InitGL();
  126.         info.do_init = FALSE;
  127.     }
  128.   
  129.     /* view */
  130.     glMatrixMode( GL_PROJECTION );
  131.     glLoadIdentity();
  132.     gluPerspective( info.zoom, VIEW_ASPECT, 1, 100 );
  133.     glMatrixMode( GL_MODELVIEW );
  134.  
  135.     /* clear */
  136.     glClearColor( .3, .4, .6, 1 );
  137.     glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  138.  
  139.     /* transformations */
  140.     GLfloat m[4][4];
  141.     glLoadIdentity();
  142.     glTranslatef( 0, 0, -30 );
  143.     build_rotmatrix( m,info.quat );
  144.     glMultMatrixf( &m[0][0] );
  145.  
  146.     /* draw object */
  147.     lw_object_show( info.lwobject );
  148.     
  149.     /* flush */
  150.     glFlush();
  151.  
  152.     /* swap */
  153.     SwapBuffers();
  154. }
  155.  
  156. void TestGLCanvas::OnSize(wxSizeEvent& event)
  157. {
  158.     // this is also necessary to update the context on some platforms
  159.     wxGLCanvas::OnSize(event);
  160.     
  161.     // set GL viewport (not called by wxGLCanvas::OnSize on all platforms...)
  162.     int w, h;
  163.     GetClientSize(&w, &h);
  164. #ifndef __WXMOTIF__
  165.     if (GetContext())
  166. #endif
  167.     {
  168.         SetCurrent();
  169.         glViewport(0, 0, (GLint) w, (GLint) h);
  170.     }
  171. }
  172.  
  173. void TestGLCanvas::OnEraseBackground(wxEraseEvent& event)
  174. {
  175.     /* Do nothing, to avoid flashing on MSW */
  176. }
  177.  
  178. void TestGLCanvas::LoadLWO(const wxString &filename)
  179. {
  180.     /* test if lightwave object */
  181.     if (!lw_is_lwobject(filename)) return;
  182.   
  183.     /* read lightwave object */
  184.     lwObject *lwobject = lw_object_read(filename);
  185.     
  186.     /* scale */
  187.     lw_object_scale(lwobject, 10.0 / lw_object_radius(lwobject));
  188.     
  189.     /* set up mesh info */
  190.     info.do_init = TRUE;
  191.     info.lwobject = lwobject;
  192.     info.beginx = 0;
  193.     info.beginy = 0;
  194.     info.zoom   = 45;
  195.     trackball( info.quat, 0.0, 0.0, 0.0, 0.0 );
  196. }
  197.  
  198. void TestGLCanvas::OnMouse( wxMouseEvent& event )
  199. {
  200.     wxSize sz(GetClientSize());
  201.     if (event.Dragging())
  202.     {
  203.         /* drag in progress, simulate trackball */
  204.         float spin_quat[4];
  205.         trackball(spin_quat,
  206.           (2.0*info.beginx -       sz.x) / sz.x,
  207.           (     sz.y - 2.0*info.beginy) / sz.y,
  208.           (     2.0*event.GetX() - sz.x) / sz.x,
  209.           (    sz.y - 2.0*event.GetY()) / sz.y);
  210.           
  211.         add_quats( spin_quat, info.quat, info.quat );
  212.  
  213.         /* orientation has changed, redraw mesh */
  214.     Refresh(FALSE);
  215.     }
  216.  
  217.     info.beginx = event.GetX();
  218.     info.beginy = event.GetY();
  219. }
  220.  
  221. void TestGLCanvas::InitGL(void)
  222. {
  223.     GLfloat light0_pos[4]   = { -50.0, 50.0, 0.0, 0.0 };
  224.     GLfloat light0_color[4] = { .6, .6, .6, 1.0 }; /* white light */
  225.     GLfloat light1_pos[4]   = {  50.0, 50.0, 0.0, 0.0 };
  226.     GLfloat light1_color[4] = { .4, .4, 1, 1.0 };  /* cold blue light */
  227.  
  228.     /* remove back faces */
  229.     glDisable(GL_CULL_FACE);
  230.     glEnable(GL_DEPTH_TEST);
  231.   
  232.     /* speedups */
  233.     glEnable(GL_DITHER);
  234.     glShadeModel(GL_SMOOTH);
  235.     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
  236.     glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
  237.  
  238.     /* light */
  239.     glLightfv(GL_LIGHT0, GL_POSITION, light0_pos);
  240.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light0_color);  
  241.     glLightfv(GL_LIGHT1, GL_POSITION, light1_pos);
  242.     glLightfv(GL_LIGHT1, GL_DIFFUSE,  light1_color);
  243.     glEnable(GL_LIGHT0);
  244.     glEnable(GL_LIGHT1);
  245.     glEnable(GL_LIGHTING);
  246.     
  247.     glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);
  248.     glEnable(GL_COLOR_MATERIAL);  
  249. }
  250.  
  251.  
  252.