Кумулятивный список основных улучшений и нововведений, появившихся с версии 2.1.0 по 3.6.2 включительно.
Ключевые новшества
- Унифицированная система углов и представления вида (Angle, ViewAngles).
- Обобщенная камера проекции с кэшированием и конвертациями мировых координат на экран.
- Набор профилей «движков» (Source, OpenGL, Unity, IW) с собственными осями, порядком матриц и формулами.
- Поиск пути по графу навигации (A*), сериализация/десериализация навмеша.
- Трассировка луча по треугольнику (алгоритм Мёллера–Трумбора).
- Баллистическое упреждение: базовый (trait‑based) и SIMD‑вариант (AVX2).
- Утилиты цвета (RGBA/HSV), работа с треугольниками, 3D‑примитив «ящик».
Добавлено
- Углы и математика
- omath::Angle<T,min,max,AngleFlags> с нормализацией/клампом, тригонометрией и операторами.
- Вспомогательные функции omath::angles:
- radians_to_degrees, degrees_to_radians
- horizontal_fov_to_vertical, vertical_fov_to_horizontal
- wrap_angle
- Структура omath::ViewAngles<Pitch, Yaw, Roll>.
- Камера и проекция
- projection::Camera<Mat4X4Type, ViewAnglesType, TraitClass>:
- Ленивое кэширование матрицы вида‑проекции.
- Конвертации: world_to_view_port (NDC), world_to_screen, screen_to_world.
- Управление параметрами: FOV, near/far, вьюпорт, позиция, углы вида.
- Коды ошибок projection::Error: WORLD_POSITION_IS_OUT_OF_SCREEN_BOUNDS, INV_VIEW_PROJ_MAT_DET_EQ_ZERO.
- Вьюпорт с aspect_ratio().
- Профили движков (конвенции координат и матриц)
- Source Engine (row‑major, +X forward, +Z up и т. п.).
- OpenGL (column‑major, правосторонняя система, −Z forward).
- Unity (row‑major, +Z forward, +Y up).
- Infinity Ward (IW) (row‑major; FOV с «quake‑фактором» 0.75).
- Для каждого профиля:
- Константы осей и типы матриц.
- Формулы: forward/right/up, rotation_matrix, calc_view_matrix, calc_perspective_projection_matrix.
- Алиас Camera на обобщенную projection::Camera.
- Поиск пути (Pathfinding)
- pathfinding::NavigationMesh:
- get_closest_vertex(point), get_neighbors(vertex), empty().
- Бинарная serialize()/deserialize() для карты вершин и смежности.
- pathfinding::Astar::find_path(start, end, nav_mesh) — A* на графе навмеша.
- Столкновения (Collision)
- collision::Ray с конечной/бесконечной длиной и векторами направления.
- collision::LineTracer:
- can_trace_line(ray, triangle)
- get_ray_hit_point(ray, triangle) — алгоритм Мёллера–Трумбора.
- Баллистическое упреждение (Projectile Prediction)
- Единый интерфейс ProjPredEngineInterface::maybe_calculate_aim_point(Projectile, Target).
- ProjPredEngineLegacy<EngineTrait>:
- Concept для трейта движка (предсказание позиций, прямые углы наведения, и т. д.).
- Расчет угла пуска по замкнутой формуле; пошаговая симуляция до совпадения в пределах допуска.
- ProjPredEngineAvx2:
- SIMD‑ускоренная проверка множества моментов времени пакетами.
- Доступна при OMATH_USE_AVX2 на x86/x86_64; иначе — исключение на вызове.
- Геометрия и утилиты
- omath::Triangle<Vector>:
- normal, длины/векторы сторон, гипотенуза, проверка прямоугольности, центроид (mid_point).
- omath::primitives::create_box(top, bottom, dir_forward, dir_right, ratio=4):
- Генерация 12 треугольников прямоугольного параллелепипеда.
- Цвет:
- omath::Color RGBA с клампом, конвертация HSV<->RGB, blend(ratio), std::formatter.
Изменено/уточнено поведение
- Четкое разделение соглашений по осям, знакам, порядку хранения матриц и FOV между профилями движков.
- Камера использует ленивое кэширование — любые сеттеры инвалидируют матрицу вида‑проекции.
- Методы конвертации возвращают std::expected и требуют обработки ошибок (например, выход за границы NDC).
Совместимость и миграция
- Не смешивайте матрицы/векторы из разных «движков» без явной конвертации — разные оси, порядок поворотов и знаки осей Z/FWD.
- В OpenGL‑профиле — column‑major и −Z forward; в Source/IW — row‑major; в Unity — row‑major, +Z forward.
- Проекционная матрица IW/Source использует «quake‑фактор» 0.75 для FOV.
- world_to_screen/world_to_view_port возвращают ошибки, если:
- w == 0 (точка на плоскости проекции) или координаты NDC вне диапазона [-1, 1].
- AVX2‑движок:
- Требует OMATH_USE_AVX2 и поддержку AVX2 на целевой машине; на других платформах при вызове будет исключение.
- Держите неблокирующий фоллбек (Legacy) для совместимости.
Формат данных
- NavigationMesh::serialize()/deserialize():
- Сырые бинарные данные; счетчик соседей хранится в uint16_t.
- Формат не самодокументирован — версионируйте пайплайн ассетов.
Форматирование
- Реализованы std::formatter для omath::Angle и omath::Color — удобный вывод в логи/диагностику.