public void ReInit(TerrainTreeData data, bool restart = false) { StopSimulation(); //ClearInitialTexture(); _burntTreeBuffer.Dispose(); Init(data); if (restart) { StartSimulation(); } }
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; }
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); }