示例#1
0
    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));
    }
示例#2
0
    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));
 }