// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2014 Wenzel Jacob // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #ifdef IGL_VIEWER_WITH_NANOGUI #include "TextRenderer.h" #include "TextRenderer_fonts.h" #include #include #include #include #define NANOVG_GL3 #include IGL_INLINE igl::opengl::glfw::TextRenderer::TextRenderer(): ctx(nullptr) {} IGL_INLINE int igl::opengl::glfw::TextRenderer::Init() { using namespace std; #ifdef NDEBUG ctx = nvgCreateGL3(NVG_STENCIL_STROKES | NVG_ANTIALIAS); #else ctx = nvgCreateGL3(NVG_STENCIL_STROKES | NVG_ANTIALIAS | NVG_DEBUG); #endif nvgCreateFontMem(ctx, "sans", igl_roboto_regular_ttf, igl_roboto_regular_ttf_size, 0); return 0; } IGL_INLINE int igl::opengl::glfw::TextRenderer::Shut() { using namespace std; if(ctx) nvgDeleteGL3(ctx); return 0; } IGL_INLINE void igl::opengl::glfw::TextRenderer::BeginDraw( const Eigen::Matrix4f &view, const Eigen::Matrix4f &proj, const Eigen::Vector4f &_viewport, float _object_scale) { using namespace std; viewport = _viewport; proj_matrix = proj; view_matrix = view; object_scale = _object_scale; Eigen::Vector2i mFBSize; Eigen::Vector2i mSize; GLFWwindow* mGLFWWindow = glfwGetCurrentContext(); glfwGetFramebufferSize(mGLFWWindow,&mFBSize[0],&mFBSize[1]); glfwGetWindowSize(mGLFWWindow,&mSize[0],&mSize[1]); glViewport(0,0,mFBSize[0],mFBSize[1]); glClear(GL_STENCIL_BUFFER_BIT); /* Calculate pixel ratio for hi-dpi devices. */ mPixelRatio = (float)mFBSize[0] / (float)mSize[0]; nvgBeginFrame(ctx,mSize[0],mSize[1],mPixelRatio); } IGL_INLINE void igl::opengl::glfw::TextRenderer::EndDraw() { using namespace std; nvgEndFrame(ctx); } IGL_INLINE void igl::opengl::glfw::TextRenderer::DrawText( Eigen::Vector3d pos, Eigen::Vector3d normal, const std::string &text) { using namespace std; pos += normal * 0.005f * object_scale; Eigen::Vector3f coord = igl::project(Eigen::Vector3f(pos(0), pos(1), pos(2)), view_matrix, proj_matrix, viewport); nvgFontSize(ctx, 16*mPixelRatio); nvgFontFace(ctx, "sans"); nvgTextAlign(ctx, NVG_ALIGN_LEFT | NVG_ALIGN_MIDDLE); nvgFillColor(ctx, nvgRGBA(10,10,250,255)); nvgText(ctx, coord[0]/mPixelRatio, (viewport[3] - coord[1])/mPixelRatio, text.c_str(), NULL); } #endif