]> git.rm.cloudns.org Git - xonotic/netradiant.git/commitdiff
q3map2: import fused brush fix from NRC 211/head
authorThomas Debesse <dev@illwieckz.net>
Sat, 26 Oct 2024 00:44:40 +0000 (02:44 +0200)
committerThomas Debesse <dev@illwieckz.net>
Sat, 26 Oct 2024 00:44:40 +0000 (02:44 +0200)
Import and rewrite in C that fix for a bug fusing brushes at map compile time:

- https://github.com/Garux/netradiant-custom/commit/5283b70a83acdbaa9c37f33852fc1ac9a86f7c6b

libs/mathlib/mathlib.c

index f8af1c7bb7da8db8eb420513172cedfbc548ef07..eff8ba6a802695d60a51ff714c8b5f4347a0d9d6 100644 (file)
@@ -73,6 +73,25 @@ qboolean VectorIsOnAxialPlane( vec3_t v ){
        return qfalse;
 }
 
+// Ported from NRC
+static void vector3_cross_C( const vec3_t v1, const vec3_t v2, vec3_t out ){
+       out[0] = v1[1] * v2[2] - v1[2] * v2[1];
+       out[1] = v1[2] * v2[0] - v1[0] * v2[2];
+       out[2] = v1[0] * v2[1] - v1[1] * v2[0];
+}
+
+// Ported from NRC
+static size_t vector3_min_abs_component_index_C( vec3_t v ){
+       const size_t mini = ( fabs( v[1] ) < fabs( v[0] ) )? 1 : 0;
+       return ( fabs( v[2] ) < fabs( v[mini] ) )? 2 : mini;
+}
+
+const vec3_t g_vector3_axis_x_C = { 1, 0, 0 };
+const vec3_t g_vector3_axis_y_C = { 0, 1, 0 };
+const vec3_t g_vector3_axis_z_C = { 0, 0, 1 };
+
+const vec3_t *g_vector3_axes_C[3] = { &g_vector3_axis_x_C, &g_vector3_axis_y_C, &g_vector3_axis_z_C };
+
 /*
    ================
    MakeNormalVectors
@@ -82,10 +101,16 @@ qboolean VectorIsOnAxialPlane( vec3_t v ){
    ================
  */
 void MakeNormalVectors( vec3_t forward, vec3_t right, vec3_t up ){
+#if 0
+       /* This is known to be buggy and to fuse some brushes,
+       see: https://gitlab.com/xonotic/netradiant/-/issues/195 */
+
        float d;
 
        // this rotate and negate guarantees a vector
        // not colinear with the original
+       //! fails with forward( -0.577350259 -0.577350259 0.577350259 )
+       //! colinear right( 0.577350259 0.577350259 -0.577350259 )
        right[1] = -forward[0];
        right[2] = forward[1];
        right[0] = forward[2];
@@ -94,6 +119,12 @@ void MakeNormalVectors( vec3_t forward, vec3_t right, vec3_t up ){
        VectorMA( right, -d, forward, right );
        VectorNormalize( right, right );
        CrossProduct( right, forward, up );
+#else
+       const vec3_t *index = g_vector3_axes_C[ vector3_min_abs_component_index_C( forward ) ];
+       vector3_cross_C( *index, forward, right );
+       VectorNormalize( right, right );
+       CrossProduct( right, forward, up );
+#endif
 }
 
 vec_t VectorLength( const vec3_t v ){