Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }