diff -r f6a72eb99631 -r 9d66d323c354 src/shapes.cc --- a/src/shapes.cc Tue Apr 29 23:31:08 2008 +0200 +++ b/src/shapes.cc Fri May 02 13:27:47 2008 +0200 @@ -29,7 +29,7 @@ bool Sphere::intersect(const Ray &ray, Float &dist) const { - Vector3 V = ray.o - center; + Vector V = ray.o - center; register Float d = -dot(V, ray.dir); register Float Det = d * d - (dot(V,V) - sqr_radius); register Float t1,t2; @@ -54,6 +54,7 @@ return false; } +#ifndef NO_SSE __m128 Sphere::intersect_packet(const RayPacket &rays, __m128 &dists) { VectorPacket V = rays.o - VectorPacket(center); @@ -79,13 +80,14 @@ dists = _mm_or_ps(_mm_and_ps(mask, newdists), _mm_andnot_ps(mask, dists)); return mask; } +#endif /* if there should be CSG sometimes, this may be needed... */ bool Sphere::intersect_all(const Ray &ray, Float dist, vector &allts) const { //allts = new vector(); - Vector3 V = ((Ray)ray).o - center; + Vector V = ((Ray)ray).o - center; Float Vd = - dot(V, ray.dir); Float Det = Vd * Vd - (dot(V,V) - sqr_radius); @@ -175,6 +177,7 @@ return false; } +#ifndef NO_SSE __m128 Box::intersect_packet(const RayPacket &rays, __m128 &dists) { register __m128 tnear = mZero; @@ -215,6 +218,7 @@ dists = _mm_or_ps(_mm_and_ps(mask, tnear), _mm_andnot_ps(mask, dists)); return mask; } +#endif bool Box::intersect_bbox(const BBox &bbox) const { @@ -224,10 +228,10 @@ H.z > bbox.L.z && L.z < bbox.H.z); } -const Vector3 Box::normal(const Vector3 &P) const +const Vector Box::normal(const Vector &P) const { - register Vector3 l = P - L; - register Vector3 h = H - P; + register Vector l = P - L; + register Vector h = H - P; if (l.x < h.x) h.x = -1; @@ -273,7 +277,7 @@ } #ifdef TRI_PLUCKER -inline void Plucker(const Vector3 &p, const Vector3 &q, Float* pl) +inline void Plucker(const Vector &p, const Vector &q, Float* pl) { pl[0] = p.x*q.y - q.x*p.y; pl[1] = p.x*q.z - q.x*p.z; @@ -294,8 +298,8 @@ { material = amaterial; - const Vector3 c = B->P - A->P; - const Vector3 b = C->P - A->P; + const Vector c = B->P - A->P; + const Vector b = C->P - A->P; N = cross(c, b); N.normalize(); @@ -363,8 +367,8 @@ #if defined(TRI_BARI) || defined(TRI_BARI_PRE) static const int modulo3[5] = {0,1,2,0,1}; - const Vector3 &O = ray.o; - const Vector3 &D = ray.dir; + const Vector &O = ray.o; + const Vector &D = ray.dir; register const int u = modulo3[k+1]; register const int v = modulo3[k+2]; #endif @@ -392,8 +396,8 @@ #ifdef TRI_BARI // original barycentric coordinates based intesection // not optimized, just for reference - const Vector3 c = B - A; - const Vector3 b = C - A; + const Vector c = B - A; + const Vector b = C - A; // distance test const Float t = - dot( (O-A), N) / dot(D,N); if (t < Eps || t > dist) @@ -415,7 +419,7 @@ #endif } -#ifdef TRI_BARI_PRE +#if not defined(NO_SSE) and defined(TRI_BARI_PRE) __m128 Triangle::intersect_packet(const RayPacket &rays, __m128 &dists) { static const int modulo3[5] = {0,1,2,0,1}; @@ -463,14 +467,14 @@ bool Triangle::intersect_bbox(const BBox &bbox) const { - const Vector3 boxcenter = (bbox.L+bbox.H)*0.5; - const Vector3 boxhalfsize = (bbox.H-bbox.L)*0.5; - const Vector3 v0 = A->P - boxcenter; - const Vector3 v1 = B->P - boxcenter; - const Vector3 v2 = C->P - boxcenter; - const Vector3 e0 = v1-v0; - const Vector3 e1 = v2-v1; - const Vector3 e2 = v0-v2; + const Vector boxcenter = (bbox.L+bbox.H)*0.5; + const Vector boxhalfsize = (bbox.H-bbox.L)*0.5; + const Vector v0 = A->P - boxcenter; + const Vector v1 = B->P - boxcenter; + const Vector v2 = C->P - boxcenter; + const Vector e0 = v1-v0; + const Vector e1 = v2-v1; + const Vector e2 = v0-v2; Float fex = fabsf(e0.x); Float fey = fabsf(e0.y); @@ -569,7 +573,7 @@ if(min>boxhalfsize.z || max<-boxhalfsize.z) return false; /* test if the box intersects the plane of the triangle */ - Vector3 vmin,vmax; + Vector vmin,vmax; Float v; for(int q=0;q<3;q++) {