public SpatialTreeCell(int width, int height, int absoluteX, int absoluteY, float[] values, SpatialTreeCell parent) { this.width = width; this.height = height; this.absoluteX = absoluteX; this.absoluteY = absoluteY; this.parent = parent; this.values = values; if (width > 4 && height > 4) { element00 = HandleBlock(0, 0); element01 = HandleBlock(0, 1); element10 = HandleBlock(1, 0); element11 = HandleBlock(1, 1); // Grab from the child values, these will recursively be set (most efficient) averageValue = (element00.averageValue + element01.averageValue + element10.averageValue + element11.averageValue) / 4f; sumValue = (element00.sumValue + element01.sumValue + element10.sumValue + element11.sumValue); maxValue = Mathf.Max(element00.maxValue, element01.maxValue, element10.maxValue, element11.maxValue); } else { // There's no more children, calculate from our values. this.averageValue = this.values.Average(); this.maxValue = this.values.Max(); this.sumValue = this.values.Sum(); } }
protected virtual void Awake() { #if UNITY_5_4_OR_NEWER Random.InitState(System.DateTime.Now.Millisecond); #endif if (distributionTexture != null) { rootCell = GenerateRootCellForTexture(distributionTexture); } }
private void GetRandomValueFromSpatialTreeRecursive(SpatialTreeCell spatialTreeCell, int width, int height, ref Vector2 outValue) { Assert.IsNotNull(spatialTreeCell); if (spatialTreeCell.element00 != null) { Assert.IsNotNull(spatialTreeCell.element00); Assert.IsNotNull(spatialTreeCell.element01); Assert.IsNotNull(spatialTreeCell.element10); Assert.IsNotNull(spatialTreeCell.element11); var r = Random.Range(0f, spatialTreeCell.sumValue); if (spatialTreeCell.element00.sumValue >= r) { GetRandomValueFromSpatialTreeRecursive(spatialTreeCell.element00, width >> 1, height >> 1, ref outValue); return; } r -= spatialTreeCell.element00.sumValue; if (spatialTreeCell.element01.sumValue >= r) { GetRandomValueFromSpatialTreeRecursive(spatialTreeCell.element01, width >> 1, height >> 1, ref outValue); return; } r -= spatialTreeCell.element01.sumValue; if (spatialTreeCell.element10.sumValue >= r) { GetRandomValueFromSpatialTreeRecursive(spatialTreeCell.element10, width >> 1, height >> 1, ref outValue); return; } r -= spatialTreeCell.element10.sumValue; if (spatialTreeCell.element11.sumValue >= r) { GetRandomValueFromSpatialTreeRecursive(spatialTreeCell.element11, width >> 1, height >> 1, ref outValue); return; } DevdogLogger.LogVerbose("This should never be called.... " + r + " left.."); } else { // Grab (weighted) from the remaining cells. var sum = spatialTreeCell.sumValue; var r = Random.Range(0, sum); int counter = 0; int x = 0; int y = 0; bool shouldBreak = false; for (x = spatialTreeCell.absoluteX; x < spatialTreeCell.absoluteX + spatialTreeCell.width; x++) { if (shouldBreak) { break; } for (y = spatialTreeCell.absoluteY; y < spatialTreeCell.absoluteY + spatialTreeCell.height; y++) { if (spatialTreeCell.values[counter] >= r) { shouldBreak = true; break; } r -= spatialTreeCell.values[counter]; counter++; } } // At the end, no more child cells outValue.x = y; outValue.y = x; } }