static void _control_camera(Game* G, float delta_time) { if(G->num_points == 1) { Vec2 curr = G->points[0].pos; Vec2 delta = vec2_sub(curr, G->prev_single); /* L-R rotation */ Quaternion q = quat_from_axis_anglef(0, 1, 0, delta_time*delta.x*0.2f); G->camera.orientation = quat_multiply(G->camera.orientation, q); /* U-D rotation */ q = quat_from_axis_anglef(1, 0, 0, delta_time*delta.y*0.2f); G->camera.orientation = quat_multiply(q, G->camera.orientation); G->prev_single = curr; } else if(G->num_points == 2) { float camera_speed = 0.1f; Vec3 look = quat_get_z_axis(G->camera.orientation); Vec3 right = quat_get_x_axis(G->camera.orientation); Vec2 avg = vec2_add(G->points[0].pos, G->points[1].pos); Vec2 delta; avg = vec2_mul_scalar(avg, 0.5f); delta = vec2_sub(avg, G->prev_double); look = vec3_mul_scalar(look, -delta.y*camera_speed); right = vec3_mul_scalar(right, delta.x*camera_speed); G->camera.position = vec3_add(G->camera.position, look); G->camera.position = vec3_add(G->camera.position, right); G->prev_double = avg; } }
void Convert_Sat_State(double pos[3], double vel[3]) { /* Converts the satellite's position and velocity */ /* vectors from normalized values to km and km/sec */ // Scale_Vector(xkmper, pos); // Scale_Vector(xkmper*xmnpda/secday, vel); vec3_mul_scalar(pos, xkmper, pos); vec3_mul_scalar(vel, xkmper*xmnpda/secday, vel); }
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); }
/* Calculates if a position is eclipsed. */ bool is_eclipsed(const double pos[3], const double sol[3], double *depth) { double Rho[3], earth[3]; /* Determine partial eclipse */ double sd_earth = ArcSin(xkmper / vec3_length(pos)); vec3_sub(sol, pos, Rho); double sd_sun = ArcSin(sr / vec3_length(Rho)); vec3_mul_scalar(pos, -1, earth); double delta = ArcCos( vec3_dot(sol, earth) / vec3_length(sol) / vec3_length(earth) ); *depth = sd_earth - sd_sun - delta; if (sd_earth < sd_sun) return false; else if (*depth >= 0) return true; else return false; }
void SSBoneFrame_Update(struct ss_bone_frame_s *bf) { float cmd_tr[3], tr[3], t; ss_bone_tag_p btag = bf->bone_tags; bone_tag_p src_btag, next_btag; skeletal_model_p model = bf->animations.model; bone_frame_p curr_bf, next_bf; next_bf = model->animations[bf->animations.next_animation].frames + bf->animations.next_frame; curr_bf = model->animations[bf->animations.current_animation].frames + bf->animations.current_frame; t = 1.0 - bf->animations.lerp; if(bf->transform && (curr_bf->command & ANIM_CMD_MOVE)) { Mat4_vec3_rot_macro(tr, bf->transform, curr_bf->move); vec3_mul_scalar(cmd_tr, tr, bf->animations.lerp); } else { vec3_set_zero(tr); vec3_set_zero(cmd_tr); } vec3_interpolate_macro(bf->bb_max, curr_bf->bb_max, next_bf->bb_max, bf->animations.lerp, t); vec3_add(bf->bb_max, bf->bb_max, cmd_tr); vec3_interpolate_macro(bf->bb_min, curr_bf->bb_min, next_bf->bb_min, bf->animations.lerp, t); vec3_add(bf->bb_min, bf->bb_min, cmd_tr); vec3_interpolate_macro(bf->centre, curr_bf->centre, next_bf->centre, bf->animations.lerp, t); vec3_add(bf->centre, bf->centre, cmd_tr); vec3_interpolate_macro(bf->pos, curr_bf->pos, next_bf->pos, bf->animations.lerp, t); vec3_add(bf->pos, bf->pos, cmd_tr); next_btag = next_bf->bone_tags; src_btag = curr_bf->bone_tags; for(uint16_t k = 0; k < curr_bf->bone_tag_count; k++, btag++, src_btag++, next_btag++) { vec3_interpolate_macro(btag->offset, src_btag->offset, next_btag->offset, bf->animations.lerp, t); vec3_copy(btag->transform+12, btag->offset); btag->transform[15] = 1.0; if(k == 0) { vec3_add(btag->transform+12, btag->transform+12, bf->pos); vec4_slerp(btag->qrotate, src_btag->qrotate, next_btag->qrotate, bf->animations.lerp); } else { bone_tag_p ov_src_btag = src_btag; bone_tag_p ov_next_btag = next_btag; float ov_lerp = bf->animations.lerp; if(btag->alt_anim && btag->alt_anim->model && (btag->alt_anim->model->mesh_tree[k].replace_anim != 0)) { bone_frame_p ov_curr_bf = btag->alt_anim->model->animations[btag->alt_anim->current_animation].frames + btag->alt_anim->current_frame; bone_frame_p ov_next_bf = btag->alt_anim->model->animations[btag->alt_anim->next_animation].frames + btag->alt_anim->next_frame; ov_src_btag = ov_curr_bf->bone_tags + k; ov_next_btag = ov_next_bf->bone_tags + k; ov_lerp = btag->alt_anim->lerp; } vec4_slerp(btag->qrotate, ov_src_btag->qrotate, ov_next_btag->qrotate, ov_lerp); } Mat4_set_qrotation(btag->transform, btag->qrotate); } /* * build absolute coordinate matrix system */ btag = bf->bone_tags; Mat4_Copy(btag->full_transform, btag->transform); btag++; for(uint16_t k = 1; k < curr_bf->bone_tag_count; k++, btag++) { Mat4_Mat4_mul(btag->full_transform, btag->parent->full_transform, btag->transform); } for(ss_animation_p ss_anim = &bf->animations; ss_anim; ss_anim = ss_anim->next) { SSBoneFrame_TargetBoneToSlerp(bf, ss_anim); } }