542c7b2f3a4efad3457cacdc07ec6307ff6eff7c
10 #include "skeleton_animator.h"
11 #include "shaders/viewchar.h"
13 vg_tex2d tex_characters
= { .path
= "textures/ch_gradient.qoi" };
15 static void character_register(void)
17 shader_viewchar_register();
20 static void character_init(void)
22 vg_tex2d_init( (vg_tex2d
*[]){ &tex_characters
}, 1 );
29 struct skeleton_anim
*anim_stand
,
33 *anim_push
, *anim_push_reverse
,
57 static int character_load( struct character
*ch
, const char *name
)
61 snprintf( buf
, sizeof(buf
)-1, "models/%s.mdl", name
);
62 mdl_header
*src
= mdl_load( buf
);
67 mdl_unpack_glmesh( src
, &ch
->mesh
);
69 skeleton_setup( &ch
->sk
, src
);
70 ch
->anim_stand
= skeleton_get_anim( &ch
->sk
, "pose_stand" );
71 ch
->anim_highg
= skeleton_get_anim( &ch
->sk
, "pose_highg" );
72 ch
->anim_slide
= skeleton_get_anim( &ch
->sk
, "pose_slide" );
73 ch
->anim_air
= skeleton_get_anim( &ch
->sk
, "pose_air" );
74 ch
->anim_push
= skeleton_get_anim( &ch
->sk
, "push" );
75 ch
->anim_push_reverse
= skeleton_get_anim( &ch
->sk
, "push_reverse" );
76 ch
->anim_ollie
= skeleton_get_anim( &ch
->sk
, "ollie" );
78 ch
->id_hip
= skeleton_bone_id( &ch
->sk
, "hips" );
79 ch
->id_ik_hand_l
= skeleton_bone_id( &ch
->sk
, "hand.IK.L" );
80 ch
->id_ik_hand_r
= skeleton_bone_id( &ch
->sk
, "hand.IK.R" );
81 ch
->id_ik_elbow_l
= skeleton_bone_id( &ch
->sk
, "elbow.L" );
82 ch
->id_ik_elbow_r
= skeleton_bone_id( &ch
->sk
, "elbow.R" );
83 ch
->id_head
= skeleton_bone_id( &ch
->sk
, "head" );
87 if( ch
->sk
.collider_count
)
89 vg_info( "Alloc: %d\n", ch
->sk
.collider_count
);
90 ch
->ragdoll
= malloc(sizeof(struct ragdoll_part
) * ch
->sk
.collider_count
);
91 ch
->ragdoll_count
= 0;
93 for( u32 i
=0; i
<ch
->sk
.bone_count
; i
++ )
95 struct skeleton_bone
*bone
= &ch
->sk
.bones
[i
];
99 struct ragdoll_part
*rp
= &ch
->ragdoll
[ ch
->ragdoll_count
++ ];
103 v3_sub( bone
->hitbox
[1], bone
->hitbox
[0], delta
);
104 v3_muls( delta
, 0.5f
, delta
);
106 v3_add( bone
->hitbox
[0], delta
, rp
->offset
);
108 v3_copy( delta
, rp
->rb
.bbx
[1] );
109 v3_muls( delta
, -1.0f
, rp
->rb
.bbx
[0] );
111 q_identity( rp
->rb
.q
);
112 v3_add( bone
->co
, rp
->offset
, rp
->rb
.co
);
113 rp
->rb
.type
= k_rb_shape_box
;
125 static void character_eval( struct character
*ch
){}
126 static void character_draw( struct character
*ch
, float temp
, m4x3f camera
){}
127 static void character_init_ragdoll_joints( struct character
*ch
){}
128 static void character_init_ragdoll( struct character
*ch
){}
129 static void character_ragdoll_go( struct character
*ch
, v3f pos
){}
130 static void character_ragdoll_copypose( struct character
*ch
, v3f v
)
132 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
134 struct ragdoll_part
*part
= &ch
->ragdoll
[i
];
137 u32 bone
= part
->bone_id
;
139 m4x3_mulv( ch
->sk
.final_mtx
[bone
], ch
->sk
.bones
[bone
].co
, pos
);
140 m3x3_mulv( ch
->sk
.final_mtx
[bone
], part
->offset
, offset
);
141 v3_add( pos
, offset
, part
->rb
.co
);
142 m3x3_q( ch
->sk
.final_mtx
[bone
], part
->rb
.q
);
143 v3_copy( v
, part
->rb
.v
);
144 v3_zero( part
->rb
.w
);
146 rb_update_transform( &part
->rb
);
150 static void character_debug_ragdoll( struct character
*ch
)
152 for( u32 i
=0; i
<ch
->ragdoll_count
; i
++ )
153 rb_debug( &ch
->ragdoll
[i
].rb
, 0xff00ff00 );
156 static void character_ragdoll_iter( struct character
*ch
)
160 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
161 rb_collide( &ch
->ragdoll
[i
].rb
, &world
.rb_geo
);
163 rb_presolve_contacts( rb_contact_buffer
, rb_contact_count
);
167 float shoe_vel
[2] = {0.0f
,0.0f
};
168 for( int i
=0; i
<2; i
++ )
170 shoe_vel
[i
] = v3_length( ch
->ragdoll
[i
].rb
.v
);
173 for( int i
=0; i
<5; i
++ )
175 rb_solve_contacts( rb_contact_buffer
, rb_contact_count
);
179 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
180 rb_iter( &ch
->ragdoll
[i
].rb
);
184 for( int i
=0; i
<ch
->ragdoll_count
; i
++ )
185 rb_update_transform( &ch
->ragdoll
[i
].rb
);