public GpuShaper(Device device, ShaderCache shaderCache, FigureDefinition definition, ShaperParameters parameters) { this.device = device; this.withDeltasShader = shaderCache.GetComputeShader <GpuShaper>("figure/shaping/shader/Shaper-WithDeltas"); this.withoutDeltasShader = shaderCache.GetComputeShader <GpuShaper>("figure/shaping/shader/Shaper-WithoutDeltas"); this.vertexCount = parameters.InitialPositions.Length; this.morphChannelIndices = parameters.MorphChannelIndices; this.boneIndices = parameters.BoneIndices; this.occlusionSurrogates = OcclusionSurrogate.MakeAll(definition, parameters.OcclusionSurrogateParameters); this.initialPositionsView = BufferUtilities.ToStructuredBufferView(device, parameters.InitialPositions); this.deltaSegmentsView = BufferUtilities.ToStructuredBufferView(device, parameters.MorphDeltas.Segments); this.deltaElemsView = BufferUtilities.ToStructuredBufferView(device, parameters.MorphDeltas.Elems); this.morphWeightsBufferManager = new StructuredBufferManager <float>(device, parameters.MorphCount); if (parameters.BaseDeltaWeights != null) { this.baseDeltaWeightSegmentsView = BufferUtilities.ToStructuredBufferView(device, parameters.BaseDeltaWeights.Segments); this.baseDeltaWeightElemsView = BufferUtilities.ToStructuredBufferView(device, parameters.BaseDeltaWeights.Elems); } else { this.baseDeltaWeightSegmentsView = null; this.baseDeltaWeightElemsView = null; } this.boneWeightSegmentsView = BufferUtilities.ToStructuredBufferView(device, parameters.BoneWeights.Segments); this.boneWeightElemsView = BufferUtilities.ToStructuredBufferView(device, parameters.BoneWeights.Elems); this.boneTransformsBufferManager = new StructuredBufferManager <StagedSkinningTransform>(device, parameters.BoneCount); this.occlusionSurrogateMapView = BufferUtilities.ToStructuredBufferView(device, parameters.OcclusionSurrogateMap); this.occlusionSurrogateFacesView = BufferUtilities.ToStructuredBufferView(device, OcclusionSurrogateCommon.Mesh.Faces.ToArray()); this.occlusionSurrogateInfosBufferManager = new StructuredBufferManager <OcclusionSurrogate.Info>(device, parameters.OcclusionSurrogateParameters.Length); }
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); }
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); }
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(); }
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); }