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; } }
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; } }
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; } }
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; } }