bool CollisionManager::checkLineOfSightWorldToCell(const Vector3& rayOrigin, const Vector3& rayEnd, float distance, CellObject* cellObject) { ManagedReference<SceneObject*> building = cellObject->getParent(); if (building == NULL) return true; SharedObjectTemplate* objectTemplate = building->getObjectTemplate(); PortalLayout* portalLayout = objectTemplate->getPortalLayout(); if (portalLayout == NULL) return true; Ray ray = convertToModelSpace(rayOrigin, rayEnd, building); if (cellObject->getCellNumber() >= portalLayout->getAppearanceTemplatesSize()) return true; MeshAppearanceTemplate* app = portalLayout->getMeshAppearanceTemplate(cellObject->getCellNumber()); AABBTree* aabbTree = app->getAABBTree(); if (aabbTree == NULL) return true; float intersectionDistance; Triangle* triangle = NULL; if (aabbTree->intersects(ray, distance, intersectionDistance, triangle, true)) return false; return true; }
bool CollisionManager::checkLineOfSightInBuilding(SceneObject* object1, SceneObject* object2, SceneObject* building) { SharedObjectTemplate* objectTemplate = building->getObjectTemplate(); PortalLayout* portalLayout = objectTemplate->getPortalLayout(); if (portalLayout == NULL) return true; //we are in model space... in cells Vector3 rayOrigin = object1->getPosition(); rayOrigin.set(rayOrigin.getX(), rayOrigin.getY(), rayOrigin.getZ() + 1.f); Vector3 rayEnd = object2->getPosition(); rayEnd.set(rayEnd.getX(), rayEnd.getY(), rayEnd.getZ() + 1.f); Vector3 direction(Vector3(rayEnd - rayOrigin)); direction.normalize(); float distance = rayEnd.distanceTo(rayOrigin); float intersectionDistance; Ray ray(rayOrigin, direction); Triangle* triangle = NULL; // we check interior cells for (int i = 1; i < portalLayout->getAppearanceTemplatesSize(); ++i) { MeshAppearanceTemplate* app = portalLayout->getMeshAppearanceTemplate(i); AABBTree* aabbTree = app->getAABBTree(); if (aabbTree == NULL) continue; if (aabbTree->intersects(ray, distance, intersectionDistance, triangle, true)) return false; } return true; }