stuff for demo
[carveJwlIkooP6JGAAIwe30JlM.git] / freecam.c
diff --git a/freecam.c b/freecam.c
new file mode 100644 (file)
index 0000000..2e79ff1
--- /dev/null
+++ b/freecam.c
@@ -0,0 +1,51 @@
+#include "skaterift.h"
+#include "input.h"
+
+static void freecam_preupdate(void){
+   camera *cam = &skaterift.replay_freecam;
+   v3f angles;
+   v3_copy( cam->angles, angles );
+   player_look( angles, 1.0f );
+
+   f32 decay = vg_maxf(0.0f,1.0f-vg.time_frame_delta*10.0f);
+
+   v3f d;
+   v3_sub( angles, cam->angles, d );
+   v3_muladds( skaterift.freecam_w, d, 20.0f, skaterift.freecam_w );
+   v3_muls( skaterift.freecam_w, decay, skaterift.freecam_w );
+   v3_muladds( cam->angles, skaterift.freecam_w, vg.time_frame_delta,
+               cam->angles );
+   cam->angles[1] = vg_clampf( cam->angles[1], -VG_PIf*0.5f,VG_PIf*0.5f);
+
+   camera_update_transform( cam );
+
+   v3f lookdir = { 0.0f, 0.0f, -1.0f },
+       sidedir = { 1.0f, 0.0f,  0.0f };
+   
+   m3x3_mulv( cam->transform, lookdir, lookdir );
+   m3x3_mulv( cam->transform, sidedir, sidedir );
+
+   v2f input;
+   joystick_state( k_srjoystick_steer, input );
+   v2_muls( input, vg.time_frame_delta*6.0f*20.0f, input );
+   
+   v3_muladds( skaterift.freecam_v, lookdir, -input[1], 
+               skaterift.freecam_v );
+   v3_muladds( skaterift.freecam_v, sidedir, input[0], 
+               skaterift.freecam_v );
+
+   v3_muls( skaterift.freecam_v, decay, skaterift.freecam_v );
+   v3_muladds( cam->pos,
+               skaterift.freecam_v, vg.time_frame_delta, cam->pos );
+}
+
+static int freecam_cmd( int argc, const char *argv[] ){
+   if( argc ){
+      skaterift.freecam = atoi(argv[0]);
+
+      if( skaterift.freecam ){
+         camera_copy( &skaterift.cam, &skaterift.replay_freecam );
+      }
+   }
+   return 0;
+}