mirror of https://github.com/bjornbytes/lovr.git
Pass:circle;
This commit is contained in:
parent
7b5c816345
commit
8effa7424f
|
@ -442,6 +442,17 @@ static int l_lovrPassBox(lua_State* L) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int l_lovrPassCircle(lua_State* L) {
|
||||
Pass* pass = luax_checktype(L, 1, Pass);
|
||||
float transform[16];
|
||||
int index = luax_readmat4(L, 2, transform, 1);
|
||||
float angle1 = luax_optfloat(L, index++, 0.f);
|
||||
float angle2 = luax_optfloat(L, index++, 2.f * (float) M_PI);
|
||||
uint32_t segments = luax_optu32(L, index++, 64);
|
||||
lovrPassCircle(pass, transform, angle1, angle2, segments);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int l_lovrPassCompute(lua_State* L) {
|
||||
Pass* pass = luax_checktype(L, 1, Pass);
|
||||
Buffer* buffer = luax_totype(L, 2, Buffer);
|
||||
|
@ -637,6 +648,7 @@ const luaL_Reg lovrPass[] = {
|
|||
{ "plane", l_lovrPassPlane },
|
||||
{ "cube", l_lovrPassCube },
|
||||
{ "box", l_lovrPassBox },
|
||||
{ "circle", l_lovrPassCircle },
|
||||
|
||||
{ "compute", l_lovrPassCompute },
|
||||
|
||||
|
|
|
@ -2155,7 +2155,6 @@ void lovrPassPlane(Pass* pass, float* transform, uint32_t cols, uint32_t rows) {
|
|||
lovrPassDraw(pass, &(Draw) {
|
||||
.mode = GPU_DRAW_TRIANGLES,
|
||||
.transform = transform,
|
||||
.vertex.format = VERTEX_SHAPE,
|
||||
.vertex.pointer = (void**) &vertices,
|
||||
.vertex.count = vertexCount,
|
||||
.index.pointer = (void**) &indices,
|
||||
|
@ -2230,7 +2229,6 @@ void lovrPassBox(Pass* pass, float* transform) {
|
|||
lovrPassDraw(pass, &(Draw) {
|
||||
.mode = GPU_DRAW_TRIANGLES,
|
||||
.transform = transform,
|
||||
.vertex.format = VERTEX_SHAPE,
|
||||
.vertex.pointer = (void**) &vertices,
|
||||
.vertex.count = COUNTOF(vertexData),
|
||||
.index.pointer = (void**) &indices,
|
||||
|
@ -2241,6 +2239,45 @@ void lovrPassBox(Pass* pass, float* transform) {
|
|||
memcpy(indices, indexData, sizeof(indexData));
|
||||
}
|
||||
|
||||
void lovrPassCircle(Pass* pass, float* transform, float angle1, float angle2, uint32_t segments) {
|
||||
ShapeVertex* vertices;
|
||||
uint16_t* indices;
|
||||
|
||||
if (fabsf(angle1 - angle2) >= 2.f * (float) M_PI) {
|
||||
angle1 = 0.f;
|
||||
angle2 = 2.f * (float) M_PI;
|
||||
}
|
||||
|
||||
uint32_t vertexCount = segments + 2;
|
||||
uint32_t indexCount = segments * 3;
|
||||
|
||||
lovrPassDraw(pass, &(Draw) {
|
||||
.mode = GPU_DRAW_TRIANGLES,
|
||||
.transform = transform,
|
||||
.vertex.pointer = (void**) &vertices,
|
||||
.vertex.count = vertexCount,
|
||||
.index.pointer = (void**) &indices,
|
||||
.index.count = indexCount
|
||||
});
|
||||
|
||||
// Center
|
||||
*vertices++ = (ShapeVertex) { { 0.f, 0.f, 0.f }, { 0.f, 0.f, 1.f }, { .5f, .5f } };
|
||||
|
||||
float angleShift = (angle2 - angle1) / segments;
|
||||
for (uint32_t i = 0; i <= segments; i++) {
|
||||
float theta = angle1 + i * angleShift;
|
||||
float x = cosf(theta) * .5f;
|
||||
float y = sinf(theta) * .5f;
|
||||
*vertices++ = (ShapeVertex) { { x, y, 0.f }, { 0.f, 0.f, 1.f }, { x + .5f, .5f - y } };
|
||||
}
|
||||
|
||||
for (uint32_t i = 0; i < segments; i++) {
|
||||
uint16_t wedge[] = { 0, i + 1, i + 2 };
|
||||
memcpy(indices, wedge, sizeof(wedge));
|
||||
indices += COUNTOF(wedge);
|
||||
}
|
||||
}
|
||||
|
||||
void lovrPassCompute(Pass* pass, uint32_t x, uint32_t y, uint32_t z, Buffer* indirect, uint32_t offset) {
|
||||
lovrCheck(pass->info.type == PASS_COMPUTE, "This function can only be called on a compute pass");
|
||||
|
||||
|
|
|
@ -392,6 +392,7 @@ void lovrPassPoints(Pass* pass, uint32_t count, float** vertices);
|
|||
void lovrPassLine(Pass* pass, uint32_t count, float** vertices);
|
||||
void lovrPassPlane(Pass* pass, float* transform, uint32_t cols, uint32_t rows);
|
||||
void lovrPassBox(Pass* pass, float* transform);
|
||||
void lovrPassCircle(Pass* pass, float* transform, float angle1, float angle2, uint32_t segments);
|
||||
void lovrPassCompute(Pass* pass, uint32_t x, uint32_t y, uint32_t z, Buffer* indirect, uint32_t offset);
|
||||
void lovrPassClearBuffer(Pass* pass, Buffer* buffer, uint32_t offset, uint32_t extent);
|
||||
void lovrPassClearTexture(Pass* pass, Texture* texture, float value[4], uint32_t layer, uint32_t layerCount, uint32_t level, uint32_t levelCount);
|
||||
|
|
Loading…
Reference in New Issue