main.odin ¶
1package raylib_example_log
2
3import "base:runtime"
4
5import "core:log"
6import "core:c"
7
8import rl "vendor:raylib"
9import stbsp "vendor:stb/sprintf"
10
11SCREEN_WIDTH :: 800
12SCREEN_HEIGHT :: 450
13
14g_ctx: runtime.Context
15
16main :: proc() {
17 context.logger = log.create_console_logger(.Debug)
18 g_ctx = context
19
20 rl.SetTraceLogLevel(.ALL)
21 rl.SetTraceLogCallback(proc "c" (rl_level: rl.TraceLogLevel, message: cstring, args: ^c.va_list) {
22 context = g_ctx
23
24 level: log.Level
25 switch rl_level {
26 case .TRACE, .DEBUG: level = .Debug
27 case .INFO: level = .Info
28 case .WARNING: level = .Warning
29 case .ERROR: level = .Error
30 case .FATAL: level = .Fatal
31 case .ALL, .NONE: fallthrough
32 case: log.panicf("unexpected log level %v", rl_level)
33 }
34
35 @static buf: [dynamic]byte
36 log_len: i32
37 for {
38 buf_len := i32(len(buf))
39 log_len = stbsp.vsnprintf(raw_data(buf), buf_len, message, args)
40 if log_len <= buf_len {
41 break
42 }
43
44 non_zero_resize(&buf, max(128, len(buf)*2))
45 }
46
47 context.logger.procedure(context.logger.data, level, string(buf[:log_len]), context.logger.options)
48 })
49
50 rl.InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "raylib log callback")
51 defer rl.CloseWindow()
52
53 for !rl.WindowShouldClose() {
54 rl.BeginDrawing()
55 rl.ClearBackground(rl.RAYWHITE)
56 rl.EndDrawing()
57 }
58}