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