aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2020-03-08 17:47:14 +0100
committerDavid Robillard <d@drobilla.net>2020-03-08 17:47:14 +0100
commitb03381600f56dbcf6aa6e2a211b721e555c6d2e1 (patch)
tree137957e781aba2b9c1a094924aaf2e2c9213bba5
parent5f2e299a2f0d86e450340079930b98651103722f (diff)
Factor out cube drawing
-rw-r--r--examples/cube_view.h82
-rw-r--r--examples/demo_utils.h5
-rw-r--r--examples/pugl_embed_demo.c65
3 files changed, 93 insertions, 59 deletions
diff --git a/examples/cube_view.h b/examples/cube_view.h
new file mode 100644
index 0000000..fb32595
--- /dev/null
+++ b/examples/cube_view.h
@@ -0,0 +1,82 @@
+/*
+ Copyright 2012-2020 David Robillard <http://drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+#define GL_SILENCE_DEPRECATION 1
+
+#include "demo_utils.h"
+
+#include "pugl/gl.h"
+
+static inline void
+reshapeCube(const int width, const int height)
+{
+ const float aspect = (float)width / (float)height;
+
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LESS);
+ glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glViewport(0, 0, width, height);
+
+ float projection[16];
+ perspective(projection, 1.8f, aspect, 1.0f, 100.0f);
+ glLoadMatrixf(projection);
+}
+
+static inline void
+displayCube(PuglView* const view,
+ const double distance,
+ const double xAngle,
+ const double yAngle,
+ const bool entered)
+{
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0f, 0.0f, (float)distance * -1.0f);
+ glRotatef((float)xAngle, 0.0f, 1.0f, 0.0f);
+ glRotatef((float)yAngle, 1.0f, 0.0f, 0.0f);
+
+ const float bg = entered ? 0.2f : 0.1f;
+ glClearColor(bg, bg, bg, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (puglHasFocus(view)) {
+ // Draw cube surfaces
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glEnableClientState(GL_COLOR_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, cubeStripVertices);
+ glColorPointer(3, GL_FLOAT, 0, cubeStripVertices);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 14);
+ glDisableClientState(GL_COLOR_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
+
+ glColor3f(0.0f, 0.0f, 0.0f);
+ } else {
+ glColor3f(1.0f, 1.0f, 1.0f);
+ }
+
+ // Draw cube wireframe
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, cubeFrontLineLoop);
+ glDrawArrays(GL_LINE_LOOP, 0, 4);
+ glVertexPointer(3, GL_FLOAT, 0, cubeBackLineLoop);
+ glDrawArrays(GL_LINE_LOOP, 0, 4);
+ glVertexPointer(3, GL_FLOAT, 0, cubeSideLines);
+ glDrawArrays(GL_LINES, 0, 8);
+ glDisableClientState(GL_VERTEX_ARRAY);
+}
diff --git a/examples/demo_utils.h b/examples/demo_utils.h
index 94be68e..9a1cb7a 100644
--- a/examples/demo_utils.h
+++ b/examples/demo_utils.h
@@ -14,6 +14,9 @@
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifndef PUGL_DEMO_UTILS_H
+#define PUGL_DEMO_UTILS_H
+
#include "pugl/pugl.h"
#include <math.h>
@@ -168,3 +171,5 @@ puglPrintFps(const PuglWorld* world,
*framesDrawn = 0;
}
}
+
+#endif // PUGL_DEMO_UTILS_H
diff --git a/examples/pugl_embed_demo.c b/examples/pugl_embed_demo.c
index 43d3d4e..f222773 100644
--- a/examples/pugl_embed_demo.c
+++ b/examples/pugl_embed_demo.c
@@ -20,6 +20,7 @@
#define GL_SILENCE_DEPRECATION 1
+#include "cube_view.h"
#include "demo_utils.h"
#include "test/test_utils.h"
@@ -74,26 +75,6 @@ getChildFrame(const PuglRect parentFrame)
}
static void
-onReshape(PuglView* view, int width, int height)
-{
- (void)view;
-
- const float aspect = (float)width / (float)height;
-
- glEnable(GL_DEPTH_TEST);
- glDepthFunc(GL_LESS);
- glClearColor(0.2f, 0.2f, 0.2f, 1.0f);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glViewport(0, 0, width, height);
-
- float projection[16];
- perspective(projection, 1.8f, aspect, 1.0f, 100.0f);
- glLoadMatrixf(projection);
-}
-
-static void
onDisplay(PuglView* view)
{
PuglTestApp* app = (PuglTestApp*)puglGetHandle(view);
@@ -101,44 +82,12 @@ onDisplay(PuglView* view)
const double thisTime = puglGetTime(app->world);
if (app->continuous) {
const double dTime = thisTime - app->lastDrawTime;
+
app->xAngle = fmod(app->xAngle + dTime * 100.0, 360.0);
app->yAngle = fmod(app->yAngle + dTime * 100.0, 360.0);
}
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0f, 0.0f, app->dist * -1);
- glRotatef((float)app->xAngle, 0.0f, 1.0f, 0.0f);
- glRotatef((float)app->yAngle, 1.0f, 0.0f, 0.0f);
-
- const float bg = app->mouseEntered ? 0.2f : 0.1f;
- glClearColor(bg, bg, bg, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (puglHasFocus(app->child)) {
- // Draw cube surfaces
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_COLOR_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, cubeStripVertices);
- glColorPointer(3, GL_FLOAT, 0, cubeStripVertices);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 14);
- glDisableClientState(GL_COLOR_ARRAY);
- glDisableClientState(GL_VERTEX_ARRAY);
-
- glColor3f(0.0f, 0.0f, 0.0f);
- } else {
- glColor3f(1.0f, 1.0f, 1.0f);
- }
-
- // Draw cube wireframe
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(3, GL_FLOAT, 0, cubeFrontLineLoop);
- glDrawArrays(GL_LINE_LOOP, 0, 4);
- glVertexPointer(3, GL_FLOAT, 0, cubeBackLineLoop);
- glDrawArrays(GL_LINE_LOOP, 0, 4);
- glVertexPointer(3, GL_FLOAT, 0, cubeSideLines);
- glDrawArrays(GL_LINES, 0, 8);
- glDisableClientState(GL_VERTEX_ARRAY);
+ displayCube(view, app->dist, app->xAngle, app->yAngle, app->mouseEntered);
app->lastDrawTime = thisTime;
++app->framesDrawn;
@@ -214,10 +163,7 @@ onParentEvent(PuglView* view, const PuglEvent* event)
switch (event->type) {
case PUGL_CONFIGURE:
- onReshape(view,
- (int)event->configure.width,
- (int)event->configure.height);
-
+ reshapeCube((int)event->configure.width, (int)event->configure.height);
puglSetFrame(app->child, getChildFrame(parentFrame));
break;
case PUGL_EXPOSE:
@@ -262,7 +208,7 @@ onEvent(PuglView* view, const PuglEvent* event)
switch (event->type) {
case PUGL_CONFIGURE:
- onReshape(view, (int)event->configure.width, (int)event->configure.height);
+ reshapeCube((int)event->configure.width, (int)event->configure.height);
break;
case PUGL_EXPOSE:
onDisplay(view);
@@ -302,6 +248,7 @@ int
main(int argc, char** argv)
{
PuglTestApp app = {0};
+
app.dist = 10;
const PuglTestOptions opts = puglParseTestOptions(&argc, &argv);