#ifndef STIM_GL_NETWORK #define STIM_GL_NETWORK #include #include namespace stim{ template class gl_network : public stim::network{ protected: using stim::network::E; using stim::network::V; GLuint dlist; public: /// Default constructor gl_network() : stim::network(){ dlist = 0; } /// Constructor creates a gl_network from a stim::network gl_network(stim::network N) : stim::network(N){ dlist = 0; } /// Fills the parameters with the minimum and maximum spatial positions in the network, /// specifying a bounding box for the network geometry aaboundingbox boundingbox(){ aaboundingbox bb; //create a bounding box //loop through every edge for(unsigned e = 0; e < E.size(); e++){ //loop through every point for(unsigned p = 0; p < E[e].size(); p++) bb.expand(E[e][p]); //expand the bounding box to include the point } return bb; //return the bounding box } /// Render the network centerline as a series of line strips. /// @param m specifies the magnitude value used as the vertex weight (radius, error, etc.) void glCenterline(unsigned m = 0){ if(!glIsList(dlist)){ //if dlist isn't a display list, create it dlist = glGenLists(1); //generate a display list glNewList(dlist, GL_COMPILE); //start a new display list for(unsigned e = 0; e < E.size(); e++){ //for each edge in the network glBegin(GL_LINE_STRIP); for(unsigned p = 0; p < E[e].size(); p++){ //for each point on that edge glVertex3f(E[e][p][0], E[e][p][1], E[e][p][2]); //set the vertex position based on the current point glTexCoord1f(E[e].m(p, m)); //set the texture coordinate based on the specified magnitude index } glEnd(); } glEndList(); //end the display list } glCallList(dlist); // render the display list } }; //end stim::gl_network class }; //end stim namespace #endif