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