Пример #1
0
        internal static void InitEmitterCircleSource(EntityManager mgr, Entity emitter, DynamicBuffer <Particle> particles, int offset, Range speed, float randomizePos, float randomizeDir, float4x4 matrix, ref Random rand)
        {
            var radius = mgr.GetComponentData <EmitterCircleSource>(emitter).Radius;

            for (var i = offset; i < particles.Length; i++)
            {
                var   particle         = particles[i];
                float randomAngle      = rand.NextFloat((float)-math.PI, (float)math.PI);
                float radiusNormalized = math.sqrt(rand.Random01());
                radius *= radiusNormalized;
                var positionNormalized = new float3(math.sin(randomAngle), math.cos(randomAngle), 0.0f);
                particle.position = GetParticlePosition(positionNormalized * radius, randomizePos, matrix, ref rand);
                particle.velocity = GetParticleVelocity(ref positionNormalized, speed, randomizeDir, matrix, ref rand);
                particle.rotation = GetParticleRotation(mgr, emitter, positionNormalized, ref rand);
                particles[i]      = particle;
            }
        }
Пример #2
0
        internal static void InitEmitterSphereSource(EntityManager mgr, Entity emitter, DynamicBuffer <Particle> particles, int offset, float radius, bool hemisphere, Range speed, float randomizePos, float randomizeDir, float4x4 matrix, ref Random rand)
        {
            for (var i = offset; i < particles.Length; i++)
            {
                var    particle             = particles[i];
                float3 positionOnUnitSphere = rand.NextFloat3Direction();

                // For sphere, z ranges from [-1, 1]. For hemisphere, z ranges from [0, 1].
                if (hemisphere)
                {
                    positionOnUnitSphere.z = math.abs(positionOnUnitSphere.z);
                }

                // Create more points toward the outer part of the sphere
                float3 position = positionOnUnitSphere * math.pow(rand.Random01(), 1.0f / 3.0f) * radius;

                particle.position = GetParticlePosition(position, randomizePos, matrix, ref rand);
                particle.velocity = GetParticleVelocity(ref positionOnUnitSphere, speed, randomizeDir, matrix, ref rand);
                particle.rotation = GetParticleRotation(mgr, emitter, positionOnUnitSphere, ref rand);
                particles[i]      = particle;
            }
        }
Пример #3
0
        internal static void InitEmitterRectangleSource(EntityManager mgr, Entity emitter, DynamicBuffer <Particle> particles, int offset, Range speed, float randomizePos, float randomizeDir, float4x4 matrix, ref Random rand)
        {
            // Unit rectangle centered at the origin
            float2 bottomLeft = new float2(-0.5f, -0.5f);
            float2 topRight   = new float2(0.5f, 0.5f);
            float3 direction  = new float3(0, 0, 1);

            for (var i = offset; i < particles.Length; i++)
            {
                var particle = particles[i];
                var position = new float3(rand.NextFloat2(bottomLeft, topRight), 0.0f);
                particle.position = GetParticlePosition(position, randomizePos, matrix, ref rand);
                particle.velocity = GetParticleVelocity(ref direction, speed, randomizeDir, matrix, ref rand);
                particle.rotation = GetParticleRotation(mgr, emitter, direction, ref rand);
                particles[i]      = particle;
            }
        }
Пример #4
0
        internal static void InitEmitterConeSource(EntityManager mgr, Entity emitter, DynamicBuffer <Particle> particles, int offset, Range speed, float randomizePos, float randomizeDir, float4x4 matrix, ref Random rand)
        {
            var source = mgr.GetComponentData <EmitterConeSource>(emitter);

            source.Angle = math.clamp(source.Angle, 0.0f, 90.0f);
            float coneAngle = math.radians(source.Angle);

            for (var i = offset; i < particles.Length; i++)
            {
                var    particle         = particles[i];
                float  angle            = rand.Random01() * 2.0f * math.PI;
                float  radiusNormalized = math.sqrt(rand.Random01());
                float3 localPositionOnConeBase;
                localPositionOnConeBase.x = math.cos(angle);
                localPositionOnConeBase.y = math.sin(angle);
                localPositionOnConeBase.z = 0.0f;
                localPositionOnConeBase  *= radiusNormalized;
                particle.position         = GetParticlePosition(localPositionOnConeBase * source.Radius, randomizePos, matrix, ref rand);
                float  directionRadius = math.sin(coneAngle);
                float  directionHeight = math.cos(coneAngle);
                float3 direction       = new float3(localPositionOnConeBase.x * directionRadius, localPositionOnConeBase.y * directionRadius, directionHeight);
                particle.velocity = GetParticleVelocity(ref direction, speed, randomizeDir, matrix, ref rand);
                particle.rotation = GetParticleRotation(mgr, emitter, direction, ref rand);
                particles[i]      = particle;
            }
        }