Mercurial > hg > ccmieditor
diff native/PhantomOmni/GraphicManager.cpp @ 3:9e67171477bc
PHANTOM Omni Heptic device release
author | Fiore Martin <fiore@eecs.qmul.ac.uk> |
---|---|
date | Wed, 25 Apr 2012 17:09:09 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/native/PhantomOmni/GraphicManager.cpp Wed Apr 25 17:09:09 2012 +0100 @@ -0,0 +1,143 @@ +#include "GraphicManager.h" + +void GraphicManager::init(void){ + + // Enable depth buffering for hidden surface removal. + glDepthFunc(GL_LEQUAL); + glEnable(GL_DEPTH_TEST); + + // Cull back faces. + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + // Setup other misc features. + glEnable(GL_LIGHTING); + glEnable(GL_NORMALIZE); + glShadeModel(GL_SMOOTH); + + // Setup lighting model. + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE); + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_model_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); + glLightfv(GL_LIGHT0, GL_POSITION, light0_direction); + glEnable(GL_LIGHT0); + + +} + +void GraphicManager::draw(void){ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + // Draw 3D cursor at haptic device position. + drawCursor(); + + glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT); + glEnable(GL_COLOR_MATERIAL); + + // Draw each of the nodes as lit sphere. + int numNodes = collectionsManager->getNodesNum(); + GLdouble dPointSize; + + for ( int i = 0; i < numNodes; i++){ + dPointSize = nodeSize; + glColor3dv(nodeColor); + + glPushMatrix(); + CollectionsManager::NodeData & nd = collectionsManager->getNodeData(i); + glTranslated(nd.x,nd.y, 0); + double dPointScale = dPointSize * gWorldScale; + glScaled(dPointScale, dPointScale, dPointScale); + /* draw shpere */ + glutSolidSphere(0.5, 10, 10); + glPopMatrix(); + } + + //draw edges + glColor3f(1.0, 0.0, 0.0); + glLineWidth(2.0); + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_LIGHTING); + glEnable(GL_COLOR_MATERIAL); + + int numEdges = collectionsManager->getEdgesNum(); + for(int i = 0; i < numEdges; i++){ + CollectionsManager::EdgeData & ed = collectionsManager->getEdgeData(i); + glPushAttrib(GL_ENABLE_BIT); + glLineStipple(1, ed.stipplePattern); + glEnable(GL_LINE_STIPPLE); + glBegin(GL_LINES); + for(unsigned int j = 0; j < ed.getSize(); j++){ + for(unsigned int k = j; k < ed.getSize(); k++){ + if(ed.adjMatrix[j][k]){ + glVertex3d(ed.x[j],ed.y[j],0); + glVertex3d(ed.x[k],ed.y[k],0); + } + } + } + glEnd(); + glPopAttrib(); + } + glPopAttrib(); + glPopMatrix(); + +} + +void GraphicManager::drawCursor(){ + HLdouble proxyxform[16]; + + GLUquadricObj *qobj = 0; + + glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT | GL_LIGHTING_BIT); + glPushMatrix(); + if (!gCursorDisplayList){ + gCursorDisplayList = glGenLists(1); + glNewList(gCursorDisplayList, GL_COMPILE); + qobj = gluNewQuadric(); + + gluCylinder(qobj, 0.0, kCursorRadius, kCursorHeight, + kCursorTess, kCursorTess); + glTranslated(0.0, 0.0, kCursorHeight); + gluCylinder(qobj, kCursorRadius, 0.0, kCursorHeight / 5.0, + kCursorTess, kCursorTess); + + gluDeleteQuadric(qobj); + glEndList(); + } + + // Get the proxy transform in world coordinates. + hlGetDoublev(HL_PROXY_TRANSFORM, proxyxform); + glMultMatrixd(proxyxform); + + // Apply the local cursor scale factor. + glScaled(gCursorScale, gCursorScale, gCursorScale); + + glEnable(GL_COLOR_MATERIAL); + + if(hapticManager->isDraggingNode()){ + glColor3dv(nodeColor); + glutSolidSphere(0.25, 10, 10); + }else if(hapticManager->isDraggingEdge()){ + glColor3dv(edgeColor); + glutSolidSphere(0.12,10,10); + } + glColor3f(0.0, 0.5, 1.0); + glCallList(gCursorDisplayList); + + glPopMatrix(); + glPopAttrib(); +} + +const double GraphicManager::kCursorRadius = 0.5; +const double GraphicManager::kCursorHeight = 1.5; +const int GraphicManager::kCursorTess = 15; + +const GLfloat GraphicManager::light_model_ambient[] = {0.3f, 0.3f, 0.3f, 1.0f}; +const GLfloat GraphicManager::light0_diffuse[] = {0.9f, 0.9f, 0.9f, 0.9f}; +const GLfloat GraphicManager::light0_direction[] = {0.0f, -0.4f, 1.0f, 0.0f}; + + +const double GraphicManager::nodeSize = 10; + +const hduVector3Dd GraphicManager::nodeColor(1.0, 1.0, 1.0); +const hduVector3Dd GraphicManager::edgeColor(1.0,0.0,0.0); +