Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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};
        }
    }
}