示例#1
0
文件: main.c 项目: ags/uni_coursework
void display() {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();

  /* camera transform */
	glTranslatef(0, 0, -camera.zoom);
	glRotatef(camera.rot.x, 1, 0, 0);
	glRotatef(camera.rot.y, 0, 1, 0);

  drawAxes(0.5);

  /* set the light position  */
  if(options[OPT_LIGHTING]) {
    glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
    glMaterialf(GL_FRONT, GL_SHININESS, shininess);
    glEnable(GL_LIGHTING);
  } else {
    glDisable(GL_LIGHTING);
  }

  if(options[OPT_SMOOTH_SHADE])
    glShadeModel(GL_SMOOTH);
  else
    glShadeModel(GL_FLAT);

  if(options[OPT_DRAW_NORMALS])
    drawNormals();
  
  if(options[OPT_SHADER]) {
    glUseProgram(currentShader);
    if (currentShader != 0 && (loc = glGetUniformLocation(currentShader, "GeomGen")) != -1)
      glUniform1i(loc, options[OPT_SHADER_GEN]);
  }

  if(options[OPT_WIREFRAME])
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  else
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

  if(options[OPT_BUMP_MAP]) {
    glUseProgram(bumpShader);
    if (bumpShader != 0 && (loc = glGetUniformLocation(bumpShader, "LightPosition")) != -1)
      glUniform3fv(loc, 1, lightPos);
    if (bumpShader != 0 && (loc = glGetUniformLocation(bumpShader, "SurfaceColor")) != -1)
      glUniform3f(loc, 1.0, 0.0, 0.0);
    if (bumpShader != 0 && (loc = glGetUniformLocation(bumpShader, "BumpDensity")) != -1)
      glUniform1f(loc, 4);
    if (bumpShader != 0 && (loc = glGetUniformLocation(bumpShader, "BumpSize")) != -1)
      glUniform1f(loc, 0.15);
    if (bumpShader != 0 && (loc = glGetUniformLocation(bumpShader, "SpecularFactor")) != -1)
      glUniform1f(loc, 0.5);
    if (bumpShader != 0 && (loc = glGetUniformLocation(bumpShader, "R")) != -1)
      glUniform1f(loc, R);
    if (bumpShader != 0 && (loc = glGetUniformLocation(bumpShader, "r")) != -1)
      glUniform1f(loc, r);
  
    if (bumpShader != 0 && (loc = glGetUniformLocation(bumpShader, "Time")) != -1) {
      double tt = 1.0;
      if(options[OPT_ANIM]) {
        double ipart, fpart;
        fpart = modf(thisTime * 0.001f, &ipart);
        if((int)ipart % 2 == 0)
          // using slightly less fpart smoothes animation
          tt = 1.1 - fpart; 
        else
          tt = fpart;
      }
      glUniform1f(loc, tt);
    }

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, geom_uv);
    glDrawElements(GL_QUAD_STRIP, n_geom_indices, GL_UNSIGNED_INT, geom_indices);
    glDisableClientState(GL_VERTEX_ARRAY);
  } else if(options[OPT_SHADER_GEN]) {
    /* pass in radii as uniforms */
    if (currentShader != 0 && (loc = glGetUniformLocation(currentShader, "R")) != -1)
      glUniform1f(loc, R);
    if (currentShader != 0 && (loc = glGetUniformLocation(currentShader, "r")) != -1)
      glUniform1f(loc, r);
    if (currentShader != 0 && (loc = glGetUniformLocation(currentShader, "GenMode")) != -1)
      glUniform1i(loc, gMode);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, geom_uv);
    glDrawElements(GL_QUAD_STRIP, n_geom_indices, GL_UNSIGNED_INT, geom_indices);
    glDisableClientState(GL_VERTEX_ARRAY);
  } else {
    if(options[OPT_IMMEDIATE]) {
      drawImmediate();
    } else {
      glEnableClientState(GL_VERTEX_ARRAY);
      glEnableClientState(GL_NORMAL_ARRAY);
      glNormalPointer(GL_FLOAT, 0, geom_norms);

      if(options[OPT_VBO])
        drawVBO();
      else
        drawVertexArray();

      glDisableClientState(GL_NORMAL_ARRAY);
      glDisableClientState(GL_VERTEX_ARRAY);
    }
  }

  /* Render the hud */
	glDisable(GL_DEPTH_TEST);
	glMatrixMode(GL_PROJECTION);
	glPushMatrix();
	glLoadIdentity();
	glOrtho(0, 1, 0, 1, -1, 1);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	
	glUseProgram(0);
	glDisable(GL_LIGHTING);
	glTranslatef(0.0, 0.0, -0.5);
	drawHud();
	glEnable(GL_LIGHTING);
	
	glMatrixMode(GL_PROJECTION);
	glPopMatrix(); 
	glMatrixMode(GL_MODELVIEW);
	glEnable(GL_DEPTH_TEST);

	glutSwapBuffers();
  int err;
	if ((err = glGetError()) != GL_NO_ERROR)
		fprintf(stderr, "%s\n", gluErrorString(err));
}
示例#2
0
void RunnerTilemap::draw(const math::bbox2d &screen)
{
	math::vec2i start = tilePos(screen.min);
	math::vec2i end   = tilePos(screen.max) + math::vec2i(1,1);

	if ((int)m_chunks.size() <= end.x) generateUntil(end.x);

	glDisable(GL_TEXTURE_2D);
	glDisable(GL_DEPTH_TEST);
	glDepthMask(GL_FALSE);
	glDisable(GL_BLEND);

	unsigned short c = 0;
	glColor(m_color);
	if (start.y < 0)
	{
		math::bbox2d quad(
			math::vec2d((double)start.x,(double) start.y)*m_unitsPerTile,
			math::vec2d((double)1+end.x,(double)       0)*m_unitsPerTile);

		fillVertexArray(0, quad);
		drawVertexArray(1);
		start.y = 0;
	}
	if (start.x < 0) start.x = 0;

	for (int i = start.x; i < end.x; ++i)
	{
		chunk& cur = m_chunks[i];
		bool lastColl = false;
		int  lastColly = start.y;

		for (int j = start.y; j < end.y; ++j)
		{
			bool currColl = (j < 0) || (cur.height > j) || ((int)cur.ceil > 4 && (int)(cur.ceil + cur.height) < j);

			if (!lastColl && currColl) lastColly = j;
			else if (lastColl && !currColl)
			{
				math::bbox2d quad(
					math::vec2d((double) i+0,(double) lastColly)*m_unitsPerTile,
					math::vec2d((double) i+1,(double)         j)*m_unitsPerTile);

				fillVertexArray(c, quad);
				if (++c == VERTEX_ARRAY_SIZE) {
					drawVertexArray(c);
					c = 0;
				}
			}

			lastColl = currColl;
		}

		if (lastColl)
		{
			math::bbox2d quad(
				math::vec2d((double) i+0,(double) lastColly)*m_unitsPerTile,
				math::vec2d((double) i+1,(double)     end.y)*m_unitsPerTile);

			fillVertexArray(c, quad);
			if (++c == VERTEX_ARRAY_SIZE) {
				drawVertexArray(c);
				c = 0;
			}
		}
	}

	if (c) drawVertexArray(c);
}
示例#3
0
void Mesh::draw() const
{
    drawVertexArray(share->triangleArray, GL_TRIANGLES, share->triangleCount);
    drawVertexArray(share->lineArray, GL_LINES, share->lineCount);
    drawVertexArray(share->pointArray, GL_POINTS, share->pointCount);
}