Vector3 player_angles;
Vector3 map_center;
-float forward_speed = 0.015f;
+float forward_speed = 0.015f;
float forward_speed_decay = 0.05f;
-float rotate_speed = 0.8f;
-float rotate_speed_decay = 0.10f;
+float rotate_speed = 0.8f;
+float rotate_speed_decay = 0.10f;
Vector3 vec3_unit = {1.0f, 1.0f, 1.0f};
Vector3 vec3_010 = {0.0f, 1.0f, 0.0f};
-Vector3 vec3_up = {0.0f, 1.0f, 0.0f};
+Vector3 vec3_up = {0.0f, 1.0f, 0.0f};
Vector3 vec3_down = {0.0f, -1.0f, 0.0f};
Color orb_color = BLUE;
+Color orb_target_color = BLUE;
Vector4 orb_normal_color;
float orb_intensity = 1.0f; /* TODO: normalized distance from center, but lighting shader already has this. */
Vector3 orb_directionality = {1.0f, 1.0f, 1.0f};
renderfunc renderfuncs[MAX_RENDERFUNCS];
controlfunc controlfuncs[MAX_RENDERFUNCS];
+Color ColorLerp(Color c1, Color c2, float amount)
+{
+ Color new_color;
+
+ new_color.r = Lerp(c1.r, c2.r, amount);
+ new_color.g = Lerp(c1.g, c2.g, amount);
+ new_color.b = Lerp(c1.b, c2.b, amount);
+ new_color.a = Lerp(c1.a, c2.a, amount);
+
+ return new_color;
+}
+
/* Render the regular game mode.
NOTE: Only call inside a Raylib BeginDrawing() block!
*/
DrawText(TextFormat("tgt x %f\ntgt y %f\ntgt z %f", cam.target.x, cam.target.y, cam.target.z), 0, 128+64, 16, GREEN);
DrawText(TextFormat("rot x %f\nrot y %f\nrot z %f", player_angles.x, player_angles.y, player_angles.z), 0, 128+(64*2), 16, GREEN);
DrawText(TextFormat("ray hit %d\nlength %f", player_collision.hit, player_collision.distance), 0, 128+(64*3), 16, GREEN);
+ DrawText(TextFormat("vel x %f\nvel y %f\nvel z %f", player_velocity.x, player_velocity.y, player_velocity.z), 0, 128+(64*4), 16, GREEN);
}
}
void control_game_mode()
{
+ const float frame_time = GetFrameTime();
+
Vector3 new_player_velocity = player_velocity;
Vector3 new_player_rotation = player_rotation;
{
if (IsKeyDown(KEY_W) || IsKeyDown(KEY_K))
{
- new_player_velocity.x = forward_speed;
+ new_player_velocity.x = forward_speed * frame_time;
}
else if (IsKeyDown(KEY_S) || IsKeyDown(KEY_J))
{
- new_player_velocity.x = -forward_speed;
+ new_player_velocity.x = -forward_speed * frame_time;
}
if (IsKeyDown(KEY_A) || IsKeyDown(KEY_H))
{
- new_player_rotation.x = -rotate_speed;
+ new_player_rotation.x = -rotate_speed * frame_time;
}
else if (IsKeyDown(KEY_D) || IsKeyDown(KEY_L))
{
- new_player_rotation.x = rotate_speed;
+ new_player_rotation.x = rotate_speed * frame_time;
}
if (IsKeyDown(KEY_T))
cam.target.y -= DEG2RAD * 20.0;
}
+ map_visible = 0;
if (IsKeyDown(KEY_M))
{
map_visible = 1;
}
- else
- {
- map_visible = 0;
- }
if (IsKeyReleased(KEY_ONE))
- orb_color = RED;
+ orb_target_color = RED;
if (IsKeyReleased(KEY_TWO))
- orb_color = BLUE;
+ orb_target_color = BLUE;
if (IsKeyReleased(KEY_THREE))
- orb_color = GREEN;
+ orb_target_color = GREEN;
+
+ orb_color = ColorLerp(orb_color, orb_target_color, frame_time * 2);
/* Collision test */
/* Cast straight up */
cam.fovy = 90.0f;
cam.projection = CAMERA_PERSPECTIVE;
+ /*
+ I know these are good at 60 fps. Per-second speed to move to FPS/independent movement.
+ */
+ forward_speed *= 60;
+ forward_speed_decay *= 60;
+ rotate_speed *= 60;
+ rotate_speed_decay *= 60;
+
DisableCursor();
SetWindowState(FLAG_VSYNC_HINT | FLAG_WINDOW_RESIZABLE);
}
renderfuncs[func_idx]();
EndDrawing();
+ const float frame_time = GetFrameTime();
/* Decay forward velocity and rotation */
- player_velocity.x = Lerp(player_velocity.x, 0.0f, forward_speed_decay);
- player_rotation.x = Lerp(player_rotation.x, 0.0f, rotate_speed_decay);
+ player_velocity.x = Lerp(player_velocity.x, 0.0f, forward_speed_decay * frame_time);
+ player_rotation.x = Lerp(player_rotation.x, 0.0f, rotate_speed_decay * frame_time);
}
should_quit = 1;