Exemplo n.º 1
0
        void ITMPlugin.PlayerJoined(ITMPlayer player)
        {
            var b = new Entity();

            if (game.World.EntityManager.AddEntity("entities", "spaceshipcockpit", b) == ErrorCode.Success)
            {
                boat = b;
            }

            particleData = new ParticleData()
            {
                Duration   = 8,
                StartColor = Color.White,
                EndColor   = Color.White,
                Size       = new Vector4(0.1f, 0.1f, 0.1f, 1f),
                WindFactor = 0,
            };

            particleData.Size       = new Vector4(1f, 1f, 1f, 1f);
            particleData.StartColor = particleData.EndColor = Color.Red;

            dust = new Entity[100];
            for (int i = 0; i < dust.Length; ++i)
            {
                var d = new Entity()
                {
                    Scale = (float)(game.Random.NextDouble() * 0.1 + 0.05), Position = new Vector3(1, 1000, 1)
                };
                dust[i]         = d;
                d.ViewDirection = Vector3.Forward;
                game.World.EntityManager.AddEntity("space", "dust", d);
                //game.World.EntityManager.AddEntity("entities", "spaceshipcockpit", d);
            }
        }
Exemplo n.º 2
0
    // Use this for initialization
    void Start()
    {
        particles     = new ParticleSystem.Particle[particleNum];
        particleDatas = new ParticleData[particleNum];          //新建粒子数据数组
        particleSystem.maxParticles = particleNum;

        particleSystem.Emit(particleNum);
        particleSystem.GetParticles(particles);

        Ndistribution nd = new Ndistribution();

        // 每个粒子在初始化的时候都设定好收缩前和收缩后的粒子半径
        for (int i = 0; i < particleNum; i++)
        {
            float angle  = UnityEngine.Random.Range(0.0f, 360.0f);
            float radius = (float)nd.getNormalDistribution((minRadius + maxRadius) * 0.5f, 1);
            float before = radius;
            float after  = 0.7f * radius;

            if (after < minRadius * 1.1f)
            {
                float midRadius = minRadius * 1.2f;
                after = UnityEngine.Random.Range(UnityEngine.Random.Range(minRadius, midRadius), (minRadius * 1.1f));
            }
            particleDatas[i] = new ParticleData(angle, radius, before, after);
        }
    }
Exemplo n.º 3
0
    protected override void CreateData()
    {
        var data = new ParticleData[Count];

        if (_pastData != null)
        {
            if (Count <= _pastData.Length)
            {
                System.Array.Copy(_pastData, 0, data, 0, data.Length);
            }
            else
            {
                System.Array.Copy(_pastData, 0, data, 0, _pastData.Length);
                for (var i = _pastData.Length; i < data.Length; i++)
                {
                    data[i] = _defaultData;
                }
                _pastData = data;
            }
        }
        else
        {
            for (var i = 0; i < data.Length; i++)
            {
                data[i] = _defaultData;
            }
            _pastData = data;
        }

        MyGpuBuffer.SetData(data);
    }
Exemplo n.º 4
0
    public PreviewEffect(GameObject fx)
    {
        if (fx == null)
        {
            return;
        }
        m_ParticleDatas = null;
        target          = fx;
        var array = fx.gameObject.GetComponentsInChildren <ParticleSystem>();

        if (array != null && array.Length > 0)
        {
            m_ParticleDatas = new ParticleData[array.Length];
            life            = 0;
            for (int k = 0; k < array.Length; k++)
            {
                var ptlife = array[k].startLifetime + array[k].startDelay;
                if (ptlife > life)
                {
                    //获取最大粒子存活值
                    life = ptlife;
                }
                m_ParticleDatas[k] = new ParticleData(array[k], array[k].startDelay);
            }
            life++;
        }
    }
Exemplo n.º 5
0
    void InitializeParticle()
    {
        //vertexTex = material.GetTexture("_VertexTex") as Texture2D;
        material.SetTexture("_VertexTex", vertexTex);
        particleNum    = Mathf.CeilToInt((float)particleNum / THREAD_GROUP_X) * THREAD_GROUP_X;
        particleBuffer = new ComputeBuffer(particleNum, Marshal.SizeOf(typeof(ParticleData)));

        vertexNum       = MeshVertexTextureUtil.GetVertexNum(vertexTex);
        meshSize        = MeshVertexTextureUtil.GetMeshSize(vertexTex);
        meshCenter      = MeshVertexTextureUtil.GetMeshCenter(vertexTex);
        meshTopologyNum = MeshVertexTextureUtil.GetMeshTopologyNum(vertexTex);

        texelSize.x = 1f / vertexTex.width;
        texelSize.y = 1f / vertexTex.height;
        texelSize.z = vertexTex.width;
        texelSize.w = vertexTex.height;

        Debug.Log("Vertex Num " + vertexNum + " meshSize " + meshSize + " meshCenter " + meshCenter + " meshTopologyNum " + meshTopologyNum);
        ParticleData[] particles = new ParticleData[particleNum];
        float          indexStep = (float)vertexNum / particleNum;

        for (int i = 0; i < particleNum; i++)
        {
            particles[i] = new ParticleData(Vector3.zero, Random.insideUnitSphere * 5, indexStep * i, Color.HSVToRGB((float)i / particleNum, 0.75f, 1));
            //particles[i] = new ParticleData(Random.onUnitSphere * 100f, indexStep * i, Color.red);
        }

        particleBuffer.SetData(particles);
    }
Exemplo n.º 6
0
 void UpdateDetectShapes(ParticleData _particleData)
 {
     if (m_detectShapesHelper)
     {
         m_detectShapesHelper.UpdateShapes(_particleData);
     }
 }
Exemplo n.º 7
0
    /// <summary>
    /// 播放一个特效
    /// </summary>
    /// <param name="fxname"></param>
    /// <param name="loop"></param>
    /// <param name="fxtype"></param>
    /// <param name="parent"></param>
    /// <param name="trans"></param>
    /// <param name="lifetime"></param>
    /// <param name="alias"></param>
    /// <param name="limitry"></param>
    /// <returns></returns>
    public uint PlayFx(string fxname, bool loop, Transform parent = null, TransformData trans = null, float lifetime = -1, string alias = null, bool limitry = false)
    {
        ParticleData data = ParticleConfigManager.Instance.GetParticleData(fxname);

        if (data == null)
        {
            GameDebug.LogError("没有找到特效: " + fxname);
            return(uint.MaxValue);
        }

        uint         instID = mLastEffectID++;
        ParticleItem item   = new ParticleItem();

        item.localTrans = trans;
        item.parent     = parent;
        item.Alias      = alias;
        item.LimitRy    = limitry;
        item.Loop       = loop;
        if (mEffects.ContainsKey(instID))
        {
            mEffects.Remove(instID);
        }
        mEffects.Add(instID, item);

        BehaviourUtil.StartCoroutine(GenerateVisual(instID, fxname, item));
        return(instID);
    }
Exemplo n.º 8
0
        public void WriteParticleData(ParticleData value)
        {
            if (value is null || value == ParticleData.None)
            {
                return;
            }

            switch (value.ParticleType)
            {
            case ParticleType.Block:
                WriteVarInt(value.GetDataAs <int>());
                break;

            case ParticleType.Dust:
                var(red, green, blue, scale) = value.GetDataAs <(float, float, float, float)>();
                WriteFloat(red);
                WriteFloat(green);
                WriteFloat(blue);
                WriteFloat(scale);
                break;

            case ParticleType.FallingDust:
                WriteVarInt(value.GetDataAs <int>());
                break;

            case ParticleType.Item:
                WriteItemStack(value.GetDataAs <ItemStack>());
                break;
            }
        }
Exemplo n.º 9
0
 public void SetParticleData(ParticleData data)
 {
     position     = data.position;
     velocity     = data.velocity;
     acceleration = data.acceleration;
     netForce     = data.netForce;
 }
Exemplo n.º 10
0
        GameObject PlayImpl(int particleType, Transform parent, Vector3 pos, Vector3 dir)
        {
            if (_particles.ContainsKey(particleType) == false)
            {
                return(null);
            }

            ParticleData data            = _particles[particleType];
            ParticleInst newParticleInst = data.pool.Get();

            if (newParticleInst.inst == null)
            {
                newParticleInst.inst     = GameObject.Instantiate(data.prefab) as GameObject;
                newParticleInst.emitters = newParticleInst.inst.GetComponentsInChildren <ParticleSystem>();
            }

            newParticleInst.inst.transform.SetParent(parent);
            newParticleInst.inst.transform.position = pos;
            newParticleInst.inst.transform.forward  = dir;
            newParticleInst.inst.SetActive(true);
            foreach (var item in newParticleInst.emitters)
            {
                item.Play();
            }

            data.runList.Add(newParticleInst);

            return(newParticleInst.inst);
        }
Exemplo n.º 11
0
    async Task SimulatePhysics()
    {
        if (ids.Count == 0)
        {
            return;
        }

        //Debug.Log("1");
        int[] gridData = await CreateGrid();

        //Debug.Log("3");
        ParticleData[] particleOutput = await ApplyPhysics(gridData);

        //Debug.Log("6");

        // Updating positions and removing garbage
        for (int i = 0; i < particleOutput.Length; i++)
        {
            ParticleData data = particleOutput[i];
            ParticleData p    = particleData[data.id];
            if (data.position.y < 0 || data.position.x < 0 || data.position.y >= HEIGHT || data.position.x >= WIDTH)
            {
                RemoveParticle(data.id);
            }
            else
            {
                particleData.Remove(data.id);
                particleData[data.id] = data;
            }
        }
    }
Exemplo n.º 12
0
 public void PullDataFromSolver(ParticleData data = ParticleData.NONE)
 {
     foreach (ObiConstraintBatch batch in GetBatches())
     {
         batch.PullDataFromSolver(this);
     }
 }
Exemplo n.º 13
0
        private void UpdateParticles(List <ParticleData> particleList, GameTime gameTime)
        {
            float now = (float)gameTime.TotalGameTime.TotalMilliseconds;

            for (int i = particleList.Count - 1; i >= 0; i--)
            {
                ParticleData particle  = particleList[i];
                float        timeAlive = now - particle.BirthTime;

                if (timeAlive > particle.MaxAge)
                {
                    particleList.RemoveAt(i);
                }
                else
                {
                    float relAge = timeAlive / particle.MaxAge;
                    particle.Position = 0.5f * particle.Accelaration * relAge * relAge + particle.Direction * relAge + particle.OrginalPosition;

                    float invAge = 1.0f - relAge;
                    particle.ModColor = new Color(new Vector4(invAge, invAge, invAge, invAge));

                    Vector2 positionFromCenter = particle.Position - particle.OrginalPosition;
                    float   distance           = positionFromCenter.Length();
                    particle.Scaling = (50.0f + distance) / 200.0f;

                    particleList[i] = particle;
                }
            }
        }
Exemplo n.º 14
0
        public static ParticleData ToParticleData(this ClothParticleObject obj)
        {
            Vector3      pos = obj.transform.position;
            ParticleData p   = new ParticleData(pos.x, pos.y, pos.z, obj.Mass, obj.Kinematic);

            return(p);
        }
Exemplo n.º 15
0
    public void ShowParticle(string ID, Vector3 pos)
    {
        ParticleData findedparticle  = allParticles.Find(x => x.ID == ID);
        GameObject   createdparticle = Instantiate(findedparticle.particleprefab, pos, Quaternion.identity);

        Destroy(createdparticle, 2f);
    }
Exemplo n.º 16
0
        public void PushDataToSolver(ParticleData data = ParticleData.NONE)
        {
            if (!inSolver)
            {
                return;
            }

            // set solver constraint data:
            int[]   solverIndices = new int[stitches.Count * 2];
            float[] stiffnesses   = new float[stitches.Count];

            for (int i = 0; i < stitches.Count; i++)
            {
                solverIndices[i * 2]     = actor1.particleIndices[stitches[i].particleIndex1];
                solverIndices[i * 2 + 1] = actor2.particleIndices[stitches[i].particleIndex2];
                stiffnesses[i]           = 0;
            }

            Oni.SetStitchConstraints(batch, solverIndices, stiffnesses, stitches.Count);

            // set active constraints:
            int[] activeConstraints = new int[stitches.Count];
            for (int i = 0; i < stitches.Count; ++i)
            {
                activeConstraints[i] = i;
            }
            Oni.SetActiveConstraints(batch, activeConstraints, stitches.Count);
        }
Exemplo n.º 17
0
    async Task <ParticleData[]> ApplyPhysics(int[] gridData)
    {
        int colGridWidth  = (WIDTH + 2);
        int colGridHeight = (HEIGHT + 2);

        //Debug.Log("4");
        ParticleData[] particleOutput = new ParticleData[particleData.Count];

        // Extra dimensions for padding
        ComputeBuffer inputGrid      = new ComputeBuffer(colGridWidth * colGridHeight, 4);
        ComputeBuffer particleBuffer = new ComputeBuffer(particleData.Count, 36);

        int kernel2 = shader.FindKernel("Move");

        inputGrid.SetData(gridData);
        particleBuffer.SetData(particleData.Values.ToList());
        shader.SetBuffer(kernel2, "grid", inputGrid);
        shader.SetBuffer(kernel2, "particleBuffer", particleBuffer);
        shader.Dispatch(kernel2, particleData.Count, 1, 1);
        particleBuffer.GetData(particleOutput);
        //Debug.Log("5");

        inputGrid.Dispose();
        particleBuffer.Dispose();

        return(particleOutput);
    }
Exemplo n.º 18
0
    Material particleRenderMat;   // パーティクルをレンダリングするマテリアル


    void Start()
    {
        // パーティクルのコンピュートバッファを作成
        particleBuffer = new ComputeBuffer(NUM_PARTICLES, Marshal.SizeOf(typeof(ParticleData)));
        // パーティクルの初期値を設定
        var pData = new ParticleData[NUM_PARTICLES];

        for (int i = 0; i < pData.Length; i++)
        {
            pData[i].Velocity              = Random.insideUnitSphere;
            pData[i].Position              = Random.insideUnitSphere;
            pData[i].Acceleration          = Random.insideUnitSphere;
            pData[i].LifeTime              = lifeTime + Random.Range(-lifeTime * 0.5f, lifeTime * 0.5f);
            pData[i].TimeFromRePositioning = 0;
            pData[i].GeneratedNodeId       = i * trailBrush.nodeNum / NUM_PARTICLES;
        }
        // コンピュートバッファに初期値データをセット
        particleBuffer.SetData(pData);

        pData = null;

        // パーティクルをレンダリングするマテリアルを作成
        particleRenderMat           = new Material(SimpleParticleRenderShader);
        particleRenderMat.hideFlags = HideFlags.HideAndDontSave;
    }
Exemplo n.º 19
0
    // Use this for initialization
    void Start()
    {
        particleRing.maxParticles = particleNum;                  //设置最大粒子数
        particles     = new ParticleSystem.Particle[particleNum]; //新建粒子数组
        particleDatas = new ParticleData[particleNum];            //新建粒子数据数组
        particleRing.Emit(particleNum);                           //粒子系统发射粒子
        particleRing.GetParticles(particles);

        //初始化粒子位置
        for (int i = 0; i < particleNum; ++i)
        {
            float middleRadius = (maxRadius + minRadius) / 2;
            float upperbound   = Random.Range(middleRadius, maxRadius);
            float lowerbound   = Random.Range(minRadius, middleRadius);
            float radius       = Random.Range(lowerbound, upperbound);
            float angle        = Random.Range(0.0f, 360.0f);
            particleDatas[i] = new ParticleData(angle, radius, radius, radius - 1.5f * (radius / minRadius));
            // 随机收缩半径下界,避免收缩后成为圆线
            if (particleDatas[i].shringRadius < minRadius + 0.5f)
            {
                float temp = Random.Range(minRadius, minRadius + 0.25f);
                particleDatas[i].shringRadius = Random.Range(temp, minRadius + 0.5f);
            }
        }
    }
Exemplo n.º 20
0
    //随机放置粒子
    private void randomPlace()
    {
        for (int i = 0; i < par_count; i++)
        {
            float r = Random.Range(5f, 12f);
            if (r % 3 == 1)
            {
                r = Random.Range(7f, 10f);
            }
            else if (r % 3 == 2)
            {
                r = Random.Range(8f, 9f);
            }
            float angle     = Random.Range(0f, 360f);
            float theta     = angle / 180 * Mathf.PI;
            float speed     = Random.Range(0.5f, 1.5f);
            int   flag      = Random.Range(0, 2);
            bool  clockwise = (flag == 0) ? false : true;


            halo[i].position = new Vector3(r * Mathf.Cos(theta), r * Mathf.Sin(theta), 0f);
            par_data[i]      = new ParticleData(angle, r, speed, clockwise);
        }
        par_sys.SetParticles(halo, halo.Length);
    }
Exemplo n.º 21
0
        private IEnumerator RandomSpawnMovement(ParticleData data)
        {
            float lastShootTime = Time.time - data.MovementDuration;

            while (true)
            {
                if (Time.time > lastShootTime + data.MovementDuration)
                {
                    lastShootTime = Time.time;
                    Vector3 pos = Random.insideUnitSphere * data.MovementDistance;
                    pos.y = 0f;

                    // Spawn
                    Transform tf = Instantiate(data[CurrentSubIndex]);
                    tf.SetParent(ShowingParticleRoot);
                    tf.localPosition = pos;
                    tf.localRotation = Quaternion.identity;
                    tf.localScale    = Vector3.one;

                    float            maxDuration = 0f;
                    ParticleSystem[] ps          = tf.GetComponentsInChildren <ParticleSystem>(true);
                    for (int i = 0; i < ps.Length; i++)
                    {
                        maxDuration = Mathf.Max(
                            maxDuration,
                            ps[i].main.duration
                            );
                    }
                    Destroy(tf.gameObject, maxDuration);
                }
                yield return(new WaitForEndOfFrame());
            }
        }
Exemplo n.º 22
0
    void RandomlySpread()
    {
        float midRadius, minRate, maxRate, radius, angle, theta, time;

        //初始化粒子位置;
        for (int i = 0; i < count; i++)
        {
            // 随机每个粒子距离中心的半径,同时希望粒子集中在平均半径附近
            midRadius = (maxRadius + minRadius) / 2;
            minRate   = Random.Range(1.0f, midRadius / minRadius);
            maxRate   = Random.Range(midRadius / maxRadius, 1.0f);
            radius    = Random.Range(minRadius * minRate, maxRadius * maxRate);

            // 随机每个粒子的角度
            angle = Random.Range(0.0f, 360.0f);
            theta = angle / 180 * Mathf.PI;

            // 随机每个粒子的游离起始时间
            time = Random.Range(0.0f, 360.0f);

            particleData[i] = new ParticleData(radius, angle, time);

            particleArray[i].position = new Vector3(particleData[i].radius * Mathf.Cos(theta), particleData[i].radius * Mathf.Sin(theta), 0f);
        }
        particleSys.SetParticles(particleArray, particleArray.Length);
    }
Exemplo n.º 23
0
    void Start()
    {
        // バッファ生成
        this._ParticleDataBuffer      = new ComputeBuffer(this._particleCount, Marshal.SizeOf(typeof(ParticleData)));
        this._GPUInstancingArgsBuffer = new ComputeBuffer(1, this._GPUInstancingArgs.Length * sizeof(uint), ComputeBufferType.IndirectArguments);
        var particleDataArr = new ParticleData[this._particleCount];

        // set default position
        for (int i = 0; i < _particleCount; i++)
        {
            particleDataArr[i].BasePosition  = new Vector3(Random.Range(-10.0f, 10.0f), Random.Range(-10.0f, 10.0f), Random.Range(-10.0f, 10.0f));
            particleDataArr[i].Albedo        = new Vector3(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f));
            particleDataArr[i].rotationSpeed = Random.Range(1.0f, 100.0f);
        }
        this._ParticleDataBuffer.SetData(particleDataArr);
        particleDataArr = null;

        // creat point mesh
        _pointMesh          = new Mesh();
        _pointMesh.vertices = new Vector3[] {
            new Vector3(0, 0),
        };
        _pointMesh.normals = new Vector3[] {
            new Vector3(0, 1, 0),
        };
        _pointMesh.SetIndices(new int[] { 0 }, MeshTopology.Points, 0);
    }
Exemplo n.º 24
0
 public void Draw(SpriteBatch spriteBatch)
 {
     for (int i = 0; i < _particleList.Count; i++)
     {
         ParticleData particle = _particleList[i];
         spriteBatch.Draw(particle.ExplosionTexture ?? _explosionTexture, particle.Position, null, particle.ModColor, i, new Vector2(32, 32), particle.Scaling, SpriteEffects.None, 1);
     }
 }
 public ParticleData(ParticleData left, ParticleData right, float factor)
 {
     position        = new Vector3Data(left.position.Lerp(right.position, factor));
     velocity        = new Vector3Data(left.velocity.Lerp(right.velocity, factor));
     rotation        = Mathf.Lerp(left.rotation, right.rotation, factor);
     angularVelocity = Mathf.Lerp(left.angularVelocity, right.angularVelocity, factor);
     lifeTime        = Mathf.Lerp(left.lifeTime, right.lifeTime, factor);
 }
Exemplo n.º 26
0
 public Vehicle(VehiclesMod mod, VehicleDataXML data)
 {
     this.mod      = mod;
     map           = mod.Map;
     this.data     = data;
     DrawRotY      = data.RotY / 180f * MathHelper.Pi;
     smokeParticle = NewSmokeParticleData();
 }
 public ParticleData(ParticleData source)
 {
     position        = source.position.Clone();
     velocity        = source.velocity.Clone();
     rotation        = source.rotation;
     angularVelocity = source.angularVelocity;
     lifeTime        = source.lifeTime;
 }
Exemplo n.º 28
0
 public void DrawParticles(Texture2D newTexture, SpriteBatch spriteBatch)
 {
     for (int i = 0; i < particleList.Count; i++)
     {
         ParticleData particle = particleList[i];
         spriteBatch.Draw(newTexture, particle.Position, null, particle.ModColor, i, new Vector2(256, 256), particle.Scaling, SpriteEffects.None, 1);
     }
 }
Exemplo n.º 29
0
 public void DrawBoom(Texture2D newTexture, SpriteBatch spriteBatch)
 {
     for (int i = 0; i < boomList.Count; i++)
     {
         ParticleData boom = boomList[i];
         spriteBatch.Draw(newTexture, boom.Position, null, boom.ModColor, i, new Vector2(256, 256), boom.Scaling, SpriteEffects.None, 1);
     }
 }
Exemplo n.º 30
0
 void Start()
 {
     if (!vectorField.hasStarted)
     {
         vectorField.Start();
     }
     particleData = new ParticleData(numParticles, vectorField.field);
     particles    = new Matrix4x4[numParticles];
 }
Exemplo n.º 31
0
        public void AddParticleEffect(Vector2 position, Rectangle bounds, int particleCount, GameTime gameTime)
        {
            float maxAge = 20000f;

            for (int i = 0; i < particleCount; ++i)
            {
                ParticleData particle = new ParticleData();

                particle.position = position;
                particle.birthTime = gameTime.TotalGameTime.Milliseconds + gameTime.TotalGameTime.Seconds * 1000;
                particle.color = new Color((float)m_generator.NextDouble(), (float)m_generator.NextDouble(), (float)m_generator.NextDouble());
                particle.direction = new Vector2((float)(m_generator.NextDouble() * 2f) - 1f, (float)(m_generator.NextDouble() * 2f) - 1f);
                particle.maxAge = maxAge;

                m_particleList.Add(particle);
            }
        }
Exemplo n.º 32
0
        private void AddExplosionParticle(Vector2 explosionPos, float explosionSize, float maxAge, GameTime gameTime)
        {
            ParticleData particle = new ParticleData();

            particle.OrginalPosition = explosionPos;
            particle.Position = particle.OrginalPosition;

            particle.BirthTime = (float)gameTime.TotalGameTime.TotalMilliseconds;
            particle.MaxAge = maxAge;
            particle.Scaling = 0.25f;
            particle.ModColor = Color.White;

            //random direction
            float particleDistance = (float)rand.NextDouble() * explosionSize;
            Vector2 displacement = new Vector2(particleDistance, 0);
            float angle = MathHelper.ToRadians(rand.Next(360));
            displacement = Vector2.Transform(displacement, Matrix.CreateRotationZ(angle));

            particle.Direction = displacement;
            particle.Accelaration = 3.0f * particle.Direction;

            particleList.Add(particle);
        }
Exemplo n.º 33
0
        public static async Task Run(EngineContext engineContext)
        {
            ParticlePlugin particlePlugin;
            if (!engineContext.DataContext.RenderPassPlugins.TryGetValueCast("ParticlePlugin", out particlePlugin))
                return;

            var count = particlePlugin.CapacityCount;

            var particlesBuffer = new ParticleData[count];
            var random = new Random();
            for (int i = 0; i < particlesBuffer.Length; i++)
            {
                particlesBuffer[i] = new ParticleData
                    {
                        Position = new Vector3(1000.0f - (float)random.NextDouble() * 6000, 1500.0f - (float)random.NextDouble() * 3000.0f, 0),
                        Velocity = new Vector3(0, 0, 2.0f + 10.0f * (float)random.NextDouble()),
                        Time = 5000.0f * (float)random.NextDouble(),
                        Size = 1.0f + (float)random.NextDouble() * 10.0f,
                        Factors = new Vector3(1.0f + ((i & 255) == 0 ? (25.0f + 50.0f * (float)random.NextDouble()) : -(float)random.NextDouble() * ((i & 3) == 0 ? 2.0f : 1.0f)), 0, 0),
                        Opacity = 1.0f,
                    };
                particlesBuffer[i].Position.Z = particlesBuffer[i].Velocity.Z * particlesBuffer[i].Time / 100.0f;
            }

            var particleUpdater = new ParticleEmitterComponent()
                {
                    Type = ParticleEmitterType.GpuStatic,
                    Count = count,
                    Shader = new ShaderClassSource("ParticleUpdaterTest1"),
                };
            particleUpdater.ParticleData = particlesBuffer;
            particleUpdater.ParticleElementSize = Utilities.SizeOf<ParticleData>();

            // Add this particle updater to the particle engine
            particlePlugin.Updaters.Add(particleUpdater);
        }
Exemplo n.º 34
0
        public void AddExplosion(ParticleData[] PA, int MaxParticles, Vector2 ExplosionPosition, float ExplosionSize, GameTime gametime, Vector2 ImpactVelocity)
        {
            switch (ParticleID)
            {
                case 1:

                    for (int i = 0; i < MaxParticles; i++)
                    {
                        AddExplosionParticle1(PA, ExplosionPosition, ExplosionSize, gametime);
                    }
                    break;

                case 2:

                    for (int i = 0; i < MaxParticles; i++)
                    {
                        AddExplosionParticle2(PA, ExplosionPosition, ExplosionSize, gametime, ImpactVelocity);
                    }
                    break;

                default: break;
            }
        }
Exemplo n.º 35
0
        public void AddExplosionParticle1(ParticleData[] PA, Vector2 ExplosionPosition, float ExplosionSize, GameTime gametime)
        {
            ParticleData particle = new ParticleData();

            particle.OrginalPosition = ExplosionPosition;
            particle.Position = particle.OrginalPosition;

            particle.BirthTime = (float)gametime.TotalGameTime.TotalMilliseconds;

            particle.Scaling = ParticleScale;
            particle.ModColor = Color.White;

            float ParticleDistance = (float)random.NextDouble() * ExplosionSize;
            Vector2 Displacement = new Vector2(ParticleDistance);

            float angle = MathHelper.ToRadians(random.Next(360));
            Displacement = Vector2.Transform(Displacement, Matrix.CreateRotationZ(angle));

            particle.Direction = ParticleInitialVelocityScale * Displacement;
            particle.Accelaration = -ParticleAcceleration * particle.Direction;

            if (ParticleCounter == ParticleArraySize - 1)
            {
                ParticleCounter = 0;
            }

            if (particle.IsAlive)
            {
                ParticlesOverwritten++;
            }

            particle.IsAlive = true;
            PA[ParticleCounter] = particle;
            ParticleCounter++;
            ParticlesCreated++;
        }
Exemplo n.º 36
0
        public void AddExplosionParticle2(ParticleData[] PA, Vector2 ExplosionPosition, float ExplosionSize, GameTime gametime, Vector2 ImpactVelocity)
        {
            ParticleData particle = new ParticleData();

            particle.IsHoming = false;
            particle.OrginalPosition = ExplosionPosition;
            particle.Position = particle.OrginalPosition;

            particle.BirthTime = (float)gametime.TotalGameTime.TotalMilliseconds;

            //particle.Scaling = ParticleScale;
            particle.ModColor = Color.White;

            float ParticleDistance = (float)random.NextDouble() * ExplosionSize;
            Vector2 Displacement = new Vector2(ParticleDistance, 0);

            Vector2 IV = ImpactVelocity;

            Vector2 IVnorm = Vector2.Normalize(IV);
            Vector2 CartesianIVnorm = new Vector2(0, 0);

            float angle = (float)Math.Atan((IVnorm.Y / IVnorm.X));
            angle = MathHelper.ToDegrees(angle);

            float tanangle = Math.Abs(angle);
            float angleRangeMin = 0;
            float angleRangeMax = 0;

            int quadrant = FindQuadrant(IVnorm);

            switch (quadrant)
            {
                case 1:
                    CartesianIVnorm = new Vector2(Math.Abs(IVnorm.X), Math.Abs(IVnorm.Y));
                    angle = (float)Math.Atan((CartesianIVnorm.Y / CartesianIVnorm.X));
                    angle = MathHelper.ToDegrees(angle);
                    angleRangeMin = angle - ConeWidth;
                    angleRangeMax = angle + ConeWidth;
                    break;

                case 2:
                    CartesianIVnorm = new Vector2(-Math.Abs(IVnorm.X), Math.Abs(IVnorm.Y));
                    angle = (float)Math.Atan((CartesianIVnorm.X / CartesianIVnorm.Y));
                    angle = Math.Abs(MathHelper.ToDegrees(angle));
                    angleRangeMin = angle + 90 - ConeWidth;
                    angleRangeMax = angle + 90 + ConeWidth;
                    break;

                case 3:
                    CartesianIVnorm = new Vector2(-Math.Abs(IVnorm.X), -Math.Abs(IVnorm.Y));
                    angle = (float)Math.Atan((CartesianIVnorm.Y / CartesianIVnorm.X));
                    angle = MathHelper.ToDegrees(angle);
                    angleRangeMin = angle + 180 - ConeWidth;
                    angleRangeMax = angle + 180 + ConeWidth;
                    break;

                case 4:
                    CartesianIVnorm = new Vector2(Math.Abs(IVnorm.X), -Math.Abs(IVnorm.Y));
                    angle = (float)Math.Atan((CartesianIVnorm.X / CartesianIVnorm.Y));
                    angle = Math.Abs(MathHelper.ToDegrees(angle));
                    angleRangeMin = angle + 270 - ConeWidth;
                    angleRangeMax = angle + 270 + ConeWidth;
                    break;

                case 0:
                    if (IVnorm.X == 1 && IVnorm.Y == 0)
                    {
                        angleRangeMin = -ConeWidth;
                        angleRangeMax = ConeWidth;
                    }
                    else if (IVnorm.X == 0 && IVnorm.Y == -1)
                    {
                        angleRangeMin = 90 - ConeWidth;
                        angleRangeMax = 90 + ConeWidth;
                    }
                    else if (IVnorm.X == -1 && IVnorm.Y == 0)
                    {
                        angleRangeMin = 180 - ConeWidth;
                        angleRangeMax = 180 + ConeWidth;
                    }
                    else if (IVnorm.X == 0 && IVnorm.Y == 1)
                    {
                        angleRangeMin = 270 - ConeWidth;
                        angleRangeMax = 270 + ConeWidth;
                    }

                    break;

                default: break;

            }

            // Generate radom angle between Min and Max, then feed to isplacment code below
            float radMin = 1000 * MathHelper.ToRadians(angleRangeMin);
            float radMax = 1000 * MathHelper.ToRadians(angleRangeMax);
            float randomangle = random.Next((int)radMin, (int)radMax);
            randomangle = randomangle / 1000;
            //randomangle = MathHelper.ToRadians(randomangle);

            //For now, Displacement the usual-> relative to ExplosionSize, later can change to be magnitude of IV by using Vector2.Lengt

            Displacement = Vector2.Transform(Displacement, Matrix.CreateRotationZ(-randomangle));

            particle.Direction = ParticleInitialVelocityScale * Displacement;
            particle.Accelaration = -ParticleAcceleration * particle.Direction;

            if (ParticleCounter == ParticleArraySize - 1)
            {
                ParticleCounter = 0;
            }

            if (particle.IsAlive == true)
            {
                ParticlesOverwritten++;
            }

            particle.IsAlive = true;
            PA[ParticleCounter] = particle;
            ParticleCounter++;
            ParticlesCreated++;
        }
Exemplo n.º 37
0
        public void DrawExplosion(ParticleData[] PA, SpriteBatch spriteBatch, GameTime gameTime)
        {
            if (ParticleID == 1)
            {
              //  spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);

                for (int i = 0; i < ParticleArraySize; i++)
                {
                    spriteBatch.Draw(Explosion1Sprite,
                                   PA[i].Position,
                                   null,
                                   PA[i].ModColor,
                                   0,//MathHelper.ToRadians(i),//i, to rotate smoke cloud
                                   new Vector2(ParticleVectorX, ParticleVectorY),
                                   PA[i].Scaling,
                                   SpriteEffects.None,
                                   1);
                }

             //   spriteBatch.End();
            }

            else
            {

            //    spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);

                float nowdist = 0;
                float p1dist = 0;
                float ratio = 0;

                for (int i = 0; i < ParticleArraySize; i++)
                {

                    //ParticleData particle = PA[i];

                    if (PA[i].IsAlive == true)
                    {

                        spriteBatch.Draw(Explosion1Sprite,
                                         PA[i].Position,
                                         null,
                                         PA[i].ModColor,
                                         0,//MathHelper.ToRadians(i),//i, to rotate smoke cloud
                                         new Vector2(ParticleVectorX, ParticleVectorY),
                                         PA[i].Scaling,
                                         SpriteEffects.None,
                                         1);
                    }

                }

              //      spriteBatch.End();

            }
        }
Exemplo n.º 38
0
        public void UpdateParticles(ParticleData[] PA, GameTime gameTime, Vector2 P1positon)
        {
            float now = (float)gameTime.TotalGameTime.TotalMilliseconds;

            switch (ParticleID)
            {
                case 1:

                    for (int i = 0; i < ParticleArraySize; i++)
                    {
                        ParticleData particle = PA[i];
                        float timeAlive = now - particle.BirthTime;
                        particle.NowAge = timeAlive;

                        if (particle.NowAge > ParticleMaxAge || particle.ModColor.A < 0.1f)
                        {
                            particle.IsAlive = false;
                            particle.Accelaration = new Vector2(0, 0);
                            particle.Direction = new Vector2(0, 0);
                            particle.IsHoming = false;

                        }
                        else
                        {
                            float relativeAge = timeAlive / ParticleMaxAge;
                            particle.Position = 0.5f * particle.Accelaration * relativeAge * relativeAge + particle.Direction * relativeAge + particle.OrginalPosition;

                            float inverseAge = 1.0f - relativeAge;
                            particle.ModColor = new Color(new Vector4(inverseAge, inverseAge + 0.5f, inverseAge, inverseAge - 0.15f));

                            Vector2 positionFromCenter = particle.Position - particle.OrginalPosition;
                            float distance = positionFromCenter.Length();
                            particle.Scaling = (ParticleScaleFactor1 + distance) / ParticleScaleFactor2;
                            PA[i] = particle;
                        }
                    }
                    break;

                case 2:

                    for (int i = 0; i < ParticleArraySize; i++)
                    {
                        ParticleData particle = PA[i];

                        if (particle.IsAlive == true)
                        {
                            float timeAlive = now - particle.BirthTime;
                            particle.NowAge = timeAlive;

                            if (!particleWindow.Contains(new Point((int)particle.Position.X, (int)particle.Position.Y)))
                            {
                                particle.IsAlive = false;
                                particle.Accelaration = new Vector2(0, 0);
                                particle.Direction = new Vector2(0, 0);
                                particle.BirthTime = 0;
                                particle.IsHoming = false;
                                PA[i] = particle;
                                ParticlesKilled++;
                                continue;

                            }

                            if (particle.NowAge > ParticleMaxAge + ParticleAgeOffset)
                            {
                                particle.IsAlive = false;
                                particle.Accelaration = new Vector2(0, 0);
                                particle.Direction = new Vector2(0, 0);
                                particle.BirthTime = 0;
                                particle.IsHoming = false;
                                PA[i] = particle;
                                ParticlesKilled++;
                                continue;

                            }
                            else
                            {
                                float distori = Vector2.Distance(particle.OrginalPosition, particle.Position);
                                float distplayer = Vector2.Distance(P1positon, particle.Position);

                                if (Math.Abs(distori) > 0 || Math.Abs(distplayer) < 200)
                                {
                                    particle.IsHoming = true;
                                    particle.Accelaration = ParticleToPlayerAccelerationScale * Vector2.Normalize(P1positon - particle.Position);
                                    //particle.Accelaration.X = particle.Accelaration.X;
                                    //particle.Accelaration.Y = particle.Accelaration.Y;

                                }

                                float relativeAge = timeAlive / ParticleMaxAge;

                                particle.Position = 0.5f * particle.Accelaration * relativeAge * relativeAge + particle.Direction * relativeAge + particle.OrginalPosition;

                                //float inverseAge = 1.0f - relativeAge;
                                //particle.ModColor = new Color(new Vector4(inverseAge, inverseAge , inverseAge, inverseAge ));

                                //Vector2 positionFromCenter = particle.Position - particle.OrginalPosition;
                                //float distance = positionFromCenter.Length();
                                particle.Scaling = ParticleScale;// (ParticleScaleFactor1 + distance) / ParticleScaleFactor2;
                                PA[i] = particle;

                            }
                        }
                    }
                    break;

                default: break;
            }
        }