-VG_STATIC void player__walk_update( player_instance *player ){
- struct player_walk *w = &player->_walk;
- v3_copy( player->rb.co, w->state.prev_pos );
- v3_zero( player->rb.w );
+static void player_walk_custom_filter( world_instance *world,
+ rb_ct *man, int len, f32 w ){
+ for( int i=0; i<len; i++ ){
+ rb_ct *ci = &man[i];
+ if( ci->type == k_contact_type_disabled ||
+ ci->type == k_contact_type_edge )
+ continue;
+
+
+ float d1 = v3_dot( ci->co, ci->n );
+
+ for( int j=0; j<len; j++ ){
+ if( j == i )
+ continue;
+
+ rb_ct *cj = &man[j];
+ if( cj->type == k_contact_type_disabled )
+ continue;
+
+ struct world_surface *si = world_contact_surface( world, ci ),
+ *sj = world_contact_surface( world, cj );
+
+ if( (sj->info.flags & k_material_flag_walking) &&
+ !(si->info.flags & k_material_flag_walking)){
+ continue;
+ }
+
+ float d2 = v3_dot( cj->co, ci->n ),
+ d = d2-d1;
+
+ if( fabsf( d ) <= w ){
+ cj->type = k_contact_type_disabled;
+ }
+ }
+ }
+}
+
+static void player__walk_update(void){
+ struct player_walk *w = &player_walk;
+ v3_copy( localplayer.rb.co, w->state.prev_pos );
+ v3_zero( localplayer.rb.w );