libeuropa/util: Add some structs for mesh/math stuff
This commit is contained in:
parent
263cfd2cf4
commit
badda50a87
2 changed files with 103 additions and 0 deletions
40
include/europa/structs/MathTypes.hpp
Normal file
40
include/europa/structs/MathTypes.hpp
Normal file
|
@ -0,0 +1,40 @@
|
|||
//
|
||||
// EuropaTools
|
||||
//
|
||||
// (C) 2021-2025 modeco80 <lily.modeco80@protonmail.ch>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
//
|
||||
|
||||
// Math types which are used by mesh I/O code.
|
||||
// These are not general purpose and are only meant to be
|
||||
// binary compatible.
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace europa::structs {
|
||||
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma pack(push, 1)
|
||||
#endif
|
||||
|
||||
struct [[gnu::packed]] Vec3f {
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
};
|
||||
|
||||
struct [[gnu::packed]] Uvf {
|
||||
float u;
|
||||
float v;
|
||||
};
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma pack(pop)
|
||||
#endif
|
||||
|
||||
static_assert(sizeof(Vec3f) == 0xc, "Vec3f size is incorrect");
|
||||
static_assert(sizeof(Uvf) == 0x8, "Uvf size is incorrect");
|
||||
|
||||
}
|
63
include/europa/util/Into.hpp
Normal file
63
include/europa/util/Into.hpp
Normal file
|
@ -0,0 +1,63 @@
|
|||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace europa::util {
|
||||
|
||||
template <class To, class From>
|
||||
struct IntoImpl {
|
||||
constexpr static To DoInto(const From& from) {
|
||||
// The default implentation assumes that the To type has a constructor which
|
||||
// can initalize it from a value of From const&.
|
||||
return To(from);
|
||||
}
|
||||
};
|
||||
|
||||
/// Into() support for vectors of items.
|
||||
template <class To, class From>
|
||||
struct IntoImpl<std::vector<To>, std::vector<From>> {
|
||||
constexpr static std::vector<To> DoInto(const std::vector<From>& from) {
|
||||
// FIXME: Ranges could make this less stupid
|
||||
auto vec = std::vector<To> {};
|
||||
vec.resize(from.size());
|
||||
|
||||
// Feed into existing Into() implementation
|
||||
for(auto const& item : from)
|
||||
vec.push_back(Into(item));
|
||||
|
||||
return vec;
|
||||
}
|
||||
};
|
||||
|
||||
/// Allows a type to be converted.
|
||||
/// A user is allowed to supply conversions out-of-band.
|
||||
template <class To, class From>
|
||||
constexpr To Into(const From& from) {
|
||||
return IntoImpl<To, From>::DoInto(from);
|
||||
}
|
||||
|
||||
/// Helper macro to hide away the annoying boilerplate of
|
||||
/// implementing the IntoImpl struct used for implementing conversion
|
||||
#define EUROPA_BEGIN_INTO_CONVERSION(To, From) \
|
||||
template <> \
|
||||
struct ::europa::util::IntoImpl<To, From> { \
|
||||
static To DoInto([[maybe_unused]] const From& from)
|
||||
|
||||
#define EUROPA_END_INTO_CONVERSION }
|
||||
|
||||
#if 0
|
||||
// An example of specializing Into().
|
||||
// This is a bit iffy, but works.
|
||||
struct Frob {};
|
||||
|
||||
EUROPA_BEGIN_INTO_CONVERSION(int, Frob) {
|
||||
return 42;
|
||||
} EUROPA_END_INTO_CONVERSION;
|
||||
|
||||
auto a() {
|
||||
Frob f{};
|
||||
int i = Into<int>(f);
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace europa::util
|
Loading…
Reference in a new issue