Logo Search packages:      
Sourcecode: blender version File versions

dRay_Box.cpp

// 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;
}

Generated by  Doxygen 1.6.0   Back to index