public static TAMPackGenerationConfiguration GenerateDiagramConfiguration(List <TAMTone> tones, List <TAMMipmapLevel> levels, float exclusionZoneMultiplier) { // for Exclusion zone values i use function computed from applying cubic regression on hand-picked values. Old version should be in git 6-14-2019 // Tone0 Level0 has x=0 // Tone0 LevelN has x=N // ToneM LevelN has x = M+N var exclusionZoneValues = new Dictionary <TAMTone, Dictionary <TAMMipmapLevel, float> >(); for (int toneIndex = 0; toneIndex < tones.Count; toneIndex++) { var oneToneDir = new Dictionary <TAMMipmapLevel, float>(); for (var levelIndex = 0; levelIndex < levels.Count; levelIndex++) { oneToneDir[levels[levelIndex]] = TAMPackGenerationConfiguration.CalculateExclusionZoneValue(exclusionZoneMultiplier * (toneIndex + levelIndex)); } exclusionZoneValues[tones[toneIndex]] = oneToneDir; } return(new TAMPackGenerationConfiguration() { PoissonTamImageDiagramGeneratorConfiguration = new PoissonTAMImageDiagramGeneratorConfiguration() { ExclusionZoneValues = exclusionZoneValues, GenerationCount = 60 } , StrokesGeneratorConfiguration = new StrokesGeneratorConfiguration() { StrokeLengthRange = new Vector2(0.25f, 0.4f), StrokeLengthJitterRange = new Vector2(0f, 0.1f), StrokeHeightRange = new Vector2(0.001f, 0.003f), StrokeHeightJitterRange = new Vector2(0.0000f, 0.0005f), MaxRotationJitter = Mathf.PI * 0.08f } , BlankImagePath = @"C:\mgr\PwMgrProject\precomputedResources\NPR\blank.png" , StrokeImagePath = @"C:\mgr\PwMgrProject\precomputedResources\NPR\Stroke1.png" , Margin = 0.25f , SmallestLevelSoleImageResolution = new IntVector2(256, 256) , RendererOneStepSize = new Vector2(100, 100) , Tones = tones , Levels = levels , StrokeHeightMultiplierForZeroLevel = 16 }); }
public TAMSoleImagesPack GenerateTamPack(TAMPackGenerationConfiguration configuration, bool generateDebugPlates, ComputeShaderContainerGameObject shaderContainerGameObject) { var tones = configuration.Tones; var levels = configuration.Levels; var tonesCount = tones.Count; var levelsCount = levels.Count; var templateGenerator = new TAMTemplateGenerator( new PoissonTAMImageDiagramGenerator( new TAMPoissonDiskSampler(), new StrokesGenerator(configuration.StrokesGeneratorConfiguration), configuration.PoissonTamImageDiagramGeneratorConfiguration) ); var template = templateGenerator.Generate(new TAMTemplateSpecification() { Tones = tones, MipmapLevels = levels }); var margin = configuration.Margin; var smallestLevelSoleImageResolution = configuration.SmallestLevelSoleImageResolution; var renderer = new TAMDeckRenderer( Image.FromFile(configuration.StrokeImagePath), Image.FromFile(configuration.BlankImagePath), new TAMDeckRendererConfiguration() { SoleImagesResolutionPerLevel = levels .Select((level, i) => new { level, i }) .ToDictionary(c => c.level, c => c.i) .ToDictionary(pair => pair.Key, pair => (smallestLevelSoleImageResolution * Mathf.Pow(2, pair.Value)).ToIntVector()), Margin = margin, StrokeHeightMultiplierPerLevel = levels .Select((level, i) => new { level, i }) .ToDictionary(c => c.level, c => c.i) .ToDictionary(pair => pair.Key, pair => configuration.StrokeHeightMultiplierForZeroLevel / Mathf.Pow(2, pair.Value)) }); var deck = renderer.Render(template); var wrapper = new TAMMarginsWrapper(new UTTextureRendererProxy(new TextureRendererService( new MultistepTextureRenderer(shaderContainerGameObject), new TextureRendererServiceConfiguration() { StepSize = configuration.RendererOneStepSize })), new TAMMarginsWrapperConfiguration() { Margin = margin, }); for (int toneIndex = 0; toneIndex < tonesCount; toneIndex++) { for (int levelIndex = 0; levelIndex < levelsCount; levelIndex++) { var image = deck.Columns[tones[toneIndex]][levels[levelIndex]]; var soleTexture = wrapper.WrapTexture(TAMUtils.ImageToTexture2D(image)); var strokesCount = template.Columns[tones[toneIndex]][levels[levelIndex]].Strokes.Count; if (generateDebugPlates) { CreateTexturedPlate(soleTexture, 11f * new Vector2(toneIndex, levelIndex), "Tone " + toneIndex + " Level " + levelIndex + " Count" + strokesCount); } } } var soleImagesPack = new TAMSoleImagesPack(deck.Columns.ToDictionary( c => c.Key, c => c.Value.ToDictionary( k => k.Key, k => wrapper.WrapTexture(TAMUtils.ImageToTexture2D(k.Value))))); return(soleImagesPack); }