- t0 = (-b + sqrt_d) / (2.0f * a);
- t1 = (-b - sqrt_d) / (2.0f * a);
-
- if(t0 < 1e-6) t0 = t1;
- if(t1 < 1e-6) t1 = t0;
- t = t0 < t1 ? t0 : t1;
- if(t < 1e-6) return 0;
-
- hit = alloc_hit();
- hit->t = t;
- hit->x = ray->x + ray->dx * t;
- hit->y = ray->y + ray->dy * t;
- hit->z = ray->z + ray->dz * t;
- hit->nx = hit->x / o->sph.rad;
- hit->ny = hit->y / o->sph.rad;
- hit->nz = hit->z / o->sph.rad;
- hit->o = o;
- return hit;
+ t[0] = (-b + sqrt_d) / (2.0f * a);
+ t[1] = (-b - sqrt_d) / (2.0f * a);
+
+ if(t[0] < EPSILON && t[1] < EPSILON) {
+ return 0;
+ }
+
+ if(t[1] < t[0]) {
+ tmp = t[0];
+ t[0] = t[1];
+ t[1] = tmp;
+ }
+
+ if(t[0] < EPSILON) t[0] = EPSILON;
+ if(t[1] < EPSILON) t[1] = EPSILON;
+
+ hitlist = hit = alloc_hits(2);
+ for(i=0; i<2; i++) {
+ float c[3] = {0, 0, 0};
+ mat4_xform3(c, o->ob.xform, c);
+
+ hit->t = t[i];
+ hit->x = ray->x + ray->dx * t[i];
+ hit->y = ray->y + ray->dy * t[i];
+ hit->z = ray->z + ray->dz * t[i];
+ hit->nx = (hit->x - c[0]) / o->sph.rad;
+ hit->ny = (hit->y - c[1]) / o->sph.rad;
+ hit->nz = (hit->z - c[2]) / o->sph.rad;
+ hit->o = o;
+
+ hit = hit->next;
+ }
+ return hitlist;