diff options
Diffstat (limited to 'examples/pugl_shader_demo.c')
-rw-r--r-- | examples/pugl_shader_demo.c | 49 |
1 files changed, 28 insertions, 21 deletions
diff --git a/examples/pugl_shader_demo.c b/examples/pugl_shader_demo.c index 9ba3da0..5bef21e 100644 --- a/examples/pugl_shader_demo.c +++ b/examples/pugl_shader_demo.c @@ -21,16 +21,19 @@ about 100000 rectangles. */ +#define PUGL_NO_INCLUDE_GL_H + #include "demo_utils.h" #include "file_utils.h" #include "rects.h" #include "shader_utils.h" -#include "test/test_utils.h" #include "glad/glad.h" -#include "pugl/gl.h" -#include "pugl/pugl.h" +#include <puglutil/test_utils.h> + +#include <pugl/gl.h> +#include <pugl/pugl.h> #include <math.h> #include <stddef.h> @@ -75,7 +78,7 @@ static void teardownGl(PuglTestApp* app); static void -onConfigure(PuglView* view, double width, double height) +onConfigure(PuglView* view, PuglSpan width, PuglSpan height) { (void)view; @@ -90,15 +93,15 @@ static void onExpose(PuglView* view) { PuglTestApp* app = (PuglTestApp*)puglGetHandle(view); - const PuglRect frame = puglGetFrame(view); - const float width = (float)frame.width; - const float height = (float)frame.height; + const PuglArea size = puglGetSizeHint(view, PUGL_CURRENT_SIZE); + const float width = (float)size.width; + const float height = (float)size.height; const double time = puglGetTime(puglGetWorld(view)); // Construct projection matrix for 2D window surface (in pixels) mat4 proj; mat4Ortho( - proj, 0.0f, (float)frame.width, 0.0f, (float)frame.height, -1.0f, 1.0f); + proj, 0.0f, (float)size.width, 0.0f, (float)size.height, -1.0f, 1.0f); // Clear and bind everything that is the same for every rect glClear(GL_COLOR_BUFFER_BIT); @@ -108,7 +111,7 @@ onExpose(PuglView* view) // Update horizontal mouse cursor line (last rect) Rect* const mouseH = &app->rects[app->numRects]; mouseH->pos[0] = (float)(app->mouseX - 8.0); - mouseH->pos[1] = (float)(frame.height - app->mouseY - 1.0); + mouseH->pos[1] = (float)(size.height - app->mouseY - 1.0); mouseH->size[0] = 16.0f; mouseH->size[1] = 2.0f; mouseH->fillColor[0] = 1.0f; @@ -119,7 +122,7 @@ onExpose(PuglView* view) // Update vertical mouse cursor line (second last rect) Rect* const mouseV = &app->rects[app->numRects + 1]; mouseV->pos[0] = (float)(app->mouseX - 2.0); - mouseV->pos[1] = (float)(frame.height - app->mouseY - 8.0); + mouseV->pos[1] = (float)(size.height - app->mouseY - 8.0); mouseV->size[0] = 2.0f; mouseV->size[1] = 16.0f; mouseV->fillColor[0] = 1.0f; @@ -168,7 +171,7 @@ onEvent(PuglView* view, const PuglEvent* event) onConfigure(view, event->configure.width, event->configure.height); break; case PUGL_UPDATE: - puglPostRedisplay(view); + puglObscureView(view); break; case PUGL_EXPOSE: onExpose(view); @@ -195,7 +198,7 @@ onEvent(PuglView* view, const PuglEvent* event) break; case PUGL_TIMER: if (event->timer.id == resizeTimerId) { - puglPostRedisplay(view); + puglObscureView(view); } break; default: @@ -230,10 +233,15 @@ loadShader(const char* const programPath, const char* const name) free(path); fseek(file, 0, SEEK_END); - const size_t fileSize = (size_t)ftell(file); + const long filePos = ftell(file); + if (filePos <= 0) { + fclose(file); + return NULL; + } fseek(file, 0, SEEK_SET); - char* source = (char*)calloc(1, fileSize + 1U); + const size_t fileSize = (size_t)filePos; + char* source = (char*)calloc(1, fileSize + 1U); if (fread(source, 1, fileSize, file) != fileSize) { free(source); @@ -351,17 +359,16 @@ setupGl(PuglTestApp* app) char* const fragmentSource = loadShader(app->programPath, SHADER_DIR "rect.frag"); - if (!vertexSource || !fragmentSource) { - logError("Failed to load shader sources\n"); - return PUGL_FAILURE; + // Compile rectangle shaders and program + if (headerSource && vertexSource && fragmentSource) { + app->drawRect = compileProgram(headerSource, vertexSource, fragmentSource); } - // Compile rectangle shaders and program - app->drawRect = compileProgram(headerSource, vertexSource, fragmentSource); free(fragmentSource); free(vertexSource); free(headerSource); if (!app->drawRect.program) { + logError("Failed to compile shader program\n"); return PUGL_FAILURE; } @@ -470,7 +477,7 @@ updateTimeout(const PuglTestApp* const app) const double nextExposeTime = nextFrameEndTime - neededTime; const double timeUntilNext = nextExposeTime - now; - return timeUntilNext; + return fmax(0.0, (timeUntilNext * 0.9) - 0.001); } int @@ -505,7 +512,7 @@ main(int argc, char** argv) const double startTime = puglGetTime(app.world); PuglFpsPrinter fpsPrinter = {startTime}; while (!app.quit) { - puglUpdate(app.world, fmax(0.0, updateTimeout(&app))); + puglUpdate(app.world, updateTimeout(&app)); puglPrintFps(app.world, &fpsPrinter, &app.framesDrawn); } |