+ return vertex_tagged;
+}
+
+/*
+ * Detect if potential future edges create a collision with any of the
+ * existing edges in the mesh
+ */
+static int cxr_solid_overlap( cxr_mesh *mesh,
+ cxr_polygon *pa,
+ cxr_polygon *pb,
+ int common_edge_index,
+ int debug )
+{
+ v3f *verts = cxr_ab_ptr( mesh->p_abverts, 0 );
+ cxr_edge *common_edge = &mesh->edges[common_edge_index];
+
+ int unique_a = pa->loop_total-2,
+ unique_b = pb->loop_total-2;
+
+ int *unique_verts = malloc( (unique_a+unique_b)*sizeof(int) );
+ int unique_total = 0;
+
+ for( int j=0; j<2; j++ )
+ {
+ cxr_polygon *poly = (cxr_polygon *[2]){pa,pb}[j];
+
+ for( int i=0; i<poly->loop_total; i++ )
+ {
+ cxr_loop *lp = &mesh->loops[poly->loop_start+i];
+
+ if( lp->index == common_edge->i0 || lp->index == common_edge->i1 )
+ continue;
+
+ unique_verts[ unique_total ++ ] = lp->index;
+ }
+ }
+
+ v3f ca, cb;
+
+ for( int i=0; i<unique_a; i++ )
+ {
+ for( int j=unique_a; j<unique_total; j++ )
+ {
+ int i0 = unique_verts[i],
+ i1 = unique_verts[j];
+
+ if( debug )
+ cxr_debug_line( verts[i0], verts[i1], colours_random[2] );
+
+ for( int k=0; k<mesh->abedges.count; k++ )
+ {
+ cxr_edge *edge = &mesh->edges[k];
+
+ if( edge->i0 == i0 || edge->i0 == i1 ||
+ edge->i1 == i0 || edge->i1 == i1 ) continue;
+
+ double *a0 = verts[i0],
+ *a1 = verts[i1],
+ *b0 = verts[edge->i0],
+ *b1 = verts[edge->i1];
+
+ double dist = segment_segment_dist( a0, a1, b0, b1, ca, cb );
+
+ if( dist < 0.025 )
+ {
+ if( debug )
+ {
+ cxr_debug_box( ca, 0.025, colour_error );
+ cxr_debug_box( cb, 0.025, colour_error );
+ cxr_debug_line( a0, a1, colour_error );
+ cxr_debug_line( b0, b1, colour_error );
+
+ continue;
+ }
+ else
+ {
+ free( unique_verts );
+ return 1;
+ }
+ }
+ }
+ }
+ }
+
+ if( debug )
+ {
+ cxr_debug_line( verts[mesh->edges[common_edge_index].i0],
+ verts[mesh->edges[common_edge_index].i1],
+ colour_success );
+ }