| 34 | } |
| 35 | |
| 36 | void TrajectoryNode::update(const double dt) |
| 37 | { |
| 38 | auto getOffset = [&dt](Trajectory& trajectory) { |
| 39 | const double speed |
| 40 | = trajectory.getSpeed() + trajectory.getAcceleration() * dt; |
| 41 | const double radAngle = (Utils::Math::pi / 180.0) * -trajectory.getAngle(); |
| 42 | const double addX = std::cos(radAngle) * (speed * dt); |
| 43 | const double addY = std::sin(radAngle) * (speed * dt); |
| 44 | return Transform::UnitVector(addX, addY, trajectory.getUnit()); |
| 45 | }; |
| 46 | for (auto& trajectory : m_trajectories) |
| 47 | { |
| 48 | Trajectory* currentTrajectory = trajectory.second.get(); |
| 49 | if (currentTrajectory->isEnabled()) |
| 50 | { |
| 51 | auto baseOffset = getOffset(*currentTrajectory); |
| 52 | |
| 53 | for (TrajectoryCheckFunction& check : trajectory.second->getChecks()) |
| 54 | { |
| 55 | check(*currentTrajectory, baseOffset, m_probe); |
| 56 | } |
| 57 | if (!currentTrajectory->getStatic()) |
| 58 | { |
| 59 | currentTrajectory->setSpeed(currentTrajectory->m_speed |
| 60 | + currentTrajectory->m_acceleration * dt); |
| 61 | baseOffset = getOffset(*currentTrajectory); |
| 62 | obe::Collision::CollisionData collData; |
| 63 | collData.offset = baseOffset; |
| 64 | if (m_probe != nullptr) |
| 65 | { |
| 66 | collData |
| 67 | = m_probe->getMaximumDistanceBeforeCollision(collData.offset); |
| 68 | } |
| 69 | auto onCollideCallback = trajectory.second->getOnCollideCallback(); |
| 70 | if (collData.offset != baseOffset && onCollideCallback) |
| 71 | { |
| 72 | onCollideCallback( |
| 73 | *trajectory.second.get(), baseOffset, collData); |
| 74 | } |
| 75 | m_sceneNode.move(collData.offset); |
| 76 | } |
| 77 | } |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | Scene::SceneNode& TrajectoryNode::getSceneNode() const |
| 82 | { |
nothing calls this directly
no test coverage detected