#ifndef GRIDRENDERER_H #define GRIDRENDERER_H #include "MyNode.h" #include #include enum class GridRendererColorMode { SHOW_NODE_TYPE, SHOW_NODE_IMPORTANCE, }; class GridRenderer { private: // settings GridRendererColorMode colorMode = GridRendererColorMode::SHOW_NODE_IMPORTANCE; bool showEdges = false; struct Color { float r,g,b; Color(float r, float g, float b) : r(r), g(g), b(b) {;} }; Color colors[4] = { Color(0.3, 0.3, 0.3), Color(0,0,1), Color(0,0,1), Color(0,0.65,0) }; public: /** ctor */ GridRenderer() { ; } void setNodeColorMode(const GridRendererColorMode mode) {this->colorMode = mode;} void setShowEdges(const bool show) {this->showEdges = show;} /** render the given grid using GL commands */ void paintGL(Grid* grid) { glDisable(GL_LIGHTING); const float s = 2; if (showEdges) { std::unordered_set used; glBegin(GL_LINES); for (MyNode& n1 : *grid) { glColor3f(0.5, 0.5, 0.5); for (MyNode& n2 : grid->neighbors(n1)) { uint64_t min = std::min(n1.getIdx(), n2.getIdx()); uint64_t max = std::max(n1.getIdx(), n2.getIdx()); uint64_t idx = max << 32 | min; if (used.find(idx) == used.end()) { glVertex3f(n1.x_cm/100.0f, n1.z_cm/100.0f*s, n1.y_cm/100.0f); glVertex3f(n2.x_cm/100.0f, n2.z_cm/100.0f*s, n2.y_cm/100.0f); used.insert(idx); } } } glEnd(); } glPointSize(3.0f); glBegin(GL_POINTS); for (MyNode& n : *grid) { // get the color to use switch(colorMode) { case GridRendererColorMode::SHOW_NODE_TYPE: { const Color c = colors[n.getType()]; glColor3f(c.r, c.g, c.b); break; } case GridRendererColorMode::SHOW_NODE_IMPORTANCE: { const float xx = n.navImportance - 0.6; glColor3f(xx, xx, xx); break; } } glVertex3f(n.x_cm/100.0f, n.z_cm/100.0f*s, n.y_cm/100.0f); } glEnd(); // std::vector vec = lint(); // glPointSize(4.0f); // glBegin(GL_POINTS); // glColor3f(1,0,0); // for (MyNode& n : vec) { // glVertex3f(n.x_cm/100.0f, n.z_cm/100.0f*s, n.y_cm/100.0f); // } // glEnd(); //glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); } // std::vector lint() { // std::vector vec; // lintStair(vec); // return vec; // } // void lintStair(std::vector& vec) { // for (MyNode& n1 : *grid) { // if (n1.getNumNeighbors() <= 5) { vec.push_back(n1);} // } // } }; #endif // GRIDRENDERER_H