diff --git a/engine/shape.cpp b/engine/shape.cpp index b951fe5..dab43b1 100644 --- a/engine/shape.cpp +++ b/engine/shape.cpp @@ -94,7 +94,7 @@ void Plane::create_impl(float w, float h, int div, GLushort *idx, Shape::vertex_ *idx++ = 0; // A } -void Circle::create_impl(float radius, int div, GLushort* idx, vertex_t* vertices, kUVMapping map) +void Circle::create_impl(float radius, int div, GLushort* idx, vertex_t* vertices) { count[0] = div * 3; count[1] = div * 2; @@ -109,7 +109,7 @@ void Circle::create_impl(float radius, int div, GLushort* idx, vertex_t* vertice float theta = (float)i / div * (float)M_PI * 2.f; glm::vec2 uv = { sinf(theta), cosf(theta) }; v.pos = glm::vec4(uv * radius, 0, 1); - v.uvs = (map == kUVMapping::Planar) ? (uv * 0.5f + 0.5f) : glm::vec2((float)i / div, 1.f); + v.uvs = uv * 0.5f + 0.5f; vertices[i+1] = v; *pidx++ = 0; @@ -120,7 +120,7 @@ void Circle::create_impl(float radius, int div, GLushort* idx, vertex_t* vertice *pidx2++ = 1 + ((i+1) % div); } vertices[0].pos = { 0, 0, 0, 1 }; - vertices[0].uvs = (map == kUVMapping::Planar) ? glm::vec2(0.5f, 0.5f) : glm::vec2(0.f, 0.f); + vertices[0].uvs = { 0.5f, 0.5f }; } void Circle::create_impl(float radius_out, float radius_in, int div, GLushort* idx, vertex_t* vertices, kUVMapping map) @@ -153,9 +153,12 @@ void Circle::create_impl(float radius_out, float radius_in, int div, GLushort* i *pidx++ = i*2+1; // B *pidx++ = ((i+1)*2+1) % (div*2); // C - *pidx++ = i*2; // A - *pidx++ = ((i+1)*2+1) % (div*2); // C - *pidx++ = ((i+1)*2) % (div*2); // D + if (radius_in != 0.f) + { + *pidx++ = i * 2; // A + *pidx++ = ((i + 1) * 2 + 1) % (div * 2); // C + *pidx++ = ((i + 1) * 2) % (div * 2); // D + } *pidx2++ = i*2; // A *pidx2++ = ((i+1)*2) % (div*2); // D diff --git a/engine/shape.hpp b/engine/shape.hpp index 0c6c614..77056c7 100644 --- a/engine/shape.hpp +++ b/engine/shape.hpp @@ -33,23 +33,31 @@ class Circle : public Shape public: enum class kUVMapping: uint8_t { Planar, Tube }; template + bool create(float radius) + { + static GLushort idx[div*3 + div*2]; + static vertex_t vertices[div+1]; + create_impl(radius, div, idx, vertices, kUVMapping::Planar); + return create_buffers(idx, vertices, sizeof(idx), sizeof(vertices)); + } + template bool create(float radius, kUVMapping map) { - static GLushort idx[div * 3 + div * 2]; - static vertex_t vertices[div + 1]; - create_impl(radius, div, idx, vertices, map); + static GLushort idx[div*3 + div*2]; + static vertex_t vertices[div*2]; + create_impl(radius, 0.f, div, idx, vertices, map); return create_buffers(idx, vertices, sizeof(idx), sizeof(vertices)); } template bool create(float radius_out, float radius_in, kUVMapping map) { - static GLushort idx[div*6 + div*4]; - static vertex_t vertices[div * 2]; - create_impl(radius_out, radius_in, div, idx, vertices, map); + static GLushort idx[(div+1)*6 + (div+1)*4]; + static vertex_t vertices[(div+1) * 2]; + create_impl(radius_out, radius_in, (div+1), idx, vertices, map); return create_buffers(idx, vertices, sizeof(idx), sizeof(vertices)); } private: - void create_impl(float radius, int div, GLushort* idx, vertex_t* vertices, kUVMapping map); + void create_impl(float radius, int div, GLushort* idx, vertex_t* vertices); void create_impl(float radius_out, float radius_in, int div, GLushort* idx, vertex_t* vertices, kUVMapping map); };