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(); }
// 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(); }
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(); }
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(); }
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())); }
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)); }
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)); }
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)); }