From 803cdaa8a5c15b75deaa7909ee47422cfb8d6ad3 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 20 Nov 2017 18:19:39 -0800 Subject: [PATCH] Early return for renderNode; --- src/graphics/model.c | 66 +++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/src/graphics/model.c b/src/graphics/model.c index c756c3ac..69b7e57d 100644 --- a/src/graphics/model.c +++ b/src/graphics/model.c @@ -9,46 +9,48 @@ static void renderNode(Model* model, int nodeIndex) { Material* currentMaterial = lovrGraphicsGetMaterial(); bool useMaterials = currentMaterial->isDefault; - lovrGraphicsPush(); - lovrGraphicsMatrixTransform(MATRIX_MODEL, model->globalNodeTransforms + 16 * nodeIndex); + if (node->primitives.length > 0) { + lovrGraphicsPush(); + lovrGraphicsMatrixTransform(MATRIX_MODEL, model->globalNodeTransforms + 16 * nodeIndex); - float globalInverse[16]; - mat4_set(globalInverse, model->globalNodeTransforms + nodeIndex * 16); - mat4_invert(globalInverse); + float globalInverse[16]; + mat4_set(globalInverse, model->globalNodeTransforms + nodeIndex * 16); + 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 + 16 * i; + mat4_identity(bonePose); + mat4_set(bonePose, globalInverse); + mat4_multiply(bonePose, &model->globalNodeTransforms[16 * nodeIndex]); + mat4_multiply(bonePose, bone->offset); } - mat4 bonePose = model->pose + 16 * i; - mat4_identity(bonePose); - mat4_set(bonePose, globalInverse); - mat4_multiply(bonePose, &model->globalNodeTransforms[16 * nodeIndex]); - mat4_multiply(bonePose, bone->offset); - } - - Shader* shader = lovrGraphicsGetActiveShader(); - if (shader) { - lovrShaderSetMatrix(shader, "lovrPose", model->pose, MAX_BONES * 16); - } - - for (int i = 0; i < node->primitives.length; i++) { - ModelPrimitive* primitive = &model->modelData->primitives[node->primitives.data[i]]; - if (useMaterials) { - lovrGraphicsSetMaterial(model->materials[primitive->material]); + Shader* shader = lovrGraphicsGetActiveShader(); + if (shader) { + lovrShaderSetMatrix(shader, "lovrPose", model->pose, MAX_BONES * 16); } - lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount); - lovrMeshDraw(model->mesh, NULL); - } - lovrGraphicsPop(); + for (int i = 0; i < node->primitives.length; i++) { + ModelPrimitive* primitive = &model->modelData->primitives[node->primitives.data[i]]; + if (useMaterials) { + lovrGraphicsSetMaterial(model->materials[primitive->material]); + } + lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount); + lovrMeshDraw(model->mesh, NULL); + } + + lovrGraphicsPop(); + } for (int i = 0; i < node->children.length; i++) { renderNode(model, node->children.data[i]);