mirror of https://github.com/bjornbytes/lovr.git
Pass:cone;
This commit is contained in:
parent
92201b87a1
commit
d17131c421
|
@ -559,6 +559,15 @@ static int l_lovrPassCylinder(lua_State* L) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int l_lovrPassCone(lua_State* L) {
|
||||||
|
Pass* pass = luax_checktype(L, 1, Pass);
|
||||||
|
float transform[16];
|
||||||
|
int index = luax_readmat4(L, 2, transform, -2);
|
||||||
|
uint32_t segments = luax_optu32(L, index, 64);
|
||||||
|
lovrPassCone(pass, transform, segments);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int l_lovrPassCapsule(lua_State* L) {
|
static int l_lovrPassCapsule(lua_State* L) {
|
||||||
Pass* pass = luax_checktype(L, 1, Pass);
|
Pass* pass = luax_checktype(L, 1, Pass);
|
||||||
float transform[16];
|
float transform[16];
|
||||||
|
@ -958,6 +967,7 @@ const luaL_Reg lovrPass[] = {
|
||||||
{ "circle", l_lovrPassCircle },
|
{ "circle", l_lovrPassCircle },
|
||||||
{ "sphere", l_lovrPassSphere },
|
{ "sphere", l_lovrPassSphere },
|
||||||
{ "cylinder", l_lovrPassCylinder },
|
{ "cylinder", l_lovrPassCylinder },
|
||||||
|
{ "cone", l_lovrPassCone },
|
||||||
{ "capsule", l_lovrPassCapsule },
|
{ "capsule", l_lovrPassCapsule },
|
||||||
{ "torus", l_lovrPassTorus },
|
{ "torus", l_lovrPassTorus },
|
||||||
{ "text", l_lovrPassText },
|
{ "text", l_lovrPassText },
|
||||||
|
|
|
@ -261,6 +261,7 @@ enum {
|
||||||
SHAPE_CIRCLE,
|
SHAPE_CIRCLE,
|
||||||
SHAPE_SPHERE,
|
SHAPE_SPHERE,
|
||||||
SHAPE_CYLINDER,
|
SHAPE_CYLINDER,
|
||||||
|
SHAPE_CONE,
|
||||||
SHAPE_CAPSULE,
|
SHAPE_CAPSULE,
|
||||||
SHAPE_TORUS,
|
SHAPE_TORUS,
|
||||||
SHAPE_MONKEY
|
SHAPE_MONKEY
|
||||||
|
@ -1348,7 +1349,7 @@ ShaderSource lovrGraphicsCompileShader(ShaderStage stage, ShaderSource* source)
|
||||||
[STAGE_VERTEX] = ""
|
[STAGE_VERTEX] = ""
|
||||||
"void main() {"
|
"void main() {"
|
||||||
"Color = PassColor * VertexColor;"
|
"Color = PassColor * VertexColor;"
|
||||||
"Normal = normalize(NormalMatrix * VertexNormal);"
|
"Normal = NormalMatrix * VertexNormal;"
|
||||||
"UV = VertexUV;"
|
"UV = VertexUV;"
|
||||||
"Position = lovrmain();"
|
"Position = lovrmain();"
|
||||||
"}",
|
"}",
|
||||||
|
@ -4324,6 +4325,59 @@ void lovrPassCylinder(Pass* pass, float* transform, bool capped, float angle1, f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lovrPassCone(Pass* pass, float* transform, uint32_t segments) {
|
||||||
|
uint32_t key[] = { SHAPE_CONE, segments };
|
||||||
|
uint32_t vertexCount = 2 * segments + 1;
|
||||||
|
uint32_t indexCount = 3 * (segments - 2) + 3 * segments;
|
||||||
|
ShapeVertex* vertices;
|
||||||
|
uint16_t* indices;
|
||||||
|
|
||||||
|
lovrPassDraw(pass, &(Draw) {
|
||||||
|
.hash = hash64(key, sizeof(key)),
|
||||||
|
.mode = MESH_TRIANGLES,
|
||||||
|
.transform = transform,
|
||||||
|
.vertex.pointer = (void**) &vertices,
|
||||||
|
.vertex.count = vertexCount,
|
||||||
|
.index.pointer = (void**) &indices,
|
||||||
|
.index.count = indexCount
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!vertices) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < segments; i++) {
|
||||||
|
float theta = i * 2.f * (float) M_PI / segments;
|
||||||
|
float x = cosf(theta);
|
||||||
|
float y = sinf(theta);
|
||||||
|
float rsqrt3 = .57735f;
|
||||||
|
float nx = cosf(theta) * rsqrt3;
|
||||||
|
float ny = sinf(theta) * rsqrt3;
|
||||||
|
float nz = -rsqrt3;
|
||||||
|
float u = x + .5f;
|
||||||
|
float v = .5f - y;
|
||||||
|
vertices[segments * 0] = (ShapeVertex) { { x, y, 0.f }, { 0.f, 0.f, 1.f }, { u, v } };
|
||||||
|
vertices[segments * 1] = (ShapeVertex) { { x, y, 0.f }, { nx, ny, nz }, { u, v } };
|
||||||
|
vertices++;
|
||||||
|
}
|
||||||
|
|
||||||
|
vertices[segments] = (ShapeVertex) { { 0.f, 0.f, -1.f }, { 0.f, 0.f, 0.f }, { .5f, .5f } };
|
||||||
|
|
||||||
|
// Base
|
||||||
|
for (uint32_t i = 0; i < segments - 2; i++) {
|
||||||
|
uint16_t tri[] = { 0, i + 1, i + 2 };
|
||||||
|
memcpy(indices, tri, sizeof(tri));
|
||||||
|
indices += COUNTOF(tri);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sides
|
||||||
|
for (uint32_t i = 0; i < segments; i++) {
|
||||||
|
uint16_t tri[] = { segments + i, segments + (i + 1) % segments, vertexCount - 1 };
|
||||||
|
memcpy(indices, tri, sizeof(tri));
|
||||||
|
indices += COUNTOF(tri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void lovrPassCapsule(Pass* pass, float* transform, uint32_t segments) {
|
void lovrPassCapsule(Pass* pass, float* transform, uint32_t segments) {
|
||||||
float sx = vec3_length(transform + 0);
|
float sx = vec3_length(transform + 0);
|
||||||
float sy = vec3_length(transform + 4);
|
float sy = vec3_length(transform + 4);
|
||||||
|
@ -4349,7 +4403,7 @@ void lovrPassCapsule(Pass* pass, float* transform, uint32_t segments) {
|
||||||
.vertex.pointer = (void**) &vertices,
|
.vertex.pointer = (void**) &vertices,
|
||||||
.vertex.count = vertexCount,
|
.vertex.count = vertexCount,
|
||||||
.index.pointer = (void**) &indices,
|
.index.pointer = (void**) &indices,
|
||||||
.index.count = indexCount,
|
.index.count = indexCount
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!vertices) {
|
if (!vertices) {
|
||||||
|
|
|
@ -612,6 +612,7 @@ void lovrPassBox(Pass* pass, float* transform, DrawStyle style);
|
||||||
void lovrPassCircle(Pass* pass, float* transform, DrawStyle style, float angle1, float angle2, uint32_t segments);
|
void lovrPassCircle(Pass* pass, float* transform, DrawStyle style, float angle1, float angle2, uint32_t segments);
|
||||||
void lovrPassSphere(Pass* pass, float* transform, uint32_t segmentsH, uint32_t segmentsV);
|
void lovrPassSphere(Pass* pass, float* transform, uint32_t segmentsH, uint32_t segmentsV);
|
||||||
void lovrPassCylinder(Pass* pass, float* transform, bool capped, float angle1, float angle2, uint32_t segments);
|
void lovrPassCylinder(Pass* pass, float* transform, bool capped, float angle1, float angle2, uint32_t segments);
|
||||||
|
void lovrPassCone(Pass* pass, float* transform, uint32_t segments);
|
||||||
void lovrPassCapsule(Pass* pass, float* transform, uint32_t segments);
|
void lovrPassCapsule(Pass* pass, float* transform, uint32_t segments);
|
||||||
void lovrPassTorus(Pass* pass, float* transform, uint32_t segmentsT, uint32_t segmentsP);
|
void lovrPassTorus(Pass* pass, float* transform, uint32_t segmentsT, uint32_t segmentsP);
|
||||||
void lovrPassText(Pass* pass, Font* font, ColoredString* strings, uint32_t count, float* transform, float wrap, HorizontalAlign halign, VerticalAlign valign);
|
void lovrPassText(Pass* pass, Font* font, ColoredString* strings, uint32_t count, float* transform, float wrap, HorizontalAlign halign, VerticalAlign valign);
|
||||||
|
|
Loading…
Reference in New Issue