mirror of
https://github.com/orange-cpp/omath.git
synced 2026-02-13 15:03:27 +00:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 687772f073 | |||
| c66df11754 | |||
| 0450dc3547 | |||
| 0bd9eda48f | |||
| 858314fa0a | |||
| f277b1038c | |||
| 15c055beb7 | |||
| 4d24815f3e | |||
| d96b0cd2f7 | |||
| d238bd137f | |||
| 17b150499d | |||
| c7228c9674 | |||
| 7a9f5d4966 | |||
| a16050242a |
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Desktop (please complete the following information):**
|
||||||
|
- OS: [e.g. iOS]
|
||||||
|
- Browser [e.g. chrome, safari]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Smartphone (please complete the following information):**
|
||||||
|
- Device: [e.g. iPhone6]
|
||||||
|
- OS: [e.g. iOS8.1]
|
||||||
|
- Browser [e.g. stock browser, safari]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
10
.github/ISSUE_TEMPLATE/custom.md
vendored
Normal file
10
.github/ISSUE_TEMPLATE/custom.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
name: Custom issue template
|
||||||
|
about: Describe this issue template's purpose here.
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
cmake_minimum_required(VERSION 3.26)
|
cmake_minimum_required(VERSION 3.26)
|
||||||
|
|
||||||
project(omath VERSION 3.0.4.1 LANGUAGES CXX)
|
project(omath VERSION 3.2.1 LANGUAGES CXX)
|
||||||
|
|
||||||
include(CMakePackageConfigHelpers)
|
include(CMakePackageConfigHelpers)
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,9 @@
|
|||||||

|

|
||||||
[](https://repology.org/project/orange-math/versions)
|
[](https://repology.org/project/orange-math/versions)
|
||||||

|

|
||||||
|
[](https://discord.gg/eDgdaWbqwZ)
|
||||||
|
[](https://t.me/orangennotes)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
Oranges's Math Library (omath) is a comprehensive, open-source library aimed at providing efficient, reliable, and versatile mathematical functions and algorithms. Developed primarily in C++, this library is designed to cater to a wide range of mathematical operations essential in scientific computing, engineering, and academic research.
|
Oranges's Math Library (omath) is a comprehensive, open-source library aimed at providing efficient, reliable, and versatile mathematical functions and algorithms. Developed primarily in C++, this library is designed to cater to a wide range of mathematical operations essential in scientific computing, engineering, and academic research.
|
||||||
|
|||||||
Submodule extlibs/googletest updated: d83fee138a...52eb8108c5
@@ -5,18 +5,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "omath/engines/iw_engine/constants.hpp"
|
#include "omath/engines/iw_engine/constants.hpp"
|
||||||
#include "omath/projection/camera.hpp"
|
#include "omath/projection/camera.hpp"
|
||||||
|
#include "traits/camera_trait.hpp"
|
||||||
|
|
||||||
namespace omath::iw_engine
|
namespace omath::iw_engine
|
||||||
{
|
{
|
||||||
class Camera final : public projection::Camera<Mat4X4, ViewAngles>
|
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait>;
|
||||||
{
|
|
||||||
public:
|
|
||||||
Camera(const Vector3<float>& position, const ViewAngles& view_angles, const projection::ViewPort& view_port,
|
|
||||||
const Angle<float, 0.f, 180.f, AngleFlags::Clamped>& fov, float near, float far);
|
|
||||||
void look_at(const Vector3<float>& target) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
[[nodiscard]] Mat4X4 calc_view_matrix() const noexcept override;
|
|
||||||
[[nodiscard]] Mat4X4 calc_projection_matrix() const noexcept override;
|
|
||||||
};
|
|
||||||
} // namespace omath::iw_engine
|
} // namespace omath::iw_engine
|
||||||
24
include/omath/engines/iw_engine/traits/camera_trait.hpp
Normal file
24
include/omath/engines/iw_engine/traits/camera_trait.hpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
//
|
||||||
|
// Created by Vlad on 8/10/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "omath/engines/iw_engine/constants.hpp"
|
||||||
|
#include "omath/projection/camera.hpp"
|
||||||
|
|
||||||
|
namespace omath::iw_engine
|
||||||
|
{
|
||||||
|
class CameraTrait final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
[[nodiscard]]
|
||||||
|
static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin, const Vector3<float>& look_at) noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept;
|
||||||
|
[[nodiscard]]
|
||||||
|
static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov, const projection::ViewPort& view_port,
|
||||||
|
float near, float far) noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace omath::iw_engine
|
||||||
@@ -8,27 +8,26 @@
|
|||||||
#include "omath/projectile_prediction/target.hpp"
|
#include "omath/projectile_prediction/target.hpp"
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
namespace omath::projectile_prediction::traits
|
namespace omath::iw_engine
|
||||||
{
|
{
|
||||||
class IwEngineTrait final
|
class PredEngineTrait final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
constexpr static Vector3<float> predict_projectile_position(const Projectile& projectile, const float pitch,
|
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile& projectile,
|
||||||
const float yaw, const float time,
|
const float pitch, const float yaw,
|
||||||
const float gravity) noexcept
|
const float time, const float gravity) noexcept
|
||||||
{
|
{
|
||||||
auto current_pos = projectile.m_origin
|
auto current_pos = projectile.m_origin
|
||||||
+ iw_engine::forward_vector({iw_engine::PitchAngle::from_degrees(-pitch),
|
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||||
iw_engine::YawAngle::from_degrees(yaw),
|
RollAngle::from_degrees(0)})
|
||||||
iw_engine::RollAngle::from_degrees(0)})
|
|
||||||
* projectile.m_launch_speed * time;
|
* projectile.m_launch_speed * time;
|
||||||
current_pos.z -= (gravity * projectile.m_gravity_scale) * (time * time) * 0.5f;
|
current_pos.z -= (gravity * projectile.m_gravity_scale) * (time * time) * 0.5f;
|
||||||
|
|
||||||
return current_pos;
|
return current_pos;
|
||||||
}
|
}
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static constexpr Vector3<float> predict_target_position(const Target& target, const float time,
|
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target& target,
|
||||||
const float gravity) noexcept
|
const float time, const float gravity) noexcept
|
||||||
{
|
{
|
||||||
auto predicted = target.m_origin + target.m_velocity * time;
|
auto predicted = target.m_origin + target.m_velocity * time;
|
||||||
|
|
||||||
@@ -50,7 +49,7 @@ namespace omath::projectile_prediction::traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static Vector3<float> calc_viewpoint_from_angles(const Projectile& projectile,
|
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile& projectile,
|
||||||
Vector3<float> predicted_target_position,
|
Vector3<float> predicted_target_position,
|
||||||
const std::optional<float> projectile_pitch) noexcept
|
const std::optional<float> projectile_pitch) noexcept
|
||||||
{
|
{
|
||||||
@@ -77,4 +76,4 @@ namespace omath::projectile_prediction::traits
|
|||||||
return angles::radians_to_degrees(std::atan2(delta.y, delta.x));
|
return angles::radians_to_degrees(std::atan2(delta.y, delta.x));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} // namespace omath::projectile_prediction::traits
|
} // namespace omath::iw_engine
|
||||||
@@ -4,16 +4,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "omath/engines/opengl_engine/constants.hpp"
|
#include "omath/engines/opengl_engine/constants.hpp"
|
||||||
#include "omath/projection/camera.hpp"
|
#include "omath/projection/camera.hpp"
|
||||||
|
#include "traits/camera_trait.hpp"
|
||||||
|
|
||||||
namespace omath::opengl_engine
|
namespace omath::opengl_engine
|
||||||
{
|
{
|
||||||
class Camera final : public projection::Camera<Mat4X4, ViewAngles>
|
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait>;
|
||||||
{
|
|
||||||
public:
|
|
||||||
Camera(const Vector3<float>& position, const ViewAngles& view_angles, const projection::ViewPort& view_port,
|
|
||||||
const Angle<float, 0.f, 180.f, AngleFlags::Clamped>& fov, float near, float far);
|
|
||||||
void look_at(const Vector3<float>& target) override;
|
|
||||||
[[nodiscard]] Mat4X4 calc_view_matrix() const noexcept override;
|
|
||||||
[[nodiscard]] Mat4X4 calc_projection_matrix() const noexcept override;
|
|
||||||
};
|
|
||||||
} // namespace omath::opengl_engine
|
} // namespace omath::opengl_engine
|
||||||
24
include/omath/engines/opengl_engine/traits/camera_trait.hpp
Normal file
24
include/omath/engines/opengl_engine/traits/camera_trait.hpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
//
|
||||||
|
// Created by Vlad on 8/10/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "omath/engines/opengl_engine/constants.hpp"
|
||||||
|
#include "omath/projection/camera.hpp"
|
||||||
|
|
||||||
|
namespace omath::opengl_engine
|
||||||
|
{
|
||||||
|
class CameraTrait final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
[[nodiscard]]
|
||||||
|
static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin, const Vector3<float>& look_at) noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept;
|
||||||
|
[[nodiscard]]
|
||||||
|
static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov, const projection::ViewPort& view_port,
|
||||||
|
float near, float far) noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace omath::opengl_engine
|
||||||
@@ -7,27 +7,26 @@
|
|||||||
#include "omath/projectile_prediction/target.hpp"
|
#include "omath/projectile_prediction/target.hpp"
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
namespace omath::projectile_prediction::traits
|
namespace omath::opengl_engine
|
||||||
{
|
{
|
||||||
class OpenGlEngineTrait final
|
class PredEngineTrait final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
constexpr static Vector3<float> predict_projectile_position(const Projectile& projectile, const float pitch,
|
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile& projectile,
|
||||||
const float yaw, const float time,
|
const float pitch, const float yaw,
|
||||||
const float gravity) noexcept
|
const float time, const float gravity) noexcept
|
||||||
{
|
{
|
||||||
auto current_pos = projectile.m_origin
|
auto current_pos = projectile.m_origin
|
||||||
+ opengl_engine::forward_vector({opengl_engine::PitchAngle::from_degrees(-pitch),
|
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||||
opengl_engine::YawAngle::from_degrees(yaw),
|
RollAngle::from_degrees(0)})
|
||||||
opengl_engine::RollAngle::from_degrees(0)})
|
|
||||||
* projectile.m_launch_speed * time;
|
* projectile.m_launch_speed * time;
|
||||||
current_pos.y -= (gravity * projectile.m_gravity_scale) * (time * time) * 0.5f;
|
current_pos.y -= (gravity * projectile.m_gravity_scale) * (time * time) * 0.5f;
|
||||||
|
|
||||||
return current_pos;
|
return current_pos;
|
||||||
}
|
}
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static constexpr Vector3<float> predict_target_position(const Target& target, const float time,
|
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target& target,
|
||||||
const float gravity) noexcept
|
const float time, const float gravity) noexcept
|
||||||
{
|
{
|
||||||
auto predicted = target.m_origin + target.m_velocity * time;
|
auto predicted = target.m_origin + target.m_velocity * time;
|
||||||
|
|
||||||
@@ -49,7 +48,7 @@ namespace omath::projectile_prediction::traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static Vector3<float> calc_viewpoint_from_angles(const Projectile& projectile,
|
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile& projectile,
|
||||||
Vector3<float> predicted_target_position,
|
Vector3<float> predicted_target_position,
|
||||||
const std::optional<float> projectile_pitch) noexcept
|
const std::optional<float> projectile_pitch) noexcept
|
||||||
{
|
{
|
||||||
@@ -76,4 +75,4 @@ namespace omath::projectile_prediction::traits
|
|||||||
return angles::radians_to_degrees(std::atan2(delta.z, delta.x));
|
return angles::radians_to_degrees(std::atan2(delta.z, delta.x));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} // namespace omath::projectile_prediction::traits
|
} // namespace omath::opengl_engine
|
||||||
@@ -4,18 +4,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "omath/engines/source_engine/constants.hpp"
|
#include "omath/engines/source_engine/constants.hpp"
|
||||||
#include "omath/projection/camera.hpp"
|
#include "omath/projection/camera.hpp"
|
||||||
|
#include "traits/camera_trait.hpp"
|
||||||
namespace omath::source_engine
|
namespace omath::source_engine
|
||||||
{
|
{
|
||||||
class Camera final : public projection::Camera<Mat4X4, ViewAngles>
|
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait>;
|
||||||
{
|
|
||||||
public:
|
|
||||||
Camera(const Vector3<float>& position, const ViewAngles& view_angles, const projection::ViewPort& view_port,
|
|
||||||
const Angle<float, 0.f, 180.f, AngleFlags::Clamped>& fov, float near, float far);
|
|
||||||
void look_at(const Vector3<float>& target) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
[[nodiscard]] Mat4X4 calc_view_matrix() const noexcept override;
|
|
||||||
[[nodiscard]] Mat4X4 calc_projection_matrix() const noexcept override;
|
|
||||||
};
|
|
||||||
} // namespace omath::source_engine
|
} // namespace omath::source_engine
|
||||||
24
include/omath/engines/source_engine/traits/camera_trait.hpp
Normal file
24
include/omath/engines/source_engine/traits/camera_trait.hpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
//
|
||||||
|
// Created by Vlad on 8/10/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "omath/engines/source_engine/constants.hpp"
|
||||||
|
#include "omath/projection/camera.hpp"
|
||||||
|
|
||||||
|
namespace omath::source_engine
|
||||||
|
{
|
||||||
|
class CameraTrait final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
[[nodiscard]]
|
||||||
|
static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin, const Vector3<float>& look_at) noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept;
|
||||||
|
[[nodiscard]]
|
||||||
|
static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov, const projection::ViewPort& view_port,
|
||||||
|
float near, float far) noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace omath::source_engine
|
||||||
@@ -8,27 +8,26 @@
|
|||||||
#include "omath/projectile_prediction/target.hpp"
|
#include "omath/projectile_prediction/target.hpp"
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
namespace omath::projectile_prediction::traits
|
namespace omath::source_engine
|
||||||
{
|
{
|
||||||
class SourceEngineTrait final
|
class PredEngineTrait final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
constexpr static Vector3<float> predict_projectile_position(const Projectile& projectile, const float pitch,
|
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile& projectile,
|
||||||
const float yaw, const float time,
|
const float pitch, const float yaw,
|
||||||
const float gravity) noexcept
|
const float time, const float gravity) noexcept
|
||||||
{
|
{
|
||||||
auto current_pos = projectile.m_origin
|
auto current_pos = projectile.m_origin
|
||||||
+ source_engine::forward_vector({source_engine::PitchAngle::from_degrees(-pitch),
|
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||||
source_engine::YawAngle::from_degrees(yaw),
|
RollAngle::from_degrees(0)})
|
||||||
source_engine::RollAngle::from_degrees(0)})
|
|
||||||
* projectile.m_launch_speed * time;
|
* projectile.m_launch_speed * time;
|
||||||
current_pos.z -= (gravity * projectile.m_gravity_scale) * (time * time) * 0.5f;
|
current_pos.z -= (gravity * projectile.m_gravity_scale) * (time * time) * 0.5f;
|
||||||
|
|
||||||
return current_pos;
|
return current_pos;
|
||||||
}
|
}
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static constexpr Vector3<float> predict_target_position(const Target& target, const float time,
|
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target& target,
|
||||||
const float gravity) noexcept
|
const float time, const float gravity) noexcept
|
||||||
{
|
{
|
||||||
auto predicted = target.m_origin + target.m_velocity * time;
|
auto predicted = target.m_origin + target.m_velocity * time;
|
||||||
|
|
||||||
@@ -50,7 +49,7 @@ namespace omath::projectile_prediction::traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static Vector3<float> calc_viewpoint_from_angles(const Projectile& projectile,
|
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile& projectile,
|
||||||
Vector3<float> predicted_target_position,
|
Vector3<float> predicted_target_position,
|
||||||
const std::optional<float> projectile_pitch) noexcept
|
const std::optional<float> projectile_pitch) noexcept
|
||||||
{
|
{
|
||||||
@@ -77,4 +76,4 @@ namespace omath::projectile_prediction::traits
|
|||||||
return angles::radians_to_degrees(std::atan2(delta.y, delta.x));
|
return angles::radians_to_degrees(std::atan2(delta.y, delta.x));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} // namespace omath::projectile_prediction::traits
|
} // namespace omath::source_engine
|
||||||
@@ -5,18 +5,9 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "omath/engines/unity_engine/constants.hpp"
|
#include "omath/engines/unity_engine/constants.hpp"
|
||||||
#include "omath/projection/camera.hpp"
|
#include "omath/projection/camera.hpp"
|
||||||
|
#include "traits/camera_trait.hpp"
|
||||||
|
|
||||||
namespace omath::unity_engine
|
namespace omath::unity_engine
|
||||||
{
|
{
|
||||||
class Camera final : public projection::Camera<Mat4X4, ViewAngles>
|
using Camera = projection::Camera<Mat4X4, ViewAngles, CameraTrait>;
|
||||||
{
|
|
||||||
public:
|
|
||||||
Camera(const Vector3<float>& position, const ViewAngles& view_angles, const projection::ViewPort& view_port,
|
|
||||||
const Angle<float, 0.f, 180.f, AngleFlags::Clamped>& fov, float near, float far);
|
|
||||||
void look_at(const Vector3<float>& target) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
[[nodiscard]] Mat4X4 calc_view_matrix() const noexcept override;
|
|
||||||
[[nodiscard]] Mat4X4 calc_projection_matrix() const noexcept override;
|
|
||||||
};
|
|
||||||
} // namespace omath::unity_engine
|
} // namespace omath::unity_engine
|
||||||
24
include/omath/engines/unity_engine/traits/camera_trait.hpp
Normal file
24
include/omath/engines/unity_engine/traits/camera_trait.hpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
//
|
||||||
|
// Created by Vlad on 8/10/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include "omath/engines/unity_engine/formulas.hpp"
|
||||||
|
#include "omath/projection/camera.hpp"
|
||||||
|
|
||||||
|
namespace omath::unity_engine
|
||||||
|
{
|
||||||
|
class CameraTrait final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
[[nodiscard]]
|
||||||
|
static ViewAngles calc_look_at_angle(const Vector3<float>& cam_origin, const Vector3<float>& look_at) noexcept;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
static Mat4X4 calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept;
|
||||||
|
[[nodiscard]]
|
||||||
|
static Mat4X4 calc_projection_matrix(const projection::FieldOfView& fov, const projection::ViewPort& view_port,
|
||||||
|
float near, float far) noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace omath::unity_engine
|
||||||
@@ -7,27 +7,26 @@
|
|||||||
#include "omath/projectile_prediction/target.hpp"
|
#include "omath/projectile_prediction/target.hpp"
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
namespace omath::projectile_prediction::traits
|
namespace omath::unity_engine
|
||||||
{
|
{
|
||||||
class UnityEngineTrait final
|
class PredEngineTrait final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
constexpr static Vector3<float> predict_projectile_position(const Projectile& projectile, const float pitch,
|
constexpr static Vector3<float> predict_projectile_position(const projectile_prediction::Projectile& projectile,
|
||||||
const float yaw, const float time,
|
const float pitch, const float yaw,
|
||||||
const float gravity) noexcept
|
const float time, const float gravity) noexcept
|
||||||
{
|
{
|
||||||
auto current_pos = projectile.m_origin
|
auto current_pos = projectile.m_origin
|
||||||
+ unity_engine::forward_vector({unity_engine::PitchAngle::from_degrees(-pitch),
|
+ forward_vector({PitchAngle::from_degrees(-pitch), YawAngle::from_degrees(yaw),
|
||||||
unity_engine::YawAngle::from_degrees(yaw),
|
RollAngle::from_degrees(0)})
|
||||||
unity_engine::RollAngle::from_degrees(0)})
|
|
||||||
* projectile.m_launch_speed * time;
|
* projectile.m_launch_speed * time;
|
||||||
current_pos.y -= (gravity * projectile.m_gravity_scale) * (time * time) * 0.5f;
|
current_pos.y -= (gravity * projectile.m_gravity_scale) * (time * time) * 0.5f;
|
||||||
|
|
||||||
return current_pos;
|
return current_pos;
|
||||||
}
|
}
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static constexpr Vector3<float> predict_target_position(const Target& target, const float time,
|
static constexpr Vector3<float> predict_target_position(const projectile_prediction::Target& target,
|
||||||
const float gravity) noexcept
|
const float time, const float gravity) noexcept
|
||||||
{
|
{
|
||||||
auto predicted = target.m_origin + target.m_velocity * time;
|
auto predicted = target.m_origin + target.m_velocity * time;
|
||||||
|
|
||||||
@@ -49,7 +48,7 @@ namespace omath::projectile_prediction::traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
static Vector3<float> calc_viewpoint_from_angles(const Projectile& projectile,
|
static Vector3<float> calc_viewpoint_from_angles(const projectile_prediction::Projectile& projectile,
|
||||||
Vector3<float> predicted_target_position,
|
Vector3<float> predicted_target_position,
|
||||||
const std::optional<float> projectile_pitch) noexcept
|
const std::optional<float> projectile_pitch) noexcept
|
||||||
{
|
{
|
||||||
@@ -76,4 +75,4 @@ namespace omath::projectile_prediction::traits
|
|||||||
return angles::radians_to_degrees(std::atan2(delta.z, delta.x));
|
return angles::radians_to_degrees(std::atan2(delta.z, delta.x));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
} // namespace omath::projectile_prediction::traits
|
} // namespace omath::unity_engine
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "engine_traits/source_engine_trait.hpp"
|
#include "omath/engines/source_engine/traits/pred_engine_trait.hpp"
|
||||||
#include "omath/projectile_prediction/proj_pred_engine.hpp"
|
#include "omath/projectile_prediction/proj_pred_engine.hpp"
|
||||||
#include "omath/projectile_prediction/projectile.hpp"
|
#include "omath/projectile_prediction/projectile.hpp"
|
||||||
#include "omath/projectile_prediction/target.hpp"
|
#include "omath/projectile_prediction/target.hpp"
|
||||||
@@ -13,7 +13,32 @@
|
|||||||
|
|
||||||
namespace omath::projectile_prediction
|
namespace omath::projectile_prediction
|
||||||
{
|
{
|
||||||
template<class EngineTrait = traits::SourceEngineTrait>
|
template<class T>
|
||||||
|
concept PredEngineConcept =
|
||||||
|
requires(const Projectile& projectile, const Target& target, const Vector3<float>& vec_a,
|
||||||
|
const Vector3<float>& vec_b,
|
||||||
|
Vector3<float> v3, // by-value for calc_viewpoint_from_angles
|
||||||
|
float pitch, float yaw, float time, float gravity, std::optional<float> maybe_pitch) {
|
||||||
|
// Presence + return types
|
||||||
|
{ T::predict_projectile_position(projectile, pitch, yaw, time, gravity) } -> std::same_as<Vec3>;
|
||||||
|
{ T::predict_target_position(target, time, gravity) } -> std::same_as<Vec3>;
|
||||||
|
{ T::calc_vector_2d_distance(vec_a) } -> std::same_as<float>;
|
||||||
|
{ T::get_vector_height_coordinate(vec_b) } -> std::same_as<float>;
|
||||||
|
{ T::calc_viewpoint_from_angles(projectile, v3, maybe_pitch) } -> std::same_as<Vec3>;
|
||||||
|
{ T::calc_direct_pitch_angle(vec_a, vec_b) } -> std::same_as<float>;
|
||||||
|
{ T::calc_direct_yaw_angle(vec_a, vec_b) } -> std::same_as<float>;
|
||||||
|
|
||||||
|
// Enforce noexcept as in PredEngineTrait
|
||||||
|
requires noexcept(T::predict_projectile_position(projectile, pitch, yaw, time, gravity));
|
||||||
|
requires noexcept(T::predict_target_position(target, time, gravity));
|
||||||
|
requires noexcept(T::calc_vector_2d_distance(vec_a));
|
||||||
|
requires noexcept(T::get_vector_height_coordinate(vec_b));
|
||||||
|
requires noexcept(T::calc_viewpoint_from_angles(projectile, v3, maybe_pitch));
|
||||||
|
requires noexcept(T::calc_direct_pitch_angle(vec_a, vec_b));
|
||||||
|
requires noexcept(T::calc_direct_yaw_angle(vec_a, vec_b));
|
||||||
|
};
|
||||||
|
template<class EngineTrait = source_engine::PredEngineTrait>
|
||||||
|
requires PredEngineConcept<EngineTrait>
|
||||||
class ProjPredEngineLegacy final : public ProjPredEngineInterface
|
class ProjPredEngineLegacy final : public ProjPredEngineInterface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -26,11 +26,27 @@ namespace omath::projection
|
|||||||
};
|
};
|
||||||
using FieldOfView = Angle<float, 0.f, 180.f, AngleFlags::Clamped>;
|
using FieldOfView = Angle<float, 0.f, 180.f, AngleFlags::Clamped>;
|
||||||
|
|
||||||
template<class Mat4X4Type, class ViewAnglesType>
|
template<class T, class MatType, class ViewAnglesType>
|
||||||
class Camera
|
concept CameraEngineConcept =
|
||||||
|
requires(const Vector3<float>& cam_origin, const Vector3<float>& look_at, const ViewAnglesType& angles,
|
||||||
|
const FieldOfView& fov, const ViewPort& viewport, float znear, float zfar) {
|
||||||
|
// Presence + return types
|
||||||
|
{ T::calc_look_at_angle(cam_origin, look_at) } -> std::same_as<ViewAnglesType>;
|
||||||
|
{ T::calc_view_matrix(angles, cam_origin) } -> std::same_as<MatType>;
|
||||||
|
{ T::calc_projection_matrix(fov, viewport, znear, zfar) } -> std::same_as<MatType>;
|
||||||
|
|
||||||
|
// Enforce noexcept as in the trait declaration
|
||||||
|
requires noexcept(T::calc_look_at_angle(cam_origin, look_at));
|
||||||
|
requires noexcept(T::calc_view_matrix(angles, cam_origin));
|
||||||
|
requires noexcept(T::calc_projection_matrix(fov, viewport, znear, zfar));
|
||||||
|
};
|
||||||
|
|
||||||
|
template<class Mat4X4Type, class ViewAnglesType, class TraitClass>
|
||||||
|
requires CameraEngineConcept<TraitClass, Mat4X4Type, ViewAnglesType>
|
||||||
|
class Camera final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~Camera() = default;
|
~Camera() = default;
|
||||||
Camera(const Vector3<float>& position, const ViewAnglesType& view_angles, const ViewPort& view_port,
|
Camera(const Vector3<float>& position, const ViewAnglesType& view_angles, const ViewPort& view_port,
|
||||||
const FieldOfView& fov, const float near, const float far) noexcept
|
const FieldOfView& fov, const float near, const float far) noexcept
|
||||||
: m_view_port(view_port), m_field_of_view(fov), m_far_plane_distance(far), m_near_plane_distance(near),
|
: m_view_port(view_port), m_field_of_view(fov), m_far_plane_distance(far), m_near_plane_distance(near),
|
||||||
@@ -39,15 +55,16 @@ namespace omath::projection
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void look_at(const Vector3<float>& target) = 0;
|
void look_at(const Vector3<float>& target)
|
||||||
|
{
|
||||||
[[nodiscard]] virtual Mat4X4Type calc_view_matrix() const noexcept = 0;
|
m_view_angles = TraitClass::calc_look_at_angle(m_origin, target);
|
||||||
|
}
|
||||||
[[nodiscard]] virtual Mat4X4Type calc_projection_matrix() const noexcept = 0;
|
|
||||||
|
|
||||||
[[nodiscard]] Mat4X4Type calc_view_projection_matrix() const noexcept
|
[[nodiscard]] Mat4X4Type calc_view_projection_matrix() const noexcept
|
||||||
{
|
{
|
||||||
return calc_projection_matrix() * calc_view_matrix();
|
return TraitClass::calc_projection_matrix(m_field_of_view, m_view_port, m_near_plane_distance,
|
||||||
|
m_far_plane_distance)
|
||||||
|
* TraitClass::calc_view_matrix(m_view_angles, m_origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -169,6 +186,18 @@ namespace omath::projection
|
|||||||
|
|
||||||
[[nodiscard]] Vector3<float> ndc_to_screen_position(const Vector3<float>& ndc) const noexcept
|
[[nodiscard]] Vector3<float> ndc_to_screen_position(const Vector3<float>& ndc) const noexcept
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
^
|
||||||
|
| y
|
||||||
|
1 |
|
||||||
|
|
|
||||||
|
|
|
||||||
|
-1 ---------0--------- 1 --> x
|
||||||
|
|
|
||||||
|
|
|
||||||
|
-1 |
|
||||||
|
v
|
||||||
|
*/
|
||||||
return {(ndc.x + 1.f) / 2.f * m_view_port.m_width, (1.f - ndc.y) / 2.f * m_view_port.m_height, ndc.z};
|
return {(ndc.x + 1.f) / 2.f * m_view_port.m_width, (1.f - ndc.y) / 2.f * m_view_port.m_height, ndc.z};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -190,6 +190,29 @@ namespace omath
|
|||||||
return x + y;
|
return x + y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator<(const Vector2& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() < other.length();
|
||||||
|
}
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator>(const Vector2& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() > other.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator<=(const Vector2& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() <= other.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator>=(const Vector2& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() >= other.length();
|
||||||
|
}
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
constexpr std::tuple<Type, Type> as_tuple() const noexcept
|
constexpr std::tuple<Type, Type> as_tuple() const noexcept
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -253,6 +253,30 @@ namespace omath
|
|||||||
return {angles::radians_to_degrees(std::asin(delta.z / distance)),
|
return {angles::radians_to_degrees(std::asin(delta.z / distance)),
|
||||||
angles::radians_to_degrees(std::atan2(delta.y, delta.x)), 0};
|
angles::radians_to_degrees(std::atan2(delta.y, delta.x)), 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator<(const Vector3& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() < other.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator>(const Vector3& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() > other.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator<=(const Vector3& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() <= other.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator>=(const Vector3& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() >= other.length();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} // namespace omath
|
} // namespace omath
|
||||||
// ReSharper disable once CppRedundantNamespaceDefinition
|
// ReSharper disable once CppRedundantNamespaceDefinition
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ namespace omath
|
|||||||
return Vector3<Type>::dot(other) + w * other.w;
|
return Vector3<Type>::dot(other) + w * other.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] Vector3<Type> length() const noexcept
|
[[nodiscard]] Type length() const noexcept
|
||||||
{
|
{
|
||||||
return std::sqrt(length_sqr());
|
return std::sqrt(length_sqr());
|
||||||
}
|
}
|
||||||
@@ -158,6 +158,30 @@ namespace omath
|
|||||||
return Vector3<Type>::sum() + w;
|
return Vector3<Type>::sum() + w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator<(const Vector4& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() < other.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator>(const Vector4& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() > other.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator<=(const Vector4& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() <= other.length();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
|
bool operator>=(const Vector4& other) const noexcept
|
||||||
|
{
|
||||||
|
return length() >= other.length();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef OMATH_IMGUI_INTEGRATION
|
#ifdef OMATH_IMGUI_INTEGRATION
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
ImVec4 to_im_vec4() const noexcept
|
ImVec4 to_im_vec4() const noexcept
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Vlad on 3/17/2025.
|
|
||||||
//
|
|
||||||
#include "omath/engines/iw_engine/camera.hpp"
|
|
||||||
#include "omath/engines/iw_engine/formulas.hpp"
|
|
||||||
|
|
||||||
namespace omath::iw_engine
|
|
||||||
{
|
|
||||||
|
|
||||||
Camera::Camera(const Vector3<float>& position, const ViewAngles& view_angles, const projection::ViewPort& view_port,
|
|
||||||
const Angle<float, 0.f, 180.f, AngleFlags::Clamped>& fov, const float near, const float far)
|
|
||||||
: projection::Camera<Mat4X4, ViewAngles>(position, view_angles, view_port, fov, near, far)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
void Camera::look_at([[maybe_unused]] const Vector3<float>& target)
|
|
||||||
{
|
|
||||||
const float distance = m_origin.distance_to(target);
|
|
||||||
const auto delta = target - m_origin;
|
|
||||||
|
|
||||||
m_view_angles.pitch = PitchAngle::from_radians(std::asin(delta.z / distance));
|
|
||||||
m_view_angles.yaw = -YawAngle::from_radians(std::atan2(delta.y, delta.x));
|
|
||||||
m_view_angles.roll = RollAngle::from_radians(0.f);
|
|
||||||
}
|
|
||||||
Mat4X4 Camera::calc_view_matrix() const noexcept
|
|
||||||
{
|
|
||||||
return iw_engine::calc_view_matrix(m_view_angles, m_origin);
|
|
||||||
}
|
|
||||||
Mat4X4 Camera::calc_projection_matrix() const noexcept
|
|
||||||
{
|
|
||||||
return calc_perspective_projection_matrix(m_field_of_view.as_degrees(), m_view_port.aspect_ratio(),
|
|
||||||
m_near_plane_distance, m_far_plane_distance);
|
|
||||||
}
|
|
||||||
} // namespace omath::iw_engine
|
|
||||||
27
source/engines/iw_engine/traits/camera_trait.cpp
Normal file
27
source/engines/iw_engine/traits/camera_trait.cpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
//
|
||||||
|
// Created by Vlad on 8/11/2025.
|
||||||
|
//
|
||||||
|
#include "omath/engines/iw_engine/traits/camera_trait.hpp"
|
||||||
|
|
||||||
|
namespace omath::iw_engine
|
||||||
|
{
|
||||||
|
|
||||||
|
ViewAngles CameraTrait::calc_look_at_angle(const Vector3<float>& cam_origin, const Vector3<float>& look_at) noexcept
|
||||||
|
{
|
||||||
|
const auto distance = cam_origin.distance_to(look_at);
|
||||||
|
const auto delta = cam_origin - look_at;
|
||||||
|
|
||||||
|
return {PitchAngle::from_radians(-std::asin(delta.z / distance)),
|
||||||
|
YawAngle::from_radians(std::atan2(delta.y, delta.x)), RollAngle::from_radians(0.f)};
|
||||||
|
}
|
||||||
|
Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||||
|
{
|
||||||
|
return iw_engine::calc_view_matrix(angles, cam_origin);
|
||||||
|
}
|
||||||
|
Mat4X4 CameraTrait::calc_projection_matrix(const projection::FieldOfView& fov,
|
||||||
|
const projection::ViewPort& view_port, const float near,
|
||||||
|
const float far) noexcept
|
||||||
|
{
|
||||||
|
return calc_perspective_projection_matrix(fov.as_degrees(), view_port.aspect_ratio(), near, far);
|
||||||
|
}
|
||||||
|
} // namespace omath::iw_engine
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Orange on 12/23/2024.
|
|
||||||
//
|
|
||||||
#include "omath/engines/opengl_engine/camera.hpp"
|
|
||||||
#include "omath/engines/opengl_engine/formulas.hpp"
|
|
||||||
|
|
||||||
namespace omath::opengl_engine
|
|
||||||
{
|
|
||||||
|
|
||||||
Camera::Camera(const Vector3<float>& position, const ViewAngles& view_angles, const projection::ViewPort& view_port,
|
|
||||||
const Angle<float, 0.f, 180.f, AngleFlags::Clamped>& fov, const float near, const float far)
|
|
||||||
: projection::Camera<Mat4X4, ViewAngles>(position, view_angles, view_port, fov, near, far)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
void Camera::look_at([[maybe_unused]] const Vector3<float>& target)
|
|
||||||
{
|
|
||||||
const float distance = m_origin.distance_to(target);
|
|
||||||
const auto delta = target - m_origin;
|
|
||||||
|
|
||||||
m_view_angles.pitch = PitchAngle::from_radians(std::asin(delta.z / distance));
|
|
||||||
m_view_angles.yaw = -YawAngle::from_radians(std::atan2(delta.y, delta.x));
|
|
||||||
m_view_angles.roll = RollAngle::from_radians(0.f);
|
|
||||||
}
|
|
||||||
Mat4X4 Camera::calc_view_matrix() const noexcept
|
|
||||||
{
|
|
||||||
return opengl_engine::calc_view_matrix(m_view_angles, m_origin);
|
|
||||||
}
|
|
||||||
Mat4X4 Camera::calc_projection_matrix() const noexcept
|
|
||||||
{
|
|
||||||
return calc_perspective_projection_matrix(m_field_of_view.as_degrees(), m_view_port.aspect_ratio(),
|
|
||||||
m_near_plane_distance, m_far_plane_distance);
|
|
||||||
}
|
|
||||||
} // namespace omath::opengl_engine
|
|
||||||
28
source/engines/opengl_engine/traits/camera_trait.cpp
Normal file
28
source/engines/opengl_engine/traits/camera_trait.cpp
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
//
|
||||||
|
// Created by Vlad on 8/11/2025.
|
||||||
|
//
|
||||||
|
#include "omath/engines/opengl_engine/traits/camera_trait.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
namespace omath::opengl_engine
|
||||||
|
{
|
||||||
|
|
||||||
|
ViewAngles CameraTrait::calc_look_at_angle(const Vector3<float>& cam_origin, const Vector3<float>& look_at) noexcept
|
||||||
|
{
|
||||||
|
const auto distance = cam_origin.distance_to(look_at);
|
||||||
|
const auto delta = cam_origin - look_at;
|
||||||
|
|
||||||
|
return {PitchAngle::from_radians(-std::asin(delta.y / distance)),
|
||||||
|
YawAngle::from_radians(std::atan2(delta.z, delta.x)), RollAngle::from_radians(0.f)};
|
||||||
|
}
|
||||||
|
Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||||
|
{
|
||||||
|
return opengl_engine::calc_view_matrix(angles, cam_origin);
|
||||||
|
}
|
||||||
|
Mat4X4 CameraTrait::calc_projection_matrix(const projection::FieldOfView& fov,
|
||||||
|
const projection::ViewPort& view_port, const float near,
|
||||||
|
const float far) noexcept
|
||||||
|
{
|
||||||
|
return calc_perspective_projection_matrix(fov.as_degrees(), view_port.aspect_ratio(), near, far);
|
||||||
|
}
|
||||||
|
} // namespace omath::opengl_engine
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Orange on 12/4/2024.
|
|
||||||
//
|
|
||||||
#include "omath/engines/source_engine/camera.hpp"
|
|
||||||
#include "omath/engines/source_engine/formulas.hpp"
|
|
||||||
|
|
||||||
namespace omath::source_engine
|
|
||||||
{
|
|
||||||
|
|
||||||
Camera::Camera(const Vector3<float>& position, const ViewAngles& view_angles, const projection::ViewPort& view_port,
|
|
||||||
const projection::FieldOfView& fov, const float near, const float far)
|
|
||||||
: projection::Camera<Mat4X4, ViewAngles>(position, view_angles, view_port, fov, near, far)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
void Camera::look_at(const Vector3<float>& target)
|
|
||||||
{
|
|
||||||
const float distance = m_origin.distance_to(target);
|
|
||||||
const auto delta = target - m_origin;
|
|
||||||
|
|
||||||
m_view_angles.pitch = PitchAngle::from_radians(std::asin(delta.z / distance));
|
|
||||||
m_view_angles.yaw = -YawAngle::from_radians(std::atan2(delta.y, delta.x));
|
|
||||||
m_view_angles.roll = RollAngle::from_radians(0.f);
|
|
||||||
}
|
|
||||||
|
|
||||||
Mat4X4 Camera::calc_view_matrix() const noexcept
|
|
||||||
{
|
|
||||||
return source_engine::calc_view_matrix(m_view_angles, m_origin);
|
|
||||||
}
|
|
||||||
|
|
||||||
Mat4X4 Camera::calc_projection_matrix() const noexcept
|
|
||||||
{
|
|
||||||
return calc_perspective_projection_matrix(m_field_of_view.as_degrees(), m_view_port.aspect_ratio(),
|
|
||||||
m_near_plane_distance, m_far_plane_distance);
|
|
||||||
}
|
|
||||||
} // namespace omath::source_engine
|
|
||||||
27
source/engines/source_engine/traits/camera_trait.cpp
Normal file
27
source/engines/source_engine/traits/camera_trait.cpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
//
|
||||||
|
// Created by Vlad on 8/11/2025.
|
||||||
|
//
|
||||||
|
#include "omath/engines/source_engine/traits/camera_trait.hpp"
|
||||||
|
|
||||||
|
namespace omath::source_engine
|
||||||
|
{
|
||||||
|
|
||||||
|
ViewAngles CameraTrait::calc_look_at_angle(const Vector3<float>& cam_origin, const Vector3<float>& look_at) noexcept
|
||||||
|
{
|
||||||
|
const auto distance = cam_origin.distance_to(look_at);
|
||||||
|
const auto delta = cam_origin - look_at;
|
||||||
|
|
||||||
|
return {PitchAngle::from_radians(-std::asin(delta.z / distance)),
|
||||||
|
YawAngle::from_radians(std::atan2(delta.y, delta.x)), RollAngle::from_radians(0.f)};
|
||||||
|
}
|
||||||
|
Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||||
|
{
|
||||||
|
return source_engine::calc_view_matrix(angles, cam_origin);
|
||||||
|
}
|
||||||
|
Mat4X4 CameraTrait::calc_projection_matrix(const projection::FieldOfView& fov,
|
||||||
|
const projection::ViewPort& view_port, const float near,
|
||||||
|
const float far) noexcept
|
||||||
|
{
|
||||||
|
return calc_perspective_projection_matrix(fov.as_degrees(), view_port.aspect_ratio(), near, far);
|
||||||
|
}
|
||||||
|
} // namespace omath::source_engine
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Vlad on 3/22/2025.
|
|
||||||
//
|
|
||||||
#include <omath/engines/unity_engine/camera.hpp>
|
|
||||||
#include <omath/engines/unity_engine/formulas.hpp>
|
|
||||||
|
|
||||||
namespace omath::unity_engine
|
|
||||||
{
|
|
||||||
Camera::Camera(const Vector3<float>& position, const ViewAngles& view_angles, const projection::ViewPort& view_port,
|
|
||||||
const projection::FieldOfView& fov, const float near, const float far)
|
|
||||||
: projection::Camera<Mat4X4, ViewAngles>(position, view_angles, view_port, fov, near, far)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
void Camera::look_at([[maybe_unused]] const Vector3<float>& target)
|
|
||||||
{
|
|
||||||
throw std::runtime_error("Not implemented");
|
|
||||||
}
|
|
||||||
Mat4X4 Camera::calc_view_matrix() const noexcept
|
|
||||||
{
|
|
||||||
return unity_engine::calc_view_matrix(m_view_angles, m_origin);
|
|
||||||
}
|
|
||||||
Mat4X4 Camera::calc_projection_matrix() const noexcept
|
|
||||||
{
|
|
||||||
return calc_perspective_projection_matrix(m_field_of_view.as_degrees(), m_view_port.aspect_ratio(),
|
|
||||||
m_near_plane_distance, m_far_plane_distance);
|
|
||||||
}
|
|
||||||
} // namespace omath::unity_engine
|
|
||||||
27
source/engines/unity_engine/traits/camera_trait.cpp
Normal file
27
source/engines/unity_engine/traits/camera_trait.cpp
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
//
|
||||||
|
// Created by Vlad on 8/11/2025.
|
||||||
|
//
|
||||||
|
#include "omath/engines/unity_engine/traits/camera_trait.hpp"
|
||||||
|
|
||||||
|
namespace omath::unity_engine
|
||||||
|
{
|
||||||
|
|
||||||
|
ViewAngles CameraTrait::calc_look_at_angle(const Vector3<float>& cam_origin, const Vector3<float>& look_at) noexcept
|
||||||
|
{
|
||||||
|
const auto distance = cam_origin.distance_to(look_at);
|
||||||
|
const auto delta = cam_origin - look_at;
|
||||||
|
|
||||||
|
return {PitchAngle::from_radians(-std::asin(delta.y / distance)),
|
||||||
|
YawAngle::from_radians(std::atan2(delta.z, delta.x)), RollAngle::from_radians(0.f)};
|
||||||
|
}
|
||||||
|
Mat4X4 CameraTrait::calc_view_matrix(const ViewAngles& angles, const Vector3<float>& cam_origin) noexcept
|
||||||
|
{
|
||||||
|
return unity_engine::calc_view_matrix(angles, cam_origin);
|
||||||
|
}
|
||||||
|
Mat4X4 CameraTrait::calc_projection_matrix(const projection::FieldOfView& fov,
|
||||||
|
const projection::ViewPort& view_port, const float near,
|
||||||
|
const float far) noexcept
|
||||||
|
{
|
||||||
|
return calc_perspective_projection_matrix(fov.as_degrees(), view_port.aspect_ratio(), near, far);
|
||||||
|
}
|
||||||
|
} // namespace omath::unity_engine
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
//
|
|
||||||
// Created by Vlad on 6/9/2024.
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "omath/projectile_prediction/projectile.hpp"
|
|
||||||
#include <omath/engines/source_engine/formulas.hpp>
|
|
||||||
|
|
||||||
namespace omath::projectile_prediction
|
|
||||||
{
|
|
||||||
} // namespace omath::projectile_prediction
|
|
||||||
@@ -346,6 +346,28 @@ TEST_F(UnitTestVector2, NegationOperator_ZeroVector)
|
|||||||
EXPECT_FLOAT_EQ(result.y, -0.0f);
|
EXPECT_FLOAT_EQ(result.y, -0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(UnitTestVector2, LessOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(v1 < v2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UnitTestVector2, GreaterOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(v2 > v1);
|
||||||
|
}
|
||||||
|
TEST_F(UnitTestVector2, LessEqualOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(omath::Vector2<float>{} <= omath::Vector2<float>{});
|
||||||
|
EXPECT_TRUE(omath::Vector2<float>{} <= omath::Vector2(1.f, 1.f));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UnitTestVector2, GreaterEqualOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(omath::Vector2<float>{} >= omath::Vector2<float>{});
|
||||||
|
EXPECT_TRUE(omath::Vector2(1.f, 1.f) >= omath::Vector2<float>{});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Static assertions (compile-time checks)
|
// Static assertions (compile-time checks)
|
||||||
static_assert(Vector2(1.0f, 2.0f).length_sqr() == 5.0f, "LengthSqr should be 5");
|
static_assert(Vector2(1.0f, 2.0f).length_sqr() == 5.0f, "LengthSqr should be 5");
|
||||||
static_assert(Vector2(1.0f, 2.0f).dot(Vector2(4.0f, 5.0f)) == 14.0f, "Dot product should be 14");
|
static_assert(Vector2(1.0f, 2.0f).dot(Vector2(4.0f, 5.0f)) == 14.0f, "Dot product should be 14");
|
||||||
|
|||||||
@@ -402,6 +402,27 @@ TEST_F(UnitTestVector3, IsPerpendicular)
|
|||||||
EXPECT_FALSE(Vector3(0.0f, 0.0f, 0.0f).is_perpendicular({0.0f, 0.0f, 1.0f}));
|
EXPECT_FALSE(Vector3(0.0f, 0.0f, 0.0f).is_perpendicular({0.0f, 0.0f, 1.0f}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(UnitTestVector3, LessOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(v1 < v2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UnitTestVector3, GreaterOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(v2 > v1);
|
||||||
|
}
|
||||||
|
TEST_F(UnitTestVector3, LessEqualOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(omath::Vector3<float>{} <= omath::Vector3<float>{});
|
||||||
|
EXPECT_TRUE(omath::Vector3<float>{} <= omath::Vector3(1.f, 1.f, 1.f));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UnitTestVector3, GreaterEqualOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(omath::Vector3<float>{} >= omath::Vector3<float>{});
|
||||||
|
EXPECT_TRUE(omath::Vector3(1.f, 1.f, 1.f) >= omath::Vector3<float>{});
|
||||||
|
}
|
||||||
|
|
||||||
// Static assertions (compile-time checks)
|
// Static assertions (compile-time checks)
|
||||||
static_assert(Vector3(1.0f, 2.0f, 3.0f).length_sqr() == 14.0f, "LengthSqr should be 14");
|
static_assert(Vector3(1.0f, 2.0f, 3.0f).length_sqr() == 14.0f, "LengthSqr should be 14");
|
||||||
static_assert(Vector3(1.0f, 2.0f, 3.0f).dot(Vector3(4.0f, 5.0f, 6.0f)) == 32.0f, "Dot product should be 32");
|
static_assert(Vector3(1.0f, 2.0f, 3.0f).dot(Vector3(4.0f, 5.0f, 6.0f)) == 32.0f, "Dot product should be 32");
|
||||||
|
|||||||
@@ -215,3 +215,23 @@ TEST_F(UnitTestVector4, Clamp)
|
|||||||
EXPECT_FLOAT_EQ(v3.z, 2.5f);
|
EXPECT_FLOAT_EQ(v3.z, 2.5f);
|
||||||
EXPECT_FLOAT_EQ(v3.w, 4.0f); // w is not clamped in this method
|
EXPECT_FLOAT_EQ(v3.w, 4.0f); // w is not clamped in this method
|
||||||
}
|
}
|
||||||
|
TEST_F(UnitTestVector4, LessOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(v1 < v2);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UnitTestVector4, GreaterOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(v2 > v1);
|
||||||
|
}
|
||||||
|
TEST_F(UnitTestVector4, LessEqualOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(omath::Vector4<float>{} <= omath::Vector4<float>{});
|
||||||
|
EXPECT_TRUE(omath::Vector4<float>{} <= omath::Vector4(1.f, 1.f, 1.f, 1.f));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(UnitTestVector4, GreaterEqualOperator)
|
||||||
|
{
|
||||||
|
EXPECT_TRUE(omath::Vector4<float>{} >= omath::Vector4<float>{});
|
||||||
|
EXPECT_TRUE(omath::Vector4(1.f, 1.f, 1.f, 1.f) >= omath::Vector4<float>{});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user