private void OnNewBurntTreesReported(object sender, BurntTreesEventArgs e)
        {
            var handler = sender as FireHandler;

            if (handler == null)
            {
                Debug.LogError("New Burnt Trees reported not handling event from FireHandler?");
                return;
            }

            var treeData   = _handlersToTreeData[handler];
            var treeNodes  = new List <TreeNode>();
            var resolution = treeData.Terrain.terrainData.heightmapResolution - TerrainUtils.UnityTextureBorder;

            foreach (var burntTreePos in e.BurntTrees)
            {
                var localSpace = burntTreePos;
                var worldSpace = new Vector3(localSpace.x * resolution, 0, localSpace.y * resolution);

                var terrainPosition = treeData.Terrain.transform.position;

                var offsetPosition = worldSpace + terrainPosition;

                bool foundAny = FindAllTreeInstancesAroundPosition(offsetPosition, SelectionRange * 2, treeData.Terrain, ref treeNodes, false);
            }

            ToggleTreeNodes(treeNodes, IndexOfBurningPrototype, treeData.Terrain);
        }
        private void ComputeStepFrame()
        {
            int prevTex = _currTex;

            _currTex = (_currTex + 1) % NumTex;

            Shader.SetInt("TexRes", TexResolution);
            Shader.SetBuffer(_mainKernel, "BurntTrees", _burntTreeBuffer);
            Shader.SetTexture(_mainKernel, "Prev", myRt[prevTex]);
            Shader.SetInt("RandOffset", (int)(Time.timeSinceLevelLoad * 100));
            Shader.SetInt("WindDirDegrees", WindDir);
            Shader.SetInt("WindSpeed", WindSpeed);
            Shader.SetInt("NaturalFireSpreadSpeed", NaturalFireSpreadSpeed);
            Shader.SetTexture(_mainKernel, "Result", myRt[_currTex]);
            Shader.Dispatch(_mainKernel, TexResolution / 8, TexResolution / 8, 1);

            //Array.Clear(_burntTreeArray, 0, _burntTreeArray.Length);
            _burntTreeBuffer.GetData(_burntTreeArray);

            //_reusableEventArgs.BurntTrees.Clear();
            BurntTreesEventArgs eventArgs = null;

            for (var index = 0; index < _burntTreeArray.Length; index++)
            {
                var item = _burntTreeArray[index];
                // zeroed value is not interesting
                if (item == Vector2Int.zero)
                {
                    continue;
                }

                // non-zero values we don't know yet are, though
                if (!_knownBurnedIndices.Contains(index))
                {
                    _knownBurnedIndices.Add(index);
                    if (eventArgs == null)
                    {
                        eventArgs = new BurntTreesEventArgs();
                    }

                    Vector2 pos = new Vector2((index % TexResolution) / (float)TexResolution, (index / (float)TexResolution) / TexResolution);
                    eventArgs.BurntTrees.Add(pos);
                }
            }

            if (eventArgs != null)
            {
                OnBurntTreesAdded(eventArgs);
            }

            _lastUpdate -= StepTime;
        }
 protected virtual void OnBurntTreesAdded(BurntTreesEventArgs e)
 {
     BurntTreesAdded?.Invoke(this, e);
 }