Example #1
0
        protected void CheckInput()
        {
            if (Input.GetMouseButtonDown(0))
            {
                var pos = Input.mousePosition / new float3(Screen.width, Screen.height, 1);
                pos.z = this.Is2D?0:0.5f;
                this.AddBox(pos, new float3(0.5f, 0.5f, this.Is2D?0:0.5f), this.type);
            }

            if (Input.GetKeyDown(KeyCode.C))
            {
                this.parameter.activeNumberOfParticles.Value = 0;
                this.bufferParameter.particlesIndexBufferActive.Value.SetCounterValue(0);
                this.dispather.Dispatch("InitParticle", this.parameter.numberOfParticles.Value);
            }


            if (Input.GetKeyDown(KeyCode.E))
            {
                this.type = Particle.Type.Elastic;
            }
            if (Input.GetKeyDown(KeyCode.S))
            {
                this.type = Particle.Type.Snow;
            }
            if (Input.GetKeyDown(KeyCode.F))
            {
                this.type = Particle.Type.Liquid;
            }
        }
Example #2
0
        /// <summary>
        /// 새 파티클 시스템을 추가합니다.
        /// 파티클 시스템은 한 번에 10개까지만 활성화될 수 있습니다.
        /// </summary>
        public static void AddParticleSystem(
            ParticleSystem.StartPosition startPosX, ParticleSystem.StartPosition startPosY,
            float velocityX, float velocityY, int lifetime,
            int createNumber, float createRange,
            ParticleSystem.CreateFunction createFunction,
            Particle.Type particleType, ParticleSystem.ParticleColor particleColor,
            float particleSize, int particleLifetime)
        {
            void particleSystemsRemoveAtZero(object[] args)
            {
                List <ParticleSystem> particleSystems_ = args[0] as List <ParticleSystem>;

                if (particleSystems_.Count > 10)
                {
                    particleSystems_.RemoveAt(0);
                }
            }

            void particleSystemsAdd(object[] args)
            {
                List <ParticleSystem> particleSystems_ = args[0] as List <ParticleSystem>;
                ParticleSystem        particleSystem_  = args[1] as ParticleSystem;

                particleSystems_.Add(particleSystem_);
            }

            // 한 번에 활성화되는 파티클 시스템 수를 10개로 제한
            Util.TaskQueue.Add("particleSystems", particleSystemsRemoveAtZero, particleSystems);
            ParticleSystem ps = new ParticleSystem(startPosX, startPosY, velocityX, velocityY, lifetime,
                                                   createNumber, createRange, createFunction,
                                                   particleType, particleColor, particleSize, particleLifetime);

            Util.TaskQueue.Add("particleSystems", particleSystemsAdd, particleSystems, ps);
        }
Example #3
0
        protected void AddBox(float3 center, float3 size, Particle.Type type, float spacing = 1)
        {
            this.mpmParameter.newParticleBuffer.Value?.Release();


            var pos = Tool.GenerateBox(center, size, spacing);

            this.mpmParameter.ptype.Value                 = (int)type;
            this.mpmParameter.newParticleBuffer.Value     = new ComputeBuffer(pos.Count, Marshal.SizeOf <float3>());
            this.parameter.activeNumberOfParticles.Value += pos.Count;
            this.mpmParameter.newParticleBuffer.Value.SetData(pos.ToArray());
            this.dispather.Dispatch("AddParticles", pos.Count);
        }
        public void GenerateParticle(Particle.Type type, Vector3 position)
        {
            //Get data
            string spawnType = Particle.sParticleTypeString[type];

            ParticleConfig.Characteristics characteristics = _particleConfig.GetCharacteristics(type);
            //Spawn particle
            if (particlePool != null)
            {
                BaseParticle particle = particlePool.GetPooledObject(spawnType) as BaseParticle;
                particle.Init(characteristics, position);
            }
        }
        public Characteristics GetCharacteristics(Particle.Type type)
        {
            if (_characteristicLookup.Count == 0)
            {
                InitCharacteristics();
            }

            if (_characteristicLookup.ContainsKey(type))
            {
                return(_characteristicLookup[type]);
            }
            else
            {
                Debug.LogError("No Characteristics found of particle type:" + type);
                return(null);
            }
        }
Example #6
0
        /// <summary>
        /// 새 파티클 시스템을 추가합니다.
        /// 파티클 시스템은 한 번에 5개까지만 활성화될 수 있습니다.
        /// </summary>
        public static void AddParticleSystem(
            float startPosX, float startPosY,
            float velocityX, float velocityY, int lifetime,
            int createNumber, float createRange,
            ParticleSystem.CreateFunction createFunction,
            Particle.Type particleType, Color particleColor,
            float particleSize, int particleLifetime)
        {
            // 한 번에 활성화되는 파티클 시스템 수를 5개로 제한
            if (particleSystems.Count > 10)
            {
                particleSystems.RemoveAt(0);
            }
            ParticleSystem ps = new ParticleSystem(startPosX, startPosY, velocityX, velocityY, lifetime,
                                                   createNumber, createRange, createFunction,
                                                   particleType, particleColor, particleSize, particleLifetime);

            particleSystems.Add(ps);
        }
Example #7
0
        /// <summary>
        /// 기본 파티클 시스템에 새 파티클을 createNumber만큼 추가합니다.
        /// </summary>
        public void AddParticleInBasic(Particle.Type particleType, int particleLifetime, Color particleColor, float particleSize)
        {
            if (!isBasicParticleSystem)
            {
                return;
            }

            // 새 파티클 생성
            for (int i = 0; i < createNumber; i++)
            {
                // 한 파티클 시스템 당 최대 파티클 개수 200개로 제한
                if (particles.Count >= 200)
                {
                    particles.RemoveAt(0);
                }
                ParticlePosition(out float posX, out float posY);
                particles.Add(new Particle(particleType, posX, posY, particleLifetime, particleColor, particleSize));
            }
        }
        private void InitCharacteristic(ParticleBlueprint[] particles)
        {
            int i = 0;
            int particleLength = particles.Length;

            for (i = 0; i < particleLength; i++)
            {
                ParticleBlueprint blueprint = particles[i];
                Particle.Type     type      = blueprint.type;
                if (_characteristicLookup.ContainsKey(type))
                {
                    Debug.LogWarning("Multiple types: " + type + " added to " + name + " config");
                }
                else
                {
                    _characteristicLookup.Add(type, blueprint.characteristics);
                }
            }
        }
Example #9
0
        /// <summary>
        /// 테마에 맞는 기본 파티클 시스템을 생성합니다.
        /// 기본 파티클 시스템은 테마가 바뀔 때까지 사라지지 않고, 키보드 입력에 따라 파티클을 생성합니다.
        /// </summary>
        public ParticleSystem(
            int createNumber, float createRange, CreateFunction createFunction,
            Particle.Type particleType, Color particleColor, float particleSize, int particleLifetime)
        {
            //Random r = new Random();
            this.positionX = 0;
            this.positionY = 0;
            this.velocityX = 0;
            this.velocityY = 0;
            this.lifetime  = -1;

            this.createNumber   = createNumber;
            this.createRange    = createRange;
            this.createFunction = createFunction;

            this.particleType     = particleType;
            this.particleColor    = particleColor;
            this.particleSize     = particleSize;
            this.particleLifetime = particleLifetime;

            this.isBasicParticleSystem = true;
        }
Example #10
0
        /// <summary>
        /// 새 파티클 시스템을 생성합니다.
        /// </summary>
        public ParticleSystem(float startPosX, float startPosY, float velocityX, float velocityY, int lifetime,
                              int createNumber, float createRange, CreateFunction createFunction,
                              Particle.Type particleType, Color particleColor, float particleSize, int particleLifetime)
        {
            //Random r = new Random();
            this.positionX = startPosX;//(float)r.NextDouble() * (maxPosX - minPosX) + minPosX;
            this.positionY = startPosY;
            this.velocityX = velocityX;
            this.velocityY = velocityY;
            this.lifetime  = lifetime;

            this.createNumber   = createNumber;
            this.createRange    = createRange;
            this.createFunction = createFunction;

            this.particleType     = particleType;
            this.particleColor    = particleColor;
            this.particleSize     = particleSize;
            this.particleLifetime = particleLifetime;

            this.isBasicParticleSystem = false;
        }
Example #11
0
        protected void AddBox(float3 center, float3 size, Particle.Type type)
        {
            this.mpmParameter.newParticleBuffer.Value?.Release();

            var spacing = this.spacingMap[type];

            var dim   = this.grid.Dim;
            var ssize = size * spacing;

            var pos = type == Particle.Type.Snow ? Tool.GenerateSphere(this.Is2D?500:3000, !this.Is2D) : Tool.GenerateBox(size * dim);

            for (var i = 0; i < pos.Count; ++i)
            {
                pos[i] = (center - ssize * 0.5f) * dim + pos[i] * dim * ssize;
                // Debug.Log(pos[i]);
            }

            this.mpmParameter.ptype.Value                 = (int)type;
            this.mpmParameter.newParticleBuffer.Value     = new ComputeBuffer(pos.Count, Marshal.SizeOf <float3>());
            this.parameter.activeNumberOfParticles.Value += pos.Count;
            this.mpmParameter.newParticleBuffer.Value.SetData(pos.ToArray());
            this.dispather.Dispatch("AddParticles", pos.Count);
        }
Example #12
0
        /// <summary>
        /// 기본 파티클 시스템에 새 파티클을 createNumber만큼 추가합니다.
        /// </summary>
        public void AddParticleInBasic(Particle.Type particleType, int particleLifetime, Color particleColor, float particleSize)
        {
            if (!isBasicParticleSystem)
            {
                return;
            }
            //Console.WriteLine(particleType.ToString() + " " + particleLifetime);

            void particlesRemoveAtZero(object[] args)
            {
                List <Particle> particles_ = args[0] as List <Particle>;

                if (particles_.Count >= 200)
                {
                    particles_.RemoveAt(0);
                }
            }

            void particlesAdd(object[] args)
            {
                List <Particle> particles_ = args[0] as List <Particle>;
                Particle        particle_  = args[1] as Particle;

                particles_.Add(particle_);
            }

            // 새 파티클 생성
            for (int i = 0; i < createNumber; i++)
            {
                // 한 파티클 시스템 당 최대 파티클 개수 200개로 제한
                Util.TaskQueue.Add("particles", particlesRemoveAtZero, particles);
                ParticlePosition(out float posX, out float posY);
                Particle p = new Particle(particleType, posX, posY, particleLifetime, particleColor, particleSize);
                Util.TaskQueue.Add("particles", particlesAdd, particles, p);
            }
        }
Example #13
0
        protected Particle GenerateNewParticle(Texture2D texture, Vector2 position, Vector2 velocity, float angle,
                                               float angularVelocity, Vector4 color, float size, float ttl, float sizeVel, float alphaVel, Particle.Type type, BlendState state) // генерация новой частицы
        {
            Particle particle = new Particle(texture, position, velocity, angle, angularVelocity, color, size, ttl, sizeVel, alphaVel, type);

            particles.Add(particle);
            this.state = state;
            return(particle);
        }