summaryrefslogtreecommitdiff
path: root/hacks/gl/basic_gl_pane.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2019-01-28 22:41:25 +0000
committerCarl Hetherington <cth@carlh.net>2019-01-28 22:41:25 +0000
commit1409af06f789ee1a832e61ed722cc48ed18f89f3 (patch)
treef1393eff53f5b25ef4b005da1de981793037eb2c /hacks/gl/basic_gl_pane.cc
parent4117c113eeffe817fddc1c63f5d10eb4e6ada4f9 (diff)
OpenGL hacks.
Diffstat (limited to 'hacks/gl/basic_gl_pane.cc')
-rw-r--r--hacks/gl/basic_gl_pane.cc167
1 files changed, 167 insertions, 0 deletions
diff --git a/hacks/gl/basic_gl_pane.cc b/hacks/gl/basic_gl_pane.cc
new file mode 100644
index 000000000..565bf4cee
--- /dev/null
+++ b/hacks/gl/basic_gl_pane.cc
@@ -0,0 +1,167 @@
+#include "wx/wx.h"
+#include "wx/sizer.h"
+#include "wx/glcanvas.h"
+
+#include "basic_gl_pane.h"
+#include "image.h"
+#include "drawable.h"
+
+// include OpenGL
+#ifdef __WXMAC__
+#include "OpenGL/glu.h"
+#include "OpenGL/gl.h"
+#else
+#include <GL/glu.h>
+#include <GL/gl.h>
+#endif
+
+class MyApp: public wxApp
+{
+ virtual bool OnInit();
+
+ wxFrame *frame;
+ BasicGLPane * glPane;
+public:
+
+};
+
+IMPLEMENT_APP(MyApp)
+
+Image* image = NULL;
+DrawableThing* sprite;
+
+bool MyApp::OnInit()
+{
+ wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
+ frame = new wxFrame((wxFrame *)NULL, -1, wxT("Hello GL World"), wxPoint(50,50), wxSize(400,200));
+
+ int args[] = {WX_GL_RGBA, WX_GL_DOUBLEBUFFER, WX_GL_DEPTH_SIZE, 16, 0};
+
+ glPane = new BasicGLPane( (wxFrame*) frame, args);
+ sizer->Add(glPane, 1, wxEXPAND);
+
+ frame->SetSizer(sizer);
+ frame->SetAutoLayout(true);
+
+ frame->Show();
+ return true;
+}
+
+BEGIN_EVENT_TABLE(BasicGLPane, wxGLCanvas)
+EVT_MOTION(BasicGLPane::mouseMoved)
+EVT_LEFT_DOWN(BasicGLPane::mouseDown)
+EVT_LEFT_UP(BasicGLPane::mouseReleased)
+EVT_RIGHT_DOWN(BasicGLPane::rightClick)
+EVT_LEAVE_WINDOW(BasicGLPane::mouseLeftWindow)
+EVT_SIZE(BasicGLPane::resized)
+EVT_KEY_DOWN(BasicGLPane::keyPressed)
+EVT_KEY_UP(BasicGLPane::keyReleased)
+EVT_MOUSEWHEEL(BasicGLPane::mouseWheelMoved)
+EVT_PAINT(BasicGLPane::render)
+END_EVENT_TABLE()
+
+
+// some useful events to use
+void BasicGLPane::mouseMoved(wxMouseEvent& event) {}
+void BasicGLPane::mouseDown(wxMouseEvent& event) {}
+void BasicGLPane::mouseWheelMoved(wxMouseEvent& event) {}
+void BasicGLPane::mouseReleased(wxMouseEvent& event) {}
+void BasicGLPane::rightClick(wxMouseEvent& event) {}
+void BasicGLPane::mouseLeftWindow(wxMouseEvent& event) {}
+void BasicGLPane::keyPressed(wxKeyEvent& event) {}
+void BasicGLPane::keyReleased(wxKeyEvent& event) {}
+
+BasicGLPane::BasicGLPane(wxFrame* parent, int* args) :
+wxGLCanvas(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, wxT("GLCanvas"), args)
+{
+}
+
+void BasicGLPane::resized(wxSizeEvent& evt)
+{
+ wxGLCanvas::OnSize(evt);
+
+ Refresh();
+}
+
+void BasicGLPane::prepare3DViewport(int topleft_x, int topleft_y, int bottomrigth_x, int bottomrigth_y)
+{
+ /*
+ * Inits the OpenGL viewport for drawing in 3D.
+ */
+
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black Background
+ glClearDepth(1.0f); // Depth Buffer Setup
+ glEnable(GL_DEPTH_TEST); // Enables Depth Testing
+ glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+
+ glEnable(GL_COLOR_MATERIAL);
+
+ glViewport(topleft_x, topleft_y, bottomrigth_x-topleft_x, bottomrigth_y-topleft_y);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ float ratio_w_h = (float)(bottomrigth_x-topleft_x)/(float)(bottomrigth_y-topleft_y);
+ gluPerspective(45 /*view angle*/, ratio_w_h, 0.1 /*clip close*/, 200 /*clip far*/);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+}
+
+void BasicGLPane::prepare2DViewport(int topleft_x, int topleft_y, int bottomrigth_x, int bottomrigth_y)
+{
+
+ /*
+ * Inits the OpenGL viewport for drawing in 2D
+ */
+
+ glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Black Background
+ glEnable(GL_TEXTURE_2D); // textures
+ glEnable(GL_COLOR_MATERIAL);
+ glEnable(GL_BLEND);
+ glDisable(GL_DEPTH_TEST);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+
+ glViewport(topleft_x, topleft_y, bottomrigth_x-topleft_x, bottomrigth_y-topleft_y);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ gluOrtho2D(topleft_x, bottomrigth_x, bottomrigth_y, topleft_y);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+int BasicGLPane::getWidth()
+{
+ return GetSize().x;
+}
+
+int BasicGLPane::getHeight()
+{
+ return GetSize().y;
+}
+
+void BasicGLPane::render( wxPaintEvent& evt )
+{
+ if(!IsShown()) return;
+
+ wxGLCanvas::SetCurrent();
+
+
+ if(image == NULL)
+ {
+ image = new Image( wxT("myfile.png") );
+ sprite = new DrawableThing(image);
+ }
+
+ wxPaintDC(this); // only to be used in paint events. use wxClientDC to paint outside the paint event
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ // render loaded image
+ prepare2DViewport(0,0,getWidth(), getHeight());
+ sprite->render();
+
+ glFlush();
+ SwapBuffers();
+}