23#define __WIZARD_ENGINE_INTERNAL__
29float wze::camera::_x = {};
30float wze::camera::_y = {};
31float wze::camera::_z = {};
32float wze::camera::_angle = {};
33std::array<float, 4> wze::camera::_transformation_matrix = {};
34float wze::camera::_focus = {};
36float wze::camera::x() {
40void wze::camera::set_x(
float x) {
44float wze::camera::y() {
48void wze::camera::set_y(
float y) {
52float wze::camera::z() {
56void wze::camera::set_z(
float z) {
60float wze::camera::angle() {
64void wze::camera::set_angle(
float angle) {
69std::array<float, 4>
const& wze::camera::transformation_matrix() {
70 return _transformation_matrix;
73float wze::camera::focus() {
77void wze::camera::set_focus(
float focus) {
81void wze::camera::initialize() {
88 set_focus(
math::length(window::width(), window::height()) /
89 (2 * tanf(field_of_view / 2)));
92void wze::camera::project(renderable& instance) {
97 if (!instance.spatial()) {
98 instance.set_screen_area(
99 {instance.x(), instance.y(), instance.width(), instance.height()});
100 instance.set_screen_angle(instance.angle());
104 instance.set_screen_angle(instance.angle() - angle());
106 if (instance.z() == camera::z()) {
107 instance.set_screen_area({0, 0, 0, 0});
111 x = instance.x() - camera::x();
112 y = instance.y() - camera::y();
113 z = instance.z() - camera::z();
116 instance.set_screen_area(
128 instance.width() * z, instance.height() * z});
131std::pair<float, float> wze::camera::project(
float x,
float y,
float z) {
132 if (z == camera::z()) {
150std::pair<float, float> wze::camera::unproject(
float x,
float y,
float z) {
153 if (!(
bool)focus()) {
159 transformation_matrix().at(0) * transformation_matrix().at(3) -
160 transformation_matrix().at(1) * transformation_matrix().at(2);
163 return {camera::x() + (x * transformation_matrix().at(3) -
164 y * transformation_matrix().at(1)) /
166 camera::y() + (y * transformation_matrix().at(0) -
167 x * transformation_matrix().at(2)) /
172 return {camera::x() + (x * transformation_matrix().at(3) -
173 y * transformation_matrix().at(1)) /
175 camera::y() + (y * transformation_matrix().at(0) -
176 x * transformation_matrix().at(2)) /
Subsystem to handle transformations and spatial projections.
static constexpr float to_radians(float degrees)
Converts degrees to radians.
static constexpr float transform_y(float x, float y, std::array< float, 4 > const &transformation_matrix)
Transforms the y component of a vector.
static std::array< float, 4 > transformation_matrix(float angle, float scale)
Creates a transformation matrix.
static float length(float x, float y)
Returns the length of a vector.
static constexpr float transform_x(float x, float y, std::array< float, 4 > const &transformation_matrix)
Transforms the x component of a vector.
Subsystem to handle game window.