public IOccluder Load(IArchiveDirectory occlusionDirectory)
    {
        bool isMainFigure = channelSystem.Parent == null;

        if (isMainFigure)
        {
            IArchiveFile occluderParametersFile = occlusionDirectory.File("occluder-parameters.dat");
            if (occluderParametersFile == null)
            {
                throw new InvalidOperationException("expected main figure to have occlusion system");
            }

            var             occluderParameters      = Persistance.Load <OccluderParameters>(occluderParametersFile);
            OcclusionInfo[] unmorphedOcclusionInfos = OcclusionInfo.UnpackArray(unmorphedOcclusionDirectory.File("occlusion-infos.array").ReadArray <uint>());
            var             occluder = new DeformableOccluder(device, shaderCache, channelSystem, unmorphedOcclusionInfos, occluderParameters);
            return(occluder);
        }
        else
        {
            OcclusionInfo[] figureOcclusionInfos = OcclusionInfo.UnpackArray(occlusionDirectory.File("occlusion-infos.array").ReadArray <uint>());
            OcclusionInfo[] parentOcclusionInfos = OcclusionInfo.UnpackArray(occlusionDirectory.File("parent-occlusion-infos.array").ReadArray <uint>());
            var             occluder             = new StaticOccluder(device, figureOcclusionInfos, parentOcclusionInfos);
            return(occluder);
        }
    }
Пример #2
0
    private void IncorporateChildOcclusionContributions(List <OcclusionInfo[]> childOcclusionContributions)
    {
        int count = unmorphedOcclusionInfos.Length;

        OcclusionInfoBlender[] blenders = new OcclusionInfoBlender[count];
        for (int i = 0; i < count; ++i)
        {
            blenders[i].Init(unmorphedOcclusionInfos[i]);
        }

        foreach (OcclusionInfo[] childOcclusionContribution in childOcclusionContributions)
        {
            if (childOcclusionContribution.Length != count)
            {
                throw new InvalidOperationException("parent-child occlusion info length mismatch");
            }

            for (int i = 0; i < count; ++i)
            {
                blenders[i].Add(childOcclusionContribution[i], unmorphedOcclusionInfos[i]);
            }
        }

        OcclusionInfo[] results = new OcclusionInfo[count];
        for (int i = 0; i < count; ++i)
        {
            results[i] = blenders[i].GetResult();
        }

        unmorphedWithChildrenOcclusionInfosToUpload = OcclusionInfo.PackArray(results);
    }
    public StaticOccluder(Device device, OcclusionInfo[] figureOcclusionInfos, OcclusionInfo[] parentOcclusionInfos)
    {
        this.device = device;

        this.parentOcclusionInfos = parentOcclusionInfos;

        occlusionInfosBufferManager = new StructuredBufferManager <uint>(device, figureOcclusionInfos.Length);
        occlusionInfosToUpload      = OcclusionInfo.PackArray(figureOcclusionInfos);
    }
 public void Add(OcclusionInfo occlusionInfo, OcclusionInfo baseOcclusionInfo)
 {
     if (frontRevealage != 0)
     {
         frontRevealage *= (1 - occlusionInfo.Front) / (1 - baseOcclusionInfo.Front);
     }
     if (backRevealage != 0)
     {
         backRevealage *= (1 - occlusionInfo.Back) / (1 - baseOcclusionInfo.Back);
     }
 }
Пример #5
0
    private void DumpSimpleOcclusion(DirectoryInfo shapeDirectory, ChannelInputs shapeInputs, float[] faceTransparencies)
    {
        FileInfo occlusionInfosFile       = shapeDirectory.File("occlusion-infos.array");
        FileInfo parentOcclusionInfosFile = shapeDirectory.File("parent-occlusion-infos.array");

        if (occlusionInfosFile.Exists)
        {
            return;
        }

        Console.WriteLine("Calculating occlusion...");

        if (faceTransparencies == null)
        {
            faceTransparencies = FaceTransparencies.For(figure);
        }

        FigureGroup             figureGroup;
        FaceTransparenciesGroup faceTransparenciesGroup;

        if (figure == parentFigure)
        {
            figureGroup             = new FigureGroup(figure);
            faceTransparenciesGroup = new FaceTransparenciesGroup(faceTransparencies);
        }
        else
        {
            var parentFaceTransparencies = FaceTransparencies.For(parentFigure);

            figureGroup             = new FigureGroup(parentFigure, figure);
            faceTransparenciesGroup = new FaceTransparenciesGroup(parentFaceTransparencies, faceTransparencies);
        }

        var inputs  = new ChannelInputsGroup(parentFigure.MakeDefaultChannelInputs(), new ChannelInputs[] { shapeInputs });
        var outputs = figureGroup.Evaluate(inputs);

        FigureOcclusionCalculator.Result occlusionResult;
        using (var occlusionCalculator = new FigureOcclusionCalculator(fileLocator, device, shaderCache, figureGroup, faceTransparenciesGroup)) {
            occlusionResult = occlusionCalculator.CalculateOcclusionInformation(outputs);
        }

        shapeDirectory.Create();
        if (figure == parentFigure)
        {
            occlusionInfosFile.WriteArray(OcclusionInfo.PackArray(occlusionResult.ParentOcclusion));
        }
        else
        {
            occlusionInfosFile.WriteArray(OcclusionInfo.PackArray(occlusionResult.ChildOcclusions[0]));
            parentOcclusionInfosFile.WriteArray(OcclusionInfo.PackArray(occlusionResult.ParentOcclusion));
        }
    }
Пример #6
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);
        unmorphedWithChildrenOcclusionInfosToUpload      = OcclusionInfo.PackArray(unmorphedOcclusionInfos);

        parametersResources = OccluderParametersResources.Make(device, parameters);
        channelIndices      = parameters.ChannelNames
                              .Select(channelName => channelSystem.ChannelsByName[channelName].Index)
                              .ToArray();
    }
Пример #7
0
    public static               OcclusionInfo[] UnpackArray(uint[] packedArray)
    {
        if (packedArray == null)
        {
            return(null);
        }

        int length = packedArray.Length;

        OcclusionInfo[] array = new OcclusionInfo[length];
        for (int i = 0; i < length; ++i)
        {
            array[i] = Unpack(packedArray[i]);
        }
        return(array);
    }
Пример #8
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);
    }
Пример #9
0
 public static uint Pack(OcclusionInfo occlusionInfo)
 {
     return(IntegerUtils.Pack(
                IntegerUtils.ToUShort(occlusionInfo.Front),
                IntegerUtils.ToUShort(occlusionInfo.Back)));
 }
 public void Init(OcclusionInfo occlusionInfo)
 {
     frontRevealage = (1 - occlusionInfo.Front);
     backRevealage  = (1 - occlusionInfo.Back);
 }