From 652c31f8d48cec3e6507fdd1501d6443ba31b139 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 20 Nov 2017 21:16:16 -0800 Subject: [PATCH] Optional pose; --- src/api/types/mesh.c | 2 +- src/graphics/graphics.c | 16 ++++++++++++++-- src/graphics/graphics.h | 2 +- src/graphics/mesh.c | 4 ++-- src/graphics/mesh.h | 2 +- src/graphics/model.c | 41 +++++++++++++++++++---------------------- 6 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/api/types/mesh.c b/src/api/types/mesh.c index 07cdaccb..5933d828 100644 --- a/src/api/types/mesh.c +++ b/src/api/types/mesh.c @@ -31,7 +31,7 @@ int l_lovrMeshDraw(lua_State* L) { Mesh* mesh = luax_checktype(L, 1, Mesh); float transform[16]; luax_readtransform(L, 2, transform, 1); - lovrMeshDraw(mesh, transform); + lovrMeshDraw(mesh, transform, NULL); return 0; } diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index af535415..cb8a8b5d 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -80,7 +80,7 @@ void lovrGraphicsPresent() { glfwSwapBuffers(state.window); } -void lovrGraphicsPrepare() { +void lovrGraphicsPrepare(float* pose) { Shader* shader = lovrGraphicsGetActiveShader(); if (!shader) { @@ -121,6 +121,15 @@ void lovrGraphicsPrepare() { // Point size lovrShaderSetFloat(shader, "lovrPointSize", &state.pointSize, 1); + // Pose + if (pose) { + lovrShaderSetMatrix(shader, "lovrPose", pose, MAX_BONES * 16); + } else { + float identity[16]; + mat4_identity(identity); + lovrShaderSetMatrix(shader, "lovrPose", identity, 16); + } + // Material Material* material = lovrGraphicsGetMaterial(); @@ -502,7 +511,7 @@ static void lovrGraphicsDrawPrimitive(GLenum mode, bool hasNormals, bool hasTexC float* data = state.streamData.data; unsigned int* indices = state.streamIndices.data; - lovrGraphicsPrepare(); + lovrGraphicsPrepare(NULL); lovrGraphicsBindVertexArray(state.streamVAO); lovrGraphicsBindVertexBuffer(state.streamVBO); glBufferData(GL_ARRAY_BUFFER, state.streamData.length * sizeof(float), data, GL_STREAM_DRAW); @@ -524,6 +533,9 @@ static void lovrGraphicsDrawPrimitive(GLenum mode, bool hasNormals, bool hasTexC glDisableVertexAttribArray(LOVR_SHADER_TEX_COORD); } + glDisableVertexAttribArray(LOVR_SHADER_BONES); + glDisableVertexAttribArray(LOVR_SHADER_BONE_WEIGHTS); + if (useIndices) { lovrGraphicsBindIndexBuffer(state.streamIBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, state.streamIndices.length * sizeof(unsigned int), indices, GL_STREAM_DRAW); diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index a93845fb..05c55fcc 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -113,7 +113,7 @@ void lovrGraphicsDestroy(); void lovrGraphicsReset(); void lovrGraphicsClear(bool color, bool depth); void lovrGraphicsPresent(); -void lovrGraphicsPrepare(); +void lovrGraphicsPrepare(float* pose); void lovrGraphicsCreateWindow(int w, int h, bool fullscreen, int msaa, const char* title, const char* icon); int lovrGraphicsGetWidth(); int lovrGraphicsGetHeight(); diff --git a/src/graphics/mesh.c b/src/graphics/mesh.c index e1c52c0a..de77e5a5 100644 --- a/src/graphics/mesh.c +++ b/src/graphics/mesh.c @@ -127,7 +127,7 @@ void lovrMeshDestroy(const Ref* ref) { free(mesh); } -void lovrMeshDraw(Mesh* mesh, mat4 transform) { +void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose) { if (mesh->isMapped) { lovrMeshUnmap(mesh); } @@ -138,7 +138,7 @@ void lovrMeshDraw(Mesh* mesh, mat4 transform) { } lovrGraphicsSetDefaultShader(SHADER_DEFAULT); - lovrGraphicsPrepare(); + lovrGraphicsPrepare(pose); lovrGraphicsBindVertexArray(mesh->vao); lovrMeshBindAttributes(mesh); size_t start = mesh->rangeStart; diff --git a/src/graphics/mesh.h b/src/graphics/mesh.h index 305e13be..bc975144 100644 --- a/src/graphics/mesh.h +++ b/src/graphics/mesh.h @@ -60,7 +60,7 @@ typedef struct { Mesh* lovrMeshCreate(size_t count, MeshFormat* format, MeshDrawMode drawMode, MeshUsage usage); void lovrMeshDestroy(const Ref* ref); -void lovrMeshDraw(Mesh* mesh, mat4 transform); +void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose); MeshFormat lovrMeshGetVertexFormat(Mesh* mesh); MeshDrawMode lovrMeshGetDrawMode(Mesh* mesh); void lovrMeshSetDrawMode(Mesh* mesh, MeshDrawMode drawMode); diff --git a/src/graphics/model.c b/src/graphics/model.c index 1ce138bb..22c8c03d 100644 --- a/src/graphics/model.c +++ b/src/graphics/model.c @@ -13,31 +13,28 @@ static void renderNode(Model* model, int nodeIndex) { lovrGraphicsPush(); lovrGraphicsMatrixTransform(MATRIX_MODEL, model->nodeTransforms[nodeIndex]); - float globalInverse[16]; - mat4_set(globalInverse, model->nodeTransforms[nodeIndex]); - mat4_invert(globalInverse); + if (model->animator) { + float globalInverse[16]; + mat4_set(globalInverse, model->nodeTransforms[nodeIndex]); + mat4_invert(globalInverse); - for (int i = 0; i < model->modelData->bones.length; i++) { - Bone* bone = &model->modelData->bones.data[i]; + for (int i = 0; i < model->modelData->bones.length; i++) { + Bone* bone = &model->modelData->bones.data[i]; - int nodeIndex = -1; - for (int j = 0; j < model->modelData->nodeCount; j++) { - if (!strcmp(model->modelData->nodes[j].name, bone->name)) { - nodeIndex = j; - break; + int nodeIndex = -1; + for (int j = 0; j < model->modelData->nodeCount; j++) { + if (!strcmp(model->modelData->nodes[j].name, bone->name)) { + nodeIndex = j; + break; + } } + + mat4 bonePose = model->pose[i]; + mat4_identity(bonePose); + mat4_set(bonePose, globalInverse); + mat4_multiply(bonePose, model->nodeTransforms[nodeIndex]); + mat4_multiply(bonePose, bone->offset); } - - mat4 bonePose = model->pose[i]; - mat4_identity(bonePose); - mat4_set(bonePose, globalInverse); - mat4_multiply(bonePose, model->nodeTransforms[nodeIndex]); - mat4_multiply(bonePose, bone->offset); - } - - Shader* shader = lovrGraphicsGetActiveShader(); - if (shader) { - lovrShaderSetMatrix(shader, "lovrPose", (float*) model->pose, MAX_BONES * 16); } for (int i = 0; i < node->primitives.length; i++) { @@ -46,7 +43,7 @@ static void renderNode(Model* model, int nodeIndex) { lovrGraphicsSetMaterial(model->materials[primitive->material]); } lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount); - lovrMeshDraw(model->mesh, NULL); + lovrMeshDraw(model->mesh, NULL, (float*) model->pose); } lovrGraphicsPop();