working packing

This commit is contained in:
Stefan Stefanov 2024-04-21 22:08:03 +03:00
parent 973af01380
commit 04a472874d
3 changed files with 70 additions and 15 deletions

4
.vscode/tasks.json vendored
View file

@ -67,7 +67,7 @@
},
"group": {
"kind": "build",
"isDefault": false
"isDefault": true
},
},
{
@ -89,7 +89,7 @@
},
"group": {
"kind": "build",
"isDefault": true
"isDefault": false
},
}
]

@ -1 +1 @@
Subproject commit f21bed838a6d1e6bc1178ea0876596eb14190192
Subproject commit 628e655661d822fecae67cf238cbfa414912d943

View file

@ -11,6 +11,7 @@
package game
import "core:math"
import "core:fmt"
import "core:strings"
import rl "vendor:raylib"
@ -53,10 +54,10 @@ FileDialogType :: enum {
}
PackerSettings :: struct {
atlas_size_x: i32,
atlas_size_y: i32,
pixel_padding_x_int: i32,
pixel_padding_x: f32,
pixel_padding_y_int: i32,
pixel_padding_y: f32,
padding_enabled: bool,
fix_pixel_bleeding: bool,
output_json: bool,
@ -87,6 +88,8 @@ GameMemory :: struct {
packer_settings: PackerSettings,
atlas_render_texture_target: rl.RenderTexture2D,
atlas_render: bool,
atlas_render_has_preview: bool,
atlas_render_size: i32,
}
g_mem: ^GameMemory
@ -134,6 +137,8 @@ draw :: proc() {
if g_mem.atlas_render {
draw_screen_target()
}
free_all(context.temp_allocator)
}
update_screen :: proc() {
@ -180,10 +185,31 @@ draw_screen_target :: proc() {
rl.BeginTextureMode(g_mem.atlas_render_texture_target)
defer rl.EndTextureMode()
rl.ClearBackground(rl.WHITE)
rl.DrawCircle(100, 100, 50, rl.GREEN)
atlas_entries: [dynamic]AtlasEntry
if g_mem.input_path_set {
unmarshall_aseprite_dir(g_mem.output_folder_path, &atlas_entries)
} else if g_mem.input_files_set {
unmarshall_aseprite_files(g_mem.source_files_to_pack, &atlas_entries)
} else {
fmt.println("No source folder or files set! Can't pack the void!!!")
}
atlas: rl.Image = rl.GenImageColor(g_mem.atlas_render_size, g_mem.atlas_render_size, rl.BLANK)
pack_atlas_entries(
atlas_entries[:],
&atlas,
g_mem.packer_settings.pixel_padding_x_int,
g_mem.packer_settings.pixel_padding_y_int,
)
delete(atlas_entries)
rl.ImageFlipVertical(&atlas)
rl.UnloadTexture(g_mem.atlas_render_texture_target.texture)
g_mem.atlas_render_texture_target.texture = rl.LoadTextureFromImage(atlas)
rl.UnloadImage(atlas)
g_mem.atlas_render = false
g_mem.atlas_render_has_preview = true
}
draw_atlas_settings_and_preview :: proc() {
@ -202,6 +228,9 @@ draw_atlas_settings_and_preview :: proc() {
rl.DrawRectangleRec(left_half_rect, rl.WHITE)
rl.DrawRectangleRec(right_half_rect, rl.MAROON)
@(static)
spinner_edit_mode: bool
small_offset := 10 * scaling
big_offset := 30 * scaling
elements_height: f32 = 0
@ -212,11 +241,35 @@ draw_atlas_settings_and_preview :: proc() {
rl.GuiLine({y = elements_height, width = left_half_rect.width}, "General Settings")
elements_height += small_offset
rl.GuiCheckBox(
{x = small_offset, y = elements_height, width = small_offset, height = small_offset},
"Fix pixel bleed",
&g_mem.packer_settings.padding_enabled,
)
@(static)
DropdownBox000EditMode: bool
@(static)
DropdownBox000Active: i32
dropdown_rect := rl.Rectangle {
x = small_offset,
y = elements_height,
width = big_offset * 2,
height = small_offset,
}
// Because we want to render this ontop of everything else, we can just 'defer' it at the end of the draw function
defer {
if DropdownBox000EditMode {rl.GuiLock()}
if rl.GuiDropdownBox(
dropdown_rect,
"256x;512x;1024x;2048x;4096x",
&DropdownBox000Active,
DropdownBox000EditMode,
) {
DropdownBox000EditMode = !DropdownBox000EditMode
fmt.println(DropdownBox000Active)
g_mem.atlas_render_size = 256 * auto_cast math.pow(2, f32(DropdownBox000Active))
}
rl.GuiUnlock()
}
elements_height += small_offset * 2
rl.GuiLine({y = elements_height, width = left_half_rect.width}, "Padding Settings")
@ -229,8 +282,6 @@ draw_atlas_settings_and_preview :: proc() {
)
elements_height += small_offset * 2
@(static)
spinner_edit_mode: bool
if (rl.GuiSpinner(
{
x = small_offset,
@ -333,7 +384,11 @@ draw_atlas_settings_and_preview :: proc() {
width = short_edge,
height = short_edge,
}
rl.GuiDummyRec(preview_rect, "PREVIEW")
if !g_mem.atlas_render_has_preview {
rl.GuiDummyRec(preview_rect, "PREVIEW")
} else {
rl.DrawRectangleRec(preview_rect, rl.WHITE)
}
preview_rect.x += 10;preview_rect.y += 10;preview_rect.height -= 20;preview_rect.width -= 20
texture := &g_mem.atlas_render_texture_target.texture
rl.DrawTexturePro(