예제 #1
0
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();
                }
            }
        }
    }

}
예제 #2
0
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);
}