// 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); }
public override void Initialize(CelestialBodyShape shape) { base.Initialize(shape); moonShape = shape as MoonShape; }