1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "gpuhelper.h" 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "icosphere.h" 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <GL/glu.h> 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// PLEASE don't look at this old code... ;) 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <fstream> 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <algorithm> 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathGpuHelper gpu; 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathGpuHelper::GpuHelper() 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mVpWidth = mVpHeight = 0; 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mCurrentMatrixTarget = 0; 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mInitialized = false; 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathGpuHelper::~GpuHelper() 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::pushProjectionMode2D(ProjectionMode2D pm) 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // switch to 2D projection 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath pushMatrix(Matrix4f::Identity(),GL_PROJECTION); 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(pm==PM_Normalized) 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //glOrtho(-1., 1., -1., 1., 0., 1.); 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if(pm==PM_Viewport) 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath GLint vp[4]; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glGetIntegerv(GL_VIEWPORT, vp); 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glOrtho(0., vp[2], 0., vp[3], -1., 1.); 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath pushMatrix(Matrix4f::Identity(),GL_MODELVIEW); 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::popProjectionMode2D(void) 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath popMatrix(GL_PROJECTION); 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath popMatrix(GL_MODELVIEW); 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::drawVector(const Vector3f& position, const Vector3f& vec, const Color& color, float aspect /* = 50.*/) 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static GLUquadricObj *cylindre = gluNewQuadric(); 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glColor4fv(color.data()); 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath float length = vec.norm(); 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath pushMatrix(GL_MODELVIEW); 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glTranslatef(position.x(), position.y(), position.z()); 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Vector3f ax = Matrix3f::Identity().col(2).cross(vec); 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ax.normalize(); 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Vector3f tmp = vec; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath tmp.normalize(); 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath float angle = 180.f/M_PI * acos(tmp.z()); 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (angle>1e-3) 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glRotatef(angle, ax.x(), ax.y(), ax.z()); 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath gluCylinder(cylindre, length/aspect, length/aspect, 0.8*length, 10, 10); 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glTranslatef(0.0,0.0,0.8*length); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath gluCylinder(cylindre, 2.0*length/aspect, 0.0, 0.2*length, 10, 10); 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath popMatrix(GL_MODELVIEW); 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::drawVectorBox(const Vector3f& position, const Vector3f& vec, const Color& color, float aspect) 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static GLUquadricObj *cylindre = gluNewQuadric(); 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glColor4fv(color.data()); 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath float length = vec.norm(); 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath pushMatrix(GL_MODELVIEW); 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glTranslatef(position.x(), position.y(), position.z()); 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Vector3f ax = Matrix3f::Identity().col(2).cross(vec); 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ax.normalize(); 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Vector3f tmp = vec; 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath tmp.normalize(); 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath float angle = 180.f/M_PI * acos(tmp.z()); 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (angle>1e-3) 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glRotatef(angle, ax.x(), ax.y(), ax.z()); 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath gluCylinder(cylindre, length/aspect, length/aspect, 0.8*length, 10, 10); 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glTranslatef(0.0,0.0,0.8*length); 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glScalef(4.0*length/aspect,4.0*length/aspect,4.0*length/aspect); 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath drawUnitCube(); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath popMatrix(GL_MODELVIEW); 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::drawUnitCube(void) 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static float vertices[][3] = { 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {-0.5,-0.5,-0.5}, 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 0.5,-0.5,-0.5}, 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {-0.5, 0.5,-0.5}, 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 0.5, 0.5,-0.5}, 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {-0.5,-0.5, 0.5}, 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 0.5,-0.5, 0.5}, 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {-0.5, 0.5, 0.5}, 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 0.5, 0.5, 0.5}}; 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glBegin(GL_QUADS); 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glNormal3f(0,0,-1); glVertex3fv(vertices[0]); glVertex3fv(vertices[2]); glVertex3fv(vertices[3]); glVertex3fv(vertices[1]); 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glNormal3f(0,0, 1); glVertex3fv(vertices[4]); glVertex3fv(vertices[5]); glVertex3fv(vertices[7]); glVertex3fv(vertices[6]); 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glNormal3f(0,-1,0); glVertex3fv(vertices[0]); glVertex3fv(vertices[1]); glVertex3fv(vertices[5]); glVertex3fv(vertices[4]); 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glNormal3f(0, 1,0); glVertex3fv(vertices[2]); glVertex3fv(vertices[6]); glVertex3fv(vertices[7]); glVertex3fv(vertices[3]); 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glNormal3f(-1,0,0); glVertex3fv(vertices[0]); glVertex3fv(vertices[4]); glVertex3fv(vertices[6]); glVertex3fv(vertices[2]); 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glNormal3f( 1,0,0); glVertex3fv(vertices[1]); glVertex3fv(vertices[3]); glVertex3fv(vertices[7]); glVertex3fv(vertices[5]); 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath glEnd(); 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid GpuHelper::drawUnitSphere(int level) 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static IcoSphere sphere; 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath sphere.draw(level); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 127