glnetwork.h 1.78 KB
#ifndef STIM_GLNETWORK_H
#define STIM_GLNETWORK_H

#include <GL/glew.h>
#include <GL/glut.h>
#include "network.h"
#include <stim/math/vector.h>
#include <list>
#include <ANN/ANN.h>
#include "fiber.h"


namespace stim
{
template <typename T>
class glnetwork : public virtual network<T>
{
private:
	using stim::network<T>::E;

	GLuint dList;

	void init()
	{
		if(glIsList(dList))
			glDeleteLists(dList, 1);
		dList = glGenLists(1);
		glListBase(dList);
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity;
		glMatrixMode(GL_MODELVIEW);
		glLoadIdentity;
	}

	void
	Create(GLenum mode)
	{
		glNewList(dList, GL_COMPILE);
		glLineWidth(3.5);
		for(int i = 0; i < E.size(); i++)
		{
			if(mode == GL_SELECT)
			{
//				glLineWidth(3.5);
				glLoadName(i);
			}
			else{
//				glLineWidth(1.0+1.0*i);
			}
			glColor3f(0.0, 1.0-0.05*i, i*0.05);
			std::vector<stim::vec<T> > line = getEdgeCenterLine(i);
			glBegin(GL_LINE_STRIP);
			for(int j = 0; j < line.size(); j++)
			{
				glVertex3f(line[j][0],
					line[j][1],
					line[j][2]);
			}
			glEnd();
		}
		glEndList();
//		CHECK_OPENGL_ERROR
	}
	
public:
	using stim::network<T>::sizeE;
	using stim::network<T>::getEdgeCenterLine;
	glnetwork()
	{

	}
	
	void
	createFromSelf(GLenum mode = GL_RENDER)
	{
		init();
		Create(mode);
	}

	void
	Render()
	{
		glCallList(dList);
//		CHECK_OPENGL_ERROR
	}

	void
	RenderLine(std::vector<stim::vec<T> > l)
	{
                glColor3f(0.5, 1.0, 0.5);
                glLineWidth(3.0);
                glBegin(GL_LINE_STRIP);
                for(int j = 0; j < l.size(); j++){
                        glVertex3f(
                                l[j][0],
                                l[j][1],
                                l[j][2]
                                );
                }
                glEnd();
	}
	
};
}

#endif