Fix pedestrian collision when floating very close to ped (#189)

* Fix pedestrian collision when floating very close to ped
This commit is contained in:
Anonymous Maarten 2022-09-30 19:48:14 +02:00 committed by GitHub
parent 24a08b2c9f
commit 3a9c037939
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 74 additions and 77 deletions

View File

@ -2525,11 +2525,11 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
oldmat = &c->oldmat; oldmat = &c->oldmat;
k = 0; k = 0;
gMaterial_index = 0; gMaterial_index = 0;
if (c->dt >= 0.0 && gNet_mode == eNet_mode_host) { if (c->dt >= 0.0f && gNet_mode == eNet_mode_host) {
oldmat = &message_mat; oldmat = &message_mat;
GetExpandedMatrix(&message_mat, &c->message.mat); GetExpandedMatrix(&message_mat, &c->message.mat);
} }
if (dt < 0.0) { if (dt < 0.0f) {
mat = oldmat; mat = oldmat;
} }
BrMatrix34LPInverse(&tm, mat); BrMatrix34LPInverse(&tm, mat);
@ -2557,9 +2557,8 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
edges[j].v[1] = (bnds.max.v[j] - bnds.min.v[j]) * mat->m[j][1]; edges[j].v[1] = (bnds.max.v[j] - bnds.min.v[j]) * mat->m[j][1];
edges[j].v[2] = (bnds.max.v[j] - bnds.min.v[j]) * mat->m[j][2]; edges[j].v[2] = (bnds.max.v[j] - bnds.min.v[j]) * mat->m[j][2];
} }
i = 0; for (i = 0; i < 50 && i < c->box_face_end - c->box_face_start; i++) {
f_ref = &gFace_list__car[c->box_face_start]; f_ref = &gFace_list__car[c->box_face_start + i];
while (c->box_face_end - c->box_face_start > i && i < 50) {
BrVector3Sub(&bb, &aa, &f_ref->v[0]); BrVector3Sub(&bb, &aa, &f_ref->v[0]);
max = BrVector3Dot(&bb, &f_ref->normal); max = BrVector3Dot(&bb, &f_ref->normal);
min = max; min = max;
@ -2571,16 +2570,14 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
min = min + ts; min = min + ts;
} }
} }
if ((max <= 0.001 || min <= 0.001) && (max >= -0.001 || min >= -0.001)) { if ((max <= 0.001f || min <= 0.001f) && (max >= -0.001f || min >= -0.001f)) {
f_ref->flags &= ~0x80u; f_ref->flags &= ~0x80u;
k++; k++;
} else { } else {
f_ref->flags |= 0x80u; f_ref->flags |= 0x80u;
} }
i++;
f_ref++;
} }
if (!k) { if (k == 0) {
return 0; return 0;
} }
k = 0; k = 0;
@ -2592,29 +2589,29 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
tv = c->extra_points[i - 8]; tv = c->extra_points[i - 8];
} else { } else {
tv.v[0] = ((i & 2) == 0) * c->bounds[1].min.v[0] + ((i & 2) >> 1) * c->bounds[1].max.v[0]; tv.v[0] = ((i & 2) == 0) * c->bounds[1].min.v[0] + ((i & 2) >> 1) * c->bounds[1].max.v[0];
tv.v[1] = ((i & 1) == 0) * c->bounds[1].min.v[1] + (i & 1) * c->bounds[1].max.v[1]; tv.v[1] = ((i & 1) == 0) * c->bounds[1].min.v[1] + ((i & 1) >> 0) * c->bounds[1].max.v[1];
tv.v[2] = ((i & 4) == 0) * c->bounds[1].max.v[2] + ((i & 4) >> 2) * c->bounds[1].min.v[2]; tv.v[2] = ((i & 4) == 0) * c->bounds[1].max.v[2] + ((i & 4) >> 2) * c->bounds[1].min.v[2];
} }
BrMatrix34ApplyP(&dir, &tv, mat); BrMatrix34ApplyP(&dir, &tv, mat);
if (dt >= 0.0) { if (dt >= 0.0f) {
BrMatrix34ApplyP(&a, &tv, oldmat); BrMatrix34ApplyP(&a, &tv, oldmat);
} else { } else {
BrVector3Scale(&a, &c->pos, WORLD_SCALE); BrVector3Scale(&a, &c->pos, WORLD_SCALE);
} }
BrVector3Sub(&dir, &dir, &a); BrVector3Sub(&dir, &dir, &a);
BrVector3Normalise(&normal_force, &dir); BrVector3Normalise(&normal_force, &dir);
BrVector3Scale(&normal_force, &normal_force, 0.0072463769); BrVector3Scale(&normal_force, &normal_force, 0.0072463769f);
BrVector3Accumulate(&dir, &normal_force); BrVector3Accumulate(&dir, &normal_force);
material = FindFloorInBoxM2(&a, &dir, &norm, &dist, c); material = FindFloorInBoxM2(&a, &dir, &norm, &dist, c);
if (dist >= 0.0 && dist < 1.0001) { if (dist >= 0.0f && dist < 1.0001f) {
BrVector3Scale(&cc, &c->pos, WORLD_SCALE); BrVector3Scale(&cc, &c->pos, WORLD_SCALE);
BrVector3Sub(&cc, &cc, &a); BrVector3Sub(&cc, &cc, &a);
FindFloorInBoxM(&a, &cc, &bb, &ts, c); FindFloorInBoxM(&a, &cc, &bb, &ts, c);
if (i < 8 || ts > 1.0) { if (i < 8 || ts > 1.0f) {
BrMatrix34TApplyV(&a, &norm, oldmat); BrMatrix34TApplyV(&a, &norm, oldmat);
AddCollPoint(dist, &tv, &a, r, n, &dir, k, c); AddCollPoint(dist, &tv, &a, r, n, &dir, k, c);
k++; k++;
if (!gMaterial_index) { if (gMaterial_index == 0) {
gMaterial_index = material; gMaterial_index = material;
} }
} }
@ -2628,9 +2625,9 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
k = 4; k = 4;
} }
for (i = 0; i < k; i++) { for (i = 0; i < k; i++) {
if (fabs(r[i].v[1]) + fabs(r[i].v[2]) + fabs(r[i].v[0]) > 500.0) { if (fabsf(r[i].v[1]) + fabsf(r[i].v[2]) + fabsf(r[i].v[0]) > 500.0f) {
for (j = i + 1; j < k; j++) { for (j = i + 1; j < k; j++) {
if (fabs(r[j].v[1]) + fabs(r[j].v[2]) + fabs(r[j].v[0]) < 500.0) { if (fabsf(r[j].v[1]) + fabsf(r[j].v[2]) + fabsf(r[j].v[0]) < 500.0f) {
r[i] = r[j]; r[i] = r[j];
n[i] = n[j]; n[i] = n[j];
i++; i++;
@ -2640,11 +2637,11 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
break; break;
} }
} }
if (dt >= 0.0) { if (dt >= 0.0f) {
if (k > 0 && c->collision_flag && k < 4 if (k > 0 && c->collision_flag && k < 4
&& (fabs(r[0].v[0] - c->old_point.v[0]) > 0.05 && (fabsf(r[0].v[0] - c->old_point.v[0]) > 0.05f
|| fabs(r[0].v[1] - c->old_point.v[1]) > 0.05 || fabsf(r[0].v[1] - c->old_point.v[1]) > 0.05f
|| fabs(r[0].v[2] - c->old_point.v[2]) > 0.05)) { || fabsf(r[0].v[2] - c->old_point.v[2]) > 0.05f)) {
r[k] = c->old_point; r[k] = c->old_point;
n[k] = c->old_norm; n[k] = c->old_norm;
k++; k++;
@ -2672,15 +2669,15 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
if (ts > d[i]) { if (ts > d[i]) {
d[i] = ts; d[i] = ts;
} }
if (d[i] > 0.0) { if (d[i] > 0.0f) {
collision = 1; collision = 1;
} }
} }
if (!collision) { if (!collision) {
d[0] = 0.5; d[0] = 0.5f;
} }
for (i = 0; k > i; ++i) { for (i = 0; i < k; i++) {
for (j = 0; k > j; ++j) { for (j = 0; j < k; j++) {
BrVector3Cross(&normal_force, &tau[j], &r[i]); BrVector3Cross(&normal_force, &tau[j], &r[i]);
BrVector3InvScale(&norm, &n[j], c->M); BrVector3InvScale(&norm, &n[j], c->M);
BrVector3Accumulate(&normal_force, &norm); BrVector3Accumulate(&normal_force, &norm);
@ -2695,7 +2692,7 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
ts = TwoPointColl(f, &M, d, tau, n); ts = TwoPointColl(f, &M, d, tau, n);
break; break;
case 3: case 3:
d[3] = 0.0; d[3] = 0.0f;
ts = ThreePointCollRec(f, &M, d, tau, n, c); ts = ThreePointCollRec(f, &M, d, tau, n, c);
break; break;
case 4: case 4:
@ -2707,26 +2704,26 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
if (k > 3) { if (k > 3) {
k = 3; k = 3;
} }
// if (f[0] > 10.0 || f[1] > 10.0 || f[2] > 10.0) { // if (f[0] > 10.0f || f[1] > 10.0f || f[2] > 10.0f) {
// v31 = 0; // v31 = 0;
// } // }
if (fabs(ts) <= 0.000001) { if (fabsf(ts) <= 0.000001f) {
BrVector3Set(&c->v, 0, 0, 0); BrVector3Set(&c->v, 0.f, 0.f, 0.f);
BrVector3Set(&c->omega, 0, 0, 0); BrVector3Set(&c->omega, 0.f, 0.f, 0.f);
BrVector3Set(&c->oldomega, 0, 0, 0); BrVector3Set(&c->oldomega, 0.f, 0.f, 0.f);
return k; return k;
} }
BrVector3Set(&p_vel, 0, 0, 0); BrVector3Set(&p_vel, 0.f, 0.f, 0.f);
BrVector3Set(&dir, 0, 0, 0); BrVector3Set(&dir, 0.f, 0.f, 0.f);
BrVector3Set(&friction_force, 0, 0, 0); BrVector3Set(&friction_force, 0.f, 0.f, 0.f);
total_force = 0.0; total_force = 0.f;
for (i = 0; k > i; ++i) { for (i = 0; i < k; i++) {
if (f[i] < 0.001) { if (f[i] < 0.001f) {
f[i] = 0.001; f[i] = 0.001f;
} }
f[i] = f[i] * 1.001; f[i] = f[i] * 1.001f;
BrVector3Scale(&tau[i], &tau[i], f[i]); BrVector3Scale(&tau[i], &tau[i], f[i]);
BrVector3Add(&c->omega, &tau[i], &c->omega); BrVector3Accumulate(&c->omega, &tau[i]);
f[i] = f[i] / c->M; f[i] = f[i] / c->M;
BrVector3Scale(&n[i], &n[i], f[i]); BrVector3Scale(&n[i], &n[i], f[i]);
BrVector3Accumulate(&p_vel, &n[i]); BrVector3Accumulate(&p_vel, &n[i]);
@ -2735,17 +2732,17 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
BrVector3Accumulate(&dir, &bb); BrVector3Accumulate(&dir, &bb);
total_force = f[i] + total_force; total_force = f[i] + total_force;
} }
if (gPinball_factor != 0.0) { if (gPinball_factor != 0.0f) {
BrVector3Scale(&p_vel, &p_vel, gPinball_factor); BrVector3Scale(&p_vel, &p_vel, gPinball_factor);
point_vel = BrVector3LengthSquared(&p_vel); point_vel = BrVector3LengthSquared(&p_vel);
if (point_vel > 10.0) { if (point_vel > 10.0f) {
noise_defeat = 1; noise_defeat = 1;
if (c->driver == eDriver_local_human) { if (c->driver == eDriver_local_human) {
DRS3StartSound(gCar_outlet, 9011); DRS3StartSound(gCar_outlet, 9011);
} else { } else {
DRS3StartSound3D(gCar_outlet, 9011, &c->pos, &gZero_v__car, 1, 255, 0x10000, 0x10000); DRS3StartSound3D(gCar_outlet, 9011, &c->pos, &gZero_v__car, 1, 255, 0x10000, 0x10000);
} }
if (point_vel > 10000.0) { if (point_vel > 10000.0f) {
BrVector3Normalise(&p_vel, &p_vel); BrVector3Normalise(&p_vel, &p_vel);
BrVector3Scale(&p_vel, &p_vel, 100); BrVector3Scale(&p_vel, &p_vel, 100);
} }
@ -2757,7 +2754,7 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
BrVector3Accumulate(&tv, &c->velocity_car_space); BrVector3Accumulate(&tv, &c->velocity_car_space);
batwick_length = BrVector3Length(&tv); batwick_length = BrVector3Length(&tv);
if (!c->collision_flag || (c->collision_flag == 1 && oldk < k)) { if (!c->collision_flag || (c->collision_flag == 1 && oldk < k)) {
for (i = 0; k > i; ++i) { for (i = 0; i < k; i++) {
BrVector3Cross(&vel, &c->omega, &r[i]); BrVector3Cross(&vel, &c->omega, &r[i]);
BrVector3Accumulate(&vel, &c->velocity_car_space); BrVector3Accumulate(&vel, &c->velocity_car_space);
AddFriction(c, &vel, &n[i], &r[i], f[i], &max_friction); AddFriction(c, &vel, &n[i], &r[i], f[i], &max_friction);
@ -2771,38 +2768,38 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
noise_defeat = 0; noise_defeat = 0;
BrVector3Add(&normal_force, &friction_force, &p_vel); BrVector3Add(&normal_force, &friction_force, &p_vel);
BrMatrix34ApplyV(&norm, &normal_force, mat); BrMatrix34ApplyV(&norm, &normal_force, mat);
min = dt * 90.0 / 10.0; min = dt * 90.0f / 10.0f;
max = dt * 110.0 / 10.0; max = dt * 110.0f / 10.0f;
if (c->last_special_volume) { if (c->last_special_volume != NULL) {
min = c->last_special_volume->gravity_multiplier * min; min *= c->last_special_volume->gravity_multiplier;
max = c->last_special_volume->gravity_multiplier * max; max *= c->last_special_volume->gravity_multiplier;
} }
if (c->velocity_car_space.v[2] * c->velocity_car_space.v[2] + c->velocity_car_space.v[1] * c->velocity_car_space.v[1] + c->velocity_car_space.v[0] * c->velocity_car_space.v[0] < 0.050000001 if (BrVector3LengthSquared(&c->velocity_car_space) < 0.05f
&& total_force * 0.1 > c->omega.v[2] * tv.v[2] + c->omega.v[1] * tv.v[1] + c->omega.v[0] * tv.v[0] && 0.1f * total_force > BrVector3Dot(&c->omega, &tv)
&& k >= 3 && k >= 3
&& norm.v[1] > min && norm.v[1] > min
&& norm.v[1] < max) { && norm.v[1] < max) {
if (c->driver <= eDriver_non_car || fabs(normal_force.v[2]) <= total_force * 0.89999998) { if (c->driver <= eDriver_non_car || fabsf(normal_force.v[2]) <= total_force * 0.9f) {
BrVector3Set(&c->v, 0, 0, 0); BrVector3Set(&c->v, 0.f, 0.f, 0.f);
BrVector3Set(&norm, 0, 0, 0); BrVector3Set(&norm, 0.f, 0.f, 0.f);
BrVector3Set(&normal_force, 0, 0, 0); BrVector3Set(&normal_force, 0.f, 0.f, 0.f);
BrVector3Set(&c->omega, 0, 0, 0); BrVector3Set(&c->omega, 0.f, 0.f, 0.f);
BrVector3Set(&c->oldomega, 0, 0, 0); BrVector3Set(&c->oldomega, 0.f, 0.f, 0.f);
if (c->driver <= eDriver_non_car || car_spec->max_force_rear == 0.0) { if (c->driver <= eDriver_non_car || car_spec->max_force_rear == 0.0f) {
if (c->driver <= eDriver_non_car) { if (c->driver <= eDriver_non_car) {
PipeSingleNonCar(c); PipeSingleNonCar(c);
} }
c->doing_nothing_flag = 1; c->doing_nothing_flag = 1;
} }
} else { } else {
BrVector3SetFloat(&tv2, 0.0, -1.0, 0.0); BrVector3SetFloat(&tv2, 0.0f, -1.0f, 0.0f);
bb.v[0] = mat->m[1][2] * tv2.v[1] - mat->m[1][1] * tv2.v[2]; bb.v[0] = mat->m[1][2] * tv2.v[1] - mat->m[1][1] * tv2.v[2];
bb.v[1] = mat->m[1][0] * tv2.v[2] - mat->m[1][2] * tv2.v[0]; bb.v[1] = mat->m[1][0] * tv2.v[2] - mat->m[1][2] * tv2.v[0];
bb.v[2] = mat->m[1][1] * tv2.v[0] - mat->m[1][0] * tv2.v[1]; bb.v[2] = mat->m[1][1] * tv2.v[0] - mat->m[1][0] * tv2.v[1];
if (BrVector3Dot(&bb, (br_vector3*)&mat->m[0][1]) <= 0.0) { if (BrVector3Dot(&bb, (br_vector3*)&mat->m[0][1]) <= 0.0f) {
c->omega.v[0] = -0.5; c->omega.v[0] = -0.5f;
} else { } else {
c->omega.v[0] = 0.5; c->omega.v[0] = 0.5f;
} }
} }
} }
@ -2847,7 +2844,7 @@ int CollCheck(tCollision_info* c, br_scalar dt) {
} }
return k; return k;
} else { } else {
if (k) { if (k != 0) {
c->old_point = r[0]; c->old_point = r[0];
c->old_norm = n[0]; c->old_norm = n[0];
} }

View File

@ -37,12 +37,12 @@
#define GET_PEDESTRIAN_INDEX(P) ((P)-gPedestrian_array) #define GET_PEDESTRIAN_INDEX(P) ((P)-gPedestrian_array)
int gDetect_peds = 1; int gDetect_peds = 1;
int gReally_stupid_ped_bug_enable; int gReally_stupid_ped_bug_enable = 0;
int gPed_sound_disable; int gPed_sound_disable = 0;
int gVesuvians_last_time; int gVesuvians_last_time = 0;
int gSend_peds = 1; int gSend_peds = 1;
tU32 gLast_ped_message_send; tU32 gLast_ped_message_send = 0;
tPedestrian_instruction* gInitial_instruction; tPedestrian_instruction* gInitial_instruction = NULL;
char* gRate_commands[3] = { "fixed", "speed", "variable" }; char* gRate_commands[3] = { "fixed", "speed", "variable" };
char* gCollide_commands[1] = { "collide" }; char* gCollide_commands[1] = { "collide" };
char* gInstruc_commands[10] = { char* gInstruc_commands[10] = {
@ -81,13 +81,13 @@ int gPed_gib_maxes[4][5] = {
}; };
br_scalar gExploding_ped_scale[3] = { 0.0028f, 0.0033f, 0.0045f }; br_scalar gExploding_ped_scale[3] = { 0.0028f, 0.0033f, 0.0045f };
br_vector3 gZero_v__pedestrn; // suffix added to avoid duplicate symbol br_vector3 gZero_v__pedestrn; // suffix added to avoid duplicate symbol
int gPed_instruc_count; int gPed_instruc_count = 0;
int gPed_count; int gPed_count;
br_actor* gPath_actor; br_actor* gPath_actor = NULL;
br_actor* gCurrent_ped_path_actor; br_actor* gCurrent_ped_path_actor = NULL;
int gPedestrians_on; int gPedestrians_on = 0;
int gVesuvian_corpses; int gVesuvian_corpses = 0;
br_material* gPed_material; br_material* gPed_material = NULL;
int gPed_gib_counts[4][5]; int gPed_gib_counts[4][5];
tPedestrian_instruction gPed_instrucs[100]; tPedestrian_instruction gPed_instrucs[100];
tPed_gib gPed_gibs[30]; tPed_gib gPed_gibs[30];
@ -119,7 +119,7 @@ int gCurrent_lollipop_index;
int gVesuvians_this_time; int gVesuvians_this_time;
int gNumber_of_ped_gibs; int gNumber_of_ped_gibs;
tPedestrian_data* gFlag_waving_bastard; tPedestrian_data* gFlag_waving_bastard;
int gNumber_of_pedestrians; int gNumber_of_pedestrians = 0;
br_pixelmap* gProx_ray_shade_table; br_pixelmap* gProx_ray_shade_table;
tPedestrian_data* gPedestrian_array; tPedestrian_data* gPedestrian_array;
tU32 gLast_ped_splat_time; tU32 gLast_ped_splat_time;
@ -1755,13 +1755,13 @@ void CheckPedestrianDeathScenario(tPedestrian_data* pPedestrian) {
} }
proximity_rayed = 0; proximity_rayed = 0;
} }
if (pPedestrian->fate == (tCar_spec*)the_car if (pPedestrian->fate != (tCar_spec*)the_car
&& !proximity_rayed && !proximity_rayed
&& (the_car->bounds[0].max.v[V_Y] < min_ped_bounds_car.v[V_Y] && (the_car->bounds[0].max.v[V_Y] < min_ped_bounds_car.v[V_Y]
|| the_car->bounds[0].min.v[V_Y] > max_ped_bounds_car.v[V_Y])) { || the_car->bounds[0].min.v[V_Y] > max_ped_bounds_car.v[V_Y])) {
continue; continue;
} }
pPedestrian->fate = 0; pPedestrian->fate = NULL;
if (pPedestrian->current_action == pPedestrian->fatal_car_impact_action if (pPedestrian->current_action == pPedestrian->fatal_car_impact_action
|| pPedestrian->current_action == pPedestrian->fatal_ground_impact_action) { || pPedestrian->current_action == pPedestrian->fatal_ground_impact_action) {
if (pPedestrian->ref_number < 100) { if (pPedestrian->ref_number < 100) {