From 06adc221109074d7035324b7a6db9b2147d60175 Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Fri, 17 Apr 2020 00:05:25 +1000 Subject: [PATCH] Added player start and fixed bug with editor camera pitch locking --- assets/entities/player_start.symtres | 13 ++++ assets/scenes/scene_1.symtres | 89 ++++++++++++++++++++++------ src/common/version.h | 2 +- src/game/editor.c | 56 ++++++++--------- src/game/player.c | 23 ++++++- todo.txt | 4 +- 6 files changed, 132 insertions(+), 55 deletions(-) create mode 100644 assets/entities/player_start.symtres diff --git a/assets/entities/player_start.symtres b/assets/entities/player_start.symtres new file mode 100644 index 0000000..c4ee62a --- /dev/null +++ b/assets/entities/player_start.symtres @@ -0,0 +1,13 @@ +Entity +{ + type : 1 + scale : 1.000 1.000 1.000 + rotation : 0.000 0.000 0.000 1.000 + position : 57.000 6.000 8.000 + flags : 193 + name : PLAYER_START + archetype : player_start + bounding_box_min : -0.500 -0.500 -0.500 + bounding_box_max : 0.500 0.500 0.500 +} + diff --git a/assets/scenes/scene_1.symtres b/assets/scenes/scene_1.symtres index c845496..a2b5dda 100755 --- a/assets/scenes/scene_1.symtres +++ b/assets/scenes/scene_1.symtres @@ -21,9 +21,9 @@ Player { type : 2 scale : 1.000 1.000 1.000 - rotation : 0.000 0.721 0.000 0.692 + rotation : 0.000 -0.012 0.000 1.000 player_key_mask : 0 - position : 48.866 2.167 7.616 + position : 21.339 2.208 13.573 flags : 1 player_health : 100 name : Player @@ -32,6 +32,19 @@ Player bounding_box_max : 1.500 1.500 1.000 } +Entity +{ + type : 1 + scale : 1.000 1.000 1.000 + rotation : 0.000 -1.000 0.000 0.000 + position : 57.000 6.000 8.000 + flags : 193 + name : PLAYER_START + archetype : player_start + bounding_box_min : -0.500 -0.500 -0.500 + bounding_box_max : 0.500 0.500 0.500 +} + Entity { type : 5 @@ -66,12 +79,12 @@ Entity depth_bias : 0.0005 rotation : 0.000 0.000 0.000 1.000 cast_shadow : false - intensity : 1.0000 - color : 1.000 1.000 1.000 - radius : 20.0000 - position : -0.442 2.759 1.544 + intensity : 1.8500 + color : 0.929 0.067 0.067 + radius : 19.0000 + position : 20.000 6.000 -18.000 flags : 1 - outer_angle : 30.0000 + outer_angle : 41.0000 name : Test_Light archetype : Spot bounding_box_min : -0.500 -0.500 -0.500 @@ -145,20 +158,20 @@ Entity Entity { type : 6 - scale : 65.000 11.000 1.000 + scale : 7.000 3.000 1.000 material : 0 rotation : 0.000 0.000 0.000 1.000 diffuse_color : 1.000 1.000 1.000 1.000 - geometry : cube.symbres - specular : 1.0000 - diffuse_texture : default.tga + geometry : wall_tile.symbres + specular : 0.4000 + diffuse_texture : white.tga diffuse : 1.0000 - position : 17.000 6.000 -30.000 + position : 20.000 6.000 -27.000 flags : 1 - specular_strength : 1.0000 - name : Cube - archetype : cube_uv - uv_scale : 4.600 16.400 + specular_strength : 62.0000 + name : Wall_Tile + archetype : wall_tile + uv_scale : 0.300 0.200 } Entity @@ -259,7 +272,7 @@ Entity Entity { type : 6 - scale : 7.000 3.000 1.000 + scale : 3.000 3.000 1.000 material : 0 rotation : 0.000 0.000 0.000 1.000 diffuse_color : 1.000 1.000 1.000 1.000 @@ -267,7 +280,7 @@ Entity specular : 0.4000 diffuse_texture : white.tga diffuse : 1.0000 - position : 20.000 6.000 -6.000 + position : 29.000 6.000 -6.000 flags : 1 specular_strength : 62.0000 name : Wall_Tile @@ -332,6 +345,44 @@ Entity uv_scale : 0.300 0.200 } +Entity +{ + type : 6 + scale : 3.000 3.000 1.000 + material : 0 + rotation : 0.000 0.000 0.000 1.000 + diffuse_color : 1.000 1.000 1.000 1.000 + geometry : wall_tile.symbres + specular : 0.4000 + diffuse_texture : white.tga + diffuse : 1.0000 + position : 12.000 6.000 -6.000 + flags : 1 + specular_strength : 62.0000 + name : Wall_Tile + archetype : wall_tile + uv_scale : 0.300 0.200 +} + +Entity +{ + type : 6 + scale : 6.000 3.000 1.000 + material : 0 + rotation : 0.000 -0.707 0.000 0.707 + diffuse_color : 1.000 1.000 1.000 1.000 + geometry : wall_tile.symbres + specular : 0.4000 + diffuse_texture : white.tga + diffuse : 1.0000 + position : 6.000 6.000 -17.000 + flags : 1 + specular_strength : 62.0000 + name : Wall_Tile + archetype : wall_tile + uv_scale : 0.300 0.200 +} + Scene_Entity_Entry { scale : 1.000 1.000 1.000 @@ -432,7 +483,7 @@ Scene_Entity_Entry { scale : 1.000 1.000 1.000 rotation : 0.000 0.000 0.000 1.000 - position : -37.000 2.000 -74.000 + position : 20.000 4.000 -17.000 filename : pickup_key_red name : Pickup_Key_Red } diff --git a/src/common/version.h b/src/common/version.h index bdc118d..bc66715 100755 --- a/src/common/version.h +++ b/src/common/version.h @@ -4,7 +4,7 @@ /* Auto generated version file. DO NOT MODIFY */ #define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MINOR 2 -#define SYMMETRY_VERSION_REVISION 367 +#define SYMMETRY_VERSION_REVISION 368 #define SYMMETRY_VERSION_BRANCH "dev" #endif \ No newline at end of file diff --git a/src/game/editor.c b/src/game/editor.c index 05530f9..e7784f7 100755 --- a/src/game/editor.c +++ b/src/game/editor.c @@ -1489,21 +1489,19 @@ void editor_camera_update(struct Editor* editor, float dt) if(game_state->console->visible || nk_item_is_any_active(&gui->context)) return; + static float current_pitch = 0.f; struct Camera* editor_camera = &game_state->scene->cameras[CAM_EDITOR]; - static float total_up_down_rot = 0.f; - float move_speed = editor->camera_move_speed, turn_speed = editor->camera_turn_speed; - float turn_up_down = 0.f; - float turn_left_right = 0.f; - float max_up_down = 60.f; - vec3 offset = { 0, 0, 0 }; - vec3 rot_axis_up_down = { 1, 0, 0 }; - vec3 rot_axis_left_right = { 0, 1, 0 }; + float move_speed = editor->camera_move_speed, turn_speed = editor->camera_turn_speed; + float pitch = 0.f; + float yaw = 0.f; + float max_pitch = 60.f; + vec3 offset = { 0, 0, 0 }; /* Look around */ - if(input_map_state_get("Turn_Up", KS_PRESSED)) turn_up_down += turn_speed; - if(input_map_state_get("Turn_Down", KS_PRESSED)) turn_up_down -= turn_speed; - if(input_map_state_get("Turn_Right", KS_PRESSED)) turn_left_right += turn_speed; - if(input_map_state_get("Turn_Left", KS_PRESSED)) turn_left_right -= turn_speed; + if(input_map_state_get("Turn_Up", KS_PRESSED)) pitch += turn_speed; + if(input_map_state_get("Turn_Down", KS_PRESSED)) pitch -= turn_speed; + if(input_map_state_get("Turn_Right", KS_PRESSED)) yaw += turn_speed; + if(input_map_state_get("Turn_Left", KS_PRESSED)) yaw -= turn_speed; if(input_mousebutton_state_get(MSB_RIGHT, KS_PRESSED) && !nk_item_is_any_active(&gui->context)) { @@ -1517,36 +1515,32 @@ void editor_camera_update(struct Editor* editor, float dt) cursor_lr = cursor_ud = 0; } - turn_up_down = -cursor_ud * turn_speed * dt * scale; - turn_left_right = cursor_lr * turn_speed * dt * scale; + pitch = -cursor_ud * turn_speed * dt * scale; + yaw = cursor_lr * turn_speed * dt * scale; } else { - turn_up_down *= dt; - turn_left_right *= dt; + pitch *= dt; + yaw *= dt; } - total_up_down_rot += turn_up_down; - if(total_up_down_rot >= max_up_down) - { - total_up_down_rot = max_up_down; - turn_up_down = 0.f; - } - else if(total_up_down_rot <= -max_up_down) - { - total_up_down_rot = -max_up_down; - turn_up_down = 0.f; - } + current_pitch = quat_get_pitch(&editor_camera->base.transform.rotation); + float new_pitch = current_pitch + pitch; + if(new_pitch > max_pitch) + pitch = 0.f; + + if(new_pitch < -max_pitch) + pitch = 0.f; - if(turn_left_right != 0.f) + if(yaw != 0.f) { - transform_rotate(editor_camera, &rot_axis_left_right, -turn_left_right, TS_WORLD); + transform_rotate(editor_camera, &UNIT_Y, -yaw, TS_WORLD); } - if(turn_up_down != 0.f) + if(pitch != 0.f) { //transform_rotate(editor_camera, &rot_axis_up_down, turn_up_down, TS_LOCAL); - transform_rotate(editor_camera, &rot_axis_up_down, turn_up_down, TS_LOCAL); + transform_rotate(editor_camera, &UNIT_X, pitch, TS_LOCAL); } /* Movement */ diff --git a/src/game/player.c b/src/game/player.c index 38e9018..0b36718 100755 --- a/src/game/player.c +++ b/src/game/player.c @@ -28,6 +28,7 @@ static void player_on_mousebutton_released(const struct Event* event); static void player_on_input_map_released(const struct Event* event); +static void player_on_scene_loaded(const struct Event* event); void player_init(struct Player* player, struct Scene* scene) { @@ -128,12 +129,16 @@ void player_init(struct Player* player, struct Scene* scene) event_manager_subscribe(game_state->event_manager, EVT_MOUSEBUTTON_RELEASED, &player_on_mousebutton_released); event_manager_subscribe(game_state->event_manager, EVT_INPUT_MAP_RELEASED, &player_on_input_map_released); + event_manager_subscribe(game_state->event_manager, EVT_SCENE_LOADED, &player_on_scene_loaded); } void player_destroy(struct Player* player) { - event_manager_unsubscribe(game_state_get()->event_manager, EVT_MOUSEBUTTON_RELEASED, &player_on_mousebutton_released); - event_manager_unsubscribe(game_state_get()->event_manager, EVT_INPUT_MAP_RELEASED, &player_on_input_map_released); + struct Game_State* game_state = game_state_get(); + struct Event_Manager* event_manager = game_state->event_manager; + event_manager_unsubscribe(event_manager, EVT_MOUSEBUTTON_RELEASED, &player_on_mousebutton_released); + event_manager_unsubscribe(event_manager, EVT_INPUT_MAP_RELEASED, &player_on_input_map_released); + event_manager_unsubscribe(event_manager, EVT_SCENE_LOADED, &player_on_scene_loaded); entity_reset(player, player->base.id); scene_entity_base_remove(game_state_get()->scene, &player->base); player->base.flags = EF_NONE; @@ -449,3 +454,17 @@ void player_update(struct Player* player, float dt) transform_update_transmat(player->muzzle_flash_mesh); } } + +void player_on_scene_loaded(const struct Event* event) +{ + struct Scene* scene = game_state_get()->scene; + struct Player* player = &scene->player; + + struct Entity* player_start = scene_entity_find(scene, "PLAYER_START"); + if(player_start) + { + vec3 abs_pos = { 0.f }; + transform_get_absolute_position(player_start, &abs_pos); + transform_set_position(player, &abs_pos); + } +} diff --git a/todo.txt b/todo.txt index 758b687..e7a3817 100644 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,4 @@ Todo: - - Add player start entity that specifies where the player must start at the beginning of every level - Don't save parent entity's transform when saving entity archetype. Only save the transformation values for children - Save case sensitive file names when scene entity entries - Disbale all player actions when scene cleared dialog or scene restart dialog are active @@ -430,4 +429,5 @@ Done: * Fixed crash when default entity type is loaded from file * Memory utils that provide allocation tracking * Game End - * Save NONE when next_scene is not set and the scene is being saved \ No newline at end of file + * Save NONE when next_scene is not set and the scene is being saved + * Add player start entity that specifies where the player must start at the beginning of every level \ No newline at end of file