void OBJ_CalculateNormals(OBJ_Model_t *Model) { unsigned int i, j; OBJ_Group_t *group; group=Model->groups; for(i=0;i<=Model->numvertices;i++) { Model->normals[3*i]=0.0f; Model->normals[3*i+1]=0.0f; Model->normals[3*i+2]=0.0f; } while(group) { for(i=0;inumtriangles;i++) { float n[3], v0[3], v1[3]; v0[0]=Model->vertices[3*Model->triangles[group->triangles[i]].vindices[1]]-Model->vertices[3*Model->triangles[group->triangles[i]].vindices[0]]; v0[1]=Model->vertices[3*Model->triangles[group->triangles[i]].vindices[1]+1]-Model->vertices[3*Model->triangles[group->triangles[i]].vindices[0]+1]; v0[2]=Model->vertices[3*Model->triangles[group->triangles[i]].vindices[1]+2]-Model->vertices[3*Model->triangles[group->triangles[i]].vindices[0]+2]; v1[0]=Model->vertices[3*Model->triangles[group->triangles[i]].vindices[2]]-Model->vertices[3*Model->triangles[group->triangles[i]].vindices[0]]; v1[1]=Model->vertices[3*Model->triangles[group->triangles[i]].vindices[2]+1]-Model->vertices[3*Model->triangles[group->triangles[i]].vindices[0]+1]; v1[2]=Model->vertices[3*Model->triangles[group->triangles[i]].vindices[2]+2]-Model->vertices[3*Model->triangles[group->triangles[i]].vindices[0]+2]; n[0]=(v0[1]*v1[2]-v0[2]*v1[1]); n[1]=(v0[2]*v1[0]-v0[0]*v1[2]); n[2]=(v0[0]*v1[1]-v0[1]*v1[0]); for(j=0;j<3;j++) { Model->normals[3*Model->triangles[group->triangles[i]].vindices[j]]+=n[0]; Model->normals[3*Model->triangles[group->triangles[i]].vindices[j]+1]+=n[1]; Model->normals[3*Model->triangles[group->triangles[i]].vindices[j]+2]+=n[2]; } } group=group->next; } for(i=0;i<=Model->numvertices;i++) { float mag; mag=1/(float)sqrt((Model->normals[3*i]*Model->normals[3*i])+(Model->normals[3*i+1]*Model->normals[3*i+1])+(Model->normals[3*i+2]*Model->normals[3*i+2])); Model->normals[3*i]*=mag; Model->normals[3*i+1]*=mag; Model->normals[3*i+2]*=mag; } }