diff options
Diffstat (limited to 'libs/nanovg/example/example_gles3.c')
-rw-r--r-- | libs/nanovg/example/example_gles3.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/libs/nanovg/example/example_gles3.c b/libs/nanovg/example/example_gles3.c new file mode 100644 index 0000000..4a6084c --- /dev/null +++ b/libs/nanovg/example/example_gles3.c @@ -0,0 +1,155 @@ +// +// 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> +#define GLFW_INCLUDE_ES3 +#define GLFW_INCLUDE_GLEXT +#include <GLFW/glfw3.h> +#include "nanovg.h" +#define NANOVG_GLES3_IMPLEMENTATION +#include "nanovg_gl.h" +#include "nanovg_gl_utils.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; + PerfGraph fps; + double prevt = 0; + + if (!glfwInit()) { + printf("Failed to init GLFW."); + return -1; + } + + initGraph(&fps, GRAPH_RENDER_FPS, "Frame Time"); + + glfwSetErrorCallback(errorcb); + + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + + window = glfwCreateWindow(1000, 600, "NanoVG", NULL, NULL); +// window = glfwCreateWindow(1000, 600, "NanoVG", glfwGetPrimaryMonitor(), NULL); + if (!window) { + glfwTerminate(); + return -1; + } + + glfwSetKeyCallback(window, key); + + glfwMakeContextCurrent(window); + + vg = nvgCreateGLES3(NVG_ANTIALIAS | NVG_STENCIL_STROKES | NVG_DEBUG); + if (vg == NULL) { + printf("Could not init nanovg.\n"); + return -1; + } + + if (loadDemoData(vg, &data) == -1) + return -1; + + glfwSwapInterval(0); + + glfwSetTime(0); + prevt = glfwGetTime(); + + while (!glfwWindowShouldClose(window)) + { + double mx, my, t, dt; + int winWidth, winHeight; + int fbWidth, fbHeight; + float pxRatio; + + t = glfwGetTime(); + dt = t - prevt; + prevt = t; + updateGraph(&fps, dt); + + 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); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + + nvgBeginFrame(vg, winWidth, winHeight, pxRatio); + + renderDemo(vg, mx,my, winWidth,winHeight, t, blowup, &data); + renderGraph(vg, 5,5, &fps); + + nvgEndFrame(vg); + + glEnable(GL_DEPTH_TEST); + + if (screenshot) { + screenshot = 0; + saveScreenShot(fbWidth, fbHeight, premult, "dump.png"); + } + + glfwSwapBuffers(window); + glfwPollEvents(); + } + + freeDemoData(vg, &data); + + nvgDeleteGLES3(vg); + + glfwTerminate(); + return 0; +} |