Fixed rotation issues with turrets

dev
Shariq Shah 6 years ago
parent 2ebd4feac4
commit 289a480483
  1. 20
      src/common/linmath.c
  2. 3
      src/common/linmath.h
  3. 2
      src/common/version.h
  4. 32
      src/game/enemy.c
  5. 2
      todo.txt

@ -204,10 +204,24 @@ float vec3_dot(vec3* v1, vec3* v2)
v1->z * v2->z); v1->z * v2->z);
} }
float vec3_angle(vec3* dir1, vec3* dir2) float vec3_angle(vec3* from, vec3* to)
{ {
float dot = vec3_dot(dir1, dir2); float dot = vec3_dot(from, to);
return TO_DEGREES(acosf(dot)); 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;
} }

@ -91,7 +91,8 @@ int vec3_equals(vec3* v1, vec3* v2);
float vec3_len(vec3* val); float vec3_len(vec3* val);
float vec3_distance(vec3 p1, vec3 p2); float vec3_distance(vec3 p1, vec3 p2);
float vec3_dot(vec3* v1, vec3* v2); 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 */ /* vec4 */
int vec4_equals(vec4* v1, vec4* v2); int vec4_equals(vec4* v1, vec4* v2);

@ -4,7 +4,7 @@
/* Auto generated version file. DO NOT MODIFY */ /* Auto generated version file. DO NOT MODIFY */
#define SYMMETRY_VERSION_MAJOR 0 #define SYMMETRY_VERSION_MAJOR 0
#define SYMMETRY_VERSION_MINOR 1 #define SYMMETRY_VERSION_MINOR 1
#define SYMMETRY_VERSION_REVISION 322 #define SYMMETRY_VERSION_REVISION 323
#define SYMMETRY_VERSION_BRANCH "dev" #define SYMMETRY_VERSION_BRANCH "dev"
#endif #endif

@ -252,9 +252,8 @@ void enemy_update_physics_turret(struct Enemy* enemy, struct Game_State* game_st
{ {
float ticks = (float)platform_ticks_get(); float ticks = (float)platform_ticks_get();
vec3 translation = { 0.f }; vec3 translation = { 0.f };
//transform_get_absolute_position(enemy->mesh, &translation);
vec3_assign(&translation, &enemy->mesh->base.transform.position); 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); 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; struct Ray turret_ray;
transform_get_absolute_position(enemy->mesh, &turret_ray.origin); transform_get_absolute_position(enemy->mesh, &turret_ray.origin);
transform_get_forward(enemy, &turret_ray.direction); 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) switch(enemy->current_state)
{ {
case TURRET_DEFAULT: 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) if(distance <= enemy->Turret.vision_range)
{ {
vec3 player_pos = { 0.f }; vec3 player_pos = { 0.f };
transform_get_absolute_position(&scene->player, &player_pos);
vec3 dir_to_player = { 0.f }; vec3 dir_to_player = { 0.f };
turret_ray.origin.y = 0.f; transform_get_absolute_position(&scene->player, &player_pos);
player_pos.y = 0.f;
vec3_sub(&dir_to_player, &player_pos, &turret_ray.origin); vec3_sub(&dir_to_player, &player_pos, &turret_ray.origin);
vec3_norm(&dir_to_player, &dir_to_player); 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); 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; float yaw_required_to_face_player = floorf(vec3_signed_angle(&dir_to_player, &turret_ray.direction, &UNIT_Y));
//turret_ray.direction.y = 0.f;
float yaw_required_to_face_player = vec3_angle(&dir_to_player, &turret_ray.direction);
float current_yaw = quat_get_yaw(&enemy->base.transform.rotation); 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 = current_yaw - yaw_required_to_face_player;
float new_target_yaw = yaw_required_to_face_player + current_yaw; if(fabsf(floorf(new_target_yaw)) > enemy->Turret.max_yaw)
if(fabsf(new_target_yaw) > enemy->Turret.max_yaw)
{ {
log_message("Can't face player"); log_message("Can't face player");
log_message("New Yaw : %.3f", new_target_yaw); 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("Cur yaw : %.3f", current_yaw);
log_message("Ang bet : %.3f", yaw_required_to_face_player); log_message("Ang bet : %.3f", yaw_required_to_face_player);
enemy_state_set_turret(enemy, TURRET_ALERT); enemy_state_set_turret(enemy, TURRET_ALERT);
} }
else else
{ {
log_message("Acquiring Target...");
float difference = fabsf(enemy->Turret.target_yaw - new_target_yaw); float difference = fabsf(enemy->Turret.target_yaw - new_target_yaw);
if(difference > 1.f) if(difference > 1.f)
enemy->Turret.target_yaw = new_target_yaw; 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 else
{ {
log_message("Can't find player, cannot attack");
enemy_state_set_turret(enemy, TURRET_ACQUIRE_TARGET); enemy_state_set_turret(enemy, TURRET_ACQUIRE_TARGET);
} }
} }
} }
break; break;
} }
} }
void enemy_state_set_turret(struct Enemy* enemy, int state) 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; break;
case TURRET_ACQUIRE_TARGET: 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.scan = false;
enemy->Turret.turn_speed_current = enemy->Turret.turn_speed_when_targetting; 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.pulsate = false;
enemy->Turret.scan = 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); vec4_assign(&model->material_params[MMP_DIFFUSE_COL].val_vec4, &enemy->Turret.color_attack);
enemy->Turret.time_elapsed_since_attack = enemy->Turret.attack_cooldown; enemy->Turret.time_elapsed_since_attack = enemy->Turret.attack_cooldown;
} }

@ -3,7 +3,6 @@ Todo:
- Add all sound source properties to propery inspector - Add all sound source properties to propery inspector
- Add turret properties to property inspector - Add turret properties to property inspector
- Add another ambient sound_source entity as child to enemy entity - 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 - Fix rotate gizmo's origin not being set to the selected entity
- Player shooting - Player shooting
- Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded - Player jump cooldown, don't allow jump until a certian time interval has passed, even if we're grounded
@ -415,3 +414,4 @@ Done:
* Introduced fixed time step interval which can be configured and be used for movement and other physics related updates * Introduced fixed time step interval which can be configured and be used for movement and other physics related updates
* Made movement framerate independent * Made movement framerate independent
* Implement turret state machine * Implement turret state machine
* Fix Turret losing target at diagonals
Loading…
Cancel
Save