diff --git a/CHANGELOG.txt b/CHANGELOG.txt index c3128c119..6cf0302e0 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -6,6 +6,7 @@ editor/segment.c, main/fvi.c, main/gameseg.c, main/physics.c, main/segment.h: Si main/endlevel.c: Make sure the big explosion at the end of the escape sequence also uses blending if transparency effects are activated main/multi.c: Fix crash in multi_maybe_disable_friendly_fire() when killer == NULL 2d/font.c: mipmapping was always on for fonts due to changed filtering code in ogl.c +main/physics.c: To compensate fewer FVI runs in lower FPS and wall penetration caused by strong forces allowed fix_illegal_wall_intersection() to move an object out of the wall half it's size improving the collisions once more 20110424 -------- diff --git a/main/physics.c b/main/physics.c index 51917358e..65a090657 100644 --- a/main/physics.c +++ b/main/physics.c @@ -290,7 +290,7 @@ void do_physics_sim_rot(object *obj) // On joining edges fvi tends to get inaccurate as hell due to object size. And I have no means to fix that - shame on me (that whole code should be rewritten). Approach is to check if the object interects with the wall and if so, move it out towards segment center. void fix_illegal_wall_intersection(object *obj) { - int i = 0; + int i = 0, bocount = 1; vms_vector center,bump_vec; if ( !(obj->type == OBJ_PLAYER || obj->type == OBJ_ROBOT) ) @@ -306,9 +306,15 @@ void fix_illegal_wall_intersection(object *obj) if ( Segments[Segments[obj->segnum].children[i]].degenerated ) return; + if (obj->size/2 >= F0_1) // at size bigger than bumping distance use multiple runs so we can move at least half the size of the object we want to bump (rounding covered by >= in while below) + bocount = (obj->size/2/F0_1); + compute_segment_center(¢er,&Segments[obj->segnum]); - vm_vec_normalized_dir_quick(&bump_vec,¢er,&obj->pos); - vm_vec_scale_add2(&obj->pos,&bump_vec,F0_1); + while ( object_intersects_wall(obj) && bocount-- >= 0 ) + { + vm_vec_normalized_dir_quick(&bump_vec,¢er,&obj->pos); + vm_vec_scale_add2(&obj->pos,&bump_vec,F0_1); + } } // -----------------------------------------------------------------------------------------------------------