Esempio n. 1
0
Mesh* MeshBuilder::GenerateSphere(const std::string &meshName, Color color, unsigned numStacks, unsigned numSlices)
{
    std::vector<Vertex> sphere_vertex_buffer_data;
    std::vector<GLuint> sphere_index_buffer_data;

    Vertex sphere;

    float anglePerStack = 180.f / numStacks;
    float anglePerSlice = 360.f / numSlices;

    for (unsigned stack = 0; stack < numStacks + 1; ++stack)
    {
        float phi = -90.f + stack * anglePerStack;
        for (unsigned slice = 0; slice < numSlices + 1; ++slice)
        {
            float theta = slice * anglePerSlice;
            sphere.pos.Set(SphereX(phi, theta), SphereY(phi, theta), SphereZ(phi, theta));
            sphere.color = color;
            sphere.normal.Set(SphereX(phi, theta), SphereY(phi, theta), SphereZ(phi, theta));
            sphere.normal.Normalize();
            sphere_vertex_buffer_data.push_back(sphere);
        }
    }



    for (unsigned stack = 0; stack < numStacks; ++stack)
    {
        for (unsigned slice = 0; slice < numSlices + 1; ++slice)
        {
            sphere_index_buffer_data.push_back(stack * (numSlices + 1) + slice);
            sphere_index_buffer_data.push_back((stack + 1) * (numSlices + 1) + slice);
        }
    }

    Mesh *mesh = new Mesh(meshName);

    glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sphere_vertex_buffer_data.size() * sizeof(Vertex), &sphere_vertex_buffer_data[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, mesh->indexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sphere_index_buffer_data.size() * sizeof(GLuint), &sphere_index_buffer_data[0], GL_STATIC_DRAW);

    mesh->indexSize = sphere_index_buffer_data.size();
    mesh->mode = Mesh::DRAW_TRIANGLE_STRIP;
    return mesh;
}
Esempio n. 2
0
Mesh* MeshBuilder::GenerateHemisphere(const std::string &meshName, Color color, float numStacks, unsigned numSlices)
{
	std::vector<Vertex> vertex_buffer_data;
	std::vector<GLuint> index_buffer_data;
	Vertex v;

	float anglePerStack = 180.f / numStacks;
	float anglePerSlice = 180.f / numSlices;
	for (unsigned stack = 0; stack < numStacks + 1; ++stack)
	{
		float phi = -90 + stack * anglePerStack;
		for (unsigned slice = 0; slice < numSlices + 1; ++slice)
		{
			float theta = slice *anglePerSlice;
			v.pos.Set(SphereX(phi, theta), SphereY(phi, theta), SphereZ(phi, theta));
			v.color = color;
			v.normal.Set(v.pos.x, v.pos.y, v.pos.z);
			vertex_buffer_data.push_back(v);

			//v.pos.Set(SphereX(phi+anglePerStack, theta), SphereY(phi+anglePerStack, theta), SphereZ(phi+anglePerStack, theta));
			//v.color = color;
			//vertex_buffer_data.push_back(v);
		}
	}




	for (unsigned stack = 0; stack < numStacks + 1; ++stack)
	{

		for (unsigned slice = 0; slice < numSlices + 1; ++slice)
		{
			index_buffer_data.push_back(stack * (numSlices + 1) + slice);
			index_buffer_data.push_back((stack + 1)*(numSlices + 1) + slice);
		}
	}




	Mesh *mesh = new Mesh(meshName);

	glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);
	glBufferData(GL_ARRAY_BUFFER, vertex_buffer_data.size() * sizeof(Vertex), &vertex_buffer_data[0], GL_STATIC_DRAW);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->indexBuffer);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, index_buffer_data.size() * sizeof(GLuint), &index_buffer_data[0], GL_STATIC_DRAW);

	mesh->indexSize = index_buffer_data.size();
	mesh->mode = Mesh::DRAW_TRIANGLE_STRIP;

	return mesh;
}
Esempio n. 3
0
Mesh* MeshBuilder::GenerateHemisphere(const std::string &meshName, Color color, unsigned numStacks, unsigned numSlices)
{
    std::vector<Vertex> hemisphere_vertex_buffer_data;
    std::vector<GLuint> hemisphere_index_buffer_data;

    Vertex hemisphere;

    float anglePerStack = 180.f / numStacks;
    float anglePerSlice = 360.f / numSlices;

    //Hemisphere
    for (unsigned stack = 0; stack < numStacks + 1; ++stack)
    {
        float phi = 0.f + stack * anglePerStack;
        for (unsigned slice = 0; slice < numSlices + 1; ++slice)
        {
            float theta = slice * anglePerSlice;
            hemisphere.pos.Set(SphereX(phi, theta), SphereY(phi, theta), SphereZ(phi, theta));
            hemisphere.normal.Set(SphereX(phi, theta), SphereY(phi, theta), SphereZ(phi, theta));
            hemisphere.color = color;
            hemisphere_vertex_buffer_data.push_back(hemisphere);
            hemisphere.normal.Set(SphereX(phi + 10, theta), SphereY(phi + 10, theta), SphereZ(phi + 10, theta));
        }
    }

    //Bottom
    for (float theta = 0; theta <= 360; theta += 10)
    {
        hemisphere.normal.Set(0, -1, 0);
        hemisphere.pos.Set(0, 0, 0);
        hemisphere.normal.Set(0, -1, 0);
        hemisphere.pos.Set(CircleX(theta), 0, CircleZ(theta));
        hemisphere.color = color;
        hemisphere_vertex_buffer_data.push_back(hemisphere);
    }



    for (unsigned stack = 0; stack < numStacks; ++stack)
    {
        for (unsigned slice = 0; slice < numSlices + 1; ++slice)
        {
            hemisphere_index_buffer_data.push_back(stack * (numSlices + 1) + slice);
            hemisphere_index_buffer_data.push_back((stack + 1) * (numSlices + 1) + slice);
        }
    }


    for (unsigned slice = 0; slice < numSlices + 1; ++slice)
    {
        hemisphere_index_buffer_data.push_back(slice);
        hemisphere_index_buffer_data.push_back(numSlices + 1);
    }


    Mesh *mesh = new Mesh(meshName);

    glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, hemisphere_vertex_buffer_data.size() * sizeof(Vertex), &hemisphere_vertex_buffer_data[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, mesh->indexBuffer);
    glBufferData(GL_ARRAY_BUFFER, hemisphere_index_buffer_data.size() * sizeof(GLuint), &hemisphere_index_buffer_data[0], GL_STATIC_DRAW);

    mesh->indexSize = hemisphere_index_buffer_data.size();
    mesh->mode = Mesh::DRAW_TRIANGLE_STRIP;
    return mesh;
}