void collision_detect(Trash* t){ Fix trad = int_to_fix(trash_radius(t)); Fix arad = int_to_fix(AVATAR_RADIUS); Fix tmass = (trash_radius(t) == 8 ? float_to_fix(1.0) : float_to_fix(2.0)); Fix amass = float_to_fix(4.0); Bool first_hit = vec_eq(t->vec, vec_zero); if (collision_circle_check(t->pos, trad, tick_avatar.pos, arad)){ if (t->type == POWER_CELL) { on_collision_power_cell(t); } else { collision_circle_bounce(t->pos, &t->vec, trad, tmass, tick_avatar.pos, &tick_avatar.vec, arad, amass); if (fix_lt(vec_get_x(tick_avatar.vec), fix_one)){ tick_avatar.vec = vec_set_x(tick_avatar.vec, fix_one); } on_collision_trash(t, first_hit); } } }
/** Maximum component of vector. */ inline float vector_component_max(avec v) { return std::max(vec_get_x(v), std::max(vec_get_y(v), vec_get_z(v))); }