147 lines
3.3 KiB
C++
147 lines
3.3 KiB
C++
/**
|
|
* Copyright (c) 2022 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#include "dawnsharedlibs.hpp"
|
|
#include "../../util/file.hpp"
|
|
#include "../../util/image.hpp"
|
|
|
|
int main(int argc, char *argv[]) {
|
|
char *in;
|
|
char *out;
|
|
FILE *file;
|
|
char path[FILENAME_MAX + 1];
|
|
int w, h, channels, cols, rows;
|
|
stbi_uc *dataImageRaw;
|
|
int gapX, gapY, borderX, borderY;
|
|
|
|
if(argc < 5) {
|
|
printf("Invalid number of arguments");
|
|
return 1;
|
|
}
|
|
|
|
in = argv[1];
|
|
out = argv[2];
|
|
gapX = 0, gapY = 0, borderX = 0, borderY = 0;
|
|
|
|
cols = atoi(argv[3]);
|
|
if(cols <= 0) {
|
|
printf("Columns is invalid\n");
|
|
return 1;
|
|
}
|
|
|
|
rows = atoi(argv[4]);
|
|
if(rows <= 0) {
|
|
printf("Rows is invalid");
|
|
return 1;
|
|
}
|
|
|
|
if(argc >= 6) {
|
|
gapX = atoi(argv[5]);
|
|
if(gapX <= 0) {
|
|
printf("Gap X is invalid\n");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if(argc >= 7) {
|
|
gapY = atoi(argv[6]);
|
|
if(gapY <= 0) {
|
|
printf("Gap Y is invalid\n");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if(argc >= 8) {
|
|
borderX = atoi(argv[7]);
|
|
if(borderX <= 0) {
|
|
printf("Border X is invalid\n");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if(argc >= 9) {
|
|
borderY = atoi(argv[8]);
|
|
if(borderY <= 0) {
|
|
printf("Border Y is invalid\n");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
// Normalize slashes
|
|
fileNormalizeSlashes(in);
|
|
fileNormalizeSlashes(out);
|
|
|
|
// Check the output doesn't already exist
|
|
sprintf(path, "%s.tileset", out);
|
|
file = fopen(path, "rb");
|
|
if(file != NULL) {
|
|
fclose(file);
|
|
return 0;
|
|
}
|
|
|
|
// Read in the original texture
|
|
file = fopen(in, "rb");
|
|
if(file == NULL) {
|
|
printf("Failed to open file!\n");
|
|
return 1;
|
|
}
|
|
|
|
// Read image data
|
|
dataImageRaw = stbi_load_from_file(file, &w, &h, &channels, STBI_rgb_alpha);
|
|
if(dataImageRaw == NULL) {
|
|
printf("Failed to load input texture!\n");
|
|
return 1;
|
|
}
|
|
fclose(file);
|
|
free(dataImageRaw);
|
|
|
|
if(w <= 0 || h <= 0) {
|
|
printf("Reading image failed (corrupted?)\n");
|
|
return 1;
|
|
}
|
|
|
|
// Calculate division sizes (pixels)
|
|
int divX = (w - (borderX * 2) - (gapX * (cols - 1))) / cols;
|
|
int divY = (h - (borderY * 2) - (gapY * (rows - 1))) / rows;
|
|
|
|
// Calculate the division sizes (units)
|
|
float tdivX = (float)divX / (float)w;
|
|
float tdivY = (float)divY / (float)h;
|
|
|
|
// Output buffer prep
|
|
char *buffer = (char *)malloc(sizeof(char) * (cols * rows * 48 + 48 + 48));
|
|
buffer[0] = '\0';
|
|
|
|
sprintf(buffer, "%i|%i|%i|%i|", cols, rows, divX, divY);
|
|
|
|
// Now prep tileset.
|
|
for(float y = 0; y < rows; y++) {
|
|
for(float x = 0; x < cols; x++) {
|
|
float ux0 = ((float)borderX + ((float)divX * x) + ((float)gapX * x)) / (float)w;
|
|
float ux1 = ux0 + tdivX;
|
|
float uy0 = ((float)borderY + ((float)divY * y) + ((float)gapY * y)) / (float)h;
|
|
float uy1 = uy0 + tdivY;
|
|
sprintf(buffer, "%s%f,%f,%f,%f|", buffer, ux0, ux1, uy0, uy1);
|
|
}
|
|
}
|
|
|
|
// Open output file
|
|
fileMkdirp(path);
|
|
file = fopen(path, "wb");
|
|
if(file == NULL) {
|
|
free(buffer);
|
|
printf("Invalid tileset file out!\n");
|
|
return 1;
|
|
}
|
|
|
|
// Write and close
|
|
fwrite(buffer, sizeof(char), strlen(buffer), file);
|
|
fclose(file);
|
|
free(buffer);
|
|
|
|
return 0;
|
|
} |