X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=world_routes.h;h=e47ebe2739f6b0dabc6744fbd3864788b600d95a;hb=610907ae753bdda202236d52a6fcf77d14d63193;hp=792b7e8dc89ccdbe8a1bf1aa7476101291d106d4;hpb=e5dfbef890431a69291a9f0a9ca4a88ea8d0705a;p=carveJwlIkooP6JGAAIwe30JlM.git 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