コード例 #1
0
        private TerrainDetailGenerator CreateTerrainDetailGenerator(
            Texture mainTexture,
            UTTextureRendererProxy utTextureRendererProxy,
            CommonExecutorUTProxy commonExecutorUtProxy,
            UnityThreadComputeShaderExecutorObject computeShaderExecutorObject,
            ComputeShaderContainerGameObject containerGameObject)
        {
            var featureAppliers = new List <RankedTerrainFeatureApplier>();

            if (_configuration.EngraveTerrainFeatures)
            {
                featureAppliers.AddRange(FinalTerrainFeatureAppliers.CreateFeatureAppliers(
                                             utTextureRendererProxy, containerGameObject, commonExecutorUtProxy, computeShaderExecutorObject
                                             ));
            }
            if (_configuration.EngraveRoadsInTerrain)
            {
                featureAppliers.Add(FinalTerrainFeatureAppliers.CreateRoadEngravingApplier(CreateRoadEngravingFeatureApplier()));
            }

            TerrainDetailGeneratorConfiguration generatorConfiguration =
                _configuration.TerrainDetailGeneratorConfiguration;

            TextureWithCoords fullFundationData = new TextureWithCoords(new TextureWithSize()
            {
                Texture = mainTexture,
                Size    = new IntVector2(mainTexture.width, mainTexture.height)
            }, new MyRectangle(0, 0, 3601 * 24, 3601 * 24));

            TerrainDetailGenerator generator = new TerrainDetailGenerator(generatorConfiguration,
                                                                          utTextureRendererProxy, fullFundationData, featureAppliers, commonExecutorUtProxy);

            return(generator);
        }
コード例 #2
0
 public Grass2BakingBillboardClanGenerator(
     ComputeShaderContainerGameObject computeShaderContainer,
     UnityThreadComputeShaderExecutorObject shaderExecutorObject)
 {
     _computeShaderContainer = computeShaderContainer;
     _shaderExecutorObject   = shaderExecutorObject;
 }
コード例 #3
0
        public static TerrainDetailGenerator CreateTerrainDetailGenerator(
            Texture mainTexture, UTTextureRendererProxy utTextureRendererProxy,
            CommonExecutorUTProxy commonExecutorUtProxy,
            UnityThreadComputeShaderExecutorObject computeShaderExecutorObject,
            ComputeShaderContainerGameObject containerGameObject)
        {
            var featureAppliers =
                TerrainDetailProviderDebugUtils.CreateFeatureAppliers(utTextureRendererProxy, containerGameObject,
                                                                      commonExecutorUtProxy, computeShaderExecutorObject);

            TerrainDetailGeneratorConfiguration generatorConfiguration = new TerrainDetailGeneratorConfiguration()
            {
                TerrainDetailImageSideDisjointResolution = 240
            };
            TextureWithCoords fullFundationData = new TextureWithCoords(new TextureWithSize()
            {
                Texture = mainTexture,
                Size    = new IntVector2(mainTexture.width, mainTexture.height)
            }, new MyRectangle(0, 0, 3601 * 24, 3601 * 24));

            TerrainDetailGenerator generator =
                new TerrainDetailGenerator(generatorConfiguration, utTextureRendererProxy, fullFundationData,
                                           featureAppliers, commonExecutorUtProxy);

            return(generator);
        }
コード例 #4
0
 public WeldingExecutor(ComputeShaderContainerGameObject computeShaderContainer,
                        UnityThreadComputeShaderExecutorObject shaderExecutorObject, Texture weldTexture)
 {
     _computeShaderContainer = computeShaderContainer;
     _shaderExecutorObject   = shaderExecutorObject;
     _weldTexture            = weldTexture;
 }
コード例 #5
0
        public void Start(ComputeShaderContainerGameObject computeShaderContainer)
        {
            var commonExecutor       = new CommonExecutorUTProxy();
            var shaderExecutorObject = new UnityThreadComputeShaderExecutorObject();

            var updater =
                new DesignBodySpotUpdater(new DesignBodySpotChangeCalculator(computeShaderContainer,
                                                                             shaderExecutorObject, commonExecutor, HeightDenormalizer.Identity));

            _designBodySpotUpdaterProxy = new DesignBodySpotUpdaterProxy(updater);
            updater.SetChangesListener(new LambdaSpotPositionChangesListener(null, dict =>
            {
                foreach (var pair in dict)
                {
                    _grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value);
                }
            }));
            _designBodySpotUpdaterProxy.StartThreading(() => { });


            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBladeMesh(1);

            var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/Grass.Instanced"));

            instancingMaterial.enableInstancing = true;

            var commonUniforms = new UniformsPack();

            commonUniforms.SetUniform("_BendingStrength", 0.0f);
            commonUniforms.SetUniform("_WindDirection", Vector4.one);

            var instancingContainer = new GpuInstancingVegetationSubjectContainer(
                new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms),
                new GpuInstancingUniformsArrayTemplate(new List <GpuInstancingUniformTemplate>()
            {
                new GpuInstancingUniformTemplate("_Color", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_InitialBendingValue", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantBendingStiffness", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantDirection", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_RandSeed", GpuInstancingUniformType.Float),
            })
                );

            _globalGpuInstancingContainer = new GlobalGpuInstancingContainer();
            var bucketId = _globalGpuInstancingContainer.CreateBucket(instancingContainer);
            GrassGroupsContainer grassGroupsContainer =
                new GrassGroupsContainer(_globalGpuInstancingContainer, bucketId);

            IGrassPositionResolver grassPositionResolver = new SimpleRandomSamplerPositionResolver();

            GrassDetailInstancer grassDetailInstancer = new GrassDetailInstancer();

            _grassGroupsPlanter = new GrassGroupsPlanter(
                grassDetailInstancer, grassPositionResolver, grassGroupsContainer, _designBodySpotUpdaterProxy,
                new LegacyGrass2BladeAspectsGenerator(),
                GrassDebugUtils.TemplatesDictionary, Repositioner.Identity);
        }
コード例 #6
0
        public void Compute()
        {
            CommonExecutorUTProxy commonExecutor    = new CommonExecutorUTProxy();
            HabitatMapDbProxy     habitatMapDbProxy = _gameInitializationFields.Retrive <HabitatMapDbProxy>();

            ComputeShaderContainerGameObject computeShaderContainer =
                _gameInitializationFields.Retrive <ComputeShaderContainerGameObject>();
            UnityThreadComputeShaderExecutorObject shaderExecutorObject =
                _gameInitializationFields.Retrive <UnityThreadComputeShaderExecutorObject>();

            var templatesDict          = _vegetationConfiguration.FloraDomainCreationTemplates;
            var floraConfiguration     = _vegetationConfiguration.FloraConfiguration;
            var spatialDbConfiguration = _vegetationConfiguration.FloraDomainSpatialDbConfiguration;

            var dbsDict = new Dictionary <HabitatAndZoneType, ISpatialDb <FloraDomainIntensityArea> >();

            foreach (var pair in templatesDict)
            {
                IStoredPartsGenerator <FloraDomainIntensityArea> partsGenerator =
                    new FloraDomainIntensityGenerator(pair.Value, computeShaderContainer, shaderExecutorObject,
                                                      commonExecutor, 1f, floraConfiguration);
                var spatialDb =
                    new CacheingSpatialDb <FloraDomainIntensityArea>(
                        new SpatialDb <FloraDomainIntensityArea>(partsGenerator, spatialDbConfiguration),
                        spatialDbConfiguration);
                dbsDict[pair.Key] = spatialDb;
            }
            var floraDomainDb = new FloraDomainDbProxy(dbsDict);


            var biomeProvidersGenerators = _vegetationConfiguration.BiomeConfigurationsDict(floraDomainDb)
                                           .ToDictionary(c => c.Key, c => new BiomeProvidersFromHabitatGenerator(habitatMapDbProxy, c.Value));

            var genralPlacer = new GeneralMultiDistrictPlacer(
                _vegetationConfiguration.GeneralMultiDistrictPlacerConfiguration,
                _gameInitializationFields.Retrive <TerrainShapeDbProxy>(),
                commonExecutor,
                biomeProvidersGenerators);

            var database = genralPlacer.Generate(
                _vegetationConfiguration.GenerationArea,
                _vegetationConfiguration.RankDependentSpeciesCharacteristics(),
                _vegetationConfiguration.GenerationCenter);

            var vegetationOnRoadRemover = new VegetationOnRoadRemover(
                _gameInitializationFields.Retrive <RoadDatabaseProxy>(),
                _vegetationConfiguration.VegetationOnRoadRemoverConfiguration
                );

            var newDb = vegetationOnRoadRemover.RemoveCollidingTrees(database, _vegetationConfiguration.GenerationArea);

            //CreateDebugObjects(newDb.Subjects.ToDictionary(c => c.Key, c => c.Value.QueryAll()));


            VegetationDatabaseFileUtils.WriteToFileNonOverwrite(
                _pathsConfiguration.LoadingVegetationDatabaseDictionaryPath, newDb);
        }
コード例 #7
0
 public HabitatToGrassIntensityMapGenerator(ComputeShaderContainerGameObject computeShaderContainer,
                                            UnityThreadComputeShaderExecutorObject shaderExecutorObject, CommonExecutorUTProxy commonExecutor,
                                            HabitatToGrassIntensityMapGeneratorConfiguration configuration)
 {
     _computeShaderContainer = computeShaderContainer;
     _shaderExecutorObject   = shaderExecutorObject;
     _configuration          = configuration;
     _commonExecutor         = commonExecutor;
 }
コード例 #8
0
        public void Start(ComputeShaderContainerGameObject ComputeShaderContainer)
        {
            IGrassIntensityMapProvider grassIntensityMapProvider =
                GrassGroupsGrowerDebugObject.CreateDebugIntensityMapProvider();

            _planterUnderTest.Start(ComputeShaderContainer);

            GrassGroupsPlanter grassGroupsPlanter = _planterUnderTest.GrassGroupsPlanter;

            _grower = new GrassGroupsGrower(grassGroupsPlanter, grassIntensityMapProvider, new List <GrassType>()
            {
                GrassType.Debug1, GrassType.Debug2
            }, Repositioner.Identity);
        }
コード例 #9
0
        public void FillTerrainDetailsCache(ComputeShaderContainerGameObject computeShaderContainer)
        {
            TaskUtils.SetGlobalMultithreading(false);
            _gameInitializationFields.SetField(computeShaderContainer);

            InitializeTerrainDb(true);

            var db      = _gameInitializationFields.Retrive <ITerrainShapeDb>();
            var queries = RecordingTerrainShapeDb.LoadQueriesFromFile(@"C:\inz\allQueries.json");

            Debug.Log("AXXX + " + queries.Count);
            foreach (var aQuery in queries.Skip(3).Take(10))
            {
                var xx = db.Query(aQuery).Wait(1000);
            }
        }
コード例 #10
0
        public void Compute(ComputeShaderContainerGameObject computeShaderContainer)
        {
            TaskUtils.SetGlobalMultithreading(false);
            _gameInitializationFields.SetField(computeShaderContainer);

            var msw = new MyStopWatch();

            //var queries = RecordingTerrainShapeDb.LoadQueriesFromFile(@"C:\inz\allQueries.json");
            //Debug.Log("H8: " + StringUtils.ToString(queries.Select(c => c.QueryArea)));

            //msw.StartSegment("TerrainDbInitialization");
            //InitializeTerrainDb(true);

            //TestHeightNormalization();
            //return;

            msw.StartSegment("PathPrecomputation");
            var pathPrecomputation = new PathPrecomputation(_gameInitializationFields, _precomputationConfiguration,
                                                            _filePathsConfiguration);

            //pathPrecomputation.Compute();
            pathPrecomputation.Load();

            msw.StartSegment("HabitatMapDbPrecomputation");
            var habitatMapDbPrecomputation = new HabitatMapDbPrecomputation(_gameInitializationFields,
                                                                            _precomputationConfiguration, _filePathsConfiguration);

            habitatMapDbPrecomputation.Compute();
            habitatMapDbPrecomputation.Load();

            //msw.StartSegment("Ring1Precomputation");
            //var ring1Precomputation = new Ring1Precomputation(_gameInitializationFields, _precomputationConfiguration,
            //    _filePathsConfiguration);
            //ring1Precomputation.Compute();
            //ring1Precomputation.Load();

            //msw.StartSegment("VegetationDatabasePrecomputation");
            //var vegetationDatabasePrecomputation =
            //    new VegetationDatabasePrecomputation(_gameInitializationFields, _precomputationConfiguration, _filePathsConfiguration);
            //vegetationDatabasePrecomputation.Compute();

            //msw.StartSegment("Grass2billboardsPrecomputation");
            //var grass2BillboardsPrecomputation = new Grass2BillboardsPrecomputer(_gameInitializationFields, _filePathsConfiguration);
            ////grass2BillboardsPrecomputation.Compute();

            //Debug.Log("L8 Precomputation time: "+msw.CollectResults());
        }
コード例 #11
0
        public static ESurfacePatchProvider ConstructProvider(UltraUpdatableContainer updatableContainer, Dictionary <int, float> intensityPatternPixelsPerUnit,
                                                              ComputeShaderContainerGameObject shaderContainerGO, int mipmapLevelToExtract, Dictionary <int, float> plateStampPixelsPerUnit)
        {
            var ring2ShaderRepository         = Ring2PlateShaderRepository.Create();
            TextureConcieverUTProxy conciever = new TextureConcieverUTProxy();

            updatableContainer.Add(conciever);

            var ring2PatchesPainterUtProxy = new Ring2PatchesPainterUTProxy(
                new Ring2PatchesPainter(
                    new Ring2MultishaderMaterialRepository(ring2ShaderRepository, Ring2ShaderNames.ShaderNames)));

            updatableContainer.Add(ring2PatchesPainterUtProxy);

            UTRing2PlateStamperProxy stamperProxy = new UTRing2PlateStamperProxy(
                new Ring2PlateStamper(new Ring2PlateStamperConfiguration()
            {
                PlateStampPixelsPerUnit = plateStampPixelsPerUnit
            }, shaderContainerGO));

            updatableContainer.Add(stamperProxy);

            UTTextureRendererProxy textureRendererProxy = new UTTextureRendererProxy(new TextureRendererService(
                                                                                         new MultistepTextureRenderer(shaderContainerGO), new TextureRendererServiceConfiguration()
            {
                StepSize = new Vector2(500, 500)
            }));

            updatableContainer.Add(textureRendererProxy);

            CommonExecutorUTProxy commonExecutorUtProxy = new CommonExecutorUTProxy(); //todo

            updatableContainer.Add(commonExecutorUtProxy);

            Ring2PatchStamplingOverseerFinalizer patchStamperOverseerFinalizer =
                new Ring2PatchStamplingOverseerFinalizer(stamperProxy, textureRendererProxy, commonExecutorUtProxy);

            MipmapExtractor mipmapExtractor     = new MipmapExtractor(textureRendererProxy);
            var             patchesCreatorProxy = new GRing2PatchesCreatorProxy(CreateRing2PatchesCreator(updatableContainer, intensityPatternPixelsPerUnit));

            return(new ESurfacePatchProvider(patchesCreatorProxy, patchStamperOverseerFinalizer, commonExecutorUtProxy, mipmapExtractor, mipmapLevelToExtract));
        }
コード例 #12
0
        public TerrainShapeDbUnderTest(bool useTextureSavingToDisk  = false, bool useCornerMerging = false,
                                       string terrainDetailFilePath = "C:\\unityCache\\", bool useTextureLoadingFromDisk = false)
        {
            CommonExecutorUTProxy            commonExecutorUtProxy = new CommonExecutorUTProxy();
            ComputeShaderContainerGameObject containerGameObject   = GameObject.FindObjectOfType <ComputeShaderContainerGameObject>();

            var globalHeightTexture = CreateGlobalHeightTexture(commonExecutorUtProxy);

            UTTextureRendererProxy textureRendererProxy = new UTTextureRendererProxy(new TextureRendererService(
                                                                                         new MultistepTextureRenderer(containerGameObject), new TextureRendererServiceConfiguration()
            {
                StepSize = new Vector2(400, 400)
            }));

            UnityThreadComputeShaderExecutorObject computeShaderExecutorObject = new UnityThreadComputeShaderExecutorObject();
            var terrainDetailGenerator = Ring1DebugObjectV2.CreateTerrainDetailGenerator(
                globalHeightTexture, textureRendererProxy, commonExecutorUtProxy, computeShaderExecutorObject,
                containerGameObject);

            TerrainDetailCornerMerger merger = null;
            LateAssignFactory <BaseTerrainDetailProvider> detailProviderFactory = new LateAssignFactory <BaseTerrainDetailProvider>();

            if (useCornerMerging)
            {
                merger = new TerrainDetailCornerMerger(detailProviderFactory, new TerrainDetailAlignmentCalculator(240), textureRendererProxy, new TextureConcieverUTProxy(),
                                                       new CommonExecutorUTProxy(), new TerrainDetailCornerMergerConfiguration());
            }

            var terrainDetailProvider = Ring1DebugObjectV2.CreateTerrainDetailProvider(terrainDetailGenerator, merger);

            _shapeDb = FETerrainShapeDbInitialization.CreateTerrainShapeDb(terrainDetailProvider, commonExecutorUtProxy
                                                                           , new TerrainDetailAlignmentCalculator(240), useCornerMerging, useTextureSavingToDisk, useTextureLoadingFromDisk
                                                                           , new TerrainDetailFileManager(terrainDetailFilePath, commonExecutorUtProxy));

            var baseProvider = new FromTerrainDbBaseTerrainDetailProvider(_shapeDb);

            detailProviderFactory.Assign(baseProvider);
            terrainDetailGenerator.SetBaseTerrainDetailProvider(baseProvider);
        }
コード例 #13
0
        public void Start()
        {
            TaskUtils.SetGlobalMultithreading(false);
            ComputeShaderContainerGameObject containerGameObject  = GameObject.FindObjectOfType <ComputeShaderContainerGameObject>();
            UTTextureRendererProxy           textureRendererProxy = new UTTextureRendererProxy(new TextureRendererService(
                                                                                                   new MultistepTextureRenderer(containerGameObject), new TextureRendererServiceConfiguration()
            {
                StepSize = new Vector2(400, 400)
            }));
            var meshGeneratorUtProxy = new MeshGeneratorUTProxy(new MeshGeneratorService());


            eTerrainHeightPyramidFacades = new List <ETerrainHeightPyramidFacade>()
            {
                StartTerrainThings(meshGeneratorUtProxy, textureRendererProxy, containerGameObject,
                                   new List <HeightPyramidLevel>()
                {
                    HeightPyramidLevel.Top
                }),
                //StartTerrainThings(meshGeneratorUtProxy, textureRendererProxy, containerGameObject,
                //    new List<HeightPyramidLevel>() {HeightPyramidLevel.Top, HeightPyramidLevel.Mid, HeightPyramidLevel.Bottom})
            };
        }
コード例 #14
0
        private ETerrainHeightPyramidFacade StartTerrainThings(MeshGeneratorUTProxy meshGeneratorUtProxy, UTTextureRendererProxy textureRendererProxy,
                                                               ComputeShaderContainerGameObject containerGameObject, List <HeightPyramidLevel> startConfigurationHeightPyramidLevels)
        {
            var startConfiguration = ETerrainHeightPyramidFacadeStartConfiguration.DefaultConfiguration;

            //startConfiguration.HeightPyramidLevels = new List<HeightPyramidLevel>() {HeightPyramidLevel.Top};
            startConfiguration.HeightPyramidLevels = startConfigurationHeightPyramidLevels;

            ETerrainHeightBuffersManager buffersManager = new ETerrainHeightBuffersManager();
            var eTerrainHeightPyramidFacade             = new ETerrainHeightPyramidFacade(buffersManager, meshGeneratorUtProxy, textureRendererProxy, startConfiguration);

            var perLevelTemplates = eTerrainHeightPyramidFacade.GenerateLevelTemplates();
            var levels            = startConfiguration.HeightPyramidLevels;

            buffersManager.InitializeBuffers(levels.ToDictionary(c => c, c => new EPyramidShaderBuffersGeneratorPerRingInput()
            {
                FloorTextureResolution = startConfiguration.CommonConfiguration.FloorTextureSize.X,            //TODO i use only X, - works only for squares
                HeightMergeRanges      = perLevelTemplates[c].PerRingTemplates.ToDictionary(k => k.Key, k => k.Value.HeightMergeRange),
                CeilSliceWorldSize     = startConfiguration.PerLevelConfigurations[c].FloorTextureWorldSize.x, // TODO works only for square pyramids - i use width
                RingUvRanges           = startConfiguration.CommonConfiguration.RingsUvRange
            }), startConfiguration.CommonConfiguration.MaxLevelsCount, startConfiguration.CommonConfiguration.MaxRingsPerLevelCount);


            var configuration = new FEConfiguration(new FilePathsConfiguration());
            GlobalServicesProfileInfo servicesProfileInfo = new GlobalServicesProfileInfo();
            var ultraUpdatableContainer = new UltraUpdatableContainer(
                configuration.SchedulerConfiguration,
                servicesProfileInfo,
                configuration.UpdatableContainerConfiguration);
            var updatableContainer            = new UpdatableContainer();
            var intensityPatternPixelsPerUnit = new Dictionary <int, float>()
            {
                { 1, 1 }
            };
            int mipmapLevelToExtract    = 2;
            var plateStampPixelsPerUnit = new Dictionary <int, float>()
            {
                { 1, 3 }
            };
            var surfacePatchProvider = ESurfaceProviderInitializationHelper.ConstructProvider(
                ultraUpdatableContainer, intensityPatternPixelsPerUnit, containerGameObject, mipmapLevelToExtract, plateStampPixelsPerUnit);
            var surfaceTextureFormat = RenderTextureFormat.ARGB32;

            eTerrainHeightPyramidFacade.Start(perLevelTemplates,
                                              new Dictionary <EGroundTextureType, OneGroundTypeLevelTextureEntitiesGenerator>()
            {
                //{
                //    EGroundTextureType.SurfaceTexture, new OneGroundTypeLevelTextureEntitiesGenerator()
                //    {
                //        SegmentFillingListenerGeneratorFunc = (level) =>
                //        {
                //            var floorTexture = EGroundTextureGenerator.GenerateEmptyGroundTexture(startConfiguration.CommonConfiguration.FloorTextureSize,
                //                surfaceTextureFormat);
                //            var segmentsPlacer = new ESurfaceSegmentPlacer(textureRendererProxy, floorTexture
                //                , startConfiguration.CommonConfiguration.SlotMapSize, startConfiguration.CommonConfiguration.FloorTextureSize);
                //            var pyramidLevelManager = new GroundLevelTexturesManager(startConfiguration.CommonConfiguration.SlotMapSize);
                //            var segmentModificationManager = new SoleLevelGroundTextureSegmentModificationsManager(segmentsPlacer, pyramidLevelManager);

                //            return new SegmentFillingListenerWithFloorTexture()
                //            {
                //                FloorTexture = floorTexture,
                //                SegmentFillingListener =
                //                    new LambdaSegmentFillingListener(
                //                        (c) =>
                //                        {
                //                            var segmentLength = startConfiguration.PerLevelConfigurations[level].BiggestShapeObjectInGroupLength;
                //                            var sap = c.SegmentAlignedPosition;
                //                            MyRectangle surfaceWorldSpaceRectangle = new MyRectangle(sap.X * segmentLength, sap.Y * segmentLength,
                //                                segmentLength, segmentLength);
                //                            var texturesPack = surfacePatchProvider.ProvideSurfaceDetailAsync(surfaceWorldSpaceRectangle, new FlatLod(1, 1)).Result;
                //                            if (texturesPack != null)
                //                            {
                //                                var mainTexture = texturesPack.MainTexture;
                //                                segmentModificationManager.AddSegmentAsync(mainTexture, c.SegmentAlignedPosition);
                //                                GameObject.Destroy(mainTexture);
                //                            }

                //                            //}
                //                        },
                //                        (c) => { },
                //                        (c) => { })
                //            };

                //        },
                //    }
                //}
            }
                                              );

            Traveller.transform.position = new Vector3(startConfiguration.InitialTravellerPosition.x, 0, startConfiguration.InitialTravellerPosition.y);
            eTerrainHeightPyramidFacade.DisableLevelShapes(HeightPyramidLevel.Bottom);

            return(eTerrainHeightPyramidFacade);
        }
コード例 #15
0
ファイル: EPropDebugGO.cs プロジェクト: defacto2k15/PwMgr
        public void Start()
        {
            UnityEngine.Random.InitState(412);
            TaskUtils.SetGlobalMultithreading(false);
            UnityThreadComputeShaderExecutorObject shaderExecutorObject = new UnityThreadComputeShaderExecutorObject();
            ComputeShaderContainerGameObject       containerGameObject  = GameObject.FindObjectOfType <ComputeShaderContainerGameObject>();
            UTTextureRendererProxy textureRendererProxy = new UTTextureRendererProxy(new TextureRendererService(
                                                                                         new MultistepTextureRenderer(containerGameObject), new TextureRendererServiceConfiguration()
            {
                StepSize = new Vector2(400, 400)
            }));
            var meshGeneratorUtProxy = new MeshGeneratorUTProxy(new MeshGeneratorService());

            var startConfiguration = ETerrainHeightPyramidFacadeStartConfiguration.DefaultConfiguration;

            ETerrainHeightBuffersManager buffersManager = new ETerrainHeightBuffersManager();

            _eTerrainHeightPyramidFacade = new ETerrainHeightPyramidFacade(buffersManager, meshGeneratorUtProxy, textureRendererProxy, startConfiguration);

            var perLevelTemplates = _eTerrainHeightPyramidFacade.GenerateLevelTemplates();

            var levels = startConfiguration.PerLevelConfigurations.Keys;
            var ePyramidShaderBuffersGeneratorPerRingInputs = levels.ToDictionary(c => c, c => new EPyramidShaderBuffersGeneratorPerRingInput()
            {
                FloorTextureResolution = startConfiguration.CommonConfiguration.FloorTextureSize.X,            //TODO i use only X, - works only for squares
                HeightMergeRanges      = perLevelTemplates[c].PerRingTemplates.ToDictionary(k => k.Key, k => k.Value.HeightMergeRange),
                CeilSliceWorldSize     = startConfiguration.PerLevelConfigurations[c].FloorTextureWorldSize.x, // TODO works only for square pyramids - i use width
                RingUvRanges           = startConfiguration.CommonConfiguration.RingsUvRange
            });

            buffersManager.InitializeBuffers(ePyramidShaderBuffersGeneratorPerRingInputs, startConfiguration.CommonConfiguration.MaxLevelsCount, startConfiguration.CommonConfiguration.MaxRingsPerLevelCount);

            _eTerrainHeightPyramidFacade.Start(perLevelTemplates,
                                               new Dictionary <EGroundTextureType, OneGroundTypeLevelTextureEntitiesGenerator>()
            {
                //{
                //    EGroundTextureType.HeightMap, new OneGroundTypeLevelTextureEntitiesGenerator()
                //    {
                //        SegmentFillingListenerGeneratorFunc = (level) =>
                //        {
                //            var floorTexture =
                //                EGroundTextureGenerator.GenerateEmptyGroundTexture(startConfiguration.CommonConfiguration.FloorTextureSize,
                //                    startConfiguration.CommonConfiguration.HeightTextureFormat);
                //            var segmentsPlacer = new ESurfaceSegmentPlacer(textureRendererProxy, floorTexture
                //                , startConfiguration.CommonConfiguration.SlotMapSize, startConfiguration.CommonConfiguration.FloorTextureSize);
                //            var pyramidLevelManager = new GroundLevelTexturesManager(startConfiguration.CommonConfiguration.SlotMapSize);
                //            var segmentModificationManager = new SoleLevelGroundTextureSegmentModificationsManager(segmentsPlacer, pyramidLevelManager);
                //            return new SegmentFillingListenerWithFloorTexture()
                //            {
                //                FloorTexture = floorTexture,
                //                SegmentFillingListener = new LambdaSegmentFillingListener(
                //                    (c) =>
                //                    {
                //                        var segmentTexture = ETerrainIntegrationMultipleSegmentsDEO.CreateDummySegmentTexture(c, level);
                //                        segmentModificationManager.AddSegmentAsync(segmentTexture, c.SegmentAlignedPosition);
                //                    },
                //                    (c) => { },
                //                    (c) => { }

                //                )
                //            };

                //        },
                //    }
                //}
            }
                                               );
            //_eTerrainHeightPyramidFacade.DisableShapes();
            _eTerrainHeightPyramidFacade.DisableLevelShapes(HeightPyramidLevel.Bottom);

            Traveller.transform.position = new Vector3(startConfiguration.InitialTravellerPosition.x, 0, startConfiguration.InitialTravellerPosition.y);

            var ePropLocationConfiguration = new EPropElevationConfiguration();
            EPropConstantPyramidParameters ePropConstantPyramidParameters = new EPropConstantPyramidParameters()
            {
                LevelsCount        = startConfiguration.HeightPyramidLevels.Count,
                RingsPerLevelCount = startConfiguration.CommonConfiguration.MaxRingsPerLevelCount, //TODO parametrize
                HeightScale        = startConfiguration.CommonConfiguration.YScale
            };

            _elevationManager = new EPropElevationManager(new CommonExecutorUTProxy(), shaderExecutorObject, ePropLocationConfiguration, ePropConstantPyramidParameters);
            var heightFloorTextureArray = _eTerrainHeightPyramidFacade.FloorTextureArrays.Where(c => c.TextureType == EGroundTextureType.HeightMap).Select(c => c.Texture).First();
            var initializedBuffers      = _elevationManager.Initialize(buffersManager.PyramidPerFrameParametersBuffer, buffersManager.EPyramidConfigurationBuffer,
                                                                       heightFloorTextureArray);
            var ePropLocaleBuffer = initializedBuffers.EPropLocaleBuffer;
            var ePropIdsBuffer    = initializedBuffers.EPropIdsBuffer;

            _dummyObjectsDisplayer = new EPropDummyObjectsDisplayer(ePropLocationConfiguration.ScopeLength, ePropLocaleBuffer, ePropIdsBuffer, FindObjectOfType <BufferReloaderRootGO>());
            _dummyObjectsDisplayer.Start();

            _dummyObjectsInstancingDisplayer = new EPropDummyObjectsInstancingDisplayer(DebugMesh, DebugMeshMaterial);
            _dummyObjectsInstancingDisplayer.Start();
            _dummyObjectsInstancingDisplayer.SetLocaleBuffers(ePropLocaleBuffer, ePropIdsBuffer, ePropLocationConfiguration.ScopeLength);

            _sectorAreasDisplayer = new EPropDebugSectorAreasDisplayer();
            _sectorAreasDisplayer.Start();

            _mergeRingsDisplayer = new EPropDebugMergeRingsDisplayer();
            _mergeRingsDisplayer.Start();
            var levelWorldSizes = startConfiguration.PerLevelConfigurations.ToDictionary(c => c.Key, c => c.Value.FloorTextureWorldSize);
            var ringMergeRanges = perLevelTemplates.ToDictionary(c => c.Key,
                                                                 c => c.Value.PerRingTemplates.ToDictionary(k => k.Key, k => k.Value.HeightMergeRange));

            _ePropHotAreaSelector = new EPropHotAreaSelector(levelWorldSizes, ringMergeRanges);

            _elevationManager.DebugInitializeSectors(new MyRectangle(-200, -200, 400, 400));
        }
コード例 #16
0
        public static UltraUpdatableContainer InitializeFinalElements(FEConfiguration configuration, ComputeShaderContainerGameObject containerGameObject,
                                                                      GameInitializationFields gameInitializationFields, Dictionary <int, Ring2RegionsDbGeneratorConfiguration> ring2RegionsDatabasesConfiguration = null
                                                                      , bool initializeLegacyDesignBodySpotUpdater = false)
        {
            TaskUtils.SetGlobalMultithreading(configuration.Multithreading);
            return(TaskUtils.ExecuteFunctionWithOverridenMultithreading(true, () =>
            {
                var servicesProfileInfo = new GlobalServicesProfileInfo();
                gameInitializationFields.SetField(servicesProfileInfo);
                var ultraUpdatableContainer = new UltraUpdatableContainer(
                    configuration.SchedulerConfiguration,
                    servicesProfileInfo,
                    configuration.UpdatableContainerConfiguration);

                configuration.TerrainShapeDbConfiguration.UseTextureSavingToDisk = true;

                gameInitializationFields.SetField(containerGameObject);
                gameInitializationFields.SetField(configuration.Repositioner);
                gameInitializationFields.SetField(configuration.HeightDenormalizer);

                var initializingHelper =
                    new FEInitializingHelper(gameInitializationFields, ultraUpdatableContainer, configuration);
                initializingHelper.InitializeUTService(new TextureConcieverUTProxy());
                initializingHelper.InitializeUTService(new UnityThreadComputeShaderExecutorObject());
                initializingHelper.InitializeUTService(new CommonExecutorUTProxy());
                initializingHelper.CreatePathProximityTextureDb();

                if (initializeLegacyDesignBodySpotUpdater)
                {
                    initializingHelper.InitializeDesignBodySpotUpdater();
                }

                initializingHelper.InitializeUTRendererProxy();
                initializingHelper.InitializeUTService(new MeshGeneratorUTProxy(new MeshGeneratorService()));
                if (ring2RegionsDatabasesConfiguration != null)
                {
                    initializingHelper.InitializeComplexRing2RegionsDatabase(ring2RegionsDatabasesConfiguration);
                }
                else
                {
                    initializingHelper.InitializeMonoliticRing2RegionsDatabase();
                }

                //var finalTerrainInitialization = new FinalTerrainInitialization(_ultraUpdatableContainer, _gameInitializationFields, _configuration, FeGRingConfiguration);
                //finalTerrainInitialization.Start();

                initializingHelper.InitializeGlobalInstancingContainer();
                //var finalVegetation = new FinalVegetation(_gameInitializationFields, _ultraUpdatableContainer, VegetationConfiguration);
                //finalVegetation.Start();
                return ultraUpdatableContainer;
            }));
        }
コード例 #17
0
ファイル: TAMPackGenerator.cs プロジェクト: defacto2k15/PwMgr
        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);
        }
コード例 #18
0
        public void Start(ComputeShaderContainerGameObject computeShaderContainer)
        {
            var commonExecutor       = new CommonExecutorUTProxy();
            var shaderExecutorObject = new UnityThreadComputeShaderExecutorObject();

            var updater =
                new DesignBodySpotUpdater(new DesignBodySpotChangeCalculator(computeShaderContainer,
                                                                             shaderExecutorObject, commonExecutor, HeightDenormalizer.Identity));

            _designBodySpotUpdaterProxy = new DesignBodySpotUpdaterProxy(updater);
            updater.SetChangesListener(new LambdaSpotPositionChangesListener(null, dict =>
            {
                foreach (var pair in dict)
                {
                    _grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value);
                }
            }));
            _designBodySpotUpdaterProxy.StartThreading(() => { });


            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBillboardMesh(0, 1);

            var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/GrassBushBillboard.Instanced"));

            instancingMaterial.enableInstancing = true;

            /// CLAN

            var billboardsFileManger = new Grass2BillboardClanFilesManager();
            var clan        = billboardsFileManger.Load(@"C:\inz\billboards\", new IntVector2(256, 256));
            var singleToDuo = new Grass2BakingBillboardClanGenerator(computeShaderContainer, shaderExecutorObject);
            var bakedClan   = singleToDuo.GenerateBakedAsync(clan).Result;
            ///


            var commonUniforms = new UniformsPack();

            commonUniforms.SetUniform("_BendingStrength", 0.0f);
            commonUniforms.SetUniform("_WindDirection", Vector4.one);

            commonUniforms.SetTexture("_DetailTex", bakedClan.DetailTextureArray);
            commonUniforms.SetTexture("_BladeSeedTex", bakedClan.BladeSeedTextureArray);

            var instancingContainer = new GpuInstancingVegetationSubjectContainer(
                new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms),
                new GpuInstancingUniformsArrayTemplate(new List <GpuInstancingUniformTemplate>()
            {
                new GpuInstancingUniformTemplate("_Color", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_InitialBendingValue", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantBendingStiffness", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantDirection", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_RandSeed", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_ArrayTextureIndex", GpuInstancingUniformType.Float),
            })
                );

            _globalGpuInstancingContainer = new GlobalGpuInstancingContainer();
            var bucketId = _globalGpuInstancingContainer.CreateBucket(instancingContainer);
            GrassGroupsContainer grassGroupsContainer =
                new GrassGroupsContainer(_globalGpuInstancingContainer, bucketId);

            IGrassPositionResolver grassPositionResolver =
                new PoissonDiskSamplerPositionResolver(new MyRange(1.5f * 0.4f * 10, 10 * 2 * 1.3f));
            //IGrassPositionResolver grassPositionResolver = new SimpleRandomSamplerPositionResolver();

            GrassDetailInstancer grassDetailInstancer = new GrassDetailInstancer();


            _grassGroupsPlanter = new GrassGroupsPlanter(
                grassDetailInstancer, grassPositionResolver, grassGroupsContainer, _designBodySpotUpdaterProxy,
                new Grass2BushAspectsGenerator(bakedClan), //todo!
                GrassDebugUtils.BushTemplates, Repositioner.Identity);
        }
コード例 #19
0
        public static List <RankedTerrainFeatureApplier> CreateFeatureAppliers(
            UTTextureRendererProxy utTextureRendererProxy,
            ComputeShaderContainerGameObject computeShaderContainerGameObject,
            CommonExecutorUTProxy commonExecutor,
            UnityThreadComputeShaderExecutorObject threadComputeShaderExecutorObject)
        {
            var toReturn = new List <RankedTerrainFeatureApplier>()
            {
                new RankedTerrainFeatureApplier()
                {
                    Rank    = 1,
                    Applier = new RandomNoiseTerrainFeatureApplier(utTextureRendererProxy, commonExecutor,
                                                                   new Dictionary <TerrainCardinalResolution, RandomNoiseTerrainFeatureApplierConfiguration>
                    {
                        {
                            TerrainCardinalResolution.MIN_RESOLUTION,
                            new RandomNoiseTerrainFeatureApplierConfiguration()
                            {
                                DetailResolutionMultiplier = 1,
                                NoiseStrengthMultiplier    = 1
                            }
                        },
                        {
                            TerrainCardinalResolution.MID_RESOLUTION,
                            new RandomNoiseTerrainFeatureApplierConfiguration()
                            {
                                DetailResolutionMultiplier = 8,
                                NoiseStrengthMultiplier    = 0.45f
                            }
                        },
                        {
                            TerrainCardinalResolution.MAX_RESOLUTION,
                            new RandomNoiseTerrainFeatureApplierConfiguration()
                            {
                                DetailResolutionMultiplier = 8 * 8,
                                NoiseStrengthMultiplier    = 4.7f * 0.45f / 9f  //todo CHANGE IT !!
                            }
                        },
                    }),
                    AvalibleResolutions = new List <TerrainCardinalResolution>()
                    {
                        TerrainCardinalResolution.MIN_RESOLUTION,
                        TerrainCardinalResolution.MID_RESOLUTION,
                        TerrainCardinalResolution.MAX_RESOLUTION,
                    }
                },
                new RankedTerrainFeatureApplier()
                {
                    Rank    = 2,
                    Applier = new DiamondSquareTerrainFeatureApplier(
                        new RandomProviderGenerator(123), commonExecutor,
                        utTextureRendererProxy,
                        new Dictionary <TerrainCardinalResolution, DiamondSquareTerrainFeatureApplierConfiguration>
                    {
                        {
                            TerrainCardinalResolution.MIN_RESOLUTION,
                            new DiamondSquareTerrainFeatureApplierConfiguration
                            {
                                DiamondSquareWorkingArrayLength = 32,
                                DiamondSquareWeight             = 0.012f
                            }
                        },
                        {
                            TerrainCardinalResolution.MID_RESOLUTION,
                            new DiamondSquareTerrainFeatureApplierConfiguration
                            {
                                DiamondSquareWorkingArrayLength = 32,
                                DiamondSquareWeight             = 0.0025f * 1.3f
                            }
                        },
                        {
                            TerrainCardinalResolution.MAX_RESOLUTION,
                            new DiamondSquareTerrainFeatureApplierConfiguration
                            {
                                DiamondSquareWorkingArrayLength = 32,
                                DiamondSquareWeight             = 0.0003f
                            }
                        },
                    }),
                    AvalibleResolutions = new List <TerrainCardinalResolution>()
                    {
                        TerrainCardinalResolution.MIN_RESOLUTION,
                        TerrainCardinalResolution.MID_RESOLUTION,
                        TerrainCardinalResolution.MAX_RESOLUTION,
                    }
                },
                new RankedTerrainFeatureApplier()
                {
                    Rank    = 3,
                    Applier = new ThermalErosionTerrainFeatureApplier(computeShaderContainerGameObject,
                                                                      threadComputeShaderExecutorObject, commonExecutor,
                                                                      new Dictionary <TerrainCardinalResolution, ThermalErosionTerrainFeatureApplierConfiguration>
                    {
                        {
                            TerrainCardinalResolution.MIN_RESOLUTION,
                            new ThermalErosionTerrainFeatureApplierConfiguration
                            {
                            }
                        },
                        {
                            TerrainCardinalResolution.MID_RESOLUTION,
                            new ThermalErosionTerrainFeatureApplierConfiguration
                            {
                                TParam = 0.001f / 2.3f,
                                CParam = 0.06f
                            }
                        },
                    }),
                    AvalibleResolutions = new List <TerrainCardinalResolution>()
                    {
                        TerrainCardinalResolution.MIN_RESOLUTION,
                        TerrainCardinalResolution.MID_RESOLUTION
                    }
                },
                new RankedTerrainFeatureApplier()
                {
                    Rank    = 4,
                    Applier = new HydraulicErosionTerrainFeatureApplier(computeShaderContainerGameObject,
                                                                        threadComputeShaderExecutorObject,
                                                                        new Dictionary <TerrainCardinalResolution, HydraulicEroderConfiguration>()
                    {
                        {
                            TerrainCardinalResolution.MIN_RESOLUTION, new HydraulicEroderConfiguration()
                            {
                                StepCount = 20,
                                kr_ConstantWaterAddition  = 0.000002f,    // 0.0001f,
                                ks_GroundToSedimentFactor = 1f,
                                ke_WaterEvaporationFactor = 0.05f,
                                kc_MaxSedimentationFactor = 0.8f,
                            }
                        },
                        {
                            TerrainCardinalResolution.MID_RESOLUTION, new HydraulicEroderConfiguration()
                            {
                                StepCount = 20,
                                kr_ConstantWaterAddition  = 0.000002f,    // 0.0001f,
                                ks_GroundToSedimentFactor = 1f,
                                ke_WaterEvaporationFactor = 0.05f,
                                kc_MaxSedimentationFactor = 0.8f / 2f,
                            }
                        },
                        {
                            TerrainCardinalResolution.MAX_RESOLUTION, new HydraulicEroderConfiguration()
                            {
                                StepCount = 20,
                                kr_ConstantWaterAddition  = 0.0000035f,    // 0.0001f,
                                ks_GroundToSedimentFactor = 1f,
                                ke_WaterEvaporationFactor = 0.05f,
                                kc_MaxSedimentationFactor = 0.8f / 4f,
                            }
                        }
                    }),
                    AvalibleResolutions = new List <TerrainCardinalResolution>()
                    {
                        TerrainCardinalResolution.MIN_RESOLUTION,
                        TerrainCardinalResolution.MID_RESOLUTION,
                        TerrainCardinalResolution.MAX_RESOLUTION,
                    }
                },
                new RankedTerrainFeatureApplier()
                {
                    Rank    = 5,
                    Applier = new TweakedThermalErosionTerrainFeatureApplier(computeShaderContainerGameObject,
                                                                             threadComputeShaderExecutorObject,
                                                                             new Dictionary <TerrainCardinalResolution,
                                                                                             TweakedThermalErosionTerrainFeatureApplierConfiguration>
                    {
                        {
                            TerrainCardinalResolution.MIN_RESOLUTION,
                            new TweakedThermalErosionTerrainFeatureApplierConfiguration()
                            {
                            }
                        },
                        {
                            TerrainCardinalResolution.MID_RESOLUTION,
                            new TweakedThermalErosionTerrainFeatureApplierConfiguration()
                            {
                                TParam = 0.001f,
                                CParam = 0.008f
                            }
                        },
                        {
                            TerrainCardinalResolution.MAX_RESOLUTION,
                            new TweakedThermalErosionTerrainFeatureApplierConfiguration()
                            {
                                TParam = 0.001f,
                                CParam = 0.008f
                            }
                        },
                    }),
                    AvalibleResolutions = new List <TerrainCardinalResolution>()
                    {
                        TerrainCardinalResolution.MIN_RESOLUTION,
                        TerrainCardinalResolution.MID_RESOLUTION,
                        TerrainCardinalResolution.MAX_RESOLUTION,
                    }
                },
            };

            return(toReturn);
        }
コード例 #20
0
        public TamIdSoleImagesPack GenerateTamPack(TamIdPackGenerationConfiguration configuration, bool generateDebugPlates, ComputeShaderContainerGameObject shaderContainerGameObject)
        {
            var tones             = configuration.Tones;
            var levels            = configuration.Levels;
            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;

            Debug.Log("XXXy: " + configuration.StrokeImagePath);
            var a1 = Image.FromFile(configuration.StrokeImagePath);
            var a2 =
                Image.FromFile(configuration.BlankImagePath);
            var renderer = new TamIdDeckRenderer(
                Image.FromFile(configuration.StrokeImagePath),
                Image.FromFile(configuration.BlankImagePath),
                new TAMDeckRendererConfiguration()
            {
                UseSmoothAlpha = configuration.UseSmoothAlpha,
                UseDithering   = configuration.UseDithering,
                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))
            }, configuration.LayersCount);
            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,
            });

            var soleImagesPack = new TamIdSoleImagesPack(deck.Columns.ToDictionary(
                                                             c => c.Key,
                                                             c => c.Value.ToDictionary(
                                                                 k => k.Key,
                                                                 k =>
            {
                var x1 = k.Value.Select(r => wrapper.WrapTexture(TAMUtils.ImageToTexture2D(r))).ToList();
                return(x1);
            })));

            deck.DisposeImages();

            return(soleImagesPack);
        }