Replace Zero_vector by vector{}

As far as the set of .cpp files which are using vecmat.h are
concerned, `Zero_vector` is out of reach for the compiler optimizer,
because it is extern / lives in a separate translation unit. An
expression like `x == Zero_vector` or `v = Zero_vector` thus has to
perform memory loads (for Zero_vector's x,y,z parts) before
comparison or copying, respectively. By using an immediate zero
vector `vector{}` instead, the unnecessary extra loads should go
away.

I present exhibit A:

```
void copyxx(vector *x) { *x = Zero_vector; }

4905e0: 48 8b 05 41 c0 56 00  movq 0x56c041(%rip),%rax  # 9fc628 <Zero_vector>
4905e7: 48 89 07              movq %rax,(%rdi)
4905ea: 8b 05 40 c0 56 00     movl 0x56c040(%rip),%eax  # 9fc630 <Zero_vector+0x8>
4905f0: 89 47 08              movl %eax,0x8(%rdi)
4905f3: c3                    ret
```

vs.

```
void copyxx(vector *x) { *x = vector{}; }

4905c0: 48 c7 07 00 00 00 00  movq $0x0,(%rdi)
4905c7: c7 47 08 00 00 00 00  movl $0x0,0x8(%rdi)
4905ce: c3                    ret
```
This commit is contained in:
Jan Engelhardt
2025-06-03 11:13:06 +02:00
parent 58aa9f55d9
commit a7398dd65e
23 changed files with 121 additions and 125 deletions

View File

@@ -1745,7 +1745,7 @@ bool AIMoveTowardsPosition(object *obj, /*velocity *new_vel,*/ vector *pos, floa
if (stop_at_end_point) {
if (vm_VectorDistance(pos, &obj->pos) <= .2f) {
obj->mtype.phys_info.velocity = Zero_vector;
obj->mtype.phys_info.velocity = vector{};
*f_moved = true;
return true;
}
@@ -1772,7 +1772,7 @@ bool AIMoveTowardsPosition(object *obj, /*velocity *new_vel,*/ vector *pos, floa
if (*pos == obj->pos) {
physics_info *phys_info = &obj->mtype.phys_info;
if (phys_info->velocity != Zero_vector) {
if (phys_info->velocity != vector{}) {
vector vel_diff = -phys_info->velocity;
scalar delta_vel = vm_NormalizeVector(&vel_diff);
scalar max_delta_vel = Frametime * ai_info->max_delta_velocity * acc_scale;
@@ -1825,7 +1825,7 @@ bool move_relative_object_vec(object *obj, vector *vec, object *target, float ci
normal_component = opposite_fvec * vm_Dot3Product(opposite_fvec, vec_to_plane);
plane_component = vec_to_plane - normal_component;
if (plane_component == Zero_vector) {
if (plane_component == vector{}) {
goal_dir = target->orient.rvec;
} else {
goal_dir = plane_component;
@@ -1914,7 +1914,7 @@ bool compute_dodge_dir(vector *movement_dir, object *obj, object *dodge_obj) {
dodge_vec *= scale;
if (dodge_vec != Zero_vector && (obj->ai_info->dodge_till_time < Gametime ||
if (dodge_vec != vector{} && (obj->ai_info->dodge_till_time < Gametime ||
dodge_vec.mag() > obj->ai_info->last_dodge_dir.mag())) {
obj->ai_info->last_dodge_dir = dodge_vec;
}
@@ -1953,7 +1953,7 @@ bool goal_do_avoid_walls(object *obj, vector *mdir) {
int num_faces;
float rad;
int i;
vector awall_dir = Zero_vector;
vector awall_dir{};
float closest_dist;
vector pos;
bool f_danger = false;
@@ -1973,7 +1973,7 @@ bool goal_do_avoid_walls(object *obj, vector *mdir) {
closest_dist = rad + 1.0f;
if (obj->mtype.phys_info.velocity == Zero_vector) {
if (obj->mtype.phys_info.velocity == vector{}) {
return false;
}
@@ -2115,7 +2115,7 @@ void AITurnTowardsDir(object *obj, /*velocity *new_vel,*/ vector *goal_dir /*, b
matrix saved_orient = obj->orient;
vector saved_uvec = obj->orient.uvec;
if (*goal_dir == Zero_vector || vm_Dot3Product(obj->orient.fvec, (*goal_dir)) >= ONE_DEGREE_ARC_COS)
if (*goal_dir == vector{} || vm_Dot3Product(obj->orient.fvec, (*goal_dir)) >= ONE_DEGREE_ARC_COS)
return; // No goal_dir or less than 1 degree off goal
if (obj->size > 32.0f && (vm_Dot3Product(obj->orient.fvec, (*goal_dir))) >= FIVE_DEGREE_ARC_COS)
@@ -2318,7 +2318,7 @@ bool MeleeHitOk(object *obj) {
if (target->movement_type == MT_PHYSICS || target->movement_type == MT_PHYSICS) {
relative_vel = -target->mtype.phys_info.velocity;
} else {
relative_vel = Zero_vector;
relative_vel = vector{};
}
}
@@ -3685,7 +3685,7 @@ bool AIInit(object *obj, uint8_t ai_class, uint8_t ai_type, uint8_t ai_movement)
ai_info->vec_to_target_perceived = obj->orient.fvec;
ai_info->last_dodge_dir = Zero_vector;
ai_info->last_dodge_dir = vector{};
ai_info->dodge_till_time = Gametime - 1.0f;
if (ObjGet(obj->parent_handle)) {
@@ -4081,7 +4081,7 @@ bool AiGoalAvoid(vector *adir, object *obj, object *a_obj, float dist) {
if (a_obj->movement_type == MT_PHYSICS || a_obj->movement_type == MT_WALKING)
a_vel = a_obj->mtype.phys_info.velocity;
else
a_vel = Zero_vector;
a_vel = vector{};
vector to_avoid = a_obj->pos - obj->pos;
vector mdir;
@@ -4546,11 +4546,11 @@ void ai_move(object *obj) {
// object *g_objs[5]; // 1 target + 2 enemies + 2 friends
object *targetptr = ObjGet(ai_info->target_handle); // The target of this AI
ai_info->movement_dir = Zero_vector;
ai_info->movement_dir = vector{};
// Hacked flocking code
if (ai_info->ai_type == AIT_BIRD_FLOCK1) {
vector composite_dir = Zero_vector;
vector composite_dir{};
for (int temp = 0; temp < AI_FriendNumNear; temp++) {
object *g_obj = AI_FriendObj[temp];
@@ -4565,7 +4565,7 @@ void ai_move(object *obj) {
}
// Facing code
if (composite_dir == Zero_vector)
if (composite_dir == vector{})
composite_dir = obj->orient.fvec;
// FLOCK HEIGHT CODE
@@ -4601,8 +4601,8 @@ void ai_move(object *obj) {
// Stop objects that have not been active lately
if (!(ai_info->flags & AIF_PERSISTANT) && Gametime - ai_info->last_see_target_time > CHECK_VIS_INFREQUENTLY_TIME &&
Gametime - ai_info->last_hear_target_time > CHECK_VIS_INFREQUENTLY_TIME && ai_info->awareness == AWARE_NONE) {
obj->mtype.phys_info.velocity = Zero_vector;
obj->mtype.phys_info.rotvel = Zero_vector;
obj->mtype.phys_info.velocity = vector{};
obj->mtype.phys_info.rotvel = vector{};
} else {
// Determine movement stuff
if (obj->movement_type == MT_PHYSICS || obj->movement_type == MT_WALKING) {
@@ -5004,7 +5004,7 @@ void ai_move(object *obj) {
int16_t robots[6];
int num_robots =
fvi_QuickDistObjectList(&obj->pos, obj->roomnum, 30.0f, robots, 6, false, true, false, true);
vector d = Zero_vector;
vector d{};
int i;
float closest = 100000.0f;
@@ -5031,7 +5031,7 @@ void ai_move(object *obj) {
}
}
if (d != Zero_vector) {
if (d != vector{}) {
if (closest < 30.0f) {
float scale = 1.0f - closest / 30.0f;
vm_NormalizeVector(&d);
@@ -5065,16 +5065,16 @@ void ai_move(object *obj) {
}
} else {
if (!(f_dodge || f_avoid ||
(ai_info->dodge_till_time >= Gametime && ai_info->last_dodge_dir != Zero_vector))) {
(ai_info->dodge_till_time >= Gametime && ai_info->last_dodge_dir != vector{}))) {
AIMoveTowardsPosition(obj, &obj->pos, 1.0f, false, &goal_mdir, &goal_f_moved);
goal_mset = true;
}
}
// BLEND THIS!
if ((f_dodge || f_avoid || (ai_info->dodge_till_time >= Gametime && ai_info->last_dodge_dir != Zero_vector)) ||
if ((f_dodge || f_avoid || (ai_info->dodge_till_time >= Gametime && ai_info->last_dodge_dir != vector{})) ||
(!goal_f_moved && goal_mset)) {
if (!f_dodge && (ai_info->dodge_till_time >= Gametime && ai_info->last_dodge_dir != Zero_vector)) {
if (!f_dodge && (ai_info->dodge_till_time >= Gametime && ai_info->last_dodge_dir != vector{})) {
f_dodge = true;
ai_info->movement_dir += ai_info->last_dodge_dir;
@@ -5550,7 +5550,7 @@ static inline void ai_walker_stuff(object *obj) {
}
}
obj->mtype.phys_info.velocity = Zero_vector;
obj->mtype.phys_info.velocity = vector{};
}
} else if (ai_info->movement_type == MC_WALKING) {
int next_anim;
@@ -6028,8 +6028,8 @@ void AIDoFrame(object *obj) {
// AI objects don't use thrust (in general)
obj->mtype.phys_info.flags &= ~PF_USES_THRUST;
obj->mtype.phys_info.rotthrust = Zero_vector;
obj->mtype.phys_info.thrust = Zero_vector;
obj->mtype.phys_info.rotthrust = vector{};
obj->mtype.phys_info.thrust = vector{};
if (obj->type == OBJ_DUMMY)
return;
@@ -6145,7 +6145,7 @@ void AIDoFrame(object *obj) {
if (speed > 0.1f && speed <= ai_info->max_velocity * 2.0) {
if (obj->mtype.phys_info.drag > 0.0f && obj->mtype.phys_info.mass > 0.0f) {
obj->mtype.phys_info.flags |= PF_USES_THRUST;
obj->mtype.phys_info.rotthrust = Zero_vector;
obj->mtype.phys_info.rotthrust = vector{};
obj->mtype.phys_info.thrust = obj->mtype.phys_info.velocity * obj->mtype.phys_info.drag;
}
}

View File

@@ -2640,7 +2640,7 @@ void PlayerSetControlToAI(int slot, float velocity) {
pobj->ai_info->last_render_time = -1.0f;
pobj->ai_info->next_target_update_time = Gametime;
pobj->ai_info->notify_flags |= AI_NOTIFIES_ALWAYS_ON;
pobj->ai_info->last_see_target_pos = Zero_vector;
pobj->ai_info->last_see_target_pos = vector{};
pobj->ai_info->dodge_vel_percent = 1.0f;
pobj->ai_info->attack_vel_percent = 1.0f;
pobj->ai_info->fight_same = 0.0f;

View File

@@ -1309,7 +1309,7 @@ int CreateAndFireWeapon(vector *pos, vector *dir, object *parent, int weapon_num
if (fdot > 0.0)
fvel = parent->orient.fvec * fdot;
else
fvel = Zero_vector;
fvel = vector{};
vector rvel = 0.1f * parent->orient.rvec * vm_Dot3Product(parent->mtype.phys_info.velocity, parent->orient.rvec);
vector uvel = 0.1f * parent->orient.uvec * vm_Dot3Product(parent->mtype.phys_info.velocity, parent->orient.uvec);
@@ -1373,7 +1373,7 @@ int CreateAndFireWeapon(vector *pos, vector *dir, object *parent, int weapon_num
// Steers a homing missile
void HomingTurnTowardObj(object *weapon, object *target) {
vector dir_to_target;
vector movement = Zero_vector;
vector movement{};
if (target == NULL)
return;
@@ -1613,7 +1613,7 @@ object *HomingAquireTarget(object *obj) {
// Does homing code
void HomingDoFrame(object *obj) {
obj->mtype.phys_info.rotthrust = Zero_vector;
obj->mtype.phys_info.rotthrust = vector{};
HomingTurnTowardObj(obj, HomingAquireTarget(obj));
}
@@ -1840,7 +1840,7 @@ int FireWeaponFromObject(object *obj, int weapon_num, int gun_num, bool f_force_
if (f_force_forward) {
WeaponCalcGun(&laser_pos, NULL, obj, gun_num);
laser_dir = obj->orient.fvec;
} else if (f_force_target && obj->ai_info && obj->ai_info->vec_to_target_perceived != Zero_vector) {
} else if (f_force_target && obj->ai_info && obj->ai_info->vec_to_target_perceived != vector{}) {
WeaponCalcGun(&laser_pos, NULL, obj, gun_num);
laser_dir = obj->ai_info->vec_to_target_perceived;
} else {
@@ -2301,7 +2301,7 @@ void DoSprayEffect(object *obj, otype_wb_info *static_wb, uint8_t wb_index) {
if (fdot > (scalar)0.0)
fvel = obj->orient.fvec * fdot;
else
fvel = Zero_vector;
fvel = vector{};
vector rvel = (scalar)0.1f * obj->orient.rvec * vm_Dot3Product(obj->mtype.phys_info.velocity, obj->orient.rvec);
vector uvel = (scalar)0.1f * obj->orient.uvec * vm_Dot3Product(obj->mtype.phys_info.velocity, obj->orient.uvec);
@@ -3355,7 +3355,7 @@ void TimeoutWeapon(object *obj) {
if ((Weapons[n].flags & WF_MATTER_WEAPON) && !(Weapons[n].flags & WF_SPAWNS_TIMEOUT) &&
(Weapons[n].spawn_count <= 0)) {
vector temp = Zero_vector;
vector temp{};
if (Weapons[obj->id].sounds[WSI_IMPACT_WALL] != SOUND_NONE_INDEX)
Sound_system.Play3dSound(Weapons[obj->id].sounds[WSI_IMPACT_WALL], SND_PRIORITY_HIGH, obj);

View File

@@ -1092,7 +1092,7 @@ void SetFallingPhysics(object *objp) {
// Special stuff for walkers
if (objp->movement_type == MT_WALKING) {
objp->mtype.phys_info.rotvel = Zero_vector;
objp->mtype.phys_info.rotvel = vector{};
objp->mtype.phys_info.flags |= PF_POINT_COLLIDE_WALLS;
scalar proj = vm_Dot3Product(objp->mtype.phys_info.velocity, objp->orient.uvec);
if (proj < 0.0f)

View File

@@ -518,7 +518,7 @@ void DemoWriteChangedObjects() {
if ((Objects[i].type == OBJ_PLAYER) || (Objects[i].type == OBJ_OBSERVER) || (Objects[i].type == OBJ_ROBOT) ||
(Objects[i].type == OBJ_POWERUP) || (Objects[i].type == OBJ_CLUTTER) || (Objects[i].type == OBJ_BUILDING) ||
(Objects[i].type == OBJ_CAMERA)) {
if ((Objects[i].flags & OF_MOVED_THIS_FRAME)) //||(Objects[i].mtype.phys_info.velocity!=Zero_vector))
if ((Objects[i].flags & OF_MOVED_THIS_FRAME)) //||(Objects[i].mtype.phys_info.velocity!=vector{}))
{
DemoWriteChangedObj(&Objects[i]);
// num_changed++;
@@ -923,8 +923,8 @@ void DemoReadObj() {
// if((!((obj->flags&OF_DYING)||(obj->flags&OF_EXPLODING)||(obj->flags&OF_DEAD)))&&obj->type!=255)
if (obj->type != OBJ_NONE) {
obj->mtype.phys_info.velocity = Zero_vector;
obj->mtype.phys_info.rotvel = Zero_vector;
obj->mtype.phys_info.velocity = vector{};
obj->mtype.phys_info.rotvel = vector{};
ObjSetPos(obj, &pos, roomnum, &orient, true);
poly_model *pm = &Poly_models[obj->rtype.pobj_info.model_num];
if ((!(obj->flags & OF_ATTACHED)) && (pm->n_attach))
@@ -990,7 +990,7 @@ void DemoReadWeaponFire() {
weapobjnum = cf_ReadShort(Demo_cfp);
int16_t gunnum = cf_ReadShort(Demo_cfp);
ASSERT(uniqueid != 0xffffffff);
ASSERT(dir != Zero_vector);
ASSERT(dir != vector{});
// This is a hack for the napalm, omega & vauss to prevent making files incompatible
if ((obj->type == OBJ_PLAYER) && (obj->id != Player_num)) {

View File

@@ -714,7 +714,7 @@ bool Cinematic_StartCine(tGameCinematic *info, const char *text_string, int came
camera->ai_info->last_render_time = -1.0f;
camera->ai_info->next_target_update_time = Gametime;
camera->ai_info->notify_flags |= AI_NOTIFIES_ALWAYS_ON;
camera->ai_info->last_see_target_pos = Zero_vector;
camera->ai_info->last_see_target_pos = vector{};
camera->ai_info->dodge_vel_percent = 1.0f;
camera->ai_info->attack_vel_percent = 1.0f;
camera->ai_info->fight_same = 0.0f;
@@ -836,7 +836,7 @@ bool Cinematic_StartCine(tGameCinematic *info, const char *text_string, int came
vector turn_to = target->pos - camera->pos;
vm_NormalizeVector(&turn_to);
if (turn_to == Zero_vector) {
if (turn_to == vector{}) {
LOG_WARNING << "Cine: No turn_to or less than 1 degree off goal";
goto continue_start;
}
@@ -1113,7 +1113,7 @@ void Cinematic_Frame(void) {
vector turn_to = target->pos - camera->pos;
vm_NormalizeVector(&turn_to);
if (turn_to == Zero_vector) {
if (turn_to == vector{}) {
LOG_WARNING << "Cine: No turn_to or less than 1 degree off goal";
goto continue_frame;
}

View File

@@ -239,7 +239,7 @@ matcen::matcen() {
m_status = 0;
m_create_pnt = Zero_vector;
m_create_pnt = vector{};
m_create_room = MATCEN_ERROR;
m_cached_prod_index = -1;
@@ -567,7 +567,7 @@ bool matcen::ComputeCreatePnt() {
int num_valid_faces = 0;
room *rp = &Rooms[m_roomnum];
m_create_pnt = Zero_vector;
m_create_pnt = vector{};
for (i = 0; i < m_num_spawn_pnts; i++) {
if (m_spawn_pnt[i] >= 0 && m_spawn_pnt[i] < rp->num_faces) {
@@ -623,7 +623,7 @@ bool matcen::ComputeCreatePnt() {
int i;
int num_valid_gps = 0;
m_create_pnt = Zero_vector;
m_create_pnt = vector{};
for (i = 0; i < m_num_spawn_pnts; i++) {
if (WeaponCalcGun(&m_spawn_vec[num_valid_gps], &m_spawn_normal[num_valid_gps], master_obj, m_spawn_pnt[i])) {

View File

@@ -5751,7 +5751,7 @@ void MultiDoPowerupReposition(uint8_t *data) {
if (terrain)
roomnum = MAKE_ROOMNUM(roomnum);
obj->mtype.phys_info.velocity = Zero_vector;
obj->mtype.phys_info.velocity = vector{};
ObjSetPos(obj, &pos, roomnum, &obj->orient, true);
}
@@ -8942,8 +8942,8 @@ void MultiDoRequestToMove(uint8_t *data) {
do_physics_sim(obj);
obj->mtype.phys_info.thrust = Zero_vector;
obj->mtype.phys_info.rotthrust = Zero_vector;
obj->mtype.phys_info.thrust = vector{};
obj->mtype.phys_info.rotthrust = vector{};
obj->orient = orient;
bool client_error = 0;

View File

@@ -741,7 +741,7 @@ void msafe_GetValue(int type, msafe_struct *mstruct) {
case MSAFE_OBJECT_POS:
objp = ObjGet(mstruct->objhandle);
if (!objp)
mstruct->pos = Zero_vector;
mstruct->pos = vector{};
else
mstruct->pos = objp->pos;
break;
@@ -762,7 +762,7 @@ void msafe_GetValue(int type, msafe_struct *mstruct) {
case MSAFE_OBJECT_WORLD_POSITION:
objp = ObjGet(mstruct->objhandle);
if (!objp) {
mstruct->pos = Zero_vector;
mstruct->pos = vector{};
mstruct->orient = Identity_matrix;
mstruct->roomnum = -1;
} else {
@@ -774,28 +774,28 @@ void msafe_GetValue(int type, msafe_struct *mstruct) {
case MSAFE_OBJECT_VELOCITY:
objp = ObjGet(mstruct->objhandle);
if (!objp || (objp->movement_type != MT_WALKING && objp->movement_type != MT_PHYSICS))
mstruct->velocity = Zero_vector;
mstruct->velocity = vector{};
else
mstruct->velocity = objp->mtype.phys_info.velocity;
break;
case MSAFE_OBJECT_ROTVELOCITY:
objp = ObjGet(mstruct->objhandle);
if (!objp || (objp->movement_type != MT_WALKING && objp->movement_type != MT_PHYSICS))
mstruct->rot_velocity = Zero_vector;
mstruct->rot_velocity = vector{};
else
mstruct->rot_velocity = objp->mtype.phys_info.rotvel;
break;
case MSAFE_OBJECT_THRUST:
objp = ObjGet(mstruct->objhandle);
if (!objp || (objp->movement_type != MT_WALKING && objp->movement_type != MT_PHYSICS))
mstruct->thrust = Zero_vector;
mstruct->thrust = vector{};
else
mstruct->thrust = objp->mtype.phys_info.thrust;
break;
case MSAFE_OBJECT_ROTTHRUST:
objp = ObjGet(mstruct->objhandle);
if (!objp || (objp->movement_type != MT_WALKING && objp->movement_type != MT_PHYSICS))
mstruct->rot_thrust = Zero_vector;
mstruct->rot_thrust = vector{};
else
mstruct->rot_thrust = objp->mtype.phys_info.rotthrust;
break;

View File

@@ -3132,8 +3132,8 @@ void ObjSetOrient(object *obj, const matrix *orient) {
obj->wall_sphere_offset = Poly_models[obj->rtype.pobj_info.model_num].wall_size_offset * m;
obj->anim_sphere_offset = Poly_models[obj->rtype.pobj_info.model_num].anim_size_offset * m;
} else {
obj->wall_sphere_offset = Zero_vector;
obj->anim_sphere_offset = Zero_vector;
obj->wall_sphere_offset = vector{};
obj->anim_sphere_offset = vector{};
}
}
}

View File

@@ -688,7 +688,7 @@ void osipf_RoomValue(int roomnum, char op, char vtype, void *ptr, int index) {
if (index < 0 || index >= rp->num_faces || rp->faces[index].num_verts <= 0) {
*(vector *)ptr = rp->path_pnt;
} else {
*(vector *)ptr = Zero_vector;
*(vector *)ptr = vector{};
for (i = 0; i < rp->faces[index].num_verts; i++) {
*(vector *)ptr += rp->verts[rp->faces[index].face_verts[i]];
@@ -1680,13 +1680,13 @@ vector osipf_AIFindHidePos(int hideobjhandle, int viewobjhandle, float time, int
if (hide_obj == NULL) {
LOG_ERROR << "Illegal Hide Object Passed To AIFindHidePos";
*hide_room = -1;
return Zero_vector;
return vector{};
}
if (hide_obj->control_type != CT_AI) {
LOG_ERROR << "Illegal Object CT Passed To AIFindHidePos";
*hide_room = -1;
return Zero_vector;
return vector{};
}
if (view_obj == NULL) {
@@ -1980,7 +1980,7 @@ vector osipf_AIGetRoomPathPoint(int roomnum) {
int cell = CELLNUM(roomnum);
if (cell >= TERRAIN_DEPTH * TERRAIN_WIDTH) {
return Zero_vector;
return vector{};
} else {
vector pos;
@@ -1993,7 +1993,7 @@ vector osipf_AIGetRoomPathPoint(int roomnum) {
return Rooms[roomnum].path_pnt;
}
return Zero_vector;
return vector{};
}
int osipf_AIFindEnergyCenter(int objhandle) {
@@ -2079,8 +2079,8 @@ void osipf_GetGunPos(int objhandle, int gun_number, vector *gun_pnt, vector *gun
if (obj == NULL) {
LOG_ERROR << "Illegal Object Passed To AIGetGunPosition";
*gun_pnt = Zero_vector;
*gun_normal = Zero_vector;
*gun_pnt = vector{};
*gun_normal = vector{};
return;
}
@@ -2092,8 +2092,8 @@ void osipf_GetGroundPos(int objhandle, int ground_number, vector *ground_pnt, ve
if (obj == NULL) {
LOG_ERROR << "Illegal Object Passed To Obj_GetGroundPos";
*ground_pnt = Zero_vector;
*ground_normal = Zero_vector;
*ground_pnt = vector{};
*ground_normal = vector{};
return;
}

View File

@@ -548,7 +548,7 @@ void InitRoom(room *rp, int nverts, int nfaces, int nportals) {
ASSERT(nfaces > 0);
#endif
rp->wind = Zero_vector;
rp->wind = vector{};
rp->num_faces = nfaces;
rp->num_verts = nverts;
@@ -1210,8 +1210,8 @@ void CreateRoomObjects() {
objnum = ObjCreate(OBJ_ROOM, r, roomnum, &pos, NULL);
ASSERT(objnum != -1); // DAJ -1FIX moved up
Objects[objnum].size = rad;
Objects[objnum].wall_sphere_offset = Zero_vector;
Objects[objnum].anim_sphere_offset = Zero_vector;
Objects[objnum].wall_sphere_offset = vector{};
Objects[objnum].anim_sphere_offset = vector{};
if ((rad >= MIN_BIG_OBJ_RAD) && !(Objects[objnum].flags & OF_BIG_OBJECT)) {
BigObjAdd(objnum);

View File

@@ -157,7 +157,6 @@
// vecmat_external.h is where anything that can be used by DLLs should be.
#include "vecmat_external.h"
extern const vector Zero_vector;
extern const matrix Identity_matrix;
// Used for debugging. It is used in printf's so we do not have to write out the structure 3 times

View File

@@ -1140,7 +1140,7 @@ float ComputeDefaultSizeFunc(int handle, float *size_ptr, vector *offset_ptr, bo
int start_frame = 0;
int end_frame = 0;
vector geometric_center = Zero_vector;
vector geometric_center{};
// Chris: Come see me when you are ready to deal with the paging problem - JL
pm = GetPolymodelPointer(handle);
@@ -1294,7 +1294,7 @@ float ComputeDefaultSize(int type, int handle, float *size_ptr) {
if (type == OBJ_PLAYER) {
Poly_models[handle].anim_size *= PLAYER_SIZE_SCALAR;
Poly_models[handle].anim_size_offset = Zero_vector;
Poly_models[handle].anim_size_offset = vector{};
}
} else {
if (type == OBJ_POWERUP) {
@@ -1303,10 +1303,10 @@ float ComputeDefaultSize(int type, int handle, float *size_ptr) {
}
Poly_models[handle].wall_size = size;
Poly_models[handle].wall_size_offset = Zero_vector;
Poly_models[handle].wall_size_offset = vector{};
Poly_models[handle].anim_size = size;
Poly_models[handle].anim_size_offset = Zero_vector;
Poly_models[handle].anim_size_offset = vector{};
}
Poly_models[handle].flags |= PMF_SIZE_COMPUTED;

View File

@@ -1528,7 +1528,7 @@ void ConvertEulerToAxisAmount(vector *e, vector *n, float *w) {
// If there isn't a rotation, return something valid
if (rotspeed == 0.0f || scale == 0.0f) {
*n = Zero_vector;
*n = vector{};
n->y() = 1.0f;
*w = 0.0f;
@@ -1546,7 +1546,7 @@ void ConvertEulerToAxisAmount(vector *e, vector *n, float *w) {
n->y() = rotmat.fvec.x() - rotmat.rvec.z();
n->z() = rotmat.rvec.y() - rotmat.uvec.x();
if (*n != Zero_vector) {
if (*n != vector{}) {
vm_NormalizeVector(n);
float ct = (rotmat.rvec.x() + rotmat.uvec.y() + rotmat.fvec.z() - 1.0f) / 2.0f;
@@ -1576,7 +1576,7 @@ void ConvertAxisAmountToEuler(vector *n, float *w, vector *e) {
vector s_result;
if (*w == 0.0f) {
*e = Zero_vector;
*e = vector{};
return;
}
@@ -1642,7 +1642,7 @@ void bump_obj_against_fixed(object *obj, vector *collision_point, vector *collis
if (temp1 != 0.0f) {
vm_CrossProduct(&w1, &n1, &r1);
} else {
w1 = Zero_vector;
w1 = vector{};
}
vector p1 = obj->mtype.phys_info.velocity + w1;
@@ -1711,14 +1711,14 @@ void bump_two_objects(object *object0, object *object1, vector *collision_point,
// Determine if a moving object hits a non-moving object
if ((object0->movement_type != MT_PHYSICS && object0->movement_type != MT_WALKING) ||
(object0->movement_type == MT_PHYSICS && object0->mtype.phys_info.velocity == Zero_vector &&
(object0->movement_type == MT_PHYSICS && object0->mtype.phys_info.velocity == vector{} &&
(object0->mtype.phys_info.flags & PF_LOCK_MASK) && (object0->mtype.phys_info.flags & PF_POINT_COLLIDE_WALLS))) {
t = object1;
other = object0;
*collision_normal *= -1.0f;
}
if ((object1->movement_type != MT_PHYSICS && object1->movement_type != MT_WALKING) ||
(object1->movement_type == MT_PHYSICS && object1->mtype.phys_info.velocity == Zero_vector &&
(object1->movement_type == MT_PHYSICS && object1->mtype.phys_info.velocity == vector{} &&
(object1->mtype.phys_info.flags & PF_LOCK_MASK) && (object1->mtype.phys_info.flags & PF_POINT_COLLIDE_WALLS))) {
t = object0;
other = object1;
@@ -1728,7 +1728,7 @@ void bump_two_objects(object *object0, object *object1, vector *collision_point,
if (t) {
// chrishack -- walker hack
if (t->movement_type != MT_PHYSICS && t->movement_type != MT_WALKING) {
t->mtype.phys_info.velocity = Zero_vector;
t->mtype.phys_info.velocity = vector{};
return;
}
@@ -1850,13 +1850,13 @@ void bump_two_objects(object *object0, object *object1, vector *collision_point,
if (temp1 != 0.0f) {
vm_CrossProduct(&w1, &n1, &r1);
} else {
w1 = Zero_vector;
w1 = vector{};
}
if (temp2 != 0.0f) {
vm_CrossProduct(&w2, &n2, &r2);
} else {
w2 = Zero_vector;
w2 = vector{};
}
vector p1 = object0->mtype.phys_info.velocity + w1;
@@ -2072,7 +2072,7 @@ void collide_generic_and_player(object *robotobj, object *playerobj, vector *col
if (robotobj->movement_type == MT_PHYSICS || robotobj->movement_type == MT_WALKING) {
rvel = robotobj->mtype.phys_info.velocity;
} else {
rvel = Zero_vector;
rvel = vector{};
}
rvel -= playerobj->mtype.phys_info.velocity;
float speed = vm_NormalizeVector(&rvel);

View File

@@ -1449,7 +1449,7 @@ float rad, vector *ep0, vector *ep1)
float cdist; // Closest dist
vector perp = (mdir ^ edir); // Determines the normalized perp to both lines
if(perp == Zero_vector)
if(perp == vector{})
goto check_ends; // We are moving parallal to the cylinder (only end collisions are possible)
pmag = vm_NormalizeVector(&perp);
@@ -2669,7 +2669,7 @@ int fvi_FindIntersection(fvi_query *fq, fvi_info *hit_data, bool no_subdivision)
this_obj->type != OBJ_PLAYER && fq->rad == this_obj->size) {
if (this_obj->mtype.phys_info.flags & PF_POINT_COLLIDE_WALLS) {
fvi_wall_sphere_rad = 0.0f;
fvi_wall_sphere_offset = Zero_vector;
fvi_wall_sphere_offset = vector{};
fvi_wall_sphere_p0 = *fq->p0;
fvi_wall_sphere_p1 = *fq->p1;
} else {
@@ -2688,23 +2688,23 @@ int fvi_FindIntersection(fvi_query *fq, fvi_info *hit_data, bool no_subdivision)
fvi_wall_sphere_rad = fq->rad * PLAYER_SIZE_SCALAR;
if (Players[this_obj->id].flags & (PLAYER_FLAGS_DEAD | PLAYER_FLAGS_DYING))
fvi_wall_sphere_rad *= 0.5f;
fvi_wall_sphere_offset = Zero_vector;
fvi_wall_sphere_offset = vector{};
fvi_wall_sphere_p0 = *fq->p0;
fvi_wall_sphere_p1 = *fq->p1;
} else if ((this_obj) && this_obj->mtype.phys_info.flags & PF_POINT_COLLIDE_WALLS) {
fvi_wall_sphere_rad = 0.0f;
fvi_wall_sphere_offset = Zero_vector;
fvi_wall_sphere_offset = vector{};
fvi_wall_sphere_p0 = *fq->p0;
fvi_wall_sphere_p1 = *fq->p1;
} else {
fvi_wall_sphere_rad = fq->rad;
fvi_wall_sphere_offset = Zero_vector;
fvi_wall_sphere_offset = vector{};
fvi_wall_sphere_p0 = *fq->p0;
fvi_wall_sphere_p1 = *fq->p1;
}
fvi_anim_sphere_rad = fq->rad;
fvi_anim_sphere_offset = Zero_vector;
fvi_anim_sphere_offset = vector{};
fvi_anim_sphere_p0 = *fq->p0;
fvi_anim_sphere_p1 = *fq->p1;
}
@@ -3203,7 +3203,7 @@ vector PointSpeed(object *obj, vector *pos, matrix *orient, vector *rotvel, vect
if (temp1 != 0.0f) {
vm_CrossProduct(&w1, &n1, &r1);
} else {
w1 = Zero_vector;
w1 = vector{};
}
return *velocity + w1;
@@ -3245,7 +3245,7 @@ bool BBoxPlaneIntersection(bool fast_exit, vector *collision_point, vector *coll
verts[i] += *new_pos;
}
vector xxx_normal = Zero_vector;
vector xxx_normal{};
xxx_normal.y() = 1.0f;
for (i = 0; i < 8; i++) {
@@ -3733,7 +3733,7 @@ fvi_query_ptr->p1)); matrix orient = *fvi_query_ptr->o_orient; vector rotvel = *
// Save results of this simulation
old_sim_time_remaining = sim_time_remaining;
moved_vec_n = end_pos - *p0;
if(moved_vec_n != Zero_vector)
if(moved_vec_n != vector{})
{
actual_dist = vm_NormalizeVector(&moved_vec_n);
}
@@ -3988,7 +3988,7 @@ inline void check_terrain_node(int cur_node, bool f_check_local_nodes, bool f_ch
fvi_hit_data_ptr->hit_pnt = *fvi_query_ptr->p0;
fvi_collision_dist = 0.0;
movement_dir = Zero_vector;
movement_dir = vector{};
hit_dist = 0.0f;
}

View File

@@ -617,7 +617,7 @@ bool PhysicsDoSimRot(object *obj, float frame_time, matrix *orient, vector *rott
if (pi->rotdrag > 0.0f) {
if (!(pi->flags & PF_USES_THRUST)) {
*rotthrust = Zero_vector;
*rotthrust = vector{};
}
PhysicsApplyConstRotForce(*obj, *rotthrust, *rotvel, frame_time);
@@ -661,7 +661,7 @@ void PhysicsDoSimLinear(const object &obj, const vector &pos, const vector &forc
vector forceToUse = force;
if (!ROOMNUM_OUTSIDE(obj.roomnum) && !(obj.mtype.phys_info.flags & PF_LOCK_MASK) &&
Rooms[obj.roomnum].wind != Zero_vector && count == 0 && obj.mtype.phys_info.drag > 0.0f &&
Rooms[obj.roomnum].wind != vector{} && count == 0 && obj.mtype.phys_info.drag > 0.0f &&
!(obj.type == OBJ_POWERUP && Level_powerups_ignore_wind)) {
// Factor in outside wind
const vector &wind = Rooms[obj.roomnum].wind;
@@ -753,7 +753,7 @@ void do_physics_sim(object *obj) {
}
if (obj->type == OBJ_PLAYER &&
(obj->mtype.phys_info.thrust != Zero_vector || obj->mtype.phys_info.rotthrust != Zero_vector)) {
(obj->mtype.phys_info.thrust != vector{} || obj->mtype.phys_info.rotthrust != vector{})) {
Players[obj->id].last_thrust_time = Gametime;
}
@@ -840,7 +840,7 @@ void do_physics_sim(object *obj) {
fabs(pi->rotvel.x()) > .000001 || fabs(pi->rotvel.y()) > .000001 || fabs(pi->rotvel.z()) > .000001 ||
fabs(pi->rotthrust.x()) > .000001 || fabs(pi->rotthrust.y()) > .000001 || fabs(pi->rotthrust.z()) > .000001 ||
(obj->mtype.phys_info.flags & PF_GRAVITY) ||
((!ROOMNUM_OUTSIDE(obj->roomnum)) && Rooms[obj->roomnum].wind != Zero_vector) ||
((!ROOMNUM_OUTSIDE(obj->roomnum)) && Rooms[obj->roomnum].wind != vector{}) ||
(obj->mtype.phys_info.flags & PF_WIGGLE) ||
((obj->ai_info != NULL) && ((obj->ai_info->flags & AIF_REPORT_NEW_ORIENT) != 0)))) {
if ((obj->flags & OF_MOVED_THIS_FRAME)) {
@@ -1030,7 +1030,7 @@ void do_physics_sim(object *obj) {
if (fate != HIT_NONE) {
if (obj->type == OBJ_PLAYER && hit_info.num_hits > 1) {
vector n = Zero_vector;
vector n{};
int i;
for (i = 0; i < hit_info.num_hits; i++) {
@@ -1155,7 +1155,7 @@ void do_physics_sim(object *obj) {
// Save results of this simulation
old_sim_time_remaining = sim_time_remaining;
moved_vec_n = obj->pos - start_pos; // chrishack -- use this copy
if (moved_vec_n != Zero_vector) {
if (moved_vec_n != vector{}) {
actual_dist = vm_NormalizeVector(&moved_vec_n);
} else {
actual_dist = 0.0f;
@@ -1212,7 +1212,7 @@ void do_physics_sim(object *obj) {
switch (fate) {
case HIT_NONE:
if (obj->type == OBJ_WEAPON && (obj->mtype.phys_info.flags & (PF_GRAVITY | PF_WIND))) {
if (obj->mtype.phys_info.velocity != Zero_vector)
if (obj->mtype.phys_info.velocity != vector{})
vm_VectorToMatrix(&obj->orient, &obj->mtype.phys_info.velocity, &obj->orient.uvec, NULL);
}
f_continue_sim = false;
@@ -1353,8 +1353,8 @@ void do_physics_sim(object *obj) {
}
if (v_mag < 1.8f) {
obj->mtype.phys_info.velocity = Zero_vector;
obj->mtype.phys_info.rotvel = Zero_vector;
obj->mtype.phys_info.velocity = vector{};
obj->mtype.phys_info.rotvel = vector{};
goto skip_sim;
} else {
goto slide_sim;
@@ -1402,9 +1402,9 @@ void do_physics_sim(object *obj) {
// obj->mtype.phys_info.velocity *= (luke_test);
} else if (obj->type == OBJ_CLUTTER && !(obj->mtype.phys_info.flags & PF_LOCK_MASK)) {
// Do rolling rotvel hack
obj->mtype.phys_info.rotvel = Zero_vector;
obj->mtype.phys_info.rotvel = vector{};
if (obj->mtype.phys_info.velocity != Zero_vector) {
if (obj->mtype.phys_info.velocity != vector{}) {
vector axis;
scalar speed = vm_GetMagnitude(&obj->mtype.phys_info.velocity);
@@ -1437,7 +1437,7 @@ void do_physics_sim(object *obj) {
// Weapons should face their new heading. This is so missiles are pointing in the correct direct.
if (obj->type == OBJ_WEAPON && (bounced || (obj->mtype.phys_info.flags & (PF_GRAVITY | PF_WIND))))
if (obj->mtype.phys_info.velocity != Zero_vector)
if (obj->mtype.phys_info.velocity != vector{})
vm_VectorToMatrix(&obj->orient, &obj->mtype.phys_info.velocity, &obj->orient.uvec, NULL);
}
}
@@ -1527,7 +1527,7 @@ void do_physics_sim(object *obj) {
(obj->type == OBJ_BUILDING && obj->ai_info)) &&
sim_time_remaining == old_sim_time_remaining &&
(Objects[hit_info.hit_object[0]].movement_type == MT_NONE ||
(Objects[hit_info.hit_object[0]].mtype.phys_info.velocity == Zero_vector &&
(Objects[hit_info.hit_object[0]].mtype.phys_info.velocity == vector{} &&
(Objects[hit_info.hit_object[0]].mtype.phys_info.flags & PF_LOCK_MASK)))) {
obj->mtype.phys_info.velocity += hit_info.hit_wallnorm[0];
}
@@ -1588,7 +1588,7 @@ void do_physics_sim(object *obj) {
if (count >= sim_loop_limit) {
if (obj->type == OBJ_PLAYER) {
LOG_WARNING << "Too many collisions for player!";
obj->mtype.phys_info.velocity = Zero_vector;
obj->mtype.phys_info.velocity = vector{};
}
}
@@ -1702,7 +1702,7 @@ bool PhysComputeWalkerPosOrient(object *obj, vector *pos, matrix *orient) {
}
int num_ave = 0;
vector ave_diff = Zero_vector;
vector ave_diff{};
for (i = 0; i < 3; i++) {
int fate;
@@ -1726,7 +1726,7 @@ bool PhysComputeWalkerPosOrient(object *obj, vector *pos, matrix *orient) {
if (num_ave > 0) {
ave_diff /= num_ave;
} else
ave_diff = Zero_vector;
ave_diff = vector{};
vector uvec;
vm_GetPerp(&uvec, &hp[0], &hp[1], &hp[2]);
@@ -1945,7 +1945,7 @@ void do_walking_sim(object *obj) {
int bounced = 0; // Did the object bounce?
vector total_force = Zero_vector; // Constant force acting on an object
vector total_force{}; // Constant force acting on an object
bool f_continue_sim; // Should we run another simulation loop
@@ -1978,7 +1978,7 @@ void do_walking_sim(object *obj) {
fabs(pi->rotvel.x()) > .000001 || fabs(pi->rotvel.y()) > .000001 || fabs(pi->rotvel.z()) > .000001 ||
fabs(pi->rotthrust.x()) > .000001 || fabs(pi->rotthrust.y()) > .000001 || fabs(pi->rotthrust.z()) > .000001 ||
(obj->mtype.phys_info.flags & PF_GRAVITY) ||
((!ROOMNUM_OUTSIDE(obj->roomnum)) && Rooms[obj->roomnum].wind != Zero_vector) ||
((!ROOMNUM_OUTSIDE(obj->roomnum)) && Rooms[obj->roomnum].wind != vector{}) ||
(obj->mtype.phys_info.flags & PF_WIGGLE) ||
((obj->ai_info != NULL) && ((obj->ai_info->flags & AIF_REPORT_NEW_ORIENT) != 0)))) {
if ((obj->flags & OF_MOVED_THIS_FRAME)) {
@@ -2023,7 +2023,7 @@ void do_walking_sim(object *obj) {
// Simulate movement until we are done (i.e. Frametime has passed or object is done moving)
do {
obj->mtype.phys_info.rotvel = Zero_vector;
obj->mtype.phys_info.rotvel = vector{};
#ifdef _DEBUG
// This records the sim.
@@ -2103,18 +2103,18 @@ void do_walking_sim(object *obj) {
}
} else {
f_step = false;
movement_vec = Zero_vector;
movement_vec = vector{};
}
} else {
f_step = false;
movement_vec = Zero_vector;
movement_vec = vector{};
}
} else {
f_step = false;
}
if (!f_step) {
pi->velocity = Zero_vector;
pi->velocity = vector{};
break;
}
@@ -2153,7 +2153,7 @@ void do_walking_sim(object *obj) {
// Save results of this simulation
old_sim_time_remaining = sim_time_remaining;
moved_vec_n = obj->pos - start_pos; // chrishack -- use this copy
if (moved_vec_n != Zero_vector) {
if (moved_vec_n != vector{}) {
actual_dist = vm_NormalizeVector(&moved_vec_n);
} else {
actual_dist = 0.0f;
@@ -2319,7 +2319,7 @@ void do_walking_sim(object *obj) {
// Weapons should face their new heading. This is so missiles are pointing in the correct direct.
if (obj->type == OBJ_WEAPON && (bounced || (obj->mtype.phys_info.flags & (PF_GRAVITY | PF_WIND))))
if (obj->mtype.phys_info.velocity != Zero_vector)
if (obj->mtype.phys_info.velocity != vector{})
vm_VectorToMatrix(&obj->orient, &obj->mtype.phys_info.velocity, &obj->orient.uvec, NULL);
}
}

View File

@@ -3119,7 +3119,7 @@ bool Humonculous::DoNotify(int me, tOSIRISEventInfo *data) {
case HM_ABOUT_TO_FAKE_DEATH:
case HM_ABOUT_TO_DIE: {
if (data->evt_ai_notify.notify_type == AIN_SCRIPTED_ORIENT) {
vector uvec = Zero_vector;
vector uvec{};
uvec.y() = 1.0f;
if (AI_TurnTowardsVectors(me, &memory->land_fvec, &uvec))
@@ -3482,7 +3482,7 @@ void Humonculous::DoInterval(int me) {
switch (memory->mode) {
case HM_INTRO_CUTSCENE: {
if (memory->mode_time < H_DOOR_WAIT_TIME && memory->mode_time + Game_GetFrameTime() >= H_DOOR_WAIT_TIME) {
vector velocity = Zero_vector;
vector velocity{};
velocity.y() = 65.0f;
Obj_Value(me, VF_SET, OBJV_V_VELOCITY, &velocity);
@@ -3664,7 +3664,7 @@ void Humonculous::DoInterval(int me) {
case HM_FAKE_DEATH: {
if (memory->mode_time > 4.0f) {
vector velocity = Zero_vector;
vector velocity{};
velocity.y() = 40.0f;
Obj_Value(me, VF_SET, OBJV_V_VELOCITY, &velocity);
@@ -8352,7 +8352,7 @@ bool Sparky::DoNotify(int me_handle, tOSIRISEventInfo *data) {
Obj_Value(me_handle, VF_SET, OBJV_V_ROTVELOCITY, &rvel);
vector dir = Zero_vector;
vector dir{};
AI_Value(me_handle, VF_SET, AIV_V_MOVEMENT_DIR, &dir);
}

View File

@@ -554,7 +554,7 @@ bool MercEndBoss::DoNotify(int me, tOSIRISEventInfo *data) {
Obj_Value(me, VF_SET, OBJV_V_ROTVELOCITY, &rvel);
vector dir = Zero_vector;
vector dir{};
AI_Value(me, VF_SET, AIV_V_MOVEMENT_DIR, &dir);
}
}

View File

@@ -268,7 +268,7 @@ scalar vm_VectorNormalizeFast(vector *a) {
mag = vm_GetMagnitudeFast(a);
if (mag == 0.0) {
*a = Zero_vector;
*a = vector{};
return 0;
}
*a /= mag;

View File

@@ -22,8 +22,6 @@
#include "fix.h"
#include "vecmat_external.h"
const vector Zero_vector = vector{};
// Disable the "possible loss of data" warning
#pragma warning(disable : 4244)

View File

@@ -879,12 +879,12 @@ bool hlsSystem::ComputePlayInfo(int sound_obj_index, vector *virtual_pos, vector
if (objp->movement_type == MT_PHYSICS || objp->movement_type == MT_WALKING)
*virtual_vel = objp->mtype.phys_info.velocity;
else
*virtual_vel = Zero_vector;
*virtual_vel = vector{};
sound_pos = objp->pos;
sound_seg = objp->roomnum;
} else {
*virtual_vel = Zero_vector;
*virtual_vel = vector{};
sound_pos = m_sound_objects[sound_obj_index].m_link_info.pos_info.pos;
sound_seg = m_sound_objects[sound_obj_index].m_link_info.pos_info.segnum;
}

View File

@@ -154,7 +154,6 @@
#include "pserror.h"
#include "psrand.h"
const vector Zero_vector = vector{};
const matrix Identity_matrix = IDENTITY_MATRIX;
void vm_AverageVector(vector *a, int num) {