void Terrain::setNormalsBezier() { Vector3 v1, v2, v3, v4; int indexW, indexH; for(int h = 0; h < (height/PORTION) - 4; h += 3){ for(int w = 0; w < (width/PORTION) - 4; w += 3){ BezierPatch p = BezierPatch(coords[w][h], coords[w+1][h], coords[w+2][h], coords[w+3][h], coords[w][h+1], coords[w+1][h+1], coords[w+2][h+1], coords[w+3][h+1], coords[w][h+2], coords[w+1][h+2], coords[w+2][h+2], coords[w+3][h+2], coords[w][h+3], coords[w+1][h+3], coords[w+2][h+3], coords[w+3][h+3]); for(float u = 0.0; u <= 1.0 - BEZ_ACC; u += BEZ_ACC) { for(float v = 0.0; v <= 1.0 - BEZ_ACC; v += BEZ_ACC) { v1 = p.getPoint(u, v); v2 = p.getPoint(u, v+1); v3 = p.getPoint(u+1, v); v4 = p.getPoint(u+1, v+1); indexW = w + (int)(BEZ_POINTS*u); indexH = h + (int)(BEZ_POINTS*v); normal_bezier[indexW][indexH] = (v2-v1).cross(v3-v1).normalize(); normal_bezier[indexW][indexH+1] = (v3-v4).cross(v2-v4).normalize(); } } } } }
void Terrain::drawBezier(Matrix4 c) { //glDisable(GL_LIGHTING); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glMultMatrixf(c.ptr()); // Globals::shader->bind(); // GLint loc = glGetUniformLocationARB(Globals::shader->getPid(), "water_level"); // glUniform1f(loc, Shader::water_level); // // GLint col = glGetAttribLocationARB(Globals::shader->getPid(), "gl_Color"); // GLint bandLoc = glGetUniformLocationARB(Globals::shader->getPid(), "band_width"); // glUniform1f(bandLoc, Shader::band_width); // glDisable(GL_LIGHTING); int indexW, indexH; for(int h = 0; h < (height/PORTION) - 4; h += 3){ for(int w = 0; w < (width/PORTION) - 4; w += 3){ BezierPatch p = BezierPatch(coords[w][h], coords[w+1][h], coords[w+2][h], coords[w+3][h], coords[w][h+1], coords[w+1][h+1], coords[w+2][h+1], coords[w+3][h+1], coords[w][h+2], coords[w+1][h+2], coords[w+2][h+2], coords[w+3][h+2], coords[w][h+3], coords[w+1][h+3], coords[w+2][h+3], coords[w+3][h+3]); for(float u = 0.0; u <= 1.0 - BEZ_ACC; u += BEZ_ACC) { glBegin(GL_TRIANGLE_STRIP); for(float v = 0.0; v <= 1.0; v += BEZ_ACC) { glColor3f(terrain_color[0], terrain_color[1], terrain_color[2]); glVertex3fv(p.getPoint(u, v).ptr()); glVertex3fv(p.getPoint(u + BEZ_ACC, v).ptr()); indexW = w + (int)(BEZ_POINTS*u); indexH = h + (int)(BEZ_POINTS*v); glNormal3fv(normal_bezier[indexW][indexH+1].ptr()); } glEnd(); } } } //Globals::shader->unbind(); glPopMatrix(); //glEnable(GL_LIGHTING); }