MCPcopy Create free account
hub / github.com/OpenStarbound/OpenStarbound / queryCollisions

Method queryCollisions

source/game/StarMovementController.cpp:1069–1113  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1067}
1068
1069void 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
1115float MovementController::gravity() {
1116 float buoyancy = *m_parameters.liquidBuoyancy * m_liquidPercentage + *m_parameters.airBuoyancy * (1.0f - liquidPercentage());

Callers

nothing calls this directly

Calls 14

centerOfTileFunction · 0.85
emplaceAppendMethod · 0.80
paddedMethod · 0.80
emptyMethod · 0.45
appendMethod · 0.45
takeLastMethod · 0.45
geometryMethod · 0.45
forEachCollisionBlockMethod · 0.45
isNullMethod · 0.45
nearestToMethod · 0.45
minMethod · 0.45
translateMethod · 0.45

Tested by

no test coverage detected