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. 4
      todo.txt

@ -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;
}

@ -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);

@ -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

@ -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;
}

@ -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
* Implement turret state machine
* Fix Turret losing target at diagonals
Loading…
Cancel
Save