Skip sqrt for homing check
This commit is contained in:
parent
eef8bb3365
commit
c928c09884
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue