#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 "ik.h"
#include "rigidbody.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 ) \
#define ADD_ONE(_) +1
#define PART_COUNT FOREACH_PART(ADD_ONE)
+
enum character_part
{
FOREACH_PART( MAKE_ENUM )
.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},
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;
character_pose_blend( ch, &npose, q );
}
+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 )
{
v3_zero( ik->base );
static void character_draw( struct character *ch, float temp )
{
shader_character_use();
-
shader_character_uPv( vg_pv );
+
+ vg_tex2d_bind( &tex_pallet, 0 );
shader_character_uTexMain( 0 );
shader_character_uOpacity( temp );
}
}
-static void character_register(void)
-{
- shader_character_register();
-}
-
-
/*
* Ragdoll Stuff
*/
static void character_ragdoll_iter( struct character *ch )
{
for( int i=0; i<PART_COUNT; i++ )
- rb_build_manifold( &ch->ragdoll[i] );
+ {
+ rb_manifold_reset( &ch->ragdoll[i] );
+ rb_build_manifold_terrain( &ch->ragdoll[i] );
+
+ u32 colliders[16];
+ int len = bh_select( &world.bhcubes, ch->ragdoll[i].bbx_world,
+ colliders, 16 );
+
+ for( int j=0; j<len; j++ )
+ rb_build_manifold_rb_static( &ch->ragdoll[i],
+ &world.temp_rbs[colliders[j]] );
+ }
v3f rv;