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);
+