static void update_eye(void) { vector3 wanted, dir; float d; float max_speed; vec3_add_to(&gc.eye, &delta_eye); if (inner_state.state == IS_WAVE_CLEARED) { vec3_set(&wanted, 0, 0, -3.f*BASE_EYE_Z); } else { if (!ship.is_alive) { vec3_set(&wanted, 0, 0, -BASE_EYE_Z); } else { const struct foe_common *closest_foe; closest_foe = get_closest_foe(&ship.pos); if (closest_foe && #define D 4.f (d = vec2_distance(&closest_foe->pos, &ship.pos)) < D) { #define R .7 wanted.z = -(R*BASE_EYE_Z + (d/D)*(1.f - R)*BASE_EYE_Z); } else { wanted.z = -BASE_EYE_Z; } wanted.x = -(-BASE_EYE_Z/wanted.z)*.3f*ship.pos.x; wanted.y = -(-BASE_EYE_Z/wanted.z)*.3f*ship.pos.y; } } if (inner_state.state == IS_IN_GAME) max_speed = .5f; else max_speed = 1.5f; vec3_sub(&dir, &wanted, &gc.eye); vec3_mul_scalar(&dir, .05f); vec3_add_to(&delta_eye, &dir); vec3_clamp_length(&delta_eye, max_speed); /* damp */ vec3_mul_scalar(&delta_eye, .7); }
void check_vertex(struct vertexpickdata *data, vec3 position, cornerref const *ref, uint8_t flag) { float const radius = 5.0f; vec3 screenpos; if (project(&screenpos, &position, data->modelview, data->projection, data->viewport)) { vec2 screenposxy = {screenpos.x, data->viewport->height - screenpos.y}; float distance = vec2_distance(data->mouse, &screenposxy); if (distance < radius && screenpos.z < data->distance) { data->distance = screenpos.z; data->cornerref = (cornerref){ref->corner, flag}; } } }