terrain

Real-time terrain generation using marching cubes
git clone git://git.christianermann.dev/terrain
Log | Files | Refs | README | LICENSE

vec.c (5034B)


      1 #include "vec.h"
      2 
      3 #include <math.h>
      4 
      5 f32 radians(f32 degrees)
      6 {
      7     return degrees * (M_PI / 180.0f);
      8 }
      9 
     10 b8 IVec3_equal(const IVec3 a, const IVec3 b)
     11 {
     12     return (a[0] == b[0]) & (a[1] == b[1]) & (a[2] == b[2]);
     13 }
     14 
     15 void Vec3_set(f32 x, f32 y, f32 z, Vec3 dst)
     16 {
     17     dst[0] = x;
     18     dst[1] = y;
     19     dst[2] = z;
     20 }
     21 
     22 void Vec3_scale(const Vec3 src, f32 scale, Vec3 dst)
     23 {
     24     dst[0] = src[0] * scale;
     25     dst[1] = src[1] * scale;
     26     dst[2] = src[2] * scale;
     27 }
     28 
     29 void Vec3_add(const Vec3 src_a, const Vec3 src_b, Vec3 dst)
     30 {
     31     dst[0] = src_a[0] + src_b[0];
     32     dst[1] = src_a[1] + src_b[1];
     33     dst[2] = src_a[2] + src_b[2];
     34 }
     35 
     36 void Vec3_sub(const Vec3 src_a, const Vec3 src_b, Vec3 dst)
     37 {
     38     dst[0] = src_a[0] - src_b[0];
     39     dst[1] = src_a[1] - src_b[1];
     40     dst[2] = src_a[2] - src_b[2];
     41 }
     42 
     43 void Vec3_mul(const Vec3 src_a, const Vec3 src_b, Vec3 dst)
     44 {
     45     dst[0] = src_a[1] * src_b[2] - src_a[2] * src_b[1];
     46     dst[1] = src_a[2] * src_b[0] - src_a[0] * src_b[2];
     47     dst[2] = src_a[0] * src_b[1] - src_a[1] * src_b[0];
     48 }
     49 
     50 void Vec3_normalize(const Vec3 src, Vec3 dst)
     51 {
     52     f32 m = Vec3_mag(src);
     53     if (m > 0.0f)
     54     {
     55         dst[0] = src[0] / m;
     56         dst[1] = src[1] / m;
     57         dst[2] = src[2] / m;
     58     }
     59 }
     60 
     61 f32 Vec3_dot(const Vec3 src_a, const Vec3 src_b)
     62 {
     63     return src_a[0] * src_b[0] + src_a[1] * src_b[1] + src_a[2] * src_b[2];
     64 }
     65 
     66 f32 Vec3_magSquared(const Vec3 src)
     67 {
     68     return Vec3_dot(src, src);
     69 }
     70 
     71 f32 Vec3_mag(const Vec3 src)
     72 {
     73     return sqrtf(Vec3_magSquared(src));
     74 }
     75 
     76 void Mat4_mul(const Mat4 src_a, const Mat4 src_b, Mat4 dst)
     77 {
     78     // x basis
     79     dst[0][0] = src_a[0][0] * src_b[0][0] + src_a[1][0] * src_b[0][1] + src_a[2][0] * src_b[0][2] + src_a[3][0] * src_b[0][3];
     80     dst[0][1] = src_a[0][1] * src_b[0][0] + src_a[1][1] * src_b[0][1] + src_a[2][1] * src_b[0][2] + src_a[3][1] * src_b[0][3];
     81     dst[0][2] = src_a[0][2] * src_b[0][0] + src_a[1][2] * src_b[0][1] + src_a[2][2] * src_b[0][2] + src_a[3][2] * src_b[0][3];
     82     dst[0][3] = src_a[0][3] * src_b[0][0] + src_a[1][3] * src_b[0][1] + src_a[2][3] * src_b[0][2] + src_a[3][3] * src_b[0][3];
     83 
     84     // y basis
     85     dst[1][0] = src_a[0][0] * src_b[1][0] + src_a[1][0] * src_b[1][1] + src_a[2][0] * src_b[1][2] + src_a[3][0] * src_b[1][3];
     86     dst[1][1] = src_a[0][1] * src_b[1][0] + src_a[1][1] * src_b[1][1] + src_a[2][1] * src_b[1][2] + src_a[3][1] * src_b[1][3];
     87     dst[1][2] = src_a[0][2] * src_b[1][0] + src_a[1][2] * src_b[1][1] + src_a[2][2] * src_b[1][2] + src_a[3][2] * src_b[1][3];
     88     dst[1][3] = src_a[0][3] * src_b[1][0] + src_a[1][3] * src_b[1][1] + src_a[2][3] * src_b[1][2] + src_a[3][3] * src_b[1][3];
     89 
     90     // z basis
     91     dst[2][0] = src_a[0][0] * src_b[2][0] + src_a[1][0] * src_b[2][1] + src_a[2][0] * src_b[2][2] + src_a[3][0] * src_b[2][3];
     92     dst[2][1] = src_a[0][1] * src_b[2][0] + src_a[1][1] * src_b[2][1] + src_a[2][1] * src_b[2][2] + src_a[3][1] * src_b[2][3];
     93     dst[2][2] = src_a[0][2] * src_b[2][0] + src_a[1][2] * src_b[2][1] + src_a[2][2] * src_b[2][2] + src_a[3][2] * src_b[2][3];
     94     dst[2][3] = src_a[0][3] * src_b[2][0] + src_a[1][3] * src_b[2][1] + src_a[2][3] * src_b[2][2] + src_a[3][3] * src_b[2][3];
     95 
     96     // w basis
     97     dst[3][0] = src_a[0][0] * src_b[3][0] + src_a[1][0] * src_b[3][1] + src_a[2][0] * src_b[3][2] + src_a[3][0] * src_b[3][3];
     98     dst[3][1] = src_a[0][1] * src_b[3][0] + src_a[1][1] * src_b[3][1] + src_a[2][1] * src_b[3][2] + src_a[3][1] * src_b[3][3];
     99     dst[3][2] = src_a[0][2] * src_b[3][0] + src_a[1][2] * src_b[3][1] + src_a[2][2] * src_b[3][2] + src_a[3][2] * src_b[3][3];
    100     dst[3][3] = src_a[0][3] * src_b[3][0] + src_a[1][3] * src_b[3][1] + src_a[2][3] * src_b[3][2] + src_a[3][3] * src_b[3][3];
    101 }
    102 
    103 void Mat4_lookAt(const Vec3 camera, const Vec3 target, const Vec3 up, Mat4 dst)
    104 {
    105     Vec3 f;
    106     Vec3_sub(target, camera, f);
    107     Vec3_normalize(f, f);
    108 
    109     Vec3 s;
    110     Vec3_mul(f, up, s);
    111     Vec3_normalize(s, s);
    112 
    113     Vec3 u;
    114     Vec3_mul(s, f, u);
    115     Vec3_normalize(s, s);
    116 
    117     // x basis
    118     dst[0][0] = s[0];
    119     dst[0][1] = u[0];
    120     dst[0][2] = -f[0];
    121     dst[0][3] = 0.0f;
    122 
    123     // y basis
    124     dst[1][0] = s[1];
    125     dst[1][1] = u[1];
    126     dst[1][2] = -f[1];
    127     dst[1][3] = 0.0f;
    128 
    129     // z basis
    130     dst[2][0] = s[2];
    131     dst[2][1] = u[2];
    132     dst[2][2] = -f[2];
    133     dst[2][3] = 0.0f;
    134 
    135     // w basis
    136     dst[3][0] = -Vec3_dot(s, camera);
    137     dst[3][1] = -Vec3_dot(u, camera);
    138     dst[3][2] = Vec3_dot(f, camera);
    139     dst[3][3] = 1.0f;
    140 }
    141 
    142 void Mat4_perspective(f32 fov, f32 aspect, f32 near, f32 far, Mat4 dst)
    143 {
    144     f32 tan_half_fov = tanf(fov * 0.5f);
    145 
    146     // x basis
    147     dst[0][0] = 1.0f / (aspect * tan_half_fov);
    148     dst[0][1] = 0.0f;
    149     dst[0][2] = 0.0f;
    150     dst[0][3] = 0.0f;
    151 
    152     // y basis
    153     dst[1][0] = 0.0f;
    154     dst[1][1] = 1.0f / (tan_half_fov);
    155     dst[1][2] = 0.0f;
    156     dst[1][3] = 0.0f;
    157 
    158     // z basis
    159     dst[2][0] = 0.0f;
    160     dst[2][1] = 0.0f;
    161     dst[2][2] = -(far + near) / (far - near);
    162     dst[2][3] = -1.0f;
    163 
    164     // w basis
    165     dst[3][0] = 0.0f;
    166     dst[3][1] = 0.0f;
    167     dst[3][2] = -(2 * far * near) / (far - near);
    168     dst[3][3] = 0.0f;
    169 }
    170