// // Computergraphik I // Prof. Dr. Juergen Doellner // Sommersemester 2001 // // Rahmenprogramm fuer Aufgabenzettel 4 // // Stephan Brumme, 702544 // last changes: May 20, 2001 #include "cgtessellator.h" // Function Makro #if defined(__GNUC__) && !defined(__STRICT_ANSI__) #define FUNC GLvoid(*)(...) #elif defined(_MSC_VER) #define FUNC void(__stdcall*)() #else #define FUNC GLvoid(*)() #endif // GLU tesselator globale Hilfsfunktionen // Fehler abfangen void CALLBACK error(GLenum err) { cerr << gluErrorString(err) << endl; } // Schnitt von Kanten, nimmt keine Änderungen vor void CALLBACK combineCallback(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **dataOut ) { GLdouble* vertex = new GLdouble[3]; vertex[0] = coords[0]; vertex[1] = coords[1]; vertex[2] = coords[2]; *dataOut = vertex; } // stellt Ecke dar void CALLBACK vertexCallback(GLvoid *vertex) { glVertex3dv((GLdouble*)vertex); } // beginnt ein Primitv void CALLBACK beginCallback(GLenum which) { glBegin(which); } // beendet ein Primitiv void CALLBACK endCallback() { glEnd(); } // CGTessellator CGTessellator::CGTessellator() { // Anlegen des TessObj tobj_ = gluNewTess(); gluTessProperty(tobj_, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD); // Datenstruktur initialisieren pos_ = 0; contours_ = 1; contourSize_[0] = 0; } CGTessellator::~CGTessellator() { // Zerstoeren des TessObj gluDeleteTess(tobj_); } // Setze Punkte fuer einen Stern void CGTessellator::defineStar() { // 5 Punkte insgesamt pos_ = 5; // 1 Kontur contours_ = 1; // diese Kontur enthält alle bisher definierten Punkte contourSize_[0] = 5; pts_[0] = Point(150.0, 150.0); pts_[1] = Point(225.0, 300.0); pts_[2] = Point(300.0, 150.0); pts_[3] = Point(150.0, 250.0); pts_[4] = Point(300.0, 250.0); // Stern zeichnen glutPostRedisplay(); } void CGTessellator::onInit() { glClearColor(1, 1, 1, 1); // festlegen der Vertex, Begin, End und Error Callback // Beispiel: Combine Callback, Achtung: FUNC-Cast! gluTessCallback(tobj_, GLU_TESS_COMBINE, (FUNC) &combineCallback); gluTessCallback(tobj_, GLU_TESS_VERTEX, (FUNC) &vertexCallback); gluTessCallback(tobj_, GLU_TESS_BEGIN, (FUNC) &beginCallback); gluTessCallback(tobj_, GLU_TESS_END, (FUNC) &endCallback); gluTessCallback(tobj_, GLU_TESS_ERROR, (FUNC) &error); } void CGTessellator::drawPolygon() { gluTessBeginPolygon(tobj_, NULL); // alle Punkte durchlaufen int nVertexPtr = 0; // alle Polygone for (int nContour = 0; nContour < contours_; nContour++) { gluTessBeginContour(tobj_); // alle Eckpunkte eines Polygons for (int nVertex=0; nVertex