// Compute height, trees and objects public ComputeBuffer ComputeSingle(float seedParent, bool first = false) { TC_Compute compute = TC_Compute.instance; ComputeBuffer totalBuffer = null; ComputeBuffer layerBuffer = null; ComputeBuffer layerMaskBuffer = null; RenderTexture[] rtsPreview = null; RenderTexture rtRightPreview = null; RenderTexture rtLeftPreview = null; if (outputId != TC.heightOutput) { rtsPreview = new RenderTexture[2]; } SetPreviewTextureBefore(); int even = 0; float seedTotal = seed + seedParent; for (int i = 0; i < itemList.Count; i++) { TC_Layer layer = itemList[i] as TC_Layer; if (layer != null) { if (!layer.active) { TC_Reporter.Log("Inactive layer " + i); continue; } if (totalBuffer == null) { if (outputId == TC.heightOutput) { layer.ComputeHeight(ref totalBuffer, ref layerMaskBuffer, seedTotal, i == firstActive); } else { layer.ComputeItem(ref totalBuffer, ref layerMaskBuffer, seedTotal, i == firstActive); if (totalBuffer != null) { rtLeftPreview = layer.rtDisplay; } } TC_Area2D.current.layerGroupBuffer = totalBuffer; // Portal compute.DisposeBuffer(ref layerMaskBuffer); } else { if (outputId == TC.heightOutput) { layer.ComputeHeight(ref layerBuffer, ref layerMaskBuffer, seedTotal); } else { layer.ComputeItem(ref layerBuffer, ref layerMaskBuffer, seedTotal); } if (layerBuffer != null) { if (outputId == TC.heightOutput) { compute.RunComputeMethod(this, layer, totalBuffer, ref layerBuffer, totalActive, i == lastActive ? rtPreview : null, layerMaskBuffer); } else { rtRightPreview = layer.rtDisplay; compute.RunComputeObjectMethod(this, layer, totalBuffer, ref layerBuffer, layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview); } TC_Area2D.current.layerGroupBuffer = totalBuffer; } compute.DisposeBuffer(ref layerMaskBuffer); } } else { TC_LayerGroup layerGroup = itemList[i] as TC_LayerGroup; if (layerGroup == null) { continue; } if (!layerGroup.active) { continue; } if (totalBuffer == null) { layerMaskBuffer = layerGroup.ComputeSingle(ref totalBuffer, seedTotal, i == firstActive); if (totalBuffer != null) { rtLeftPreview = layerGroup.rtDisplay; } TC_Area2D.current.layerGroupBuffer = totalBuffer; compute.DisposeBuffer(ref layerMaskBuffer); } else { layerMaskBuffer = layerGroup.ComputeSingle(ref layerBuffer, seedTotal); if (layerBuffer != null) { if (outputId == TC.heightOutput) { compute.RunComputeMethod(this, layerGroup, totalBuffer, ref layerBuffer, totalActive, i == lastActive ? rtPreview : null, layerMaskBuffer); } else { rtRightPreview = layerGroup.rtDisplay; compute.RunComputeObjectMethod(this, layerGroup, totalBuffer, ref layerBuffer, layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview); } TC_Area2D.current.layerGroupBuffer = totalBuffer; } compute.DisposeBuffer(ref layerMaskBuffer); } } } SetPreviewTextureAfter(); if (outputId != TC.heightOutput) { TC_Compute.DisposeRenderTextures(ref rtsPreview); } compute.DisposeBuffer(ref layerMaskBuffer); if (totalBuffer == null) { TC_Reporter.Log("Layer buffer null"); } return(totalBuffer); }