From 289a480483e3b9f8b9c8ce720da3f700d22c94ea Mon Sep 17 00:00:00 2001 From: Shariq Shah Date: Thu, 30 Jan 2020 22:59:23 +1100 Subject: [PATCH] Fixed rotation issues with turrets --- src/common/linmath.c | 20 +++++++++++++++++--- src/common/linmath.h | 3 ++- src/common/version.h | 2 +- src/game/enemy.c | 32 +++++++++++++++++++------------- todo.txt | 4 ++-- 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/common/linmath.c b/src/common/linmath.c index 1db83ed..df97715 100755 --- a/src/common/linmath.c +++ b/src/common/linmath.c @@ -204,10 +204,24 @@ float vec3_dot(vec3* v1, vec3* v2) v1->z * v2->z); } -float vec3_angle(vec3* dir1, vec3* dir2) +float vec3_angle(vec3* from, vec3* to) { - float dot = vec3_dot(dir1, dir2); - return TO_DEGREES(acosf(dot)); + float dot = vec3_dot(from, to); + float len_from = vec3_len(from); + float len_to = vec3_len(to); + return TO_DEGREES(acosf(dot / (len_from * len_to))); +} + +float vec3_signed_angle(vec3* from, vec3* to, vec3* axis) +{ + float unsigned_angle = vec3_angle(from, to); + + float cross_x = from->y * to->z - from->z * to->z; + float cross_y = from->z * to->x - from->x * to->z; + float cross_z = from->x * to->y - from->y * to->x; + float sign = (axis->x * cross_x + axis->y * cross_y + axis->z * cross_z) < 0.f ? -1.f : 1.f; + + return unsigned_angle * sign; } diff --git a/src/common/linmath.h b/src/common/linmath.h index 589d803..9b05170 100755 --- a/src/common/linmath.h +++ b/src/common/linmath.h @@ -91,7 +91,8 @@ int vec3_equals(vec3* v1, vec3* v2); float vec3_len(vec3* val); float vec3_distance(vec3 p1, vec3 p2); float vec3_dot(vec3* v1, vec3* v2); -float vec3_angle(vec3* dir1, vec3* dir2); +float vec3_angle(vec3* from, vec3* to); +float vec3_signed_angle(vec3* from, vec3* to, vec3* axis); /* vec4 */ int vec4_equals(vec4* v1, vec4* v2); diff --git a/src/common/version.h b/src/common/version.h index 9d82d9a..a6fa642 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 1 -#define SYMMETRY_VERSION_REVISION 322 +#define SYMMETRY_VERSION_REVISION 323 #define SYMMETRY_VERSION_BRANCH "dev" #endif \ No newline at end of file diff --git a/src/game/enemy.c b/src/game/enemy.c index bf335f8..5efc51b 100644 --- a/src/game/enemy.c +++ b/src/game/enemy.c @@ -252,9 +252,8 @@ void enemy_update_physics_turret(struct Enemy* enemy, struct Game_State* game_st { float ticks = (float)platform_ticks_get(); vec3 translation = { 0.f }; - //transform_get_absolute_position(enemy->mesh, &translation); vec3_assign(&translation, &enemy->mesh->base.transform.position); - translation.y += sinf(TO_RADIANS(ticks * enemy->Turret.pulsate_speed_scale)) * fixed_dt * enemy->Turret.pulsate_height; + translation.y += sinf(TO_RADIANS(ticks * enemy->Turret.pulsate_speed_scale)) * enemy->Turret.pulsate_height * fixed_dt ; transform_set_position(enemy->mesh, &translation); } } @@ -266,6 +265,12 @@ void enemy_update_ai_turret(struct Enemy* enemy, struct Game_State* game_state, struct Ray turret_ray; transform_get_absolute_position(enemy->mesh, &turret_ray.origin); transform_get_forward(enemy, &turret_ray.direction); + + //quat rot = { 0.f, 0.f, 0.f, 1.f }; + //quat_assign(&rot, &enemy->base.transform.rotation); + //quat_axis_angle(&rot, &UNIT_X, -90); + //vec4 color = { 0.f, 0.f, 1.f, 1.f }; + //im_arc(enemy->Turret.vision_range, -enemy->Turret.max_yaw, enemy->Turret.max_yaw, 32, false, turret_ray.origin, rot, color, 5); switch(enemy->current_state) { case TURRET_DEFAULT: @@ -321,30 +326,25 @@ void enemy_update_ai_turret(struct Enemy* enemy, struct Game_State* game_state, if(distance <= enemy->Turret.vision_range) { vec3 player_pos = { 0.f }; - transform_get_absolute_position(&scene->player, &player_pos); vec3 dir_to_player = { 0.f }; - turret_ray.origin.y = 0.f; - player_pos.y = 0.f; + transform_get_absolute_position(&scene->player, &player_pos); vec3_sub(&dir_to_player, &player_pos, &turret_ray.origin); vec3_norm(&dir_to_player, &dir_to_player); im_ray_origin_dir(turret_ray.origin, dir_to_player, 10.f, (vec4) { 0.f, 1.f, 0.f, 1.f }, 5); - //dir_to_player.y = 0.f; - //turret_ray.direction.y = 0.f; - float yaw_required_to_face_player = vec3_angle(&dir_to_player, &turret_ray.direction); + float yaw_required_to_face_player = floorf(vec3_signed_angle(&dir_to_player, &turret_ray.direction, &UNIT_Y)); float current_yaw = quat_get_yaw(&enemy->base.transform.rotation); - debug_vars_show_float("Yaw Required", yaw_required_to_face_player); - float new_target_yaw = yaw_required_to_face_player + current_yaw; - if(fabsf(new_target_yaw) > enemy->Turret.max_yaw) + float new_target_yaw = current_yaw - yaw_required_to_face_player; + if(fabsf(floorf(new_target_yaw)) > enemy->Turret.max_yaw) { log_message("Can't face player"); log_message("New Yaw : %.3f", new_target_yaw); - log_message("Max yaw : %.3f", enemy->Turret.max_yaw); log_message("Cur yaw : %.3f", current_yaw); log_message("Ang bet : %.3f", yaw_required_to_face_player); enemy_state_set_turret(enemy, TURRET_ALERT); } else { + log_message("Acquiring Target..."); float difference = fabsf(enemy->Turret.target_yaw - new_target_yaw); if(difference > 1.f) enemy->Turret.target_yaw = new_target_yaw; @@ -381,12 +381,14 @@ void enemy_update_ai_turret(struct Enemy* enemy, struct Game_State* game_state, } else { + log_message("Can't find player, cannot attack"); enemy_state_set_turret(enemy, TURRET_ACQUIRE_TARGET); } } } break; } + } void enemy_state_set_turret(struct Enemy* enemy, int state) @@ -422,7 +424,9 @@ void enemy_state_set_turret(struct Enemy* enemy, int state) break; case TURRET_ACQUIRE_TARGET: { - vec4_assign(&model->material_params[MMP_DIFFUSE_COL].val_vec4, &enemy->Turret.color_attack); + //vec4_assign(&model->material_params[MMP_DIFFUSE_COL].val_vec4, &enemy->Turret.color_attack); + vec4 color = {0.f, 0.f, 1.f, 1.f}; + vec4_assign(&model->material_params[MMP_DIFFUSE_COL].val_vec4, &color); enemy->Turret.scan = false; enemy->Turret.turn_speed_current = enemy->Turret.turn_speed_when_targetting; } @@ -431,6 +435,8 @@ void enemy_state_set_turret(struct Enemy* enemy, int state) { enemy->Turret.pulsate = false; enemy->Turret.scan = false; + float current_yaw = quat_get_yaw(&enemy->base.transform.rotation); + enemy->Turret.target_yaw = current_yaw; vec4_assign(&model->material_params[MMP_DIFFUSE_COL].val_vec4, &enemy->Turret.color_attack); enemy->Turret.time_elapsed_since_attack = enemy->Turret.attack_cooldown; } diff --git a/todo.txt b/todo.txt index 537f9e4..7397bc4 100644 --- a/todo.txt +++ b/todo.txt @@ -3,7 +3,6 @@ Todo: - Add all sound source properties to propery inspector - Add turret properties to property inspector - Add another ambient sound_source entity as child to enemy entity - - Fix Turret losing target at diagonals - Fix rotate gizmo's origin not being set to the selected entity - Player shooting - Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded @@ -414,4 +413,5 @@ Done: * Added Scene reload command * Introduced fixed time step interval which can be configured and be used for movement and other physics related updates * Made movement framerate independent - * Implement turret state machine \ No newline at end of file + * Implement turret state machine + * Fix Turret losing target at diagonals \ No newline at end of file