Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- GeometryData Geometry::createCylinderGeometry(unsigned int segments, float height, float radius)
- {
- GeometryData data;
- // center vertices
- data.positions.push_back(glm::vec3(0, -height / 2.0f, 0));
- data.normals.push_back(glm::vec3(0.0f, -1, 0.0f));
- data.positions.push_back(glm::vec3(0, height / 2.0f, 0));
- data.normals.push_back(glm::vec3(0.0f, 1, 0.0f));
- // circle top and bottom
- float angle_step = 2.0f * glm::pi<float>() / float(segments);
- //side faces
- for (unsigned int i = 0; i < segments; i++) {
- glm::vec3 circlePos = glm::vec3(
- glm::cos(i * angle_step) * radius,
- -height / 2.0f,
- glm::sin(i * angle_step) * radius
- );
- // bottom ring vertex
- data.positions.push_back(circlePos);
- // top ring vertex
- circlePos.y = height / 2.0f;
- data.positions.push_back(circlePos);
- //needs to be calculated from the circle -> y = 0
- circlePos.y = 0;
- data.normals.push_back(glm::normalize(circlePos));
- data.normals.push_back(glm::normalize(circlePos));
- data.indices.push_back(2 + i * 2);
- data.indices.push_back(i == segments - 1 ? 3 : 3 + (i + 1) * 2);
- data.indices.push_back(i == segments - 1 ? 2 : 2 + (i + 1) * 2);
- data.indices.push_back(i == segments - 1 ? 3 : 3 + (i + 1) * 2);
- data.indices.push_back(2 + i * 2);
- data.indices.push_back(3 + i * 2);
- }
- for (unsigned int i = 0; i < segments; i++) {
- glm::vec3 circlePos = glm::vec3(
- glm::cos(i * angle_step) * radius,
- -height / 2.0f,
- glm::sin(i * angle_step) * radius
- );
- // bottom ring vertex
- data.positions.push_back(circlePos);
- data.normals.push_back(glm::vec3(0.0f, -1, 0.0f));
- // top ring vertex
- circlePos.y = height / 2.0f;
- data.positions.push_back(circlePos);
- data.normals.push_back(glm::vec3(0.0f, 1, 0.0f));
- int offset = segments*2;
- // bottom face
- data.indices.push_back(0);
- data.indices.push_back(2+ offset + i * 2);
- data.indices.push_back(i == segments - 1 ? 2+ offset : 2+ offset + (i + 1) * 2);
- // top face
- data.indices.push_back(1);
- data.indices.push_back(i == segments - 1 ? 3+ offset : 3+ offset + (i + 1) * 2);
- data.indices.push_back(3+ offset + i * 2);
- }
- return std::move(data);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement