Compare commits
No commits in common. "0b5d3892dd605423c25618e1f26d8f2d2952964c" and "6e1ed2079d2234d2238db33ec503b385455d1fd7" have entirely different histories.
0b5d3892dd
...
6e1ed2079d
2
Makefile
2
Makefile
|
|
@ -56,7 +56,7 @@ ASSETS_DIR := $(ROOT)/$(ASSETS_DIR)
|
||||||
ASSET_BUILDER_DIR := $(ROOT)/$(ASSET_BUILDER_DIR)
|
ASSET_BUILDER_DIR := $(ROOT)/$(ASSET_BUILDER_DIR)
|
||||||
|
|
||||||
OUTPUT := $(BUILD_DIR)/$(OUTPUT)$(OUTPUT_EXT)
|
OUTPUT := $(BUILD_DIR)/$(OUTPUT)$(OUTPUT_EXT)
|
||||||
LIBCORE := $(BUILD_DIR)/libcore$(STATIC_LIB_OUTPUT_EXT)
|
LIBCORE := $(BUILD_DIR)/libcore$(LIB_OUTPUT_EXT)
|
||||||
ASSET_OUTPUT := $(BUILD_DIR)/$(ASSET_OUTPUT)
|
ASSET_OUTPUT := $(BUILD_DIR)/$(ASSET_OUTPUT)
|
||||||
ASSET_BUILDER_OUTPUT := $(BUILD_DIR)/asset_builder/asset_builder$(OUTPUT_EXT)
|
ASSET_BUILDER_OUTPUT := $(BUILD_DIR)/asset_builder/asset_builder$(OUTPUT_EXT)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,14 +17,14 @@ endif
|
||||||
|
|
||||||
$(ASSET_BUILDER_OUTPUT): $(OBJECTS)
|
$(ASSET_BUILDER_OUTPUT): $(OBJECTS)
|
||||||
$(Q)mkdir -p $(dir $@)
|
$(Q)mkdir -p $(dir $@)
|
||||||
@echo $(ECHO_OPTION) "[100%] $(YELLOW)Linking $(notdir $(ASSET_BUILDER_OUTPUT))$(RESET)"
|
|
||||||
$(Q)$(HOST_CC) $(ASSET_BUILDER_CFLAGS) $(OBJECTS) -o $@ $(ASSET_BUILDER_LDFLAGS)
|
$(Q)$(HOST_CC) $(ASSET_BUILDER_CFLAGS) $(OBJECTS) -o $@ $(ASSET_BUILDER_LDFLAGS)
|
||||||
|
@echo "[100%] $(YELLOW)Linking $(notdir $(ASSET_BUILDER_OUTPUT))$(RESET)"
|
||||||
|
|
||||||
$(BUILD_DIR)/$(notdir $(ASSET_BUILDER_DIR))/%.o: $(ASSET_BUILDER_DIR)/%
|
$(BUILD_DIR)/$(notdir $(ASSET_BUILDER_DIR))/%.o: $(ASSET_BUILDER_DIR)/%
|
||||||
$(Q)mkdir -p $(dir $@)
|
$(Q)mkdir -p $(dir $@)
|
||||||
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE)+1))))
|
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE)+1))))
|
||||||
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE)*100/$(TOTAL_BUILD_FILES)))))
|
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE)*100/$(TOTAL_BUILD_FILES)))))
|
||||||
@echo $(ECHO_OPTION) "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
|
||||||
$(Q)$(HOST_CC) $(ASSET_BUILDER_CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@
|
$(Q)$(HOST_CC) $(ASSET_BUILDER_CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@
|
||||||
|
@echo "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
||||||
|
|
||||||
-include $(ASSET_BUILDER_OBJECTS:.o=.d)
|
-include $(ASSET_BUILDER_OBJECTS:.o=.d)
|
||||||
|
|
|
||||||
|
|
@ -19,14 +19,14 @@ TOTAL_BUILD_FILES := $(shell echo $$(($$($(MAKE) -n $(OBJECTS) TOTAL_BUILD_FILES
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(ASSET_OUTPUT): $(OBJECTS) $(ASSET_BUILDER_OUTPUT)
|
$(ASSET_OUTPUT): $(OBJECTS) $(ASSET_BUILDER_OUTPUT)
|
||||||
@echo $(ECHO_OPTION) "[100%] $(YELLOW)Building $(notdir $(ASSET_OUTPUT))$(RESET)"
|
@echo "[100%] $(YELLOW)Building $(notdir $(ASSET_OUTPUT))$(RESET)"
|
||||||
$(Q)$(ASSET_BUILDER_OUTPUT) $@ $(OBJECTS)
|
$(Q)$(ASSET_BUILDER_OUTPUT) $@ $(OBJECTS)
|
||||||
|
|
||||||
$(BUILD_DIR)/$(notdir $(ASSETS_DIR))/%.o: $(ASSETS_DIR)/% $(ASSET_BUILDER_OUTPUT)
|
$(BUILD_DIR)/$(notdir $(ASSETS_DIR))/%.o: $(ASSETS_DIR)/% $(ASSET_BUILDER_OUTPUT)
|
||||||
$(Q)mkdir -p $(dir $@)
|
$(Q)mkdir -p $(dir $@)
|
||||||
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1))))
|
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1))))
|
||||||
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES)))))
|
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES)))))
|
||||||
@echo $(ECHO_OPTION) "[$(PERCENTAGE)%] $(GREEN)Building ASSET object $@$(RESET)"
|
@echo "[$(PERCENTAGE)%] $(GREEN)Building ASSET object $@$(RESET)"
|
||||||
$(Q)$(ASSET_BUILDER_OUTPUT) $@ -c $<
|
$(Q)$(ASSET_BUILDER_OUTPUT) $@ -c $<
|
||||||
|
|
||||||
$(ASSET_BUILDER_OUTPUT): FORCE
|
$(ASSET_BUILDER_OUTPUT): FORCE
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,8 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
CONFIG_FILE="config.mk"
|
CONFIG_FILE="config.mk"
|
||||||
|
CACHE_DIR="cache"
|
||||||
|
LIB_DIR="lib"
|
||||||
|
|
||||||
#
|
#
|
||||||
# Main
|
# Main
|
||||||
|
|
@ -77,7 +79,7 @@ done
|
||||||
## Clean
|
## Clean
|
||||||
if [ -n "${CLEAN}" ]; then
|
if [ -n "${CLEAN}" ]; then
|
||||||
make clean-all
|
make clean-all
|
||||||
rm -rf ${CONFIG_FILE}
|
rm -rf ${CONFIG_FILE} ${CACHE_DIR} ${LIB_DIR}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "${EXIT_AFTER_CLEAN}" ]; then
|
if [ -n "${EXIT_AFTER_CLEAN}" ]; then
|
||||||
|
|
@ -90,11 +92,11 @@ if [ "${HOST}" = "guess" ]; then
|
||||||
linux*)
|
linux*)
|
||||||
HOST="linux"
|
HOST="linux"
|
||||||
;;
|
;;
|
||||||
msys*|cygwin*)
|
# msys*|cygwin*)
|
||||||
HOST="windows"
|
# CURRENT_HOST="windows"
|
||||||
;;
|
# ;;
|
||||||
# darwin*)
|
# darwin*)
|
||||||
# HOST="macos"
|
# CURRENT_HOST="macos"
|
||||||
# ;;
|
# ;;
|
||||||
*)
|
*)
|
||||||
exit_error_message "Current detected os is unsuppoted to build from: ${OSTYPE}\nUse --help for more informations."
|
exit_error_message "Current detected os is unsuppoted to build from: ${OSTYPE}\nUse --help for more informations."
|
||||||
|
|
@ -113,30 +115,16 @@ fi
|
||||||
case "${HOST}" in
|
case "${HOST}" in
|
||||||
linux)
|
linux)
|
||||||
HOST_CC=gcc
|
HOST_CC=gcc
|
||||||
HOST_PKG_CONFIG=pkg-config
|
|
||||||
ASSET_BUILDER_CFLAGS=(
|
ASSET_BUILDER_CFLAGS=(
|
||||||
"--std=c17"
|
"--std=c17"
|
||||||
"-O2"
|
"-O2"
|
||||||
)
|
)
|
||||||
ASSET_BUILDER_LDFLAGS=()
|
ASSET_BUILDER_LDFLAGS=()
|
||||||
ASSET_BUILDER_LIBS=(
|
ASSET_BUILDER_LIBS=(
|
||||||
"libpng|1.6.34"
|
"libpng|1.6.48"
|
||||||
"json-c|0.11"
|
"json-c|0.18"
|
||||||
)
|
)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
windows)
|
|
||||||
HOST_CC=x86_64-w64-mingw32-gcc
|
|
||||||
HOST_PKG_CONFIG=x86_64-w64-mingw32-pkg-config
|
|
||||||
ASSET_BUILDER_CFLAGS=(
|
|
||||||
"--std=c17" "-O2"
|
|
||||||
)
|
|
||||||
ASSET_BUILDER_LDFLAGS=()
|
|
||||||
ASSET_BUILDER_LIBS=(
|
|
||||||
"libpng|1.6.34"
|
|
||||||
"json-c|0.11"
|
|
||||||
)
|
|
||||||
;;
|
|
||||||
*)
|
*)
|
||||||
exit_error_message "Compiling from ${HOST} is not supported yet."
|
exit_error_message "Compiling from ${HOST} is not supported yet."
|
||||||
;;
|
;;
|
||||||
|
|
@ -151,15 +139,13 @@ case "${TARGET_HOST}" in
|
||||||
linux)
|
linux)
|
||||||
TARGET_HOST_CC=gcc
|
TARGET_HOST_CC=gcc
|
||||||
TARGET_HOST_AR=ar
|
TARGET_HOST_AR=ar
|
||||||
TARGET_HOST_PKG_CONFIG=pkg-config
|
|
||||||
TARGET_HOST_CFLAGS=(
|
TARGET_HOST_CFLAGS=(
|
||||||
"--std=c17" "-Os"
|
"--std=c17" "-Os"
|
||||||
"-DASSET_FILE_NAME=\\\"\$(notdir \$(ASSET_OUTPUT))\\\"" "-D_GNU_SOURCE=1"
|
"-DASSET_FILE_NAME=\\\"\$(notdir \$(ASSET_OUTPUT))\\\"" "-D_GNU_SOURCE=1"
|
||||||
)
|
)
|
||||||
TARGET_HOST_LDFLAGS=()
|
TARGET_HOST_LDFLAGS=()
|
||||||
OUTPUT_EXT=""
|
OUTPUT_EXT=""
|
||||||
DYNAMIC_LIB_OUTPUT_EXT=".so"
|
LIB_OUTPUT_EXT=".a"
|
||||||
STATIC_LIB_OUTPUT_EXT=".a"
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
exit_error_message "Cross compiling from ${HOST} for ${TARGET_HOST} is not supported yet."
|
exit_error_message "Cross compiling from ${HOST} for ${TARGET_HOST} is not supported yet."
|
||||||
|
|
@ -172,35 +158,6 @@ case "${TARGET_HOST}" in
|
||||||
)
|
)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
windows)
|
|
||||||
echo "Configuring for target: ${TARGET_HOST}"
|
|
||||||
|
|
||||||
case "${HOST}" in
|
|
||||||
windows)
|
|
||||||
TARGET_HOST_CC=x86_64-w64-mingw32-gcc
|
|
||||||
TARGET_HOST_AR=x86_64-w64-mingw32-gcc-ar
|
|
||||||
TARGET_HOST_PKG_CONFIG=x86_64-w64-mingw32-pkg-config
|
|
||||||
TARGET_HOST_CFLAGS=(
|
|
||||||
"--std=c17" "-Os"
|
|
||||||
"-DASSET_FILE_NAME=\\\"\$(notdir \$(ASSET_OUTPUT))\\\"" "-D_GNU_SOURCE=1"
|
|
||||||
)
|
|
||||||
TARGET_HOST_LDFLAGS=()
|
|
||||||
OUTPUT_EXT=".exe"
|
|
||||||
DYNAMIC_LIB_OUTPUT_EXT=".dll"
|
|
||||||
STATIC_LIB_OUTPUT_EXT=".dll.a"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
exit_error_message "Cross compiling from ${HOST} for ${TARGET_HOST} is not supported yet."
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
TARGET_HOST_LIBS=(
|
|
||||||
"sdl3|3.3.4"
|
|
||||||
"lua|5.4.7"
|
|
||||||
)
|
|
||||||
;;
|
|
||||||
|
|
||||||
fxcg50)
|
fxcg50)
|
||||||
echo "Configuring for target: ${TARGET_HOST}"
|
echo "Configuring for target: ${TARGET_HOST}"
|
||||||
|
|
||||||
|
|
@ -216,15 +173,13 @@ case "${TARGET_HOST}" in
|
||||||
)
|
)
|
||||||
TARGET_HOST_LDFLAGS="-T fxcg50.ld"
|
TARGET_HOST_LDFLAGS="-T fxcg50.ld"
|
||||||
OUTPUT_EXT=""
|
OUTPUT_EXT=""
|
||||||
DYNAMIC_LIB_OUTPUT_EXT=".so"
|
LIB_OUTPUT_EXT=".a"
|
||||||
STATIC_LIB_OUTPUT_EXT=".a"
|
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
exit_error_message "Cross compiling from ${HOST} for ${TARGET_HOST} is not supported yet."
|
exit_error_message "Cross compiling from ${HOST} for ${TARGET_HOST} is not supported yet."
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*)
|
*)
|
||||||
exit_error_message "Unsupported target host: ${TARGET_HOST}"
|
exit_error_message "Unsupported target host: ${TARGET_HOST}"
|
||||||
esac
|
esac
|
||||||
|
|
@ -247,10 +202,45 @@ for LIB in ${ASSET_BUILDER_LIBS[@]}; do
|
||||||
LIB_NAME="$(echo ${LIB} | cut -d "|" -f 1)"
|
LIB_NAME="$(echo ${LIB} | cut -d "|" -f 1)"
|
||||||
LIB_MIN_VERSION="$(echo ${LIB} | cut -d "|" -f 2)"
|
LIB_MIN_VERSION="$(echo ${LIB} | cut -d "|" -f 2)"
|
||||||
|
|
||||||
if ${HOST_PKG_CONFIG} --atleast-version "${LIB_MIN_VERSION}" "${LIB_NAME}"; then
|
if pkg-config --atleast-version "${LIB_MIN_VERSION}" "${LIB_NAME}"; then
|
||||||
echo " ${LIB_NAME} OK."
|
echo " ${LIB_NAME} OK."
|
||||||
else
|
else
|
||||||
exit_error_message "Library ${LIB_NAME} version >= ${LIB_MIN_VERSION} not found."
|
LIB_URL=$(echo $LIB | cut -d "|" -f 3)
|
||||||
|
|
||||||
|
if [ "${LIB_URL}" = "" ]; then
|
||||||
|
exit_error_message "Library ${LIB_NAME} version >= ${LIB_MIN_VERSION} was not found and no precompiled binaries are available."
|
||||||
|
else
|
||||||
|
LIB_DOWNLOAD_CHECKSUM=$(echo $LIB | cut -d "|" -f 4)
|
||||||
|
LIB_DOWNLOAD_FILENAME="$(echo ${LIB_URL} | rev | cut -d "/" -f 1 | rev)"
|
||||||
|
LIB_DOWNLOAD_PATH="${CACHE_DIR}/${TARGET_HOST}/${LIB_DOWNLOAD_FILENAME}"
|
||||||
|
|
||||||
|
case "${LIB_DOWNLOAD_FILENAME}" in
|
||||||
|
*.txz)
|
||||||
|
LIB_FOLDER_NAME="${LIB_DOWNLOAD_FILENAME%.txz}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit_error_message "File ${LIB_DOWNLOAD_FILENAME} extension substitution is not supported."
|
||||||
|
esac
|
||||||
|
LIB_PATH="${LIB_DIR}/${TARGET_HOST}/${LIB_FOLDER_NAME}"
|
||||||
|
|
||||||
|
echo " ${LIB_NAME} version >= ${LIB_MIN_VERSION} was not found but precompiled binaries are available."
|
||||||
|
|
||||||
|
if [ ! -f "${LIB_DOWNLOAD_PATH}" ]; then
|
||||||
|
echo " downloading from ${LIB_URL}."
|
||||||
|
mkdir -p "$(dirname "${LIB_DOWNLOAD_PATH}")"
|
||||||
|
wget -q -O"${LIB_DOWNLOAD_PATH}" "${LIB_URL}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "${LIB_DOWNLOAD_CHECKSUM} ${LIB_DOWNLOAD_PATH}" | md5sum --check &> /dev/null; then
|
||||||
|
echo " ${LIB_DOWNLOAD_PATH} OK."
|
||||||
|
else
|
||||||
|
rm -rf "${LIB_DOWNLOAD_PATH}"
|
||||||
|
exit_error_message "Failed to verify checksum of ${LIB_DOWNLOAD_PATH}."
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "${LIB_PATH}"
|
||||||
|
tar -xf "${LIB_DOWNLOAD_PATH}" -C "${LIB_PATH}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
@ -273,20 +263,50 @@ for LIB in ${TARGET_HOST_LIBS[@]}; do
|
||||||
LIB_NAME="$(echo ${LIB} | cut -d "|" -f 1)"
|
LIB_NAME="$(echo ${LIB} | cut -d "|" -f 1)"
|
||||||
LIB_MIN_VERSION="$(echo ${LIB} | cut -d "|" -f 2)"
|
LIB_MIN_VERSION="$(echo ${LIB} | cut -d "|" -f 2)"
|
||||||
|
|
||||||
if ${TARGET_HOST_PKG_CONFIG} --atleast-version "${LIB_MIN_VERSION}" "${LIB_NAME}"; then
|
if pkg-config --atleast-version "${LIB_MIN_VERSION}" "${LIB_NAME}"; then
|
||||||
echo " ${LIB_NAME} OK."
|
echo " ${LIB_NAME} OK."
|
||||||
else
|
else
|
||||||
exit_error_message "Library ${LIB_NAME} version >= ${LIB_MIN_VERSION} not found."
|
LIB_URL=$(echo $LIB | cut -d "|" -f 3)
|
||||||
|
|
||||||
|
if [ "${LIB_URL}" = "" ]; then
|
||||||
|
exit_error_message "Library ${LIB_NAME} version >= ${LIB_MIN_VERSION} was not found and no precompiled binaries are available."
|
||||||
|
else
|
||||||
|
LIB_DOWNLOAD_CHECKSUM=$(echo $LIB | cut -d "|" -f 4)
|
||||||
|
LIB_DOWNLOAD_FILENAME="$(echo ${LIB_URL} | rev | cut -d "/" -f 1 | rev)"
|
||||||
|
LIB_DOWNLOAD_PATH="${CACHE_DIR}/${TARGET_HOST}/${LIB_DOWNLOAD_FILENAME}"
|
||||||
|
|
||||||
|
case "${LIB_DOWNLOAD_FILENAME}" in
|
||||||
|
*.txz)
|
||||||
|
LIB_FOLDER_NAME="${LIB_DOWNLOAD_FILENAME%.txz}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit_error_message "File ${LIB_DOWNLOAD_FILENAME} extension substitution is not supported."
|
||||||
|
esac
|
||||||
|
LIB_PATH="${LIB_DIR}/${TARGET_HOST}/${LIB_FOLDER_NAME}"
|
||||||
|
|
||||||
|
echo " ${LIB_NAME} version >= ${LIB_MIN_VERSION} was not found but precompiled binaries are available."
|
||||||
|
|
||||||
|
if [ ! -f "${LIB_DOWNLOAD_PATH}" ]; then
|
||||||
|
echo " downloading from ${LIB_URL}."
|
||||||
|
mkdir -p "$(dirname "${LIB_DOWNLOAD_PATH}")"
|
||||||
|
wget -q -O"${LIB_DOWNLOAD_PATH}" "${LIB_URL}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if echo "${LIB_DOWNLOAD_CHECKSUM} ${LIB_DOWNLOAD_PATH}" | md5sum --check &> /dev/null; then
|
||||||
|
echo " ${LIB_DOWNLOAD_PATH} OK."
|
||||||
|
else
|
||||||
|
rm -rf "${LIB_DOWNLOAD_PATH}"
|
||||||
|
exit_error_message "Failed to verify checksum of ${LIB_DOWNLOAD_PATH}."
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "${LIB_PATH}"
|
||||||
|
tar -xf "${LIB_DOWNLOAD_PATH}" -C "${LIB_PATH}"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
#
|
|
||||||
# Config file
|
|
||||||
#
|
|
||||||
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo "Writing config file."
|
echo "Writing config file."
|
||||||
|
echo
|
||||||
echo "${CONFIG_FILE}:"
|
echo "${CONFIG_FILE}:"
|
||||||
echo "\`\`\`"
|
echo "\`\`\`"
|
||||||
|
|
||||||
|
|
@ -294,29 +314,17 @@ tee "${CONFIG_FILE}" <<EOF
|
||||||
# This file was generated by the configure script.
|
# This file was generated by the configure script.
|
||||||
|
|
||||||
TARGET_HOST = ${TARGET_HOST}
|
TARGET_HOST = ${TARGET_HOST}
|
||||||
|
LIB_OUTPUT_EXT = ${LIB_OUTPUT_EXT}
|
||||||
OUTPUT_EXT = ${OUTPUT_EXT}
|
|
||||||
DYNAMIC_LIB_OUTPUT_EXT = ${DYNAMIC_LIB_OUTPUT_EXT}
|
|
||||||
STATIC_LIB_OUTPUT_EXT = ${STATIC_LIB_OUTPUT_EXT}
|
|
||||||
|
|
||||||
TARGET_HOST_CC = ${TARGET_HOST_CC}
|
TARGET_HOST_CC = ${TARGET_HOST_CC}
|
||||||
TARGET_HOST_AR = ${TARGET_HOST_AR}
|
TARGET_HOST_AR = ${TARGET_HOST_AR}
|
||||||
|
TARGET_HOST_CFLAGS = ${TARGET_HOST_CFLAGS[@]}
|
||||||
TARGET_HOST_CFLAGS = ${TARGET_HOST_CFLAGS[@]} $(${TARGET_HOST_PKG_CONFIG} --cflags $(echo ${TARGET_HOST_LIBS[@]} | tr " " "\n" | cut -d "|" -f 1))
|
TARGET_HOST_LDFLAGS = ${TARGET_HOST_LDFLAGS[@]}
|
||||||
TARGET_HOST_LDFLAGS = ${TARGET_HOST_LDFLAGS[@]} $(${TARGET_HOST_PKG_CONFIG} --libs $(echo ${TARGET_HOST_LIBS[@]} | tr " " "\n" | cut -d "|" -f 1))
|
|
||||||
|
|
||||||
HOST_CC = ${HOST_CC}
|
HOST_CC = ${HOST_CC}
|
||||||
|
|
||||||
ASSET_BUILDER_CFLAGS = ${ASSET_BUILDER_CFLAGS[@]} $(${HOST_PKG_CONFIG} --cflags $(echo ${ASSET_BUILDER_LIBS[@]} | tr " " "\n" | cut -d "|" -f 1))
|
ASSET_BUILDER_CFLAGS = ${ASSET_BUILDER_CFLAGS[@]}
|
||||||
ASSET_BUILDER_LDFLAGS = ${ASSET_BUILDER_LDFLAGS[@]} $(${HOST_PKG_CONFIG} --libs $(echo ${ASSET_BUILDER_LIBS[@]} | tr " " "\n" | cut -d "|" -f 1))
|
ASSET_BUILDER_LDFLAGS = ${ASSET_BUILDER_LDFLAGS[@]}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
if [ "${HOST}" = "windows" ]; then
|
|
||||||
tee -a "${CONFIG_FILE}" <<EOF
|
|
||||||
|
|
||||||
# OS specific options
|
|
||||||
ECHO_OPTION = -e
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "\`\`\`"
|
echo "\`\`\`"
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,14 @@ endif
|
||||||
$(LIBCORE): $(OBJECTS)
|
$(LIBCORE): $(OBJECTS)
|
||||||
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1))))
|
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1))))
|
||||||
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES)))))
|
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES)))))
|
||||||
@echo $(ECHO_OPTION) "[$(PERCENTAGE)%] $(YELLOW)Creating Static Lib $@$(RESET)"
|
@echo "[$(PERCENTAGE)%] $(YELLOW)Creating Static Lib $@$(RESET)"
|
||||||
$(Q)$(TARGET_HOST_AR) rcs $@ $(OBJECTS)
|
$(Q)$(TARGET_HOST_AR) rcs $@ $(OBJECTS)
|
||||||
|
|
||||||
$(BUILD_DIR)/$(notdir $(CORE_DIR))/%.o: $(CORE_DIR)/%
|
$(BUILD_DIR)/$(notdir $(CORE_DIR))/%.o: $(CORE_DIR)/%
|
||||||
$(Q)mkdir -p $(dir $@)
|
$(Q)mkdir -p $(dir $@)
|
||||||
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1))))
|
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1))))
|
||||||
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES)))))
|
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES)))))
|
||||||
@echo $(ECHO_OPTION) "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
@echo "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
||||||
$(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@
|
$(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@
|
||||||
|
|
||||||
-include $(OBJECTS:.o=.d)
|
-include $(OBJECTS:.o=.d)
|
||||||
|
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
SOURCES += $(addprefix host/$(TARGET_HOST)/, \
|
|
||||||
display.c \
|
|
||||||
vector2d.c \
|
|
||||||
texture.c \
|
|
||||||
inputs.c \
|
|
||||||
update_time.c \
|
|
||||||
)
|
|
||||||
|
|
@ -1,193 +0,0 @@
|
||||||
#include "display.h"
|
|
||||||
|
|
||||||
#include <SDL3/SDL.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "asset_manager.h"
|
|
||||||
#include "game.h"
|
|
||||||
#include "texture.h"
|
|
||||||
#include "errors.h"
|
|
||||||
|
|
||||||
inline int display_init(void)
|
|
||||||
{
|
|
||||||
if(!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS))
|
|
||||||
{
|
|
||||||
error_printf("Failed to initialise SDL3 : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!SDL_SetAppMetadata("2D_Engine_SDL3_Core", "1.0", "2D_Engine"))
|
|
||||||
{
|
|
||||||
error_printf("Failed to set app metadata : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
game.display.window = SDL_CreateWindow("2D_Engine", DISPLAY_WIDTH, DISPLAY_HEIGHT, 0);
|
|
||||||
if(!game.display.window)
|
|
||||||
{
|
|
||||||
error_printf("Failed to create window : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DRIVERS
|
|
||||||
debug_printf("Listing available render drivers.");
|
|
||||||
const int NB_DRIVERS = SDL_GetNumRenderDrivers();
|
|
||||||
for(int i = 0; i < NB_DRIVERS; i++)
|
|
||||||
debug_printf("%d : %s", i, SDL_GetRenderDriver(i));
|
|
||||||
|
|
||||||
warning_printf("This build of 2D_Engine_C only support the following drivers : %s", DRIVERS);
|
|
||||||
|
|
||||||
game.display.renderer = SDL_CreateRenderer(game.display.window, DRIVERS);
|
|
||||||
#else
|
|
||||||
game.display.renderer = SDL_CreateRenderer(game.display.window, NULL);
|
|
||||||
#endif // DRIVERS
|
|
||||||
|
|
||||||
if(!game.display.renderer)
|
|
||||||
{
|
|
||||||
error_printf("Failed to create renderer : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!SDL_SetRenderVSync(game.display.renderer, SDL_RENDERER_VSYNC_ADAPTIVE))
|
|
||||||
{
|
|
||||||
error_printf("Failed to activate adaptative vsync : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!SDL_SetRenderDrawBlendMode(game.display.renderer, SDL_BLENDMODE_BLEND))
|
|
||||||
{
|
|
||||||
error_printf("Failed to set renderer draw blend mode : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
if(!SDL_SetDefaultTextureScaleMode(game.display.renderer, SDL_SCALEMODE_NEAREST))
|
|
||||||
{
|
|
||||||
error_printf("Failed to set default texture scale mode : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
debug_printf("Initialized display.");
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void display_exit(void)
|
|
||||||
{
|
|
||||||
if(game.display.renderer) SDL_DestroyRenderer(game.display.renderer);
|
|
||||||
if(game.display.window) SDL_DestroyWindow(game.display.window);
|
|
||||||
SDL_Quit();
|
|
||||||
|
|
||||||
debug_printf("Exited display.");
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int display_clear(void)
|
|
||||||
{
|
|
||||||
if(!SDL_SetRenderDrawColor(game.display.renderer, C_WHITE, 255))
|
|
||||||
{
|
|
||||||
error_printf("Failed to change renderer draw color : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!SDL_RenderClear(game.display.renderer))
|
|
||||||
{
|
|
||||||
error_printf("Failed to clear renderer : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int display_update(void)
|
|
||||||
{
|
|
||||||
if(!SDL_RenderPresent(game.display.renderer))
|
|
||||||
{
|
|
||||||
error_printf("Failed to present renderer : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if DEBUG >= 1
|
|
||||||
float fps = 1000.0f / game.delta_time_ms;
|
|
||||||
static float max_fps_10s = 0.0f;
|
|
||||||
static float low_fps_10s = 10000000.0f;
|
|
||||||
|
|
||||||
if(fps > max_fps_10s) max_fps_10s = fps;
|
|
||||||
if(fps < low_fps_10s) low_fps_10s = fps;
|
|
||||||
|
|
||||||
static float fps_update_delta_time = 0.0f;
|
|
||||||
fps_update_delta_time += game.delta_time_ms;
|
|
||||||
|
|
||||||
if(fps_update_delta_time >= 100.0f)
|
|
||||||
{
|
|
||||||
fps_update_delta_time = 0.0f;
|
|
||||||
char title[100];
|
|
||||||
if(sprintf(title, "2D_Engine | cur: %.2ffps | max: %.2ffps | low: %.2ffps", fps, max_fps_10s, low_fps_10s) == -1)
|
|
||||||
{
|
|
||||||
error_printf("Sprintf failed : %d", errno);
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
if(!SDL_SetWindowTitle(game.display.window, title))
|
|
||||||
{
|
|
||||||
error_printf("Failed to set window title : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static float fps_max_low_update_delta_time = 0.0f;
|
|
||||||
fps_max_low_update_delta_time += game.delta_time_ms;
|
|
||||||
|
|
||||||
if(fps_max_low_update_delta_time > 10000.0f)
|
|
||||||
{
|
|
||||||
fps_max_low_update_delta_time = 0.0f;
|
|
||||||
max_fps_10s = 0.0f;
|
|
||||||
low_fps_10s = 10000000.0f;
|
|
||||||
}
|
|
||||||
#endif // DEBUG >= 1
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int display_draw_texture(texture_t *texture, const rect_t *src_rect, const rect_t *dst_rect, bool flip)
|
|
||||||
{
|
|
||||||
frect_t src_frect;
|
|
||||||
if(src_rect) rect_to_frect(src_rect, &src_frect);
|
|
||||||
|
|
||||||
frect_t dst_frect;
|
|
||||||
if(dst_rect)
|
|
||||||
dst_frect = (frect_t) {
|
|
||||||
.x = (dst_rect->x - game.camera.view_rect.x) * (DISPLAY_WIDTH / game.camera.view_rect.w),
|
|
||||||
.y = (dst_rect->y - game.camera.view_rect.y) * (DISPLAY_HEIGHT / game.camera.view_rect.h),
|
|
||||||
.w = dst_rect->w * (DISPLAY_WIDTH / game.camera.view_rect.w),
|
|
||||||
.h = dst_rect->h * (DISPLAY_HEIGHT / game.camera.view_rect.h)
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!SDL_RenderTextureRotated(game.display.renderer, texture, src_rect ? &src_frect : NULL, dst_rect ? &dst_frect : NULL, 0, NULL, flip))
|
|
||||||
{
|
|
||||||
error_printf("Failed to copy texture to renderer : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
int display_draw_frect(const frect_t *frect, unsigned int r, unsigned int g, unsigned int b, unsigned int a)
|
|
||||||
{
|
|
||||||
if(!SDL_SetRenderDrawColor(game.display.renderer, r, g, b, a))
|
|
||||||
{
|
|
||||||
error_printf("Failed to change renderer draw color : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
frect_t display_frect = {
|
|
||||||
.x = (frect->x - game.camera.view_rect.x) * (DISPLAY_WIDTH / game.camera.view_rect.w),
|
|
||||||
.y = (frect->y - game.camera.view_rect.y) * (DISPLAY_HEIGHT / game.camera.view_rect.h),
|
|
||||||
.w = frect->w * (DISPLAY_WIDTH / game.camera.view_rect.w),
|
|
||||||
.h = frect->h * (DISPLAY_HEIGHT / game.camera.view_rect.h)
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!SDL_RenderRect(game.display.renderer, &display_frect))
|
|
||||||
{
|
|
||||||
error_printf("Failed to draw rectangle to renderer : %s", SDL_GetError());
|
|
||||||
return EXIT_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
#ifndef DISPLAY_H
|
|
||||||
#define DISPLAY_H
|
|
||||||
|
|
||||||
#include <SDL3/SDL_render.h>
|
|
||||||
#include "texture.h"
|
|
||||||
#include "vector2d.h"
|
|
||||||
|
|
||||||
#define C_BLACK 0, 0, 0
|
|
||||||
#define C_RED 255, 0, 0
|
|
||||||
#define C_GREEN 0, 255, 0
|
|
||||||
#define C_BLUE 0, 0, 255
|
|
||||||
#define C_WHITE 255, 255, 255
|
|
||||||
|
|
||||||
#define DISPLAY_WIDTH 720
|
|
||||||
#define DISPLAY_HEIGHT 480
|
|
||||||
|
|
||||||
typedef struct display_t {
|
|
||||||
SDL_Window *window;
|
|
||||||
SDL_Renderer *renderer;
|
|
||||||
} display_t;
|
|
||||||
|
|
||||||
int display_init(void);
|
|
||||||
void display_exit(void);
|
|
||||||
|
|
||||||
int display_clear(void);
|
|
||||||
int display_update(void);
|
|
||||||
|
|
||||||
int display_draw_texture(texture_t *texture, const rect_t *src_rect, const rect_t *dst_rect, bool flip);
|
|
||||||
int display_draw_frect(const frect_t *frect, unsigned int r, unsigned int g, unsigned int b, unsigned int a);
|
|
||||||
|
|
||||||
#endif // DISPLAY_H
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
||||||
#include "inputs.h"
|
|
||||||
|
|
||||||
#include <SDL3/SDL_events.h>
|
|
||||||
|
|
||||||
inline int poll_event(input_event_t *event)
|
|
||||||
{
|
|
||||||
SDL_Event sdl_event;
|
|
||||||
int ret = SDL_PollEvent(&sdl_event);
|
|
||||||
|
|
||||||
event->type = sdl_event.type;
|
|
||||||
event->key = sdl_event.key.scancode;
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
#ifndef KEYBOARD_H
|
|
||||||
#define KEYBOARD_H
|
|
||||||
|
|
||||||
#include "keycodes.h"
|
|
||||||
|
|
||||||
typedef struct input_event_t {
|
|
||||||
uint32_t type;
|
|
||||||
int key;
|
|
||||||
} input_event_t;
|
|
||||||
|
|
||||||
int poll_event(input_event_t *event);
|
|
||||||
|
|
||||||
typedef struct inputs_t {
|
|
||||||
bool keys[MAX_KEYCODES];
|
|
||||||
} inputs_t;
|
|
||||||
|
|
||||||
#endif // KEYBOARD_H
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
#ifndef KEYCODES_H
|
|
||||||
#define KEYCODES_H
|
|
||||||
|
|
||||||
#include <SDL3/SDL_events.h>
|
|
||||||
|
|
||||||
#define MAX_KEYCODES SDL_SCANCODE_COUNT
|
|
||||||
|
|
||||||
#define KEY_UP SDL_SCANCODE_W
|
|
||||||
#define KEY_DOWN SDL_SCANCODE_S
|
|
||||||
#define KEY_LEFT SDL_SCANCODE_A
|
|
||||||
#define KEY_RIGHT SDL_SCANCODE_D
|
|
||||||
#define KEY_MOD SDL_SCANCODE_LCTRL
|
|
||||||
#define KEY_INTERACT SDL_SCANCODE_E
|
|
||||||
|
|
||||||
#define INPUT_EVENT_KEY_UP SDL_EVENT_KEY_UP
|
|
||||||
#define INPUT_EVENT_KEY_DOWN SDL_EVENT_KEY_DOWN
|
|
||||||
#define INPUT_EVENT_QUIT SDL_EVENT_QUIT
|
|
||||||
|
|
||||||
#endif // KEYCODES_H
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef MEMORY_ALLOC_H
|
|
||||||
#define MEMORY_ALLOC_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#endif // MEMORY_ALLOC_H
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
#include "texture.h"
|
|
||||||
|
|
||||||
#include "asset_manager.h"
|
|
||||||
#include "game.h"
|
|
||||||
#include "display.h"
|
|
||||||
#include "errors.h"
|
|
||||||
|
|
||||||
texture_t *load_texture(void)
|
|
||||||
{
|
|
||||||
uint16_t width, height;
|
|
||||||
|
|
||||||
if(fread(&width, sizeof(width), 1, game.asset_manager.asset_file) != 1)
|
|
||||||
{
|
|
||||||
error_printf("Failed to read in asset file.");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fread(&height, sizeof(height), 1, game.asset_manager.asset_file) != 1)
|
|
||||||
{
|
|
||||||
error_printf("Failed to read in asset file.");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_Surface *tmp_surface = SDL_CreateSurface(width, height, SDL_PIXELFORMAT_RGB565);
|
|
||||||
if(!tmp_surface)
|
|
||||||
{
|
|
||||||
error_printf("Failed to create temporary surface : %s", SDL_GetError());
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!SDL_LockSurface(tmp_surface))
|
|
||||||
{
|
|
||||||
error_printf("Failed to lock temporary surface : %s", SDL_GetError());
|
|
||||||
goto_failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(fread(tmp_surface->pixels, sizeof(uint16_t), width * height, game.asset_manager.asset_file) != (size_t)width * (size_t)height)
|
|
||||||
{
|
|
||||||
error_printf("Failed to read asset file.");
|
|
||||||
goto_failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!SDL_SetSurfaceColorKey(tmp_surface, true, TEXTURE_TRANSPARENT_COLOR))
|
|
||||||
{
|
|
||||||
error_printf("Failed to set color key of temporary surface : %s", SDL_GetError());
|
|
||||||
goto_failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
texture_t *texture = SDL_CreateTextureFromSurface(game.display.renderer, tmp_surface);
|
|
||||||
if(!texture)
|
|
||||||
{
|
|
||||||
error_printf("Failed to create texture from temporary surface : %s", SDL_GetError());
|
|
||||||
goto_failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_DestroySurface(tmp_surface);
|
|
||||||
return texture;
|
|
||||||
|
|
||||||
failure:
|
|
||||||
SDL_DestroySurface(tmp_surface);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void destroy_texture(texture_t *texture)
|
|
||||||
{
|
|
||||||
SDL_DestroyTexture(texture);
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
#ifndef TEXTURE_H
|
|
||||||
#define TEXTURE_H
|
|
||||||
|
|
||||||
#include <SDL3/SDL_render.h>
|
|
||||||
|
|
||||||
#define TEXTURE_TRANSPARENT_COLOR 0x0001
|
|
||||||
|
|
||||||
typedef SDL_Texture texture_t;
|
|
||||||
|
|
||||||
#define get_width(T) T->w
|
|
||||||
#define get_height(T) T->h
|
|
||||||
|
|
||||||
texture_t *load_texture(void);
|
|
||||||
void destroy_texture(texture_t *texture);
|
|
||||||
|
|
||||||
#endif // TEXTURE_H
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
#include "update_time.h"
|
|
||||||
|
|
||||||
#include <SDL3/SDL.h>
|
|
||||||
#include "game.h"
|
|
||||||
|
|
||||||
inline void update_time(void)
|
|
||||||
{
|
|
||||||
static uint64_t last_clock_state = 0;
|
|
||||||
uint64_t start_clock = SDL_GetTicksNS();
|
|
||||||
game.delta_time_ms = SDL_NS_TO_MS((float)(start_clock - last_clock_state));
|
|
||||||
if(game.delta_time_ms > 100.0f) game.delta_time_ms = 100.0f;
|
|
||||||
last_clock_state = start_clock;
|
|
||||||
}
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
#ifndef TIME_H
|
|
||||||
#define TIME_H
|
|
||||||
|
|
||||||
void update_time(void);
|
|
||||||
|
|
||||||
#endif // TIME_H
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
#include "vector2d.h"
|
|
||||||
|
|
||||||
void frect_to_rect(const frect_t *frect, rect_t *rect)
|
|
||||||
{
|
|
||||||
rect->x = (int)frect->x;
|
|
||||||
rect->y = (int)frect->y;
|
|
||||||
rect->w = (int)frect->w;
|
|
||||||
rect->h = (int)frect->h;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float lerp(float a, float b, float s)
|
|
||||||
{
|
|
||||||
return a * (1 - s) + b * s;
|
|
||||||
}
|
|
||||||
|
|
||||||
inline float lerp_time(float a, float b, float s, float t)
|
|
||||||
{
|
|
||||||
return lerp(a, b, 1 - powf(1 - s, t * 60.0f));
|
|
||||||
}
|
|
||||||
|
|
@ -1,153 +0,0 @@
|
||||||
#ifndef VECTOR2D_H
|
|
||||||
#define VECTOR2D_H
|
|
||||||
|
|
||||||
#include <SDL3/SDL_rect.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Point struct. (int)
|
|
||||||
*
|
|
||||||
* @param x X pos
|
|
||||||
* @param y Y pos
|
|
||||||
*/
|
|
||||||
typedef SDL_Point vector2d_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Point struct. (float)
|
|
||||||
*
|
|
||||||
* @param x X pos
|
|
||||||
* @param y Y pos
|
|
||||||
*/
|
|
||||||
typedef SDL_FPoint fvector2d_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Rectangle struct. (int)
|
|
||||||
*
|
|
||||||
* @param x X pos
|
|
||||||
* @param y Y pos
|
|
||||||
* @param w Width
|
|
||||||
* @param h Height
|
|
||||||
*/
|
|
||||||
typedef SDL_Rect rect_t;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Rectangle struct. (float)
|
|
||||||
*
|
|
||||||
* @param x X pos
|
|
||||||
* @param y Y pos
|
|
||||||
* @param w Width
|
|
||||||
* @param h Height
|
|
||||||
*/
|
|
||||||
typedef SDL_FRect frect_t;
|
|
||||||
|
|
||||||
#define EPSILON 0.0f
|
|
||||||
|
|
||||||
#define f_is_zero(X) (fabsf(X) <= EPSILON)
|
|
||||||
|
|
||||||
#define f_is_not_zero(X) (fabsf(X) > EPSILON)
|
|
||||||
|
|
||||||
#define rect_to_frect(R, FR) SDL_RectToFRect(R, FR)
|
|
||||||
|
|
||||||
void frect_to_rect(const frect_t *frect, rect_t *rect);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Verify if a point is in a rectangle. (int)
|
|
||||||
*
|
|
||||||
* @param P Vector2d
|
|
||||||
* @param R Rectangle
|
|
||||||
*
|
|
||||||
* @return True if the point is in the rectangle, else false.
|
|
||||||
*/
|
|
||||||
#define point_in_rect(P, R) SDL_PointInRect(P, R)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Verify if a point is in a rectangle. (float)
|
|
||||||
*
|
|
||||||
* @param P Vector2d
|
|
||||||
* @param R Rectangle
|
|
||||||
*
|
|
||||||
* @return True if the point is in the rectangle, else false.
|
|
||||||
*/
|
|
||||||
#define fpoint_in_frect(P, R) SDL_PointInRectF(P, R)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Verify if a rectangle is empty
|
|
||||||
*
|
|
||||||
* @param R Rectangle
|
|
||||||
*
|
|
||||||
* @return True if the rectangle is empty, else false.
|
|
||||||
*/
|
|
||||||
#define rect_empty(R) SDL_RectEmpty(R)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Verify if a rectangle is empty
|
|
||||||
*
|
|
||||||
* @param R Rectangle
|
|
||||||
*
|
|
||||||
* @return True if the rectangle is empty, else false.
|
|
||||||
*/
|
|
||||||
#define frect_empty(R) SDL_FRectEmpty(R)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Verify if there is a intersction between two rectangles. (int)
|
|
||||||
*
|
|
||||||
* @param A Rectangle A
|
|
||||||
* @param B Rectangle B
|
|
||||||
*
|
|
||||||
* @return True if there is an intersection, else false.
|
|
||||||
*/
|
|
||||||
#define has_intersection(A, B) SDL_HasRectIntersection(A, B)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Verify if there is a intersction between two rectangles. (float)
|
|
||||||
*
|
|
||||||
* @param A Rectangle A
|
|
||||||
* @param B Rectangle B
|
|
||||||
*
|
|
||||||
* @return True if there is an intersection, else false.
|
|
||||||
*/
|
|
||||||
#define fhas_intersection(A, B) SDL_HasRectIntersectionFloat(A, B)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Verify if there is an intersection between two rectangles and get the intersection rectangle. (int)
|
|
||||||
*
|
|
||||||
* @param A Rectangle A
|
|
||||||
* @param B Rectangle B
|
|
||||||
* @param result The intersection rectangle
|
|
||||||
*
|
|
||||||
* @return True if there is an intersection, else false.
|
|
||||||
*/
|
|
||||||
#define intersect_rect(A, B, result) SDL_GetRectIntersection(A, B, result)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Verify if there is an intersection between two rectangles and get the intersection rectangle. (float)
|
|
||||||
*
|
|
||||||
* @param A Rectangle A
|
|
||||||
* @param B Rectangle B
|
|
||||||
* @param result The intersection rectangle
|
|
||||||
*
|
|
||||||
* @return True if there is an intersection, else false.
|
|
||||||
*/
|
|
||||||
#define intersect_frect(A, B, result) SDL_GetRectIntersectionFloat(A, B, result)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Lerp a to b with smoothing factor s.
|
|
||||||
*
|
|
||||||
* @param a Current value
|
|
||||||
* @param b Target value
|
|
||||||
* @param s Smoothing factor
|
|
||||||
*/
|
|
||||||
float lerp(float a, float b, float s);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Lerp a to b with smoothing factor s and time basis t.
|
|
||||||
* Smoothing factor is for 60 fps call time.
|
|
||||||
*
|
|
||||||
* @param a Current value
|
|
||||||
* @param b Target value
|
|
||||||
* @param s Smoothing factor
|
|
||||||
* @param t Delta time
|
|
||||||
*/
|
|
||||||
float lerp_time(float a, float b, float s, float t);
|
|
||||||
|
|
||||||
#endif // VECTOR2D_H
|
|
||||||
|
|
@ -23,14 +23,14 @@ TOTAL_BUILD_FILES := $(shell echo $$(($$($(MAKE) -n $(OBJECTS) TOTAL_BUILD_FILES
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(OUTPUT): $(OBJECTS) $(LIBCORE)
|
$(OUTPUT): $(OBJECTS) $(LIBCORE)
|
||||||
@echo $(ECHO_OPTION) "[100%] $(YELLOW)Linking $(notdir $(OUTPUT))$(RESET)"
|
@echo "[100%] $(YELLOW)Linking $(notdir $(OUTPUT))$(RESET)"
|
||||||
$(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(OBJECTS) -o $@ -L$(BUILD_DIR) -lcore $(TARGET_HOST_LDFLAGS)
|
$(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(OBJECTS) -o $@ -L$(BUILD_DIR) -lcore $(TARGET_HOST_LDFLAGS)
|
||||||
|
|
||||||
$(BUILD_DIR)/$(notdir $(SOURCE_DIR))/%.o: $(SOURCE_DIR)/%
|
$(BUILD_DIR)/$(notdir $(SOURCE_DIR))/%.o: $(SOURCE_DIR)/%
|
||||||
$(Q)mkdir -p $(dir $@)
|
$(Q)mkdir -p $(dir $@)
|
||||||
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1))))
|
$(eval CURRENT_FILE := $(shell echo $$(($(CURRENT_FILE) + 1))))
|
||||||
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES)))))
|
$(eval PERCENTAGE := $(shell echo $$(($(CURRENT_FILE) * 100 / $(TOTAL_BUILD_FILES)))))
|
||||||
@echo $(ECHO_OPTION) "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
@echo "[$(PERCENTAGE)%] $(GREEN)Building C object $@$(RESET)"
|
||||||
$(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@
|
$(Q)$(TARGET_HOST_CC) $(TARGET_HOST_CFLAGS) $(INCLUDES:%=-I%) -MMD -MP -c $< -o $@
|
||||||
|
|
||||||
$(LIBCORE): FORCE
|
$(LIBCORE): FORCE
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue