diff options
author | sanine <sanine.not@pm.me> | 2023-02-12 23:53:22 -0600 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2023-02-12 23:53:22 -0600 |
commit | f1fe73d1909a2448a004a88362a1a532d0d4f7c3 (patch) | |
tree | ab37ae3837e2f858de2932bcee9f26e69fab3db1 /libs/nanovg/example/example_gl3.c | |
parent | f567ea1e2798fd3156a416e61f083ea3e6b95719 (diff) |
switch to tinyobj and nanovg from assimp and cairo
Diffstat (limited to 'libs/nanovg/example/example_gl3.c')
-rw-r--r-- | libs/nanovg/example/example_gl3.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/libs/nanovg/example/example_gl3.c b/libs/nanovg/example/example_gl3.c new file mode 100644 index 0000000..409a145 --- /dev/null +++ b/libs/nanovg/example/example_gl3.c @@ -0,0 +1,198 @@ +// +// Copyright (c) 2013 Mikko Mononen memon@inside.org +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. +// + +#include <stdio.h> +#ifdef NANOVG_GLEW +# include <GL/glew.h> +#endif +#ifdef __APPLE__ +# define GLFW_INCLUDE_GLCOREARB +#endif +#define GLFW_INCLUDE_GLEXT +#include <GLFW/glfw3.h> +#include "nanovg.h" +#define NANOVG_GL3_IMPLEMENTATION +#include "nanovg_gl.h" +#include "demo.h" +#include "perf.h" + + +void errorcb(int error, const char* desc) +{ + printf("GLFW error %d: %s\n", error, desc); +} + +int blowup = 0; +int screenshot = 0; +int premult = 0; + +static void key(GLFWwindow* window, int key, int scancode, int action, int mods) +{ + NVG_NOTUSED(scancode); + NVG_NOTUSED(mods); + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) + glfwSetWindowShouldClose(window, GL_TRUE); + if (key == GLFW_KEY_SPACE && action == GLFW_PRESS) + blowup = !blowup; + if (key == GLFW_KEY_S && action == GLFW_PRESS) + screenshot = 1; + if (key == GLFW_KEY_P && action == GLFW_PRESS) + premult = !premult; +} + +int main() +{ + GLFWwindow* window; + DemoData data; + NVGcontext* vg = NULL; + GPUtimer gpuTimer; + PerfGraph fps, cpuGraph, gpuGraph; + double prevt = 0, cpuTime = 0; + + if (!glfwInit()) { + printf("Failed to init GLFW."); + return -1; + } + + initGraph(&fps, GRAPH_RENDER_FPS, "Frame Time"); + initGraph(&cpuGraph, GRAPH_RENDER_MS, "CPU Time"); + initGraph(&gpuGraph, GRAPH_RENDER_MS, "GPU Time"); + + glfwSetErrorCallback(errorcb); +#ifndef _WIN32 // don't require this on win32, and works with more cards + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); +#endif + glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, 1); + +#ifdef DEMO_MSAA + glfwWindowHint(GLFW_SAMPLES, 4); +#endif + window = glfwCreateWindow(1000, 600, "NanoVG", NULL, NULL); +// window = glfwCreateWindow(1000, 600, "NanoVG", glfwGetPrimaryMonitor(), NULL); + if (!window) { + glfwTerminate(); + return -1; + } + + glfwSetKeyCallback(window, key); + + glfwMakeContextCurrent(window); +#ifdef NANOVG_GLEW + glewExperimental = GL_TRUE; + if(glewInit() != GLEW_OK) { + printf("Could not init glew.\n"); + return -1; + } + // GLEW generates GL error because it calls glGetString(GL_EXTENSIONS), we'll consume it here. + glGetError(); +#endif + +#ifdef DEMO_MSAA + vg = nvgCreateGL3(NVG_STENCIL_STROKES | NVG_DEBUG); +#else + vg = nvgCreateGL3(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG); +#endif + if (vg == NULL) { + printf("Could not init nanovg.\n"); + return -1; + } + + if (loadDemoData(vg, &data) == -1) + return -1; + + glfwSwapInterval(0); + + initGPUTimer(&gpuTimer); + + glfwSetTime(0); + prevt = glfwGetTime(); + + while (!glfwWindowShouldClose(window)) + { + double mx, my, t, dt; + int winWidth, winHeight; + int fbWidth, fbHeight; + float pxRatio; + float gpuTimes[3]; + int i, n; + + t = glfwGetTime(); + dt = t - prevt; + prevt = t; + + startGPUTimer(&gpuTimer); + + glfwGetCursorPos(window, &mx, &my); + glfwGetWindowSize(window, &winWidth, &winHeight); + glfwGetFramebufferSize(window, &fbWidth, &fbHeight); + // Calculate pixel ration for hi-dpi devices. + pxRatio = (float)fbWidth / (float)winWidth; + + // Update and render + glViewport(0, 0, fbWidth, fbHeight); + if (premult) + glClearColor(0,0,0,0); + else + glClearColor(0.3f, 0.3f, 0.32f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); + + nvgBeginFrame(vg, winWidth, winHeight, pxRatio); + + renderDemo(vg, mx,my, winWidth,winHeight, t, blowup, &data); + + renderGraph(vg, 5,5, &fps); + renderGraph(vg, 5+200+5,5, &cpuGraph); + if (gpuTimer.supported) + renderGraph(vg, 5+200+5+200+5,5, &gpuGraph); + + nvgEndFrame(vg); + + // Measure the CPU time taken excluding swap buffers (as the swap may wait for GPU) + cpuTime = glfwGetTime() - t; + + updateGraph(&fps, dt); + updateGraph(&cpuGraph, cpuTime); + + // We may get multiple results. + n = stopGPUTimer(&gpuTimer, gpuTimes, 3); + for (i = 0; i < n; i++) + updateGraph(&gpuGraph, gpuTimes[i]); + + if (screenshot) { + screenshot = 0; + saveScreenShot(fbWidth, fbHeight, premult, "dump.png"); + } + + glfwSwapBuffers(window); + glfwPollEvents(); + } + + freeDemoData(vg, &data); + + nvgDeleteGL3(vg); + + printf("Average Frame Time: %.2f ms\n", getGraphAverage(&fps) * 1000.0f); + printf(" CPU Time: %.2f ms\n", getGraphAverage(&cpuGraph) * 1000.0f); + printf(" GPU Time: %.2f ms\n", getGraphAverage(&gpuGraph) * 1000.0f); + + glfwTerminate(); + return 0; +} |