Added tileset loading.
This commit is contained in:
@ -7,6 +7,10 @@
|
|||||||
#include "Asset.hpp"
|
#include "Asset.hpp"
|
||||||
#include "util/array.hpp"
|
#include "util/array.hpp"
|
||||||
|
|
||||||
|
#include "assets/TextureAsset.hpp"
|
||||||
|
#include "assets/TilesetAsset.hpp"
|
||||||
|
#include "assets/TrueTypeAsset.hpp"
|
||||||
|
|
||||||
namespace Dawn {
|
namespace Dawn {
|
||||||
class AssetManager {
|
class AssetManager {
|
||||||
private:
|
private:
|
||||||
|
@ -7,5 +7,6 @@
|
|||||||
target_sources(${DAWN_TARGET_NAME}
|
target_sources(${DAWN_TARGET_NAME}
|
||||||
PRIVATE
|
PRIVATE
|
||||||
TextureAsset.cpp
|
TextureAsset.cpp
|
||||||
|
TilesetAsset.cpp
|
||||||
TrueTypeAsset.cpp
|
TrueTypeAsset.cpp
|
||||||
)
|
)
|
87
src/dawn/asset/assets/TilesetAsset.cpp
Normal file
87
src/dawn/asset/assets/TilesetAsset.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
// Copyright (c) 2022 Dominic Masters
|
||||||
|
//
|
||||||
|
// This software is released under the MIT License.
|
||||||
|
// https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
#include "TilesetAsset.hpp"
|
||||||
|
|
||||||
|
using namespace Dawn;
|
||||||
|
|
||||||
|
TilesetAsset::TilesetAsset(AssetManager *assMan, std::string name) :
|
||||||
|
Asset(assMan, name),
|
||||||
|
loader(name + ".tileset"),
|
||||||
|
tileset()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void TilesetAsset::updateSync() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TilesetAsset::updateAsync() {
|
||||||
|
uint8_t *buffer;
|
||||||
|
assertTrue(this->state == 0x00);
|
||||||
|
|
||||||
|
this->state = 0x01;
|
||||||
|
this->loader.loadRaw(&buffer);
|
||||||
|
this->state = 0x02;
|
||||||
|
|
||||||
|
char *strCurrent = (char *)buffer;
|
||||||
|
char *strNext, *strSubCurrent;
|
||||||
|
|
||||||
|
// Read cols and rows
|
||||||
|
strNext = strchr(strCurrent, '|');
|
||||||
|
*strNext = '\0';
|
||||||
|
this->tileset.columns = atoi(strCurrent);
|
||||||
|
this->state = 0x03;
|
||||||
|
assertTrue(this->tileset.columns > 0);
|
||||||
|
|
||||||
|
strCurrent = strNext+1;
|
||||||
|
strNext = strchr(strCurrent, '|');
|
||||||
|
*strNext = '\0';
|
||||||
|
this->tileset.rows = atoi(strCurrent);
|
||||||
|
this->state = 0x04;
|
||||||
|
assertTrue(this->tileset.rows > 0);
|
||||||
|
|
||||||
|
// Begin reading tiles.
|
||||||
|
int32_t done = 0;
|
||||||
|
int32_t count = this->tileset.columns * this->tileset.rows;
|
||||||
|
while(done < count) {
|
||||||
|
struct Tile tile;
|
||||||
|
|
||||||
|
strCurrent = strNext+1;
|
||||||
|
strNext = strchr(strCurrent, '|');
|
||||||
|
|
||||||
|
// Parse ux0
|
||||||
|
strSubCurrent = strchr(strCurrent, ',');
|
||||||
|
*strSubCurrent = '\0';
|
||||||
|
tile.uv0.x = atof(strCurrent);
|
||||||
|
|
||||||
|
// Parse ux1
|
||||||
|
strCurrent = strSubCurrent+1;
|
||||||
|
strSubCurrent = strchr(strCurrent, ',');
|
||||||
|
*strSubCurrent = '\0';
|
||||||
|
tile.uv1.x = atof(strCurrent);
|
||||||
|
|
||||||
|
// Parse uy0
|
||||||
|
strCurrent = strSubCurrent+1;
|
||||||
|
strSubCurrent = strchr(strCurrent, ',');
|
||||||
|
*strSubCurrent = '\0';
|
||||||
|
tile.uv0.y = atof(strCurrent);
|
||||||
|
|
||||||
|
// Parse uy1
|
||||||
|
strCurrent = strSubCurrent+1;
|
||||||
|
*strNext = '\0';
|
||||||
|
tile.uv1.y = atof(strCurrent);
|
||||||
|
|
||||||
|
// Next.
|
||||||
|
this->tileset.tiles.push_back(tile);
|
||||||
|
done++;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->state = 0x05;
|
||||||
|
this->loaded = true;
|
||||||
|
this->eventLoaded.invoke();
|
||||||
|
|
||||||
|
memoryFree(buffer);
|
||||||
|
}
|
25
src/dawn/asset/assets/TilesetAsset.hpp
Normal file
25
src/dawn/asset/assets/TilesetAsset.hpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Copyright (c) 2022 Dominic Masters
|
||||||
|
//
|
||||||
|
// This software is released under the MIT License.
|
||||||
|
// https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "../Asset.hpp"
|
||||||
|
#include "../AssetLoader.hpp"
|
||||||
|
#include "display/Tileset.hpp"
|
||||||
|
|
||||||
|
namespace Dawn {
|
||||||
|
class TilesetAsset : public Asset {
|
||||||
|
protected:
|
||||||
|
AssetLoader loader;
|
||||||
|
uint8_t state = 0x00;
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct TilesetGrid tileset;
|
||||||
|
|
||||||
|
TilesetAsset(AssetManager *assMan, std::string name);
|
||||||
|
|
||||||
|
void updateSync() override;
|
||||||
|
void updateAsync() override;
|
||||||
|
};
|
||||||
|
}
|
@ -22,6 +22,10 @@ namespace Dawn {
|
|||||||
public:
|
public:
|
||||||
int32_t rows;
|
int32_t rows;
|
||||||
int32_t columns;
|
int32_t columns;
|
||||||
|
|
||||||
|
TilesetGrid() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
TilesetGrid(
|
TilesetGrid(
|
||||||
int32_t columns,
|
int32_t columns,
|
||||||
|
@ -23,7 +23,8 @@ add_subdirectory(visualnovel)
|
|||||||
|
|
||||||
# Assets
|
# Assets
|
||||||
tool_texture(texture_test texture_test.png)
|
tool_texture(texture_test texture_test.png)
|
||||||
tool_texture(texture_penny characters/penny/penny-blink.png)
|
# tool_texture(texture_penny characters/penny/penny-blink.png)
|
||||||
|
tool_tileset(tileset_penny texture_penny characters/penny/penny-blink.png 1 22)
|
||||||
tool_truetype(truetype_ark
|
tool_truetype(truetype_ark
|
||||||
ark-pixel.ttf
|
ark-pixel.ttf
|
||||||
truetype_ark
|
truetype_ark
|
||||||
@ -34,6 +35,6 @@ tool_truetype(truetype_ark
|
|||||||
|
|
||||||
add_dependencies(${DAWN_TARGET_NAME}
|
add_dependencies(${DAWN_TARGET_NAME}
|
||||||
texture_test
|
texture_test
|
||||||
texture_penny
|
tileset_penny
|
||||||
truetype_ark
|
truetype_ark
|
||||||
)
|
)
|
@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "asset/AssetManager.hpp"
|
#include "asset/AssetManager.hpp"
|
||||||
#include "asset/Asset.hpp"
|
|
||||||
#include "poker/PokerPlayer.hpp"
|
#include "poker/PokerPlayer.hpp"
|
||||||
#include "scene/components/Components.hpp"
|
#include "scene/components/Components.hpp"
|
||||||
|
|
||||||
@ -14,7 +13,8 @@ namespace Dawn {
|
|||||||
public:
|
public:
|
||||||
static std::vector<Asset*> getAssets(AssetManager *assMan) {
|
static std::vector<Asset*> getAssets(AssetManager *assMan) {
|
||||||
return std::vector<Asset*>{
|
return std::vector<Asset*>{
|
||||||
assMan->get<TextureAsset>("texture_penny")
|
assMan->get<TextureAsset>("texture_penny"),
|
||||||
|
assMan->get<TilesetAsset>("tileset_penny")
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
# https://opensource.org/licenses/MIT
|
# https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
add_subdirectory(texturegen)
|
add_subdirectory(texturegen)
|
||||||
|
add_subdirectory(tilesetgen)
|
||||||
add_subdirectory(truetypegen)
|
add_subdirectory(truetypegen)
|
||||||
|
|
||||||
# Texture Tool
|
# Texture Tool
|
||||||
@ -15,6 +16,16 @@ function(tool_texture target in)
|
|||||||
)
|
)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
# Tileset Tool
|
||||||
|
function(tool_tileset targetTileset targetTexture in cols rows)
|
||||||
|
tool_texture(${targetTexture} ${in})
|
||||||
|
add_custom_target(${targetTileset}
|
||||||
|
COMMAND tilesetgen "${DAWN_ASSETS_SOURCE_DIR}/${in}" "${DAWN_ASSETS_BUILD_DIR}/${targetTileset}" "${cols}" "${rows}"
|
||||||
|
COMMENT "Generating tileset ${target} from ${in}"
|
||||||
|
DEPENDS tilesetgen ${targetTexture}
|
||||||
|
)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
# TrueType Tool
|
# TrueType Tool
|
||||||
function(tool_truetype target in out width height fontSize)
|
function(tool_truetype target in out width height fontSize)
|
||||||
add_custom_target(${target}
|
add_custom_target(${target}
|
||||||
|
24
src/dawntools/display/tilesetgen/CMakeLists.txt
Normal file
24
src/dawntools/display/tilesetgen/CMakeLists.txt
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Copyright (c) 2021 Dominic Msters
|
||||||
|
#
|
||||||
|
# This software is released under the MIT License.
|
||||||
|
# https://opensource.org/licenses/MIT
|
||||||
|
|
||||||
|
# Texture Build Tool
|
||||||
|
project(tilesetgen VERSION 1.0)
|
||||||
|
add_executable(tilesetgen)
|
||||||
|
target_sources(tilesetgen
|
||||||
|
PRIVATE
|
||||||
|
main.c
|
||||||
|
../../utils/file.c
|
||||||
|
../../utils/image.c
|
||||||
|
)
|
||||||
|
target_include_directories(tilesetgen
|
||||||
|
PUBLIC
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/../../
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}
|
||||||
|
)
|
||||||
|
target_link_libraries(tilesetgen
|
||||||
|
PUBLIC
|
||||||
|
${DAWN_BUILD_HOST_LIBS}
|
||||||
|
stb
|
||||||
|
)
|
153
src/dawntools/display/tilesetgen/main.c
Normal file
153
src/dawntools/display/tilesetgen/main.c
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2022 Dominic Masters
|
||||||
|
*
|
||||||
|
* This software is released under the MIT License.
|
||||||
|
* https://opensource.org/licenses/MIT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../../utils/common.h"
|
||||||
|
#include "../../utils/file.h"
|
||||||
|
#include "../../utils/image.h"
|
||||||
|
|
||||||
|
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)
|
||||||
|
float divX = (
|
||||||
|
(float)w - ((float)borderX * 2.0f) -
|
||||||
|
((float)gapX * ((float)cols - 1))
|
||||||
|
) / cols;
|
||||||
|
float divY = (
|
||||||
|
(float)h - ((float)borderY * 2.0f) -
|
||||||
|
((float)gapY * ((float)rows - 1))
|
||||||
|
) / rows;
|
||||||
|
|
||||||
|
// Calculate the division sizes (units)
|
||||||
|
float tdivX = divX / (float)w;
|
||||||
|
float tdivY = divY / (float)h;
|
||||||
|
|
||||||
|
// Output buffer prep
|
||||||
|
char *buffer = malloc(sizeof(char) * (cols * rows * 48 + 48 + 48));
|
||||||
|
buffer[0] = '\0';
|
||||||
|
|
||||||
|
sprintf(buffer, "%i|%i|", cols, rows);
|
||||||
|
|
||||||
|
// Now prep tileset.
|
||||||
|
for(int y = 0; y < rows; y++) {
|
||||||
|
for(int x = 0; x < cols; x++) {
|
||||||
|
float ux0 = (borderX + (divX * x) + (gapX * x)) / w;
|
||||||
|
float ux1 = ux0 + tdivX;
|
||||||
|
float uy0 = (borderY + (divY * y) + (gapY * y)) / 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;
|
||||||
|
}
|
Reference in New Issue
Block a user