float ZoneImplementation::getHeight(float x, float y) { if (planetManager != NULL) { TerrainManager* manager = planetManager->getTerrainManager(); if (manager != NULL) return manager->getHeight(x, y); } return 0; }
Vector3 MissionObjectiveImplementation::getEndPosition() { ManagedReference<MissionObject* > mission = this->mission.get(); Vector3 missionEndPoint; missionEndPoint.setX(mission->getEndPositionX()); missionEndPoint.setY(mission->getEndPositionY()); TerrainManager* terrain = getPlayerOwner().get()->getZone()->getPlanetManager()->getTerrainManager(); missionEndPoint.setZ(terrain->getHeight(missionEndPoint.getX(), missionEndPoint.getY())); return missionEndPoint; }
Vector3 ReconMissionObjectiveImplementation::getEndPosition() { ManagedReference<MissionObject* > mission = this->mission.get(); Vector3 missionEndPoint; missionEndPoint.setX(mission->getStartPositionX()); missionEndPoint.setY(mission->getStartPositionY()); Zone* zone = getPlayerOwner().get()->getZone(); if (zone != NULL) { TerrainManager* terrain = zone->getPlanetManager()->getTerrainManager(); missionEndPoint.setZ(terrain->getHeight(missionEndPoint.getX(), missionEndPoint.getY())); } return missionEndPoint; }
bool CollisionManager::checkShipCollision(ShipObject* ship, const Vector3& targetPosition, Vector3& collisionPoint) { Zone* zone = ship->getZone(); if (zone == NULL) return false; TerrainManager* terrainManager = zone->getPlanetManager()->getTerrainManager(); if (terrainManager->getProceduralTerrainAppearance() != NULL) { float height = terrainManager->getHeight(targetPosition.getX(), targetPosition.getY()); float waterHeight = -16368.f; if (terrainManager->getWaterHeight(targetPosition.getY(), targetPosition.getY(), waterHeight)) height = MAX(waterHeight, height); if (height > targetPosition.getZ()) { collisionPoint = targetPosition; collisionPoint.setZ(height); //ship->info("colliding with terrain", true); return true; } } Vector3 rayOrigin = ship->getWorldPosition(); rayOrigin.set(rayOrigin.getX(), rayOrigin.getY(), rayOrigin.getZ()); Vector3 rayEnd; rayEnd.set(targetPosition.getX(), targetPosition.getY(), targetPosition.getZ()); float dist = rayEnd.distanceTo(rayOrigin); float intersectionDistance; Triangle* triangle = NULL; SortedVector<ManagedReference<QuadTreeEntry*> > objects(512, 512); zone->getInRangeObjects(targetPosition.getX(), targetPosition.getY(), 512, &objects, true); for (int i = 0; i < objects.size(); ++i) { AABBTree* aabbTree = NULL; SceneObject* scno = cast<SceneObject*>(objects.get(i).get()); try { aabbTree = getAABBTree(scno, -1); if (aabbTree == NULL) continue; } catch (Exception& e) { aabbTree = NULL; } catch (...) { throw; } if (aabbTree != NULL) { //moving ray to model space try { Ray ray = convertToModelSpace(rayOrigin, rayEnd, scno); //structure->info("checking ray with building dir" + String::valueOf(structure->getDirectionAngle()), true); if (aabbTree->intersects(ray, dist, intersectionDistance, triangle, true)) { //rayOrigin.set(rayOrigin.getX(), rayOrigin.getY(), rayOrigin.getZ()); Vector3 direction = rayEnd - rayOrigin; direction.normalize(); //intersectionDistance -= 0.5f; collisionPoint.set(rayOrigin.getX() + (direction.getX() * intersectionDistance), rayOrigin.getY() + (direction.getY() * intersectionDistance), rayOrigin.getZ() + (direction.getZ() * intersectionDistance)); //ship->info("colliding with building", true); return true; } } catch (Exception& e) { ship->error(e.getMessage()); } catch (...) { throw; } } } return false; }
float CollisionManager::getWorldFloorCollision(float x, float y, Zone* zone, bool testWater) { SortedVector<ManagedReference<QuadTreeEntry*> > closeObjects; zone->getInRangeObjects(x, y, 128, &closeObjects, true); PlanetManager* planetManager = zone->getPlanetManager(); if (planetManager == NULL) return 0.f; float height = 0; TerrainManager* terrainManager = planetManager->getTerrainManager(); //need to include exclude affectors in the terrain calcs height = terrainManager->getHeight(x, y); Vector3 rayStart(x, 16384.f, y); Vector3 rayEnd(x, -16384.f, y); Triangle* triangle = NULL; if (testWater) { float waterHeight; if (terrainManager->getWaterHeight(x, y, waterHeight)) if (waterHeight > height) height = waterHeight; } float intersectionDistance; for (int i = 0; i < closeObjects.size(); ++i) { BuildingObject* building = dynamic_cast<BuildingObject*>(closeObjects.get(i).get()); if (building == NULL) continue; //building->getObjectTemplate()->get SharedObjectTemplate* templateObject = building->getObjectTemplate(); if (templateObject == NULL) continue; PortalLayout* portalLayout = templateObject->getPortalLayout(); if (portalLayout == NULL) continue; if (portalLayout->getFloorMeshNumber() == 0) continue; //find nearest entrance FloorMesh* exteriorFloorMesh = portalLayout->getFloorMesh(0); // get outside layout AABBTree* aabbTree = exteriorFloorMesh->getAABBTree(); if (aabbTree == NULL) continue; Ray ray = convertToModelSpace(rayStart, rayEnd, building); if (aabbTree->intersects(ray, 16384 * 2, intersectionDistance, triangle, true)) { float floorHeight = 16384 - intersectionDistance; if (floorHeight > height) height = floorHeight; } } return height; }