Skip to content

Commit

Permalink
Add centrifugal artificial gravity support (#395)
Browse files Browse the repository at this point in the history
* Add experimental artificial gravity
Lots of character controller work
Some lighting fixes

* Define gravity in scene properties, fix reloadplayer respawn bug

* Add slope limit to character controller

* Fix physx scene properties reading by priority

* Fix integration tests

* Propagate scene properties from scene to entities via SceneInfo
EntityRef fixes, and static defines in GameEntities.hh

* New player:head system entity
Change character controller to keep head still when reorienting
Fix character controller clipping into other geometry
Fix SceneConnection keeping async scenes unloaded

* Fix head reset logic

* Fix objects sliding around and not going to sleep

* Fix player spawn height and capsule position

* Fix player spawning and vr origin orientation

* CharacterController overhaul

* Fix tests to move player instead of flatview

* Fix moving platform test to not spawn in floor

* Rebase fix

* Global variable style consistency

* Add scene connection gravity transformation
Stabilize reorientation for low rotation speeds

* Review fixes
  • Loading branch information
xthexder authored Sep 18, 2022
1 parent 76b3efb commit bc54f08
Show file tree
Hide file tree
Showing 58 changed files with 893 additions and 371 deletions.
10 changes: 5 additions & 5 deletions assets/default_input_bindings.json
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,14 @@
"menu_secondary_trigger": "input:mouse/mouse_button_right",
"menu_cursor_x": "input:mouse/mouse_cursor_x",
"menu_cursor_y": "input:mouse/mouse_cursor_y",
"move_world_x": {
"move_relative_x": {
"operator": "add",
"values": [ "player:flatview/move_world_x", "vr:left_hand/move_world_x", "vr:right_hand/move_world_x" ]
"values": [ "player:flatview/move_relative_x", "vr:left_hand/move_relative_x", "vr:right_hand/move_relative_x" ]
},
"move_world_y": "player:flatview/move_world_y",
"move_world_z": {
"move_relative_y": "player:flatview/move_relative_y",
"move_relative_z": {
"operator": "add",
"values": [ "player:flatview/move_world_z", "vr:left_hand/move_world_z", "vr:right_hand/move_world_z" ]
"values": [ "player:flatview/move_relative_z", "vr:left_hand/move_relative_z", "vr:right_hand/move_relative_z" ]
},
"move_sprint": "input:keyboard/key_left_shift"
}
Expand Down
15 changes: 15 additions & 0 deletions assets/scenes/blackhole1.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
{
"properties": {
"gravity": [0, 0, 0],
"gravity_transform": {
"translate": [0, 153, 0]
},
"gravity_func": "station_spin"
},
"entities": [
{
"name": "global:player_gravity_override",
"scene_connection": "player_gravity_override",
"transform": {
"translate": [0, 153, 0]
},
"signal_output": { "load_scene_connection": 1 }
},
{
"name": "zone",
"signal_output": {},
Expand Down
15 changes: 15 additions & 0 deletions assets/scenes/blackhole2.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
{
"properties": {
"gravity": [0, 0, 0],
"gravity_transform": {
"translate": [0, 153, 0]
},
"gravity_func": "station_spin"
},
"entities": [
{
"name": "global:player_gravity_override",
"scene_connection": "player_gravity_override",
"transform": {
"translate": [0, 153, 0]
},
"signal_output": { "load_scene_connection": 1 }
},
{
"name": "zone",
"signal_output": {},
Expand Down
15 changes: 15 additions & 0 deletions assets/scenes/blackhole3.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
{
"properties": {
"gravity": [0, 0, 0],
"gravity_transform": {
"translate": [0, 153, 0]
},
"gravity_func": "station_spin"
},
"entities": [
{
"name": "global:player_gravity_override",
"scene_connection": "player_gravity_override",
"transform": {
"translate": [0, 153, 0]
},
"signal_output": { "load_scene_connection": 1 }
},
{
"name": "zone",
"signal_output": {},
Expand Down
15 changes: 15 additions & 0 deletions assets/scenes/blackhole4.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
{
"properties": {
"gravity": [0, 0, 0],
"gravity_transform": {
"translate": [0, 153, 0]
},
"gravity_func": "station_spin"
},
"entities": [
{
"name": "global:player_gravity_override",
"scene_connection": "player_gravity_override",
"transform": {
"translate": [0, 153, 0]
},
"signal_output": { "load_scene_connection": 1 }
},
{
"name": "zone",
"signal_output": {},
Expand Down
15 changes: 15 additions & 0 deletions assets/scenes/blackhole5.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
{
"properties": {
"gravity": [0, 0, 0],
"gravity_transform": {
"translate": [0, 153, 0]
},
"gravity_func": "station_spin"
},
"entities": [
{
"name": "global:player_gravity_override",
"scene_connection": "player_gravity_override",
"transform": {
"translate": [0, 153, 0]
},
"signal_output": { "load_scene_connection": 1 }
},
{
"name": "zone",
"signal_output": {},
Expand Down
2 changes: 1 addition & 1 deletion assets/scenes/menu.json
Original file line number Diff line number Diff line change
Expand Up @@ -417,7 +417,7 @@
{
"name": "global:spawn",
"transform": {
"translate": [0, 0.05, 0]
"translate": [0, 0, 0]
}
},
{
Expand Down
1 change: 1 addition & 0 deletions assets/scenes/moving-platform.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
},
"transform": {
"parent": "platform_root",
"translate": [0, -0.25, 0],
"scale": [4, 0.5, 4]
},
"physics": {
Expand Down
9 changes: 5 additions & 4 deletions assets/scenes/player.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@
"name": "player",
"transform": {},
"character_controller": {
"target": "vr:hmd",
"fallback_target": "flatview",
"movement_proxy": "vr:origin"
"head": "player:head"
},
"trigger_group": "player",
"event_input": [
Expand All @@ -27,7 +25,10 @@
"script": [
{
"onTick": "relative_movement",
"parameters": { "relative_to": "player:flatview" }
"parameters": {
"relative_to": "player:flatview",
"up_reference": "player:player"
}
},
{ "onTick": "camera_view" },
{
Expand Down
17 changes: 17 additions & 0 deletions assets/scenes/player_gravity_override.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"priority": "Override",
"properties": {
"gravity": [0, 0, 0],
"gravity_transform": {},
"gravity_func": "station_spin"
},
"entities": [
{
"name": "global:player_gravity_override",
"scene_connection": [],
"transform": {}
},
{ "name": "player:player" },
{ "name": "player:debug-spawner" }
]
}
15 changes: 15 additions & 0 deletions assets/scenes/station-center.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
{
"properties": {
"gravity": [0, 0, 0],
"gravity_transform": {
"translate": [0, 153, 0]
},
"gravity_func": "station_spin"
},
"entities": [
{
"name": "global:player_gravity_override",
"scene_connection": "player_gravity_override",
"transform": {
"translate": [0, 153, 0]
},
"signal_output": { "load_scene_connection": 1 }
},
{
"name": "elevator_zone",
"signal_output": {},
Expand Down
21 changes: 19 additions & 2 deletions assets/scenes/vr.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,17 @@
"/action/snap_rotate"
]
},
{
"name": "hmd_vis",
"transform": {
"parent": "hmd",
"scale": [0.1, 0.1, 0.1]
},
"renderable": {
"model": "box",
"visibility": "DirectCamera|LightingShadow|LightingVoxel"
}
},
{
"name": "left_hand",
"transform": {
Expand All @@ -26,7 +37,10 @@
"script": [
{
"onTick": "relative_movement",
"parameters": { "relative_to": "vr:hmd" }
"parameters": {
"relative_to": "vr:hmd",
"up_reference": "player:player"
}
}
],
"signal_output": {}
Expand All @@ -39,7 +53,10 @@
"script": [
{
"onTick": "relative_movement",
"parameters": { "relative_to": "vr:hmd" }
"parameters": {
"relative_to": "vr:hmd",
"up_reference": "player:player"
}
}
],
"signal_output": {}
Expand Down
2 changes: 1 addition & 1 deletion assets/scripts/tests/menu.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
loadscene menu
rotate player:flatview -90 0 1 0
rotate player:player -90 0 1 0
translate player:player -1 0 0
# Step logic and physics so the voxel_controller moves the grid into place
steplogic
Expand Down
8 changes: 4 additions & 4 deletions assets/scripts/tests/mirrortest.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,23 +18,23 @@ sendevent player:flashlight/action/flashlight/grab
steplogic

setsignal player:player/move_noclip 1
rotate player:flatview -60 0 1 0
rotate player:player -60 0 1 0
translate player:player -1 -1 -4
stepphysics
screenshot mirrortest-edge-occlusion.png
stepgraphics
rotate player:flatview 70 0 1 0
rotate player:player 70 0 1 0
translate player:player -3 0 -2
stepphysics
screenshot mirrortest-bounces.png
stepgraphics

setsignal player:flashlight/on 1
rotate player:flatview -45 0 1 0
rotate player:player -45 0 1 0
rotate player:flatview -55 1 0 0
translate player:player -0.14 6 6.1
stepphysics
steplogic
stepgraphics 10
stepgraphics 11
screenshot mirrortest-overhead.png
stepgraphics
1 change: 1 addition & 0 deletions src/audio/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ target_include_directories(${PROJECT_AUDIO_LIB} PUBLIC

target_link_libraries(${PROJECT_AUDIO_LIB} PUBLIC
${PROJECT_CORE_LIB}
${PROJECT_GAME_LIB}
libsoundio_static
${LIBSOUNDIO_LIBS}
ResonanceAudioStatic
Expand Down
6 changes: 3 additions & 3 deletions src/audio/audio/AudioManager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include "assets/AssetManager.hh"
#include "core/Tracing.hh"
#include "ecs/EntityReferenceManager.hh"
#include "game/GameEntities.hh"

#include <resonance-audio/resonance_audio/base/constants_and_types.h>
#include <resonance_audio_api.h>
Expand Down Expand Up @@ -125,9 +126,8 @@ namespace sp {
ZoneScoped;
auto lock = ecs::StartTransaction<ecs::Read<ecs::Sounds, ecs::TransformSnapshot, ecs::Name, ecs::EventInput>>();

auto head = headEntity.Get(lock);
if (!head) head = headEntityFallback.Get(lock);
if (head && head.Has<ecs::TransformSnapshot>(lock)) {
auto head = entities::Head.Get(lock);
if (head.Has<ecs::TransformSnapshot>(lock)) {
auto transform = head.Get<ecs::TransformSnapshot>(lock);
auto pos = transform.GetPosition();
auto rot = transform.GetRotation();
Expand Down
3 changes: 0 additions & 3 deletions src/audio/audio/AudioManager.hh
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,6 @@ namespace sp {
LockFreeAudioSet<SoundSource, 65535> sounds;
LockFreeEventQueue<SoundEvent> soundEvents;

ecs::EntityRef headEntity = ecs::Name("vr", "hmd");
ecs::EntityRef headEntityFallback = ecs::Name("player", "flatview");

ecs::ComponentObserver<ecs::Sounds> soundObserver;

static void AudioWriteCallback(SoundIoOutStream *outstream, int frameCountMin, int frameCountMax);
Expand Down
14 changes: 7 additions & 7 deletions src/core/console/ConsoleCoreCommands.cc
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ void mutateEntity(const string &entityStr, Callback callback) {
Logf("Could not parse entity %s", entityStr);
return;
}
auto lock = ecs::StartTransaction<ecs::Read<ecs::Name>, LockWrite>();
auto entity = ecs::EntityWith<ecs::Name>(lock, entityName);
auto lock = ecs::StartTransaction<LockWrite>();
auto entity = ecs::EntityRef(entityName).Get(lock);
if (!entity) {
Logf("Entity %s not found", entityName.String());
return;
Expand Down Expand Up @@ -148,7 +148,7 @@ void sp::ConsoleManager::RegisterCoreCommands() {
auto [entityName, signalName] = ecs::ParseSignalString(signalStr);

auto lock = ecs::StartTransaction<ecs::Read<ecs::Name>, ecs::Write<ecs::SignalOutput>>();
auto entity = ecs::EntityWith<ecs::Name>(lock, entityName);
auto entity = ecs::EntityRef(entityName).Get(lock);
if (!entity) {
Logf("Signal entity %s not found", entityName.String());
return;
Expand All @@ -168,7 +168,7 @@ void sp::ConsoleManager::RegisterCoreCommands() {
auto [entityName, signalName] = ecs::ParseSignalString(signalStr);

auto lock = ecs::StartTransaction<ecs::Read<ecs::Name>, ecs::Write<ecs::SignalOutput>>();
auto entity = ecs::EntityWith<ecs::Name>(lock, entityName);
auto entity = ecs::EntityRef(entityName).Get(lock);
if (!entity) {
Logf("Signal entity %s not found", entityName.String());
return;
Expand All @@ -194,9 +194,9 @@ void sp::ConsoleManager::RegisterCoreCommands() {
funcs.Register<string>("clearsignal", "Clear a signal value (clearsignal <entity>/<signal>)", [](string signalStr) {
auto [entityName, signalName] = ecs::ParseSignalString(signalStr);

auto lock = ecs::StartTransaction<ecs::Read<ecs::Name>, ecs::Write<ecs::SignalOutput>>();
auto entity = ecs::EntityWith<ecs::Name>(lock, entityName);
if (entity && entity.Has<ecs::SignalOutput>(lock)) {
auto lock = ecs::StartTransaction<ecs::Write<ecs::SignalOutput>>();
auto entity = ecs::EntityRef(entityName).Get(lock);
if (entity.Has<ecs::SignalOutput>(lock)) {
auto &signalComp = entity.Get<ecs::SignalOutput>(lock);
signalComp.ClearSignal(signalName);
}
Expand Down
Loading

0 comments on commit bc54f08

Please sign in to comment.