public static Star[] Generate(Random rand, int count) { float minRad = 1f / 16f; float maxRad = 1f / 2f; float near = 8f; float far = 32f; var stars = new Star[count]; for (int i = 0; i < count; ++i) { float shift = rand.NextSingle() * 2f - 1f; float rad = minRad + (float)Math.Pow(rand.NextDouble(), 16) * (maxRad - minRad); var pos = Starfield.GetRandomPosition(rand, near, far); var clr = new Color4(0.9f + shift * 0.1f, 0.9f - Math.Abs(shift) * 0.2f, 0.85f - shift * 0.1f, 1f); var star = new Star(pos, rad, clr); stars[i] = star; } Array.Sort(stars, Starfield.Comparer); return(stars); }
public static DustCloud[] Generate(Random rand, int count) { float minRad = 1f; float maxRad = 16f; float near = 20f; float far = 32f; var clrPairs = new Color4[, ] { { Color4.Red, Color4.Blue } }; int variation = rand.Next(16, 32); var seta = new Vector3[variation]; var setb = new Vector3[variation]; for (int i = 0; i < variation; ++i) { seta[i] = Starfield.GetRandomPosition(rand, near, far); setb[i] = Starfield.GetRandomPosition(rand, near, far); } int index = rand.Next(clrPairs.GetLength(0)); var clra = clrPairs[index, 0]; var clrb = clrPairs[index, 1]; var dusts = new DustCloud[count]; for (int i = 0; i < count; ++i) { var pos = Starfield.GetRandomPosition(rand, near, far); float scale = (float)Math.Pow(rand.NextDouble(), 4); float rad = minRad + scale * (maxRad - minRad); float alpha = (1 - scale) / 96f; var suma = seta.Sum(x => 1f / Math.Max(0.125f, (pos - x).LengthSquared)); var sumb = setb.Sum(x => 1f / Math.Max(0.125f, (pos - x).LengthSquared)); var shift = (suma * suma) / ((suma * suma) + (sumb * sumb)); var clr = new Color4( clra.R * shift + clrb.R * (1f - shift), clra.G * shift + clrb.G * (1f - shift), clra.B * shift + clrb.B * (1f - shift), alpha); var dust = new DustCloud(pos, rad, clr); dusts[i] = dust; } Array.Sort(dusts, Starfield.Comparer); return(dusts); }