| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- #ifndef MATH_H
- #define MATH_H
- #include "stdint.h"
- typedef struct {
- int x;
- int y;
- } RI_vector_2;
- typedef struct {
- double x;
- double y;
- } RI_vector_2f;
- typedef struct {
- double x;
- double y;
- double z;
- } RI_vector_3f;
- typedef struct {
- double w;
- double x;
- double y;
- double z;
- } RI_vector_4f;
- void vector_2f_times_double(RI_vector_2f *vector, double value){
- vector->x *= value;
- vector->y *= value;
- }
- void vector_3f_times_double(RI_vector_3f *vector, double value){
- vector->x *= value;
- vector->y *= value;
- vector->z *= value;
- }
- void vector_3f_hadamard(RI_vector_3f *multiplicand, RI_vector_3f multiplicator){
- multiplicand->x *= multiplicator.x;
- multiplicand->y *= multiplicator.y;
- multiplicand->z *= multiplicator.z;
- }
- void vector_2f_element_wise_add(RI_vector_2f *addend_a, RI_vector_2f addend_b){
- addend_a->x += addend_b.x;
- addend_a->y += addend_b.y;
- }
- void vector_3f_element_wise_add(RI_vector_3f *addend_a, RI_vector_3f addend_b){
- addend_a->x += addend_b.x;
- addend_a->y += addend_b.y;
- addend_a->z += addend_b.z;
- }
- void vector_3f_element_wise_subtract(RI_vector_3f *minuend, RI_vector_3f subtrahend){
- minuend->x -= subtrahend.x;
- minuend->y -= subtrahend.y;
- minuend->z -= subtrahend.z;
- }
- void vector_3f_divide_double(RI_vector_3f *dividend, double divisor){
- dividend->x /= divisor;
- dividend->y /= divisor;
- dividend->z /= divisor;
- }
- void quaternion_conjugate(RI_vector_4f* quaternion){
- quaternion->x *= -1;
- quaternion->y *= -1;
- quaternion->z *= -1;
- }
- void quaternion_multiply(RI_vector_4f* a, RI_vector_4f b){
- double w1 = a->w; double x1 = a->x; double y1 = a->y; double z1 = a->z;
- double w2 = b.w; double x2 = b.x; double y2 = b.y; double z2 = b.z;
- double w = w1*w2 - x1*x2 - y1*y2 - z1*z2;
- double x = w1*x2 + x1*w2 + y1*z2 - z1*y2;
- double y = w1*y2 - x1*z2 + y1*w2 + z1*x2;
- double z = w1*z2 + x1*y2 - y1*x2 + z1*w2;
- *a = (RI_vector_4f){w, x, y, z};
- }
- void vector_2f_lerp(RI_vector_2f vector_a, RI_vector_2f vector_b, RI_vector_2f *result, double w1){
- double w0 = 1.0 - w1;
- vector_2f_times_double(result, 0);
- vector_2f_times_double(&vector_a, w0);
- vector_2f_times_double(&vector_b, w1);
- vector_2f_element_wise_add(result, vector_a);
- vector_2f_element_wise_add(result, vector_b);
- }
- void vector_3f_lerp(RI_vector_3f vector_a, RI_vector_3f vector_b, RI_vector_3f *result, double w1){
- double w0 = 1.0 - w1;
- vector_3f_times_double(result, 0);
- vector_3f_times_double(&vector_a, w0);
- vector_3f_times_double(&vector_b, w1);
- vector_3f_element_wise_add(result, vector_a);
- vector_3f_element_wise_add(result, vector_b);
- }
- #endif
|