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 (); }
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); } } }
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); }