diff --git a/src/testapp/identifiers.h b/src/testapp/identifiers.h index 88fc2d1e..16b511ed 100644 --- a/src/testapp/identifiers.h +++ b/src/testapp/identifiers.h @@ -303,7 +303,8 @@ struct PlNewton #define TESTAPP_DATA_NEWTON_ACCEL 1, \ idAcceleration - +#define TESTAPP_DATA_NEWTON_ORIGIN_TRANSLATE 1, \ + idNwtSync #define TESTAPP_DATA_ROCKETS_NWT 1, \ idRocketsNwt diff --git a/src/testapp/scenarios.cpp b/src/testapp/scenarios.cpp index 23ca0e10..74e02ffb 100644 --- a/src/testapp/scenarios.cpp +++ b/src/testapp/scenarios.cpp @@ -374,8 +374,8 @@ static ScenarioMap_t make_scenarios() #define SCENE_SESSIONS scene, commonScene, uniCore, uniScnFrame, uniPlanet, physics, \ prefabs, parts, signalsFloat, vehicleSpawn, vehicleSpawnVB, vehicles, \ newton, nwtGravSet, nwtGrav, vehicleSpawnNwt, nwtRocketSet, rocketsNwt, \ - machRocket, machRcsDriver - #define SCENE_SESSIONS_COUNT 20 + machRocket, machRcsDriver, nwtFollow + #define SCENE_SESSIONS_COUNT 21 #define RENDERER_SESSIONS sceneRenderer, magnumScene, planetDraw, \ cameraCtrl, cameraFree, shVisual, shFlat, shPhong, \ prefabDraw, vehicleDraw, vehicleCtrl, cameraVehicle @@ -395,32 +395,33 @@ static ScenarioMap_t make_scenarios() commonScene = setup_common_scene (builder, rTopData, scene, application, defaultPkg); auto const tgApp = application.get_pipelines< PlApplication >(); - uniCore = setup_uni_core (builder, rTopData, tgApp.mainLoop); - uniScnFrame = setup_uni_sceneframe (builder, rTopData, uniCore); - uniPlanet = setup_uni_landerplanet (builder, rTopData, uniCore, uniScnFrame); + uniCore = setup_uni_core (builder, rTopData, tgApp.mainLoop); + uniScnFrame = setup_uni_sceneframe (builder, rTopData, uniCore); + uniPlanet = setup_uni_landerplanet (builder, rTopData, uniCore, uniScnFrame); - physics = setup_physics (builder, rTopData, scene, commonScene); - prefabs = setup_prefabs (builder, rTopData, application, scene, commonScene, physics); - parts = setup_parts (builder, rTopData, application, scene); - signalsFloat = setup_signals_float (builder, rTopData, scene, parts); - vehicleSpawn = setup_vehicle_spawn (builder, rTopData, scene); - vehicleSpawnVB = setup_vehicle_spawn_vb (builder, rTopData, application, scene, commonScene, prefabs, parts, vehicleSpawn, signalsFloat); - vehicles = setup_prebuilt_vehicles (builder, rTopData, application, scene); - - machRocket = setup_mach_rocket (builder, rTopData, scene, parts, signalsFloat); - machRcsDriver = setup_mach_rcsdriver (builder, rTopData, scene, parts, signalsFloat); - - newton = setup_newton (builder, rTopData, scene, commonScene, physics); - nwtGravSet = setup_newton_factors (builder, rTopData); - nwtGrav = setup_newton_force_grav_nbody (builder, rTopData, newton, nwtGravSet, uniCore, uniPlanet, uniScnFrame); - vehicleSpawnNwt = setup_vehicle_spawn_newton(builder, rTopData, application, commonScene, physics, prefabs, parts, vehicleSpawn, newton); - nwtRocketSet = setup_newton_factors (builder, rTopData); - rocketsNwt = setup_rocket_thrust_newton(builder, rTopData, scene, commonScene, physics, prefabs, parts, signalsFloat, newton, nwtRocketSet); + physics = setup_physics (builder, rTopData, scene, commonScene); + prefabs = setup_prefabs (builder, rTopData, application, scene, commonScene, physics); + parts = setup_parts (builder, rTopData, application, scene); + signalsFloat = setup_signals_float (builder, rTopData, scene, parts); + vehicleSpawn = setup_vehicle_spawn (builder, rTopData, scene); + vehicleSpawnVB = setup_vehicle_spawn_vb (builder, rTopData, application, scene, commonScene, prefabs, parts, vehicleSpawn, signalsFloat); + vehicles = setup_prebuilt_vehicles (builder, rTopData, application, scene); + + machRocket = setup_mach_rocket (builder, rTopData, scene, parts, signalsFloat); + machRcsDriver = setup_mach_rcsdriver (builder, rTopData, scene, parts, signalsFloat); + + newton = setup_newton (builder, rTopData, scene, commonScene, physics); + nwtGravSet = setup_newton_factors (builder, rTopData); + nwtGrav = setup_newton_force_grav_nbody(builder, rTopData, newton, nwtGravSet, uniCore, uniPlanet, uniScnFrame); + nwtFollow = setup_newton_origin_translate(builder, rTopData, scene, uniScnFrame, newton, physics); + vehicleSpawnNwt = setup_vehicle_spawn_newton (builder, rTopData, application, commonScene, physics, prefabs, parts, vehicleSpawn, newton); + nwtRocketSet = setup_newton_factors (builder, rTopData); + rocketsNwt = setup_rocket_thrust_newton (builder, rTopData, scene, commonScene, physics, prefabs, parts, signalsFloat, newton, nwtRocketSet); OSP_DECLARE_GET_DATA_IDS(vehicleSpawn, TESTAPP_DATA_VEHICLE_SPAWN); OSP_DECLARE_GET_DATA_IDS(vehicleSpawnVB, TESTAPP_DATA_VEHICLE_SPAWN_VB); - OSP_DECLARE_GET_DATA_IDS(vehicles, TESTAPP_DATA_TEST_VEHICLES); + OSP_DECLARE_GET_DATA_IDS(vehicles, TESTAPP_DATA_TEST_VEHICLES); auto &rVehicleSpawn = top_get (rTopData, idVehicleSpawn); auto &rVehicleSpawnVB = top_get (rTopData, idVehicleSpawnVB); diff --git a/src/testapp/sessions/newton.cpp b/src/testapp/sessions/newton.cpp index 2915e094..4b759765 100644 --- a/src/testapp/sessions/newton.cpp +++ b/src/testapp/sessions/newton.cpp @@ -802,6 +802,67 @@ osp::Session setup_newton_force_grav_nbody( return out; } // setup_newton_force_accel +Session setup_newton_origin_translate( + TopTaskBuilder& rBuilder, + ArrayView topData, + Session const& scene, + Session const& sceneFrame, + Session const& newton, + Session const& physics) +{ + using namespace osp::universe; + + OSP_DECLARE_GET_DATA_IDS(scene, TESTAPP_DATA_SCENE); + auto const tgScn = scene.get_pipelines(); + + OSP_DECLARE_GET_DATA_IDS(newton, TESTAPP_DATA_NEWTON); + auto const tgNwt = newton.get_pipelines(); + + OSP_DECLARE_GET_DATA_IDS(sceneFrame, TESTAPP_DATA_UNI_SCENEFRAME); + auto const tgScnFrame = sceneFrame.get_pipelines(); + + OSP_DECLARE_GET_DATA_IDS(physics, TESTAPP_DATA_PHYSICS); + auto const tgPhys = physics.get_pipelines(); + + Session out; + OSP_DECLARE_CREATE_DATA_IDS(out, topData, TESTAPP_DATA_NEWTON_ORIGIN_TRANSLATE); + + rBuilder.task() + .name ("Update scene origin if body strays too far") + .run_on ({tgScn.update(Run)}) + .sync_with ({tgNwt.nwtBody(Prev), tgScnFrame.sceneFrame(Modify)}) + .push_to (out.m_tasks) + .args ({idNwt, idScnFrame, idPhys}) + .func([] (ACtxNwtWorld& rNwt, SceneFrame& rScnFrame, ACtxPhysics& rPhysics) noexcept + { + for (auto& pBody : rNwt.m_bodyPtrs) + { + Vector3 pos = Vector3(0.0f); + NewtonBodyGetPosition(pBody.get(), pos.data()); + + float const maxDist = 512.0f; + Vector3 const translate = sign(pos) * floor(abs(pos) / maxDist) * maxDist; + + if ( ! translate.isZero()) + { + Vector3 const rotated = Quaternion(rScnFrame.m_rotation).transformVector(translate); + rScnFrame.m_position += Vector3g(math::mul_2pow(rotated, rScnFrame.m_precision)); + + rPhysics.m_originTranslate -= translate; + // printf("Recentering local scene\n, new origin: %ld, %ld, %ld\n", rScnFrame.m_position.x(), rScnFrame.m_position.y(), rScnFrame.m_position.z()); + + SysNewton::update_translate(rPhysics, rNwt); + } + + // TODO: do the same but for velocity + + break; // We're just taking the first newton body because i am very lazy + } + }); + + return out; +} // setup_newton_scene_follow + } // namespace testapp::scenes diff --git a/src/testapp/sessions/newton.h b/src/testapp/sessions/newton.h index b5f9e8c3..3ced256b 100644 --- a/src/testapp/sessions/newton.h +++ b/src/testapp/sessions/newton.h @@ -69,6 +69,9 @@ osp::Session setup_newton_force_accel( osp::Session const& nwtFactors, osp::Vector3 accel); +/** + * @brief Setup a gravity force for every satellite in the universe which acts on the newton scene + */ osp::Session setup_newton_force_grav_nbody( osp::TopTaskBuilder& rBuilder, osp::ArrayView topData, @@ -78,6 +81,17 @@ osp::Session setup_newton_force_grav_nbody( osp::Session const& uniPlanets, osp::Session const& uniScnFrame); +/** + * @brief Set the scene origin to follow a Newton Dynamics object + */ +osp::Session setup_newton_origin_translate( + osp::TopTaskBuilder& rBuilder, + osp::ArrayView topData, + osp::Session const& scene, + osp::Session const& sceneFrame, + osp::Session const& newton, + osp::Session const& physics); + /** * @brief Support for Shape Spawner physics using Newton Dynamics */ diff --git a/src/testapp/sessions/universe.cpp b/src/testapp/sessions/universe.cpp index 4decda16..f9e7e0d4 100644 --- a/src/testapp/sessions/universe.cpp +++ b/src/testapp/sessions/universe.cpp @@ -588,7 +588,7 @@ Session setup_landerplanet_draw( }); return out; -} +} // setup_landerplanet_draw Session setup_testplanets_draw( TopTaskBuilder& rBuilder,