Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- src/example3.cpp -- C++ version of an example application that shows
- how to use nanogui in an application with an already created and managed
- glfw context.
- NanoGUI was developed by Wenzel Jakob <wenzel.jakob@epfl.ch>.
- The widget drawing code is based on the NanoVG demo application
- by Mikko Mononen.
- All rights reserved. Use of this source code is governed by a
- BSD-style license that can be found in the LICENSE.txt file.
- */
- // GLFW
- //
- #if defined(NANOGUI_GLAD)
- #if defined(NANOGUI_SHARED) && !defined(GLAD_GLAPI_EXPORT)
- #define GLAD_GLAPI_EXPORT
- #endif
- #include <glad/glad.h>
- #else
- #if defined(__APPLE__)
- #define GLFW_INCLUDE_GLCOREARB
- #else
- #define GL_GLEXT_PROTOTYPES
- #endif
- #endif
- #include <GLFW/glfw3.h>
- #include <nanogui/nanogui.h>
- #include <iostream>
- using namespace nanogui;
- enum test_enum {
- Item1 = 0,
- Item2,
- Item3
- };
- bool bvar = true;
- int ivar = 12345678;
- double dvar = 3.1415926;
- float fvar = (float)dvar;
- std::string strval = "A string";
- test_enum enumval = Item2;
- Color colval(0.5f, 0.5f, 0.7f, 1.f);
- Screen *screen = nullptr;
- int main(int /* argc */, char ** /* argv */) {
- glfwInit();
- glfwSetTime(0);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
- glfwWindowHint(GLFW_SAMPLES, 0);
- glfwWindowHint(GLFW_RED_BITS, 8);
- glfwWindowHint(GLFW_GREEN_BITS, 8);
- glfwWindowHint(GLFW_BLUE_BITS, 8);
- glfwWindowHint(GLFW_ALPHA_BITS, 8);
- glfwWindowHint(GLFW_STENCIL_BITS, 8);
- glfwWindowHint(GLFW_DEPTH_BITS, 24);
- glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
- // Create a GLFWwindow object
- GLFWwindow* window = glfwCreateWindow(800, 800, "example3", nullptr, nullptr);
- if (window == nullptr) {
- std::cout << "Failed to create GLFW window" << std::endl;
- glfwTerminate();
- return -1;
- }
- glfwMakeContextCurrent(window);
- #if defined(NANOGUI_GLAD)
- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
- throw std::runtime_error("Could not initialize GLAD!");
- glGetError(); // pull and ignore unhandled errors like GL_INVALID_ENUM
- #endif
- glClearColor(0.2f, 0.25f, 0.3f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- // Create a nanogui screen and pass the glfw pointer to initialize
- screen = new Screen();
- screen->initialize(window, true);
- int width, height;
- glfwGetFramebufferSize(window, &width, &height);
- glViewport(0, 0, width, height);
- glfwSwapInterval(0);
- glfwSwapBuffers(window);
- // Create nanogui gui
- bool enabled = true;
- FormHelper *gui = new FormHelper(screen);
- ref<Window> nanoguiWindow = gui->addWindow(Eigen::Vector2i(10, 10), "Form helper example");
- gui->addGroup("Basic types");
- gui->addVariable("bool", bvar)->setTooltip("Test tooltip.");
- gui->addVariable("string", strval);
- gui->addGroup("Validating fields");
- gui->addVariable("int", ivar)->setSpinnable(true);
- gui->addVariable("float", fvar)->setTooltip("Test.");
- gui->addVariable("double", dvar)->setSpinnable(true);
- gui->addGroup("Complex types");
- gui->addVariable("Enumeration", enumval, enabled)->setItems({ "Item 1", "Item 2", "Item 3" });
- gui->addVariable("Color", colval)
- ->setFinalCallback([](const Color &c) {
- std::cout << "ColorPicker Final Callback: ["
- << c.r() << ", "
- << c.g() << ", "
- << c.b() << ", "
- << c.w() << "]" << std::endl;
- });
- gui->addGroup("Other widgets");
- gui->addButton("A button", []() { std::cout << "Button pressed." << std::endl; })->setTooltip("Testing a much longer tooltip, that will wrap around to new lines multiple times.");;
- screen->setVisible(true);
- screen->performLayout();
- nanoguiWindow->center();
- glfwSetCursorPosCallback(window,
- [](GLFWwindow *, double x, double y) {
- screen->cursorPosCallbackEvent(x, y);
- }
- );
- glfwSetMouseButtonCallback(window,
- [](GLFWwindow *, int button, int action, int modifiers) {
- screen->mouseButtonCallbackEvent(button, action, modifiers);
- }
- );
- glfwSetKeyCallback(window,
- [](GLFWwindow *, int key, int scancode, int action, int mods) {
- screen->keyCallbackEvent(key, scancode, action, mods);
- }
- );
- glfwSetCharCallback(window,
- [](GLFWwindow *, unsigned int codepoint) {
- screen->charCallbackEvent(codepoint);
- }
- );
- glfwSetDropCallback(window,
- [](GLFWwindow *, int count, const char **filenames) {
- screen->dropCallbackEvent(count, filenames);
- }
- );
- glfwSetScrollCallback(window,
- [](GLFWwindow *, double x, double y) {
- screen->scrollCallbackEvent(x, y);
- }
- );
- glfwSetFramebufferSizeCallback(window,
- [](GLFWwindow *, int width, int height) {
- screen->resizeCallbackEvent(width, height);
- }
- );
- // Game loop
- while (!glfwWindowShouldClose(window)) {
- // Check if any events have been activated (key pressed, mouse moved etc.) and call corresponding response functions
- glfwPollEvents();
- glClearColor(0.2f, 0.25f, 0.3f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT);
- // Draw nanogui
- screen->drawContents();
- screen->drawWidgets();
- glfwSwapBuffers(window);
- }
- // Terminate GLFW, clearing any resources allocated by GLFW.
- glfwTerminate();
- return 0;
- }
Add Comment
Please, Sign In to add comment