public bool ComputeMulti(ref RenderTexture[] renderTextures, ref ComputeBuffer maskBuffer, float seedParent, bool first = false) { TC_Compute compute = TC_Compute.instance; bool didCompute = false; float seedTotal = seed + seedParent; ComputeBuffer layerBuffer = selectNodeGroup.ComputeValue(seedTotal); if (layerBuffer != null) { didCompute = true; TC_Compute.InitPreviewRenderTexture(ref rtPreview, "rtPreview_Layer"); if (maskNodeGroup.active) { maskBuffer = maskNodeGroup.ComputeValue(seedTotal); } TC_Compute.InitPreviewRenderTexture(ref selectNodeGroup.rtColorPreview, "rtNodeGroupPreview_" + TC.outputNames[outputId]); if (outputId == TC.colorOutput) { compute.RunColorCompute(selectNodeGroup, selectItemGroup, ref renderTextures[0], ref layerBuffer); } else { compute.RunSplatCompute(selectNodeGroup, selectItemGroup, ref renderTextures, ref layerBuffer); } compute.DisposeBuffer(ref layerBuffer); if (maskBuffer != null) { TC_Reporter.Log("Run layer select * mask"); if (method != Method.Lerp || first) { if (outputId == TC.colorOutput) { compute.RunComputeColorMethod(this, ref renderTextures[0], maskBuffer, rtPreview); } else { compute.RunComputeMultiMethod(this, doNormalize, ref renderTextures, maskBuffer, rtPreview); } } rtDisplay = rtPreview; } else { TC_Reporter.Log("No mask buffer assign colorPreviewTex to layer"); rtDisplay = selectNodeGroup.rtColorPreview; } } return(didCompute); }
// Compute Color, splat and grass public bool ComputeMulti(ref RenderTexture[] renderTextures, ref ComputeBuffer maskBuffer, float seedParent, bool first = false) { TC_Compute compute = TC_Compute.instance; float totalSeed = seed + seedParent; bool computed = groupResult.ComputeMulti(ref renderTextures, totalSeed, doNormalize, first); if (maskNodeGroup.active) { maskBuffer = maskNodeGroup.ComputeValue(totalSeed); } if (maskBuffer != null) { TC_Compute.InitPreviewRenderTexture(ref rtPreview, "rtPreview_LayerGroup_" + TC.outputNames[outputId]); if (method != Method.Lerp || first) { if (outputId == TC.colorOutput) { compute.RunComputeColorMethod(this, ref renderTextures[0], maskBuffer, groupResult.rtDisplay); } else { compute.RunComputeMultiMethod(this, doNormalize, ref renderTextures, maskBuffer, groupResult.rtDisplay); } } rtDisplay = rtPreview; } else { rtDisplay = groupResult.rtDisplay; } return(computed); }
public bool ComputeMulti(ref RenderTexture[] renderTextures, float seedParent, bool doNormalize, bool first = false) { TC_Compute compute = TC_Compute.instance; RenderTexture[] rtsLayer = null; RenderTexture rtRightPreview = null; RenderTexture rtLeftPreview = null; RenderTexture[] rtsPreview = null; // RenderTexture rtPreview2 = null; ComputeBuffer layerMaskBuffer = null; TC_LayerGroup layerGroup; TC_Layer layer; bool firstCompute = false; bool lastCompute = false; int even = 0; rtsPreview = new RenderTexture[2]; SetPreviewTextureBefore(); float seedTotal = seed + seedParent; for (int i = 0; i < itemList.Count; i++) { layer = itemList[i] as TC_Layer; if (layer != null) { if (!layer.active) { continue; } // InitPreview(ref layer.previewRenderTex); if (!firstCompute) { firstCompute = layer.ComputeMulti(ref renderTextures, ref layerMaskBuffer, seedTotal, i == firstActive); if (firstCompute) { rtLeftPreview = layer.rtDisplay; TC_Reporter.Log("firt compute " + layer.maskNodeGroup.totalActive); compute.DisposeBuffer(ref layerMaskBuffer); } } else { TC_Compute.InitRenderTextures(ref rtsLayer, "rtsLayer", renderTextures.Length); lastCompute = layer.ComputeMulti(ref rtsLayer, ref layerMaskBuffer, seedTotal); if (lastCompute) { TC_Reporter.Log("Run layer method multi"); rtRightPreview = (layer.method == Method.Lerp) ? layer.selectNodeGroup.rtColorPreview : layer.rtDisplay; // Debug.Log(rtRight.name+ " "+ (layer.maskNodeGroup.activeTotal == 0 || layer.method == Method.Lerp)); if (outputId == TC.colorOutput) { compute.RunComputeColorMethod(layer, layer.method, ref renderTextures[0], ref rtsLayer[0], layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview); } else { compute.RunComputeMultiMethod(layer, layer.method, i == lastActive && doNormalize, ref renderTextures, ref rtsLayer, layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview); } compute.DisposeBuffer(ref layerMaskBuffer); } } } else { layerGroup = itemList[i] as TC_LayerGroup; if (layerGroup == null) { continue; } if (!layerGroup.active) { continue; } if (!firstCompute) { firstCompute = layerGroup.ComputeMulti(ref renderTextures, ref layerMaskBuffer, seedTotal, i == firstActive); if (firstCompute) { rtLeftPreview = layerGroup.rtDisplay; compute.DisposeBuffer(ref layerMaskBuffer); TC_Reporter.Log("LayerGroup did first compute"); } } else { TC_Compute.InitRenderTextures(ref rtsLayer, "rtsLayer", renderTextures.Length); lastCompute = layerGroup.ComputeMulti(ref rtsLayer, ref layerMaskBuffer, seedTotal); if (lastCompute) { // if (layerGroup.groupResult.activeTotal == 1) rtRight = layerGroup.rtDisplay; else rtRight = layerGroup.rtPreview; rtRightPreview = (layerGroup.method == Method.Lerp) ? layerGroup.groupResult.rtDisplay : layerGroup.rtDisplay; if (outputId == TC.colorOutput) { compute.RunComputeColorMethod(layerGroup, layerGroup.method, ref renderTextures[0], ref rtsLayer[0], layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview); } else { compute.RunComputeMultiMethod(layerGroup, layerGroup.method, i == lastActive && doNormalize, ref renderTextures, ref rtsLayer, layerMaskBuffer, rtPreview, ref rtsPreview[even++ % 2], ref rtLeftPreview, rtRightPreview); } compute.DisposeBuffer(ref layerMaskBuffer); } } } } SetPreviewTextureAfter(); if (layerMaskBuffer != null) { compute.DisposeBuffer(ref layerMaskBuffer); TC_Reporter.Log("Dispose layerMaskBuffer"); } TC_Compute.DisposeRenderTextures(ref rtsPreview); TC_Compute.DisposeRenderTextures(ref rtsLayer); return(firstCompute); }