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 Polygon_MoveSelf(polygon_p p, float move[3]) { vertex_p v; v = p->vertices; for(uint16_t i = 0; i < p->vertex_count; i++, v++) { vec3_add_to(v->position, move); } p->plane[3] = -vec3_dot(p->plane, p->vertices[0].position); }