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