From 6d98c1e42c1617a8a426f9f0c0df99b75725b486 Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 18 Nov 2022 07:08:22 +0000 Subject: [PATCH] even more collision filtering --- common.h | 2 + maps_src/mp_gridmap.mdl | Bin 596240 -> 624016 bytes player_physics.h | 23 ++++++- rigidbody.h | 132 ++++++++++++++++++++++++++++++++++++++-- shaders/viewchar.fs | 2 +- shaders/viewchar.h | 2 +- skaterift.c | 3 +- 7 files changed, 152 insertions(+), 12 deletions(-) diff --git a/common.h b/common.h index c3f3e69..2e254f9 100644 --- a/common.h +++ b/common.h @@ -7,6 +7,8 @@ #define VG_TIMESTEP_FIXED (1.0/60.0) #define VG_3D +#define VG_GAME +#define VG_STATIC static #define VG_FRAMEBUFFER_RESIZE 1 #include "vg/vg.h" #include "submodules/anyascii/impl/c/anyascii.c" diff --git a/maps_src/mp_gridmap.mdl b/maps_src/mp_gridmap.mdl index 2284ed0d1b8ff9e1b7f59deaf459e0a7d205be1d..8b9ce51208db69023f5c3329de300ce2d61c6b87 100644 GIT binary patch delta 25894 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 G%KaZmw^_ab delta 389 zcmbQxtu|qkN;(6>+0~2;3=9I2oInyt191Tma{=)N76t}35FbbYnG6rufdmi;a6tHA z8mL(T$Oi!fpb=Tp5Zb2%s7{xa;er$sgTp_z$q(6-CwAq@q^!|8z%^mFQ^c&D2S8e) zR&wqKQVrtQ!tJLwXtRoK)?#d9-o(0taq<&3m(4ot6-*F!ffP5d9A?WUQhE{`;O^TTbR{3Pt7aY8>(Ate`@;C7Upn9#_h7L%=WB|ZqsACm=81dY**}N z7G`3Mn{L|6tj?%7J+_zmJ?9J!v%R|O%Ix265A9?2XJOp7ed#3T{mhL2rl(E=+T^x< x>NMurYOF0x_4f7crhA#Uo9< 1 ) + rb_manifold_filter_backface( manifold, len_f ); + len_f = rb_manifold_apply_filtered( manifold, len_f ); + + rb_ct *man_b = &manifold[len_f]; + len_b = rb_sphere_scene( rbb, &world.rb_geo, man_b ); + rb_manifold_filter_coplanar( man_b, len_b, 0.05f ); + rb_manifold_filter_pairs( man_b, len_b, 0.05f ); + if( len_b > 1 ) + rb_manifold_filter_backface( man_b, len_b ); + len_b = rb_manifold_apply_filtered( man_b, len_b ); - len += rb_sphere_scene( rbf, &world.rb_geo, manifold+len ); - len += rb_sphere_scene( rbb, &world.rb_geo, manifold+len ); + int len = len_f+len_b; +#if 0 /* * Preprocess collision points, and create a surface picture. * we want contacts that are within our 'capsule's internal line to be @@ -576,6 +592,7 @@ VG_STATIC void player_physics(void) v3_normalize( manifold[i].n ); } } +#endif rb_presolve_contacts( manifold, len ); v3f surface_avg = {0.0f, 0.0f, 0.0f}; diff --git a/rigidbody.h b/rigidbody.h index 480e43f..2e66fe6 100644 --- a/rigidbody.h +++ b/rigidbody.h @@ -103,7 +103,7 @@ VG_STATIC struct contact normal_mass, tangent_mass[2]; u32 element_id; - int cluster; + int disabled; } rb_contact_buffer[256]; VG_STATIC int rb_contact_count = 0; @@ -148,10 +148,13 @@ VG_STATIC void rb_tangent_basis( v3f n, v3f tx, v3f ty ) VG_STATIC void rb_debug_contact( rb_ct *ct ) { - v3f p1; - v3_muladds( ct->co, ct->n, 0.1f, p1 ); - vg_line_pt3( ct->co, 0.025f, 0xff0000ff ); - vg_line( ct->co, p1, 0xffffffff ); + if( !ct->disabled ) + { + v3f p1; + v3_muladds( ct->co, ct->n, 0.1f, p1 ); + vg_line_pt3( ct->co, 0.025f, 0xff0000ff ); + vg_line( ct->co, p1, 0xffffffff ); + } } VG_STATIC void debug_sphere( m4x3f m, float radius, u32 colour ) @@ -833,6 +836,114 @@ VG_STATIC int rb_box_triangle_sat( rigidbody *rba, v3f tri_src[3] ) return 1; } +/* + * ----------------------------------------------------------------------------- + * Manifold + * ----------------------------------------------------------------------------- + */ + +VG_STATIC int rb_manifold_apply_filtered( rb_ct *man, int len ) +{ + int k = 0; + + for( int i=0; idisabled ) + continue; + + man[k ++] = man[i]; + } + + return k; +} + +/* + * Resolve overlapping pairs + */ +VG_STATIC void rb_manifold_filter_pairs( rb_ct *man, int len, float r ) +{ + for( int i=0; idisabled ) continue; + + for( int j=i+1; jdisabled ) continue; + + if( v3_dist2( ci->co, cj->co ) < r*r ) + { + cj->disabled = 1; + v3_add( cj->n, ci->n, ci->n ); + ci->p += cj->p; + similar ++; + } + } + + if( similar ) + { + float n = 1.0f/((float)similar+1.0f); + v3_muls( ci->n, n, ci->n ); + ci->p *= n; + + if( v3_length2(ci->n) < 0.1f*0.1f ) + ci->disabled = 1; + else + v3_normalize( ci->n ); + } + } +} + +/* + * Remove contacts that are facing away from A + */ +VG_STATIC void rb_manifold_filter_backface( rb_ct *man, int len ) +{ + for( int i=0; idisabled ) continue; + + v3f delta; + v3_sub( ct->co, ct->rba->co, delta ); + + if( v3_dot( delta, ct->n ) > -0.001f ) + ct->disabled = 1; + } +} + +/* + * Filter out duplicate coplanar results. Good for spheres. + */ +VG_STATIC void rb_manifold_filter_coplanar( rb_ct *man, int len, float w ) +{ + for( int i=0; idisabled ) continue; + + float d1 = v3_dot( ci->co, ci->n ); + + for( int j=i+1; jdisabled ) continue; + + float d2 = v3_dot( cj->co, ci->n ), + d = d2-d1; + + if( fabsf( d ) <= w ) + cj->disabled = 1; + } + } +} + /* * ----------------------------------------------------------------------------- * Collision matrix @@ -927,6 +1038,7 @@ VG_STATIC int rb_capsule_manifold_done( rigidbody *rba, rigidbody *rbb, ct->p = manifold->r0 - d; ct->rba = rba; ct->rbb = rbb; + ct->disabled = 0; count ++; } @@ -946,6 +1058,7 @@ VG_STATIC int rb_capsule_manifold_done( rigidbody *rba, rigidbody *rbb, ct->p = manifold->r1 - d; ct->rba = rba; ct->rbb = rbb; + ct->disabled = 0; count ++; } @@ -993,6 +1106,7 @@ VG_STATIC int rb_capsule_sphere( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) ct->rba = rba; ct->rbb = rbb; + ct->disabled = 0; return 1; } @@ -1213,6 +1327,7 @@ VG_STATIC int rb_sphere_box( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) ct->rba = rba; ct->rbb = rbb; + ct->disabled = 0; return 1; } @@ -1239,6 +1354,7 @@ VG_STATIC int rb_sphere_sphere( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) v3_muladds( rbb->co, ct->n, rbb->inf.sphere.radius, p1 ); v3_add( p0, p1, ct->co ); v3_muls( ct->co, 0.5f, ct->co ); + ct->disabled = 0; ct->p = r-d; ct->rba = rba; ct->rbb = rbb; @@ -1283,6 +1399,7 @@ VG_STATIC int rb_sphere_triangle( rigidbody *rba, rigidbody *rbb, float d = sqrtf(d2); v3_copy( co, ct->co ); + ct->disabled = 0; ct->p = r-d; ct->rba = rba; ct->rbb = rbb; @@ -1482,6 +1599,7 @@ next_vert:; v3_normalize( ct->n ); v3_copy( co, ct->co ); + ct->disabled = 0; ct->p = r-d; ct->rba = rba; ct->rbb = rbb; @@ -1630,6 +1748,7 @@ VG_STATIC int rb_box_scene( rigidbody *rba, rigidbody *rbb, rb_ct *buf ) if( ct->p < 0.0f ) continue; + ct->disabled = 0; ct->rba = rba; ct->rbb = rbb; count ++; @@ -1731,9 +1850,11 @@ VG_STATIC void rb_presolve_contacts( rb_ct *buffer, int len ) for( int i=0; ibias = -0.2f * k_rb_rate * vg_minf( 0.0f, -ct->p+k_penetration_slop ); rb_tangent_basis( ct->n, ct->t[0], ct->t[1] ); + ct->disabled = 0; ct->norm_impulse = 0.0f; ct->tangent_impulse[0] = 0.0f; ct->tangent_impulse[1] = 0.0f; @@ -1816,6 +1937,7 @@ VG_STATIC void rb_solve_contacts( rb_ct *buf, int len ) for( int i=0; irba; v3f rv, da, db; diff --git a/shaders/viewchar.fs b/shaders/viewchar.fs index 9c46328..57edff5 100644 --- a/shaders/viewchar.fs +++ b/shaders/viewchar.fs @@ -27,6 +27,6 @@ void main() vfrag = do_light_shadowing( vfrag ); vfrag = apply_fog( vfrag, fdist ); - float opacity = clamp( fdist, 0.1, 1.0 ); + float opacity = clamp( fdist*fdist, 0.1, 1.0 ); FragColor = vec4(vfrag,opacity); } diff --git a/shaders/viewchar.h b/shaders/viewchar.h index d7181ff..21d98c0 100644 --- a/shaders/viewchar.h +++ b/shaders/viewchar.h @@ -183,7 +183,7 @@ static struct vg_shader _shader_viewchar = { " vfrag = do_light_shadowing( vfrag );\n" " vfrag = apply_fog( vfrag, fdist );\n" "\n" -" float opacity = clamp( fdist, 0.1, 1.0 );\n" +" float opacity = clamp( fdist*fdist, 0.1, 1.0 );\n" " FragColor = vec4(vfrag,opacity);\n" "}\n" ""}, diff --git a/skaterift.c b/skaterift.c index d4bf10c..5f782d7 100644 --- a/skaterift.c +++ b/skaterift.c @@ -11,8 +11,6 @@ * ============================================================================= */ -#define VG_STATIC static -#define VG_GAME #define SR_NETWORKED #include "common.h" @@ -97,6 +95,7 @@ VG_STATIC void vg_load(void) /* 'systems' are completely loaded now */ strcpy( world.world_name, "maps/mp_mtzero.mdl" ); + strcpy( world.world_name, "maps/mp_gridmap.mdl" ); world_load(); vg_console_load_autos(); } -- 2.25.1