public OccluderParametersCalculator(ContentFileLocator fileLocator, Device device, ShaderCache shaderCache, Figure figure, float[] faceTransparencies, ChannelInputs shapeInputs) { this.figure = figure; this.shapeInputs = shapeInputs; figureGroup = new FigureGroup(figure); var faceTransparenciesGroup = new FaceTransparenciesGroup(faceTransparencies); occlusionCalculator = new FigureOcclusionCalculator(fileLocator, device, shaderCache, figureGroup, faceTransparenciesGroup); }
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)); } }
public FigureOcclusionCalculator(ContentFileLocator fileLocator, Device device, ShaderCache shaderCache, FigureGroup figureGroup, FaceTransparenciesGroup faceTransparenciesGroup) { this.device = device; this.figureGroup = figureGroup; var geometryConcatenator = new OcclusionGeometryConcatenator(); //parent { var figure = figureGroup.Parent; var faceTransparencies = faceTransparenciesGroup.Parent; var refinementResult = figure.Geometry.AsTopology().Refine(0); var segment = geometryConcatenator.Add(refinementResult.Mesh, faceTransparencies); parentSegment = segment; var surrogates = figure.OcclusionBinding.Surrogates; surrogateSegments = surrogates.Select(geometryConcatenator.Add).ToList(); } //children for (int childIdx = 0; childIdx < figureGroup.Children.Length; ++childIdx) { var figure = figureGroup.Children[childIdx]; var faceTransparencies = faceTransparenciesGroup.Children[childIdx]; var refinementResult = figure.Geometry.AsTopology().Refine(0); var segment = geometryConcatenator.Add(refinementResult.Mesh, faceTransparencies); childSegments.Add(segment); var surrogates = figure.OcclusionBinding.Surrogates; if (surrogates.Count != 0) { // There's no technical reason this couldn't be implemented; I just haven't needed it yet. throw new NotImplementedException("occlusion surrogates aren't supported on child figures"); } } groupControlPositionsBufferManager = new StructuredBufferManager <Vector3>(device, geometryConcatenator.Mesh.ControlVertexCount); vertexRefiner = new BasicVertexRefiner(device, shaderCache, geometryConcatenator.Mesh.Stencils); refinedVertexInfosBufferManager = new InOutStructuredBufferManager <BasicRefinedVertexInfo>(device, vertexRefiner.RefinedVertexCount); occlusionCalculator = new GpuOcclusionCalculator(device, shaderCache, geometryConcatenator.Mesh.Topology, geometryConcatenator.FaceTransparencies, geometryConcatenator.FaceMasks, geometryConcatenator.VertexMasks); }