Skip to content

Commit

Permalink
Setup floating origin system for lander game
Browse files Browse the repository at this point in the history
  • Loading branch information
dylan-mcleod committed May 5, 2024
1 parent 2db2f3b commit 685cb42
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 25 deletions.
3 changes: 2 additions & 1 deletion src/testapp/identifiers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
47 changes: 24 additions & 23 deletions src/testapp/scenarios.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<ACtxVehicleSpawn> (rTopData, idVehicleSpawn);
auto &rVehicleSpawnVB = top_get<ACtxVehicleSpawnVB> (rTopData, idVehicleSpawnVB);
Expand Down
61 changes: 61 additions & 0 deletions src/testapp/sessions/newton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<entt::any> 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<PlScene>();

OSP_DECLARE_GET_DATA_IDS(newton, TESTAPP_DATA_NEWTON);
auto const tgNwt = newton.get_pipelines<PlNewton>();

OSP_DECLARE_GET_DATA_IDS(sceneFrame, TESTAPP_DATA_UNI_SCENEFRAME);
auto const tgScnFrame = sceneFrame.get_pipelines<PlUniSceneFrame>();

OSP_DECLARE_GET_DATA_IDS(physics, TESTAPP_DATA_PHYSICS);
auto const tgPhys = physics.get_pipelines<PlPhysics>();

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<Vector3, int>(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


14 changes: 14 additions & 0 deletions src/testapp/sessions/newton.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<entt::any> topData,
Expand All @@ -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<entt::any> 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
*/
Expand Down
2 changes: 1 addition & 1 deletion src/testapp/sessions/universe.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -588,7 +588,7 @@ Session setup_landerplanet_draw(
});

return out;
}
} // setup_landerplanet_draw

Session setup_testplanets_draw(
TopTaskBuilder& rBuilder,
Expand Down

0 comments on commit 685cb42

Please sign in to comment.