mirror of https://github.com/zeldaret/tmc.git
Improve compilation time of asset_processor
By splitting it up into object files and letting them be compiled in parallel. Also only rebuild the parts that changed.
This commit is contained in:
parent
24e1a6091c
commit
91ad7860b2
6
Makefile
6
Makefile
|
@ -89,6 +89,7 @@ SCANINC := tools/scaninc/scaninc
|
||||||
# TODO: use charmap?
|
# TODO: use charmap?
|
||||||
PREPROC := tools/preproc/preproc
|
PREPROC := tools/preproc/preproc
|
||||||
FIX := tools/gbafix/gbafix
|
FIX := tools/gbafix/gbafix
|
||||||
|
ASSET_PROCESSOR := tools/asset_processor/asset_processor
|
||||||
|
|
||||||
# Clear the default suffixes
|
# Clear the default suffixes
|
||||||
.SUFFIXES:
|
.SUFFIXES:
|
||||||
|
@ -168,13 +169,14 @@ compare: $(ROM)
|
||||||
|
|
||||||
setup: $(TOOLDIRS)
|
setup: $(TOOLDIRS)
|
||||||
|
|
||||||
|
# Automatically extract binary data
|
||||||
build/extracted_assets_%: assets/assets.json assets/gfx.json assets/map.json assets/samples.json assets/sounds.json
|
build/extracted_assets_%: assets/assets.json assets/gfx.json assets/map.json assets/samples.json assets/sounds.json
|
||||||
tools/asset_processor/asset_processor extract $(GAME_VERSION) $(ASSET_BUILDDIR)
|
$(ASSET_PROCESSOR) extract $(GAME_VERSION) $(ASSET_BUILDDIR)
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
# Extract assets to human readable form
|
# Extract assets to human readable form
|
||||||
extractassets:
|
extractassets:
|
||||||
tools/asset_processor/asset_processor convert $(GAME_VERSION) $(ASSET_BUILDDIR)
|
$(ASSET_PROCESSOR) convert $(GAME_VERSION) $(ASSET_BUILDDIR)
|
||||||
|
|
||||||
$(TOOLDIRS):
|
$(TOOLDIRS):
|
||||||
@$(MAKE) -C $@
|
@$(MAKE) -C $@
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
asset_processor
|
asset_processor
|
||||||
|
build/
|
|
@ -3,19 +3,32 @@ CXX = g++
|
||||||
CXXFLAGS = -O3 -Wall -Wextra -std=c++17
|
CXXFLAGS = -O3 -Wall -Wextra -std=c++17
|
||||||
#CXXFLAGS += -g # debug
|
#CXXFLAGS += -g # debug
|
||||||
|
|
||||||
|
BUILD_FOLDER=build
|
||||||
|
|
||||||
SRCS = $(wildcard *.cpp)
|
SRCS = $(wildcard *.cpp)
|
||||||
HEADERS = $(wildcard *.h)
|
|
||||||
SRCS += $(wildcard assets/*.cpp)
|
SRCS += $(wildcard assets/*.cpp)
|
||||||
HEADERS += $(wildcard assets/*.h)
|
|
||||||
|
OBJS := $(patsubst %.cpp,$(BUILD_FOLDER)/%.o,$(SRCS))
|
||||||
|
|
||||||
INCLUDES = -I./
|
INCLUDES = -I./
|
||||||
|
|
||||||
|
# Create build dirs
|
||||||
|
$(shell mkdir -p $(dir $(OBJS)) >/dev/null)
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
|
|
||||||
all: asset_processor
|
all: asset_processor
|
||||||
|
|
||||||
asset_processor: $(SRCS) $(HEADERS)
|
asset_processor: $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(INCLUDES) -o asset_processor $(SRCS) -lstdc++fs
|
$(CXX) -o asset_processor $(OBJS) -lstdc++fs
|
||||||
|
|
||||||
|
$(BUILD_FOLDER)/%.o: %.cpp
|
||||||
|
$(CXX) $(CXXFLAGS) $(INCLUDES) -c -o $@ $<
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) asset_processor asset_processor.exe
|
$(RM) asset_processor asset_processor.exe
|
||||||
|
$(RM) -r $(BUILD_FOLDER)
|
||||||
|
|
||||||
|
# Automatic dependencies
|
||||||
|
CXXFLAGS += -MMD
|
||||||
|
-include $(OBJS:.o=.d)
|
|
@ -3,13 +3,13 @@
|
||||||
|
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <json.hpp>
|
#include <json_fwd.hpp>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
class BaseAsset {
|
class BaseAsset {
|
||||||
public:
|
public:
|
||||||
BaseAsset(std::filesystem::path path, int start, int size, nlohmann::json asset)
|
BaseAsset(std::filesystem::path path, int start, int size, const nlohmann::json& asset)
|
||||||
: path(path), start(start), size(size), asset(asset) {
|
: path(path), start(start), size(size), asset(asset) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ class BaseAsset {
|
||||||
std::filesystem::path buildPath;
|
std::filesystem::path buildPath;
|
||||||
int start;
|
int start;
|
||||||
int size;
|
int size;
|
||||||
nlohmann::json asset;
|
const nlohmann::json& asset;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
virtual std::filesystem::path generateAssetPath() {
|
virtual std::filesystem::path generateAssetPath() {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#include "gfx.h"
|
#include "gfx.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
#include <json.hpp>
|
||||||
|
|
||||||
std::filesystem::path GfxAsset::generateAssetPath() {
|
std::filesystem::path GfxAsset::generateAssetPath() {
|
||||||
std::filesystem::path pngPath = this->path;
|
std::filesystem::path pngPath = this->path;
|
||||||
|
@ -18,10 +19,12 @@ void GfxAsset::convertToHumanReadable(const std::vector<char>& baserom) {
|
||||||
cmd.push_back(toolsPath / "gbagfx" / "gbagfx");
|
cmd.push_back(toolsPath / "gbagfx" / "gbagfx");
|
||||||
cmd.push_back(this->path);
|
cmd.push_back(this->path);
|
||||||
cmd.push_back(this->assetPath);
|
cmd.push_back(this->assetPath);
|
||||||
|
if (this->asset.contains("options")) {
|
||||||
for (const auto& it : this->asset["options"].items()) {
|
for (const auto& it : this->asset["options"].items()) {
|
||||||
cmd.push_back("-" + it.key());
|
cmd.push_back("-" + it.key());
|
||||||
cmd.push_back(to_string(it.value()));
|
cmd.push_back(to_string(it.value()));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
check_call(cmd);
|
check_call(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
#include "midi.h"
|
#include "midi.h"
|
||||||
#include "main.h"
|
|
||||||
#include "reader.h"
|
#include "reader.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <json.hpp>
|
||||||
|
|
||||||
|
extern std::string gBaseromPath;
|
||||||
|
|
||||||
std::filesystem::path MidiAsset::generateAssetPath() {
|
std::filesystem::path MidiAsset::generateAssetPath() {
|
||||||
std::filesystem::path path = this->path;
|
std::filesystem::path path = this->path;
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_
|
||||||
|
#define INCLUDE_NLOHMANN_JSON_FWD_HPP_
|
||||||
|
|
||||||
|
#include <cstdint> // int64_t, uint64_t
|
||||||
|
#include <map> // map
|
||||||
|
#include <memory> // allocator
|
||||||
|
#include <string> // string
|
||||||
|
#include <vector> // vector
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief namespace for Niels Lohmann
|
||||||
|
@see https://github.com/nlohmann
|
||||||
|
@since version 1.0.0
|
||||||
|
*/
|
||||||
|
namespace nlohmann
|
||||||
|
{
|
||||||
|
/*!
|
||||||
|
@brief default JSONSerializer template argument
|
||||||
|
|
||||||
|
This serializer ignores the template arguments and uses ADL
|
||||||
|
([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl))
|
||||||
|
for serialization.
|
||||||
|
*/
|
||||||
|
template<typename T = void, typename SFINAE = void>
|
||||||
|
struct adl_serializer;
|
||||||
|
|
||||||
|
template<template<typename U, typename V, typename... Args> class ObjectType =
|
||||||
|
std::map,
|
||||||
|
template<typename U, typename... Args> class ArrayType = std::vector,
|
||||||
|
class StringType = std::string, class BooleanType = bool,
|
||||||
|
class NumberIntegerType = std::int64_t,
|
||||||
|
class NumberUnsignedType = std::uint64_t,
|
||||||
|
class NumberFloatType = double,
|
||||||
|
template<typename U> class AllocatorType = std::allocator,
|
||||||
|
template<typename T, typename SFINAE = void> class JSONSerializer =
|
||||||
|
adl_serializer,
|
||||||
|
class BinaryType = std::vector<std::uint8_t>>
|
||||||
|
class basic_json;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief JSON Pointer
|
||||||
|
|
||||||
|
A JSON pointer defines a string syntax for identifying a specific value
|
||||||
|
within a JSON document. It can be used with functions `at` and
|
||||||
|
`operator[]`. Furthermore, JSON pointers are the base for JSON patches.
|
||||||
|
|
||||||
|
@sa [RFC 6901](https://tools.ietf.org/html/rfc6901)
|
||||||
|
|
||||||
|
@since version 2.0.0
|
||||||
|
*/
|
||||||
|
template<typename BasicJsonType>
|
||||||
|
class json_pointer;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief default JSON class
|
||||||
|
|
||||||
|
This type is the default specialization of the @ref basic_json class which
|
||||||
|
uses the standard template types.
|
||||||
|
|
||||||
|
@since version 1.0.0
|
||||||
|
*/
|
||||||
|
using json = basic_json<>;
|
||||||
|
|
||||||
|
template<class Key, class T, class IgnoredLess, class Allocator>
|
||||||
|
struct ordered_map;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief ordered JSON class
|
||||||
|
|
||||||
|
This type preserves the insertion order of object keys.
|
||||||
|
|
||||||
|
@since version 3.9.0
|
||||||
|
*/
|
||||||
|
using ordered_json = basic_json<nlohmann::ordered_map>;
|
||||||
|
|
||||||
|
} // namespace nlohmann
|
||||||
|
|
||||||
|
#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_
|
|
@ -18,12 +18,3 @@ void check_call(const std::vector<std::string>& cmd) {
|
||||||
std::exit(1);
|
std::exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://github.com/nlohmann/json/issues/642#issuecomment-311937344
|
|
||||||
std::string to_string(const nlohmann::json& j) {
|
|
||||||
if (j.type() == nlohmann::json::value_t::string) {
|
|
||||||
return j.get<std::string>();
|
|
||||||
}
|
|
||||||
|
|
||||||
return j.dump();
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef UTIL_H
|
#ifndef UTIL_H
|
||||||
#define UTIL_H
|
#define UTIL_H
|
||||||
|
|
||||||
#include <json.hpp>
|
#include <json_fwd.hpp>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
@ -20,8 +20,6 @@ typedef int64_t s64;
|
||||||
|
|
||||||
void check_call(const std::vector<std::string>& cmd);
|
void check_call(const std::vector<std::string>& cmd);
|
||||||
|
|
||||||
std::string to_string(const nlohmann::json& j);
|
|
||||||
|
|
||||||
template <typename... Args> std::string string_format(const std::string& format, Args... args) {
|
template <typename... Args> std::string string_format(const std::string& format, Args... args) {
|
||||||
int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; // Extra space for '\0'
|
int size_s = std::snprintf(nullptr, 0, format.c_str(), args...) + 1; // Extra space for '\0'
|
||||||
if (size_s <= 0) {
|
if (size_s <= 0) {
|
||||||
|
|
|
@ -33,15 +33,9 @@ enum class EventType
|
||||||
{
|
{
|
||||||
EndOfTie = 0x01,
|
EndOfTie = 0x01,
|
||||||
Label = 0x11,
|
Label = 0x11,
|
||||||
LoopEnd = 0x38,// To place it last if at the same time as other meta events, but before notes on the same frame
|
LoopEnd = 0x38, // To place it last if at the same time as other meta events, but before notes on the same frame
|
||||||
LoopEndBegin = 0x13,
|
LoopEndBegin = 0x13,
|
||||||
LoopBegin = 0x24,
|
LoopBegin = 0x24, // To place it last if at the same time as other meta events, but before notes on the same frame
|
||||||
// Original: 0x14
|
|
||||||
// TODO sfx1AA wants a LoopBegin before a Volume Change -> < 0x22
|
|
||||||
// bgmFestivalApproach wants a LoopBegin after a Tempo -> >0x19 -> 0x20
|
|
||||||
// sfxSparkles wants a LoopBegin after a VOL --> NOT POSSIBLE
|
|
||||||
// bgmCuccoMinigame as well
|
|
||||||
// To place it last if at the same time as other meta events, but before notes on the same frame
|
|
||||||
OriginalTimeSignature = 0x15,
|
OriginalTimeSignature = 0x15,
|
||||||
WholeNoteMark = 0x16,
|
WholeNoteMark = 0x16,
|
||||||
Pattern = 0x17,
|
Pattern = 0x17,
|
||||||
|
|
Loading…
Reference in New Issue