Ejemplo n.º 1
0
        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;
                    }
                }
            }
        }