Example #1
0
    private OccluderParametersResources(Device device, OccluderParameters parameters)
    {
        vertexCount = parameters.BaseOcclusion.Length;

        channelWeightsBufferManager         = new StructuredBufferManager <float>(device, parameters.ChannelNames.Count);
        baseOcclusionView                   = BufferUtilities.ToStructuredBufferView(device, parameters.BaseOcclusion);
        occlusionDeltaWeightSegmentsView    = BufferUtilities.ToStructuredBufferView(device, parameters.Deltas.Segments);
        occlusionDeltaWeightElemsView       = BufferUtilities.ToStructuredBufferView(device, parameters.Deltas.Elems);
        calculatedInfosBuffersBufferManager = new InOutStructuredBufferManager <uint>(device, parameters.BaseOcclusion.Length);
    }
Example #2
0
    public OccluderParameters CalculateOccluderParameters()
    {
        var baseInputs         = MakePosedShapeInputs();
        var baseOutputs        = figure.Evaluate(null, baseInputs);
        var baseOcclusionInfos = CalculateOcclusion(baseOutputs);

        List <Channel> channels = new List <Channel>();
        List <List <OcclusionDelta> > perVertexDeltas = new List <List <OcclusionDelta> >();

        for (int i = 0; i < baseOcclusionInfos.Length; ++i)
        {
            perVertexDeltas.Add(new List <OcclusionDelta>());
        }

        foreach (var channel in GetChannelsForOcclusionSystem())
        {
            Console.WriteLine($"\t{channel.Name}...");

            int occlusionChannelIdx = channels.Count;
            channels.Add(channel);

            var inputs = new ChannelInputs(baseInputs);
            channel.SetValue(inputs, 1);
            var outputs        = figure.Evaluate(null, inputs);
            var occlusionInfos = CalculateOcclusion(outputs);

            for (int vertexIdx = 0; vertexIdx < occlusionInfos.Length; ++vertexIdx)
            {
                if (Math.Abs(occlusionInfos[vertexIdx].Front - baseOcclusionInfos[vertexIdx].Front) > OcclusionDifferenceThreshold)
                {
                    var delta = new OcclusionDelta(occlusionChannelIdx, OcclusionInfo.Pack(occlusionInfos[vertexIdx]));
                    perVertexDeltas[vertexIdx].Add(delta);
                }
            }
        }

        var parameters = new OccluderParameters(
            OcclusionInfo.PackArray(baseOcclusionInfos),
            channels.Select(channel => channel.Name).ToList(),
            PackedLists <OcclusionDelta> .Pack(perVertexDeltas));

        return(parameters);
    }
Example #3
0
 public static OccluderParametersResources Make(Device device, OccluderParameters parameters)
 {
     return(parameters != null ? new OccluderParametersResources(device, parameters) : null);
 }
Example #4
0
    public DeformableOccluder(Device device, ShaderCache shaderCache, ChannelSystem channelSystem, OcclusionInfo[] unmorphedOcclusionInfos, OccluderParameters parameters)
    {
        this.unmorphedOcclusionInfos = unmorphedOcclusionInfos;

        shader = shaderCache.GetComputeShader <DeformableOccluder>("figure/occlusion/shader/Occluder");

        unmorphedWithoutChildrenOcclusionInfosView       = BufferUtilities.ToStructuredBufferView(device, OcclusionInfo.PackArray(unmorphedOcclusionInfos));
        unmorphedWithChildrenOcclusionInfosBufferManager = new StructuredBufferManager <uint>(device, unmorphedOcclusionInfos.Length);

        parametersResources = OccluderParametersResources.Make(device, parameters);
        channelIndices      = parameters.ChannelNames
                              .Select(channelName => channelSystem.ChannelsByName[channelName].Index)
                              .ToArray();
    }