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; }
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; }
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; }