// check to make sure that the avatar and the exclude region are in the same subworld bool plExcludeRegionModifier::ICheckSubworlds(plKey avatar) { plSceneObject* avObj = plSceneObject::ConvertNoRef(avatar->GetObjectPtr()); if (avObj) { // get the avatar modifier const plArmatureMod *avMod = (plArmatureMod*)avObj->GetModifierByType(plArmatureMod::Index()); if (avMod) { // get the avatar controller plPhysicalControllerCore* avController = avMod->GetController(); if (avController) { // get physical of the detector region plPhysical* phys = GetPhysical(GetTarget()); if (phys) { // are they in the same subworld? if ( phys->GetWorldKey() == avController->GetSubworld() ) return true; else return false; } } } } return false; }
int plExcludeRegionModifier::IFindClosestSafePoint(plKey avatar) { float closestDist = 0.f; int closestIdx = -1; plSceneObject* avObj = plSceneObject::ConvertNoRef(avatar->GetObjectPtr()); if (!avObj) return -1; hsVector3 avPos; avObj->GetCoordinateInterface()->GetLocalToWorld().GetTranslate(&avPos); for (int i = 0; i < fSafePoints.size(); i++) { plSceneObject* safeObj = plSceneObject::ConvertNoRef(fSafePoints[i]->GetObjectPtr()); hsVector3 safePos; safeObj->GetCoordinateInterface()->GetLocalToWorld().GetTranslate(&safePos); float dist = (safePos - avPos).Magnitude(); if (dist < closestDist || closestIdx == -1) { closestDist = dist; closestIdx = i; } } return closestIdx; }
plPhysicsSoundMgr::CollidePair::CollidePair(const plKey& firstPhys, const plKey& secondPhys, const hsPoint3& point, const hsVector3& normal) { // To simplify searching and sorting, all pairs are set up with the pointer value of the // first element greater than the pointer value of the second. if (firstPhys->GetObjectPtr() < secondPhys->GetObjectPtr()) { this->firstPhysKey = secondPhys; this->secondPhysKey = firstPhys; } else { this->firstPhysKey = firstPhys; this->secondPhysKey = secondPhys; } this->point = point; this->normalForce = normal; }