struct cxr_edge
{
i32 i0, i1;
- i32 freestyle;
+ i32 freestyle, sharp;
}
*edges;
fprintf( fp, "cxr_edge test_edges[] = {\n" );
for( int i=0; i<src->edge_count; i++ )
{
- fprintf( fp, " {%d, %d, %d},\n",
+ fprintf( fp, " {%d, %d, %d, %d},\n",
src->edges[i].i0,
src->edges[i].i1,
- src->edges[i].freestyle
+ src->edges[i].freestyle,
+ src->edges[i].sharp
);
}
fprintf( fp, "};\n" );
{
cxr_edge *orig_edge = &mesh->edges[ orig_edge_id ];
edge.freestyle = orig_edge->freestyle;
+ edge.sharp = orig_edge->sharp;
}
else
{
edge.freestyle = 0;
+ edge.sharp = 0;
}
cxr_ab_push( &new_edges, &edge );
edge_tagged[lp->edge_index] = 0;
cxr_polygon *polya = &mesh->polys[ lp->poly_left ],
- *polyb = &mesh->polys[ lp->poly_right ];
+ *polyb = &mesh->polys[ lp->poly_right ];
v4f planeb;
normal_to_plane(polyb->normal, polyb->center, planeb);
struct temp_manifold *manifold
){
cxr_loop **edge_list = malloc( sizeof(*edge_list) * solid->edge_count );
+ int *temp_solid = malloc( solid->count *sizeof(int) );
+ int temp_solid_len = 0;
int init_reverse = 0;
int unique_edge_count = 0;
+ int discard_splits = 1;
+
+ /* Try remove splitting faces first */
+ {
+ for( int j=0; j<solid->count; j++ )
+ {
+ cxr_polygon *poly = &mesh->polys[ solid_buffer[solid->start+j] ];
+ int interior_count = 0;
+
+ for( int k=0; k<poly->loop_total; k++ )
+ {
+ cxr_loop *loop = &mesh->loops[ poly->loop_start+k ];
+
+ for( int l=0; l<solid->count; l++ )
+ if( loop->poly_right == solid_buffer[solid->start+l] )
+ {
+ interior_count ++;
+ goto next;
+ }
+
+ next:;
+ }
+
+ if( interior_count < poly->loop_total-1 )
+ continue;
+
+ temp_solid[ temp_solid_len ++ ] = solid_buffer[solid->start+j];
+ }
+
+ if( temp_solid_len < 3 )
+ {
+ /* Revert back to normal */
+ free( temp_solid );
+
+ temp_solid = &solid_buffer[ solid->start ];
+ temp_solid_len = solid->count;
+ discard_splits = 0;
+ }
+ else
+ {
+ /* Overwrite original solid */
+ for( int j=0; j<temp_solid_len; j++ )
+ solid_buffer[ solid->start+j ] = temp_solid[ j ];
- /* Gather list of unique edges */
+ solid->count = temp_solid_len;
+ }
+
+ if( discard_splits )
+ free( temp_solid );
+ }
for( int j=0; j<solid->count; j++ )
{
cxr_polygon *poly = &mesh->polys[ solid_buffer[solid->start+j] ];
+ /* when discarding, if a face has only one loop that points outwards,
+ * we keep it */
+
+
for( int k=0; k<poly->loop_total; k++ )
{
cxr_loop *loop = &mesh->loops[ poly->loop_start+k ];
for( int i=0; i<mesh->abloops.count; i++ )
{
cxr_loop *lp = &mesh->loops[i];
+ cxr_edge *edge = &mesh->edges[lp->edge_index];
+ cxr_debug_line( verts[edge->i0], verts[edge->i1], colours_random[1] );
if( lp->poly_left == -1 || lp->poly_right == -1 )
{
- cxr_edge *edge = &mesh->edges[lp->edge_index];
cxr_debug_line( verts[edge->i0], verts[edge->i1], colour_error );
}
}
struct temp_manifold manifold;
cxr_link_manifold( mesh, solid, solid_buffer, &manifold);
-
+
if( manifold.status == k_manifold_err )
{
*err = k_soliderr_bad_manifold;