static PX_FORCE_INLINE PxU32 handleObstacleHit(const PxObstacle& touchedObstacle, PxControllerObstacleHit& hit, const PxInternalCBData_OnHit* internalData, Controller* controller) { hit.userData = touchedObstacle.mUserData; const_cast<PxInternalCBData_OnHit*>(internalData)->touchedObstacle = &touchedObstacle; // (*) PT: TODO: revisit controller->mCallback->onObstacleHit(hit); PxControllerBehaviorCallback* behaviorCB = controller->mBehaviorCallback; return behaviorCB ? behaviorCB->getBehaviorFlags(touchedObstacle) : defaultBehaviorFlags; }
PxU32 Cct::userHitCallback(const InternalCBData_OnHit* userData, const SweptContact& contact, const PxVec3& dir, float length) { const PxInternalCBData_OnHit* internalData = static_cast<const PxInternalCBData_OnHit*>(userData); Controller* controller = internalData->controller; const PxU32 objectCode = (PxU32)(size_t)contact.mGeom->mTGUserData; const UserObjectType type = decodeType(objectCode); const PxU32 index = decodeIndex(objectCode); if(type==USER_OBJECT_CCT) { PX_ASSERT(index<controller->mManager->getNbControllers()); Controller** controllers = controller->mManager->getControllers(); Controller* other = controllers[index]; PxControllersHit hit; fillCCTHit(hit, contact, dir, length, controller); hit.other = other->getPxController(); if(controller->mReportCallback) controller->mReportCallback->onControllerHit(hit); PxControllerBehaviorCallback* behaviorCB = controller->mBehaviorCallback; return behaviorCB ? behaviorCB->getBehaviorFlags(*hit.other) : defaultBehaviorFlags; } else if(type==USER_OBJECT_BOX_OBSTACLE) { PX_ASSERT(internalData->obstacles); PX_ASSERT(index<internalData->obstacles->mBoxObstacles.size()); PxControllerObstacleHit hit; fillCCTHit(hit, contact, dir, length, controller); const ObstacleContext::InternalBoxObstacle& obstacle = internalData->obstacles->mBoxObstacles[index]; const PxBoxObstacle& touchedObstacle = obstacle.mData; return handleObstacleHit(touchedObstacle, obstacle.mHandle , hit, internalData, controller); } else if(type==USER_OBJECT_CAPSULE_OBSTACLE) { PX_ASSERT(internalData->obstacles); PX_ASSERT(index<internalData->obstacles->mCapsuleObstacles.size()); PxControllerObstacleHit hit; fillCCTHit(hit, contact, dir, length, controller); const ObstacleContext::InternalCapsuleObstacle& obstacle = internalData->obstacles->mCapsuleObstacles[index]; const PxCapsuleObstacle& touchedObstacle = obstacle.mData; return handleObstacleHit(touchedObstacle, obstacle.mHandle, hit, internalData, controller); } else PX_ASSERT(0); return defaultBehaviorFlags; }
PxU32 Cct::shapeHitCallback(const InternalCBData_OnHit* userData, const SweptContact& contact, const PxVec3& dir, float length) { Controller* controller = static_cast<const PxInternalCBData_OnHit*>(userData)->controller; if(!controller->mCallback) return defaultBehaviorFlags; PxControllerShapeHit hit; fillCCTHit(hit, contact, dir, length, controller); hit.shape = (PxShape*)contact.mGeom->mUserData; hit.triangleIndex = contact.mTriangleIndex; controller->mCallback->onShapeHit(hit); PxControllerBehaviorCallback* behaviorCB = controller->mBehaviorCallback; return behaviorCB ? behaviorCB->getBehaviorFlags(*hit.shape) : defaultBehaviorFlags; }