コード例 #1
0
ファイル: Terrain.cpp プロジェクト: klwolfe365/camelride167
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
BezierSurfaceModel::BezierSurfaceModel(const QString& fileName)
{
	QFile file(fileName);
	if (file.open(QIODevice::ReadOnly))
	{
		QTextStream stream(&file);
		int nPatches;
		stream >> nPatches;
		for (int i = 0; i < nPatches; i++)
		{
			int n = 0;
			int m = 0;
			stream >> n >> m;
			if (n != SURFACE_ORDER || m != SURFACE_ORDER)
			{
				patches.clear();
				return;
			}
			patches.append(BezierPatch());
			for (int j = 0; j < m + 1; j++)
			{
				for (int k = 0; k < n + 1; k++)
				{
					float x, y, z;
					stream >> x >> y >> z;
					patches[i].controlPoints(j, k) = QVector3D(x, y, z);
				}
			}
		}
	}
コード例 #3
0
ファイル: Terrain.cpp プロジェクト: klwolfe365/camelride167
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);
}