Esempio n. 1
0
    // Pick craters to be shaded with radial streaks emanating from them
    void SetCraters(MoonShape moonShape)
    {
        PRNG random = new PRNG(ejectaRaySeed);
        //int desiredNumCraterRays = random.Range (5, 15);
        //desiredNumCraterRays = 2;

        // Sort craters from largest to smallest
        var sortedCraters = new List <CraterSettings.Crater> (moonShape.craterSettings.cachedCraters);

        sortedCraters.Sort((a, b) => b.size.CompareTo(a.size));
        int poolSize = Mathf.Clamp((int)((sortedCraters.Count - 1) * candidatePoolSize), 1, sortedCraters.Count);

        sortedCraters = sortedCraters.GetRange(0, poolSize);
        random.Shuffle(sortedCraters);

        // Choose craters
        var chosenCraters = new List <CraterSettings.Crater> ();

        for (int i = 0; i < sortedCraters.Count; i++)
        {
            var currentCrater = sortedCraters[i];

            // Reject those which are too close to already chosen craters as the textures may not overlap
            bool overlapsOtherEjecta = false;
            for (int j = 0; j < chosenCraters.Count; j++)
            {
                float dst             = (currentCrater.centre - chosenCraters[j].centre).magnitude;
                float ejectaRadiusSum = (currentCrater.size + chosenCraters[j].size) * ejectaRaysScale / 2;

                if (dst < ejectaRadiusSum)
                {
                    overlapsOtherEjecta = true;
                    break;
                }
            }

            //Debug.DrawRay (currentCrater.centre, currentCrater.centre * 0.2f, (overlapsOtherEjecta) ? Color.red : Color.green);
            if (!overlapsOtherEjecta)
            {
                chosenCraters.Add(currentCrater);
            }
            if (chosenCraters.Count >= desiredNumCraterRays)
            {
                break;
            }
        }

        // Set
        var ejectaCraters = new Vector4[chosenCraters.Count];

        for (int i = 0; i < chosenCraters.Count; i++)
        {
            var crater = chosenCraters[i];
            ejectaCraters[i] = new Vector4(crater.centre.x, crater.centre.y, crater.centre.z, crater.size * ejectaRaysScale);
            //CustomDebug.DrawSphere (crater.centre, crater.size * ejectaRaysScale / 2, Color.yellow);
        }

        ComputeHelper.CreateAndSetBuffer <Vector4> (ref craterBuffer, ejectaCraters, shadingDataCompute, "ejectaCraters");
        shadingDataCompute.SetInt("numEjectaCraters", chosenCraters.Count);
    }
Esempio n. 2
0
 public override void Initialize(CelestialBodyShape shape)
 {
     base.Initialize(shape);
     moonShape = shape as MoonShape;
 }