-/* Copyright (C) 2021-2023 Harry Godden (hgn) - All Rights Reserved
+/* Copyright (C) 2021-2024 Harry Godden (hgn) - All Rights Reserved
*
* 0. Misc
* 1. Scalar operations
* 6.a Random numbers
*/
-#ifndef VG_M_H
-#define VG_M_H
+#pragma once
#include "vg_platform.h"
#include <math.h>
v4_muls( d[3], det, d[3] );
}
+/*
+ * http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
+ */
+static void m4x4_clip_projection( m4x4f mat, v4f plane ){
+ v4f c =
+ {
+ (vg_signf(plane[0]) + mat[2][0]) / mat[0][0],
+ (vg_signf(plane[1]) + mat[2][1]) / mat[1][1],
+ -1.0f,
+ (1.0f + mat[2][2]) / mat[3][2]
+ };
+
+ v4_muls( plane, 2.0f / v4_dot(plane,c), c );
+
+ mat[0][2] = c[0];
+ mat[1][2] = c[1];
+ mat[2][2] = c[2] + 1.0f;
+ mat[3][2] = c[3];
+}
+
+/*
+ * Undoes the above operation
+ */
+static void m4x4_reset_clipping( m4x4f mat, float ffar, float fnear ){
+ mat[0][2] = 0.0f;
+ mat[1][2] = 0.0f;
+ mat[2][2] = -(ffar + fnear) / (ffar - fnear);
+ mat[3][2] = -2.0f * ffar * fnear / (ffar - fnear);
+}
+
/*
* -----------------------------------------------------------------------------
* Section 5.a Boxes
;
}
+static int box_within_pt( boxf box, v3f pt )
+{
+ if( (pt[0] >= box[0][0]) && (pt[1] >= box[0][1]) && (pt[2] >= box[0][2]) &&
+ (pt[0] <= box[1][0]) && (pt[1] <= box[1][1]) && (pt[2] <= box[1][2]) )
+ {
+ return 1;
+ }
+ else return 0;
+}
+
static int box_within( boxf greater, boxf lesser )
{
v3f a, b;
{
return 1;
}
-
- return 0;
+ else return 0;
}
static inline void box_init_inf( boxf box ){
return 1;
}
-int plane_intersect2( v4f a, v4f b, v3f p, v3f n )
+static int plane_intersect2( v4f a, v4f b, v3f p, v3f n )
{
f32 const epsilon = 1e-6f;
* -----------------------------------------------------------------------------
*/
-int ray_aabb1( boxf box, v3f co, v3f dir_inv, f32 dist )
+static int ray_aabb1( boxf box, v3f co, v3f dir_inv, f32 dist )
{
v3f v0, v1;
f32 tmin, tmax;
v3_muladds( p, p2, t*t, p );
}
+static f32 explicit_bezier( f32 A[2], f32 B[2], f32 C[2], f32 D[2], f32 x )
+{
+ f32 dAxDx = D[0]-A[0],
+ unitBx = (B[0] - A[0]) / dAxDx,
+ unitCx = (C[0] - A[0]) / dAxDx,
+
+ /* cubic coefficients */
+ a = 3.0f*unitBx - 3.0f*unitCx + 1.0f,
+ b = -6.0f*unitBx + 3.0f*unitCx,
+ c = 3.0f*unitBx,
+ d = -(x - A[0]) / dAxDx,
+
+ t0 = 0.0f,
+ Ft0 = d,
+ t1 = 1.0f,
+ Ft1 = a+b+c+d,
+ tc, Ftcx;
+
+ /* Illinois method to find root */
+ for( u32 j=0; j<8; j ++ )
+ {
+ tc = t1 - Ft1*(t1-t0)/(Ft1-Ft0);
+ Ftcx = tc*tc*tc*a + tc*tc*b + tc*c + d;
+
+ if( fabsf(Ftcx) < 0.00001f )
+ break;
+
+ if( Ft1*Ftcx < 0.0f )
+ {
+ t0 = t1;
+ Ft0 = Ft1;
+ }
+ else
+ Ft0 *= 0.5f;
+
+ t1 = tc;
+ Ft1 = Ftcx;
+ }
+
+ /* Evaluate parametric bezier */
+ f32 t2 = tc*tc,
+ t3 = tc*tc*tc;
+
+ return D[1] * t3
+ + C[1] * (-3.0f*t3 + 3.0f*t2)
+ + B[1] * ( 3.0f*t3 - 6.0f*t2 + 3.0f*tc)
+ + A[1] * (-1.0f*t3 + 3.0f*t2 - 3.0f*tc + 1.0f);
+}
+
+
/*
* -----------------------------------------------------------------------------
* Section 5.f Volumes
out_dir[2] = cosf(r);
}
-#endif /* VG_M_H */
+static void vg_hsv_rgb( v3f hsv, v3f rgb ){
+ i32 i = floorf( hsv[0]*6.0f );
+ f32 v = hsv[2],
+ f = hsv[0] * 6.0f - (f32)i,
+ p = v * (1.0f-hsv[1]),
+ q = v * (1.0f-f*hsv[1]),
+ t = v * (1.0f-(1.0f-f)*hsv[1]);
+
+ switch( i % 6 ){
+ case 0: rgb[0] = v; rgb[1] = t; rgb[2] = p; break;
+ case 1: rgb[0] = q; rgb[1] = v; rgb[2] = p; break;
+ case 2: rgb[0] = p; rgb[1] = v; rgb[2] = t; break;
+ case 3: rgb[0] = p; rgb[1] = q; rgb[2] = v; break;
+ case 4: rgb[0] = t; rgb[1] = p; rgb[2] = v; break;
+ case 5: rgb[0] = v; rgb[1] = p; rgb[2] = q; break;
+ }
+}
+
+static void vg_rgb_hsv( v3f rgb, v3f hsv ){
+ f32 min = v3_minf( rgb ),
+ max = v3_maxf( rgb ),
+ range = max-min,
+ k_epsilon = 0.00001f;
+
+ hsv[2] = max;
+ if( range < k_epsilon ){
+ hsv[0] = 0.0f;
+ hsv[1] = 0.0f;
+ return;
+ }
+
+ if( max > k_epsilon ){
+ hsv[1] = range/max;
+ }
+ else {
+ hsv[0] = 0.0f;
+ hsv[1] = 0.0f;
+ return;
+ }
+
+ if( rgb[0] >= max )
+ hsv[0] = (rgb[1]-rgb[2])/range;
+ else if( max == rgb[1] )
+ hsv[0] = 2.0f+(rgb[2]-rgb[0])/range;
+ else
+ hsv[0] = 4.0f+(rgb[0]-rgb[1])/range;
+
+ hsv[0] = vg_fractf( hsv[0] * (60.0f/360.0f) );
+}