month-based background color
This commit is contained in:
parent
984b70a39d
commit
7b73c7c18e
1 changed files with 83 additions and 7 deletions
90
src/main.zig
90
src/main.zig
|
@ -11,6 +11,8 @@ pub fn main() !void {
|
||||||
raylib.SetWindowMaxSize(1920, 1080);
|
raylib.SetWindowMaxSize(1920, 1080);
|
||||||
scales = Scales.init();
|
scales = Scales.init();
|
||||||
|
|
||||||
|
datetime = DateTime{ .secs = @intCast(std.time.timestamp()) };
|
||||||
|
|
||||||
global_font = raylib.LoadFontEx("font/SCE-PS3-RD-R-LATIN.TTF", 32, 0, 250);
|
global_font = raylib.LoadFontEx("font/SCE-PS3-RD-R-LATIN.TTF", 32, 0, 250);
|
||||||
raylib.SetTextureFilter(global_font.texture, raylib.TEXTURE_FILTER_BILINEAR);
|
raylib.SetTextureFilter(global_font.texture, raylib.TEXTURE_FILTER_BILINEAR);
|
||||||
|
|
||||||
|
@ -59,7 +61,9 @@ pub fn main() !void {
|
||||||
if (raylib.IsKeyPressed('D')) debug_draw = !debug_draw;
|
if (raylib.IsKeyPressed('D')) debug_draw = !debug_draw;
|
||||||
if (raylib.IsKeyPressed('S')) raylib.TakeScreenshot("screenshot.png");
|
if (raylib.IsKeyPressed('S')) raylib.TakeScreenshot("screenshot.png");
|
||||||
|
|
||||||
column.updatePositions();
|
datetime.update();
|
||||||
|
background.update();
|
||||||
|
column.update();
|
||||||
|
|
||||||
raylib.BeginDrawing();
|
raylib.BeginDrawing();
|
||||||
defer raylib.EndDrawing();
|
defer raylib.EndDrawing();
|
||||||
|
@ -91,6 +95,8 @@ var screen_height: f32 = 272;
|
||||||
|
|
||||||
var scales: Scales = undefined;
|
var scales: Scales = undefined;
|
||||||
|
|
||||||
|
var datetime: DateTime = undefined;
|
||||||
|
|
||||||
/// Cached scaling and positioning values for dynamic window resizing.
|
/// Cached scaling and positioning values for dynamic window resizing.
|
||||||
pub const Scales = struct {
|
pub const Scales = struct {
|
||||||
font_size_curve: Curve,
|
font_size_curve: Curve,
|
||||||
|
@ -246,7 +252,7 @@ pub const Column = struct {
|
||||||
self.refresh(false);
|
self.refresh(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn updatePositions(self: *Column) void {
|
fn update(self: *Column) void {
|
||||||
const up = raylib.IsKeyPressed(raylib.KEY_UP) or raylib.IsKeyPressedRepeat(raylib.KEY_UP);
|
const up = raylib.IsKeyPressed(raylib.KEY_UP) or raylib.IsKeyPressedRepeat(raylib.KEY_UP);
|
||||||
const down = raylib.IsKeyPressed(raylib.KEY_DOWN) or raylib.IsKeyPressedRepeat(raylib.KEY_DOWN);
|
const down = raylib.IsKeyPressed(raylib.KEY_DOWN) or raylib.IsKeyPressedRepeat(raylib.KEY_DOWN);
|
||||||
if (up and self.selected > 0) self.selected -= 1;
|
if (up and self.selected > 0) self.selected -= 1;
|
||||||
|
@ -375,8 +381,36 @@ pub fn Tweener(comptime T: type, comptime default: T) type {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Optimized datetime that only pulls from the system clock every few seconds.
|
||||||
|
pub const DateTime = struct {
|
||||||
|
refresh_timer: f32 = 0.0,
|
||||||
|
secs: u64,
|
||||||
|
|
||||||
|
pub fn update(self: *DateTime) void {
|
||||||
|
self.refresh_timer += raylib.GetFrameTime();
|
||||||
|
if (self.refresh_timer >= 5) {
|
||||||
|
self.refresh_timer = 0;
|
||||||
|
self.secs = @intCast(std.time.timestamp());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getEpochSeconds(self: DateTime) std.time.epoch.EpochSeconds {
|
||||||
|
const secs = self.secs + @as(u64, @intFromFloat(self.refresh_timer));
|
||||||
|
return .{ .secs = secs };
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getDaySeconds(self: DateTime) std.time.epoch.DaySeconds {
|
||||||
|
return self.getEpochSeconds().getDaySeconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getEpochDay(self: DateTime) std.time.epoch.EpochDay {
|
||||||
|
return self.getEpochSeconds().getEpochDay();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/// Draws the dynamic gradient background.
|
/// Draws the dynamic gradient background.
|
||||||
// TODO shift based on time of day
|
// TODO subdivided plane gradient
|
||||||
|
// TODO smoothly transition between gradients over a couple seconds
|
||||||
// TODO image wallpaper
|
// TODO image wallpaper
|
||||||
// TODO slideshow wallpaper
|
// TODO slideshow wallpaper
|
||||||
// TODO animated image wallpaper
|
// TODO animated image wallpaper
|
||||||
|
@ -388,10 +422,31 @@ pub const Background = struct {
|
||||||
|
|
||||||
pub fn init() Background {
|
pub fn init() Background {
|
||||||
var self: Background = undefined;
|
var self: Background = undefined;
|
||||||
self.setColors(NIGHT_08);
|
self.update();
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn update(self: *Background) void {
|
||||||
|
const epoch_day = datetime.getEpochDay();
|
||||||
|
const year_day = epoch_day.calculateYearDay();
|
||||||
|
const month_day = year_day.calculateMonthDay();
|
||||||
|
|
||||||
|
const day_seconds = datetime.getDaySeconds();
|
||||||
|
const t = @sin(raylib.Remap(
|
||||||
|
@floatFromInt(day_seconds.secs),
|
||||||
|
0,
|
||||||
|
std.time.s_per_day / 2,
|
||||||
|
0,
|
||||||
|
std.math.pi,
|
||||||
|
));
|
||||||
|
|
||||||
|
self.setColors(switch (month_day.month) {
|
||||||
|
.jun => lerpColors(DAY_06, NIGHT_06, t),
|
||||||
|
.aug => lerpColors(DAY_08, NIGHT_08, t),
|
||||||
|
else => @panic("month background colors not implemented"),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
pub fn setColors(self: *Background, colors: [4]Color) void {
|
pub fn setColors(self: *Background, colors: [4]Color) void {
|
||||||
self.top_left = colors[0];
|
self.top_left = colors[0];
|
||||||
self.bottom_right = colors[1];
|
self.bottom_right = colors[1];
|
||||||
|
@ -421,14 +476,28 @@ pub const Background = struct {
|
||||||
|
|
||||||
fn toRaylib(self: Color) raylib.Color {
|
fn toRaylib(self: Color) raylib.Color {
|
||||||
return .{
|
return .{
|
||||||
.r = @intFromFloat(self.r * 255.0),
|
.r = @intFromFloat(std.math.clamp(self.r, 0.0, 1.0) * 255.0),
|
||||||
.g = @intFromFloat(self.g * 255.0),
|
.g = @intFromFloat(std.math.clamp(self.g, 0.0, 1.0) * 255.0),
|
||||||
.b = @intFromFloat(self.b * 255.0),
|
.b = @intFromFloat(std.math.clamp(self.b, 0.0, 1.0) * 255.0),
|
||||||
.a = 255,
|
.a = 255,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn lerp(self: Color, other: Color, t: f32) Color {
|
||||||
|
return .{
|
||||||
|
.r = std.math.lerp(self.r, other.r, t),
|
||||||
|
.g = std.math.lerp(self.g, other.g, t),
|
||||||
|
.b = std.math.lerp(self.b, other.b, t),
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fn lerpColors(a: [4]Color, b: [4]Color, t: f32) [4]Color {
|
||||||
|
var colors = a;
|
||||||
|
for (&colors, a, b) |*color, aa, bb| color.* = aa.lerp(bb, t);
|
||||||
|
return colors;
|
||||||
|
}
|
||||||
|
|
||||||
pub const DAY_06 = [4]Color{
|
pub const DAY_06 = [4]Color{
|
||||||
.{ .r = 0.408, .g = 0.333, .b = 0.643 },
|
.{ .r = 0.408, .g = 0.333, .b = 0.643 },
|
||||||
.{ .r = 0.518, .g = 0.365, .b = 0.855 },
|
.{ .r = 0.518, .g = 0.365, .b = 0.855 },
|
||||||
|
@ -436,6 +505,13 @@ pub const Background = struct {
|
||||||
.{ .r = 0.569, .g = 0.325, .b = 0.620 },
|
.{ .r = 0.569, .g = 0.325, .b = 0.620 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const NIGHT_06 = [4]Color{
|
||||||
|
.{ .r = 0.039, .g = 0.031, .b = 0.035 },
|
||||||
|
.{ .r = 0.031, .g = 0.039, .b = 0.035 },
|
||||||
|
.{ .r = 0.824, .g = 0.647, .b = 0.878 },
|
||||||
|
.{ .r = 0.784, .g = 0.608, .b = 0.831 },
|
||||||
|
};
|
||||||
|
|
||||||
pub const DAY_08 = [4]Color{
|
pub const DAY_08 = [4]Color{
|
||||||
.{ .r = 0.243, .g = 0.608, .b = 0.831 },
|
.{ .r = 0.243, .g = 0.608, .b = 0.831 },
|
||||||
.{ .r = 0.039, .g = 0.690, .b = 0.878 },
|
.{ .r = 0.039, .g = 0.690, .b = 0.878 },
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue