Created deg struct for better usage of degree

This commit is contained in:
2024-04-03 20:59:30 -05:00
parent 74a483da28
commit d0aa1d43d2
5 changed files with 74 additions and 42 deletions

View File

@@ -1,6 +1,6 @@
#pragma once
#include "../GPU/gpu_types.hpp"
#include "../../math.h"
#include "../../math.hpp"
namespace JabyEngine {
namespace GTE {
@@ -44,8 +44,9 @@ namespace JabyEngine {
{0, 0, 4096}
}
};
} // TODO: replace int32_t with something weird for the DEG stuff??
static ROTMATRIX rotated(int32_t x, int32_t y, int32_t z);
}
static ROTMATRIX rotated(deg_t x = deg_t::zero(), deg_t y = deg_t::zero(), deg_t z = deg_t::zero());
};
struct TRANSFERVECTOR : public VECTOR {
@@ -70,8 +71,8 @@ namespace JabyEngine {
return MATRIX{.rotation = ROTMATRIX::identity(), .transfer = TRANSFERVECTOR::translated(x, y, z)};
}
static constexpr MATRIX rotated(int32_t x_deg = 0, int32_t y_deg = 0, int32_t z_deg = 0) {
return MATRIX{.rotation = ROTMATRIX::rotated(x_deg, y_deg, z_deg), .transfer = TRANSFERVECTOR::identity()};
static MATRIX rotated(deg_t x = deg_t::zero(), deg_t y = deg_t::zero(), deg_t z = deg_t::zero()) {
return MATRIX{.rotation = ROTMATRIX::rotated(x, y, z), .transfer = TRANSFERVECTOR::identity()};
}
static MATRIX comp(MATRIX new_matrix, const MATRIX& matrix) {
@@ -83,24 +84,5 @@ namespace JabyEngine {
GPU::Vertex& apply_to(GPU::Vertex& vertex) const;
GPU::Vertex apply_to(const GPU::Vertex& vertex) const;
};
static constexpr auto one_degree = FULL_CIRCLE/360;
static constexpr auto one_tenth_degree = FULL_CIRCLE/3600;
static constexpr int16_t in_degree(int32_t degree) {
return degree*one_degree;
}
static constexpr int16_t in_degree10(int32_t degree) {
return degree*one_tenth_degree;
}
}
static constexpr unsigned long long operator""_DEG(unsigned long long degree) {
return GTE::in_degree(degree);
}
static constexpr unsigned long long operator""_DEG10(unsigned long long degree) {
return GTE::in_degree10(degree);
}
}

View File

@@ -1,10 +0,0 @@
#ifndef __MATH_H__
#define __MATH_H__
#include "stdint.h"
#define FULL_CIRCLE 32768
int32_t sin(int32_t value);
int32_t cos(int32_t value);
#endif // !__MATH_H__

57
include/math.hpp Normal file
View File

@@ -0,0 +1,57 @@
#pragma once
#include "stdint.h"
namespace math {
template<typename T>
struct raw_math {
constexpr T operator-() const {
return T{.raw = -(static_cast<const T&>(*this).raw)};
}
constexpr T operator+(const T& obj) const {
return T{.raw = static_cast<const T&>(*this).raw + obj.raw};
}
constexpr T operator-(const T& b) const {}
constexpr T& operator+=(const T& obj) {
static_cast<T&>(*this).raw += obj.raw;
return static_cast<T&>(*this);
}
constexpr T& operator-=(const T& obj) {
static_cast<T&>(*this).raw -= obj.raw;
return static_cast<T&>(*this);
}
};
}
struct deg_t : public math::raw_math<deg_t> {
static constexpr auto full_circle = 32768;
static constexpr auto one_degree = full_circle/360;
static constexpr auto one_tenth_degree = full_circle/3600;
int16_t raw;
static constexpr deg_t zero() {
return deg_t{.raw = 0};
}
static constexpr deg_t from_degree(int32_t deg) {
return deg_t{.raw = static_cast<int16_t>(deg*one_degree)};
}
static constexpr deg_t from_tenth_degree(int32_t deg10) {
return deg_t{.raw = static_cast<int16_t>(deg10*one_tenth_degree)};
}
};
static constexpr deg_t operator""_deg(long double degree) {
return deg_t::from_tenth_degree((degree*10.0));
}
using sin_t = int32_t;
using cos_t = int32_t;
sin_t sin(deg_t value);
cos_t cos(deg_t value);