Compare commits
No commits in common. "4e8c48c6676e1eaabe28aad6bb4336684f7ddd58" and "4c829d1b461ce8afba88fea76f4ba3f0d6320a26" have entirely different histories.
4e8c48c667
...
4c829d1b46
1
.ccls
1
.ccls
|
|
@ -5,4 +5,3 @@ gcc
|
||||||
-Isrc/ecs/components/headers
|
-Isrc/ecs/components/headers
|
||||||
-Icore/src/headers
|
-Icore/src/headers
|
||||||
-Iassets/asset_builder/src/headers
|
-Iassets/asset_builder/src/headers
|
||||||
-DASSET_FILE_NAME="$(make print-ASSET_OUTPUT)"
|
|
||||||
4
Makefile
4
Makefile
|
|
@ -45,7 +45,3 @@ clean:
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: all
|
run: all
|
||||||
$(Q)./$(SOURCE_OUTPUT)
|
$(Q)./$(SOURCE_OUTPUT)
|
||||||
|
|
||||||
.PHONY: print-%
|
|
||||||
print-% :
|
|
||||||
@echo $($*)
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
ASSETS := \
|
ASSETS := \
|
||||||
player_sheets/player_idle_sheet.png \
|
player_sheets/player_idle_sheet.png \
|
||||||
player_sheets/player_walk_sheet.png \
|
player_sheets/player_walk_sheet.png
|
||||||
tileset/tileset.png
|
|
||||||
|
|
||||||
ASSETS := $(addprefix $(ASSETS_DIR)/,$(ASSETS))
|
ASSETS := $(addprefix $(ASSETS_DIR)/,$(ASSETS))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ ASSET_BUILDER_SOURCES := \
|
||||||
|
|
||||||
# Compiler and flags
|
# Compiler and flags
|
||||||
ASSET_BUILDER_CC = gcc
|
ASSET_BUILDER_CC = gcc
|
||||||
ASSET_BUILDER_CFLAGS = --std=c17 --pedantic -O3 $(shell pkg-config --cflags libpng) # RELEASE
|
ASSET_BUILDER_CFLAGS = -std=c17 -pedantic -O3 $(shell pkg-config --cflags libpng) # RELEASE
|
||||||
#ASSET_BUILDER_CFLAGS = --std=c17 --pedantic -O1 -g $(shell pkg-config --cflags libpng) \
|
#ASSET_BUILDER_CFLAGS = -std=c17 --pedantic -O0 -g $(shell pkg-config --cflags libpng) \
|
||||||
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
|
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
|
||||||
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
|
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
|
||||||
-Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \
|
-Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \
|
||||||
|
|
@ -17,8 +17,6 @@ ASSET_BUILDER_CFLAGS = --std=c17 --pedantic -O3 $(shell pkg-config --cflags libp
|
||||||
-Wold-style-definition # DEVELOPEMENT
|
-Wold-style-definition # DEVELOPEMENT
|
||||||
|
|
||||||
ASSET_BUILDER_INCLUDE_DIRS = $(ASSET_BUILDER_DIR)/headers
|
ASSET_BUILDER_INCLUDE_DIRS = $(ASSET_BUILDER_DIR)/headers
|
||||||
ASSET_BUILDER_INCLUDE_DIRS := $(addprefix -I, $(ASSET_BUILDER_INCLUDE_DIRS))
|
|
||||||
|
|
||||||
ASSET_BUILDER_LDFLAGS = $(shell pkg-config --libs libpng)
|
ASSET_BUILDER_LDFLAGS = $(shell pkg-config --libs libpng)
|
||||||
|
|
||||||
# Deduce objects
|
# Deduce objects
|
||||||
|
|
@ -49,7 +47,7 @@ $(BUILD_DIR)/$(ASSET_BUILDER_DIR)/%.o: $(ASSET_BUILDER_DIR)/%.c
|
||||||
$(eval CURRENT_ASSET_BUILDER_FILE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)+1))))
|
$(eval CURRENT_ASSET_BUILDER_FILE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)+1))))
|
||||||
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)*100/$(TOTAL_ASSET_BUILDER_FILES)))))
|
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)*100/$(TOTAL_ASSET_BUILDER_FILES)))))
|
||||||
@echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
@echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
||||||
$(Q)$(SRC_CC) $(ASSET_BUILDER_CFLAGS) $(ASSET_BUILDER_INCLUDE_DIRS) -MMD -MP -c $< -o $@
|
$(Q)$(SRC_CC) $(SRC_CFLAGS) $(ASSET_BUILDER_INCLUDE_DIRS:%=-I%) -MMD -MP -c $< -o $@
|
||||||
|
|
||||||
# Print ending message
|
# Print ending message
|
||||||
asset_builder_end: $(ASSET_BUILDER_OUTPUT)
|
asset_builder_end: $(ASSET_BUILDER_OUTPUT)
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
#include "errors.h"
|
#include "errors.h"
|
||||||
|
|
||||||
int parse_png_for_header(const char *input_file_name, asset_header_def_t *asset_header_def);
|
int parse_png_for_header(const char *input_file_name, asset_header_def_t *asset_header_def);
|
||||||
int parse_png_for_content_and_write(const char *input_file_name, FILE *output_file);
|
int parse_png_for_content(const char *input_file_name, FILE *output_file);
|
||||||
|
|
||||||
int parse_file_for_header(const char *input_file_name, asset_header_def_t *asset_header_def)
|
int parse_file_for_header(const char *input_file_name, asset_header_def_t *asset_header_def)
|
||||||
{
|
{
|
||||||
|
|
@ -29,16 +29,19 @@ int parse_file_for_header(const char *input_file_name, asset_header_def_t *asset
|
||||||
|
|
||||||
int write_header_to_file(asset_file_header_t *asset_file_header, FILE *output_file)
|
int write_header_to_file(asset_file_header_t *asset_file_header, FILE *output_file)
|
||||||
{
|
{
|
||||||
if(fwrite(&asset_file_header->assets_number, sizeof(size_t), 1, output_file) != 1)
|
size_t ret = fwrite(&asset_file_header->assets_number, sizeof(size_t), 1, output_file);
|
||||||
|
if(ret != 1)
|
||||||
return WRITE_FAILED;
|
return WRITE_FAILED;
|
||||||
|
|
||||||
for(size_t i = 0; i < asset_file_header->assets_number; i++)
|
for(size_t i = 0; i < asset_file_header->assets_number; i++)
|
||||||
{
|
{
|
||||||
size_t name_length = strlen(asset_file_header->assets_header_def[i].name) + 1;
|
size_t name_length = strlen(asset_file_header->assets_header_def[i].name) + 1;
|
||||||
if(fwrite(asset_file_header->assets_header_def[i].name, sizeof(unsigned char), name_length, output_file) != name_length)
|
ret = fwrite(asset_file_header->assets_header_def[i].name, sizeof(unsigned char), name_length, output_file);
|
||||||
|
if(ret != name_length)
|
||||||
return WRITE_FAILED;
|
return WRITE_FAILED;
|
||||||
|
|
||||||
if(fwrite(&asset_file_header->assets_header_def[i].start, sizeof(size_t), 1, output_file) != 1)
|
ret = fwrite(&asset_file_header->assets_header_def[i].start, sizeof(size_t), 1, output_file);
|
||||||
|
if(ret != 1)
|
||||||
return WRITE_FAILED;
|
return WRITE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -58,7 +61,7 @@ int parse_file_for_content_and_write(const char *input_file_name, FILE *output_f
|
||||||
|
|
||||||
if(!strcmp(file_name_ext, "png"))
|
if(!strcmp(file_name_ext, "png"))
|
||||||
{
|
{
|
||||||
return parse_png_for_content_and_write(input_file_name, output_file);
|
return parse_png_for_content(input_file_name, output_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EXTENSION_UNSUPPORTED;
|
return EXTENSION_UNSUPPORTED;
|
||||||
|
|
@ -70,16 +73,13 @@ int parse_png_for_header(const char *file_name, asset_header_def_t *asset_header
|
||||||
FILE *input_file = fopen(file_name, "rb");
|
FILE *input_file = fopen(file_name, "rb");
|
||||||
|
|
||||||
if(!input_file)
|
if(!input_file)
|
||||||
|
{
|
||||||
return OPEN_FAILED;
|
return OPEN_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
// Check png autenticity.
|
// Check png autenticity.
|
||||||
unsigned char sig[8];
|
unsigned char sig[8];
|
||||||
if(fread(sig, sizeof(unsigned char), 8, input_file) != 8)
|
fread(sig, 1, 8, input_file);
|
||||||
{
|
|
||||||
fclose(input_file);
|
|
||||||
return READ_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!png_check_sig(sig, 8))
|
if(!png_check_sig(sig, 8))
|
||||||
{
|
{
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
|
|
@ -134,7 +134,7 @@ int parse_png_for_header(const char *file_name, asset_header_def_t *asset_header
|
||||||
|
|
||||||
// Fill asset def.
|
// Fill asset def.
|
||||||
asset_header_def->start = 0;
|
asset_header_def->start = 0;
|
||||||
asset_header_def->end = height * width * sizeof(uint16_t) + sizeof(size_t) * 2;
|
asset_header_def->end = height * width * 3;
|
||||||
|
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
|
|
@ -142,23 +142,19 @@ int parse_png_for_header(const char *file_name, asset_header_def_t *asset_header
|
||||||
return NO_ERROR;
|
return NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int parse_png_for_content_and_write(const char *input_file_name, FILE *output_file)
|
int parse_png_for_content(const char *input_file_name, FILE *output_file)
|
||||||
{
|
{
|
||||||
FILE *input_file = fopen(input_file_name, "rb");
|
FILE *input_file = fopen(input_file_name, "rb");
|
||||||
|
|
||||||
if(!input_file)
|
if(!input_file)
|
||||||
{
|
{
|
||||||
|
fclose(input_file);
|
||||||
return OPEN_FAILED;
|
return OPEN_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check png autenticity.
|
// Check png autenticity.
|
||||||
unsigned char sig[8];
|
unsigned char sig[8];
|
||||||
if(fread(sig, sizeof(unsigned char), 8, input_file) != 8)
|
fread(sig, 1, 8, input_file);
|
||||||
{
|
|
||||||
fclose(input_file);
|
|
||||||
return READ_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!png_check_sig(sig, 8))
|
if(!png_check_sig(sig, 8))
|
||||||
{
|
{
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
|
|
@ -191,14 +187,16 @@ int parse_png_for_content_and_write(const char *input_file_name, FILE *output_fi
|
||||||
size_t row_length = png_get_rowbytes(png_ptr, info_ptr);
|
size_t row_length = png_get_rowbytes(png_ptr, info_ptr);
|
||||||
|
|
||||||
// Write image size.
|
// Write image size.
|
||||||
if(fwrite(&width, sizeof(size_t), 1, output_file) != 1)
|
size_t ret = fwrite(&width, sizeof(size_t), 1, output_file);
|
||||||
|
if(!ret)
|
||||||
{
|
{
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
return WRITE_FAILED;
|
return WRITE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(fwrite(&height, sizeof(size_t), 1, output_file) != 1)
|
ret = fwrite(&height, sizeof(size_t), 1, output_file);
|
||||||
|
if(!ret)
|
||||||
{
|
{
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
|
|
@ -218,33 +216,28 @@ int parse_png_for_content_and_write(const char *input_file_name, FILE *output_fi
|
||||||
{
|
{
|
||||||
for(size_t j = 0; j < row_length; j += 4)
|
for(size_t j = 0; j < row_length; j += 4)
|
||||||
{
|
{
|
||||||
uint8_t r, g, b;
|
if(pixels[i * row_length + j + 3] < 128)
|
||||||
|
|
||||||
if(pixels[i * row_length + j + 3])
|
|
||||||
{
|
{
|
||||||
r = pixels[i * row_length + j] >> 3;
|
pixels[i * row_length + j] = 0xFF;
|
||||||
g = pixels[i * row_length + j + 1] >> 2;
|
pixels[i * row_length + j + 1] = 0x00;
|
||||||
b = pixels[i * row_length + j + 2] >> 3;
|
pixels[i * row_length + j + 2] = 0xFF;
|
||||||
}
|
}
|
||||||
else
|
else if(pixels[i * row_length + j + 3] < 255)
|
||||||
{
|
{
|
||||||
r = 0x1F;
|
pixels[i * row_length + j] = 0x80;
|
||||||
g = 0x00;
|
pixels[i * row_length + j + 1] = 0x00;
|
||||||
b = 0x1F;
|
pixels[i * row_length + j + 2] = 0x80;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t pixel = ((r) << 11) | ((g) << 6) | b;
|
|
||||||
|
|
||||||
// printf("\033[48;2;%d;%d;%dm ", r << 3, g << 2, b << 3);
|
ret = fwrite(&pixels[i * row_length + j], sizeof(png_byte), 3, output_file);
|
||||||
|
if(ret != 3)
|
||||||
if(fwrite(&pixel, sizeof(uint16_t), 1, output_file) != 1)
|
|
||||||
{
|
{
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
return WRITE_FAILED;
|
return WRITE_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// puts("\033[m");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
||||||
|
|
|
||||||
|
|
@ -6,42 +6,3 @@ void print_error(const char *content)
|
||||||
{
|
{
|
||||||
printf("\033[31merror\033[m: %s\n", content);
|
printf("\033[31merror\033[m: %s\n", content);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_error_description(error_t error)
|
|
||||||
{
|
|
||||||
switch(error)
|
|
||||||
{
|
|
||||||
case NO_EXTENSION:
|
|
||||||
print_error("file does not have an extension."); break;
|
|
||||||
|
|
||||||
case EXTENSION_UNSUPPORTED:
|
|
||||||
print_error("extension not yet supported."); break;
|
|
||||||
|
|
||||||
case OPEN_FAILED:
|
|
||||||
print_error("failed to open file."); break;
|
|
||||||
|
|
||||||
case READ_FAILED:
|
|
||||||
print_error("failed to read the input file."); break;
|
|
||||||
|
|
||||||
case WRITE_FAILED:
|
|
||||||
print_error("failed to write to output file."); break;
|
|
||||||
|
|
||||||
case BAD_SIGNATURE:
|
|
||||||
print_error("file not valid."); break;
|
|
||||||
|
|
||||||
case MEMORY_ALLOC_FAILED:
|
|
||||||
print_error("memory allocation failed."); break;
|
|
||||||
|
|
||||||
case PNG_BIT_DEPTH_UNSUPPORTED:
|
|
||||||
print_error("png bit depth not supported."); break;
|
|
||||||
|
|
||||||
case PNG_COLOR_TYPE_UNSUPPORTED:
|
|
||||||
print_error("png color type not supported."); break;
|
|
||||||
|
|
||||||
case NO_ERROR:
|
|
||||||
return;
|
|
||||||
|
|
||||||
default:
|
|
||||||
print_error("unknown error"); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -6,7 +6,6 @@ typedef enum error_t {
|
||||||
NO_EXTENSION,
|
NO_EXTENSION,
|
||||||
EXTENSION_UNSUPPORTED,
|
EXTENSION_UNSUPPORTED,
|
||||||
OPEN_FAILED,
|
OPEN_FAILED,
|
||||||
READ_FAILED,
|
|
||||||
WRITE_FAILED,
|
WRITE_FAILED,
|
||||||
BAD_SIGNATURE,
|
BAD_SIGNATURE,
|
||||||
MEMORY_ALLOC_FAILED,
|
MEMORY_ALLOC_FAILED,
|
||||||
|
|
@ -18,6 +17,4 @@ typedef enum error_t {
|
||||||
|
|
||||||
void print_error(const char *content);
|
void print_error(const char *content);
|
||||||
|
|
||||||
void print_error_description(error_t error);
|
|
||||||
|
|
||||||
#endif // ERROR_H
|
#endif // ERROR_H
|
||||||
|
|
@ -6,16 +6,11 @@
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
int exit_status = EXIT_SUCCESS;
|
|
||||||
|
|
||||||
FILE *output_asset_file = NULL;
|
|
||||||
|
|
||||||
// Verify arguments minimum number.
|
// Verify arguments minimum number.
|
||||||
if(argc < 3)
|
if(argc < 3)
|
||||||
{
|
{
|
||||||
puts("\033[33musage\033[m: asset_builder output_file input_file [input_file_2 ...]");
|
puts("\033[33musage\033[m: asset_builder output_file input_file [input_file_2 ...]");
|
||||||
exit_status = EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Header size and content.
|
// Header size and content.
|
||||||
|
|
@ -23,13 +18,6 @@ int main(int argc, char *argv[])
|
||||||
asset_file_header.assets_number = argc - 2;
|
asset_file_header.assets_number = argc - 2;
|
||||||
asset_file_header.header_size = sizeof(size_t) + sizeof(size_t) * asset_file_header.assets_number;
|
asset_file_header.header_size = sizeof(size_t) + sizeof(size_t) * asset_file_header.assets_number;
|
||||||
asset_file_header.assets_header_def = malloc(asset_file_header.assets_number * sizeof(asset_header_def_t));
|
asset_file_header.assets_header_def = malloc(asset_file_header.assets_number * sizeof(asset_header_def_t));
|
||||||
if(!asset_file_header.assets_header_def)
|
|
||||||
{
|
|
||||||
print_error("memory allocation failed.");
|
|
||||||
exit_status = EXIT_FAILURE;
|
|
||||||
goto end;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set assets name.
|
// Set assets name.
|
||||||
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
||||||
|
|
@ -42,23 +30,22 @@ int main(int argc, char *argv[])
|
||||||
const char *file_name_dot = strrchr(file_name, '.');
|
const char *file_name_dot = strrchr(file_name, '.');
|
||||||
const char *file_name_ext = file_name_dot ? file_name_dot + 1 : file_name;
|
const char *file_name_ext = file_name_dot ? file_name_dot + 1 : file_name;
|
||||||
|
|
||||||
size_t asset_name_length = strlen(file_base_name) - strlen(file_name_ext);
|
size_t asset_name_length = strlen(file_base_name) - strlen(file_name_ext) - 1;
|
||||||
|
|
||||||
asset_file_header.assets_header_def[i].name = malloc(asset_name_length);
|
asset_file_header.assets_header_def[i].name = malloc(asset_name_length);
|
||||||
asset_file_header.assets_header_def[i].name[asset_name_length - 1] = '\0';
|
strncpy(asset_file_header.assets_header_def[i].name, file_base_name, asset_name_length);
|
||||||
strncpy(asset_file_header.assets_header_def[i].name, file_base_name, asset_name_length - 1);
|
|
||||||
|
|
||||||
// Update header size.
|
// Update header size.
|
||||||
asset_file_header.header_size += asset_name_length;
|
asset_file_header.header_size += asset_name_length + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse input files to create header structure and fill output file.
|
// Parse input files to create header structure and fill output file.
|
||||||
output_asset_file = fopen(argv[1], "wb");
|
FILE *output_asset_file = fopen(argv[1], "wb");
|
||||||
|
|
||||||
if(!output_asset_file)
|
if(!output_asset_file)
|
||||||
{
|
{
|
||||||
print_error("could not create output file.");
|
print_error("could not create output file.");
|
||||||
exit_status = EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
||||||
|
|
@ -67,14 +54,39 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if(ret)
|
if(ret)
|
||||||
{
|
{
|
||||||
print_error_description(ret);
|
switch(ret)
|
||||||
|
{
|
||||||
|
case NO_EXTENSION:
|
||||||
|
print_error("file does not have an extension."); break;
|
||||||
|
|
||||||
exit_status = EXIT_FAILURE;
|
case EXTENSION_UNSUPPORTED:
|
||||||
goto end;
|
print_error("extension not yet supported."); break;
|
||||||
|
|
||||||
|
case OPEN_FAILED:
|
||||||
|
print_error("failed to open file."); break;
|
||||||
|
|
||||||
|
case BAD_SIGNATURE:
|
||||||
|
print_error("file not valid."); break;
|
||||||
|
|
||||||
|
case MEMORY_ALLOC_FAILED:
|
||||||
|
print_error("memory allocation failed."); break;
|
||||||
|
|
||||||
|
case PNG_BIT_DEPTH_UNSUPPORTED:
|
||||||
|
print_error("png bit depth not supported."); break;
|
||||||
|
|
||||||
|
case PNG_COLOR_TYPE_UNSUPPORTED:
|
||||||
|
print_error("png color type not supported."); break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
print_error("unknown error"); break;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(output_asset_file);
|
||||||
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate absolute position of assets in the file.
|
// Calculate absolute position of assets in the file.
|
||||||
if(i) asset_file_header.assets_header_def[i].start = asset_file_header.assets_header_def[i - 1].end;
|
if(i) asset_file_header.assets_header_def[i].start = asset_file_header.assets_header_def[i - 1].end + 1;
|
||||||
else asset_file_header.assets_header_def[0].start = asset_file_header.header_size;
|
else asset_file_header.assets_header_def[0].start = asset_file_header.header_size;
|
||||||
asset_file_header.assets_header_def[i].end += asset_file_header.assets_header_def[i].start;
|
asset_file_header.assets_header_def[i].end += asset_file_header.assets_header_def[i].start;
|
||||||
}
|
}
|
||||||
|
|
@ -82,8 +94,8 @@ int main(int argc, char *argv[])
|
||||||
if(write_header_to_file(&asset_file_header, output_asset_file))
|
if(write_header_to_file(&asset_file_header, output_asset_file))
|
||||||
{
|
{
|
||||||
print_error("can't write to output file.");
|
print_error("can't write to output file.");
|
||||||
exit_status = EXIT_FAILURE;
|
fclose(output_asset_file);
|
||||||
goto end;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
||||||
|
|
@ -92,24 +104,40 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
if(ret)
|
if(ret)
|
||||||
{
|
{
|
||||||
print_error_description(ret);
|
switch(ret)
|
||||||
|
|
||||||
exit_status = EXIT_FAILURE;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
|
||||||
if(asset_file_header.assets_header_def)
|
|
||||||
{
|
{
|
||||||
for(size_t i = 0; i < asset_file_header.assets_number; i++)
|
case NO_EXTENSION:
|
||||||
free(asset_file_header.assets_header_def[i].name);
|
print_error("file does not have an extension."); break;
|
||||||
|
|
||||||
free(asset_file_header.assets_header_def);
|
case EXTENSION_UNSUPPORTED:
|
||||||
|
print_error("extension not yet supported."); break;
|
||||||
|
|
||||||
|
case OPEN_FAILED:
|
||||||
|
print_error("failed to open file."); break;
|
||||||
|
|
||||||
|
case WRITE_FAILED:
|
||||||
|
print_error("failed to write to output file."); break;
|
||||||
|
|
||||||
|
case BAD_SIGNATURE:
|
||||||
|
print_error("file not valid."); break;
|
||||||
|
|
||||||
|
case MEMORY_ALLOC_FAILED:
|
||||||
|
print_error("memory allocation failed."); break;
|
||||||
|
|
||||||
|
case PNG_BIT_DEPTH_UNSUPPORTED:
|
||||||
|
print_error("png bit depth not supported."); break;
|
||||||
|
|
||||||
|
case PNG_COLOR_TYPE_UNSUPPORTED:
|
||||||
|
print_error("png color type not supported."); break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
print_error("unknown error"); break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(output_asset_file)
|
|
||||||
fclose(output_asset_file);
|
fclose(output_asset_file);
|
||||||
|
return EXIT_FAILURE;
|
||||||
return exit_status;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
shell.nix
11
shell.nix
|
|
@ -4,16 +4,15 @@ stdenv.mkDerivation {
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
gnumake
|
gnumake
|
||||||
gcc
|
gcc
|
||||||
gdb
|
|
||||||
pkg-config
|
pkg-config
|
||||||
valgrind
|
|
||||||
];
|
];
|
||||||
buildInputs = [
|
buildInputs = [
|
||||||
SDL2
|
SDL2
|
||||||
|
SDL2_image
|
||||||
libpng
|
libpng
|
||||||
];
|
];
|
||||||
shellHook = ''
|
# shellHook = ''
|
||||||
export LD_LIBRARY_PATH=${pkgs.SDL2}/lib:${pkgs.sdl3}/lib:${pkgs.libpng}/lib:$LD_LIBRARY_PATH
|
# export LD_LIBRARY_PATH=${pkgs.SDL2}/lib:${pkgs.SDL2_image}/lib:$LD_LIBRARY_PATH
|
||||||
export PKG_CONFIG_PATH=${pkgs.SDL2}/lib/pkgconfig:${pkgs.libpng}/lib/pkgconfig:$PKG_CONFIG_PATH
|
# export PKG_CONFIG_PATH=${pkgs.SDL2}/lib/pkgconfig:${pkgs.SDL2_image}/lib/pkgconfig:$PKG_CONFIG_PATH
|
||||||
'';
|
# '';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
12
src/Makefile
12
src/Makefile
|
|
@ -10,8 +10,8 @@ SOURCES := \
|
||||||
|
|
||||||
# Compiler and flags
|
# Compiler and flags
|
||||||
SRC_CC = gcc
|
SRC_CC = gcc
|
||||||
#SRC_CFLAGS = --std=c17 --pedantic -O3 # RELEASE
|
#SRC_CFLAGS = -std=c17 -pedantic -O3 # RELEASE
|
||||||
SRC_CFLAGS = --std=c17 --pedantic -O1 -g \
|
SRC_CFLAGS = -std=c17 --pedantic -O0 -g \
|
||||||
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
|
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
|
||||||
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
|
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
|
||||||
-Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \
|
-Wpointer-arith -Wbad-function-cast -Wstrict-overflow=5 \
|
||||||
|
|
@ -20,9 +20,7 @@ SRC_CFLAGS = --std=c17 --pedantic -O1 -g \
|
||||||
-Wfloat-equal -Wstrict-aliasing=2 -Wredundant-decls \
|
-Wfloat-equal -Wstrict-aliasing=2 -Wredundant-decls \
|
||||||
-Wold-style-definition # DEVELOPEMENT
|
-Wold-style-definition # DEVELOPEMENT
|
||||||
|
|
||||||
SRC_INCLUDE_DIRS = $(SOURCE_DIR)/headers $(SOURCE_DIR)/ecs/headers $(SOURCE_DIR)/ecs/components/headers $(CORE_DIR)/headers
|
SRC_INCLUDE_DIRS = $(SOURCE_DIR)/headers $(SOURCE_DIR)/ecs/headers $(SOURCE_DIR)/ecs/components/headers $(CORE_DIR)/$(CORE_SRC_DIR)/headers
|
||||||
SRC_INCLUDE_DIRS := $(addprefix -I, $(SRC_INCLUDE_DIRS))
|
|
||||||
|
|
||||||
SRC_LDFLAGS =
|
SRC_LDFLAGS =
|
||||||
|
|
||||||
# Deduce objects
|
# Deduce objects
|
||||||
|
|
@ -46,14 +44,14 @@ count_src_build:
|
||||||
# Link game target
|
# Link game target
|
||||||
$(SOURCE_OUTPUT): $(SOURCE_OBJECTS) $(CORE_OUTPUT)
|
$(SOURCE_OUTPUT): $(SOURCE_OBJECTS) $(CORE_OUTPUT)
|
||||||
@echo -e "[100%] $(YELLOW)Linking $(notdir $(SOURCE_OUTPUT))$(RESET)"
|
@echo -e "[100%] $(YELLOW)Linking $(notdir $(SOURCE_OUTPUT))$(RESET)"
|
||||||
$(Q)$(SRC_CC) $(SOURCE_OBJECTS) -L./$(BUILD_DIR) $(CORE_OUTPUT) -o $@ $(SRC_LDFLAGS) $(CORE_DEPS_FLAGS)
|
$(Q)$(SRC_CC) $(SOURCE_OBJECTS) -L./$(BUILD_DIR) $(CORE_OUTPUT) $(CORE_DEPS_FLAGS) -o $@ $(SRC_LDFLAGS)
|
||||||
|
|
||||||
# Build .o files
|
# Build .o files
|
||||||
$(BUILD_DIR)/$(SOURCE_DIR)/%.o: $(SOURCE_DIR)/%.c
|
$(BUILD_DIR)/$(SOURCE_DIR)/%.o: $(SOURCE_DIR)/%.c
|
||||||
$(eval CURRENT_SRC_FILE := $(shell echo $$(($(CURRENT_SRC_FILE)+1))))
|
$(eval CURRENT_SRC_FILE := $(shell echo $$(($(CURRENT_SRC_FILE)+1))))
|
||||||
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_SRC_FILE)*100/$(TOTAL_SRC_FILES)))))
|
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_SRC_FILE)*100/$(TOTAL_SRC_FILES)))))
|
||||||
@echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
@echo -e "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
||||||
$(Q)$(SRC_CC) $(SRC_CFLAGS) $(SRC_INCLUDE_DIRS) -MMD -MP -c $< -o $@
|
$(Q)$(SRC_CC) $(SRC_CFLAGS) $(SRC_INCLUDE_DIRS:%=-I%) -MMD -MP -c $< -o $@
|
||||||
|
|
||||||
# Print ending message
|
# Print ending message
|
||||||
src_end: $(SOURCE_OUTPUT)
|
src_end: $(SOURCE_OUTPUT)
|
||||||
|
|
|
||||||
|
|
@ -7,18 +7,18 @@
|
||||||
typedef struct animation_system_data_t {
|
typedef struct animation_system_data_t {
|
||||||
sprite_component_data_t *sprite_component_data;
|
sprite_component_data_t *sprite_component_data;
|
||||||
|
|
||||||
|
bool play :1;
|
||||||
|
bool loop :1;
|
||||||
|
bool reverse :1;
|
||||||
|
|
||||||
|
float frame_delay_ms;
|
||||||
|
float frame_timer_ms;
|
||||||
|
|
||||||
elem_t *actual_frame;
|
elem_t *actual_frame;
|
||||||
size_t actual_frame_nb;
|
size_t actual_frame_nb;
|
||||||
|
|
||||||
size_t nb_frames;
|
size_t nb_frames;
|
||||||
linked_list_t frames;
|
linked_list_t frames;
|
||||||
|
|
||||||
float frame_delay_ms;
|
|
||||||
float frame_timer_ms;
|
|
||||||
|
|
||||||
bool play :1;
|
|
||||||
bool loop :1;
|
|
||||||
bool reverse :1;
|
|
||||||
} animation_system_data_t;
|
} animation_system_data_t;
|
||||||
|
|
||||||
void animation_system_init(component_t *component, va_list args);
|
void animation_system_init(component_t *component, va_list args);
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,6 @@ void player_system_init(component_t *component, va_list args __attribute__((unus
|
||||||
system_data->transform_component_data = system_data->sprite_component_data->transform_component_data;
|
system_data->transform_component_data = system_data->sprite_component_data->transform_component_data;
|
||||||
|
|
||||||
system_data->state = PLAYER_IDLE;
|
system_data->state = PLAYER_IDLE;
|
||||||
|
|
||||||
asset_manager_load_asset(&game.asset_manager, "player_idle_sheet", ASSET_TEXTURE);
|
|
||||||
asset_manager_load_asset(&game.asset_manager, "player_walk_sheet", ASSET_TEXTURE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only for this file
|
// Only for this file
|
||||||
|
|
@ -87,7 +84,5 @@ void player_system_update(component_t *component)
|
||||||
|
|
||||||
void player_system_destroy(component_t *component)
|
void player_system_destroy(component_t *component)
|
||||||
{
|
{
|
||||||
asset_manager_let_go_asset(&game.asset_manager, "player_idle_sheet");
|
|
||||||
asset_manager_let_go_asset(&game.asset_manager, "player_walk_sheet");
|
|
||||||
free(component->component_data);
|
free(component->component_data);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,12 @@ typedef void (*component_init_t)(component_t *component, va_list args);
|
||||||
typedef void (*component_update_t)(component_t *component);
|
typedef void (*component_update_t)(component_t *component);
|
||||||
// Component draw function. It is called in the main loop to draw the component on screen. This function is not necessary.
|
// Component draw function. It is called in the main loop to draw the component on screen. This function is not necessary.
|
||||||
typedef void (*component_draw_t)(component_t *component);
|
typedef void (*component_draw_t)(component_t *component);
|
||||||
// Component deleter function. It is called when the component is removed. It should free the data in the component data but not the component itself.
|
// Component deleter function. It is called when the component is removed. It should free the data in the component data but not the component data itself.
|
||||||
typedef void (*component_deleter_t)(component_t *component);
|
typedef void (*component_deleter_t)(component_t *component);
|
||||||
|
|
||||||
typedef struct component_t {
|
typedef struct component_t {
|
||||||
|
component_type_t component_type;
|
||||||
|
|
||||||
component_init_t component_init;
|
component_init_t component_init;
|
||||||
component_update_t component_update;
|
component_update_t component_update;
|
||||||
component_draw_t component_draw;
|
component_draw_t component_draw;
|
||||||
|
|
@ -32,9 +34,6 @@ typedef struct component_t {
|
||||||
component_deleter_t component_deleter;
|
component_deleter_t component_deleter;
|
||||||
|
|
||||||
struct entity_t *entity;
|
struct entity_t *entity;
|
||||||
|
|
||||||
component_type_t component_type;
|
|
||||||
|
|
||||||
} component_t;
|
} component_t;
|
||||||
|
|
||||||
component_t *create_component(component_type_t component_type);
|
component_t *create_component(component_type_t component_type);
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,8 @@
|
||||||
#include <vector2d.h>
|
#include <vector2d.h>
|
||||||
|
|
||||||
typedef struct events_t {
|
typedef struct events_t {
|
||||||
vector2d_t cursor_pos;
|
|
||||||
bool keys[MAX_KEYCODES];
|
bool keys[MAX_KEYCODES];
|
||||||
|
vector2d_t cursor_pos;
|
||||||
} events_t;
|
} events_t;
|
||||||
|
|
||||||
#endif // EVENTS_H
|
#endif // EVENTS_H
|
||||||
|
|
@ -18,12 +18,12 @@
|
||||||
* @param delta_time_ms Frame time
|
* @param delta_time_ms Frame time
|
||||||
*/
|
*/
|
||||||
typedef struct game_t {
|
typedef struct game_t {
|
||||||
|
events_t events;
|
||||||
asset_manager_t asset_manager;
|
asset_manager_t asset_manager;
|
||||||
entity_manager_t entity_manager;
|
entity_manager_t entity_manager;
|
||||||
events_t events;
|
|
||||||
|
|
||||||
float delta_time_ms;
|
|
||||||
bool is_running;
|
bool is_running;
|
||||||
|
float delta_time_ms;
|
||||||
} game_t;
|
} game_t;
|
||||||
|
|
||||||
// Global game instance
|
// Global game instance
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue