Skip sqrt for homing check

This commit is contained in:
Kp 2014-10-10 02:41:51 +00:00
parent eef8bb3365
commit c928c09884
4 changed files with 15 additions and 8 deletions

View file

@ -149,7 +149,7 @@ vms_vector &vm_vec_scale_add2 (vms_vector &dest, const vms_vector &src, fix k);
//dest *= n/d
vms_vector &vm_vec_scale2 (vms_vector &dest, fix n, fix d);
fix64 vm_vec_mag2 (const vms_vector &v) __attribute_warn_unused_result;
//returns magnitude of a vector
fix vm_vec_mag (const vms_vector &v) __attribute_warn_unused_result;

View file

@ -157,7 +157,6 @@ enum laser_level_t
// Constants governing homing missile behavior.
#define HOMING_MAX_TRACKABLE_DOT (3*F1_0/4) // was (7*F1_0/8) in original Descent 2
#define HOMING_MIN_TRACKABLE_DOT (3*(F1_0 - HOMING_MAX_TRACKABLE_DOT)/4 + HOMING_MAX_TRACKABLE_DOT)
#define HOMING_MAX_TRACKABLE_DIST (F1_0*250)
#define HOMING_FLY_STRAIGHT_TIME (F1_0/8)
#define HOMING_TURN_TIME (DESIGNATED_GAME_FRAMETIME)

View file

@ -189,13 +189,20 @@ static fix vm_vec_dot3(fix x,fix y,fix z,const vms_vector &v)
}
//returns magnitude of a vector
fix vm_vec_mag(const vms_vector &v)
fix64 vm_vec_mag2(const vms_vector &v)
{
quadint q;
q.q = 0;
fixmulaccum(&q,v.x,v.x);
fixmulaccum(&q,v.y,v.y);
fixmulaccum(&q,v.z,v.z);
return q.q;
}
fix vm_vec_mag(const vms_vector &v)
{
quadint q;
q.q = vm_vec_mag2(v);
return quad_sqrt(q);
}

View file

@ -314,7 +314,7 @@ static objptridx_t create_weapon_object(int weapon_type,segnum_t segnum,vms_vect
// If you want the Omega Cannon view cone to be different than the Homing Missile viewcone, contact MK to make the change.
// (Unless you are a programmer, in which case, do it yourself!)
#define OMEGA_MIN_TRACKABLE_DOT (15*F1_0/16) // Larger values mean narrower cone. F1_0 means damn near impossible. 0 means 180 degree field of view.
#define OMEGA_MAX_TRACKABLE_DIST MAX_OMEGA_DIST // An object must be at least this close to be tracked.
static const fix64 OMEGA_MAX_TRACKABLE_DIST = MAX_OMEGA_DIST; // An object must be at least this close to be tracked.
// Note, you don't need to change these constants. You can control damage and energy consumption by changing the
// usual bitmaps.tbl parameters.
@ -1085,12 +1085,13 @@ objptridx_t find_homing_object_complete(vms_vector *curpos, vobjptridx_t tracker
throw std::logic_error("tracking without homing_flag");
}
fix max_trackable_dist = HOMING_MAX_TRACKABLE_DIST;
const fix64 HOMING_MAX_TRACKABLE_DIST = F1_0*250;
fix64 max_trackable_dist = HOMING_MAX_TRACKABLE_DIST * HOMING_MAX_TRACKABLE_DIST;
fix min_trackable_dot = HOMING_MAX_TRACKABLE_DOT;
#if defined(DXX_BUILD_DESCENT_II)
if (tracker->id == OMEGA_ID) {
max_trackable_dist = OMEGA_MAX_TRACKABLE_DIST;
max_trackable_dist = OMEGA_MAX_TRACKABLE_DIST * OMEGA_MAX_TRACKABLE_DIST;
min_trackable_dot = OMEGA_MIN_TRACKABLE_DOT;
}
#endif
@ -1098,7 +1099,7 @@ objptridx_t find_homing_object_complete(vms_vector *curpos, vobjptridx_t tracker
objptridx_t best_objnum = object_none;
for (objnum_t objnum=object_first; objnum<=Highest_object_index; objnum++) {
int is_proximity = 0;
fix dot, dist;
fix dot;
vms_vector vec_to_curobj;
auto curobjp = vobjptridx(objnum);
@ -1142,7 +1143,7 @@ objptridx_t find_homing_object_complete(vms_vector *curpos, vobjptridx_t tracker
}
vm_vec_sub(vec_to_curobj, curobjp->pos, *curpos);
dist = vm_vec_mag(vec_to_curobj);
auto dist = vm_vec_mag2(vec_to_curobj);
if (dist < max_trackable_dist) {
vm_vec_normalize(vec_to_curobj);