/* ============= CSG_Merge ============= */ void CSG_Merge(void) { brush_t *b, *next, *newlist, *newbrush; struct entity_s *owner; Sys_Printf ("Merging...\n"); if (selected_brushes.next == &selected_brushes) { Sys_Printf ("No brushes selected.\n"); return; } if (selected_brushes.next->next == &selected_brushes) { Sys_Printf ("At least two brushes have to be selected.\n"); return; } owner = selected_brushes.next->owner; for (b = selected_brushes.next; b != &selected_brushes; b = next) { next = b->next; if (b->owner->eclass->fixedsize) { // can't use texture from a fixed entity, so don't subtract Sys_Printf ("Cannot add fixed size entities.\n"); return; } if (b->owner != owner) { Sys_Printf ("Cannot add brushes from different entities.\n"); return; } } newlist = NULL; for (b = selected_brushes.next; b != &selected_brushes; b = next) { next = b->next; Brush_RemoveFromList(b); b->next = newlist; b->prev = NULL; newlist = b; } newbrush = Brush_MergeList(newlist, true); // if the new brush would not be convex if (!newbrush) { // add the brushes back into the selection for (b = newlist; b; b = next) { next = b->next; b->next = NULL; b->prev = NULL; Brush_AddToList(b, &selected_brushes); } Sys_Printf ("Cannot add a set of brushes with a concave hull.\n"); return; } // free the original brushes for (b = newlist; b; b = next) { next = b->next; b->next = NULL; b->prev = NULL; Brush_Free(b); } Brush_AddToList(newbrush, &selected_brushes); Sys_Printf ("Done.\n"); Sys_UpdateWindows (W_ALL); }
/* ============= CSG_Merge ============= */ void CSG_Merge(void) { brush_t *b, *next, *newlist, *newbrush; entity_t *owner; Sys_Status("Merging...\n"); if (selected_brushes.next == &selected_brushes) { Sys_Status("No brushes selected.\n"); return; } if (selected_brushes.next->next == &selected_brushes) { Sys_Status("At least two brushes have to be selected.\n"); return; } owner = selected_brushes.next->owner; for (b = selected_brushes.next; b != &selected_brushes; b = next) { next = b->next; if (b->owner->eclass->fixedsize || b->modelHandle > 0) { // can't use texture from a fixed entity, so don't subtract Sys_Status("Cannot add fixed size entities.\n"); return; } if (b->pPatch) { Sys_Status("Cannot add patches.\n"); return; } if ( b->brush_faces->d_texture && ( b->brush_faces->d_texture->GetContentFlags() & CONTENTS_NOCSG ) ) { Sys_Status("Cannot add brushes using shaders that don't allows CSG operations.\n"); return; } if (b->owner != owner) { Sys_Status("Cannot add brushes from different entities.\n"); return; } } newlist = NULL; for (b = selected_brushes.next; b != &selected_brushes; b = next) { next = b->next; Brush_RemoveFromList(b); b->next = newlist; b->prev = NULL; newlist = b; } newbrush = Brush_MergeList(newlist, true); // if the new brush would not be convex if (!newbrush) { // add the brushes back into the selection for (b = newlist; b; b = next) { next = b->next; b->next = NULL; b->prev = NULL; Brush_AddToList(b, &selected_brushes); } Sys_Status("Cannot add a set of brushes with a concave hull.\n"); return; } // free the original brushes for (b = newlist; b; b = next) { next = b->next; b->next = NULL; b->prev = NULL; Brush_Free(b); } Brush_AddToList(newbrush, &selected_brushes); Sys_Status ("done.\n"); Sys_UpdateWindows (W_ALL); }