Beispiel #1
0
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	
}