rendered paste body
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;i<group->numtriangles;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;
}
}