Exemplo n.º 1
0
 public void ReInit(TerrainTreeData data, bool restart = false)
 {
     StopSimulation();
     //ClearInitialTexture();
     _burntTreeBuffer.Dispose();
     Init(data);
     if (restart)
     {
         StartSimulation();
     }
 }
Exemplo n.º 2
0
        public void Init(TerrainTreeData treeData)
        {
            _knownBurnedIndices = new SortedSet <int>();
            _treeData           = treeData;
            InitialState        = treeData.TreeTexture;

            // one pixel border on heightmaps
            TexResolution = treeData.Terrain.terrainData.heightmapResolution - TerrainUtils.UnityTextureBorder;

            myRt = new RenderTexture[NumTex];
            for (int i = 0; i < NumTex; i++)
            {
                myRt[i] = new RenderTexture(TexResolution, TexResolution, 24);
                myRt[i].enableRandomWrite = true;
                myRt[i].Create();

                if (i == 0)
                {
                    Graphics.Blit(InitialState, myRt[i]);
                }
            }

            Shader = (ComputeShader)Resources.Load("Fire");
            if (Shader == null)
            {
                Debug.LogError("Could not instantiate the compute shader for FireHandler");
                return;
            }

            //rend = GetComponent<Renderer>();
            if (Renderer != null)
            {
                Renderer.enabled = true;
            }

            // we don't know how many trees can be burnt during the dispatch, so buffer for full texture size is created
            // 2 mb for 512 terrain tile on GPU - seems okay
            _burntTreeBuffer = new ComputeBuffer(TexResolution * TexResolution, sizeof(int) * 2);

            // same size in ram - Vector2Int has two int members, rest is function pointers
            _burntTreeArray = new Vector2Int[TexResolution * TexResolution];

            _initKernel = Shader.FindKernel("CSInit");
            _mainKernel = Shader.FindKernel("CSMain");

            ResetComputeSim();

            _isInitialized = true;
        }
Exemplo n.º 3
0
        private TerrainTreeData PrepareTerrainTreeData(Terrain terrain)
        {
            var tex = GetTerrainTreesToTexture(terrain);

#if DEBUG
            TextureUtils.SaveTexture(tex, $"{Application.dataPath}/Resources/TreeSplatmaps");
#endif
            var treeData = new TerrainTreeData();
            treeData.TreeTexture = tex;
            treeData.Terrain     = terrain;

            var data     = terrain.terrainData;
            var size     = data.size;
            var position = terrain.gameObject.transform.position;
            var rect     = new Rect(position.x, position.z, size.x, size.z);

            var bounds     = data.bounds;
            var resolution = data.heightmapResolution;

            var quadTree = new QuadTree <TreeNode>(5, rect);
            treeData.QuadTree = quadTree;

            // copying for posterity
            treeData.OriginalTreeInstances = data.treeInstances.ToArray();

            for (int i = 0; i < data.treeInstances.Length; i++)
            {
                var treeInstance = data.treeInstances[i];

                var localSpace = treeInstance.position;
                var worldSpace = localSpace * resolution;

                var twoDimension = new Vector2(worldSpace.x + position.x, worldSpace.z + position.z);

                var treeNode = new TreeNode
                {
                    Position  = twoDimension,
                    TreeIndex = i,
                    TreeType  = (byte)treeInstance.prototypeIndex
                };

                quadTree.Insert(treeNode);
            }

            return(treeData);
        }