Esempio n. 1
0
int dCreateGeomClass (const dGeomClass *c)
{
    dUASSERT(c && c->bytes >= 0 && c->collider && c->aabb,"bad geom class");

    if (num_user_classes >= dMaxUserClasses) {
        dDebug (0,"too many user classes, you must increase the limit and "
            "recompile ODE");
    }
    user_classes[num_user_classes] = *c;
    int class_number = num_user_classes + dFirstUserClass;
    setAllColliders (class_number,&dCollideUserGeomWithGeom);

    num_user_classes++;
    return class_number;
}
static void initColliders()
{
  int i,j;

  if (colliders_initialized) return;
  colliders_initialized = 1;

  memset (colliders,0,sizeof(colliders));

  // setup space colliders
  for (i=dFirstSpaceClass; i <= dLastSpaceClass; i++) {
    for (j=0; j < dGeomNumClasses; j++) {
      setCollider (i,j,&dCollideSpaceGeom);
    }
  }

  setCollider (dSphereClass,dSphereClass,&dCollideSphereSphere);
  setCollider (dSphereClass,dBoxClass,&dCollideSphereBox);
  setCollider (dSphereClass,dPlaneClass,&dCollideSpherePlane);
  setCollider (dBoxClass,dBoxClass,&dCollideBoxBox);
  setCollider (dBoxClass,dPlaneClass,&dCollideBoxPlane);
  setCollider (dCCylinderClass,dSphereClass,&dCollideCCylinderSphere);
  setCollider (dCCylinderClass,dBoxClass,&dCollideCCylinderBox);
  setCollider (dCCylinderClass,dCCylinderClass,&dCollideCCylinderCCylinder);
  setCollider (dCCylinderClass,dPlaneClass,&dCollideCCylinderPlane);
  setCollider (dRayClass,dSphereClass,&dCollideRaySphere);
  setCollider (dRayClass,dBoxClass,&dCollideRayBox);
  setCollider (dRayClass,dCCylinderClass,&dCollideRayCCylinder);
  setCollider (dRayClass,dPlaneClass,&dCollideRayPlane);
#ifdef dTRIMESH_ENABLED
  setCollider (dTriMeshClass,dSphereClass,&dCollideSTL);
  setCollider (dTriMeshClass,dBoxClass,&dCollideBTL);
  setCollider (dTriMeshClass,dRayClass,&dCollideRTL);
  setCollider (dTriMeshClass,dTriMeshClass,&dCollideTTL);
  setCollider (dTriMeshClass,dCCylinderClass,&dCollideCCTL);
#endif
  setAllColliders (dGeomTransformClass,&dCollideTransform);
}
Esempio n. 3
0
/*extern */void dInitColliders()
{
    dIASSERT(!colliders_initialized);
    colliders_initialized = 1;

    memset (colliders,0,sizeof(colliders));

    int i,j;

    // setup space colliders
    for (i=dFirstSpaceClass; i <= dLastSpaceClass; i++) {
        for (j=0; j < dGeomNumClasses; j++) {
            setCollider (i,j,&dCollideSpaceGeom);
        }
    }

    setCollider (dSphereClass,dSphereClass,&dCollideSphereSphere);
    setCollider (dSphereClass,dBoxClass,&dCollideSphereBox);
    setCollider (dSphereClass,dPlaneClass,&dCollideSpherePlane);
    setCollider (dBoxClass,dBoxClass,&dCollideBoxBox);
    setCollider (dBoxClass,dPlaneClass,&dCollideBoxPlane);
    setCollider (dCapsuleClass,dSphereClass,&dCollideCapsuleSphere);
    setCollider (dCapsuleClass,dBoxClass,&dCollideCapsuleBox);
    setCollider (dCapsuleClass,dCapsuleClass,&dCollideCapsuleCapsule);
    setCollider (dCapsuleClass,dPlaneClass,&dCollideCapsulePlane);
    setCollider (dRayClass,dSphereClass,&dCollideRaySphere);
    setCollider (dRayClass,dBoxClass,&dCollideRayBox);
    setCollider (dRayClass,dCapsuleClass,&dCollideRayCapsule);
    setCollider (dRayClass,dPlaneClass,&dCollideRayPlane);
    setCollider (dRayClass,dCylinderClass,&dCollideRayCylinder);
#if dTRIMESH_ENABLED
    setCollider (dTriMeshClass,dSphereClass,&dCollideSTL);
    setCollider (dTriMeshClass,dBoxClass,&dCollideBTL);
    setCollider (dTriMeshClass,dRayClass,&dCollideRTL);
    setCollider (dTriMeshClass,dTriMeshClass,&dCollideTTL);
    setCollider (dTriMeshClass,dCapsuleClass,&dCollideCCTL);
    setCollider (dTriMeshClass,dPlaneClass,&dCollideTrimeshPlane);
    setCollider (dCylinderClass,dTriMeshClass,&dCollideCylinderTrimesh);
#endif

#ifdef dLIBCCD_BOX_CYL
    setCollider (dBoxClass,dCylinderClass,&dCollideBoxCylinderCCD);
#else
    setCollider (dCylinderClass,dBoxClass,&dCollideCylinderBox);
#endif
    setCollider (dCylinderClass,dSphereClass,&dCollideCylinderSphere);
    setCollider (dCylinderClass,dPlaneClass,&dCollideCylinderPlane);

#ifdef dLIBCCD_CYL_CYL
    setCollider (dCylinderClass, dCylinderClass, &dCollideCylinderCylinder);
#endif
#ifdef dLIBCCD_CAP_CYL
    setCollider (dCapsuleClass, dCylinderClass, &dCollideCapsuleCylinder);
#endif

    //--> Convex Collision
#ifdef dLIBCCD_CONVEX_BOX
    setCollider (dConvexClass, dBoxClass, &dCollideConvexBoxCCD);
#else
    setCollider (dConvexClass,dBoxClass,&dCollideConvexBox);
#endif

#ifdef dLIBCCD_CONVEX_CAP
    setCollider (dConvexClass,dCapsuleClass,&dCollideConvexCapsuleCCD);
#else
    setCollider (dConvexClass,dCapsuleClass,&dCollideConvexCapsule);
#endif

#ifdef dLIBCCD_CONVEX_CYL
    setCollider (dConvexClass,dCylinderClass,&dCollideConvexCylinderCCD);
#endif

#ifdef dLIBCCD_CONVEX_SPHERE
    setCollider (dConvexClass,dSphereClass,&dCollideConvexSphereCCD);
#else
    setCollider (dSphereClass,dConvexClass,&dCollideSphereConvex);
#endif

#ifdef dLIBCCD_CONVEX_CONVEX
    setCollider (dConvexClass,dConvexClass,&dCollideConvexConvexCCD);
#else
    setCollider (dConvexClass,dConvexClass,&dCollideConvexConvex);
#endif

    setCollider (dConvexClass,dPlaneClass,&dCollideConvexPlane);
    setCollider (dRayClass,dConvexClass,&dCollideRayConvex);
    //<-- Convex Collision

    //--> dHeightfield Collision
    setCollider (dHeightfieldClass,dRayClass,&dCollideHeightfield);
    setCollider (dHeightfieldClass,dSphereClass,&dCollideHeightfield);
    setCollider (dHeightfieldClass,dBoxClass,&dCollideHeightfield);
    setCollider (dHeightfieldClass,dCapsuleClass,&dCollideHeightfield);
    setCollider (dHeightfieldClass,dCylinderClass,&dCollideHeightfield);
    setCollider (dHeightfieldClass,dConvexClass,&dCollideHeightfield);
#if dTRIMESH_ENABLED
    setCollider (dHeightfieldClass,dTriMeshClass,&dCollideHeightfield);
#endif
    //<-- dHeightfield Collision

    setAllColliders (dGeomTransformClass,&dCollideTransform);
}