59 lines · 870 B · C
RawDownload
#include <u.h>#include <libc.h>#include <draw.h>#include <memdraw.h>#include <geometry.h> #include "scene.h" Obj *newlight(Point3 p, double r, Point3 n, Colour c){	Obj *light; 	light = malloc(sizeof(Obj));	if(light == nil)		exits("malloc"); 	light->type = LIGHT;	light->p = p;	light->r = r;	light->n = n;	light->c = c; 	return light;} Hitlighthit(Obj *light, Point3 e, Point3 d){	double denom, intersect;	Point3 dist;	Hit hit; 	denom = dot3(d, light->n);	if(denom == 0)		goto nohit; 	dist = sub3(light->p, e);	intersect = dot3(dist, light->n)/denom; 	if(intersect <= 0)		goto nohit; 	hit.d = intersect;	hit.p = add3(e, mul3(d, intersect));	hit.n = light->n;	hit .ie = e;	hit.id = mul3(d, hit.d);	hit.o = light;	hit.c = light->c; 	if(dist3(hit.p, light->p) > light->r)		goto nohit; 	return hit;nohit:	hit.d = 0;	return hit;}