Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 7f4a4ab76fdd
Choose a base ref
...
head repository: mockingbirdnest/Principia
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 0633a8a5ecb7
Choose a head ref
  • 7 commits
  • 16 files changed
  • 1 contributor

Commits on Jan 27, 2020

  1. Copy the full SHA
    2a54ca0 View commit details
  2. Part serialization.

    pleroy committed Jan 27, 2020
    Copy the full SHA
    0343b54 View commit details

Commits on Jan 28, 2020

  1. Change interfacing for parts.

    pleroy committed Jan 28, 2020
    Copy the full SHA
    dd3a4d3 View commit details
  2. Back to safety.

    pleroy committed Jan 28, 2020
    Copy the full SHA
    79f533a View commit details
  3. Use the new interface.

    pleroy committed Jan 28, 2020
    Copy the full SHA
    3bc2618 View commit details
  4. Copy the full SHA
    2a09f90 View commit details

Commits on Jan 29, 2020

  1. Merge pull request #2463 from pleroy/Torque

    Propagates the torques and the force positions to the parts
    pleroy authored Jan 29, 2020
    Copy the full SHA
    0633a8a View commit details
75 changes: 0 additions & 75 deletions ksp_plugin/interface.cpp
Original file line number Diff line number Diff line change
@@ -48,7 +48,6 @@
#include "ksp_plugin/iterators.hpp"
#include "ksp_plugin/part.hpp"
#include "physics/kepler_orbit.hpp"
#include "physics/rigid_motion.hpp"
#include "physics/solar_system.hpp"
#include "quantities/astronomy.hpp"
#include "quantities/parser.hpp"
@@ -108,7 +107,6 @@ using physics::RotatingBody;
using physics::SolarSystem;
using quantities::Acceleration;
using quantities::DebugString;
using quantities::Force;
using quantities::Mass;
using quantities::MomentOfInertia;
using quantities::ParseQuantity;
@@ -119,9 +117,7 @@ using quantities::Time;
using quantities::astronomy::AstronomicalUnit;
using quantities::si::Day;
using quantities::si::Degree;
using quantities::si::Kilo;
using quantities::si::Metre;
using quantities::si::Newton;
using quantities::si::Radian;
using quantities::si::Second;
using quantities::si::Tonne;
@@ -279,24 +275,6 @@ serialization::GravityModel::Body MakeGravityModel(
return gravity_model;
}

RigidMotion<RigidPart, World> MakePartRigidMotion(
QP const& part_world_degrees_of_freedom,
WXYZ const& part_rotation,
XYZ const& part_angular_velocity) {
DegreesOfFreedom<World> const part_degrees_of_freedom =
FromQP<DegreesOfFreedom<World>>(part_world_degrees_of_freedom);
Rotation<RigidPart, World> const part_to_world(FromWXYZ(part_rotation));
RigidTransformation<RigidPart, World> const part_rigid_transformation(
RigidPart::origin,
part_degrees_of_freedom.position(),
part_to_world.Forget<OrthogonalMap>());
RigidMotion<RigidPart, World> part_rigid_motion(
part_rigid_transformation,
FromXYZ<AngularVelocity<World>>(part_angular_velocity),
part_degrees_of_freedom.velocity());
return part_rigid_motion;
}

std::unique_ptr<google::compression::Compressor> NewCompressor(
std::string_view const compressor) {
if (compressor.empty()) {
@@ -577,25 +555,6 @@ int __cdecl principia__GetBufferedLogging() {
return m.Return(FLAGS_logbuflevel);
}

QP __cdecl principia__GetPartActualDegreesOfFreedom(Plugin const* const plugin,
PartId const part_id,
Origin const origin) {
journal::Method<journal::GetPartActualDegreesOfFreedom> m(
{plugin, part_id, origin});
CHECK_NOTNULL(plugin);
return m.Return(ToQP(
plugin->GetPartActualDegreesOfFreedom(
part_id,
plugin->BarycentricToWorld(
origin.reference_part_is_unmoving,
origin.reference_part_id,
origin.reference_part_is_at_origin
? std::nullopt
: std::make_optional(
FromXYZ<Position<World>>(
origin.main_body_centre_in_world))))));
}

int __cdecl principia__GetStderrLogging() {
journal::Method<journal::GetStderrLogging> m;
return m.Return(FLAGS_stderrthreshold);
@@ -644,18 +603,6 @@ bool __cdecl principia__HasVessel(Plugin* const plugin,
return m.Return(plugin->HasVessel(vessel_guid));
}

void __cdecl principia__IncrementPartIntrinsicForce(
Plugin* const plugin,
PartId const part_id,
XYZ const force_in_kilonewtons) {
journal::Method<journal::IncrementPartIntrinsicForce> m(
{plugin, part_id, force_in_kilonewtons});
CHECK_NOTNULL(plugin)->IncrementPartIntrinsicForce(
part_id,
Vector<Force, World>(FromXYZ(force_in_kilonewtons) * Kilo(Newton)));
return m.Return();
}

// Sets stderr to log INFO, and redirects stderr, which Unity does not log, to
// "<KSP directory>/stderr.log". This provides an easily accessible file
// containing a sufficiently verbose log of the latest session, instead of
@@ -1096,28 +1043,6 @@ void __cdecl principia__SetMainBody(Plugin* const plugin, int const index) {
return m.Return();
}

void __cdecl principia__SetPartApparentRigidMotion(
Plugin* const plugin,
PartId const part_id,
QP const degrees_of_freedom,
WXYZ const rotation,
XYZ const angular_velocity,
QP const main_body_degrees_of_freedom) {
journal::Method<journal::SetPartApparentRigidMotion> m(
{plugin,
part_id,
degrees_of_freedom,
rotation,
angular_velocity,
main_body_degrees_of_freedom});
CHECK_NOTNULL(plugin);
plugin->SetPartApparentRigidMotion(
part_id,
MakePartRigidMotion(degrees_of_freedom, rotation, angular_velocity),
FromQP<DegreesOfFreedom<World>>(main_body_degrees_of_freedom));
return m.Return();
}

// Make it so that all log messages of at least |min_severity| are logged to
// stderr (in addition to logging to the usual log file(s)).
void __cdecl principia__SetStderrLogging(int const min_severity) {
29 changes: 29 additions & 0 deletions ksp_plugin/interface_body.hpp
Original file line number Diff line number Diff line change
@@ -7,11 +7,22 @@
#include <limits>
#include <utility>

#include "geometry/named_quantities.hpp"
#include "geometry/orthogonal_map.hpp"
#include "geometry/rotation.hpp"
#include "physics/ephemeris.hpp"
#include "physics/rigid_motion.hpp"

namespace principia {
namespace interface {

using geometry::OrthogonalMap;
using geometry::RigidTransformation;
using geometry::Rotation;
using integrators::AdaptiveStepSizeIntegrator;
using ksp_plugin::RigidPart;
using physics::Ephemeris;
using physics::RigidMotion;
using quantities::Pow;
using quantities::SIUnit;
using quantities::si::Degree;
@@ -511,5 +522,23 @@ inline not_null<std::unique_ptr<NavigationFrame>> NewNavigationFrame(
}
}

inline RigidMotion<RigidPart, World> MakePartRigidMotion(
QP const& part_world_degrees_of_freedom,
WXYZ const& part_rotation,
XYZ const& part_angular_velocity) {
DegreesOfFreedom<World> const part_degrees_of_freedom =
FromQP<DegreesOfFreedom<World>>(part_world_degrees_of_freedom);
Rotation<RigidPart, World> const part_to_world(FromWXYZ(part_rotation));
RigidTransformation<RigidPart, World> const part_rigid_transformation(
RigidPart::origin,
part_degrees_of_freedom.position(),
part_to_world.Forget<OrthogonalMap>());
RigidMotion<RigidPart, World> part_rigid_motion(
part_rigid_transformation,
FromXYZ<AngularVelocity<World>>(part_angular_velocity),
part_degrees_of_freedom.velocity());
return part_rigid_motion;
}

} // namespace interface
} // namespace principia
109 changes: 109 additions & 0 deletions ksp_plugin/interface_part.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@

#include "ksp_plugin/interface.hpp"

#include <algorithm>
#include <chrono>

#include "geometry/grassmann.hpp"
#include "journal/method.hpp"
#include "journal/profiles.hpp"
#include "ksp_plugin/identification.hpp"
#include "ksp_plugin/iterators.hpp"
#include "quantities/named_quantities.hpp"
#include "quantities/quantities.hpp"
#include "quantities/si.hpp"

namespace principia {
namespace interface {

using geometry::Bivector;
using quantities::Force;
using quantities::Torque;
using ksp_plugin::PartId;
using quantities::si::Kilo;
using quantities::si::Newton;
using quantities::si::Metre;
using quantities::si::Radian;

void __cdecl principia__PartIncrementIntrinsicForce(
Plugin* const plugin,
PartId const part_id,
XYZ const force_in_kilonewtons) {
journal::Method<journal::PartIncrementIntrinsicForce> m(
{plugin, part_id, force_in_kilonewtons});
CHECK_NOTNULL(plugin)->IncrementPartIntrinsicForce(
part_id,
Vector<Force, World>(FromXYZ(force_in_kilonewtons) * Kilo(Newton)));
return m.Return();
}

void __cdecl principia__PartIncrementIntrinsicForceWithPosition(
Plugin* const plugin,
PartId const part_id,
XYZ const force_in_kilonewtons,
XYZ const position) {
journal::Method<journal::PartIncrementIntrinsicForceWithPosition> m(
{plugin, part_id, force_in_kilonewtons, position});
CHECK_NOTNULL(plugin)->IncrementPartIntrinsicForceWithPosition(
part_id,
Vector<Force, World>(FromXYZ(force_in_kilonewtons) * Kilo(Newton)),
World::origin + Displacement<World>(FromXYZ(position) * Metre));
return m.Return();
}

void __cdecl principia__PartIncrementIntrinsicTorque(
Plugin* const plugin,
PartId const part_id,
XYZ const torque_in_kilonewton_metre) {
journal::Method<journal::PartIncrementIntrinsicTorque> m(
{plugin, part_id, torque_in_kilonewton_metre});
CHECK_NOTNULL(plugin)->IncrementPartIntrinsicTorque(
part_id,
Bivector<Torque, World>(FromXYZ(torque_in_kilonewton_metre) *
Kilo(Newton) * Metre * Radian));
return m.Return();
}

QP __cdecl principia__PartGetActualDegreesOfFreedom(Plugin const* const plugin,
PartId const part_id,
Origin const origin) {
journal::Method<journal::PartGetActualDegreesOfFreedom> m(
{plugin, part_id, origin});
CHECK_NOTNULL(plugin);
return m.Return(ToQP(
plugin->GetPartActualDegreesOfFreedom(
part_id,
plugin->BarycentricToWorld(
origin.reference_part_is_unmoving,
origin.reference_part_id,
origin.reference_part_is_at_origin
? std::nullopt
: std::make_optional(
FromXYZ<Position<World>>(
origin.main_body_centre_in_world))))));
}

void __cdecl principia__PartSetApparentRigidMotion(
Plugin* const plugin,
PartId const part_id,
QP const degrees_of_freedom,
WXYZ const rotation,
XYZ const angular_velocity,
QP const main_body_degrees_of_freedom) {
journal::Method<journal::PartSetApparentRigidMotion> m(
{plugin,
part_id,
degrees_of_freedom,
rotation,
angular_velocity,
main_body_degrees_of_freedom});
CHECK_NOTNULL(plugin);
plugin->SetPartApparentRigidMotion(
part_id,
MakePartRigidMotion(degrees_of_freedom, rotation, angular_velocity),
FromQP<DegreesOfFreedom<World>>(main_body_degrees_of_freedom));
return m.Return();
}

} // namespace interface
} // namespace principia
1 change: 1 addition & 0 deletions ksp_plugin/ksp_plugin.vcxproj
Original file line number Diff line number Diff line change
@@ -69,6 +69,7 @@
<ClCompile Include="interface_future.cpp" />
<ClCompile Include="interface_iterator.cpp" />
<ClCompile Include="interface_monitor.cpp" />
<ClCompile Include="interface_part.cpp" />
<ClCompile Include="interface_planetarium.cpp" />
<ClCompile Include="interface_renderer.cpp" />
<ClCompile Include="interface_vessel.cpp" />
3 changes: 3 additions & 0 deletions ksp_plugin/ksp_plugin.vcxproj.filters
Original file line number Diff line number Diff line change
@@ -166,6 +166,9 @@
<ClCompile Include="orbit_analyser.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="interface_part.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="..\serialization\journal.proto" />
23 changes: 22 additions & 1 deletion ksp_plugin/part.cpp
Original file line number Diff line number Diff line change
@@ -91,6 +91,19 @@ Vector<Force, Barycentric> const& Part::intrinsic_force() const {
return intrinsic_force_;
}

void Part::clear_intrinsic_torque() {
intrinsic_torque_ = Bivector<Torque, Barycentric>{};
}

void Part::increment_intrinsic_torque(
Bivector<Torque, Barycentric> const& intrinsic_torque) {
intrinsic_torque_ += intrinsic_torque;
}

Bivector<Torque, Barycentric> const& Part::intrinsic_torque() const {
return intrinsic_torque_;
}

void Part::set_rigid_motion(
RigidMotion<RigidPart, Barycentric> const& rigid_motion) {
rigid_motion_ = rigid_motion;
@@ -187,6 +200,7 @@ void Part::WriteToMessage(not_null<serialization::Part*> const message,
mass_.WriteToMessage(message->mutable_mass());
inertia_tensor_.WriteToMessage(message->mutable_inertia_tensor());
intrinsic_force_.WriteToMessage(message->mutable_intrinsic_force());
intrinsic_torque_.WriteToMessage(message->mutable_intrinsic_torque());
if (containing_pile_up_) {
message->set_containing_pile_up(
serialization_index_for_pile_up(containing_pile_up_.get()));
@@ -202,7 +216,8 @@ not_null<std::unique_ptr<Part>> Part::ReadFromMessage(
bool const is_pre_cesàro = message.has_tail_is_authoritative();
bool const is_pre_fréchet = message.has_mass() &&
message.has_degrees_of_freedom();
bool const is_pre_frenet = message.has_pre_frenet_inertia_tensor();
bool const is_pre_frenet = message.has_pre_frenet_inertia_tensor() &&
!message.has_intrinsic_torque();

std::unique_ptr<Part> part;
if (is_pre_fréchet) {
@@ -240,6 +255,12 @@ not_null<std::unique_ptr<Part>> Part::ReadFromMessage(

part->increment_intrinsic_force(
Vector<Force, Barycentric>::ReadFromMessage(message.intrinsic_force()));
if (!is_pre_frenet) {
part->increment_intrinsic_torque(
Bivector<Torque, Barycentric>::ReadFromMessage(
message.intrinsic_torque()));
}

if (is_pre_cesàro) {
auto tail = DiscreteTrajectory<Barycentric>::ReadFromMessage(
message.prehistory(),
8 changes: 8 additions & 0 deletions ksp_plugin/part.hpp
Original file line number Diff line number Diff line change
@@ -26,6 +26,7 @@ namespace internal_part {

using base::not_null;
using base::Subset;
using geometry::Bivector;
using geometry::InertiaTensor;
using geometry::Instant;
using geometry::Position;
@@ -36,6 +37,7 @@ using physics::DiscreteTrajectory;
using physics::RigidMotion;
using quantities::Force;
using quantities::Mass;
using quantities::Torque;

// Represents a KSP part.
class Part final {
@@ -70,6 +72,11 @@ class Part final {
Vector<Force, Barycentric> const& intrinsic_force);
Vector<Force, Barycentric> const& intrinsic_force() const;

void clear_intrinsic_torque();
void increment_intrinsic_torque(
Bivector<Torque, Barycentric> const& intrinsic_torque);
Bivector<Torque, Barycentric> const& intrinsic_torque() const;

// Sets or returns the rigid motion of the part.
void set_rigid_motion(
RigidMotion<RigidPart, Barycentric> const& rigid_motion);
@@ -137,6 +144,7 @@ class Part final {
Mass mass_;
InertiaTensor<RigidPart> inertia_tensor_;
Vector<Force, Barycentric> intrinsic_force_;
Bivector<Torque, Barycentric> intrinsic_torque_;

std::shared_ptr<PileUp> containing_pile_up_;

Loading