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": { "group": {
"kind": "build", "kind": "build",
"isDefault": false "isDefault": true
}, },
}, },
{ {
@ -89,7 +89,7 @@
}, },
"group": { "group": {
"kind": "build", "kind": "build",
"isDefault": true "isDefault": false
}, },
} }
] ]

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

View file

@ -11,6 +11,7 @@
package game package game
import "core:math"
import "core:fmt" import "core:fmt"
import "core:strings" import "core:strings"
import rl "vendor:raylib" import rl "vendor:raylib"
@ -53,10 +54,10 @@ FileDialogType :: enum {
} }
PackerSettings :: struct { PackerSettings :: struct {
atlas_size_x: i32,
atlas_size_y: i32,
pixel_padding_x_int: i32, pixel_padding_x_int: i32,
pixel_padding_x: f32,
pixel_padding_y_int: i32, pixel_padding_y_int: i32,
pixel_padding_y: f32,
padding_enabled: bool, padding_enabled: bool,
fix_pixel_bleeding: bool, fix_pixel_bleeding: bool,
output_json: bool, output_json: bool,
@ -87,6 +88,8 @@ GameMemory :: struct {
packer_settings: PackerSettings, packer_settings: PackerSettings,
atlas_render_texture_target: rl.RenderTexture2D, atlas_render_texture_target: rl.RenderTexture2D,
atlas_render: bool, atlas_render: bool,
atlas_render_has_preview: bool,
atlas_render_size: i32,
} }
g_mem: ^GameMemory g_mem: ^GameMemory
@ -134,6 +137,8 @@ draw :: proc() {
if g_mem.atlas_render { if g_mem.atlas_render {
draw_screen_target() draw_screen_target()
} }
free_all(context.temp_allocator)
} }
update_screen :: proc() { update_screen :: proc() {
@ -180,10 +185,31 @@ draw_screen_target :: proc() {
rl.BeginTextureMode(g_mem.atlas_render_texture_target) rl.BeginTextureMode(g_mem.atlas_render_texture_target)
defer rl.EndTextureMode() defer rl.EndTextureMode()
rl.ClearBackground(rl.WHITE) atlas_entries: [dynamic]AtlasEntry
rl.DrawCircle(100, 100, 50, rl.GREEN) 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 = false
g_mem.atlas_render_has_preview = true
} }
draw_atlas_settings_and_preview :: proc() { 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(left_half_rect, rl.WHITE)
rl.DrawRectangleRec(right_half_rect, rl.MAROON) rl.DrawRectangleRec(right_half_rect, rl.MAROON)
@(static)
spinner_edit_mode: bool
small_offset := 10 * scaling small_offset := 10 * scaling
big_offset := 30 * scaling big_offset := 30 * scaling
elements_height: f32 = 0 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") rl.GuiLine({y = elements_height, width = left_half_rect.width}, "General Settings")
elements_height += small_offset elements_height += small_offset
rl.GuiCheckBox( @(static)
{x = small_offset, y = elements_height, width = small_offset, height = small_offset}, DropdownBox000EditMode: bool
"Fix pixel bleed", @(static)
&g_mem.packer_settings.padding_enabled, 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 elements_height += small_offset * 2
rl.GuiLine({y = elements_height, width = left_half_rect.width}, "Padding Settings") 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 elements_height += small_offset * 2
@(static)
spinner_edit_mode: bool
if (rl.GuiSpinner( if (rl.GuiSpinner(
{ {
x = small_offset, x = small_offset,
@ -333,7 +384,11 @@ draw_atlas_settings_and_preview :: proc() {
width = short_edge, width = short_edge,
height = 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 preview_rect.x += 10;preview_rect.y += 10;preview_rect.height -= 20;preview_rect.width -= 20
texture := &g_mem.atlas_render_texture_target.texture texture := &g_mem.atlas_render_texture_target.texture
rl.DrawTexturePro( rl.DrawTexturePro(