fix uv mapping for the circle shape

This commit is contained in:
2017-01-17 20:55:39 +00:00
parent c93c1daecc
commit 9e123a6a65
2 changed files with 24 additions and 13 deletions

View File

@@ -94,7 +94,7 @@ void Plane::create_impl(float w, float h, int div, GLushort *idx, Shape::vertex_
*idx++ = 0; // A *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[0] = div * 3;
count[1] = div * 2; 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; float theta = (float)i / div * (float)M_PI * 2.f;
glm::vec2 uv = { sinf(theta), cosf(theta) }; glm::vec2 uv = { sinf(theta), cosf(theta) };
v.pos = glm::vec4(uv * radius, 0, 1); 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; vertices[i+1] = v;
*pidx++ = 0; *pidx++ = 0;
@@ -120,7 +120,7 @@ void Circle::create_impl(float radius, int div, GLushort* idx, vertex_t* vertice
*pidx2++ = 1 + ((i+1) % div); *pidx2++ = 1 + ((i+1) % div);
} }
vertices[0].pos = { 0, 0, 0, 1 }; 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) 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*2+1; // B
*pidx++ = ((i+1)*2+1) % (div*2); // C *pidx++ = ((i+1)*2+1) % (div*2); // C
if (radius_in != 0.f)
{
*pidx++ = i * 2; // A *pidx++ = i * 2; // A
*pidx++ = ((i + 1) * 2 + 1) % (div * 2); // C *pidx++ = ((i + 1) * 2 + 1) % (div * 2); // C
*pidx++ = ((i + 1) * 2) % (div * 2); // D *pidx++ = ((i + 1) * 2) % (div * 2); // D
}
*pidx2++ = i*2; // A *pidx2++ = i*2; // A
*pidx2++ = ((i+1)*2) % (div*2); // D *pidx2++ = ((i+1)*2) % (div*2); // D

View File

@@ -33,23 +33,31 @@ class Circle : public Shape
public: public:
enum class kUVMapping: uint8_t { Planar, Tube }; enum class kUVMapping: uint8_t { Planar, Tube };
template<int div> template<int div>
bool create(float radius, kUVMapping map) bool create(float radius)
{ {
static GLushort idx[div*3 + div*2]; static GLushort idx[div*3 + div*2];
static vertex_t vertices[div+1]; static vertex_t vertices[div+1];
create_impl(radius, div, idx, vertices, map); create_impl(radius, div, idx, vertices, kUVMapping::Planar);
return create_buffers(idx, vertices, sizeof(idx), sizeof(vertices));
}
template<int div>
bool create(float radius, kUVMapping 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)); return create_buffers(idx, vertices, sizeof(idx), sizeof(vertices));
} }
template<int div> template<int div>
bool create(float radius_out, float radius_in, kUVMapping map) bool create(float radius_out, float radius_in, kUVMapping map)
{ {
static GLushort idx[div*6 + div*4]; static GLushort idx[(div+1)*6 + (div+1)*4];
static vertex_t vertices[div * 2]; static vertex_t vertices[(div+1) * 2];
create_impl(radius_out, radius_in, div, idx, vertices, map); create_impl(radius_out, radius_in, (div+1), idx, vertices, map);
return create_buffers(idx, vertices, sizeof(idx), sizeof(vertices)); return create_buffers(idx, vertices, sizeof(idx), sizeof(vertices));
} }
private: 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); void create_impl(float radius_out, float radius_in, int div, GLushort* idx, vertex_t* vertices, kUVMapping map);
}; };