From: hgn Date: Sat, 10 Sep 2022 18:02:45 +0000 (+0100) Subject: stuff X-Git-Url: https://harrygodden.com/git/?a=commitdiff_plain;h=3ee65e6e24bfc39db7c7dd8c1f4cec3d5c42d0f8;p=carveJwlIkooP6JGAAIwe30JlM.git stuff --- diff --git a/anim_test.h b/anim_test.h index 86c6853..054e955 100644 --- a/anim_test.h +++ b/anim_test.h @@ -1,3 +1,7 @@ +/* + * Copyright (C) Mount0 Software, Harry Godden - All Rights Reserved + */ + #ifndef ANIM_TEST_H #define ANIM_TEST_H @@ -47,11 +51,7 @@ static void anim_test_update(void) skeleton_sample_anim( &animtest.skele, animtest.anim_highg, b, bpose ); skeleton_lerp_pose( &animtest.skele, apose, bpose, a, apose ); - skeleton_apply_pose( &animtest.skele, apose, k_anim_apply_defer_ik ); - skeleton_apply_ik_pass( &animtest.skele ); - skeleton_apply_pose( &animtest.skele, apose, k_anim_apply_deffered_only ); - skeleton_apply_inverses( &animtest.skele ); - skeleton_apply_transform( &animtest.skele, transform ); + skeleton_apply_standard( &animtest.skele, apose, transform ); skeleton_debug( &animtest.skele ); } @@ -73,6 +73,9 @@ static void anim_test_render( vg_tex2d *tex ) vg_tex2d_bind( tex, 0 ); shader_viewchar_uTexMain( 0 ); shader_viewchar_uPv( vg_pv ); + + shader_link_standard_ub( _shader_viewchar.id, 2 ); + glUniformMatrix4x3fv( _uniform_viewchar_uTransforms, animtest.skele.bone_count, 0, diff --git a/gate.h b/gate.h index eb0f335..270f9d7 100644 --- a/gate.h +++ b/gate.h @@ -1,8 +1,7 @@ #ifndef GATE_H #define GATE_H -#define VG_3D -#include "vg/vg.h" +#include "common.h" #include "model.h" #include "render.h" #include "shaders/gate.h" diff --git a/main.c b/main.c index 2ae90c8..024b15e 100644 --- a/main.c +++ b/main.c @@ -17,7 +17,7 @@ vg_tex2d tex_water = { .path = "textures/water.qoi" }; static int debugview = 0; static int sv_debugcam = 0; static int lightedit = 0; -static int sv_scene = 2; +static int sv_scene = 0; /* Components */ //#define SR_NETWORKED @@ -28,17 +28,16 @@ static int sv_scene = 2; #include "steam.h" #include "network.h" -#include "road.h" +#include "model.h" +//#include "road.h" #include "scene.h" -#include "ik.h" +//#include "ik.h" #include "audio.h" -#include "terrain.h" -#include "character.h" +//#include "terrain.h" +//#include "character.h" #include "ragdoll.h" #include "rigidbody.h" #include "render.h" -#include "gate.h" -#include "water.h" #include "world.h" #include "player.h" @@ -49,13 +48,15 @@ static int sv_scene = 2; #include "physics_test.h" #include "anim_test.h" +#include "gate.h" +#include "water.h" + void vg_register(void) { shader_blit_register(); shader_standard_register(); shader_vblend_register(); shader_unlit_register(); - shader_viewchar_register(); world_register(); character_register(); @@ -186,7 +187,7 @@ void vg_start(void) if( sv_scene == 0 ) { - character_load( &player.mdl, "ch_default" ); + character_load( &player.mdl, "ch_new" ); character_init_ragdoll( &player.mdl ); world_load(); @@ -264,7 +265,7 @@ static void render_main_game(void) m4x4f world_4x4; m4x3_expand( player.camera_inverse, world_4x4 ); - gpipeline.fov = freecam? 60.0f: 135.0f; /* 120 */ + gpipeline.fov = freecam? 60.0f: 125.0f; /* 120 */ m4x4_projection( vg_pv, gpipeline.fov, (float)vg_window_x / (float)vg_window_y, 0.02f, 2100.0f ); @@ -358,7 +359,7 @@ void vg_render(void) } else if( sv_scene == 2 ) { - anim_test_render( &tex_pallet ); + anim_test_render( &tex_characters ); } #endif } diff --git a/models_src/ch_new.mdl b/models_src/ch_new.mdl index 234f50c..2586e0b 100644 Binary files a/models_src/ch_new.mdl and b/models_src/ch_new.mdl differ diff --git a/player.h b/player.h index 46c7dd4..96b9dba 100644 --- a/player.h +++ b/player.h @@ -4,7 +4,8 @@ #include "audio.h" #include "common.h" #include "world.h" -#include "character.h" +//#include "character.h" +#include "player_model.h" #include "bvh.h" /* @@ -48,6 +49,7 @@ static struct gplayer v2f board_xy; float grab; float pitch; + float pushing, push_time; v3f land_target; v3f land_target_log[22]; @@ -296,10 +298,14 @@ static void player_physics_control(void) if( !vg_get_button("break") && vg_get_button( "push" ) ) { - float cycle_time = (vg_time-start_push)*k_push_cycle_rate, + player.pushing = 1.0f; + player.push_time = vg_time-start_push; + + float cycle_time = player.push_time*k_push_cycle_rate, amt = k_push_accel * (sinf(cycle_time)*0.5f+0.5f)*ktimestep, current = v3_length( vel ), new_vel = vg_minf( current + amt, k_max_push_speed ); + new_vel -= vg_minf(current, k_max_push_speed); vel[2] -= new_vel * player.reverse; } @@ -530,6 +536,7 @@ static void player_physics(void) float grabt = vg_get_axis( "grabr" )*0.5f+0.5f; player.grab = vg_lerpf( player.grab, grabt, 0.14f ); + player.pushing = 0.0f; if( !player.in_air ) { @@ -1626,6 +1633,7 @@ static void player_animate(void) offset[0] = vg_clampf( offset[0], -0.8f, 0.8f ); offset[1] = vg_clampf( offset[1], -0.5f, 0.0f ); + offset[1] = 0.0f; /* * Player rotation @@ -1657,15 +1665,69 @@ static void player_animate(void) static float fdirx = 0.0f; static float fstand = 0.0f; static float ffly = 0.0f; + static float fpush = 0.0f; float speed = v3_length( player.rb.v ); fstand = vg_lerpf(fstand, 1.0f-vg_clampf(speed*0.03f,0.0f,1.0f),0.1f); fslide = vg_lerpf(fslide, vg_clampf(lslip,0.0f,1.0f), 0.04f); - fdirz = vg_lerpf(fdirz, player.reverse > 0.0f? 1.0f: 0.0f, 0.04f ); - fdirx = vg_lerpf(fdirx, player.slip < 0.0f? 1.0f: 0.0f, 0.01f ); + fdirz = vg_lerpf(fdirz, player.reverse > 0.0f? 0.0f: 1.0f, 0.04f ); + fdirx = vg_lerpf(fdirx, player.slip < 0.0f? 0.0f: 1.0f, 0.01f ); ffly = vg_lerpf(ffly, player.in_air? 1.0f: 0.0f, 0.04f ); + fpush = vg_lerpf(fpush, player.pushing, 0.1f ); + + float lr = fdirz * (15.0f/30.0f), + st = offset[1]*-2.0f, + sa = fdirx * (15.0f/30.0f); + + mdl_keyframe apose[32], bpose[32]; + skeleton_sample_anim( &player.mdl.sk, player.mdl.anim_stand, lr, apose ); + skeleton_sample_anim( &player.mdl.sk, player.mdl.anim_highg, lr, bpose ); + skeleton_lerp_pose( &player.mdl.sk, apose, bpose, st, apose ); + skeleton_sample_anim( &player.mdl.sk, player.mdl.anim_slide, sa, bpose ); + skeleton_lerp_pose( &player.mdl.sk, apose, bpose, fslide, apose ); + + static float fairdir = 0.0f; + fairdir = vg_lerpf( fairdir, -vg_get_axis("horizontal"), 0.04f ); + + /* air anim */ + float air_dir = (fairdir*0.5f+0.5f)*(15.0f/30.0f); + skeleton_sample_anim( &player.mdl.sk, player.mdl.anim_air, air_dir, bpose ); + skeleton_lerp_pose( &player.mdl.sk, apose, bpose, ffly, apose ); + + /* push anim */ + skeleton_sample_anim( &player.mdl.sk, player.reverse > 0.0f? + player.mdl.anim_push: + player.mdl.anim_push_reverse, + player.push_time, bpose ); + skeleton_lerp_pose( &player.mdl.sk, apose, bpose, fpush, apose ); + + + /* additive effects */ + apose[player.mdl.id_hip-1].co[0] += offset[0]; + apose[player.mdl.id_hip-1].co[2] += offset[2]; + apose[player.mdl.id_ik_hand_l-1].co[0] += offset[0]; + apose[player.mdl.id_ik_hand_l-1].co[2] += offset[2]; + apose[player.mdl.id_ik_hand_r-1].co[0] += offset[0]; + apose[player.mdl.id_ik_hand_r-1].co[2] += offset[2]; + apose[player.mdl.id_ik_elbow_l-1].co[0] += offset[0]; + apose[player.mdl.id_ik_elbow_l-1].co[2] += offset[2]; + apose[player.mdl.id_ik_elbow_r-1].co[0] += offset[0]; + apose[player.mdl.id_ik_elbow_r-1].co[2] += offset[2]; + + skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_defer_ik ); + skeleton_apply_ik_pass( &player.mdl.sk ); + skeleton_apply_pose( &player.mdl.sk, apose, k_anim_apply_deffered_only ); + + v3_copy( player.mdl.sk.final_mtx[player.mdl.id_head-1][3], + player.mdl.cam_pos ); + skeleton_apply_inverses( &player.mdl.sk ); + skeleton_apply_transform( &player.mdl.sk, player.rb.to_world ); + + skeleton_debug( &player.mdl.sk ); + +#if 0 character_pose_reset( &player.mdl ); /* TODO */ @@ -1789,6 +1851,7 @@ static void player_animate(void) rhead = vg_lerpf( rhead, vg_clampf( atan2f(localv[2],-localv[0]),-klook_max,klook_max), 0.04f ); player.mdl.rhead = rhead; +#endif } static void player_camera_update(void) @@ -1803,6 +1866,7 @@ static void player_camera_update(void) static void player_animate_death_cam(void) { +#if 0 v3f delta; v3f head_pos; v3_copy( player.mdl.ragdoll[k_chpart_head].co, head_pos ); @@ -1832,14 +1896,17 @@ static void player_animate_death_cam(void) player.angles[0] = atan2f( delta[0], -delta[2] ); player.angles[1] = -asinf( delta[1] ); +#endif } static void player_animate_camera(void) { - v3f offs = { -0.29f, 0.08f, 0.0f }; - m3x3_mulv( player.rb.to_world, offs, offs ); - m4x3_mulv( player.rb.to_world, player.mdl.ik_body.end, player.camera_pos ); - v3_add( offs, player.camera_pos, player.camera_pos ); + static v3f lerp_cam = {0.0f,0.0f,0.0f}; + v3f offs = { -0.4f, 0.15f, 0.0f }; + + v3_lerp( lerp_cam, player.mdl.cam_pos, 0.8f, lerp_cam ); + v3_add( lerp_cam, offs, offs ); + m4x3_mulv( player.rb.to_world, offs, player.camera_pos ); /* Look angles */ v3_lerp( player.vl, player.rb.v, 0.05f, player.vl ); @@ -2045,6 +2112,7 @@ static void player_update(void) static void draw_player(void) { /* Draw */ +#if 0 m4x3_copy( player.rb.to_world, player.mdl.mroot ); if( player.is_dead ) @@ -2057,6 +2125,21 @@ static void draw_player(void) opacity = 0.0f; character_draw( &player.mdl, opacity, player.camera ); +#endif + + shader_viewchar_use(); + vg_tex2d_bind( &tex_characters, 0 ); + shader_viewchar_uTexMain( 0 ); + shader_viewchar_uCamera( player.camera[3] ); + shader_viewchar_uPv( vg_pv ); + shader_link_standard_ub( _shader_viewchar.id, 2 ); + glUniformMatrix4x3fv( _uniform_viewchar_uTransforms, + player.mdl.sk.bone_count, + 0, + (float *)player.mdl.sk.final_mtx ); + + mesh_bind( &player.mdl.mesh ); + mesh_draw( &player.mdl.mesh ); } #endif /* PLAYER_H */ diff --git a/player_model.h b/player_model.h new file mode 100644 index 0000000..6483f06 --- /dev/null +++ b/player_model.h @@ -0,0 +1,89 @@ +#ifndef CHARACTER_H +#define CHARACTER_H + +#include "common.h" +#include "model.h" +#include "rigidbody.h" +#include "render.h" +#include "skeleton.h" +#include "shaders/viewchar.h" + +vg_tex2d tex_characters = { .path = "textures/ch_gradient.qoi" }; + +static void character_register(void) +{ + shader_viewchar_register(); +} + +static void character_init(void) +{ + vg_tex2d_init( (vg_tex2d *[]){ &tex_characters }, 1 ); +} + +struct character +{ + glmesh mesh; + struct skeleton sk; + struct skeleton_anim *anim_stand, + *anim_highg, + *anim_slide, + *anim_air, + *anim_push, *anim_push_reverse; + + u32 id_hip, + id_ik_hand_l, + id_ik_hand_r, + id_ik_elbow_l, + id_ik_elbow_r, + id_head; + + v3f cam_pos; + + int shoes[2]; +}; + +static int character_load( struct character *ch, const char *name ) +{ + char buf[64]; + + snprintf( buf, sizeof(buf)-1, "models/%s.mdl", name ); + mdl_header *src = mdl_load( buf ); + + if( !src ) + return 0; + + int error_count = 0; + mdl_unpack_glmesh( src, &ch->mesh ); + + if( !error_count ) + vg_success( "Loaded character file '%s' with no errors\n", name ); + + skeleton_setup( &ch->sk, src ); + ch->anim_stand = skeleton_get_anim( &ch->sk, "pose_stand" ); + ch->anim_highg = skeleton_get_anim( &ch->sk, "pose_highg" ); + ch->anim_slide = skeleton_get_anim( &ch->sk, "pose_slide" ); + ch->anim_air = skeleton_get_anim( &ch->sk, "pose_air" ); + ch->anim_push = skeleton_get_anim( &ch->sk, "push" ); + ch->anim_push_reverse = skeleton_get_anim( &ch->sk, "push_reverse" ); + + ch->id_hip = skeleton_bone_id( &ch->sk, "hips" ); + ch->id_ik_hand_l = skeleton_bone_id( &ch->sk, "hand.IK.L" ); + ch->id_ik_hand_r = skeleton_bone_id( &ch->sk, "hand.IK.R" ); + ch->id_ik_elbow_l = skeleton_bone_id( &ch->sk, "elbow.L" ); + ch->id_ik_elbow_r = skeleton_bone_id( &ch->sk, "elbow.R" ); + ch->id_head = skeleton_bone_id( &ch->sk, "head" ); + + free( src ); + return 1; +} + +static void character_eval( struct character *ch ){} +static void character_draw( struct character *ch, float temp, m4x3f camera ){} +static void character_init_ragdoll_joints( struct character *ch ){} +static void character_init_ragdoll( struct character *ch ){} +static void character_ragdoll_go( struct character *ch, v3f pos ){} +static void character_ragdoll_copypose( struct character *ch, v3f v ){} +static void character_debug_ragdoll( struct character *ch ){} +static void character_ragdoll_iter( struct character *ch ){} + +#endif diff --git a/shaders/viewchar.fs b/shaders/viewchar.fs index ffc969d..92e11be 100644 --- a/shaders/viewchar.fs +++ b/shaders/viewchar.fs @@ -1,6 +1,7 @@ out vec4 FragColor; uniform sampler2D uTexMain; +uniform vec3 uCamera; in vec4 aColour; in vec2 aUv; @@ -15,14 +16,16 @@ void main() vec3 vfrag = texture( uTexMain, aUv ).rgb; // Lighting - //vec3 halfview = uCamera - aWorldCo; - //float fdist = length( halfview ); - //halfview /= fdist; + vec3 halfview = uCamera - aWorldCo; + float fdist = length( halfview ); + halfview /= fdist; - //vfrag = do_light_diffuse( vfrag, aNorm ); - //vfrag = do_light_spec( vfrag, aNorm, halfview, 0.1 ); - //vfrag = do_light_shadowing( vfrag ); - //vfrag = apply_fog( vfrag, fdist ); + vfrag = do_light_diffuse( vfrag, aNorm ); + vfrag = do_light_spec( vfrag, aNorm, halfview, 0.1 ); + vfrag = do_light_shadowing( vfrag ); + vfrag = apply_fog( vfrag, fdist ); - FragColor = vec4(aNorm,1.0); + float opacity = clamp( fdist, 0.1, 1.0 ); + + FragColor = vec4(vfrag,opacity); } diff --git a/shaders/viewchar.h b/shaders/viewchar.h index 23cb8b7..551804a 100644 --- a/shaders/viewchar.h +++ b/shaders/viewchar.h @@ -39,7 +39,7 @@ static struct vg_shader _shader_viewchar = { "\n" " vec3 world_pos = co0*a_weights[0] + co1*a_weights[1] + co2*a_weights[2];\n" " vec3 world_normal = n0*a_weights[0] + n1*a_weights[1] + n2*a_weights[2];\n" -"\n" +" \n" " gl_Position = uPv * vec4( world_pos, 1.0 );\n" " aColour = a_colour;\n" " aUv = a_uv;\n" @@ -55,6 +55,7 @@ static struct vg_shader _shader_viewchar = { "out vec4 FragColor;\n" "\n" "uniform sampler2D uTexMain;\n" +"uniform vec3 uCamera;\n" "\n" "in vec4 aColour;\n" "in vec2 aUv;\n" @@ -160,23 +161,25 @@ static struct vg_shader _shader_viewchar = { " return mix( vfrag, vec3(0.55,0.76,1.0), min( 1.0, dist ) );\n" "}\n" "\n" -"#line 12 0 \n" +"#line 13 0 \n" "\n" "void main()\n" "{\n" " vec3 vfrag = texture( uTexMain, aUv ).rgb;\n" "\n" " // Lighting\n" -" //vec3 halfview = uCamera - aWorldCo;\n" -" //float fdist = length( halfview );\n" -" //halfview /= fdist;\n" +" vec3 halfview = uCamera - aWorldCo;\n" +" float fdist = length( halfview );\n" +" halfview /= fdist;\n" +"\n" +" vfrag = do_light_diffuse( vfrag, aNorm );\n" +" vfrag = do_light_spec( vfrag, aNorm, halfview, 0.1 );\n" +" vfrag = do_light_shadowing( vfrag );\n" +" vfrag = apply_fog( vfrag, fdist );\n" "\n" -" //vfrag = do_light_diffuse( vfrag, aNorm );\n" -" //vfrag = do_light_spec( vfrag, aNorm, halfview, 0.1 );\n" -" //vfrag = do_light_shadowing( vfrag );\n" -" //vfrag = apply_fog( vfrag, fdist );\n" +" float opacity = clamp( fdist, 0.1, 1.0 );\n" "\n" -" FragColor = vec4(vfrag,1.0);\n" +" FragColor = vec4(vfrag,opacity);\n" "}\n" ""}, }; @@ -184,6 +187,7 @@ static struct vg_shader _shader_viewchar = { static GLuint _uniform_viewchar_uPv; static GLuint _uniform_viewchar_uTransforms; static GLuint _uniform_viewchar_uTexMain; +static GLuint _uniform_viewchar_uCamera; static GLuint _uniform_viewchar_g_world_depth; static void shader_viewchar_uPv(m4x4f m){ glUniformMatrix4fv( _uniform_viewchar_uPv, 1, GL_FALSE, (float *)m ); @@ -191,6 +195,9 @@ static void shader_viewchar_uPv(m4x4f m){ static void shader_viewchar_uTexMain(int i){ glUniform1i( _uniform_viewchar_uTexMain, i ); } +static void shader_viewchar_uCamera(v3f v){ + glUniform3fv( _uniform_viewchar_uCamera, 1, v ); +} static void shader_viewchar_g_world_depth(int i){ glUniform1i( _uniform_viewchar_g_world_depth, i ); } @@ -202,6 +209,7 @@ static void shader_viewchar_link(void){ _uniform_viewchar_uPv = glGetUniformLocation( _shader_viewchar.id, "uPv" ); _uniform_viewchar_uTransforms = glGetUniformLocation( _shader_viewchar.id, "uTransforms" ); _uniform_viewchar_uTexMain = glGetUniformLocation( _shader_viewchar.id, "uTexMain" ); + _uniform_viewchar_uCamera = glGetUniformLocation( _shader_viewchar.id, "uCamera" ); _uniform_viewchar_g_world_depth = glGetUniformLocation( _shader_viewchar.id, "g_world_depth" ); } #endif /* SHADER_viewchar_H */ diff --git a/skeleton.h b/skeleton.h index e143fa2..34e1b8e 100644 --- a/skeleton.h +++ b/skeleton.h @@ -1,3 +1,7 @@ +/* + * Copyright (C) Mount0 Software, Harry Godden - All Rights Reserved + */ + #ifndef SKELETON_H #define SKELETON_H @@ -14,6 +18,8 @@ struct skeleton int defer; mdl_keyframe kf; + + char name[16]; } *bones; m4x3f *final_mtx; @@ -42,6 +48,16 @@ struct skeleton useless cpu IK bones. */ }; +static u32 skeleton_bone_id( struct skeleton *skele, const char *name ) +{ + for( u32 i=0; ibone_count; i++ ) + { + if( !strcmp( skele->bones[i].name, name )) + return i; + } + return 0; +} + /* * Lerp between two sets of keyframes and store in dest. Rotations use Nlerp. */ @@ -174,6 +190,9 @@ static void skeleton_inverse_for_ik( struct skeleton *skele, m3x3_transpose( inverse, inverse ); } +/* + * Creates inverse rotation matrices which the IK system uses. + */ static void skeleton_create_inverses( struct skeleton *skele ) { /* IK: inverse 'plane-bone space' axis '(^axis,^bone,...)[base] */ @@ -193,9 +212,11 @@ static void skeleton_create_inverses( struct skeleton *skele ) } } +/* + * Apply a model matrix to all bones, should be done last + */ static void skeleton_apply_transform( struct skeleton *skele, m4x3f transform ) { - /* bone space inverse matrix */ for( int i=0; ibone_count; i++ ) { struct skeleton_bone *sb = &skele->bones[i]; @@ -203,6 +224,10 @@ static void skeleton_apply_transform( struct skeleton *skele, m4x3f transform ) } } +/* + * Apply an inverse matrix to all bones which maps vertices from bind space into + * bone relative positions + */ static void skeleton_apply_inverses( struct skeleton *skele ) { for( int i=0; ibone_count; i++ ) @@ -295,6 +320,23 @@ static void skeleton_apply_ik_pass( struct skeleton *skele ) } } +/* + * Applies the typical operations that you want for an IK rig: + * Pose, IK, Pose(deferred), Inverses, Transform + */ +static void skeleton_apply_standard( struct skeleton *skele, mdl_keyframe *pose, + m4x3f transform ) +{ + skeleton_apply_pose( skele, pose, k_anim_apply_defer_ik ); + skeleton_apply_ik_pass( skele ); + skeleton_apply_pose( skele, pose, k_anim_apply_deffered_only ); + skeleton_apply_inverses( skele ); + skeleton_apply_transform( skele, transform ); +} + +/* + * Get an animation by name + */ static struct skeleton_anim *skeleton_get_anim( struct skeleton *skele, const char *name ) { @@ -360,6 +402,7 @@ static int skeleton_setup( struct skeleton *skele, mdl_header *mdl ) v3_copy( pnode->co, sb->co ); v3_copy( pnode->s, sb->end ); sb->parent = pnode->parent-skeleton_root; + strncpy( sb->name, mdl_pstr(mdl,pnode->pstr_name), 15 ); if( is_ik ) {