예제 #1
0
void GLPatch::initializeBuffers(ShaderProgram & shaderProgram) {

    std::vector<BezierPatch> patchesv;

    ReadBezierPatches("data/teapot.data", patchesv);
    
    float patchesf[patchesv.size()][192];
    for (int i = 0; i < patchesv.size(); i++)
    {
       float patch[192];
       paramSurfaces(patchesv[i], patch); 
       m_numberOfPatches[i] = sizeof(patch) / sizeof(float); //i know this will be constant

       m_vertexPositionAttribute = glGetAttribLocation(shaderProgram.getProgram(), "aPosition");

       GLuint m_Patch;
       m_Patches[i] = m_Patch;
       glGenBuffers(1, &m_Patch);
       glBindBuffer(GL_ARRAY_BUFFER, m_Patch);
       glBufferData(GL_ARRAY_BUFFER, sizeof(patch), patch, GL_STATIC_DRAW);
    }

	// glGenBuffers(1, &m_Patch);
	// glBindBuffer(GL_ARRAY_BUFFER, m_Patch);
	// glBufferData(GL_ARRAY_BUFFER, sizeof(patch), patch, GL_STATIC_DRAW);
    
    glm::vec3 Normal = glm::cross((patchesv[0][0][0] - patchesv[0][0][2]),(patchesv[0][0][2] - patchesv[0][3][3]));
    glm::vec3 N = glm::normalize(glm::vec3(Normal[0]+0.00001f,Normal[1]+0.000001f,Normal[2]+0.00001f));
    glUniform4f(glGetUniformLocation(shaderProgram.getProgram(), "uNormal"), N[0], N[0], N[2], 1.0);

	//Get a handle to the shader attribute aPosition and set it up:
	m_vertexPositionAttribute = glGetAttribLocation(shaderProgram.getProgram(), "aPosition");
	glVertexAttribPointer(m_vertexPositionAttribute, 3, GL_FLOAT, GL_FALSE, 0, 0);
}
예제 #2
0
BezierPatchModel::BezierPatchModel(const char * filename)
{
    level = 0;
    try {
        ReadBezierPatches(filename, patches);
        setLevel(1);
    }
    catch (const std::exception &e) {
        std::cerr << "Exception: " << e.what() << std::endl;
    }
}