#include <stdio.h>#include <stdlib.h>#include <math.h>#include "render.h"void FixPart(PG_OBJECTPART *part,PG_OBJECT *obj);void FixPoly(PG_POLYGON *poly,PG_VECTOR *points,PG_VECTOR *norm);void FixNorms(PG_OBJECT *obj){int i;	for (i=0;i<obj->nparts;i++) {		FixPart(&(obj->parts[i]),obj);			}	for (i=0;i<obj->nobjects;i++) {		FixNorms(obj->objects[i]);	}	}void FixPart(PG_OBJECTPART *part,PG_OBJECT *obj){int i;	for (i=0;i<part->npolys;i++) {		FixPoly(&(part->polys[i]),part->points,&(part->norms[i]));			}	for (i=0;i<obj->nwindows;i++) {		FixPoly(&(part->windows[i]),part->points,&(part->norms[i+part->npolys]));	}}#define vecsub(vd,va,vb) \	(vd).x=(va).x-(vb).x;\	(vd).y=(va).y-(vb).y;\	(vd).z=(va).z-(vb).z;#define length(v) sqrt(dot(v,v))void FixPoly(PG_POLYGON *poly,PG_VECTOR *points,PG_VECTOR *norm){PG_VECTOR tnorm,v1,v2;float t;int i,j;	for (i=1;i<poly->n;i++) {		for (j=i+1;j<poly->n;j++) {			vecsub(v1,points[poly->points[0]],points[poly->points[i]]);			vecsub(v2,points[poly->points[0]],points[poly->points[j]]);			cross(tnorm,v1,v2);			t=length(tnorm);			if (t>length(v1)*length(v2)/20.0) {				if (dot(tnorm,*norm)<0) {					t=-t;				}				norm->x=tnorm.x/t;				norm->y=tnorm.y/t;				norm->z=tnorm.z/t;				if (norm->y<0)					puts("negative");				printf("newnorm: %f %f %f\n",norm->x,norm->y,norm->z);				return;			}		}	}	puts("error: couldn't check normal.");}
