X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=character.h;h=df05295611492ecb41cbafafd266bf9623830c50;hb=d045af680c6b8ca267a7aded69e2e510e659d2ab;hp=f86830a7838964f79726733e03e29a2eefa64aed;hpb=1f1d636056450dcd23cce55c0795ec6276272531;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/character.h b/character.h index f86830a..df05295 100644 --- a/character.h +++ b/character.h @@ -1,16 +1,27 @@ #ifndef CHARACTER_H #define CHARACTER_H -/* TODO: -> Common.h */ -#define VG_3D -#include "vg/vg.h" - +#include "common.h" #include "model.h" #include "scene.h" +#include "world.h" #include "ik.h" #include "rigidbody.h" +#include "render.h" #include "shaders/character.h" +vg_tex2d tex_pallet = { .path = "textures/ch_gradient.qoi" }; + +static void character_register(void) +{ + shader_character_register(); +} + +static void character_init(void) +{ + vg_tex2d_init( (vg_tex2d *[]){ &tex_pallet }, 1 ); +} + #define FOREACH_PART(FN) \ FN( foot_l ) \ FN( foot_r ) \ @@ -39,6 +50,7 @@ #define ADD_ONE(_) +1 #define PART_COUNT FOREACH_PART(ADD_ONE) + enum character_part { FOREACH_PART( MAKE_ENUM ) @@ -53,7 +65,8 @@ struct character { glmesh mesh; - submodel parts[ PART_COUNT ]; + mdl_submesh parts[ PART_COUNT ]; + v3f origins[ PART_COUNT ]; m4x3f matrices[ PART_COUNT ]; /* Auxillary information */ @@ -86,7 +99,7 @@ struct character static void character_offset( struct character *ch, enum character_part parent, enum character_part child ) { - v3_sub( ch->parts[ child ].pivot, ch->parts[ parent ].pivot, + v3_sub( ch->origins[ child ], ch->origins[ parent ], ch->offsets[ child ] ); } @@ -95,35 +108,44 @@ static int character_load( struct character *ch, const char *name ) char buf[64]; snprintf( buf, sizeof(buf)-1, "models/%s.mdl", name ); - model *src = vg_asset_read( buf ); + mdl_header *src = mdl_load( buf ); if( !src ) - { - vg_error( "Could not open 'models/%s.mdl'", name ); return 0; - } int error_count = 0; for( int i=0; iparts[i], 0, sizeof(mdl_submesh) ); + v3_zero( ch->origins[i] ); + + if( !pnode ) { vg_warn( "Character file does not contain an '_%s' part.\n", character_part_strings[i] ); error_count ++; - - memset( &ch->parts[i], 0, sizeof(submodel) ); + continue; + } + + mdl_submesh *sm = mdl_node_submesh( src, pnode, 0 ); + + if( !sm ) + { + vg_warn( "Character file's '_%s' part has no mesh.\n", + character_part_strings[i] ); + error_count ++; continue; } ch->parts[i] = *sm; + v3_copy( pnode->co, ch->origins[i] ); } - model_unpack( src, &ch->mesh ); + mdl_unpack_glmesh( src, &ch->mesh ); if( !error_count ) vg_success( "Loaded character file '%s' with no errors\n", name ); @@ -249,11 +271,16 @@ static void character_eval( struct character *ch ) m4x3_mulv( mats[k_chpart_body1], offs[k_chpart_neck], mats[k_chpart_neck][3] ); +#if 1 v4f qhead; q_axis_angle( qhead, (v3f){ 0.0f,1.0f,0.0f }, ch->rhead ); q_m3x3( qhead, mats[k_chpart_head] ); - //m3x3_mul( mats[k_chpart_neck], mats[k_chpart_head], mats[k_chpart_head] ); m4x3_mulv( mats[k_chpart_neck], offs[k_chpart_head], mats[k_chpart_head][3]); + m3x3_mul( mats[k_chpart_neck], mats[k_chpart_head], mats[k_chpart_head] ); +#else + m4x3_mulv( mats[k_chpart_neck], offs[k_chpart_head], mats[k_chpart_head][3]); + m3x3_copy( mats[k_chpart_neck], mats[k_chpart_head] ); +#endif /* Feet */ m3x3_copy( mats[k_chpart_leg_l1], mats[k_chpart_foot_l] ); @@ -358,6 +385,22 @@ static character_pose pose_stand = .cam = {-0.3477f, 1.5884f, -0.0019f} }; +static character_pose pose_stand_reverse = +{ + .b0 = {0.1624f, 1.0688f, -0.0632f}, + .b1 = {0.0499f, 1.5564f, -0.0013f}, + .p = {0.5423f, 1.2810f, -0.2368f}, + .fr = {0.0535f, 0.1312f, -0.3647f}, + .fl = {0.0354f, 0.1464f, 0.2917f}, + .pl = {-0.4325f, 0.6889f, 0.4591f}, + .pr = {-0.4794f, 0.7598f, -0.0842f}, + .hl = {0.0498f, 1.0058f, 0.2317f}, + .hr = {0.0188f, 0.9786f, -0.2725f}, + .apl = {0.2898f, 1.3453f, 0.0695f}, + .apr = {0.4715f, 1.2876f, -0.4982f}, + .cam = {-0.3477f, 1.5884f, -0.0730f} +}; + static character_pose pose_fly = { .b0 = {0.2995f, 0.6819f, -0.1369f}, @@ -391,18 +434,49 @@ void character_pose_blend( struct character *ch, character_pose *pose, float q ) v3_muladds( ch->cam_pos, pose->cam, q, ch->cam_pos ); } +#if 1 static void character_final_pose( struct character *ch, v3f cog, character_pose *pose, float q ) { character_pose npose; - float dip = vg_clampf(cog[1], -1.0f, 0.3f) * 0.35f, + float dip = vg_clampf(cog[1], -1.0f, 0.3f) * 0.5f, tilt = vg_clampf(cog[2], -1.0f, 1.0f) * 0.3f; v4f rz; m4x3f tr; - q_axis_angle( rz, (v3f){0.0f,0.0f,1.0f}, -cog[0]*0.6f ); + q_axis_angle( rz, (v3f){0.0f,0.0f,1.0f}, -cog[0]*0.3f ); q_m3x3( rz, tr ); - v3_copy( (v3f){0.0f,dip,tilt}, tr[3] ); + m3x3_identity( tr ); + //v3_copy( (v3f){0.0f,dip,tilt}, tr[3] ); + v3_copy( cog, tr[3] ); + + v3_muladd( pose->b0, tr[3], (v3f){0.85f,1.0f,1.0f}, npose.b0 ); + //m4x3_mulv( tr, pose->b0, npose.b0 ); + m4x3_mulv( tr, pose->b1, npose.b1 ); + m4x3_mulv( tr, pose->p, npose.p ); + m4x3_mulv( tr, pose->pl, npose.pl ); + m4x3_mulv( tr, pose->pr, npose.pr ); + m4x3_mulv( tr, pose->hl, npose.hl ); + m4x3_mulv( tr, pose->hr, npose.hr ); + m4x3_mulv( tr, pose->apl, npose.apl ); + m4x3_mulv( tr, pose->apr, npose.apr ); + + v3_copy( pose->fr, npose.fr ); + v3_copy( pose->fl, npose.fl ); + v3_copy( pose->cam, npose.cam ); + + character_pose_blend( ch, &npose, q ); +} +#else +static +void character_final_pose( struct character *ch, v4f rot, + character_pose *pose, float q ) +{ + character_pose npose; + + m4x3f tr; + q_m3x3( rot, tr ); + v3_zero( tr[3] ); m4x3_mulv( tr, pose->b0, npose.b0 ); m4x3_mulv( tr, pose->b1, npose.b1 ); @@ -420,6 +494,19 @@ void character_final_pose( struct character *ch, v3f cog, character_pose_blend( ch, &npose, q ); } +#endif + +static void character_yaw_upper( struct character *ch, float yaw ) +{ + m3x3f r; + v4f q; + + q_axis_angle( q, (v3f){0.0f,1.0f,0.0f}, yaw ); + q_m3x3( q, r ); + + m3x3_mulv( r, ch->ik_body.pole, ch->ik_body.pole ); + m3x3_mulv( r, ch->ik_body.end, ch->ik_body.end ); +} static void zero_ik_basic( struct ik_basic *ik ) { @@ -446,7 +533,7 @@ static void character_testpose( struct character *ch, float t ) *pole = ch->ik_body.pole; hips[0] = cosf(t*1.325f)*0.25f; - hips[1] = (sinf(t)*0.2f+0.6f) * ch->parts[ k_chpart_body0 ].pivot[1]; + hips[1] = (sinf(t)*0.2f+0.6f) * ch->origins[ k_chpart_body0 ][1]; hips[2] = 0.0f; collar[0] = hips[0]; @@ -500,13 +587,16 @@ static void character_testpose( struct character *ch, float t ) m4x3_identity( ch->matrices[k_chpart_wf] ); } -static void character_draw( struct character *ch, float temp ) +static void character_draw( struct character *ch, float temp, m4x3f camera ) { shader_character_use(); - shader_character_uPv( vg_pv ); + + vg_tex2d_bind( &tex_pallet, 0 ); shader_character_uTexMain( 0 ); shader_character_uOpacity( temp ); + shader_character_uCamera( camera[3] ); + shader_link_standard_ub( _shader_character.id, 2 ); glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); @@ -515,8 +605,13 @@ static void character_draw( struct character *ch, float temp ) for( int i=4; imatrices[i] ); - submodel_draw( &ch->parts[i] ); + mdl_draw_submesh( &ch->parts[i] ); } for( int i=0; i<2; i++ ) @@ -524,24 +619,18 @@ static void character_draw( struct character *ch, float temp ) if( ch->shoes[i] ) { shader_character_uMdl( ch->matrices[i] ); - submodel_draw( &ch->parts[i] ); + mdl_draw_submesh( &ch->parts[i] ); } else { shader_character_uMdl( ch->matrices[i+2] ); - submodel_draw( &ch->parts[i] ); + mdl_draw_submesh( &ch->parts[i] ); shader_character_uMdl( ch->matrices[i] ); - submodel_draw( &ch->parts[i+2] ); + mdl_draw_submesh( &ch->parts[i+2] ); } } } -static void character_register(void) -{ - shader_character_register(); -} - - /* * Ragdoll Stuff */ @@ -630,14 +719,14 @@ static void character_init_ragdoll_joints( struct character *ch ) { struct rd_joint *joint = &rd_joints[i]; - float *hinge = ch->parts[joint->ib].pivot; + float *hinge = ch->origins[joint->ib]; v3_sub( hinge, ch->ragdoll[joint->ia].co, joint->lca ); v3_sub( hinge, ch->ragdoll[joint->ib].co, joint->lcb ); } for( int i=0; iparts[i].pivot; + float *pivot = ch->origins[i]; v3_sub( ch->ragdoll[i].co, pivot, ch->ragdoll[i].delta ); } } @@ -654,27 +743,27 @@ static void character_init_ragdoll( struct character *ch ) v3f chest_dims = { chest_depth, chest_height, chest_width }; character_rd_box( ch, k_chpart_body1, chest_dims ); - v3_copy( ch->parts[k_chpart_body1].pivot, rbs[k_chpart_body1].co ); + v3_copy( ch->origins[k_chpart_body1], rbs[k_chpart_body1].co ); rbs[k_chpart_body1].co[1] += chest_height*0.5f; /* Torso */ v3f torso_dims = { chest_depth, offs[k_chpart_body1][1]-offs[k_chpart_leg_l0][1], chest_width*0.85f }; - v3_copy( ch->parts[k_chpart_body0].pivot, rbs[k_chpart_body0].co ); + v3_copy( ch->origins[k_chpart_body0], rbs[k_chpart_body0].co ); character_rd_box( ch, k_chpart_body0, torso_dims ); /* Neck */ v3f neck_dims = { chest_depth*0.5f, offs[k_chpart_head][1], chest_depth*0.5f }; - v3_copy( ch->parts[k_chpart_neck].pivot, rbs[k_chpart_neck].co ); + v3_copy( ch->origins[k_chpart_neck], rbs[k_chpart_neck].co ); rbs[k_chpart_neck].co[1] += neck_dims[1]*0.5f; character_rd_box( ch, k_chpart_neck, neck_dims ); /* Head */ v3f head_dims = { chest_width*0.5f, chest_width*0.5f, chest_width*0.5f }; - v3_copy( ch->parts[k_chpart_head].pivot, rbs[k_chpart_head].co ); + v3_copy( ch->origins[k_chpart_head], rbs[k_chpart_head].co ); rbs[k_chpart_head].co[1] += head_dims[1]*0.5f; character_rd_box( ch, k_chpart_head, head_dims ); @@ -692,18 +781,18 @@ static void character_init_ragdoll( struct character *ch ) character_rd_box( ch, k_chpart_hand_l, hand_dims ); character_rd_box( ch, k_chpart_hand_r, hand_dims ); - v3_copy( ch->parts[k_chpart_arm_l0].pivot, rbs[k_chpart_arm_l0].co ); + v3_copy( ch->origins[k_chpart_arm_l0], rbs[k_chpart_arm_l0].co ); rbs[k_chpart_arm_l0].co[2] += ua_dims[2] * 0.5f; - v3_copy( ch->parts[k_chpart_arm_l1].pivot, rbs[k_chpart_arm_l1].co ); + v3_copy( ch->origins[k_chpart_arm_l1], rbs[k_chpart_arm_l1].co ); rbs[k_chpart_arm_l1].co[2] += la_dims[2] * 0.5f; - v3_copy( ch->parts[k_chpart_hand_l].pivot, rbs[k_chpart_hand_l].co ); + v3_copy( ch->origins[k_chpart_hand_l], rbs[k_chpart_hand_l].co ); rbs[k_chpart_hand_l].co[2] += hand_dims[2] * 0.5f; - v3_copy( ch->parts[k_chpart_arm_r0].pivot, rbs[k_chpart_arm_r0].co ); + v3_copy( ch->origins[k_chpart_arm_r0], rbs[k_chpart_arm_r0].co ); rbs[k_chpart_arm_r0].co[2] -= ua_dims[2] * 0.5f; - v3_copy( ch->parts[k_chpart_arm_r1].pivot, rbs[k_chpart_arm_r1].co ); + v3_copy( ch->origins[k_chpart_arm_r1], rbs[k_chpart_arm_r1].co ); rbs[k_chpart_arm_r1].co[2] -= la_dims[2] * 0.5f; - v3_copy( ch->parts[k_chpart_hand_r].pivot, rbs[k_chpart_hand_r].co ); + v3_copy( ch->origins[k_chpart_hand_r], rbs[k_chpart_hand_r].co ); rbs[k_chpart_hand_r].co[2] -= hand_dims[2] * 0.5f; /* LEgs */ @@ -720,19 +809,19 @@ static void character_init_ragdoll( struct character *ch ) character_rd_box( ch, k_chpart_foot_l, foot_dims ); character_rd_box( ch, k_chpart_foot_r, foot_dims ); - v3_copy( ch->parts[k_chpart_leg_l0].pivot, rbs[k_chpart_leg_l0].co ); + v3_copy( ch->origins[k_chpart_leg_l0], rbs[k_chpart_leg_l0].co ); rbs[k_chpart_leg_l0].co[1] -= ul_dims[1] * 0.5f; - v3_copy( ch->parts[k_chpart_leg_l1].pivot, rbs[k_chpart_leg_l1].co ); + v3_copy( ch->origins[k_chpart_leg_l1], rbs[k_chpart_leg_l1].co ); rbs[k_chpart_leg_l1].co[1] -= ll_dims[1] * 0.5f; - v3_copy( ch->parts[k_chpart_foot_l].pivot, rbs[k_chpart_foot_l].co ); + v3_copy( ch->origins[k_chpart_foot_l], rbs[k_chpart_foot_l].co ); rbs[k_chpart_foot_l].co[1] -= foot_dims[1] * 0.5f; rbs[k_chpart_foot_l].co[0] -= foot_dims[0] * 0.5f; - v3_copy( ch->parts[k_chpart_leg_r0].pivot, rbs[k_chpart_leg_r0].co ); + v3_copy( ch->origins[k_chpart_leg_r0], rbs[k_chpart_leg_r0].co ); rbs[k_chpart_leg_r0].co[1] -= ul_dims[1] * 0.5f; - v3_copy( ch->parts[k_chpart_leg_r1].pivot, rbs[k_chpart_leg_r1].co ); + v3_copy( ch->origins[k_chpart_leg_r1], rbs[k_chpart_leg_r1].co ); rbs[k_chpart_leg_r1].co[1] -= ll_dims[1] * 0.5f; - v3_copy( ch->parts[k_chpart_foot_r].pivot, rbs[k_chpart_foot_r].co ); + v3_copy( ch->origins[k_chpart_foot_r], rbs[k_chpart_foot_r].co ); rbs[k_chpart_foot_r].co[1] -= foot_dims[1] * 0.5f; rbs[k_chpart_foot_r].co[0] -= foot_dims[0] * 0.5f; @@ -766,8 +855,7 @@ static void character_ragdoll_copypose( struct character *ch, v3f v ) m4x3_mulv( ch->matrices[i], rb->delta, rb->co ); m3x3_q( ch->matrices[i], rb->q ); v3_copy( v, rb->v ); - v3_zero( rb->I ); - rb->manifold_count = 0; /* ? */ + v3_zero( rb->w ); rb_update_transform( rb ); } @@ -823,27 +911,31 @@ static void character_debug_ragdoll( struct character *ch ) rb_debug( &ch->ragdoll[k_chpart_foot_r], 0xff00a5ff ); } -static void character_ragdoll_iter( struct character *ch, scene *sc ) +static void character_ragdoll_iter( struct character *ch ) { + rb_solver_reset(); + for( int i=0; iragdoll[i], sc ); + rb_collide( &ch->ragdoll[i], &world.rb_geo ); } + rb_presolve_contacts( rb_contact_buffer, rb_contact_count ); + v3f rv; - float shoe_vel[2]; + float shoe_vel[2] = {0.0f,0.0f}; for( int i=0; i<2; i++ ) if( ch->shoes[i] ) shoe_vel[i] = v3_length( ch->ragdoll[i].v ); - - for( int i=0; i<20; i++ ) + + /* This used to be 20 iterations */ + for( int i=0; i<10; i++ ) { float const k_springfactor = 1.0f/20.0f; - - for( int j=0; jragdoll[j] ); - + + rb_solve_contacts( rb_contact_buffer, rb_contact_count ); + for( int j=0; jco, dst->co ); v3_copy( src->v, dst->v ); v3_copy( src->q, dst->q ); - v3_copy( src->I, dst->I ); + v3_copy( src->w, dst->w ); } } }