Этот вопрос настолько специфичен, что я не уверен, как искать информацию, поэтому опыт научил меня, что здесь лучше задать вопрос, чем реализовать что-то из подоптимального качества. Я использую библиотеку GLM, но я не хочу выставлять типы GLM остальной кодовой базе. Немного вдохновения пришло от Vlog по дизайну игрового двигателя (Travis vroman: Kohi Game Engine Series #22). < /P>
[*] На случай, если в какой -то момент я желаю использовать Directx, тогда типы GLM могут быть не совместимы (я не знаю, но может < /em>). Засоренная по всей кодовой базе будет проблемой.
Код: Выделить всё
// the header
namespace math
{
template
union tvec2
{
T elements[2];
struct
{
union { T x, r, s, u; }; // aliases for first element
union { T y, g, t, v; }; // aliases for second element
};
};
typedef tvec2 vec2;
vec2 operator+(vec2 a, vec2 b);
}
// the source file for glm implementation
#include
math::vec2 math::operator+(math::vec2 a, math::vec2 b)
{
glm::vec2 result = glm::vec2(a.x, a.y) + glm::vec2(b.x, b.y);
return { result.x, result.y };
}
Статические требования к хранению :
Я хочу, чтобы требования хранения VEC2 были статичными и присутствуют внутри заголовка. Это позволяет легко получить лучшую производительность кэша, упаковывая векторы внутри массивов структур. В противном случае мне придется использовать либо интерфейсы, либо непрозрачные типы указателей, что приведет к дополнительным нехватке времени выполнения. Я могу придумать другие причины, но, надеюсь, эта интуиция станет ясной и хорошо сформированной. Таким образом, мне не придется бороться с внутренней. (например, штраф за вызов конструкторов GLM :: VEC2)
Подробнее здесь: https://stackoverflow.com/questions/729 ... or-library
Мобильная версия