87 lines
2.1 KiB
Odin
87 lines
2.1 KiB
Odin
package clock
|
|
|
|
import rl "vendor:raylib"
|
|
import "core:time"
|
|
import "core:time/datetime"
|
|
import "core:time/timezone"
|
|
import "core:os"
|
|
import "core:math"
|
|
|
|
TimePeriod :: enum {
|
|
AM,
|
|
PM
|
|
}
|
|
|
|
DistanceAngle :: proc(distance: f32, angle: f32) -> (vector: rl.Vector2) {
|
|
vector.x = math.sin_f32(angle)
|
|
vector.y = -math.cos_f32(angle)
|
|
vector *= distance
|
|
|
|
return
|
|
}
|
|
|
|
main :: proc() {
|
|
tz, ok := timezone.region_load("local")
|
|
|
|
rl.SetConfigFlags({.MSAA_4X_HINT})
|
|
rl.InitWindow(640, 480, "Rosetta Code - draw a clock")
|
|
|
|
screen_center := rl.Vector2 {f32(rl.GetScreenWidth()) / 2, f32(rl.GetScreenHeight()) / 2}
|
|
|
|
for !rl.WindowShouldClose() {
|
|
rl.BeginDrawing()
|
|
|
|
rl.ClearBackground(rl.RAYWHITE)
|
|
|
|
conversion_succeeded: bool = true
|
|
date_time: datetime.DateTime
|
|
date_time, ok = time.time_to_datetime(time.now())
|
|
if !ok do conversion_succeeded = false
|
|
|
|
date_time, ok = timezone.datetime_to_tz(date_time, tz)
|
|
if !ok do conversion_succeeded = false
|
|
|
|
regular_time: time.Time
|
|
regular_time, ok = time.datetime_to_time(date_time)
|
|
if !ok do conversion_succeeded = false
|
|
|
|
if !conversion_succeeded do os.exit(1)
|
|
|
|
period: TimePeriod
|
|
hour, min, sec := time.clock_from_time(regular_time)
|
|
if hour > 12 {
|
|
hour -= 12
|
|
period = .PM
|
|
}
|
|
|
|
radius := f32(rl.GetScreenHeight()) / 2.5
|
|
|
|
rl.DrawCircleV(screen_center, radius, rl.LIGHTGRAY)
|
|
|
|
rl.DrawLineEx(screen_center, screen_center + DistanceAngle(radius * .75, (f32(hour) / 12) * math.TAU), 4, rl.BLACK)
|
|
rl.DrawLineEx(screen_center, screen_center + DistanceAngle(radius * .7, (f32(min) / 60) * math.TAU), 4, rl.DARKGREEN)
|
|
rl.DrawLineEx(screen_center, screen_center + DistanceAngle(radius * .5, (f32(sec) / 60) * math.TAU), 4, rl.RED)
|
|
|
|
for i := 0; i < 60; i += 1 {
|
|
angle := (f32(i) / 60) * math.TAU
|
|
|
|
inside_distance: f32 = .8
|
|
thickness: f32 = 1.5
|
|
|
|
if i % 5 == 0 {
|
|
inside_distance = .775
|
|
thickness = 3
|
|
}
|
|
|
|
rl.DrawLineEx(screen_center + DistanceAngle(radius * inside_distance, angle), screen_center + DistanceAngle(radius * .95, angle), thickness, rl.DARKGRAY)
|
|
}
|
|
|
|
//fmt.printfln("%2d:%2d:%2d %s", hour, min, sec, period)
|
|
|
|
rl.EndDrawing()
|
|
}
|
|
|
|
rl.CloseWindow()
|
|
|
|
timezone.region_destroy(tz)
|
|
}
|