void ssgVtxTableShadow::draw_geometry () { int num_colours = getNumColours () ; int num_normals = getNumNormals () ; int num_vertices = getNumVertices () ; int num_texcoords = getNumTexCoords () ; sgVec3 *vx = (sgVec3 *) vertices -> get(0) ; sgVec3 *nm = (sgVec3 *) normals -> get(0) ; sgVec2 *tx = (sgVec2 *) texcoords -> get(0) ; sgVec4 *cl = (sgVec4 *) colours -> get(0) ; glDepthMask(GL_FALSE); glPolygonOffset(-15.0f, -20.0f); glEnable(GL_POLYGON_OFFSET_FILL); //glEnable(GL_CULL_FACE); glBegin ( gltype ) ; if ( num_colours == 0 ) glColor4f ( 1.0f, 1.0f, 1.0f, 1.0f ) ; if ( num_colours == 1 ) glColor4fv ( cl [ 0 ] ) ; if ( num_normals == 1 ) glNormal3fv ( nm [ 0 ] ) ; for ( int i = 0 ; i < num_vertices ; i++ ) { if ( num_colours > 1 ) glColor4fv ( cl [ i ] ) ; if ( num_normals > 1 ) glNormal3fv ( nm [ i ] ) ; if ( num_texcoords > 1 ) glTexCoord2fv ( tx [ i ] ) ; glVertex3fv ( vx [ i ] ) ; } glEnd () ; glDisable(GL_POLYGON_OFFSET_FILL); glDepthMask(GL_TRUE); }
// @todo remove ... or just remove this complete class void VertexData::debugDraw(int drawMode) { #if ROXLU_GL_MODE != ROXLU_GL_STRICT glPushAttrib(GL_ALL_ATTRIB_BITS); glDisable(GL_TEXTURE_2D); glUseProgram(0); glEnable(GL_DEPTH_TEST); // we adjust the size of the normals lines dynamically float line_length = 0.2; if(vertices.size() > 2) { float length = (vertices[1] - vertices[2]).length(); if(length >= 3) { line_length = 3.2; } } float colors[4][3] = { {0.88,0.25,0.11} ,{0.6,0.78,0.212} ,{0.2,0.65,0.698} ,{0.94,0.72,0.29} }; // draw using indices if(getNumTriangles() > 0) { // triangles (fills) Triangle tri; glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glColor3f(0.8,0.8,0.8); glBegin(GL_TRIANGLES); for(int i = 0; i < triangles.size(); ++i) { tri = triangles[i]; glVertex3fv(vertices[tri.va].getPtr()); glVertex3fv(vertices[tri.vb].getPtr()); glVertex3fv(vertices[tri.vc].getPtr()); } glEnd(); // triangles lines. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glColor3f(0.1,0.1,0.1); glBegin(GL_TRIANGLES); for(int i = 0; i < triangles.size(); ++i) { tri = triangles[i]; glVertex3fv(vertices[tri.va].getPtr()); glVertex3fv(vertices[tri.vb].getPtr()); glVertex3fv(vertices[tri.vc].getPtr()); } glEnd(); // normals, tangents and binormals bool draw_normals= true; bool draw_tangents = true; bool draw_binormals = true; float s = 0.2; glBegin(GL_LINES); for(int i = 0; i < triangles.size(); ++i) { tri = triangles[i]; // normal - a if(draw_normals && tri.na) { glColor3f(0,1,1); glVertex3fv(vertices[tri.va].getPtr()); glVertex3fv((vertices[tri.va]+normals[tri.na]*s).getPtr()); } // tangent - a if(draw_tangents && tri.ta) { glColor3f(1,0,0); glVertex3fv(vertices[tri.va].getPtr()); glVertex3fv((vertices[tri.va]+(tangents[tri.ta]*s)).getPtr()); } // binormal - a if(draw_binormals && tri.ba) { glColor3f(0,1,0); glVertex3fv(vertices[tri.va].getPtr()); glVertex3fv((vertices[tri.va]+(binormals[tri.ba]*s)).getPtr()); } // normal - b if(draw_normals && tri.nb) { glColor3f(0,1,1); glVertex3fv(vertices[tri.vb].getPtr()); glVertex3fv((vertices[tri.vb]+normals[tri.nb]*s).getPtr()); } // tangent - b if(draw_tangents && tri.tb) { glColor3f(1,0,0); glVertex3fv(vertices[tri.vb].getPtr()); glVertex3fv((vertices[tri.vb]+(tangents[tri.tb]*s)).getPtr()); } // binormal - b if(draw_binormals && tri.bb) { glColor3f(0,1,0); glVertex3fv(vertices[tri.vb].getPtr()); glVertex3fv((vertices[tri.vb]+(binormals[tri.bb]*s)).getPtr()); } // normal - c if(draw_normals && tri.nc) { glColor3f(0,1,1); glVertex3fv(vertices[tri.vc].getPtr()); glVertex3fv((vertices[tri.vc]+normals[tri.nc]*s).getPtr()); } // tangent - c if(draw_tangents && tri.tc) { glColor3f(1,0,0); glVertex3fv(vertices[tri.vc].getPtr()); glVertex3fv((vertices[tri.vc]+(tangents[tri.tc]*s)).getPtr()); } // binormal - c if(draw_binormals && tri.bc) { glColor3f(0,1,0); glVertex3fv(vertices[tri.vc].getPtr()); glVertex3fv((vertices[tri.vc]+(binormals[tri.bc]*s)).getPtr()); } } glEnd(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } else if(getNumIndices() > 0) { if(getNumTexCoords() > 0) { int len = indices.size(); glBegin(drawMode); for(int i = 0; i < len; ++i) { glTexCoord2fv(texcoords[indices[i]].getPtr()); glVertex3fv(vertices[indices[i]].getPtr()); } glEnd(); } else { int len = indices.size(); int mod = (drawMode == GL_QUADS) ? 4 : 3; Vec4 colors[4]; colors[0].set(1,0,0, 0.8); colors[1].set(0,1,0, 0.8); colors[2].set(0,0,1, 0.8); colors[3].set(1,1,0, 0.8); glBegin(drawMode); for(int i = 0; i < len; ++i) { glColor4fv(colors[i%mod].getPtr()); glVertex3fv(vertices[indices[i]].getPtr()); } glEnd(); if(normals.size() > 0) { glBegin(GL_LINES); for(int i = 0; i < len; ++i) { int dx = indices[i]; //printf("%d <--\n", dx); Vec3 pos = vertices[dx]; Vec3 norm = normals[dx]; Vec3 end = pos + (norm.scale(line_length*2)); glColor4f(1.0f,0.0f,0.4f,1.0f); glColor4f(0.98, 0.92, 0.75, 0.6); glVertex3fv(pos.getPtr()); glColor4f(1.0f, 0.0f,1.0f,1.0f); glColor3f(0.98, 0.92, 0.75); glColor4f(0.98, 0.92, 0.75,0.6); glVertex3fv(end.getPtr()); } glEnd(); } } } // w/o indices else { glColor4f(1,1,1,1); glUseProgram(0); glDisable(GL_TEXTURE_2D); glDisable(GL_BLEND); bool draw_texture = false; bool draw_tangents = true; bool draw_normals = true; bool draw_binormals = true; if(draw_texture && getNumTexCoords() > 0) { glColor3f(0.98, 0.92, 0.75); // yellowish int len = vertices.size(); glEnable(GL_TEXTURE_2D); glBegin(drawMode); for(int i = 0; i < len; ++i) { int parts = 3; if(drawMode == GL_QUADS) { parts = 4; } glColor3fv(colors[i%parts]); glTexCoord2fv(texcoords[i].getPtr()); glVertex3fv(vertices[i].getPtr()); } glEnd(); glDisable(GL_TEXTURE_2D); } else { // shape //glColor3f(0.98, 0.92, 0.75); // yellowish glColor3f(0.8,0.8,0.8); glBegin(drawMode); vector<Vec3>::iterator it = vertices.begin(); float len = vertices.size(); while(it != vertices.end()) { glVertex3fv((*it).getPtr()); ++it; } glEnd(); } // normals. int len = normals.size(); if(draw_normals && len == vertices.size()) { glColor3f(0,1,1); glLineWidth(3.0); glBegin(GL_LINES); for(int i = 0; i < len; ++i) { Vec3 pos = vertices[i]; Vec3 norm = normals[i]; norm.normalize(); Vec3 end = pos + (norm.scale(line_length)); glVertex3fv(pos.getPtr()); glVertex3fv(end.getPtr()); } glEnd(); } // tangents if(draw_tangents && tangents.size() > 0) { glLineWidth(3.0); glColor3f(1.0f,0.0f,0.0f); int len = tangents.size(); glBegin(GL_LINES); for(int i = 0; i < len; ++i) { Vec3 pos = vertices[i]; Vec3 norm = tangents[i]; norm.normalize(); Vec3 end = pos + (norm.scale(line_length)); glVertex3fv(pos.getPtr()); glVertex3fv(end.getPtr()); }; glEnd(); } // binormals if(draw_binormals && binormals.size() > 0) { glLineWidth(3.0); glColor4f(0.0f,1.0f,0.0f,1.0f); int len = tangents.size(); glBegin(GL_LINES); for(int i = 0; i < len; ++i) { Vec3 pos = vertices[i]; Vec3 binorm = binormals[i].normalize(); Vec3 end = pos + (binorm.scale(line_length)); glVertex3fv(pos.getPtr()); glVertex3fv(end.getPtr()); }; glEnd(); } // draw lines glPolygonOffset(-1.0f, -1.0f); glEnable(GL_POLYGON_OFFSET_LINE); glEnable(GL_LINE_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLineWidth(0.5f); glDisable(GL_TEXTURE_2D); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glColor3f(0.4,0.4,0.4); glBegin(drawMode); for(int i = 0; i < vertices.size(); ++i) { glVertex3fv(vertices[i].getPtr()); } glEnd(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_TEXTURE_2D); glDisable(GL_POLYGON_OFFSET_LINE); glLineWidth(1.0f); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); glColor3f(1,1,1); } // if(!blend_enabled) { // glDisable(GL_BLEND); // } glPopAttrib(); #endif // roxlu_gl_variant }