Пример #1
0
//
// =======================================================================================================================
//    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");
}
Пример #2
0
/*!
   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;
}
Пример #3
0
//
//============
//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");
}