public Result CalculateOcclusionInformation(ChannelOutputsGroup outputsGroup) { List <Vector3> groupControlPositions = new List <Vector3>(); Vector3[] parentDeltas = figureGroup.Parent.CalculateDeltas(outputsGroup.ParentOutputs); List <BasicRefinedVertexInfo[]> surrogateVertexInfos = new List <BasicRefinedVertexInfo[]>(); //parent { var figure = figureGroup.Parent; var outputs = outputsGroup.ParentOutputs; var controlPositions = figure.CalculateControlPositions(outputs, parentDeltas); groupControlPositions.AddRange(controlPositions); foreach (var surrogate in figure.OcclusionBinding.Surrogates) { surrogateVertexInfos.Add(surrogate.GetVertexInfos(outputs, controlPositions)); } } int figureOffset = groupControlPositions.Count; //children for (int childIdx = 0; childIdx < figureGroup.Children.Length; ++childIdx) { var figure = figureGroup.Children[childIdx]; var outputs = outputsGroup.ChildOutputs[childIdx]; var controlPositions = figure.CalculateControlPositions(outputs, parentDeltas); groupControlPositions.AddRange(controlPositions); } DeviceContext context = device.ImmediateContext; groupControlPositionsBufferManager.Update(context, groupControlPositions.ToArray()); vertexRefiner.Refine(context, groupControlPositionsBufferManager.View, refinedVertexInfosBufferManager.OutView); for (int surrogateIdx = 0; surrogateIdx < figureGroup.Parent.OcclusionBinding.Surrogates.Count; ++surrogateIdx) { var segment = surrogateSegments[surrogateIdx]; var vertexInfos = surrogateVertexInfos[surrogateIdx]; refinedVertexInfosBufferManager.Update(context, vertexInfos, segment.Offset); } OcclusionInfo[] groupOcclusionInfos = occlusionCalculator.Run(context, refinedVertexInfosBufferManager.InView); OcclusionInfo[] parentOcclusionInfos; List <OcclusionInfo[]> childOcclusionInfos = new List <OcclusionInfo[]>(); //parent { var segment = parentSegment; var mainOcclusionInfos = groupOcclusionInfos.Skip(segment.Offset).Take(segment.Count); var surrogateOcclusionInfos = surrogateSegments .SelectMany(surrogateSegment => groupOcclusionInfos.Skip(surrogateSegment.Offset).Take(surrogateSegment.Count)); var figureOcclusionInfos = mainOcclusionInfos.Concat(surrogateOcclusionInfos).ToArray(); parentOcclusionInfos = figureOcclusionInfos; } //children foreach (var segment in childSegments) { var figureOcclusionInfos = groupOcclusionInfos.Skip(segment.Offset).Take(segment.Count).ToArray(); childOcclusionInfos.Add(figureOcclusionInfos); } return(new Result(parentOcclusionInfos, childOcclusionInfos)); }
private OcclusionInfo[] CalculateOcclusion(ChannelOutputs outputs) { var outputsGroup = new ChannelOutputsGroup(outputs, new ChannelOutputs[0]); return(occlusionCalculator.CalculateOcclusionInformation(outputsGroup).ParentOcclusion); }
public static ChannelOutputs FindExportTarget(ChannelOutputsGroup group) { return(FindExportTarget(group.ParentOutputs, group.ChildOutputs)); }