1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-02 12:33:52 +00:00

Early return for renderNode;

This commit is contained in:
bjorn 2017-11-20 18:19:39 -08:00
parent 17ffebd6ae
commit 803cdaa8a5

View file

@ -9,46 +9,48 @@ static void renderNode(Model* model, int nodeIndex) {
Material* currentMaterial = lovrGraphicsGetMaterial(); Material* currentMaterial = lovrGraphicsGetMaterial();
bool useMaterials = currentMaterial->isDefault; bool useMaterials = currentMaterial->isDefault;
lovrGraphicsPush(); if (node->primitives.length > 0) {
lovrGraphicsMatrixTransform(MATRIX_MODEL, model->globalNodeTransforms + 16 * nodeIndex); lovrGraphicsPush();
lovrGraphicsMatrixTransform(MATRIX_MODEL, model->globalNodeTransforms + 16 * nodeIndex);
float globalInverse[16]; float globalInverse[16];
mat4_set(globalInverse, model->globalNodeTransforms + nodeIndex * 16); mat4_set(globalInverse, model->globalNodeTransforms + nodeIndex * 16);
mat4_invert(globalInverse); mat4_invert(globalInverse);
for (int i = 0; i < model->modelData->bones.length; i++) { for (int i = 0; i < model->modelData->bones.length; i++) {
Bone* bone = &model->modelData->bones.data[i]; Bone* bone = &model->modelData->bones.data[i];
int nodeIndex = -1; int nodeIndex = -1;
for (int j = 0; j < model->modelData->nodeCount; j++) { for (int j = 0; j < model->modelData->nodeCount; j++) {
if (!strcmp(model->modelData->nodes[j].name, bone->name)) { if (!strcmp(model->modelData->nodes[j].name, bone->name)) {
nodeIndex = j; nodeIndex = j;
break; 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; Shader* shader = lovrGraphicsGetActiveShader();
mat4_identity(bonePose); if (shader) {
mat4_set(bonePose, globalInverse); lovrShaderSetMatrix(shader, "lovrPose", model->pose, MAX_BONES * 16);
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]);
} }
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++) { for (int i = 0; i < node->children.length; i++) {
renderNode(model, node->children.data[i]); renderNode(model, node->children.data[i]);