From b4f7fb4171d46461b8b43dcb9ac3f4445d2dfde6 Mon Sep 17 00:00:00 2001 From: Stefan Stefanov Date: Fri, 2 Jan 2026 19:03:06 +0200 Subject: [PATCH] Reorganize globals and introduce an `Atlas` struct --- src/frontend/globals.odin | 37 ++++++++++++++++------------- src/frontend/main.odin | 50 ++++++++++++++++++++------------------- 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/src/frontend/globals.odin b/src/frontend/globals.odin index 4f54a6b..c3c3a94 100644 --- a/src/frontend/globals.odin +++ b/src/frontend/globals.odin @@ -5,27 +5,29 @@ import rl "vendor:raylib" PIXEL_WINDOW_HEIGHT :: 180 -scaling: f32 = 2 +ui_scaling: f32 = 2 @(rodata) ATLAS_RENDER_SIZES := []i32{256, 512, 1024, 2048, 4096} +FileDialogType :: enum { + SourceFiles, + OutputFolder, +} + WindowInformation :: struct { w: f32, h: f32, width_scaled: f32, height_scaled: f32, } +window_info: WindowInformation MonitorInformation :: struct { max_width: f32, max_height: f32, } - -FileDialogType :: enum { - SourceFiles, - OutputFolder, -} +monitor_info: MonitorInformation PackerSettings :: struct { atlas_size_x: i32, @@ -36,17 +38,18 @@ PackerSettings :: struct { output_json: bool, output_odin: bool, } +packer_settings: PackerSettings -window_info: WindowInformation -monitor_info: MonitorInformation // Where the output files will be written (atlas.png json output, etc) -output_folder_path: Maybe(string) +output_folder_path: Maybe(string) // If a folder was chosen as input - the path -source_files_to_pack: Maybe([]string) -// Packer settings -packer_settings: PackerSettings -atlas_render_texture_target: rl.RenderTexture2D -atlas_checked_background: rl.RenderTexture2D -atlas_render_has_preview: bool -atlas_render_size: i32 -atlas_metadata: Maybe([dynamic]generator.SpriteAtlasMetadata) +source_files_to_pack: Maybe([]string) + +Atlas :: struct { + render_texture_target: rl.RenderTexture2D, + checked_background: rl.RenderTexture2D, + render_has_preview: bool, + render_size: i32, + metadata: Maybe([dynamic]generator.SpriteAtlasMetadata), +} +atlas: Atlas diff --git a/src/frontend/main.odin b/src/frontend/main.odin index 4efe66c..fc0d84d 100644 --- a/src/frontend/main.odin +++ b/src/frontend/main.odin @@ -50,7 +50,7 @@ main :: proc() { } init :: proc() { - atlas_render_size = ATLAS_RENDER_SIZES[0] + atlas.render_size = ATLAS_RENDER_SIZES[0] rl.SetConfigFlags({.WINDOW_RESIZABLE}) rl.InitWindow(1400, 800, "YAAP - Yet Another Atlas Packer") @@ -68,11 +68,11 @@ update :: proc() { win_info := &window_info win_info.w = f32(rl.GetScreenWidth()) win_info.h = f32(rl.GetScreenHeight()) - win_info.height_scaled = win_info.h / scaling - win_info.width_scaled = win_info.w / scaling + win_info.height_scaled = win_info.h / ui_scaling + win_info.width_scaled = win_info.w / ui_scaling // Update the virtual mouse position (needed for GUI interaction to work properly for instance) - mouse_scale := 1 / scaling + mouse_scale := 1 / ui_scaling rl.SetMouseScale(mouse_scale, mouse_scale) } @@ -92,7 +92,7 @@ draw :: proc() { } ui_camera :: proc() -> rl.Camera2D { - return {zoom = scaling} + return {zoom = ui_scaling} } draw_screen_ui :: proc() { @@ -104,7 +104,7 @@ draw_screen_ui :: proc() { } save_atlas_to_file :: proc() { - generator.save_output(output_folder_path, atlas_metadata, atlas_render_texture_target) + generator.save_output(output_folder_path, atlas.metadata, atlas.render_texture_target) } save_to_atlas_to_file :: proc() { @@ -113,9 +113,7 @@ save_to_atlas_to_file :: proc() { } pack_atlas_and_render :: proc() { - atlas_render_target := &atlas_render_texture_target - - rl.BeginTextureMode(atlas_render_target^) + rl.BeginTextureMode(atlas.render_texture_target) defer rl.EndTextureMode() atlas_entries: [dynamic]generator.AtlasEntry @@ -129,22 +127,26 @@ pack_atlas_and_render :: proc() { return } - atlas: rl.Image = rl.GenImageColor(atlas_render_size, atlas_render_size, rl.BLANK) - // defer rl.UnloadImage(atlas) + atlas_img: rl.Image = rl.GenImageColor(atlas.render_size, atlas.render_size, rl.BLANK) padding_x := packer_settings.pixel_padding_x_int if packer_settings.padding_enabled else 0 padding_y := packer_settings.pixel_padding_y_int if packer_settings.padding_enabled else 0 - atlas_metadata = generator.pack_atlas_entries(atlas_entries[:], &atlas, padding_x, padding_y) + atlas.metadata = generator.pack_atlas_entries( + atlas_entries[:], + &atlas_img, + padding_x, + padding_y, + ) // OpenGL's Y buffer is flipped - rl.ImageFlipVertical(&atlas) + rl.ImageFlipVertical(&atlas_img) // rl.UnloadTexture(atlas_render_target.texture) log.info("Packed everything!") - atlas_render_target.texture = rl.LoadTextureFromImage(atlas) + atlas.render_texture_target.texture = rl.LoadTextureFromImage(atlas_img) should_pack_atlas_and_render = false - atlas_render_has_preview = true + atlas.render_has_preview = true } draw_settings_and_preview :: proc() { @@ -165,8 +167,8 @@ draw_settings_and_preview :: proc() { @(static) spinner_edit_mode: bool - small_offset := 10 * scaling - big_offset := 30 * scaling + small_offset := 10 * ui_scaling + big_offset := 30 * ui_scaling elements_height: f32 = 0 rl.GuiPanel(left_half_rect, "Atlas Settings") @@ -174,7 +176,7 @@ draw_settings_and_preview :: proc() { @(static) settings_dropdown_box_active_idx: i32 - elements_height += small_offset + 5 * scaling + elements_height += small_offset + 5 * ui_scaling rl.GuiLabel( {x = small_offset, y = elements_height, width = left_half_rect.width}, @@ -202,7 +204,7 @@ draw_settings_and_preview :: proc() { dropdown_resolution_edit_mode, ) { dropdown_resolution_edit_mode = !dropdown_resolution_edit_mode - atlas_render_size = + atlas.render_size = ATLAS_RENDER_SIZES[max(i32(len(ATLAS_RENDER_SIZES) - 1), dropdown_resolution_mode)] } rl.GuiUnlock() @@ -411,11 +413,11 @@ draw_settings_and_preview :: proc() { width = short_edge, height = short_edge, } - if !atlas_render_has_preview { + if !atlas.render_has_preview { rl.GuiDummyRec(preview_rect, "PREVIEW") } else { // rl.DrawRectangleRec(preview_rect, rl.WHITE) - bg_texture := atlas_checked_background.texture + bg_texture := atlas.checked_background.texture rl.DrawTexturePro( bg_texture, {width = auto_cast bg_texture.width, height = auto_cast bg_texture.height}, @@ -424,7 +426,7 @@ draw_settings_and_preview :: proc() { 0, rl.WHITE, ) - atlas_texture := atlas_render_texture_target.texture + atlas_texture := atlas.render_texture_target.texture rl.DrawTexturePro( atlas_texture, {width = auto_cast atlas_texture.width, height = auto_cast -atlas_texture.height}, @@ -466,10 +468,10 @@ open_file_dialog :: proc(dialog_type: FileDialogType) { } clear_atlas_data :: proc() { - if metadata, ok := atlas_metadata.([dynamic]generator.SpriteAtlasMetadata); ok { + if metadata, ok := atlas.metadata.([dynamic]generator.SpriteAtlasMetadata); ok { delete(metadata) } - atlas_render_has_preview = false + atlas.render_has_preview = false } logger: log.Logger rl_log_buf: []byte