From 610907ae753bdda202236d52a6fcf77d14d63193 Mon Sep 17 00:00:00 2001 From: hgn Date: Tue, 11 Apr 2023 19:08:25 +0100 Subject: [PATCH] bouncy balls --- font.h | 29 +++++----- player.c | 3 + player_ragdoll.h | 2 +- rigidbody.h | 14 +++++ skaterift.c | 8 +-- world.h | 6 +- world_routes.h | 142 +++++++++++++++++++++++++++++++++++++++++++---- 7 files changed, 173 insertions(+), 31 deletions(-) diff --git a/font.h b/font.h index 4c7d8f4..75f2573 100644 --- a/font.h +++ b/font.h @@ -86,6 +86,17 @@ VG_STATIC void font3d_bind( font3d *font, camera *cam ) mesh_bind( &font->mesh ); } +VG_STATIC ent_glyph *font3d_glyph( font3d *font, u32 variant_id, u32 utf32 ) +{ + if( utf32 < font->info.glyph_utf32_base ) return NULL; + if( utf32 >= font->info.glyph_utf32_base+font->info.glyph_count) return NULL; + + u32 index = utf32 - font->info.glyph_utf32_base; + index += font->info.glyph_start; + index += font->info.glyph_count * variant_id; + return mdl_arritm( &font->glyphs, index ); +} + VG_STATIC void font3d_simple_draw( font3d *font, u32 variant_id, const char *text, camera *cam, m4x3f transform ) @@ -105,13 +116,8 @@ void font3d_simple_draw( font3d *font, u32 variant_id, const char *text, u32 c = text[i]; if(!c) break; - if( c < font->info.glyph_utf32_base ) continue; - if( c >= font->info.glyph_utf32_base+font->info.glyph_count) continue; - - u32 index = c - font->info.glyph_utf32_base; - index += font->info.glyph_start; - index += font->info.glyph_count * variant_id; - ent_glyph *glyph = mdl_arritm( &font->glyphs, index ); + ent_glyph *glyph = font3d_glyph( font, variant_id, c ); + if( !glyph ) continue; if( glyph->indice_count ){ shader_model_font_uOffset( offset ); @@ -129,13 +135,8 @@ float font3d_string_width( font3d *font, u32 variant_id, const char *text ) u32 c = text[i]; if(!c) break; - if( c < font->info.glyph_utf32_base ) continue; - if( c >= font->info.glyph_utf32_base+font->info.glyph_count) continue; - - u32 index = c - font->info.glyph_utf32_base; - index += font->info.glyph_start; - index += font->info.glyph_count * variant_id; - ent_glyph *glyph = mdl_arritm( &font->glyphs, index ); + ent_glyph *glyph = font3d_glyph( font, variant_id, c ); + if( !glyph ) continue; width += glyph->size[0]; } diff --git a/player.c b/player.c index 01a0b52..51353b9 100644 --- a/player.c +++ b/player.c @@ -291,6 +291,9 @@ VG_STATIC void gate_rotate_angles( ent_gate *gate, v3f angles, v3f d ) PLAYER_API void player__pass_gate( player_instance *player, ent_gate *gate ) { + world_routes_fracture( get_active_world(), gate, + player->rb.co, player->rb.v ); + player->gate_waiting = gate; world_routes_activate_entry_gate( get_active_world(), gate ); diff --git a/player_ragdoll.h b/player_ragdoll.h index c44060a..101d8f9 100644 --- a/player_ragdoll.h +++ b/player_ragdoll.h @@ -435,7 +435,7 @@ VG_STATIC void player_ragdoll_iter( struct player_ragdoll *rd ) v3_sub( ct->co, ct->rba->co, ra ); v3_sub( ct->co, ct->rbb->co, rb ); rb_rcv( ct->rba, ct->rbb, ra, rb, rv ); - float vn = v3_dot( rv, ct->n ); + float vn = v3_dot( rv, ct->n ); float s = fabsf(vn - contact_velocities[i]); if( s > max_stress ){ diff --git a/rigidbody.h b/rigidbody.h index f2f36cb..60fc88c 100644 --- a/rigidbody.h +++ b/rigidbody.h @@ -1659,6 +1659,20 @@ VG_STATIC void rb_rcv( rigidbody *rba, rigidbody *rbb, v3f ra, v3f rb, v3f rv ) v3_sub( rva, rvb, rv ); } +VG_STATIC void rb_contact_restitution( rb_ct *ct, float cr ) +{ + v3f rv, ra, rb; + v3_sub( ct->co, ct->rba->co, ra ); + v3_sub( ct->co, ct->rbb->co, rb ); + rb_rcv( ct->rba, ct->rbb, ra, rb, rv ); + + float v = v3_dot( rv, ct->n ); + + if( v < -1.0f ){ + ct->bias += -cr * v; + } +} + /* * Apply impulse to object */ diff --git a/skaterift.c b/skaterift.c index 9c83a88..8b909d2 100644 --- a/skaterift.c +++ b/skaterift.c @@ -275,8 +275,7 @@ VG_STATIC void vg_update(void) { steam_update(); - if( vg.is_loaded ) - { + if( vg.is_loaded ){ draw_origin_axis(); network_update(); @@ -294,15 +293,14 @@ VG_STATIC void vg_update(void) VG_STATIC void vg_update_fixed(void) { - if( vg.is_loaded ) - { + if( vg.is_loaded ){ #if 0 if( !gzoomer.inside ) player_update_fixed(); vehicle_update_fixed(); #endif - + world_routes_fixedupdate( get_active_world() ); player__update( &localplayer ); } } diff --git a/world.h b/world.h index c99cfdc..ab663d0 100644 --- a/world.h +++ b/world.h @@ -239,8 +239,12 @@ VG_STATIC struct world_global{ u32 timer_text_count; struct text_particle{ - rigidbody *rb; + rb_object obj; + m4x3f mlocal; ent_glyph *glyph; + v4f colour; + + m4x3f mdl; } text_particles[6*4]; u32 text_particle_count; diff --git a/world_routes.h b/world_routes.h index 792b7e8..e47ebe2 100644 --- a/world_routes.h +++ b/world_routes.h @@ -592,6 +592,55 @@ VG_STATIC void world_routes_update( world_instance *world ) int target = route->active_checkpoint == 0xffff? 0: 1; route->factive = vg_lerpf( route->factive, target, 0.6f*vg.time_delta ); } + + for( u32 i=0; iobj, VG__RED ); + } +} + +VG_STATIC void world_routes_fixedupdate( world_instance *world ) +{ + rb_solver_reset(); + + for( u32 i=0; iobj.rb.to_world, + &particle->obj.inf.sphere, + NULL, &world->rb_geo.inf.scene, buf ); + + for( int j=0; jobj.rb; + buf[j].rbb = &world->rb_geo.rb; + } + + rb_contact_count += l; + } + } + + rb_presolve_contacts( rb_contact_buffer, rb_contact_count ); + + for( int i=0; iobj.rb ); + } + + for( u32 i=0; iobj.rb ); + } } VG_STATIC void bind_terrain_noise(void); @@ -702,28 +751,76 @@ VG_STATIC void world_routes_update_timer_texts( world_instance *world ) } } -VG_STATIC void world_routes_fracture( world_instance *world, ent_gate *gate ) +VG_STATIC void world_routes_fracture( world_instance *world, ent_gate *gate, + v3f imp_co, v3f imp_v ) { world_global.text_particle_count = 0; for( u32 i=0; igate == gate ){ - v3f co, s; - v4f q; - m4x3_decompose( text->transform, co, q, s ); + if( text->gate != gate ) continue; - for( u32 j=0;; j++ ){ - char c = text->text[j]; - if( !c ) break; + m4x3f transform; + m4x3_mul( gate->transport, text->transform, transform ); - if( c < '0' || c > '9' ) continue; - + v3f co, s; + v4f q; + m4x3_decompose( transform, co, q, s ); + + v3f offset; + v3_zero( offset ); + + v4f colour; + float brightness = 0.3f + world->ub_lighting.g_day_phase; + v3_muls( text->route->colour, brightness, colour ); + colour[3] = 1.0f-text->route->factive; + + for( u32 j=0;; j++ ){ + char c = text->text[j]; + if( !c ) break; + + ent_glyph *glyph = font3d_glyph( &world_global.font, 0, c ); + if( !glyph ) continue; + + if( c >= (u32)'0' && c <= (u32)'9' && glyph->indice_count ){ struct text_particle *particle = &world_global.text_particles[world_global.text_particle_count++]; + particle->glyph = glyph; + v4_copy( colour, particle->colour ); + + v3f origin; + v2_muls( glyph->size, 0.5f, origin ); + origin[2] = -0.5f; + + v3f world_co; + + v3_add( offset, origin, world_co ); + m4x3_mulv( transform, world_co, world_co ); + + float r = vg_maxf( s[0]*glyph->size[0], s[1]*glyph->size[1] )*0.5f; + + m3x3_identity( particle->mlocal ); + m3x3_scale( particle->mlocal, s ); + origin[2] *= s[2]; + v3_muls( origin, -1.0f, particle->mlocal[3] ); + + v3_copy( world_co, particle->obj.rb.co ); + v3_muls( imp_v, 1.0f+vg_randf(), particle->obj.rb.v ); + particle->obj.rb.v[1] += 2.0f; + + v4_copy( q, particle->obj.rb.q ); + particle->obj.rb.w[0] = vg_randf()*2.0f-1.0f; + particle->obj.rb.w[1] = vg_randf()*2.0f-1.0f; + particle->obj.rb.w[2] = vg_randf()*2.0f-1.0f; + + particle->obj.type = k_rb_shape_sphere; + particle->obj.inf.sphere.radius = r*0.6f; + + rb_init_object( &particle->obj ); } + offset[0] += glyph->size[0]; } } } @@ -782,6 +879,31 @@ VG_STATIC void render_world_routes( world_instance *world, camera *cam, font3d_simple_draw( &world_global.font, 0, text->text, cam, text->transform ); } + + shader_model_font_uOffset( (v3f){0.0f,0.0f,0.0f} ); + + for( u32 i=0; imdl, prev_mtx ); + m4x4_mul( cam->mtx_prev.pv, prev_mtx, prev_mtx ); + + shader_model_font_uPvmPrev( prev_mtx ); + + v4f q; + m4x3f model; + rb_extrapolate( &particle->obj.rb, model[3], q ); + q_m3x3( q, model ); + + m4x3_mul( model, particle->mlocal, particle->mdl ); + shader_model_font_uMdl( particle->mdl ); + shader_model_font_uColour( particle->colour ); + + mesh_drawn( particle->glyph->indice_start, + particle->glyph->indice_count ); + } } /* gate markers -- 2.25.1