| 1312 | } |
| 1313 | |
| 1314 | void Landscape::PredictCollision(VehicleCollisionBuffer& ret, const Vehicle* vehicle, float maxTime, float gap, |
| 1315 | float maxDistance) const |
| 1316 | { |
| 1317 | // Note: allow exclusions (e.g. bridges, gas-stations) |
| 1318 | float vRadius = vehicle->CollisionSize() * 0.8; |
| 1319 | float maxDist2 = vehicle->Speed().SquareSize() * Square(maxTime); |
| 1320 | saturateMax(maxDist2, Square(maxDistance)); |
| 1321 | float radius = maxDist2 * InvSqrt(maxDist2); |
| 1322 | int xMin, xMax, zMin, zMax; |
| 1323 | Vector3Val vehPos = vehicle->Position(); |
| 1324 | ::ObjRadiusRectangle(xMin, xMax, zMin, zMax, vehPos, radius); |
| 1325 | for (int x = xMin; x <= xMax; x++) |
| 1326 | { |
| 1327 | for (int z = zMin; z <= zMax; z++) |
| 1328 | { |
| 1329 | const ObjectListFull* list = _objects(x, z).GetList(); |
| 1330 | if (!list || list->GetNonStaticCount() <= 0) |
| 1331 | { |
| 1332 | continue; // no vehicles in this list |
| 1333 | } |
| 1334 | for (int i = 0; i < list->Size(); i++) |
| 1335 | { |
| 1336 | const Object* obj = list->Get(i); |
| 1337 | if (obj->GetType() != TypeVehicle) |
| 1338 | { |
| 1339 | continue; |
| 1340 | } |
| 1341 | if (obj->Position().Distance2Inline(vehPos) > maxDist2) |
| 1342 | { |
| 1343 | continue; |
| 1344 | } |
| 1345 | const EntityAI* ai = dyn_cast<const EntityAI>(obj); |
| 1346 | if (!ai) |
| 1347 | { |
| 1348 | continue; |
| 1349 | } |
| 1350 | if (!obj->GetShape()) |
| 1351 | { |
| 1352 | continue; |
| 1353 | } |
| 1354 | if (!obj->GetShape()->GeometryLevel()) |
| 1355 | { |
| 1356 | continue; |
| 1357 | } |
| 1358 | if (!obj->HasGeometry()) |
| 1359 | { |
| 1360 | continue; |
| 1361 | } |
| 1362 | if (obj == vehicle) |
| 1363 | { |
| 1364 | continue; |
| 1365 | } |
| 1366 | float minTime = |
| 1367 | NearestPoint(vehicle->Position(), vehicle->Speed(), obj->Position(), obj->ObjectSpeed()); |
| 1368 | saturate(minTime, 0, maxTime); |
| 1369 | Vector3 pt1 = vehicle->Position() + vehicle->Speed() * minTime; |
| 1370 | Vector3 pt2 = obj->Position() + obj->ObjectSpeed() * minTime; |
| 1371 | float minDist2 = pt1.Distance2Inline(pt2); |
no test coverage detected