| 1234 | } |
| 1235 | |
| 1236 | void ClientApplication::updateCamera(float dt) { |
| 1237 | if (!m_universeClient->worldClient()) |
| 1238 | return; |
| 1239 | |
| 1240 | WorldCamera& camera = m_worldPainter->camera(); |
| 1241 | camera.update(dt); |
| 1242 | |
| 1243 | if (m_mainInterface->fixedCamera()) |
| 1244 | return; |
| 1245 | |
| 1246 | auto assets = m_root->assets(); |
| 1247 | |
| 1248 | const float triggerRadius = 100.0f; |
| 1249 | const float deadzone = 0.1f; |
| 1250 | const float panFactor = 1.5f; |
| 1251 | float cameraSpeedFactor = 30.0f / m_root->configuration()->get("cameraSpeedFactor").toFloat(); |
| 1252 | cameraSpeedFactor /= (dt * 60.f); |
| 1253 | |
| 1254 | auto playerCameraPosition = m_player->cameraPosition(); |
| 1255 | |
| 1256 | if (isActionTaken(InterfaceAction::CameraShift)) { |
| 1257 | m_snapBackCameraOffset = false; |
| 1258 | m_cameraOffsetDownTime += dt; |
| 1259 | Vec2F aim = m_universeClient->worldClient()->geometry().diff(m_mainInterface->cursorWorldPosition(), playerCameraPosition); |
| 1260 | |
| 1261 | float magnitude = aim.magnitude() / (triggerRadius / camera.pixelRatio()); |
| 1262 | if (magnitude > deadzone) { |
| 1263 | float cameraXOffset = aim.x() / magnitude; |
| 1264 | float cameraYOffset = aim.y() / magnitude; |
| 1265 | magnitude = (magnitude - deadzone) / (1.0 - deadzone); |
| 1266 | if (magnitude > 1) |
| 1267 | magnitude = 1; |
| 1268 | cameraXOffset *= magnitude * 0.5f * camera.pixelRatio() * panFactor; |
| 1269 | cameraYOffset *= magnitude * 0.5f * camera.pixelRatio() * panFactor; |
| 1270 | m_cameraXOffset = (m_cameraXOffset * (cameraSpeedFactor - 1.0) + cameraXOffset) / cameraSpeedFactor; |
| 1271 | m_cameraYOffset = (m_cameraYOffset * (cameraSpeedFactor - 1.0) + cameraYOffset) / cameraSpeedFactor; |
| 1272 | } |
| 1273 | } else { |
| 1274 | if (m_cameraOffsetDownTime > 0.0f && m_cameraOffsetDownTime < 0.333333f) |
| 1275 | m_snapBackCameraOffset = true; |
| 1276 | if (m_snapBackCameraOffset) { |
| 1277 | m_cameraXOffset = (m_cameraXOffset * (cameraSpeedFactor - 1.0)) / cameraSpeedFactor; |
| 1278 | m_cameraYOffset = (m_cameraYOffset * (cameraSpeedFactor - 1.0)) / cameraSpeedFactor; |
| 1279 | } |
| 1280 | m_cameraOffsetDownTime = 0.f; |
| 1281 | } |
| 1282 | Vec2F newCameraPosition; |
| 1283 | |
| 1284 | newCameraPosition.setX(playerCameraPosition.x()); |
| 1285 | newCameraPosition.setY(playerCameraPosition.y()); |
| 1286 | |
| 1287 | auto baseCamera = newCameraPosition; |
| 1288 | |
| 1289 | const float cameraSmoothRadius = assets->json("/interface.config:cameraSmoothRadius").toFloat(); |
| 1290 | const float cameraSmoothFactor = assets->json("/interface.config:cameraSmoothFactor").toFloat(); |
| 1291 | |
| 1292 | auto cameraSmoothDistance = m_universeClient->worldClient()->geometry().diff(m_cameraPositionSmoother, newCameraPosition).magnitude(); |
| 1293 | if (cameraSmoothDistance > cameraSmoothRadius) { |
nothing calls this directly
no test coverage detected