/// <summary>
 /// Finalizes the initialization.
 /// </summary>
 protected override void FinalizeInitialization()
 {
     //shrink the array
     var tmp = new RichCell.HeightData[_recordedEntries];
     Array.Copy(_heightData, tmp, _recordedEntries);
     _heightData = tmp;
 }
예제 #2
0
        private int SetData(RichCell c, int selfIdx, int neighbourIdx, int dataIdx, bool dataRecorded)
        {
            RichCell.HeightData data;
            if (dataRecorded)
            {
                data = _heightData[dataIdx++];
            }
            else
            {
                data = new RichCell.HeightData();
            }

            c.SetHeightData(selfIdx, data);

            var n = GetNeighbourFromIdx(c, selfIdx);

            if (n != null)
            {
                //Neighbour values are reversed
                var neighbourData = new RichCell.HeightData
                {
                    climbHeight = data.dropHeight,
                    dropHeight  = data.climbHeight,
                    slope       = data.slope
                };

                n.SetHeightData(neighbourIdx, neighbourData);
            }

            return(dataIdx);
        }
예제 #3
0
        protected override void FinalizeInitialization()
        {
            //shrink the array
            var tmp = new RichCell.HeightData[_recordedEntries];

            Array.Copy(_heightData, tmp, _recordedEntries);
            _heightData = tmp;
        }
            private void UpdateCellHeightData(RichCell reference, RichCell neighbour, float ledgeThreshold, int dx, int dz)
            {
                GetPerpendicularOffsets(dx, dz);
                var granularity = _matrix.granularity;
                var steps       = _matrix.cellSize / granularity;

                var data = new RichCell.HeightData();

                for (int o = 0; o < 3; o++)
                {
                    var samplePos  = reference.position + _offsets[o];
                    var fromHeight = _heightSampler.SampleHeight(samplePos, _matrix);

                    var climbAccumulator = 0.0f;
                    var dropAccumulator  = 0.0f;

                    for (int i = 0; i < steps; i++)
                    {
                        samplePos.x += (dx * granularity);
                        samplePos.z += (dz * granularity);

                        var toHeight = _heightSampler.SampleHeight(samplePos, _matrix);

                        var heightDiff = toHeight - fromHeight;
                        var absDiff    = Mathf.Abs(heightDiff);

                        //Initially we just record the slope as the height diff
                        if (data.slope < absDiff)
                        {
                            data.slope = absDiff;
                        }

                        if (absDiff < ledgeThreshold)
                        {
                            if (data.dropHeight < dropAccumulator)
                            {
                                data.dropHeight = dropAccumulator;
                            }
                            else if (data.climbHeight < climbAccumulator)
                            {
                                data.climbHeight = climbAccumulator;
                            }

                            dropAccumulator  = 0f;
                            climbAccumulator = 0f;
                        }

                        if (heightDiff > 0f)
                        {
                            climbAccumulator += heightDiff;

                            if (data.dropHeight < dropAccumulator)
                            {
                                data.dropHeight = dropAccumulator;
                            }

                            dropAccumulator = 0f;
                        }
                        else if (heightDiff < 0f)
                        {
                            dropAccumulator += absDiff;

                            if (data.climbHeight < climbAccumulator)
                            {
                                data.climbHeight = climbAccumulator;
                            }

                            climbAccumulator = 0f;
                        }

                        fromHeight = toHeight;
                    }

                    //Make sure we get the last accumulation recorded
                    if (data.dropHeight < dropAccumulator)
                    {
                        data.dropHeight = dropAccumulator;
                    }
                    else if (data.climbHeight < climbAccumulator)
                    {
                        data.climbHeight = climbAccumulator;
                    }
                } /* end for each offset */

                //Set the slope to an angular value
                var mod = (dx != 0 && dz != 0) ? Consts.SquareRootTwo : 1f;

                data.slope = Mathf.Atan(data.slope / (granularity * mod)) * Mathf.Rad2Deg;

                //Set the data
                reference.SetHeightData(dx, dz, data);
                reference.CalculateWorst();

                //Create the neighbour data as the reverse of this, i.e. drop = climb and vice versa
                var neighbourData = new RichCell.HeightData(data.slope, data.dropHeight, data.climbHeight);

                neighbour.SetHeightData(-dx, -dz, neighbourData);
                neighbour.CalculateWorst();
            }
        private int SetData(RichCell c, int selfIdx, int neighbourIdx, int dataIdx, bool dataRecorded)
        {
            RichCell.HeightData data;
            if (dataRecorded)
            {
                data = _heightData[dataIdx++];
            }
            else
            {
                data = new RichCell.HeightData();
            }

            c.SetHeightData(selfIdx, data);

            var n = GetNeighbourFromIdx(c, selfIdx);
            if (n != null)
            {
                //Neighbour values are reversed
                var neighbourData = new RichCell.HeightData
                {
                    climbHeight = data.dropHeight,
                    dropHeight = data.climbHeight,
                    slope = data.slope
                };

                n.SetHeightData(neighbourIdx, neighbourData);
            }

            return dataIdx;
        }
        private void UpdateCellHeightData(RichCell reference, RichCell neighbour, float ledgeThreshold, int dx, int dz)
        {
            var heightSampler = GetHeightSampler();

            var offsets = GetPerpendicularOffsets(dx, dz);
            var granularity = _matrix.granularity;
            var steps = _matrix.cellSize / granularity;

            var data = new RichCell.HeightData();

            for (int o = 0; o < 3; o++)
            {
                var samplePos = reference.position + offsets[o];
                var fromHeight = heightSampler.SampleHeight(samplePos, _matrix);

                var climbAccumulator = 0.0f;
                var dropAccumulator = 0.0f;

                for (int i = 0; i < steps; i++)
                {
                    samplePos.x += (dx * granularity);
                    samplePos.z += (dz * granularity);

                    var toHeight = heightSampler.SampleHeight(samplePos, _matrix);

                    var heightDiff = toHeight - fromHeight;
                    var absDiff = Mathf.Abs(heightDiff);

                    //Initially we just record the slope as the height diff
                    if (data.slope < absDiff)
                    {
                        data.slope = absDiff;
                    }

                    if (absDiff < ledgeThreshold)
                    {
                        if (data.dropHeight < dropAccumulator)
                        {
                            data.dropHeight = dropAccumulator;
                        }
                        else if (data.climbHeight < climbAccumulator)
                        {
                            data.climbHeight = climbAccumulator;
                        }

                        dropAccumulator = 0f;
                        climbAccumulator = 0f;
                    }

                    if (heightDiff > 0f)
                    {
                        climbAccumulator += heightDiff;

                        if (data.dropHeight < dropAccumulator)
                        {
                            data.dropHeight = dropAccumulator;
                        }

                        dropAccumulator = 0f;
                    }
                    else if (heightDiff < 0f)
                    {
                        dropAccumulator += absDiff;

                        if (data.climbHeight < climbAccumulator)
                        {
                            data.climbHeight = climbAccumulator;
                        }

                        climbAccumulator = 0f;
                    }

                    fromHeight = toHeight;
                }

                //Make sure we get the last accumulation recorded
                if (data.dropHeight < dropAccumulator)
                {
                    data.dropHeight = dropAccumulator;
                }
                else if (data.climbHeight < climbAccumulator)
                {
                    data.climbHeight = climbAccumulator;
                }
            } /* end for each offset */

            //Set the slope to an angular value
            var mod = (dx != 0 && dz != 0) ? Consts.SquareRootTwo : 1f;
            data.slope = Mathf.Atan(data.slope / (granularity * mod)) * Mathf.Rad2Deg;

            //Set the data
            reference.SetHeightData(dx, dz, data);
            reference.CalculateWorst();

            //Create the neighbour data as the reverse of this, i.e. drop = climb and vice versa
            var neighbourData = new RichCell.HeightData(data.slope, data.dropHeight, data.climbHeight);
            neighbour.SetHeightData(-dx, -dz, neighbourData);
            neighbour.CalculateWorst();
        }