--- /dev/null
+#ifndef PLAYER_DEVICE_DEAD_H
+#define PLAYER_DEVICE_DEAD_H
+
+#include "player_interface.h"
+#include "skeleton.h"
+#include "player_model.h"
+
+struct player_device_dead
+{
+};
+
+VG_STATIC void player_dead_pre_update( player_interface *player,
+ player_attachment *at )
+{
+}
+
+VG_STATIC void player_dead_update( player_interface *player,
+ player_attachment *at )
+{
+ player_ragdoll_iter( &player->ragdoll );
+}
+
+VG_STATIC void player_dead_post_update( player_interface *player,
+ player_attachment *at )
+{
+ copy_ragdoll_pose_to_avatar( &player->ragdoll, player->playeravatar );
+}
+
+VG_STATIC void player_dead_ui( player_interface *player,
+ player_attachment *at )
+{
+}
+
+VG_STATIC void player_dead_bind( player_interface *player,
+ player_attachment *at )
+{
+ copy_avatar_pose_to_ragdoll( player->playeravatar, &player->ragdoll,
+ player->rb.v );
+}
+
+VG_STATIC void player_dead_pose( player_interface *player,
+ player_attachment *at,
+ player_pose pose, m4x3f transform )
+{
+}
+
+/* FIXME: player_device_common */
+VG_STATIC void player_skate_get_camera( player_interface *player,
+ player_attachment *at, camera *cam );
+VG_STATIC void skate_camera_vector_look( camera *cam, v3f v, float C, float k );
+
+VG_STATIC void player_dead_get_camera( player_interface *player,
+ player_attachment *at, camera *cam )
+{
+ struct player_avatar *av = player->playeravatar;
+
+ v3f vp = {-0.1f,1.8f,0.0f},
+ vd = {-1.0f,0.0f,0.0f};
+
+ m4x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vp, cam->pos );
+ m3x3_mulv( av->sk.final_mtx[ av->id_head-1 ], vd, vd );
+
+ v3_zero( cam->angles );
+ cam->fov = 119.0f;
+
+ skate_camera_vector_look( cam, vd, 1.0f, 0.0f );
+}
+
+VG_STATIC void player_dead_transport( player_interface *player,
+ player_attachment *at,
+ teleport_gate *gate )
+{
+}
+
+VG_STATIC player_device player_device_dead =
+{
+ .pre_update = player_dead_pre_update,
+ .update = player_dead_update,
+ .post_update = player_dead_post_update,
+ .get_camera = player_dead_get_camera,
+ .debug_ui = player_dead_ui,
+ .bind = player_dead_bind,
+#if 0
+ .pose = player_dead_pose,
+#endif
+ .gate_transport= player_dead_transport
+};
+#endif /* PLAYER_DEVICE_DEAD_H */
/* this is a little yucky but needs to be done so we can use this 'prediction'
* in the pose function. its unfortunate. too bad
+ *
+ * FIXME: Can do better with FREEDOM MODE + api ordering.
*/
VG_STATIC void skate_camera_thirdperson_nextpos( player_interface *player,
struct player_device_skate *s,
player->playermesh = mesh;
}
+/* FIXME: Seperate concepts for binding and equip.
+ */
VG_STATIC void player_use_device( player_interface *player, player_device *dev,
void *storage )
{
player_pose pose;
m4x3f transform;
- player->dev.device->pose( player, &player->dev, pose, transform );
+ /* FIXME: Give devices more control over these render stages, and have
+ * 'API calls'
+ * for this kindof crap instead of it dictating order... */
+
+ if( player->dev.device->pose )
+ {
+ player->dev.device->pose( player, &player->dev, pose, transform );
- struct skeleton *sk = &player->playeravatar->sk;
+ struct skeleton *sk = &player->playeravatar->sk;
- skeleton_apply_pose( sk, pose, k_anim_apply_defer_ik );
- skeleton_apply_ik_pass( sk );
- skeleton_apply_pose( sk, pose, k_anim_apply_deffered_only );
- skeleton_apply_inverses( sk );
- skeleton_apply_transform( sk, transform );
- skeleton_debug( sk );
+ skeleton_apply_pose( sk, pose, k_anim_apply_defer_ik );
+ skeleton_apply_ik_pass( sk );
+ skeleton_apply_pose( sk, pose, k_anim_apply_deffered_only );
+ skeleton_apply_inverses( sk );
+ skeleton_apply_transform( sk, transform );
+ skeleton_debug( sk );
+ }
player->dev.device->get_camera( player, &player->dev, &player->cam );
/* TODO: if dead copy ragdoll.. . */
player->dev.device->reset( player, &player->dev, rp );
}
+VG_STATIC void player_kill( player_interface *player )
+{
+
+}
+
/*
* Apply per render-frame mouse look from player to angles
*/
#include "player_interface.h"
#include "player_device_walk.h"
#include "player_device_skate.h"
+#include "player_device_dead.h"
#include "player_model.h"
/* temp */
VG_STATIC player_interface localplayer;
VG_STATIC struct player_device_walk localplayer_walk;
VG_STATIC struct player_device_skate localplayer_skate;
+VG_STATIC struct player_device_dead localplayer_dead;
VG_STATIC struct player_avatar localplayer_avatar;
VG_STATIC glmesh localplayer_meshes[3];
}
+VG_STATIC int __kill( int argc, const char *argv[] )
+{
+ player_use_device( &localplayer, &player_device_dead, &localplayer_dead );
+ return 0;
+}
+
VG_STATIC int __respawn( int argc, const char *argv[] )
{
struct respawn_point *rp = NULL, *r;
//.poll_suggest = reset_player_poll
});
+ vg_function_push( (struct vg_cmd) {
+ .name = "ded",
+ .function = __kill,
+ //.poll_suggest = reset_player_poll
+ });
+
vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" );
vg_info(" 2021-2022 |\\ /| | / | | | | /| \n" );
vg_info(" | \\ / | +-- / +----- +---' | / | \n" );
player_use_avatar( &localplayer, &localplayer_avatar );
player_use_mesh( &localplayer, &localplayer_meshes[0] );
player_use_device( &localplayer, &player_device_walk, &localplayer_walk );
- //player_use_device( &localplayer, &player_device_skate, &localplayer_skate );
+ player_use_device( &localplayer, &player_device_skate, &localplayer_skate );
/* --------------------- */