bgc-c/basic-geometry/rotation3.h

101 lines
2.6 KiB
C

#ifndef _BGC_ROTATION3_H_
#define _BGC_ROTATION3_H_
#include "utilities.h"
#include "angle.h"
#include "vector3.h"
typedef struct {
bgc_vector3_fp32_t axis;
float radians;
} bgc_rotation3_fp32_t;
typedef struct {
bgc_vector3_fp64_t axis;
double radians;
} bgc_rotation3_fp64_t;
extern const bgc_rotation3_fp32_t BGC_IDLE_ROTATION3_FP32;
extern const bgc_rotation3_fp64_t BGC_IDLE_ROTATION3_FP64;
// =================== Reset ==================== //
inline void bgc_rotation3_reset_fp32(bgc_rotation3_fp32_t* rotation)
{
rotation->axis.x1 = 0.0f;
rotation->axis.x2 = 0.0f;
rotation->axis.x3 = 0.0f;
rotation->radians = 0.0f;
}
inline void bgc_rotation3_reset_fp64(bgc_rotation3_fp64_t* rotation)
{
rotation->axis.x1 = 0.0;
rotation->axis.x2 = 0.0;
rotation->axis.x3 = 0.0;
rotation->radians = 0.0;
}
// ==================== Make ==================== //
inline void bgc_rotation3_set_values_fp32(const float x1, const float x2, const float x3, const float angle, const bgc_angle_unit_t unit, bgc_rotation3_fp32_t* rotation)
{
rotation->axis.x1 = x1;
rotation->axis.x2 = x2;
rotation->axis.x3 = x3;
if (bgc_vector3_normalize_fp32(&rotation->axis)) {
rotation->radians = bgc_angle_to_radians_fp32(angle, unit);
}
else {
rotation->radians = 0.0f;
}
}
inline void bgc_rotation3_set_values_fp64(const double x1, const double x2, const double x3, const double angle, const bgc_angle_unit_t unit, bgc_rotation3_fp64_t* rotation)
{
rotation->axis.x1 = x1;
rotation->axis.x2 = x2;
rotation->axis.x3 = x3;
if (bgc_vector3_normalize_fp64(&rotation->axis)) {
rotation->radians = bgc_angle_to_radians_fp64(angle, unit);
}
else {
rotation->radians = 0.0;
}
}
inline void bgc_rotation3_set_with_axis_fp32(const bgc_vector3_fp32_t* axis, const float angle, const bgc_angle_unit_t unit, bgc_rotation3_fp32_t* rotation)
{
rotation->axis.x1 = axis->x1;
rotation->axis.x2 = axis->x2;
rotation->axis.x3 = axis->x3;
if (bgc_vector3_normalize_fp32(&rotation->axis)) {
rotation->radians = bgc_angle_to_radians_fp32(angle, unit);
}
else {
rotation->radians = 0.0f;
}
}
inline void bgc_rotation3_set_with_axis_fp64(const bgc_vector3_fp64_t* axis, const double angle, const bgc_angle_unit_t unit, bgc_rotation3_fp64_t* rotation)
{
rotation->axis.x1 = axis->x1;
rotation->axis.x2 = axis->x2;
rotation->axis.x3 = axis->x3;
if (bgc_vector3_normalize_fp64(&rotation->axis)) {
rotation->radians = bgc_angle_to_radians_fp64(angle, unit);
}
else {
rotation->radians = 0.0;
}
}
#endif