-unsigned int homogenous_clip_line(vec4_t clipped[2])
-{
- vec4_t clip;
- double scale;
- const vec_t* const p0 = clipped[0];
- const vec_t* const p1 = clipped[1];
-
- // early out
- {
- clipmask_t mask0 = homogenous_clip_point(clipped[0]);
- clipmask_t mask1 = homogenous_clip_point(clipped[1]);
-
- if((mask0 | mask1) == CLIP_PASS) // both points passed all planes
- return 2;
-
- if(mask0 & mask1) // both points failed any one plane
- return 0;
- }
-
- {
- const unsigned int index = CLIP_X_LT_W(p0);
- if(index ^ CLIP_X_LT_W(p1))
- {
- clip[0] = p1[0] - p0[0];
- clip[1] = p1[1] - p0[1];
- clip[2] = p1[2] - p0[2];
- clip[3] = p1[3] - p0[3];
-
- scale = (p0[0] - p0[3]) / (clip[3] - clip[0]);
-
- clip[0] = (vec_t)(p0[0] + scale*(clip[0]));
- clip[1] = (vec_t)(p0[1] + scale*(clip[1]));
- clip[2] = (vec_t)(p0[2] + scale*(clip[2]));
- clip[3] = (vec_t)(p0[3] + scale*(clip[3]));
-
- clipped[index][0] = clip[0];
- clipped[index][1] = clip[1];
- clipped[index][2] = clip[2];
- clipped[index][3] = clip[3];
- }
- else if(index == 0)
- return 0;
- }
-
- {
- const unsigned int index = CLIP_X_GT_W(p0);
- if(index ^ CLIP_X_GT_W(p1))
- {
- clip[0] = p1[0] - p0[0];
- clip[1] = p1[1] - p0[1];
- clip[2] = p1[2] - p0[2];
- clip[3] = p1[3] - p0[3];
-
- scale = (p0[0] + p0[3]) / (-clip[3] - clip[0]);
-
- clip[0] = (vec_t)(p0[0] + scale*(clip[0]));
- clip[1] = (vec_t)(p0[1] + scale*(clip[1]));
- clip[2] = (vec_t)(p0[2] + scale*(clip[2]));
- clip[3] = (vec_t)(p0[3] + scale*(clip[3]));
-
- clipped[index][0] = clip[0];
- clipped[index][1] = clip[1];
- clipped[index][2] = clip[2];
- clipped[index][3] = clip[3];
- }
- else if(index == 0)
- return 0;
- }
-
- {
- const unsigned int index = CLIP_Y_LT_W(p0);
- if(index ^ CLIP_Y_LT_W(p1))
- {
- clip[0] = p1[0] - p0[0];
- clip[1] = p1[1] - p0[1];
- clip[2] = p1[2] - p0[2];
- clip[3] = p1[3] - p0[3];
-
- scale = (p0[1] - p0[3]) / (clip[3] - clip[1]);
-
- clip[0] = (vec_t)(p0[0] + scale*(clip[0]));
- clip[1] = (vec_t)(p0[1] + scale*(clip[1]));
- clip[2] = (vec_t)(p0[2] + scale*(clip[2]));
- clip[3] = (vec_t)(p0[3] + scale*(clip[3]));
-
- clipped[index][0] = clip[0];
- clipped[index][1] = clip[1];
- clipped[index][2] = clip[2];
- clipped[index][3] = clip[3];
- }
- else if(index == 0)
- return 0;
- }
-
- {
- const unsigned int index = CLIP_Y_GT_W(p0);
- if(index ^ CLIP_Y_GT_W(p1))
- {
- clip[0] = p1[0] - p0[0];
- clip[1] = p1[1] - p0[1];
- clip[2] = p1[2] - p0[2];
- clip[3] = p1[3] - p0[3];
-
- scale = (p0[1] + p0[3]) / (-clip[3] - clip[1]);
-
- clip[0] = (vec_t)(p0[0] + scale*(clip[0]));
- clip[1] = (vec_t)(p0[1] + scale*(clip[1]));
- clip[2] = (vec_t)(p0[2] + scale*(clip[2]));
- clip[3] = (vec_t)(p0[3] + scale*(clip[3]));
-
- clipped[index][0] = clip[0];
- clipped[index][1] = clip[1];
- clipped[index][2] = clip[2];
- clipped[index][3] = clip[3];
- }
- else if(index == 0)
- return 0;
- }
-
- {
- const unsigned int index = CLIP_Z_LT_W(p0);
- if(index ^ CLIP_Z_LT_W(p1))
- {
- clip[0] = p1[0] - p0[0];
- clip[1] = p1[1] - p0[1];
- clip[2] = p1[2] - p0[2];
- clip[3] = p1[3] - p0[3];
-
- scale = (p0[2] - p0[3]) / (clip[3] - clip[2]);
-
- clip[0] = (vec_t)(p0[0] + scale*(clip[0]));
- clip[1] = (vec_t)(p0[1] + scale*(clip[1]));
- clip[2] = (vec_t)(p0[2] + scale*(clip[2]));
- clip[3] = (vec_t)(p0[3] + scale*(clip[3]));
-
- clipped[index][0] = clip[0];
- clipped[index][1] = clip[1];
- clipped[index][2] = clip[2];
- clipped[index][3] = clip[3];
- }
- else if(index == 0)
- return 0;
- }
-
- {
- const unsigned int index = CLIP_Z_GT_W(p0);
- if(index ^ CLIP_Z_GT_W(p1))
- {
- clip[0] = p1[0] - p0[0];
- clip[1] = p1[1] - p0[1];
- clip[2] = p1[2] - p0[2];
- clip[3] = p1[3] - p0[3];
-
- scale = (p0[2] + p0[3]) / (-clip[3] - clip[2]);
-
- clip[0] = (vec_t)(p0[0] + scale*(clip[0]));
- clip[1] = (vec_t)(p0[1] + scale*(clip[1]));
- clip[2] = (vec_t)(p0[2] + scale*(clip[2]));
- clip[3] = (vec_t)(p0[3] + scale*(clip[3]));
-
- clipped[index][0] = clip[0];
- clipped[index][1] = clip[1];
- clipped[index][2] = clip[2];
- clipped[index][3] = clip[3];
- }
- else if(index == 0)
- return 0;
- }
-
- return 2;
+unsigned int homogenous_clip_line( vec4_t clipped[2] ){
+ vec4_t clip;
+ double scale;
+ const vec_t* const p0 = clipped[0];
+ const vec_t* const p1 = clipped[1];
+
+ // early out
+ {
+ clipmask_t mask0 = homogenous_clip_point( clipped[0] );
+ clipmask_t mask1 = homogenous_clip_point( clipped[1] );
+
+ if ( ( mask0 | mask1 ) == CLIP_PASS ) { // both points passed all planes
+ return 2;
+ }
+
+ if ( mask0 & mask1 ) { // both points failed any one plane
+ return 0;
+ }
+ }
+
+ {
+ const unsigned int index = CLIP_X_LT_W( p0 );
+ if ( index ^ CLIP_X_LT_W( p1 ) ) {
+ clip[0] = p1[0] - p0[0];
+ clip[1] = p1[1] - p0[1];
+ clip[2] = p1[2] - p0[2];
+ clip[3] = p1[3] - p0[3];
+
+ scale = ( p0[0] - p0[3] ) / ( clip[3] - clip[0] );
+
+ clip[0] = (vec_t)( p0[0] + scale * ( clip[0] ) );
+ clip[1] = (vec_t)( p0[1] + scale * ( clip[1] ) );
+ clip[2] = (vec_t)( p0[2] + scale * ( clip[2] ) );
+ clip[3] = (vec_t)( p0[3] + scale * ( clip[3] ) );
+
+ clipped[index][0] = clip[0];
+ clipped[index][1] = clip[1];
+ clipped[index][2] = clip[2];
+ clipped[index][3] = clip[3];
+ }
+ else if ( index == 0 ) {
+ return 0;
+ }
+ }
+
+ {
+ const unsigned int index = CLIP_X_GT_W( p0 );
+ if ( index ^ CLIP_X_GT_W( p1 ) ) {
+ clip[0] = p1[0] - p0[0];
+ clip[1] = p1[1] - p0[1];
+ clip[2] = p1[2] - p0[2];
+ clip[3] = p1[3] - p0[3];
+
+ scale = ( p0[0] + p0[3] ) / ( -clip[3] - clip[0] );
+
+ clip[0] = (vec_t)( p0[0] + scale * ( clip[0] ) );
+ clip[1] = (vec_t)( p0[1] + scale * ( clip[1] ) );
+ clip[2] = (vec_t)( p0[2] + scale * ( clip[2] ) );
+ clip[3] = (vec_t)( p0[3] + scale * ( clip[3] ) );
+
+ clipped[index][0] = clip[0];
+ clipped[index][1] = clip[1];
+ clipped[index][2] = clip[2];
+ clipped[index][3] = clip[3];
+ }
+ else if ( index == 0 ) {
+ return 0;
+ }
+ }
+
+ {
+ const unsigned int index = CLIP_Y_LT_W( p0 );
+ if ( index ^ CLIP_Y_LT_W( p1 ) ) {
+ clip[0] = p1[0] - p0[0];
+ clip[1] = p1[1] - p0[1];
+ clip[2] = p1[2] - p0[2];
+ clip[3] = p1[3] - p0[3];
+
+ scale = ( p0[1] - p0[3] ) / ( clip[3] - clip[1] );
+
+ clip[0] = (vec_t)( p0[0] + scale * ( clip[0] ) );
+ clip[1] = (vec_t)( p0[1] + scale * ( clip[1] ) );
+ clip[2] = (vec_t)( p0[2] + scale * ( clip[2] ) );
+ clip[3] = (vec_t)( p0[3] + scale * ( clip[3] ) );
+
+ clipped[index][0] = clip[0];
+ clipped[index][1] = clip[1];
+ clipped[index][2] = clip[2];
+ clipped[index][3] = clip[3];
+ }
+ else if ( index == 0 ) {
+ return 0;
+ }
+ }
+
+ {
+ const unsigned int index = CLIP_Y_GT_W( p0 );
+ if ( index ^ CLIP_Y_GT_W( p1 ) ) {
+ clip[0] = p1[0] - p0[0];
+ clip[1] = p1[1] - p0[1];
+ clip[2] = p1[2] - p0[2];
+ clip[3] = p1[3] - p0[3];
+
+ scale = ( p0[1] + p0[3] ) / ( -clip[3] - clip[1] );
+
+ clip[0] = (vec_t)( p0[0] + scale * ( clip[0] ) );
+ clip[1] = (vec_t)( p0[1] + scale * ( clip[1] ) );
+ clip[2] = (vec_t)( p0[2] + scale * ( clip[2] ) );
+ clip[3] = (vec_t)( p0[3] + scale * ( clip[3] ) );
+
+ clipped[index][0] = clip[0];
+ clipped[index][1] = clip[1];
+ clipped[index][2] = clip[2];
+ clipped[index][3] = clip[3];
+ }
+ else if ( index == 0 ) {
+ return 0;
+ }
+ }
+
+ {
+ const unsigned int index = CLIP_Z_LT_W( p0 );
+ if ( index ^ CLIP_Z_LT_W( p1 ) ) {
+ clip[0] = p1[0] - p0[0];
+ clip[1] = p1[1] - p0[1];
+ clip[2] = p1[2] - p0[2];
+ clip[3] = p1[3] - p0[3];
+
+ scale = ( p0[2] - p0[3] ) / ( clip[3] - clip[2] );
+
+ clip[0] = (vec_t)( p0[0] + scale * ( clip[0] ) );
+ clip[1] = (vec_t)( p0[1] + scale * ( clip[1] ) );
+ clip[2] = (vec_t)( p0[2] + scale * ( clip[2] ) );
+ clip[3] = (vec_t)( p0[3] + scale * ( clip[3] ) );
+
+ clipped[index][0] = clip[0];
+ clipped[index][1] = clip[1];
+ clipped[index][2] = clip[2];
+ clipped[index][3] = clip[3];
+ }
+ else if ( index == 0 ) {
+ return 0;
+ }
+ }
+
+ {
+ const unsigned int index = CLIP_Z_GT_W( p0 );
+ if ( index ^ CLIP_Z_GT_W( p1 ) ) {
+ clip[0] = p1[0] - p0[0];
+ clip[1] = p1[1] - p0[1];
+ clip[2] = p1[2] - p0[2];
+ clip[3] = p1[3] - p0[3];
+
+ scale = ( p0[2] + p0[3] ) / ( -clip[3] - clip[2] );
+
+ clip[0] = (vec_t)( p0[0] + scale * ( clip[0] ) );
+ clip[1] = (vec_t)( p0[1] + scale * ( clip[1] ) );
+ clip[2] = (vec_t)( p0[2] + scale * ( clip[2] ) );
+ clip[3] = (vec_t)( p0[3] + scale * ( clip[3] ) );
+
+ clipped[index][0] = clip[0];
+ clipped[index][1] = clip[1];
+ clipped[index][2] = clip[2];
+ clipped[index][3] = clip[3];
+ }
+ else if ( index == 0 ) {
+ return 0;
+ }
+ }
+
+ return 2;