Early return for renderNode;

This commit is contained in:
bjorn 2017-11-20 18:19:39 -08:00
parent 17ffebd6ae
commit 803cdaa8a5
1 changed files with 34 additions and 32 deletions

View File

@ -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]);