void TextureAtlasLoader::LoadAtlas (const std::string& filename, TextureAtlas* texAtlas)
{
	std::string lineType;

	std::ifstream file (filename.c_str ());

	if (!file.is_open ()) {
		Console::LogError ("Unable to open atlas file \"" + filename + "\" !");

		exit (1);
	}

	while (file >> lineType) {
		if (lineType == "#") {
			ProcessComment (file);
		}
		else if (lineType == "Area") {
			ProcessArea (file, texAtlas);
		} else {
			ProcessComment (file);
		}
	}

	file.close ();
}
Beispiel #2
0
void CAreaManager::UpdateEntity(Vec3 const& rPos, IEntity const* const pEntity)
{
	EntityId const nEntityID = pEntity->GetId();
	SAreasCache* pAreaCache = GetAreaCache(nEntityID);

	// Create a new area cache if necessary.
	if (pAreaCache == NULL)
	{
		pAreaCache = MakeAreaCache(nEntityID);
	}

	assert(pAreaCache != NULL);

	// Audio listeners and moving entities affected by environment changes need to update more often 
	// to ensure smooth fading.
	uint32 const nExtendedFlags = pEntity->GetFlagsExtended();
	float const fPosDelta = 
		((nExtendedFlags & ENTITY_FLAG_EXTENDED_AUDIO_LISTENER) != 0) || ((nExtendedFlags & ENTITY_FLAG_EXTENDED_NEEDS_MOVEINSIDE) != 0)
		? 0.01f
		: CVar::es_EntityUpdatePosDelta;

	if (pAreaCache != NULL && !rPos.IsEquivalent(pAreaCache->vLastUpdatePos, fPosDelta))
	{
		pAreaCache->vLastUpdatePos = rPos;

		// First mark all cache entries that as if they are not in the grid.
		TAreaCacheVector::iterator Iter(pAreaCache->aoAreas.begin());
		TAreaCacheVector::const_iterator IterEnd(pAreaCache->aoAreas.end());

		for (; Iter != IterEnd; ++Iter)
		{
			SAreaCacheEntry& rAreaCacheEntry = (*Iter);
			CArea* const pArea = rAreaCacheEntry.pArea;

#if defined(DEBUG_AREAMANAGER)
			if (!stl::find(m_apAreas, pArea))
			{
				CryFatalError("<AreaManager>: area in entity-area-cache not found in overall areas list!");
			}
#endif // DEBUG_AREAMANAGER

			rAreaCacheEntry.bInGrid = false;
			
			// Now pre-calculate position data.
			pArea->InvalidateCachedAreaData(nEntityID);
			pArea->CalcPosType(nEntityID, rPos);
		}

		TAreaPointers const& rAreasAtPos(m_areaGrid.GetAreas(rPos));
		TAreaPointers::const_iterator IterAreas(rAreasAtPos.begin());
		TAreaPointers::const_iterator const IterAreasEnd(rAreasAtPos.end());

		for (; IterAreas != IterAreasEnd; ++IterAreas)
		{
			// Mark cache entries as if they are in the grid.
			CArea* const pArea = *IterAreas;
			SAreaCacheEntry* pAreaCacheEntry = NULL;

			if (pAreaCache->GetCacheEntry(pArea, &pAreaCacheEntry))
			{
				// cppcheck-suppress nullPointer
				pAreaCacheEntry->bInGrid = true;
			}
			else
			{
				// if they are not yet in the cache, add them
				pAreaCache->aoAreas.push_back(SAreaCacheEntry(pArea, false, false));
				pArea->OnAddedToAreaCache(pEntity);
			}

#if defined(DEBUG_AREAMANAGER)
			if (!stl::find(m_apAreas, pArea))
			{
				CryFatalError("<AreaManager>: area in entity-area-cache not found in overall areas list!");
			}
#endif // DEBUG_AREAMANAGER
		}

		// Go through all cache entries and process the areas.
		Iter = pAreaCache->aoAreas.begin();
		IterEnd = pAreaCache->aoAreas.end();

		for (; Iter != IterEnd; ++Iter)
		{
			SAreaCacheEntry& rAreaCacheEntry = (*Iter);
			CArea* const pArea = rAreaCacheEntry.pArea;

#if defined(DEBUG_AREAMANAGER)
			if (!stl::find(m_apAreas, pArea))
			{
				CryFatalError("<AreaManager>: area in entity-area-cache not found in overall areas list!");
			}
#endif // DEBUG_AREAMANAGER

			// check if Area is hidden
			IEntity const* const pAreaEntity = m_pEntitySystem->GetEntity(pArea->GetEntityID());
			bool bIsHidden = (pAreaEntity && pAreaEntity->IsHidden());

			// area was just hidden
			if (bIsHidden && pArea->IsActive())
			{
				pArea->LeaveArea(pEntity);
				pArea->LeaveNearArea(pEntity);
				rAreaCacheEntry.bNear		= false;
				rAreaCacheEntry.bInside	= false;
				pArea->SetActive(false);
				continue;
			}

			// area was just unhidden
			if (!bIsHidden && !pArea->IsActive())
			{
				// ProcessArea will take care of properly setting cache entry data.
				rAreaCacheEntry.bNear		= false;
				rAreaCacheEntry.bInside	= false;
				pArea->SetActive(true);
			}

			// We process only for active areas in which grid we are.
			// Areas in our cache in which grid we are not get removed down below anyhow.
			if (pArea->IsActive())
			{
				ProcessArea(pArea, rAreaCacheEntry, pAreaCache, rPos, pEntity);
			}
		}

		// Go through all areas again and send accumulated events. (needs to be done in a separate step)
		Iter = pAreaCache->aoAreas.begin();

		for (; Iter != IterEnd; ++Iter)
		{
			SAreaCacheEntry& rAreaCacheEntry = (*Iter);
			CArea* const pArea = rAreaCacheEntry.pArea;

#if defined(DEBUG_AREAMANAGER)
			if (!stl::find(m_apAreas, pArea))
			{
				CryFatalError("<AreaManager>: area in entity-area-cache not found in overall areas list!");
			}
#endif // DEBUG_AREAMANAGER

			pArea->SendCachedEventsFor(nEntityID);
		}

		// Remove all entries in the cache which are no longer in the grid.
		if (!pAreaCache->aoAreas.empty())
		{
			pAreaCache->aoAreas.erase(std::remove_if(pAreaCache->aoAreas.begin(), pAreaCache->aoAreas.end(), SIsNotInGrid(pEntity, m_apAreas, m_apAreas.size())), pAreaCache->aoAreas.end());
		}

		if (pAreaCache->aoAreas.empty())
		{
			DeleteAreaCache(nEntityID);
		}
	}
}
Beispiel #3
0
void dng_filter_task::Process (uint32 threadIndex,
							   const dng_rect &area,
							   dng_abort_sniffer * /* sniffer */)
	{
	
	// Find source area for this destination area.
	
	dng_rect srcArea = SrcArea (area);
					  
	// Setup srcBuffer.
	
	dng_pixel_buffer srcBuffer;
	
	srcBuffer.fArea = srcArea;
								
	srcBuffer.fPlane  = fSrcPlane;
	srcBuffer.fPlanes = fSrcPlanes;
	
	srcBuffer.fPixelType  = fSrcPixelType;
	srcBuffer.fPixelSize  = TagTypeSize (fSrcPixelType);
	
	srcBuffer.fPlaneStep = RoundUpForPixelSize (srcArea.W (),
											    srcBuffer.fPixelSize);
	
	srcBuffer.fRowStep = srcBuffer.fPlaneStep *
						 srcBuffer.fPlanes;
	
	if (fSrcPixelType == fSrcImage.PixelType ())
		{
		
		srcBuffer.fPixelRange = fSrcImage.PixelRange ();
		
		}
		
	else switch (fSrcPixelType)
		{
		
		case ttByte:
		case ttSByte:
			{
			srcBuffer.fPixelRange = 0x0FF;
			break;
			}
		
		case ttShort:
		case ttSShort:
			{
			srcBuffer.fPixelRange = 0x0FFFF;
			break;
			}
		
		case ttLong:
		case ttSLong:
			{
			srcBuffer.fPixelRange = 0xFFFFFFFF;
			break;
			}
			
		case ttFloat:
			break;
			
		default:
			ThrowProgramError ();
		
		}
		
	srcBuffer.fData = fSrcBuffer [threadIndex]->Buffer ();
	
	// Setup dstBuffer.
	
	dng_pixel_buffer dstBuffer;
	
	dstBuffer.fArea = area;
	
	dstBuffer.fPlane  = fDstPlane;
	dstBuffer.fPlanes = fDstPlanes;
	
	dstBuffer.fPixelType  = fDstPixelType;
	dstBuffer.fPixelSize  = TagTypeSize (fDstPixelType);
	
	dstBuffer.fPlaneStep = RoundUpForPixelSize (area.W (),
												dstBuffer.fPixelSize);
	
	dstBuffer.fRowStep = dstBuffer.fPlaneStep *
						 dstBuffer.fPlanes;
	
	if (fDstPixelType == fDstImage.PixelType ())
		{
		
		dstBuffer.fPixelRange = fDstImage.PixelRange ();
		
		}
		
	else switch (fDstPixelType)
		{
		
		case ttByte:
		case ttSByte:
			{
			dstBuffer.fPixelRange = 0x0FF;
			break;
			}
		
		case ttShort:
		case ttSShort:
			{
			dstBuffer.fPixelRange = 0x0FFFF;
			break;
			}
		
		case ttLong:
		case ttSLong:
			{
			dstBuffer.fPixelRange = 0xFFFFFFFF;
			break;
			}
			
		case ttFloat:
			break;
			
		default:
			ThrowProgramError ();
		
		}
		
	dstBuffer.fData = fDstBuffer [threadIndex]->Buffer ();
	
	// Get source pixels.
	
	fSrcImage.Get (srcBuffer,
				   dng_image::edge_repeat,
				   fSrcRepeat.v,
				   fSrcRepeat.h);
				   
	// Process area.
	
	ProcessArea (threadIndex,
				 srcBuffer,
				 dstBuffer);

	// Save result pixels.
	
	fDstImage.Put (dstBuffer);
	
	}
void dng_filter_task::Process (uint32 threadIndex,
							   const dng_rect &area,
							   dng_abort_sniffer * /* sniffer */)
	{
	
	// Find source area for this destination area.
	
	dng_rect srcArea = SrcArea (area);
					  
	// Setup srcBuffer.
	
	dng_pixel_buffer srcBuffer;
	
	srcBuffer.fArea = srcArea;
								
	srcBuffer.fPlane  = fSrcPlane;
	srcBuffer.fPlanes = fSrcPlanes;
	
	srcBuffer.fPixelType  = fSrcPixelType;
	srcBuffer.fPixelSize  = TagTypeSize (fSrcPixelType);
	
	srcBuffer.fPlaneStep = RoundUpForPixelSize (srcArea.W (),
											    srcBuffer.fPixelSize);
	
	srcBuffer.fRowStep = srcBuffer.fPlaneStep *
						 srcBuffer.fPlanes;
		
	srcBuffer.fData = fSrcBuffer [threadIndex]->Buffer ();
	
	// Setup dstBuffer.
	
	dng_pixel_buffer dstBuffer;
	
	dstBuffer.fArea = area;
	
	dstBuffer.fPlane  = fDstPlane;
	dstBuffer.fPlanes = fDstPlanes;
	
	dstBuffer.fPixelType  = fDstPixelType;
	dstBuffer.fPixelSize  = TagTypeSize (fDstPixelType);
	
	dstBuffer.fPlaneStep = RoundUpForPixelSize (area.W (),
												dstBuffer.fPixelSize);
	
	dstBuffer.fRowStep = dstBuffer.fPlaneStep *
						 dstBuffer.fPlanes;
			
	dstBuffer.fData = fDstBuffer [threadIndex]->Buffer ();
	
	// Get source pixels.
	
	fSrcImage.Get (srcBuffer,
				   dng_image::edge_repeat,
				   fSrcRepeat.v,
				   fSrcRepeat.h);
				   
	// Process area.
	
	ProcessArea (threadIndex,
				 srcBuffer,
				 dstBuffer);

	// Save result pixels.
	
	fDstImage.Put (dstBuffer);
	
	}