예제 #1
0
        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
            });
        }
예제 #2
0
        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);
        }