Ejemplo n.º 1
0
        public unsafe void Render()
        {
            if (_activeCount > 0)
            {
                fixed (MetaParticle* buffer = _buffer)
                {
                    var iterator = new ParticleIterator(buffer, _bufferSize, _head, _activeCount);

                    _stateManager.Render(ref iterator);
                }
            }
        }
Ejemplo n.º 2
0
        public unsafe void Trigger(float totalSeconds, Vector2 position)
        {
            fixed (MetaParticle* buffer = _buffer)
            {
                var startIndex = _next;
                var released = 0;

                for (var i = 0; i < ReleaseQuantity; i++)
                {
                    var index = Push();

                    if (index < 0)
                        break;

                    Vector2 dir;
                    Vector2 off;
                   	_shape.GetOffsetAndDirection(out off, out dir);

                   	var releaseInfo = new ReleaseInformation(totalSeconds, position + off, dir);

                    (buffer + index)->ReleaseInfo = releaseInfo;

                    released++;
                }

                if (released > 0)
                {
                    var iterator = new ParticleIterator(buffer, _bufferSize, startIndex, released);

                    _stateManager.Trigger(ref iterator);
                }
            }
        }
Ejemplo n.º 3
0
        public unsafe void Update(float totalSeconds, float deltaSeconds)
        {
            if (_activeCount == 0)
                return;

            fixed (MetaParticle* buffer = _buffer)
            {
                var expired = 0;
                var iteration = 0;

                do
                {
                    var meta = buffer + ((_head + iteration) % _bufferSize);

                    meta->Age = (totalSeconds - meta->ReleaseInfo.TotalSeconds) / _term;

                    if (meta->Age > 1f)
                        expired++;
                }
                while (++iteration < _activeCount);

                if (expired > 0)
                    Pop(expired);

                var iterator = new ParticleIterator(buffer, _bufferSize, _head, _activeCount);

                _stateManager.Update(ref iterator, deltaSeconds);
            }
        }