Pass:circle;

This commit is contained in:
bjorn 2022-06-05 13:12:49 -07:00
parent 7b5c816345
commit 8effa7424f
3 changed files with 52 additions and 2 deletions

View File

@ -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 },

View File

@ -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");

View File

@ -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);