diff --git a/game/tools/texturepacker.c b/game/tools/texturepacker.c index 9750cfe..bc18c36 100644 --- a/game/tools/texturepacker.c +++ b/game/tools/texturepacker.c @@ -6,6 +6,8 @@ #define STB_IMAGE_IMPLEMENTATION #define STBI_FAILURE_USERMSG #include "stb_image.h" +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.h" struct image { char* filename; @@ -63,31 +65,18 @@ int main(int argc, char* argv[]) { int max = totalh > maxw ? totalh : maxw; int exp = (int)log2(max) + 1; int size = (int)pow(2, exp); - unsigned char* buf = calloc(size*size, sizeof(char)); - (void)buf; + unsigned char* buf = calloc(size*size*4, sizeof(char)); //------------------------------------- - // Now load each texture one by one, write to the new image buffer, and free, before - // loading the next one + // Now load the data into memory, for now, let's just load all images in one go, + // however, it would be more optimized if we loaded each image sequentially or + // better yet in parallel so that we can write to the different parts of the + // texture atlas concurrently //------------------------------------- - for (int i = 0; i < argc - 1; i++) { - images[i].filename = argv[i+1]; - // int width, height, channels; - // images[i].image_data = (unsigned char*)stbi_load(images[i].filename, - // &width, - // &height, - // &channels, - // 4); - - // images[i].width = (short)width; - // images[i].height = (short)height; - // images[i].channels = (char)channels; - images[i].image_data = (unsigned char*)stbi_load(images[i].filename, - &images[i].width, - &images[i].height, - &images[i].channels, - 4); + for (int i = 0; i < image_count; i++) { + int w,h,c; + images[i].image_data = (unsigned char*)stbi_load(images[i].filename, &w, &h, &c, 4); if (images[i].image_data == NULL) { char *errorMsg = "Could not load data for image '%s': %s"; fprintf(stderr, errorMsg, images[i].filename, stbi_failure_reason()); @@ -95,18 +84,40 @@ int main(int argc, char* argv[]) { exit(-1); } } - // unsigned char* image_bytes = images[0].image_data; - // int b = 0; - // while (image_bytes) { - // if (image_bytes[b]) { - // printf("R:%u G:%u B:%u A:%u\n", image_bytes[b], image_bytes[b+1], image_bytes[b+2], image_bytes[b+3]); - // } - // b += 4; - // image_bytes += 4; - // } + + //------------------------------------- + // Just write the bytes directly for now, we don't have any "rect" data, which + // we need to make this work, since we're "hardcoding" the positions of the textures + //------------------------------------- + + int atlasrow = 0; + for (int i = 0; i < image_count; i++) { + int width = images[i].width; + int length = images[i].width * images[i].height * images[i].channels; + int color_row = 0; + int color_col = 0; + int c = 0; + while (c < length) { + int bidx = atlasrow * maxw * 4 + color_row; + int iidx = color_col * width * 4 + color_row; + buf[bidx] = images[i].image_data[iidx]; + color_row++; + if (color_row > width * 4) { + color_row = 0; + color_col += 1; + atlasrow += 1; + } + c++; + } + } + + stbi_write_png("test.png", maxw, totalh, 4, buf, maxw * 4); + + //------------------------------------- + // Free them all, but eventually we would free after we finished 1 + //------------------------------------- for (int i = 0; i < image_count; i++) { stbi_image_free(images[i].image_data); } - // for (int i = ) return 0; }