farmlands/build/prepareAssets.py

145 lines
4.2 KiB
Python
Executable File

#!/usr/bin/python3
import os
import sys
#
# Constants
#
ASSETS_DIR="assets"
RESOURCES_FILE="src/resources/Resources.g.h"
RESOURCES_FILE_HEADER=("// WARNING: This file is auto generated by the build/prepareAssets.py script.\n"
"#ifndef STORAGE_RESOURCES_G_H_\n"
"#define STORAGE_RESOURCES_G_H_\n"
"\n"
"#include <resources/ResourceInfo.h>\n"
"\n"
"namespace farmlands {\n"
"namespace resources {\n"
"\n")
RESOURCES_FILE_FOOTER=("\n"
"}\n"
"}\n"
"#endif /* STORAGE_RESOURCES_G_H_ */\n")
R_HEADER=(" /**\n"
" * This namespace contains all the resource IDs, used by the resource manager.\n"
" * The IDs are generated at build time by the 'prepareAssets.py' script.\n"
" */\n"
" namespace R {\n")
R_FOOTER=" }\n"
RINFO_HEADER=(" /**\n"
" * This array contains the names of all the files, and the corresponding file type.\n"
" */\n"
" const ResourceInfo RInfo[] = {\n")
RINFO_FOOTER=" };\n"
#
# File types
#
FILE_TYPES = [
([".png", ".bmp"], "Texture"),
([".level"], "Level"),
([".csv"], "LevelLayer"),
([".ttf"], "Font"),
]
#
# Capitalizes the given string by converting the first character to uppercase.
# It does not convert the other characters to lowercase.
#
def capitalize(s):
if len(s) == 0:
return s
return s[0].upper() + s[1:]
#
# Obtains the file type using FILE_TYPES constant
#
def getFileType(fileName):
ext = os.path.splitext(fileName)[1]
for (extensions, type) in FILE_TYPES:
if ext in extensions:
return type
return "None"
#
# Main routine
#
if __name__ == '__main__':
r = ""
rInfo = ""
rInfoBegin = ""
assetId = 0
print ("Preparing assets...")
# Build R and RInfo
for assetDir in os.listdir(ASSETS_DIR):
assetDirPath=os.path.join(ASSETS_DIR, assetDir)
# Warning for non-directories
if not os.path.isdir(assetDirPath):
sys.stderr.writeline("Warning: file {0} is in the root 'assets' folder, and it will not be imported.".format(assetDir))
continue
# Create R enum
assetIdBegin = assetId
rInfoBegin += " const int RInfo_{0}_Begin = {1};\n".format(capitalize(assetDir), assetIdBegin)
r += (" enum " + capitalize(assetDir) + "\n"
" {\n")
# Get items in directory
for (dir, dirs, files) in os.walk(assetDirPath):
# R prefix - remove assetDirPath from path, replace path separators with _
RdirPrefix = os.path.relpath(dir, assetDirPath)
RdirPrefix = RdirPrefix.replace("/", "_").replace("\\", "_")
if (RdirPrefix == "."):
RdirPrefix = ""
else:
RdirPrefix += "_"
for f in files:
if (f[0] == '.'):
continue
# Append to R
fResName = RdirPrefix + capitalize(os.path.splitext(f)[0])
r += " {0} = {1},\n".format(fResName, assetId)
assetId += 1
# RInfo path should be relative to assets directory
fPath = os.path.join(dir, f)
fPath = os.path.relpath(fPath, ASSETS_DIR)
fType = getFileType(f)
rInfo += " {{ \"{0}\", ResourceType::{1} }},\n".format(fPath, fType) # TODO: obtain resource type
# Finish R enum
r += " };\n"
# Build resource header file
resFile = RESOURCES_FILE_HEADER
resFile += R_HEADER + r + R_FOOTER
resFile += "\n" + rInfoBegin + "\n"
resFile += RINFO_HEADER + rInfo + RINFO_FOOTER
resFile += RESOURCES_FILE_FOOTER
# Write resource file
f = open(RESOURCES_FILE, "w")
f.write(resFile)
f.close()