Compare commits

..

No commits in common. "4e8c48c6676e1eaabe28aad6bb4336684f7ddd58" and "4c829d1b461ce8afba88fea76f4ba3f0d6320a26" have entirely different histories.

15 changed files with 126 additions and 164 deletions

1
.ccls
View File

@ -5,4 +5,3 @@ gcc
-Isrc/ecs/components/headers
-Icore/src/headers
-Iassets/asset_builder/src/headers
-DASSET_FILE_NAME="$(make print-ASSET_OUTPUT)"

View File

@ -45,7 +45,3 @@ clean:
.PHONY: run
run: all
$(Q)./$(SOURCE_OUTPUT)
.PHONY: print-%
print-% :
@echo $($*)

View File

@ -1,7 +1,6 @@
ASSETS := \
player_sheets/player_idle_sheet.png \
player_sheets/player_walk_sheet.png \
tileset/tileset.png
player_sheets/player_walk_sheet.png
ASSETS := $(addprefix $(ASSETS_DIR)/,$(ASSETS))

View File

@ -6,8 +6,8 @@ ASSET_BUILDER_SOURCES := \
# Compiler and flags
ASSET_BUILDER_CC = gcc
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 -O3 $(shell pkg-config --cflags libpng) # RELEASE
#ASSET_BUILDER_CFLAGS = -std=c17 --pedantic -O0 -g $(shell pkg-config --cflags libpng) \
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
-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
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)
# 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 PERCENTAGE := $(shell echo $$(($(CURRENT_ASSET_BUILDER_FILE)*100/$(TOTAL_ASSET_BUILDER_FILES)))))
@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
asset_builder_end: $(ASSET_BUILDER_OUTPUT)

View File

@ -6,7 +6,7 @@
#include "errors.h"
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)
{
@ -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)
{
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;
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;
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;
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;
}
@ -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"))
{
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;
@ -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");
if(!input_file)
{
return OPEN_FAILED;
}
// Check png autenticity.
unsigned char sig[8];
if(fread(sig, sizeof(unsigned char), 8, input_file) != 8)
{
fclose(input_file);
return READ_FAILED;
}
fread(sig, 1, 8, input_file);
if(!png_check_sig(sig, 8))
{
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.
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);
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;
}
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");
if(!input_file)
{
fclose(input_file);
return OPEN_FAILED;
}
// Check png autenticity.
unsigned char sig[8];
if(fread(sig, sizeof(unsigned char), 8, input_file) != 8)
{
fclose(input_file);
return READ_FAILED;
}
fread(sig, 1, 8, input_file);
if(!png_check_sig(sig, 8))
{
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);
// 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);
fclose(input_file);
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);
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)
{
uint8_t r, g, b;
if(pixels[i * row_length + j + 3])
if(pixels[i * row_length + j + 3] < 128)
{
r = pixels[i * row_length + j] >> 3;
g = pixels[i * row_length + j + 1] >> 2;
b = pixels[i * row_length + j + 2] >> 3;
pixels[i * row_length + j] = 0xFF;
pixels[i * row_length + j + 1] = 0x00;
pixels[i * row_length + j + 2] = 0xFF;
}
else
else if(pixels[i * row_length + j + 3] < 255)
{
r = 0x1F;
g = 0x00;
b = 0x1F;
pixels[i * row_length + j] = 0x80;
pixels[i * row_length + j + 1] = 0x00;
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);
if(fwrite(&pixel, sizeof(uint16_t), 1, output_file) != 1)
ret = fwrite(&pixels[i * row_length + j], sizeof(png_byte), 3, output_file);
if(ret != 3)
{
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
fclose(input_file);
return WRITE_FAILED;
}
}
// puts("\033[m");
}
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);

View File

@ -6,42 +6,3 @@ void print_error(const char *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;
}
}

View File

@ -6,7 +6,6 @@ typedef enum error_t {
NO_EXTENSION,
EXTENSION_UNSUPPORTED,
OPEN_FAILED,
READ_FAILED,
WRITE_FAILED,
BAD_SIGNATURE,
MEMORY_ALLOC_FAILED,
@ -18,6 +17,4 @@ typedef enum error_t {
void print_error(const char *content);
void print_error_description(error_t error);
#endif // ERROR_H

View File

@ -6,16 +6,11 @@
int main(int argc, char *argv[])
{
int exit_status = EXIT_SUCCESS;
FILE *output_asset_file = NULL;
// Verify arguments minimum number.
if(argc < 3)
{
puts("\033[33musage\033[m: asset_builder output_file input_file [input_file_2 ...]");
exit_status = EXIT_FAILURE;
goto end;
return EXIT_FAILURE;
}
// Header size and content.
@ -23,13 +18,6 @@ int main(int argc, char *argv[])
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.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.
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_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[asset_name_length - 1] = '\0';
strncpy(asset_file_header.assets_header_def[i].name, file_base_name, asset_name_length - 1);
strncpy(asset_file_header.assets_header_def[i].name, file_base_name, asset_name_length);
// 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.
output_asset_file = fopen(argv[1], "wb");
FILE *output_asset_file = fopen(argv[1], "wb");
if(!output_asset_file)
{
print_error("could not create output file.");
exit_status = EXIT_FAILURE;
goto end;
return EXIT_FAILURE;
}
for(size_t i = 0; i < asset_file_header.assets_number; i++)
@ -67,14 +54,39 @@ int main(int argc, char *argv[])
if(ret)
{
print_error_description(ret);
switch(ret)
{
case NO_EXTENSION:
print_error("file does not have an extension."); break;
exit_status = EXIT_FAILURE;
goto end;
case EXTENSION_UNSUPPORTED:
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.
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;
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))
{
print_error("can't write to output file.");
exit_status = EXIT_FAILURE;
goto end;
fclose(output_asset_file);
return EXIT_FAILURE;
}
for(size_t i = 0; i < asset_file_header.assets_number; i++)
@ -92,24 +104,40 @@ int main(int argc, char *argv[])
if(ret)
{
print_error_description(ret);
exit_status = EXIT_FAILURE;
goto end;
}
}
end:
if(asset_file_header.assets_header_def)
switch(ret)
{
for(size_t i = 0; i < asset_file_header.assets_number; i++)
free(asset_file_header.assets_header_def[i].name);
case NO_EXTENSION:
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);
return exit_status;
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}

View File

@ -4,16 +4,15 @@ stdenv.mkDerivation {
nativeBuildInputs = [
gnumake
gcc
gdb
pkg-config
valgrind
];
buildInputs = [
SDL2
SDL2_image
libpng
];
shellHook = ''
export LD_LIBRARY_PATH=${pkgs.SDL2}/lib:${pkgs.sdl3}/lib:${pkgs.libpng}/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=${pkgs.SDL2}/lib/pkgconfig:${pkgs.libpng}/lib/pkgconfig:$PKG_CONFIG_PATH
'';
# shellHook = ''
# export LD_LIBRARY_PATH=${pkgs.SDL2}/lib:${pkgs.SDL2_image}/lib:$LD_LIBRARY_PATH
# export PKG_CONFIG_PATH=${pkgs.SDL2}/lib/pkgconfig:${pkgs.SDL2_image}/lib/pkgconfig:$PKG_CONFIG_PATH
# '';
}

View File

@ -10,8 +10,8 @@ SOURCES := \
# Compiler and flags
SRC_CC = gcc
#SRC_CFLAGS = --std=c17 --pedantic -O3 # RELEASE
SRC_CFLAGS = --std=c17 --pedantic -O1 -g \
#SRC_CFLAGS = -std=c17 -pedantic -O3 # RELEASE
SRC_CFLAGS = -std=c17 --pedantic -O0 -g \
-Wall -Wno-missing-braces -Wextra -Wno-missing-field-initializers \
-Wformat=2 -Wswitch-default -Wswitch-enum -Wcast-align \
-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 \
-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 := $(addprefix -I, $(SRC_INCLUDE_DIRS))
SRC_INCLUDE_DIRS = $(SOURCE_DIR)/headers $(SOURCE_DIR)/ecs/headers $(SOURCE_DIR)/ecs/components/headers $(CORE_DIR)/$(CORE_SRC_DIR)/headers
SRC_LDFLAGS =
# Deduce objects
@ -46,14 +44,14 @@ count_src_build:
# Link game target
$(SOURCE_OUTPUT): $(SOURCE_OBJECTS) $(CORE_OUTPUT)
@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_DIR)/$(SOURCE_DIR)/%.o: $(SOURCE_DIR)/%.c
$(eval CURRENT_SRC_FILE := $(shell echo $$(($(CURRENT_SRC_FILE)+1))))
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_SRC_FILE)*100/$(TOTAL_SRC_FILES)))))
@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
src_end: $(SOURCE_OUTPUT)

View File

@ -7,18 +7,18 @@
typedef struct animation_system_data_t {
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;
size_t actual_frame_nb;
size_t nb_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;
void animation_system_init(component_t *component, va_list args);

View File

@ -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->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
@ -87,7 +84,5 @@ void player_system_update(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);
}

View File

@ -19,10 +19,12 @@ typedef void (*component_init_t)(component_t *component, va_list args);
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.
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 struct component_t {
component_type_t component_type;
component_init_t component_init;
component_update_t component_update;
component_draw_t component_draw;
@ -32,9 +34,6 @@ typedef struct component_t {
component_deleter_t component_deleter;
struct entity_t *entity;
component_type_t component_type;
} component_t;
component_t *create_component(component_type_t component_type);

View File

@ -5,8 +5,8 @@
#include <vector2d.h>
typedef struct events_t {
vector2d_t cursor_pos;
bool keys[MAX_KEYCODES];
vector2d_t cursor_pos;
} events_t;
#endif // EVENTS_H

View File

@ -18,12 +18,12 @@
* @param delta_time_ms Frame time
*/
typedef struct game_t {
events_t events;
asset_manager_t asset_manager;
entity_manager_t entity_manager;
events_t events;
float delta_time_ms;
bool is_running;
float delta_time_ms;
} game_t;
// Global game instance