working metdata output for json & odin in the aseprite_odin_generator tool
This commit is contained in:
parent
67d7b3e227
commit
52364f28b9
4 changed files with 83 additions and 23 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -19,4 +19,6 @@ ols.json
|
||||||
libtinyfiledialogs.a
|
libtinyfiledialogs.a
|
||||||
libtinyfiledialogs.obj
|
libtinyfiledialogs.obj
|
||||||
tinyfiledialogs.lib
|
tinyfiledialogs.lib
|
||||||
tinyfiledialogs.obj
|
tinyfiledialogs.obj
|
||||||
|
|
||||||
|
.idea/
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,9 @@ main :: proc() {
|
||||||
|
|
||||||
json_bytes, jerr := json.marshal(metadata)
|
json_bytes, jerr := json.marshal(metadata)
|
||||||
os.write_entire_file("src/aseprite_odin_generator/metadata.json", json_bytes)
|
os.write_entire_file("src/aseprite_odin_generator/metadata.json", json_bytes)
|
||||||
|
sb := gen.generate_odin_enums_and_atlas_offsets_file_sb(metadata[:])
|
||||||
|
odin_output_str := s.to_string(sb)
|
||||||
|
os.write_entire_file("src/aseprite_odin_generator/output.odino", transmute([]byte)odin_output_str )
|
||||||
|
|
||||||
rl.ExportImage(atlas, EXPORT_PATH)
|
rl.ExportImage(atlas, EXPORT_PATH)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
[{"name":"Edinica","location":[95,10],"size":[58,57]},{"name":"Dvoika_0","location":[234,10],"size":[55,31]},{"name":"Troika","location":[10,10],"size":[75,75]},{"name":"Dvoika_1","location":[163,10],"size":[61,33]}]
|
[{"name":"Edinica","location":[95,10],"size":[58,57]},{"name":"Dvoika_0","location":[234,10],"size":[55,31]},{"name":"Dvoika_1","location":[163,10],"size":[61,33]},{"name":"Troika","location":[10,10],"size":[75,75]}]
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
package game
|
package game
|
||||||
|
|
||||||
import ase "./aseprite"
|
import ase "./aseprite"
|
||||||
import "core:encoding/json"
|
|
||||||
import "core:fmt"
|
import "core:fmt"
|
||||||
import "core:mem"
|
|
||||||
import "core:os"
|
import "core:os"
|
||||||
import fp "core:path/filepath"
|
import fp "core:path/filepath"
|
||||||
|
import "core:slice"
|
||||||
import "core:strings"
|
import "core:strings"
|
||||||
import rl "vendor:raylib"
|
import rl "vendor:raylib"
|
||||||
import stbrp "vendor:stb/rect_pack"
|
import stbrp "vendor:stb/rect_pack"
|
||||||
|
|
@ -25,13 +24,6 @@ AtlasEntry :: struct {
|
||||||
layer_cell_count: [dynamic]i32,
|
layer_cell_count: [dynamic]i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
SingleFrameSprite :: distinct rl.Rectangle
|
|
||||||
|
|
||||||
AnimatedSprite :: struct {
|
|
||||||
x, y: i32,
|
|
||||||
width, height: i32,
|
|
||||||
}
|
|
||||||
|
|
||||||
SpriteAtlasMetadata :: struct {
|
SpriteAtlasMetadata :: struct {
|
||||||
name: string,
|
name: string,
|
||||||
location: [2]i32,
|
location: [2]i32,
|
||||||
|
|
@ -89,6 +81,13 @@ unmarshall_aseprite_files :: proc(file_paths: []string, atlas_entries: ^[dynamic
|
||||||
atlas_entry_from_compressed_cells :: proc(document: ase.Document) -> (atlas_entry: AtlasEntry) {
|
atlas_entry_from_compressed_cells :: proc(document: ase.Document) -> (atlas_entry: AtlasEntry) {
|
||||||
atlas_entry.frames = auto_cast len(document.frames)
|
atlas_entry.frames = auto_cast len(document.frames)
|
||||||
fmt.println("N Frames: ", len(document.frames))
|
fmt.println("N Frames: ", len(document.frames))
|
||||||
|
// note(stefan): Since the expected input for the program is multiple files containing a single sprite
|
||||||
|
// it's probably a safe assumption most of the files will be a single layer with 1 or more frames
|
||||||
|
// which means we can first prod the file for information about how many frames are there and
|
||||||
|
// allocate a slice that is going to be [Frames X Layers]CellData.
|
||||||
|
// which would allow us to gain an already sorted list of sprites if we iterate all frames of a single layer
|
||||||
|
// instead of iterating all layers for each frame
|
||||||
|
// might be even quicker to first get that information an allocate at once the amount of cells we need
|
||||||
for frame, frameIdx in document.frames {
|
for frame, frameIdx in document.frames {
|
||||||
fmt.printfln("Frame_{0} Chunks: ", frameIdx, len(frame.chunks))
|
fmt.printfln("Frame_{0} Chunks: ", frameIdx, len(frame.chunks))
|
||||||
for chunk in frame.chunks {
|
for chunk in frame.chunks {
|
||||||
|
|
@ -109,14 +108,21 @@ atlas_entry_from_compressed_cells :: proc(document: ase.Document) -> (atlas_entr
|
||||||
opacity = cel_chunk.opacity_level,
|
opacity = cel_chunk.opacity_level,
|
||||||
layer_index = cel_chunk.layer_index,
|
layer_index = cel_chunk.layer_index,
|
||||||
}
|
}
|
||||||
|
|
||||||
append(&atlas_entry.cells, cell)
|
append(&atlas_entry.cells, cell)
|
||||||
}
|
}
|
||||||
|
|
||||||
if layer_chunk, ok := chunk.(ase.Layer_Chunk); ok {
|
if layer_chunk, ok := chunk.(ase.Layer_Chunk); ok {
|
||||||
fmt.println("Layer chunk: ", layer_chunk)
|
fmt.println("Layer chunk: ", layer_chunk)
|
||||||
append(&atlas_entry.layer_names, layer_chunk.name)
|
append(&atlas_entry.layer_names, layer_chunk.name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
slice.sort_by(atlas_entry.cells[:], proc(i, j: CellData) -> bool {
|
||||||
|
return i.layer_index < j.layer_index
|
||||||
|
})
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -210,17 +216,17 @@ pack_atlas_entries :: proc(
|
||||||
entry := entry_and_cell.entry
|
entry := entry_and_cell.entry
|
||||||
cell := entry_and_cell.cell_of_entry
|
cell := entry_and_cell.cell_of_entry
|
||||||
|
|
||||||
cell_name : string
|
cell_name: string
|
||||||
if entry.layer_cell_count[cell.layer_index] > 1 {
|
if entry.layer_cell_count[cell.layer_index] > 1 {
|
||||||
cell_name = fmt.aprintf(
|
cell_name = fmt.aprintf(
|
||||||
"{0}_%d",
|
"{0}_%d",
|
||||||
entry.layer_names[cell.layer_index],
|
entry.layer_names[cell.layer_index],
|
||||||
cell.frame_index,
|
cell.frame_index,
|
||||||
allocator,
|
allocator,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
cell_name = entry.layer_names[cell.layer_index]
|
cell_name = entry.layer_names[cell.layer_index]
|
||||||
}
|
}
|
||||||
cell_metadata := SpriteAtlasMetadata {
|
cell_metadata := SpriteAtlasMetadata {
|
||||||
name = cell_name,
|
name = cell_name,
|
||||||
location = {
|
location = {
|
||||||
|
|
@ -231,5 +237,55 @@ pack_atlas_entries :: proc(
|
||||||
}
|
}
|
||||||
append(&metadata, cell_metadata)
|
append(&metadata, cell_metadata)
|
||||||
}
|
}
|
||||||
|
|
||||||
return metadata
|
return metadata
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Generates a barebones file with the package name "atlas_bindings",
|
||||||
|
the file contains an array of offsets, indexed by an enum.
|
||||||
|
The enum has unique names
|
||||||
|
*/
|
||||||
|
generate_odin_enums_and_atlas_offsets_file_sb :: proc(
|
||||||
|
metadata: []SpriteAtlasMetadata,
|
||||||
|
alloc := context.allocator,
|
||||||
|
) -> strings.Builder {
|
||||||
|
sb := strings.builder_make(alloc)
|
||||||
|
strings.write_string(&sb, "package atlas_bindings\n\n")
|
||||||
|
|
||||||
|
// Introduce the Rect type
|
||||||
|
strings.write_string(&sb, "AtlasRect :: struct { x, y, w, h: i32 }\n\n")
|
||||||
|
// start enum
|
||||||
|
strings.write_string(&sb, "AtlasSprite :: enum {\n")
|
||||||
|
{
|
||||||
|
for cell in metadata {
|
||||||
|
strings.write_string(&sb, fmt.aprintf("\t%s,\n", cell.name))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// end enum
|
||||||
|
strings.write_string(&sb, "}\n\n")
|
||||||
|
|
||||||
|
// start offsets array
|
||||||
|
// todo(stefan): the name of the array can be based on the output name?
|
||||||
|
strings.write_string(&sb, "ATLAS_SPRITES := []AtlasRect {\n")
|
||||||
|
{
|
||||||
|
entry: string
|
||||||
|
for cell in metadata {
|
||||||
|
entry = fmt.aprintf(
|
||||||
|
"\t.%v = {{ x = %v, y = %v, w = %v, h = %v }},\n",
|
||||||
|
cell.name,
|
||||||
|
cell.location.x,
|
||||||
|
cell.location.y,
|
||||||
|
cell.size.x,
|
||||||
|
cell.size.y,
|
||||||
|
)
|
||||||
|
strings.write_string(&sb, entry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// end offsets array
|
||||||
|
strings.write_string(&sb, "}\n\n")
|
||||||
|
|
||||||
|
fmt.println("\n", strings.to_string(sb))
|
||||||
|
|
||||||
|
return sb
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue