| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- // Ripped from Magic Software
- #include "Include\dRay.h"
- #include "dxRay.h"
- bool Clip(dReal Denom, dReal Numer, dReal& T0, dReal& T1){
- // Return value is 'true' if line segment intersects the current test
- // plane. Otherwise 'false' is returned in which case the line segment
- // is entirely clipped.
-
- if (Denom > REAL(0.0)){
- if (Numer > Denom * T1){
- return false;
- }
- if (Numer > Denom * T0){
- T0 = Numer / Denom;
- }
- return true;
- }
- else if (Denom < REAL(0.0)){
- if (Numer > Denom * T0){
- return false;
- }
- if (Numer > Denom * T1){
- T1 = Numer / Denom;
- }
- return true;
- }
- else return Numer <= REAL(0.0);
- }
- bool FindIntersection(const dVector3 Origin, const dVector3 Direction, const dVector3 Extents, dReal& T0, dReal& T1){
- dReal SaveT0 = T0;
- dReal SaveT1 = T1;
- bool NotEntirelyClipped =
- Clip(+Direction[0], -Origin[0] - Extents[0], T0, T1) &&
- Clip(-Direction[0], +Origin[0] - Extents[0], T0, T1) &&
- Clip(+Direction[1], -Origin[1] - Extents[1], T0, T1) &&
- Clip(-Direction[1], +Origin[1] - Extents[1], T0, T1) &&
- Clip(+Direction[2], -Origin[2] - Extents[2], T0, T1) &&
- Clip(-Direction[2], +Origin[2] - Extents[2], T0, T1);
- return NotEntirelyClipped && (T0 != SaveT0 || T1 != SaveT1);
- }
- int dCollideBR(dxGeom* RayGeom, dxGeom* BoxGeom, int Flags, dContactGeom* Contacts, int Stride){
- const dVector3& Position = *(const dVector3*)dGeomGetPosition(BoxGeom);
- const dMatrix3& Rotation = *(const dMatrix3*)dGeomGetRotation(BoxGeom);
- dVector3 Extents;
- dGeomBoxGetLengths(BoxGeom, Extents);
- Extents[0] /= 2;
- Extents[1] /= 2;
- Extents[2] /= 2;
- Extents[3] /= 2;
- dVector3 Origin, Direction;
- dGeomRayGet(RayGeom, Origin, Direction);
- dReal Length = dGeomRayGetLength(RayGeom);
- dVector3 Diff;
- Diff[0] = Origin[0] - Position[0];
- Diff[1] = Origin[1] - Position[1];
- Diff[2] = Origin[2] - Position[2];
- Diff[3] = Origin[3] - Position[3];
- Direction[0] *= Length;
- Direction[1] *= Length;
- Direction[2] *= Length;
- Direction[3] *= Length;
- dVector3 Rot[3];
- Decompose(Rotation, Rot);
- dVector3 TransOrigin;
- TransOrigin[0] = dDOT(Diff, Rot[0]);
- TransOrigin[1] = dDOT(Diff, Rot[1]);
- TransOrigin[2] = dDOT(Diff, Rot[2]);
- TransOrigin[3] = REAL(0.0);
- dVector3 TransDirection;
- TransDirection[0] = dDOT(Direction, Rot[0]);
- TransDirection[1] = dDOT(Direction, Rot[1]);
- TransDirection[2] = dDOT(Direction, Rot[2]);
- TransDirection[3] = REAL(0.0);
- dReal T[2];
- T[0] = 0.0f;
- T[1] = dInfinity;
- bool Intersect = FindIntersection(TransOrigin, TransDirection, Extents, T[0], T[1]);
- if (Intersect){
- if (T[0] > REAL(0.0)){
- dContactGeom* Contact0 = CONTACT(Flags, Contacts, 0, Stride);
- Contact0->pos[0] = Origin[0] + T[0] * Direction[0];
- Contact0->pos[1] = Origin[1] + T[0] * Direction[1];
- Contact0->pos[2] = Origin[2] + T[0] * Direction[2];
- Contact0->pos[3] = Origin[3] + T[0] * Direction[3];
- //Contact0->normal = 0;
- Contact0->depth = 0.0f;
- Contact0->g1 = RayGeom;
- Contact0->g2 = BoxGeom;
- dContactGeom* Contact1 = CONTACT(Flags, Contacts, 1, Stride);
- Contact1->pos[0] = Origin[0] + T[1] * Direction[0];
- Contact1->pos[1] = Origin[1] + T[1] * Direction[1];
- Contact1->pos[2] = Origin[2] + T[1] * Direction[2];
- Contact1->pos[3] = Origin[3] + T[1] * Direction[3];
- //Contact1->normal = 0;
- Contact1->depth = 0.0f;
- Contact1->g1 = RayGeom;
- Contact1->g2 = BoxGeom;
- return 2;
- }
- else{
- dContactGeom* Contact = CONTACT(Flags, Contacts, 0, Stride);
- Contact->pos[0] = Origin[0] + T[1] * Direction[0];
- Contact->pos[1] = Origin[1] + T[1] * Direction[1];
- Contact->pos[2] = Origin[2] + T[1] * Direction[2];
- Contact->pos[3] = Origin[3] + T[1] * Direction[3];
- //Contact->normal = 0;
- Contact->depth = 0.0f;
- Contact->g1 = RayGeom;
- Contact->g2 = BoxGeom;
- return 1;
- }
- }
- else return 0;
- }
|