Esempio n. 1
0
void principia__AddVesselToNextPhysicsBubble(Plugin* const plugin,
                                             char const* const vessel_guid,
                                             KSPPart const* const parts,
                                             int count) {
  journal::Method<journal::AddVesselToNextPhysicsBubble> m({plugin,
                                                            vessel_guid,
                                                            parts,
                                                            count});
  VLOG(1) << __FUNCTION__ << '\n' << NAMED(count);
  CHECK_NOTNULL(plugin);
  std::vector<principia::ksp_plugin::IdAndOwnedPart> vessel_parts;
  vessel_parts.reserve(count);
  for (KSPPart const* part = parts; part < parts + count; ++part) {
    vessel_parts.push_back(
        std::make_pair(
            part->id,
            make_not_null_unique<Part<World>>(
                DegreesOfFreedom<World>(
                    World::origin +
                        Displacement<World>(
                            FromXYZ(part->world_position) * Metre),
                    Velocity<World>(
                        FromXYZ(part->world_velocity) * (Metre / Second))),
                part->mass_in_tonnes * Tonne,
                Vector<Acceleration, World>(
                    FromXYZ(
                        part->gravitational_acceleration_to_be_applied_by_ksp) *
                    (Metre / Pow<2>(Second))))));
  }
  plugin->AddVesselToNextPhysicsBubble(vessel_guid, std::move(vessel_parts));
  return m.Return();
}
Esempio n. 2
0
// Calls |plugin->SetVesselStateOffset| with the arguments given.
// |plugin| must not be null.  No transfer of ownership.
void principia__SetVesselStateOffset(Plugin* const plugin,
                                     char const* const vessel_guid,
                                     QP const from_parent) {
  journal::Method<journal::SetVesselStateOffset> m({plugin,
                                                    vessel_guid,
                                                    from_parent});
  CHECK_NOTNULL(plugin);
  plugin->SetVesselStateOffset(
      vessel_guid,
      RelativeDegreesOfFreedom<AliceSun>(
          Displacement<AliceSun>(FromXYZ(from_parent.q) * Metre),
          Velocity<AliceSun>(FromXYZ(from_parent.p) * (Metre / Second))));
  return m.Return();
}
Esempio n. 3
0
void principia__FlightPlanRenderedApsides(Plugin const* const plugin,
                                          char const* const vessel_guid,
                                          int const celestial_index,
                                          XYZ const sun_world_position,
                                          Iterator** const apoapsides,
                                          Iterator** const periapsides) {
  journal::Method<journal::FlightPlanRenderedApsides> m(
      {plugin, vessel_guid, celestial_index, sun_world_position},
      {apoapsides, periapsides});
  CHECK_NOTNULL(plugin);
  DiscreteTrajectory<Barycentric>::Iterator begin;
  DiscreteTrajectory<Barycentric>::Iterator end;
  GetFlightPlan(*plugin, vessel_guid).GetAllSegments(begin, end);
  Position<World> q_sun =
      World::origin +
      Displacement<World>(FromXYZ(sun_world_position) * Metre);
  std::unique_ptr<DiscreteTrajectory<World>> rendered_apoapsides;
  std::unique_ptr<DiscreteTrajectory<World>> rendered_periapsides;
  plugin->ComputeAndRenderApsides(celestial_index,
                                  begin, end,
                                  q_sun,
                                  rendered_apoapsides,
                                  rendered_periapsides);
  *apoapsides = new TypedIterator<DiscreteTrajectory<World>>(
      check_not_null(std::move(rendered_apoapsides)),
      plugin);
  *periapsides = new TypedIterator<DiscreteTrajectory<World>>(
      check_not_null(std::move(rendered_periapsides)),
      plugin);
  return m.Return();
}
Esempio n. 4
0
void principia__RenderedPredictionApsides(Plugin const* const plugin,
                                          char const* const vessel_guid,
                                          int const celestial_index,
                                          XYZ const sun_world_position,
                                          Iterator** const apoapsides,
                                          Iterator** const periapsides) {
  journal::Method<journal::RenderedPredictionApsides> m(
      {plugin, vessel_guid, celestial_index, sun_world_position},
      {apoapsides, periapsides});
  CHECK_NOTNULL(plugin);
  auto const& prediction = plugin->GetVessel(vessel_guid)->prediction();
  Position<World> q_sun =
      World::origin +
      Displacement<World>(FromXYZ(sun_world_position) * Metre);
  std::unique_ptr<DiscreteTrajectory<World>> rendered_apoapsides;
  std::unique_ptr<DiscreteTrajectory<World>> rendered_periapsides;
  plugin->ComputeAndRenderApsides(celestial_index,
                                  prediction.Fork(),
                                  prediction.End(),
                                  q_sun,
                                  rendered_apoapsides,
                                  rendered_periapsides);
  *apoapsides = new TypedIterator<DiscreteTrajectory<World>>(
      check_not_null(std::move(rendered_apoapsides)),
      plugin);
  *periapsides = new TypedIterator<DiscreteTrajectory<World>>(
      check_not_null(std::move(rendered_periapsides)),
      plugin);
  return m.Return();
}
Esempio n. 5
0
WXYZ principia__NavballOrientation(
    Plugin const* const plugin,
    XYZ const sun_world_position,
    XYZ const ship_world_position) {
  journal::Method<journal::NavballOrientation> m({plugin,
                                                  sun_world_position,
                                                  ship_world_position});
  CHECK_NOTNULL(plugin);
  FrameField<World> const frame_field = plugin->Navball(
      World::origin +
          Displacement<World>(FromXYZ(sun_world_position) * Metre));
  return m.Return(ToWXYZ(
      frame_field(
          World::origin +
              Displacement<World>(
                  FromXYZ(ship_world_position) * Metre)).quaternion()));
}
Esempio n. 6
0
XYZ principia__BubbleDisplacementCorrection(Plugin const* const plugin,
                                            XYZ const sun_position) {
  journal::Method<journal::BubbleDisplacementCorrection> m({plugin,
                                                            sun_position});
  CHECK_NOTNULL(plugin);
  Displacement<World> const result =
      plugin->BubbleDisplacementCorrection(
          World::origin + Displacement<World>(FromXYZ(sun_position) * Metre));
  return m.Return(ToXYZ(result.coordinates() / Metre));
}
Esempio n. 7
0
Iterator* principia__RenderedPrediction(Plugin* const plugin,
                                        char const* const vessel_guid,
                                        XYZ const sun_world_position) {
  journal::Method<journal::RenderedPrediction> m({plugin,
                                                  vessel_guid,
                                                  sun_world_position});
  CHECK_NOTNULL(plugin);
  auto rendered_trajectory = plugin->RenderedPrediction(
      vessel_guid,
      World::origin + Displacement<World>(FromXYZ(sun_world_position) * Metre));
  return m.Return(new TypedIterator<DiscreteTrajectory<World>>(
      std::move(rendered_trajectory),
      plugin));
}
Esempio n. 8
0
Iterator* principia__FlightPlanRenderedSegment(
    Plugin const* const plugin,
    char const* const vessel_guid,
    XYZ const sun_world_position,
    int const index) {
  journal::Method<journal::FlightPlanRenderedSegment> m({plugin,
                                                         vessel_guid,
                                                         sun_world_position,
                                                         index});
  CHECK_NOTNULL(plugin);
  DiscreteTrajectory<Barycentric>::Iterator begin;
  DiscreteTrajectory<Barycentric>::Iterator end;
  GetFlightPlan(*plugin, vessel_guid).GetSegment(index, begin, end);
  auto rendered_trajectory = CHECK_NOTNULL(plugin)->
      RenderedTrajectoryFromIterators(
          begin, end,
          World::origin + Displacement<World>(
                              FromXYZ(sun_world_position) * Metre));
  return m.Return(new TypedIterator<DiscreteTrajectory<World>>(
      std::move(rendered_trajectory),
      plugin));
}