From 4021d4e8938088e4a85701846727607669212131 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 21 Jun 2022 20:05:57 -0700 Subject: [PATCH] Pass:monkey; Questionable. --- Tupfile.lua | 2 +- etc/monkey.glb | Bin 0 -> 53768 bytes etc/monkey.h | 2265 +++++++++++++++++++++++++++++++ etc/monkeycrush.lua | 53 + src/api/l_data_modelData.c | 13 +- src/api/l_graphics_pass.c | 9 + src/modules/graphics/graphics.c | 27 + src/modules/graphics/graphics.h | 1 + 8 files changed, 2368 insertions(+), 2 deletions(-) create mode 100644 etc/monkey.glb create mode 100644 etc/monkey.h create mode 100644 etc/monkeycrush.lua diff --git a/Tupfile.lua b/Tupfile.lua index 00b2ab2f..ca7c32c8 100644 --- a/Tupfile.lua +++ b/Tupfile.lua @@ -437,7 +437,7 @@ src += config.modules.thread and 'src/lib/tinycthread/*.c' or nil -- embed resource files with xxd -res = { 'etc/*.lua', 'etc/*.ttf', 'etc/shaders/*.glsl' } +res = { 'etc/boot.lua', 'etc/*.ttf', 'etc/shaders/*.glsl' } tup.foreach_rule(res, '^ XD %b^ xxd -i %f > %o', '%f.h') for i, pattern in ipairs(res) do diff --git a/etc/monkey.glb b/etc/monkey.glb new file mode 100644 index 0000000000000000000000000000000000000000..cd392e187925ad616ba131876656e229ae462e68 GIT binary patch literal 53768 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 etc/monkey.h + +local etc = lovr.filesystem.getSource() +local success, model = assert(pcall(lovr.data.newModelData, 'monkey.glb')) + +local min, max = lovr.math.newVec3(math.huge), lovr.math.newVec3(-math.huge) + +for i = 1, model:getMeshVertexCount(1) do + local x, y, z, nx, ny, nz = model:getMeshVertex(1, i) + min.x, min.y, min.z = math.min(x, min.x), math.min(y, min.y), math.min(z, min.z) + max.x, max.y, max.z = math.max(x, max.x), math.max(y, max.y), math.max(z, max.z) +end + +local size = lovr.math.newVec3(max - min) +local scale = .5 + +min:mul(scale) +max:mul(scale) +size:mul(scale) + +io.write(('float monkey_size[3] = { %ff, %ff, %ff };\n'):format(size:unpack())) +io.write(('float monkey_offset[3] = { %ff, %ff, %ff };\n'):format(min:unpack())) +io.write('\n') + +io.write('uint8_t monkey_vertices[] = {\n') +for i = 1, model:getMeshVertexCount(1) do + local x, y, z, nx, ny, nz = model:getMeshVertex(1, i) + local position = vec3(x, y, z):mul(scale) + local normal = vec3(nx, ny, nz) + + local qx, qy, qz = ((position - min) / size * 255 + .5):unpack() + local qnx, qny, qnz = ((normal / 2 + .5) * 255 + .5):unpack() + + qx, qy, qz = math.floor(qx), math.floor(qy), math.floor(qz) + qnx, qny, qnz = math.floor(qnx), math.floor(qny), math.floor(qnz) + + io.write((' %d, %d, %d, %d, %d, %d,\n'):format(qx, qy, qz, qnx, qny, qnz)) + + lovr.math.drain() +end +io.write('};\n\n') + +io.write('uint16_t monkey_indices[] = {\n ') +for i = 1, model:getMeshIndexCount(1) do + local index = model:getMeshIndex(1, i) + io.write((' %d,'):format(index)) + if i % 10 == 0 then + io.write('\n ') + end +end +io.write('\n};\n') + +lovr.event.quit() diff --git a/src/api/l_data_modelData.c b/src/api/l_data_modelData.c index bf99efb3..de486793 100644 --- a/src/api/l_data_modelData.c +++ b/src/api/l_data_modelData.c @@ -336,9 +336,20 @@ static int l_lovrModelDataGetMeshVertex(lua_State* L) { ModelAttribute* attribute = mesh->attributes[i]; if (!attribute) continue; + uint32_t stride = model->buffers[attribute->buffer].stride; + + if (!stride) { + switch (attribute->type) { + case I8: case U8: stride = attribute->components * 1; break; + case I16: case U16: stride = attribute->components * 2; break; + case I32: case U32: case F32: stride = attribute->components * 4; break; + default: break; + } + } + AttributeData data = { .raw = model->buffers[attribute->buffer].data }; data.u8 += attribute->offset; - data.u8 += vertex * model->buffers[attribute->buffer].stride; + data.u8 += vertex * stride; for (uint32_t j = 0; j < attribute->components; j++) { switch (attribute->type) { diff --git a/src/api/l_graphics_pass.c b/src/api/l_graphics_pass.c index 9fb28409..955e9168 100644 --- a/src/api/l_graphics_pass.c +++ b/src/api/l_graphics_pass.c @@ -573,6 +573,14 @@ static int l_lovrPassFill(lua_State* L) { return 0; } +static int l_lovrPassMonkey(lua_State* L) { + Pass* pass = luax_checktype(L, 1, Pass); + float transform[16]; + luax_readmat4(L, 2, transform, 1); + lovrPassMonkey(pass, transform); + return 0; +} + static int l_lovrPassMesh(lua_State* L) { Pass* pass = luax_checktype(L, 1, Pass); Buffer* vertices = !lua_toboolean(L, 2) ? NULL : luax_totype(L, 2, Buffer); @@ -825,6 +833,7 @@ const luaL_Reg lovrPass[] = { { "cylinder", l_lovrPassCylinder }, { "text", l_lovrPassText }, { "fill", l_lovrPassFill }, + { "monkey", l_lovrPassMonkey }, { "mesh", l_lovrPassMesh }, { "multimesh", l_lovrPassMultimesh }, diff --git a/src/modules/graphics/graphics.c b/src/modules/graphics/graphics.c index d33d36f0..7046f266 100644 --- a/src/modules/graphics/graphics.c +++ b/src/modules/graphics/graphics.c @@ -9,6 +9,7 @@ #include "core/spv.h" #include "core/os.h" #include "util.h" +#include "monkey.h" #include "shaders.h" #include #include @@ -3496,6 +3497,32 @@ void lovrPassFill(Pass* pass, Texture* texture) { }); } +void lovrPassMonkey(Pass* pass, float* transform) { + uint32_t vertexCount = COUNTOF(monkey_vertices) / 6; + + ShapeVertex* vertices; + lovrPassDraw(pass, &(Draw) { + .mode = VERTEX_TRIANGLES, + .vertex.count = vertexCount, + .vertex.pointer = (void**) &vertices, + .index.count = COUNTOF(monkey_indices), + .index.data = monkey_indices, + .transform = transform + }); + + // Manual vertex format conversion to avoid another format (and sn8x3 isn't always supported) + for (uint32_t i = 0; i < vertexCount; i++) { + vertices[i] = (ShapeVertex) { + .position.x = monkey_vertices[6 * i + 0] / 255.f * monkey_size[0] + monkey_offset[0], + .position.y = monkey_vertices[6 * i + 1] / 255.f * monkey_size[1] + monkey_offset[1], + .position.z = monkey_vertices[6 * i + 2] / 255.f * monkey_size[2] + monkey_offset[2], + .normal.x = monkey_vertices[6 * i + 3] / 255.f * 2.f - 1.f, + .normal.y = monkey_vertices[6 * i + 4] / 255.f * 2.f - 1.f, + .normal.z = monkey_vertices[6 * i + 5] / 255.f * 2.f - 1.f, + }; + } +} + void lovrPassMesh(Pass* pass, Buffer* vertices, Buffer* indices, float* transform, uint32_t start, uint32_t count, uint32_t instances) { if (count == ~0u) { count = (indices ? indices : vertices)->info.length - start; diff --git a/src/modules/graphics/graphics.h b/src/modules/graphics/graphics.h index 1323c59b..b67105de 100644 --- a/src/modules/graphics/graphics.h +++ b/src/modules/graphics/graphics.h @@ -484,6 +484,7 @@ void lovrPassCylinder(Pass* pass, float* transform, bool capped, float angle1, f void lovrPassTorus(Pass* pass, float* transform, uint32_t segmentsT, uint32_t segmentsP); void lovrPassText(Pass* pass, Font* font, const char* text, uint32_t length, float* transform, float wrap, HorizontalAlign halign, VerticalAlign valign); void lovrPassFill(Pass* pass, Texture* texture); +void lovrPassMonkey(Pass* pass, float* transform); void lovrPassMesh(Pass* pass, Buffer* vertices, Buffer* indices, float* transform, uint32_t start, uint32_t count, uint32_t instances); void lovrPassMultimesh(Pass* pass, Buffer* vertices, Buffer* indices, Buffer* indirect, uint32_t count, uint32_t offset, uint32_t stride); void lovrPassCompute(Pass* pass, uint32_t x, uint32_t y, uint32_t z, Buffer* indirect, uint32_t offset);