diff --git a/upptst/OpenGLKey/OpenGLKey.upp b/upptst/OpenGLKey/OpenGLKey.upp new file mode 100644 index 000000000..942c9e3b8 --- /dev/null +++ b/upptst/OpenGLKey/OpenGLKey.upp @@ -0,0 +1,13 @@ +description "GLCtrl widget example\377"; + +uses + GLCtrl, + CodeEditor; + +file + main.cpp; + +mainconfig + "" = "GUI", + "" = "GUI X11"; + diff --git a/upptst/OpenGLKey/main.cpp b/upptst/OpenGLKey/main.cpp new file mode 100644 index 000000000..1a92a9f61 --- /dev/null +++ b/upptst/OpenGLKey/main.cpp @@ -0,0 +1,113 @@ +#include +#include + +using namespace Upp; + +struct OpenGLExample : GLCtrl { + Point point; + + virtual void GLPaint() { + StdView(); + + double t = 13 * point.x; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glLoadIdentity(); + glPushMatrix(); + glTranslatef(0, 0, -6); + glRotated(t / 30.0, 0, 1, 0); + glRotated(t / 40.0, 1, 0, 0); + glRotated(t / 5.0, 0, 0, 1); + glBegin(GL_TRIANGLE_FAN); + glColor4d(0.8, 0.4, 0.2, 1); + glVertex3f(0.0f, 0.0f, 0.0f); + for(int i = 0; i < 50; i++) { + double u = M_2PI * i / 49; + glColor4d(i / 50.0, 0.5 + i / 100.0, 0.7 - i / 150.0, 1); + glVertex3d(sin(u), cos(u), 1.0f); + } + glEnd(); + glBegin(GL_TRIANGLE_FAN); + glColor4d(0.8, 0.4, 0.2, 1); + glVertex3f(0.0f, 0.0f, 3.0f); + for(int i = 0; i < 50; i++) { + double u = M_2PI * i / 49; + glColor4d(0.7, 0.5 - i / 100.0, 0.7 + i / 150.0, 1); + glVertex3d(sin(u), cos(u), 1.0f); + } + glEnd(); + glPopMatrix(); + t = 13 * point.y; + float sn = (float)sin(t / 300); + float cs = (float)cos(t / 300); + glTranslatef(sn + cs, sn, -6 - cs); + glRotated(t / 12.0, 0, 0, 1); + glRotated(t / 15.0, 0, 1, 0); + glRotated(t / 17.0, 1, 0, 0); + glBegin(GL_TRIANGLE_STRIP); + glVertex3f(0.0f, 0.0f, 0.0f); + glColor4d(1, 0, 0, 0.5); + glVertex3d(-1, 0, 0); + glVertex3d(1, 0, 0); + glVertex3d(0, 0.87, 0); + glColor4d(0, 1, 0, 0.5); + glVertex3d(0, 0, 1.67); + glEnd(); + } + + virtual void GLResize(int w, int h) { + glViewport(0, 0, (GLsizei)w, (GLsizei)h); + } + + virtual bool Key(dword key, int count) { + PromptOK("KEY!"); + return false; + } + + virtual void LeftDown(Point, dword) + { // Demonstrates how to create a screenshot of opengl widget + ExecuteGL([&] { + Size sz=GetSize(); + ImageBuffer ib(sz); + + glReadPixels(0,0,sz.cx,sz.cy,GL_BGRA_EXT,GL_UNSIGNED_BYTE,(GLvoid*)~ib); + if(!glGetError()){ + // Flip + Buffer temp(sz.cx); + for(int i = 0; i < sz.cy / 2; i++){ + memcpy(temp, ib[i], sz.cx * sizeof(RGBA)); + memcpy(ib[i], ib[sz.cy - 1 - i], sz.cx * sizeof(RGBA)); + memcpy(ib[sz.cy - 1 - i], temp, sz.cx * sizeof(RGBA)); + } + + // Flatten alpha channel + for(RGBA& t : ib) + t.a = 255; + + // Save image + String p = SelectFileSaveAs("Portable Network Graphics (*.png)\t*.png"); + if(p.GetCount()) + PNGEncoder().SaveFile(p, ib); + } + }); + } + + virtual void MouseMove(Point p, dword) { + point = p; + Refresh(); + } +}; + +GUI_APP_MAIN +{ + Ctrl::GlobalBackPaint(); + TopWindow win; + OpenGLExample gl; + gl.SetFrame(InsetFrame()); + win.Add(gl.HSizePos(10, 10).VSizePos(10, 10)); + win.Sizeable().Zoomable(); + win.ActiveFocus(gl); + win.Open(); + win.Run(); +}