private void StaticEntitiesEmittedSoundProcessing() { IItem[] collectedStaticItems = new IItem[100]; IItem[] nearestEntities = new IItem[_qtPlayingSound]; IItem[] entitiesSet = new IItem[_qtPlayingSound]; int i = 0; //Collection surrending "Sound" entities (Max of 100) =========================================== foreach (VisualChunk chunk in _worldChunk.SortedChunks.Where(x => x.DistanceFromPlayer < _collectRange)) { foreach (var soundStaticEntities in chunk.SoundStaticEntities) { collectedStaticItems[i] = soundStaticEntities; i++; if (i >= collectedStaticItems.Length) { break; } } if (i >= collectedStaticItems.Length) { break; } } for (; i < collectedStaticItems.Length; i++) { collectedStaticItems[i] = null; } // Sorting array by distance from Player i = 0; foreach (var entity in collectedStaticItems.Where(x => x != null).OrderBy(x => MVector3.DistanceSquared(x.Position, _playerEntityManager.CameraWorldPosition))) { nearestEntities[i] = entity; i++; if (i >= _qtPlayingSound) { break; //Maximum playing 10 closest static sound at the same time } } for (; i < _qtPlayingSound; i++) { nearestEntities[i] = null; } //Get entities remove from playing list. i = 0; entitiesSet[0] = null; foreach (var entities in _staticEntityPlayingVoices.Keys.Except(nearestEntities)) { entitiesSet[i] = entities; i++; } for (i--; i >= 0; i--) { if (entitiesSet[i] == null) { break; } if (_staticEntityPlayingVoices[entitiesSet[i]] != null) { _staticEntityPlayingVoices[entitiesSet[i]].Stop(); } _staticEntityPlayingVoices.Remove(entitiesSet[i]); } ISoundVoice voice; foreach (var entities in nearestEntities.Where(x => x != null)) { if (_staticEntityPlayingVoices.TryGetValue(entities, out voice) == false) { ISoundVoice playingVoice = _soundEngine.StartPlay3D(entities.EmittedSound, entities.Position.AsVector3(), entities.EmittedSound.isLooping, entities.EmittedSound.minDeferredStart, entities.EmittedSound.maxDeferredStart); _staticEntityPlayingVoices.Add(entities, playingVoice); } else { if (voice == null) { ISoundVoice playingVoice = _soundEngine.StartPlay3D(entities.EmittedSound, entities.Position.AsVector3(), entities.EmittedSound.isLooping, entities.EmittedSound.minDeferredStart, entities.EmittedSound.maxDeferredStart); _staticEntityPlayingVoices[entities] = playingVoice; } } } }