| 1067 | } |
| 1068 | |
| 1069 | void MovementController::queryCollisions(RectF const& region) { |
| 1070 | while (!m_workingCollisions.empty()) { |
| 1071 | m_collisionBuffers.append(m_workingCollisions.takeLast().poly); |
| 1072 | } |
| 1073 | |
| 1074 | auto newCollisionPoly = [this]() -> CollisionPoly& { |
| 1075 | if (!m_collisionBuffers.empty()) |
| 1076 | return m_workingCollisions.emplaceAppend(CollisionPoly{ |
| 1077 | m_collisionBuffers.takeLast(), {}, {}, {}, {}, {} |
| 1078 | }); |
| 1079 | else |
| 1080 | return m_workingCollisions.emplaceAppend(CollisionPoly{}); |
| 1081 | }; |
| 1082 | |
| 1083 | auto geometry = world()->geometry(); |
| 1084 | |
| 1085 | world()->forEachCollisionBlock(RectI::integral(region.padded(1)), [&](CollisionBlock const& block) { |
| 1086 | if (block.kind != CollisionKind::None && !block.poly.isNull()) { |
| 1087 | RectF polyBounds = block.polyBounds; |
| 1088 | Vec2F basePosition = block.poly.vertex(0); |
| 1089 | Vec2F nearTranslation = geometry.nearestTo(region.min(), basePosition) - basePosition; |
| 1090 | polyBounds.translate(nearTranslation); |
| 1091 | |
| 1092 | if (region.intersects(polyBounds)) { |
| 1093 | CollisionPoly& collisionPoly = newCollisionPoly(); |
| 1094 | collisionPoly.poly = block.poly; |
| 1095 | collisionPoly.poly.translate(nearTranslation); |
| 1096 | collisionPoly.polyBounds = polyBounds; |
| 1097 | collisionPoly.sortPosition = centerOfTile(block.space); |
| 1098 | collisionPoly.movingCollisionId = {}; |
| 1099 | collisionPoly.collisionKind = block.kind; |
| 1100 | } |
| 1101 | } |
| 1102 | }); |
| 1103 | |
| 1104 | forEachMovingCollision(region, [&](MovingCollisionId id, PhysicsMovingCollision mc, PolyF poly, RectF bounds) { |
| 1105 | CollisionPoly& collisionPoly = newCollisionPoly(); |
| 1106 | collisionPoly.poly = std::move(poly); |
| 1107 | collisionPoly.polyBounds = bounds; |
| 1108 | collisionPoly.sortPosition = collisionPoly.poly.center(); |
| 1109 | collisionPoly.movingCollisionId = id; |
| 1110 | collisionPoly.collisionKind = mc.collisionKind; |
| 1111 | return true; |
| 1112 | }); |
| 1113 | } |
| 1114 | |
| 1115 | float MovementController::gravity() { |
| 1116 | float buoyancy = *m_parameters.liquidBuoyancy * m_liquidPercentage + *m_parameters.airBuoyancy * (1.0f - liquidPercentage()); |
nothing calls this directly
no test coverage detected