#include "GlutRender.hpp" #include #include #include GlutRender& GlutRender::get_instance() { static GlutRender instance; return instance; } GlutRender::GlutRender() { } void GlutRender::init(int* argc, char** argv, int wid, int hei, const char* win_name) { glutInit(argc, argv); glutInitDisplayMode(GLUT_DOUBLE); glutInitWindowSize(wid, hei); glutCreateWindow(win_name); glutDisplayFunc(display_handle); glutReshapeFunc(reshape_handle); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Background color glClearDepth(1.0f); // Set background depth to farthest glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glShadeModel(GL_SMOOTH); // Enable smooth shading glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } void GlutRender::cleanup() { } void GlutRender::add_mesh(Mesh* mesh) { meshes.insert(mesh); } void GlutRender::remove_mesh(Mesh* mesh) { meshes.erase(mesh); } void GlutRender::run() { glutMainLoop(); } void GlutRender::reshape(int wid, int hei) { if (hei == 0) hei = 1; GLfloat aspect = (GLfloat)wid / (GLfloat)hei; glViewport(0, 0, wid, hei); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // Enable perspective projection with fovy, aspect, zNear and zFar gluPerspective(45.0f, aspect, 0.1f, 100.0f); } void GlutRender::display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); // Camera position and orientation glLoadIdentity(); glTranslatef(0., 0., -6.); for(Mesh* mesh: meshes) { const Point& mesh_center = mesh->get_center(); const std::vector& points = mesh->get_vertices(); glBegin(GL_TRIANGLES); for(const Face& face: mesh->get_faces()) { Point p0 = face.pt(0, points) + mesh_center, p1 = face.pt(1, points) + mesh_center, p2 = face.pt(2, points) + mesh_center; glColor3f(1.0f, 1.0f, 0.0f); glVertex3f(p0[0], p0[1], p0[2]); glVertex3f(p1[0], p1[1], p1[2]); glVertex3f(p2[0], p2[1], p2[2]); } glEnd(); } glutSwapBuffers(); } void GlutRender::reshape_handle(int wid, int hei) { get_instance().reshape(wid, hei); } void GlutRender::display_handle() { get_instance().display(); }