Compare commits
1 Commits
david/clar
...
f5611b9d01
Author | SHA1 | Date | |
---|---|---|---|
f5611b9d01 |
23
Makefile
23
Makefile
@@ -14,7 +14,7 @@ endif
|
|||||||
PROJECT_PLAYER=./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME_CAP}
|
PROJECT_PLAYER=./build/${BC_VAR_CURRENT_BUILD}/bin/${BC_VAR_PROJECT_NAME_CAP}
|
||||||
|
|
||||||
.PHONY: pkg-gba
|
.PHONY: pkg-gba
|
||||||
pkg-gba: build-pack build-gba-player
|
pkg-gba: build
|
||||||
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/pkg-gba.py sample_project ${BC_VAR_PROJECT_NAME_CAP}
|
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/pkg-gba.py sample_project ${BC_VAR_PROJECT_NAME_CAP}
|
||||||
|
|
||||||
.PHONY: pkg-mac
|
.PHONY: pkg-mac
|
||||||
@@ -26,44 +26,25 @@ generate-studio-rsrc:
|
|||||||
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/file-to-cpp.py --rsrc src/olympic/studio/applib/src/rsrc.json
|
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/file-to-cpp.py --rsrc src/olympic/studio/applib/src/rsrc.json
|
||||||
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/file-to-cpp.py --rsrc src/nostalgia/studio/rsrc.json
|
${BC_CMD_ENVRUN} ${BC_PY3} ./util/scripts/file-to-cpp.py --rsrc src/nostalgia/studio/rsrc.json
|
||||||
|
|
||||||
.PHONY: build-gba-player
|
|
||||||
build-gba-player:
|
|
||||||
cmake --build ./build/gba-*
|
|
||||||
|
|
||||||
.PHONY: build-player
|
.PHONY: build-player
|
||||||
build-player:
|
build-player:
|
||||||
${BC_CMD_CMAKE_BUILD} ${BC_VAR_BUILD_PATH} ${BC_VAR_PROJECT_NAME_CAP}
|
${BC_CMD_CMAKE_BUILD} ${BC_VAR_BUILD_PATH} ${BC_VAR_PROJECT_NAME_CAP}
|
||||||
|
|
||||||
.PHONY: build-pack
|
|
||||||
build-pack:
|
|
||||||
cmake --build ./build/${BC_VAR_CURRENT_BUILD} --target ${BC_VAR_PROJECT_NAME}-pack
|
|
||||||
|
|
||||||
|
|
||||||
.PHONY: run
|
.PHONY: run
|
||||||
run: build-player
|
run: build-player
|
||||||
${PROJECT_PLAYER} sample_project
|
${PROJECT_PLAYER} sample_project
|
||||||
|
|
||||||
.PHONY: build-studio
|
|
||||||
build-studio:
|
|
||||||
cmake --build ./build/${BC_VAR_CURRENT_BUILD} --target ${BC_VAR_PROJECT_NAME_CAP}Studio
|
|
||||||
|
|
||||||
.PHONY: run-studio
|
.PHONY: run-studio
|
||||||
run-studio: build-studio
|
run-studio: build
|
||||||
${PROJECT_STUDIO}
|
${PROJECT_STUDIO}
|
||||||
|
|
||||||
.PHONY: gba-run
|
.PHONY: gba-run
|
||||||
gba-run: pkg-gba
|
gba-run: pkg-gba
|
||||||
${MGBA} ${BC_VAR_PROJECT_NAME_CAP}.gba
|
${MGBA} ${BC_VAR_PROJECT_NAME_CAP}.gba
|
||||||
|
|
||||||
.PHONY: debug
|
.PHONY: debug
|
||||||
debug: build
|
debug: build
|
||||||
${BC_CMD_HOST_DEBUGGER} ${PROJECT_PLAYER} sample_project
|
${BC_CMD_HOST_DEBUGGER} ${PROJECT_PLAYER} sample_project
|
||||||
|
|
||||||
.PHONY: debug-studio
|
.PHONY: debug-studio
|
||||||
debug-studio: build
|
debug-studio: build
|
||||||
${BC_CMD_HOST_DEBUGGER} ${PROJECT_STUDIO}
|
${BC_CMD_HOST_DEBUGGER} ${PROJECT_STUDIO}
|
||||||
|
|
||||||
|
|
||||||
.PHONY: configure-gba
|
.PHONY: configure-gba
|
||||||
configure-gba:
|
configure-gba:
|
||||||
${BC_CMD_SETUP_BUILD} --toolchain=deps/gbabuildcore/cmake/modules/GBA.cmake --target=gba --current_build=0 --build_type=release --build_root=${BC_VAR_BUILD_PATH}
|
${BC_CMD_SETUP_BUILD} --toolchain=deps/gbabuildcore/cmake/modules/GBA.cmake --target=gba --current_build=0 --build_type=release --build_root=${BC_VAR_BUILD_PATH}
|
||||||
|
2
deps/ox/src/ox/clargs/clargs.cpp
vendored
2
deps/ox/src/ox/clargs/clargs.cpp
vendored
@@ -40,7 +40,7 @@ ClArgs::ClArgs(ox::SpanView<const char*> args) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ClArgs::getBool(ox::StringViewCR arg, bool defaultValue) const noexcept {
|
bool ClArgs::getBool(ox::StringViewCR arg, bool defaultValue) const noexcept {
|
||||||
auto const [value, err] = m_bools.at(arg);
|
auto const [value, err] = m_ints.at(arg);
|
||||||
return !err ? *value : defaultValue;
|
return !err ? *value : defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
deps/ox/src/ox/fs/filesystem/filesystem.hpp
vendored
4
deps/ox/src/ox/fs/filesystem/filesystem.hpp
vendored
@@ -87,7 +87,7 @@ class FileSystem {
|
|||||||
return writeFilePath(path, buffer, size, FileType::NormalFile);
|
return writeFilePath(path, buffer, size, FileType::NormalFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
Error write(StringViewCR path, ox::SpanView<char> const&buff) noexcept {
|
Error write(StringViewCR path, ox::Span<char> const&buff) noexcept {
|
||||||
return write(path, buff.data(), buff.size(), FileType::NormalFile);
|
return write(path, buff.data(), buff.size(), FileType::NormalFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +95,7 @@ class FileSystem {
|
|||||||
return write(inode, buffer, size, FileType::NormalFile);
|
return write(inode, buffer, size, FileType::NormalFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
Error write(uint64_t inode, ox::SpanView<char> const&buff) noexcept {
|
Error write(uint64_t inode, ox::Span<char> const&buff) noexcept {
|
||||||
return write(inode, buff.data(), buff.size(), FileType::NormalFile);
|
return write(inode, buff.data(), buff.size(), FileType::NormalFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
1
deps/ox/src/ox/mc/test/tests.cpp
vendored
1
deps/ox/src/ox/mc/test/tests.cpp
vendored
@@ -157,6 +157,7 @@ std::map<ox::StringView, ox::Error(*)()> tests = {
|
|||||||
oxAssert(testIn.Int8 == testOut.Int8, "Int8 value mismatch");
|
oxAssert(testIn.Int8 == testOut.Int8, "Int8 value mismatch");
|
||||||
oxAssert(testIn.Union.Int == testOut.Union.Int, "Union.Int value mismatch");
|
oxAssert(testIn.Union.Int == testOut.Union.Int, "Union.Int value mismatch");
|
||||||
oxAssert(testIn.String == testOut.String, "String value mismatch");
|
oxAssert(testIn.String == testOut.String, "String value mismatch");
|
||||||
|
oxDebugf("{}", testOut.IString.size());
|
||||||
oxExpect(testIn.IString, testOut.IString);
|
oxExpect(testIn.IString, testOut.IString);
|
||||||
oxAssert(testIn.List[0] == testOut.List[0], "List[0] value mismatch");
|
oxAssert(testIn.List[0] == testOut.List[0], "List[0] value mismatch");
|
||||||
oxAssert(testIn.List[1] == testOut.List[1], "List[1] value mismatch");
|
oxAssert(testIn.List[1] == testOut.List[1], "List[1] value mismatch");
|
||||||
|
1
deps/ox/src/ox/oc/read.hpp
vendored
1
deps/ox/src/ox/oc/read.hpp
vendored
@@ -181,6 +181,7 @@ Error OrganicClawReader::field(const char *key, T *val) noexcept {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (Json::LogicError const&e) {
|
} catch (Json::LogicError const&e) {
|
||||||
|
oxDebugf("JSON error: {}", e.what());
|
||||||
err = ox::Error(1, "error reading JSON data");
|
err = ox::Error(1, "error reading JSON data");
|
||||||
}
|
}
|
||||||
++m_fieldIt;
|
++m_fieldIt;
|
||||||
|
2
deps/ox/src/ox/std/assert.cpp
vendored
2
deps/ox/src/ox/std/assert.cpp
vendored
@@ -33,7 +33,7 @@ void panic(StringViewCR file, int const line, StringViewCR panicMsg, Error const
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if __GNUC__ && !_WIN32
|
#if __GNUC__
|
||||||
__attribute__((weak))
|
__attribute__((weak))
|
||||||
#endif
|
#endif
|
||||||
void panic(const char *file, int const line, char const*panicMsg, Error const&err) noexcept {
|
void panic(const char *file, int const line, char const*panicMsg, Error const&err) noexcept {
|
||||||
|
38
deps/ox/src/ox/std/new.hpp
vendored
38
deps/ox/src/ox/std/new.hpp
vendored
@@ -30,49 +30,11 @@ constexpr void *operator new(std::size_t, void *addr) noexcept {
|
|||||||
constexpr void *operator new[](std::size_t, void *addr) noexcept {
|
constexpr void *operator new[](std::size_t, void *addr) noexcept {
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace std {
|
|
||||||
|
|
||||||
template<typename T>
|
|
||||||
[[nodiscard]]
|
|
||||||
constexpr T* launder(T* __p) noexcept {
|
|
||||||
return __builtin_launder(__p);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, typename... Args, bool noex>
|
|
||||||
void launder(T(*)(Args...) noexcept(noex)) = delete;
|
|
||||||
template<typename T, typename... Args, bool noex>
|
|
||||||
void launder(T(*)(Args......) noexcept(noex)) = delete;
|
|
||||||
void launder(void*) = delete;
|
|
||||||
void launder(void const*) = delete;
|
|
||||||
void launder(volatile void*) = delete;
|
|
||||||
void launder(volatile void const*) = delete;
|
|
||||||
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
/**
|
|
||||||
* Aliases type T in size and alignment to allow allocating space for a T
|
|
||||||
* without running the constructor.
|
|
||||||
*/
|
|
||||||
template<typename T, std::size_t sz = sizeof(T)>
|
|
||||||
struct alignas(alignof(T)) AllocAlias {
|
|
||||||
char buff[sz];
|
|
||||||
constexpr AllocAlias() noexcept = default;
|
|
||||||
[[nodiscard]]
|
|
||||||
auto data() noexcept {
|
|
||||||
return reinterpret_cast<T*>(this);
|
|
||||||
}
|
|
||||||
[[nodiscard]]
|
|
||||||
auto data() const noexcept {
|
|
||||||
return reinterpret_cast<T const*>(this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template<typename T, typename U = T, typename ...Args>
|
template<typename T, typename U = T, typename ...Args>
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr U *make(Args &&...args) noexcept {
|
constexpr U *make(Args &&...args) noexcept {
|
||||||
|
1
deps/ox/src/ox/std/test/tests.cpp
vendored
1
deps/ox/src/ox/std/test/tests.cpp
vendored
@@ -337,6 +337,7 @@ OX_CLANG_NOWARN_END
|
|||||||
oxExpect(si["asdf"], 0);
|
oxExpect(si["asdf"], 0);
|
||||||
oxAssert(si["aoeu"] == 100, "aoeu != 100");
|
oxAssert(si["aoeu"] == 100, "aoeu != 100");
|
||||||
auto si2 = si;
|
auto si2 = si;
|
||||||
|
oxDebugf("{}", si2["asdf"]);
|
||||||
oxExpect(si2["asdf"], 0);
|
oxExpect(si2["asdf"], 0);
|
||||||
oxAssert(si2["aoeu"] == 100, "aoeu != 100");
|
oxAssert(si2["aoeu"] == 100, "aoeu != 100");
|
||||||
ox::HashMap<int, int> ii;
|
ox::HashMap<int, int> ii;
|
||||||
|
4
deps/ox/src/ox/std/trace.hpp
vendored
4
deps/ox/src/ox/std/trace.hpp
vendored
@@ -268,7 +268,7 @@ using TraceStream = NullStream;
|
|||||||
|
|
||||||
inline void logError(const char *file, int line, const char *fmt, const Error &err) noexcept {
|
inline void logError(const char *file, int line, const char *fmt, const Error &err) noexcept {
|
||||||
if (err) {
|
if (err) {
|
||||||
TraceStream trc(file, line, "ox.error");
|
TraceStream trc(file, line, "ox::error");
|
||||||
if (err.src.file_name() != nullptr) {
|
if (err.src.file_name() != nullptr) {
|
||||||
trc << "Error: (" << err.src.file_name() << ":" << err.src.line() << "):";
|
trc << "Error: (" << err.src.file_name() << ":" << err.src.line() << "):";
|
||||||
} else {
|
} else {
|
||||||
@@ -280,7 +280,7 @@ inline void logError(const char *file, int line, const char *fmt, const Error &e
|
|||||||
|
|
||||||
inline void logError(const char *file, int line, const Error &err) noexcept {
|
inline void logError(const char *file, int line, const Error &err) noexcept {
|
||||||
if (err) {
|
if (err) {
|
||||||
TraceStream trc(file, line, "ox.error");
|
TraceStream trc(file, line, "ox::error");
|
||||||
trc << "Error:" << err;
|
trc << "Error:" << err;
|
||||||
if (err.src.file_name() != nullptr) {
|
if (err.src.file_name() != nullptr) {
|
||||||
trc << "(" << err.src.file_name() << ":" << err.src.line() << ")";
|
trc << "(" << err.src.file_name() << ":" << err.src.line() << ")";
|
||||||
|
19
deps/ox/src/ox/std/types.hpp
vendored
19
deps/ox/src/ox/std/types.hpp
vendored
@@ -63,6 +63,25 @@ namespace ox {
|
|||||||
|
|
||||||
using CString = char const*;
|
using CString = char const*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Aliases type T in size and alignment to allow allocating space for a T
|
||||||
|
* without running the constructor.
|
||||||
|
*/
|
||||||
|
template<typename T, std::size_t sz = sizeof(T)>
|
||||||
|
struct alignas(alignof(T)) AllocAlias {
|
||||||
|
char buff[sz];
|
||||||
|
constexpr AllocAlias() noexcept = default;
|
||||||
|
[[nodiscard]]
|
||||||
|
auto data() noexcept {
|
||||||
|
return reinterpret_cast<T*>(this);
|
||||||
|
}
|
||||||
|
[[nodiscard]]
|
||||||
|
auto data() const noexcept {
|
||||||
|
return reinterpret_cast<const T*>(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
template<std::size_t sz>
|
template<std::size_t sz>
|
||||||
struct SignedType {
|
struct SignedType {
|
||||||
};
|
};
|
||||||
|
65
deps/ox/src/ox/std/vector.hpp
vendored
65
deps/ox/src/ox/std/vector.hpp
vendored
@@ -34,10 +34,10 @@ struct VectorAllocator {
|
|||||||
ox::Array<AllocAlias<T>, Size> m_data = {};
|
ox::Array<AllocAlias<T>, Size> m_data = {};
|
||||||
protected:
|
protected:
|
||||||
constexpr VectorAllocator() noexcept = default;
|
constexpr VectorAllocator() noexcept = default;
|
||||||
constexpr VectorAllocator(VectorAllocator const&) noexcept = default;
|
constexpr VectorAllocator(const VectorAllocator&) noexcept = default;
|
||||||
constexpr VectorAllocator(VectorAllocator&&) noexcept = default;
|
constexpr VectorAllocator(VectorAllocator&&) noexcept = default;
|
||||||
|
|
||||||
constexpr void allocate(T **items, std::size_t const cap) noexcept {
|
constexpr void allocate(T **items, std::size_t cap) noexcept {
|
||||||
// small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr
|
// small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr
|
||||||
if (std::is_constant_evaluated() || cap > Size) {
|
if (std::is_constant_evaluated() || cap > Size) {
|
||||||
*items = Allocator{}.allocate(cap);
|
*items = Allocator{}.allocate(cap);
|
||||||
@@ -49,26 +49,42 @@ struct VectorAllocator {
|
|||||||
constexpr void moveConstructItemsFrom(
|
constexpr void moveConstructItemsFrom(
|
||||||
T **items,
|
T **items,
|
||||||
VectorAllocator *src,
|
VectorAllocator *src,
|
||||||
std::size_t const count,
|
const std::size_t count,
|
||||||
std::size_t const cap) noexcept {
|
const std::size_t cap) noexcept {
|
||||||
// this totally idiotic redundant check (&& count <= Size) is required to address a bug in devkitARM,
|
// this totally idiotic redundant check (&& count <= Size) is required to address a bug in devkitARM,
|
||||||
// try removing it later
|
// try removing it later
|
||||||
if (!std::is_constant_evaluated()) {
|
if (!std::is_constant_evaluated()) {
|
||||||
if (cap <= m_data.size() && count <= m_data.size()) {
|
if (cap <= m_data.size() && count <= m_data.size()) {
|
||||||
for (auto i = 0u; i < count; ++i) {
|
for (auto i = 0u; i < count; ++i) {
|
||||||
auto const srcItem = std::launder(reinterpret_cast<T*>(&src->m_data[i]));
|
const auto dstItem = reinterpret_cast<T *>(&m_data[i]);
|
||||||
new (&m_data[i]) T(std::move(*srcItem));
|
const auto srcItem = reinterpret_cast<T *>(&src->m_data[i]);
|
||||||
|
std::construct_at<T>(dstItem, std::move(*srcItem));
|
||||||
}
|
}
|
||||||
if (count) {
|
|
||||||
*items = std::launder(reinterpret_cast<T*>(m_data.data()));
|
|
||||||
} else {
|
|
||||||
*items = reinterpret_cast<T*>(m_data.data());
|
*items = reinterpret_cast<T*>(m_data.data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr void moveItemsFrom(
|
||||||
|
T **items,
|
||||||
|
VectorAllocator *src,
|
||||||
|
const std::size_t count,
|
||||||
|
const std::size_t cap) noexcept {
|
||||||
|
// this totally idiotic redundant check (&& count <= Size) is required to address a bug in devkitARM,
|
||||||
|
// try removing it later
|
||||||
|
if (!std::is_constant_evaluated()) {
|
||||||
|
if (cap <= m_data.size() && count <= m_data.size()) {
|
||||||
|
for (std::size_t i = 0; i < count; ++i) {
|
||||||
|
const auto dstItem = reinterpret_cast<T *>(&m_data[i]);
|
||||||
|
const auto srcItem = reinterpret_cast<T *>(&src->m_data[i]);
|
||||||
|
*dstItem = std::move(*srcItem);
|
||||||
|
}
|
||||||
|
*items = reinterpret_cast<T*>(m_data.data());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr void deallocate(T *const items, std::size_t const cap) noexcept {
|
constexpr void deallocate(T *items, std::size_t cap) noexcept {
|
||||||
// small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr
|
// small vector optimization cannot be done it constexpr, but it doesn't really matter in constexpr
|
||||||
if (std::is_constant_evaluated()) {
|
if (std::is_constant_evaluated()) {
|
||||||
if (items) {
|
if (items) {
|
||||||
@@ -87,10 +103,10 @@ template<typename T, typename Allocator>
|
|||||||
struct VectorAllocator<T, Allocator, 0> {
|
struct VectorAllocator<T, Allocator, 0> {
|
||||||
protected:
|
protected:
|
||||||
constexpr VectorAllocator() noexcept = default;
|
constexpr VectorAllocator() noexcept = default;
|
||||||
constexpr VectorAllocator(VectorAllocator const&) noexcept = default;
|
constexpr VectorAllocator(const VectorAllocator&) noexcept = default;
|
||||||
constexpr VectorAllocator(VectorAllocator&&) noexcept = default;
|
constexpr VectorAllocator(VectorAllocator&&) noexcept = default;
|
||||||
|
|
||||||
constexpr void allocate(T **items, std::size_t const cap) noexcept {
|
constexpr void allocate(T **items, std::size_t cap) noexcept {
|
||||||
*items = Allocator{}.allocate(cap);
|
*items = Allocator{}.allocate(cap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,15 +114,15 @@ struct VectorAllocator<T, Allocator, 0> {
|
|||||||
constexpr void moveConstructItemsFrom(
|
constexpr void moveConstructItemsFrom(
|
||||||
T**,
|
T**,
|
||||||
VectorAllocator*,
|
VectorAllocator*,
|
||||||
std::size_t const,
|
const std::size_t,
|
||||||
std::size_t const) noexcept {
|
const std::size_t) noexcept {
|
||||||
}
|
}
|
||||||
|
|
||||||
[[maybe_unused]]
|
[[maybe_unused]]
|
||||||
constexpr void moveItemsFrom(T**, VectorAllocator*, std::size_t const, std::size_t const) noexcept {
|
constexpr void moveItemsFrom(T**, VectorAllocator*, const std::size_t, const std::size_t) noexcept {
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr void deallocate(T *const items, std::size_t const cap) noexcept {
|
constexpr void deallocate(T *items, std::size_t cap) noexcept {
|
||||||
if (items) {
|
if (items) {
|
||||||
Allocator{}.deallocate(items, cap);
|
Allocator{}.deallocate(items, cap);
|
||||||
}
|
}
|
||||||
@@ -271,9 +287,7 @@ class Vector: detail::VectorAllocator<T, Allocator, SmallVectorSize> {
|
|||||||
template<typename... Args>
|
template<typename... Args>
|
||||||
constexpr T &emplace_back(Args&&... args) noexcept(useNoexcept);
|
constexpr T &emplace_back(Args&&... args) noexcept(useNoexcept);
|
||||||
|
|
||||||
constexpr void push_back(T const &item) noexcept(useNoexcept);
|
constexpr void push_back(T item) noexcept(useNoexcept);
|
||||||
|
|
||||||
constexpr void push_back(T &&item) noexcept(useNoexcept);
|
|
||||||
|
|
||||||
constexpr void pop_back() noexcept(useNoexcept);
|
constexpr void pop_back() noexcept(useNoexcept);
|
||||||
|
|
||||||
@@ -407,7 +421,7 @@ constexpr Vector<T, SmallVectorSize, Allocator> &Vector<T, SmallVectorSize, Allo
|
|||||||
m_size = other.m_size;
|
m_size = other.m_size;
|
||||||
m_cap = other.m_cap;
|
m_cap = other.m_cap;
|
||||||
m_items = other.m_items;
|
m_items = other.m_items;
|
||||||
this->moveConstructItemsFrom(&m_items, &other, m_size, m_cap);
|
this->moveItemsFrom(&m_items, &other, m_size, m_cap);
|
||||||
other.m_size = 0;
|
other.m_size = 0;
|
||||||
other.m_cap = 0;
|
other.m_cap = 0;
|
||||||
other.m_items = nullptr;
|
other.m_items = nullptr;
|
||||||
@@ -603,16 +617,7 @@ constexpr T &Vector<T, SmallVectorSize, Allocator>::emplace_back(Args&&... args)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
||||||
constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(T const &item) noexcept(useNoexcept) {
|
constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(T item) noexcept(useNoexcept) {
|
||||||
if (m_size == m_cap) {
|
|
||||||
reserve(m_cap ? m_cap * 2 : initialCap);
|
|
||||||
}
|
|
||||||
std::construct_at(&m_items[m_size], item);
|
|
||||||
++m_size;
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename T, std::size_t SmallVectorSize, typename Allocator>
|
|
||||||
constexpr void Vector<T, SmallVectorSize, Allocator>::push_back(T &&item) noexcept(useNoexcept) {
|
|
||||||
if (m_size == m_cap) {
|
if (m_size == m_cap) {
|
||||||
reserve(m_cap ? m_cap * 2 : initialCap);
|
reserve(m_cap ? m_cap * 2 : initialCap);
|
||||||
}
|
}
|
||||||
|
@@ -5,13 +5,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <ox/std/error.hpp>
|
#include <ox/std/error.hpp>
|
||||||
#include <ox/std/span.hpp>
|
|
||||||
#include <ox/std/stringview.hpp>
|
|
||||||
|
|
||||||
#include <studio/project.hpp>
|
|
||||||
|
|
||||||
#include <nostalgia/gfx/palette.hpp>
|
|
||||||
#include <nostalgia/gfx/tilesheet.hpp>
|
|
||||||
|
|
||||||
namespace nostalgia::gfx {
|
namespace nostalgia::gfx {
|
||||||
|
|
||||||
|
@@ -3,6 +3,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
#include <lodepng.h>
|
||||||
|
|
||||||
#include <ox/std/point.hpp>
|
#include <ox/std/point.hpp>
|
||||||
#include <keel/media.hpp>
|
#include <keel/media.hpp>
|
||||||
|
@@ -57,6 +57,7 @@ class TileSheetEditorImGui: public studio::Editor {
|
|||||||
ox::Vec2 m_prevMouseDownPos;
|
ox::Vec2 m_prevMouseDownPos;
|
||||||
TileSheetTool m_tool = TileSheetTool::Draw;
|
TileSheetTool m_tool = TileSheetTool::Draw;
|
||||||
bool m_palPathFocused{};
|
bool m_palPathFocused{};
|
||||||
|
ox::Vector<ox::UPtr<studio::UndoCommand>, 1> m_deferredCmds;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TileSheetEditorImGui(studio::Context &sctx, ox::StringParam path);
|
TileSheetEditorImGui(studio::Context &sctx, ox::StringParam path);
|
||||||
|
@@ -15,7 +15,7 @@ target_link_libraries(
|
|||||||
|
|
||||||
target_compile_definitions(
|
target_compile_definitions(
|
||||||
NostalgiaStudio PUBLIC
|
NostalgiaStudio PUBLIC
|
||||||
OLYMPIC_APP_VERSION="dev build"
|
OLYMPIC_APP_VERSION="d2025.07.0"
|
||||||
)
|
)
|
||||||
|
|
||||||
install(
|
install(
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
|
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>dev build</string>
|
<string>d2025.07.0</string>
|
||||||
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
<string>12.0.0</string>
|
<string>12.0.0</string>
|
||||||
|
@@ -13,7 +13,7 @@ namespace keel {
|
|||||||
|
|
||||||
constexpr auto K1HdrSz = 40;
|
constexpr auto K1HdrSz = 40;
|
||||||
|
|
||||||
ox::Result<ox::UUID> readUuidHeader(ox::BufferView const &buff) noexcept;
|
ox::Result<ox::UUID> readUuidHeader(ox::BufferView buff) noexcept;
|
||||||
|
|
||||||
ox::Result<ox::UUID> regenerateUuidHeader(ox::Buffer &buff) noexcept;
|
ox::Result<ox::UUID> regenerateUuidHeader(ox::Buffer &buff) noexcept;
|
||||||
|
|
||||||
@@ -35,15 +35,15 @@ ox::Result<T> readAsset(ox::BufferView buff) noexcept {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Result<ox::ModelObject> readAsset(ox::TypeStore &ts, ox::BufferView const &buff) noexcept;
|
ox::Result<ox::ModelObject> readAsset(ox::TypeStore &ts, ox::BufferView buff) noexcept;
|
||||||
|
|
||||||
struct AssetHdr {
|
struct AssetHdr {
|
||||||
ox::UUID uuid;
|
ox::UUID uuid;
|
||||||
ox::ClawHeader clawHdr;
|
ox::ClawHeader clawHdr;
|
||||||
};
|
};
|
||||||
|
|
||||||
ox::Result<ox::StringView> readAssetTypeId(ox::BufferView const &buff) noexcept;
|
ox::Result<ox::StringView> readAssetTypeId(ox::BufferView buff) noexcept;
|
||||||
|
|
||||||
ox::Result<AssetHdr> readAssetHeader(ox::BufferView const &buff) noexcept;
|
ox::Result<AssetHdr> readAssetHeader(ox::BufferView buff) noexcept;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -64,13 +64,11 @@ class AssetContainer {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
constexpr void incRefs() const noexcept {
|
constexpr void incRefs() const noexcept {
|
||||||
oxAssert(m_references < ox::MaxValue<decltype(m_references)>, "reference count exceeds maximum");
|
|
||||||
++m_references;
|
++m_references;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr void decRefs() const noexcept {
|
constexpr void decRefs() const noexcept {
|
||||||
--m_references;
|
--m_references;
|
||||||
oxAssert(m_references >= 0, "negative references");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
@@ -164,7 +162,6 @@ template<typename T>
|
|||||||
constexpr AssetRef<T>::AssetRef(AssetContainer<T> const*c) noexcept: m_ctr(c) {
|
constexpr AssetRef<T>::AssetRef(AssetContainer<T> const*c) noexcept: m_ctr(c) {
|
||||||
if (m_ctr) {
|
if (m_ctr) {
|
||||||
m_ctr->updated.connect(this, &AssetRef::emitUpdated);
|
m_ctr->updated.connect(this, &AssetRef::emitUpdated);
|
||||||
m_ctr->incRefs();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -147,7 +147,7 @@ template<typename T>
|
|||||||
ox::Result<AssetRef<T>> readObj(
|
ox::Result<AssetRef<T>> readObj(
|
||||||
Context &ctx,
|
Context &ctx,
|
||||||
ox::StringViewCR assetId,
|
ox::StringViewCR assetId,
|
||||||
[[maybe_unused]] bool const forceLoad = false) noexcept {
|
[[maybe_unused]] bool forceLoad = false) noexcept {
|
||||||
#ifndef OX_BARE_METAL
|
#ifndef OX_BARE_METAL
|
||||||
return readObjFile<T>(ctx, assetId, forceLoad);
|
return readObjFile<T>(ctx, assetId, forceLoad);
|
||||||
#else
|
#else
|
||||||
@@ -159,7 +159,7 @@ template<typename T>
|
|||||||
ox::Result<AssetRef<T>> readObj(
|
ox::Result<AssetRef<T>> readObj(
|
||||||
Context &ctx,
|
Context &ctx,
|
||||||
ox::FileAddress const&file,
|
ox::FileAddress const&file,
|
||||||
[[maybe_unused]] bool const forceLoad = false) noexcept {
|
[[maybe_unused]] bool forceLoad = false) noexcept {
|
||||||
#ifndef OX_BARE_METAL
|
#ifndef OX_BARE_METAL
|
||||||
OX_REQUIRE(assetId, file.getPath());
|
OX_REQUIRE(assetId, file.getPath());
|
||||||
return readObj<T>(ctx, ox::StringView(assetId), forceLoad);
|
return readObj<T>(ctx, ox::StringView(assetId), forceLoad);
|
||||||
@@ -178,7 +178,7 @@ ox::Error writeObj(
|
|||||||
Context &ctx,
|
Context &ctx,
|
||||||
ox::FileAddress const&file,
|
ox::FileAddress const&file,
|
||||||
T const&obj,
|
T const&obj,
|
||||||
ox::ClawFormat const fmt = ox::ClawFormat::Metal) noexcept {
|
ox::ClawFormat fmt = ox::ClawFormat::Metal) noexcept {
|
||||||
OX_REQUIRE(objBuff, ox::writeClaw(obj, fmt));
|
OX_REQUIRE(objBuff, ox::writeClaw(obj, fmt));
|
||||||
return ctx.rom->write(file, objBuff.data(), objBuff.size());
|
return ctx.rom->write(file, objBuff.data(), objBuff.size());
|
||||||
}
|
}
|
||||||
|
@@ -214,7 +214,7 @@ class Converter {
|
|||||||
}
|
}
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
BaseConverter const &converter() const noexcept {
|
BaseConverter const &converter() const noexcept {
|
||||||
return *std::launder(m_buff.data());
|
return *m_buff.data();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@ class TypeStore: public ox::TypeStore {
|
|||||||
ox::String m_descPath;
|
ox::String m_descPath;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit TypeStore(ox::FileSystem &fs, ox::StringViewCR descPath) noexcept;
|
explicit TypeStore(ox::FileSystem &fs, ox::StringView descPath) noexcept;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
ox::Result<ox::UPtr<ox::DescriptorType>> loadDescriptor(ox::StringView typeId) noexcept override;
|
ox::Result<ox::UPtr<ox::DescriptorType>> loadDescriptor(ox::StringView typeId) noexcept override;
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
namespace keel {
|
namespace keel {
|
||||||
|
|
||||||
ox::Result<ox::UUID> readUuidHeader(ox::BufferView const &buff) noexcept {
|
ox::Result<ox::UUID> readUuidHeader(ox::BufferView buff) noexcept {
|
||||||
if (buff.size() < K1HdrSz) [[unlikely]] {
|
if (buff.size() < K1HdrSz) [[unlikely]] {
|
||||||
return ox::Error{1, "Insufficient data to contain complete Keel header"};
|
return ox::Error{1, "Insufficient data to contain complete Keel header"};
|
||||||
}
|
}
|
||||||
@@ -27,15 +27,16 @@ ox::Result<ox::UUID> regenerateUuidHeader(ox::Buffer &buff) noexcept {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Result<ox::ModelObject> readAsset(ox::TypeStore &ts, ox::BufferView const &buff) noexcept {
|
ox::Result<ox::ModelObject> readAsset(ox::TypeStore &ts, ox::BufferView buff) noexcept {
|
||||||
std::size_t offset = 0;
|
std::size_t offset = 0;
|
||||||
if (!readUuidHeader(buff).error) {
|
if (!readUuidHeader(buff).error) {
|
||||||
offset = K1HdrSz;
|
offset = K1HdrSz;
|
||||||
}
|
}
|
||||||
return ox::readClaw(ts, buff + offset);
|
buff += offset;
|
||||||
|
return ox::readClaw(ts, buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Result<ox::StringView> readAssetTypeId(ox::BufferView const &buff) noexcept {
|
ox::Result<ox::StringView> readAssetTypeId(ox::BufferView const buff) noexcept {
|
||||||
auto const err = readUuidHeader(buff).error;
|
auto const err = readUuidHeader(buff).error;
|
||||||
auto const offset = err ? 0u : K1HdrSz;
|
auto const offset = err ? 0u : K1HdrSz;
|
||||||
if (offset >= buff.size()) [[unlikely]] {
|
if (offset >= buff.size()) [[unlikely]] {
|
||||||
@@ -44,14 +45,15 @@ ox::Result<ox::StringView> readAssetTypeId(ox::BufferView const &buff) noexcept
|
|||||||
return ox::readClawTypeId(buff + offset);
|
return ox::readClawTypeId(buff + offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
ox::Result<AssetHdr> readAssetHeader(ox::BufferView const &buff) noexcept {
|
ox::Result<AssetHdr> readAssetHeader(ox::BufferView buff) noexcept {
|
||||||
ox::Result<AssetHdr> out;
|
ox::Result<AssetHdr> out;
|
||||||
auto const err = readUuidHeader(buff).moveTo(out.value.uuid);
|
auto const err = readUuidHeader(buff).moveTo(out.value.uuid);
|
||||||
auto const offset = err ? 0u : K1HdrSz;
|
auto const offset = err ? 0u : K1HdrSz;
|
||||||
if (offset >= buff.size()) [[unlikely]] {
|
if (offset >= buff.size()) [[unlikely]] {
|
||||||
return ox::Error(1, "Buffer too small for expected data");
|
return ox::Error(1, "Buffer too small for expected data");
|
||||||
}
|
}
|
||||||
OX_RETURN_ERROR(ox::readClawHeader(buff + offset).moveTo(out.value.clawHdr));
|
buff += offset;
|
||||||
|
OX_RETURN_ERROR(ox::readClawHeader(buff).moveTo(out.value.clawHdr));
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -187,7 +187,7 @@ static ox::Error copy(
|
|||||||
OX_DEFER [&status] {
|
OX_DEFER [&status] {
|
||||||
oxOutf(" {}\n", status);
|
oxOutf(" {}\n", status);
|
||||||
};
|
};
|
||||||
OX_REQUIRE(buff, src.read(currentFile));
|
OX_REQUIRE_M(buff, src.read(currentFile));
|
||||||
// write file to dest
|
// write file to dest
|
||||||
OX_RETURN_ERROR(dest.write(currentFile, buff));
|
OX_RETURN_ERROR(dest.write(currentFile, buff));
|
||||||
status = "OK";
|
status = "OK";
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
namespace keel {
|
namespace keel {
|
||||||
|
|
||||||
TypeStore::TypeStore(ox::FileSystem &fs, ox::StringViewCR descPath) noexcept:
|
TypeStore::TypeStore(ox::FileSystem &fs, ox::StringView descPath) noexcept:
|
||||||
m_fs(fs),
|
m_fs(fs),
|
||||||
m_descPath(descPath) {
|
m_descPath(descPath) {
|
||||||
}
|
}
|
||||||
|
@@ -25,7 +25,7 @@ static std::map<ox::StringView, ox::Error(*)()> tests = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(int const argc, char const **argv) {
|
int main(int argc, char const **argv) {
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
if (argc > 0) {
|
if (argc > 0) {
|
||||||
auto const args = ox::Span{argv, static_cast<size_t>(argc)};
|
auto const args = ox::Span{argv, static_cast<size_t>(argc)};
|
||||||
|
@@ -31,7 +31,7 @@ ox::Result<T> getDragDropPayload(ox::CStringViewCR name) noexcept {
|
|||||||
return ox::Error(1, "No drag/drop payload");
|
return ox::Error(1, "No drag/drop payload");
|
||||||
}
|
}
|
||||||
return ox::readClaw<T>({
|
return ox::readClaw<T>({
|
||||||
std::launder(reinterpret_cast<char const*>(payload->Data)),
|
reinterpret_cast<char const*>(payload->Data),
|
||||||
static_cast<size_t>(payload->DataSize)});
|
static_cast<size_t>(payload->DataSize)});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -8,18 +8,13 @@ namespace studio {
|
|||||||
|
|
||||||
void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs) noexcept {
|
void navigateTo(Context &ctx, ox::StringParam filePath, ox::StringParam navArgs) noexcept {
|
||||||
ox::String path = std::move(filePath);
|
ox::String path = std::move(filePath);
|
||||||
if (keel::isUuidUrl(path)) {
|
if (beginsWith(path, "uuid://")) {
|
||||||
auto const [p, err] = keel::uuidUrlToPath(keelCtx(ctx), path);
|
auto const [p, err] = keel::uuidUrlToPath(keelCtx(ctx), path);
|
||||||
if (err) {
|
if (err) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
path = p;
|
path = p;
|
||||||
}
|
}
|
||||||
//if (
|
|
||||||
// auto const [np, err] = ctx.navStack.back();
|
|
||||||
// !err && np->filePath == path && np->navArgs == navArgs.view()) {
|
|
||||||
// return;
|
|
||||||
//}
|
|
||||||
ctx.navStack.resize(ctx.navIdx + 1);
|
ctx.navStack.resize(ctx.navIdx + 1);
|
||||||
ctx.navStack.emplace_back(ox::String{path}, ox::String{navArgs.view()});
|
ctx.navStack.emplace_back(ox::String{path}, ox::String{navArgs.view()});
|
||||||
try {
|
try {
|
||||||
@@ -54,9 +49,8 @@ void navigateBack(Context &ctx) noexcept {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void navigateForward(Context &ctx) noexcept {
|
void navigateForward(Context &ctx) noexcept {
|
||||||
auto const nextIdx = ctx.navIdx + 1;
|
while (ctx.navIdx < ctx.navStack.size()) {
|
||||||
while (nextIdx < ctx.navStack.size()) {
|
auto const &n = ctx.navStack[ctx.navIdx];
|
||||||
auto const &n = ctx.navStack[nextIdx];
|
|
||||||
try {
|
try {
|
||||||
ctx.navCallback(n.filePath, n.navArgs);
|
ctx.navCallback(n.filePath, n.navArgs);
|
||||||
} catch (std::exception const &e) {
|
} catch (std::exception const &e) {
|
||||||
@@ -64,7 +58,7 @@ void navigateForward(Context &ctx) noexcept {
|
|||||||
oxErrf("navigateForward failed: {}", e.what());
|
oxErrf("navigateForward failed: {}", e.what());
|
||||||
}
|
}
|
||||||
if (!ctx.project->exists(n.filePath)) {
|
if (!ctx.project->exists(n.filePath)) {
|
||||||
std::ignore = ctx.navStack.erase(nextIdx);
|
std::ignore = ctx.navStack.erase(ctx.navIdx);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
++ctx.navIdx;
|
++ctx.navIdx;
|
||||||
|
Reference in New Issue
Block a user