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();
            }
        }
Ejemplo n.º 2
0
        protected virtual void Awake()
        {
#if UNITY_5_4_OR_NEWER
            Random.InitState(System.DateTime.Now.Millisecond);
#endif

            if (distributionTexture != null)
            {
                rootCell = GenerateRootCellForTexture(distributionTexture);
            }
        }
Ejemplo n.º 3
0
        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;
            }
        }