// // ======================================================================================================================= // Entity_WriteSelected to a CMemFile // ======================================================================================================================= // void Entity_WriteSelected(entity_t *e, CMemFile *pMemFile) { brush_t *b; idVec3 origin; char text[128]; int count; for (b = e->brushes.onext; b != &e->brushes; b = b->onext) { if (IsBrushSelected(b)) { break; // got one } } if (b == &e->brushes) { return; // nothing selected } // if fixedsize, calculate a new origin based on the current brush position if (e->eclass->fixedsize || EntityHasModel(e)) { if (!GetVectorForKey(e, "origin", origin)) { VectorSubtract(e->brushes.onext->mins, e->eclass->mins, origin); sprintf(text, "%i %i %i", (int)origin[0], (int)origin[1], (int)origin[2]); SetKeyValue(e, "origin", text); } } MemFile_fprintf(pMemFile, "{\n"); count = e->epairs.GetNumKeyVals(); for (int j = 0; j < count; j++) { MemFile_fprintf(pMemFile, "\"%s\" \"%s\"\n", e->epairs.GetKeyVal(j)->GetKey().c_str(), e->epairs.GetKeyVal(j)->GetValue().c_str()); } if (!EntityHasModel(e)) { count = 0; for (b = e->brushes.onext; b != &e->brushes; b = b->onext) { if (e->eclass->fixedsize && !b->entityModel) { continue; } if (IsBrushSelected(b)) { MemFile_fprintf(pMemFile, "// brush %i\n", count); count++; Brush_Write( b, pMemFile, e->origin, ( g_PrefsDlg.m_bNewMapFormat != FALSE ) ); } } } MemFile_fprintf(pMemFile, "}\n"); }
/*! filters out the region brushes if necessary returns true if this entity as a whole is out of the region (if all brushes are filtered out, then the entity will be completely dropped .. except if it's worldspawn of course) */ bool FilterChildren( entity_t *ent, bool bRegionOnly = false, bool bSelectedOnly = false ){ if ( ent->brushes.onext == &ent->brushes ) { return false; } // entity without a brush, ignore it... this can be caused by Undo // filter fixedsize ents by their eclass bounding box // don't add their brushes if ( ent->eclass->fixedsize ) { if ( bSelectedOnly && !IsBrushSelected( ent->brushes.onext ) ) { return false; } if ( bRegionOnly && region_active ) { for ( int i = 0 ; i < 3 ; i++ ) { if ( ( ent->origin[i] + ent->eclass->mins[i] ) > region_maxs[i] ) { return false; } if ( ( ent->origin[i] + ent->eclass->maxs[i] ) < region_mins[i] ) { return false; } } } } else { for ( brush_t *b = ent->brushes.onext ; b != &ent->brushes ; b = b->onext ) { // set flag to use brushprimit_texdef if ( g_qeglobals.m_bBrushPrimitMode ) { b->bBrushDef = true; } else{ b->bBrushDef = false; } // add brush, unless it's excluded by region if ( !( bRegionOnly && Map_IsBrushFiltered( b ) ) && !( bSelectedOnly && !IsBrushSelected( b ) ) ) { ( (CPtrArray*)ent->pData )->Add( b ); } } if ( ( (CPtrArray*)ent->pData )->GetSize() <= 0 ) { return false; } } return true; }
// //============ //Entity_WriteSelected to a CMemFile //============ // void Entity_WriteSelected(entity_t *e, CMemFile* pMemFile) { epair_t *ep; brush_t *b; vec3_t origin; char text[128]; int count; for (b=e->brushes.onext ; b != &e->brushes ; b=b->onext) if (IsBrushSelected(b)) break; // got one if (b == &e->brushes) return; // nothing selected // if fixedsize, calculate a new origin based on the current // brush position if (e->eclass->fixedsize) { #ifdef SOF // I suspect these 2 will end up doing the same thing, but for now that VectorSubtract will break ours -slc if (strnicmp(e->eclass->name, "misc_", 5) == 0 || strnicmp(e->eclass->name, "light_", 6) == 0 || strnicmp(e->eclass->name, "m_", 2) == 0 || strnicmp(e->eclass->name, "item_weapon_", 12)== 0 || strnicmp(e->eclass->name, "item_ammo_", 10)== 0 ) { VectorCopy(e->origin, origin); } #else if (strnicmp(e->eclass->name, "misc_model",10) == 0 && e->md3Class != NULL) { // Bugfix? I'm guessing this should have been the same as in Entity_Write, ie the copy version..... -slc //VectorCopy(e->origin, origin); VectorSubtract (e->brushes.onext->mins, e->md3Class->mins, origin); } #endif else { VectorSubtract (e->brushes.onext->mins, e->eclass->mins, origin); } sprintf (text, "%i %i %i", (int)origin[0], (int)origin[1], (int)origin[2]); SetKeyValue (e, "origin", text); } MemFile_fprintf(pMemFile, "{\n"); for (ep = e->epairs ; ep ; ep=ep->next) MemFile_fprintf(pMemFile, "\"%s\" \"%s\"\n", ep->key, ep->value); if (!e->eclass->fixedsize) { count = 0; for (b=e->brushes.onext ; b != &e->brushes ; b=b->onext) { if (IsBrushSelected(b)) { MemFile_fprintf(pMemFile, "// brush %i\n", count); count++; Brush_Write (b, pMemFile); } } } MemFile_fprintf(pMemFile, "}\n"); }