207 lines
6.6 KiB
C
207 lines
6.6 KiB
C
#ifndef _BGC_SLERP_H_INCLUDED_
|
|
#define _BGC_SLERP_H_INCLUDED_
|
|
|
|
#include "./types.h"
|
|
#include "./quaternion.h"
|
|
#include "./turn3.h"
|
|
|
|
// =================== Reset ==================== //
|
|
|
|
inline void bgc_fp32_slerp3_reset(BGC_FP32_Slerp3* slerp)
|
|
{
|
|
slerp->_cosine_weight.s0 = 1.0f;
|
|
slerp->_cosine_weight.x1 = 0.0f;
|
|
slerp->_cosine_weight.x2 = 0.0f;
|
|
slerp->_cosine_weight.x3 = 0.0f;
|
|
|
|
slerp->_sine_weight.s0 = 0.0f;
|
|
slerp->_sine_weight.x1 = 0.0f;
|
|
slerp->_sine_weight.x2 = 0.0f;
|
|
slerp->_sine_weight.x3 = 0.0f;
|
|
|
|
slerp->radians = 0.0f;
|
|
}
|
|
|
|
inline void bgc_fp64_slerp3_reset(BGC_FP64_Slerp3* slerp)
|
|
{
|
|
slerp->_cosine_weight.s0 = 1.0;
|
|
slerp->_cosine_weight.x1 = 0.0;
|
|
slerp->_cosine_weight.x2 = 0.0;
|
|
slerp->_cosine_weight.x3 = 0.0;
|
|
|
|
slerp->_sine_weight.s0 = 0.0;
|
|
slerp->_sine_weight.x1 = 0.0;
|
|
slerp->_sine_weight.x2 = 0.0;
|
|
slerp->_sine_weight.x3 = 0.0;
|
|
|
|
slerp->radians = 0.0;
|
|
}
|
|
|
|
// ==================== Make ==================== //
|
|
|
|
void bgc_fp32_slerp3_make(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* augment);
|
|
void bgc_fp64_slerp3_make(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* augment);
|
|
|
|
// ================= Make Full ================== //
|
|
|
|
inline void bgc_fp32_slerp3_make_full(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end)
|
|
{
|
|
BGC_FP32_Turn3 augment;
|
|
|
|
bgc_fp32_turn3_exclude(&augment, end, start);
|
|
|
|
bgc_fp32_slerp3_make(slerp, start, &augment);
|
|
}
|
|
|
|
inline void bgc_fp64_slerp3_make_full(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end)
|
|
{
|
|
BGC_FP64_Turn3 augment;
|
|
|
|
bgc_fp64_turn3_exclude(&augment, end, start);
|
|
|
|
bgc_fp64_slerp3_make(slerp, start, &augment);
|
|
}
|
|
|
|
// =============== Make Shortened =============== //
|
|
|
|
inline void bgc_fp32_slerp3_make_shortened(BGC_FP32_Slerp3* slerp, const BGC_FP32_Turn3* start, const BGC_FP32_Turn3* end)
|
|
{
|
|
BGC_FP32_Turn3 augment;
|
|
|
|
bgc_fp32_turn3_exclude(&augment, end, start);
|
|
bgc_fp32_turn3_shorten(&augment);
|
|
|
|
bgc_fp32_slerp3_make(slerp, start, &augment);
|
|
}
|
|
|
|
inline void bgc_fp64_slerp3_make_shortened(BGC_FP64_Slerp3* slerp, const BGC_FP64_Turn3* start, const BGC_FP64_Turn3* end)
|
|
{
|
|
BGC_FP64_Turn3 augment;
|
|
|
|
bgc_fp64_turn3_exclude(&augment, end, start);
|
|
bgc_fp64_turn3_shorten(&augment);
|
|
|
|
bgc_fp64_slerp3_make(slerp, start, &augment);
|
|
}
|
|
|
|
// =============== Get Phase Turn =============== //
|
|
|
|
inline void bgc_fp32_slerp3_get_phase_turn(BGC_FP32_Turn3* turn, const BGC_FP32_Slerp3* slerp, const float phase)
|
|
{
|
|
const float angle = slerp->radians * phase;
|
|
const float cosine = cosf(angle);
|
|
const float sine = sinf(angle);
|
|
|
|
BGC_FP32_Quaternion q;
|
|
|
|
bgc_fp32_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
|
|
bgc_fp32_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
|
|
|
|
bgc_fp32_turn3_set_quaternion(turn, &q);
|
|
}
|
|
|
|
inline void bgc_fp64_slerp3_get_phase_turn(BGC_FP64_Turn3* turn, const BGC_FP64_Slerp3* slerp, const double phase)
|
|
{
|
|
const double angle = slerp->radians * phase;
|
|
const double cosine = cos(angle);
|
|
const double sine = sin(angle);
|
|
|
|
BGC_FP64_Quaternion q;
|
|
|
|
bgc_fp64_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
|
|
bgc_fp64_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
|
|
|
|
bgc_fp64_turn3_set_quaternion(turn, &q);
|
|
}
|
|
|
|
// ========= Get Phase Rotation Matrix ========== //
|
|
|
|
inline void bgc_fp32_slerp3_get_phase_rotation_matrix(BGC_FP32_Matrix3x3* rotation_matrix, const BGC_FP32_Slerp3* slerp, const float phase)
|
|
{
|
|
const float angle = slerp->radians * phase;
|
|
const float cosine = cosf(angle);
|
|
const float sine = sinf(angle);
|
|
|
|
BGC_FP32_Quaternion q;
|
|
|
|
bgc_fp32_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
|
|
bgc_fp32_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
|
|
|
|
bgc_fp32_quaternion_get_rotation_matrix(rotation_matrix, &q);
|
|
}
|
|
|
|
inline void bgc_fp64_slerp3_get_phase_rotation_matrix(BGC_FP64_Matrix3x3* rotation_matrix, const BGC_FP64_Slerp3* slerp, const double phase)
|
|
{
|
|
const double angle = slerp->radians * phase;
|
|
const double cosine = cos(angle);
|
|
const double sine = sin(angle);
|
|
|
|
BGC_FP64_Quaternion q;
|
|
|
|
bgc_fp64_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
|
|
bgc_fp64_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
|
|
|
|
bgc_fp64_quaternion_get_rotation_matrix(rotation_matrix, &q);
|
|
}
|
|
|
|
// ========== Get Phase Reverse Matrix ========== //
|
|
|
|
inline void bgc_fp32_slerp3_get_phase_reverse_matrix(BGC_FP32_Matrix3x3* reverse_matrix, const BGC_FP32_Slerp3* slerp, const float phase)
|
|
{
|
|
const float angle = slerp->radians * phase;
|
|
const float cosine = cosf(angle);
|
|
const float sine = sinf(angle);
|
|
|
|
BGC_FP32_Quaternion q;
|
|
|
|
bgc_fp32_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
|
|
bgc_fp32_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
|
|
|
|
bgc_fp32_quaternion_get_reverse_matrix(reverse_matrix, &q);
|
|
}
|
|
|
|
inline void bgc_fp64_slerp3_get_phase_reverse_matrix(BGC_FP64_Matrix3x3* reverse_matrix, const BGC_FP64_Slerp3* slerp, const double phase)
|
|
{
|
|
const double angle = slerp->radians * phase;
|
|
const double cosine = cos(angle);
|
|
const double sine = sin(angle);
|
|
|
|
BGC_FP64_Quaternion q;
|
|
|
|
bgc_fp64_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
|
|
bgc_fp64_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
|
|
|
|
bgc_fp64_quaternion_get_reverse_matrix(reverse_matrix, &q);
|
|
}
|
|
|
|
// ========== Get Phase Both Matrices =========== //
|
|
|
|
inline void bgc_fp32_slerp3_get_phase_both_matrices(BGC_FP32_Matrix3x3* rotation_matrix, BGC_FP32_Matrix3x3* reverse_matrix, const BGC_FP32_Slerp3* slerp, const float phase)
|
|
{
|
|
const float angle = slerp->radians * phase;
|
|
const float cosine = cosf(angle);
|
|
const float sine = sinf(angle);
|
|
|
|
BGC_FP32_Quaternion q;
|
|
|
|
bgc_fp32_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
|
|
bgc_fp32_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
|
|
|
|
bgc_fp32_quaternion_get_both_matrices(rotation_matrix, reverse_matrix, &q);
|
|
}
|
|
|
|
inline void bgc_fp64_slerp3_get_phase_both_matrices(BGC_FP64_Matrix3x3* rotation_matrix, BGC_FP64_Matrix3x3* reverse_matrix, const BGC_FP64_Slerp3* slerp, const double phase)
|
|
{
|
|
const double angle = slerp->radians * phase;
|
|
const double cosine = cos(angle);
|
|
const double sine = sin(angle);
|
|
|
|
BGC_FP64_Quaternion q;
|
|
|
|
bgc_fp64_quaternion_multiply_by_real(&q, &slerp->_cosine_weight, cosine);
|
|
bgc_fp64_quaternion_add_scaled(&q, &q, &slerp->_sine_weight, sine);
|
|
|
|
bgc_fp64_quaternion_get_both_matrices(rotation_matrix, reverse_matrix, &q);
|
|
}
|
|
|
|
#endif
|