public void Start()
        {
            var heightmapTextureSize = new IntVector2(3600, 3600);
            var rgbaMainTexture      = SavingFileManager.LoadPngTextureFromFile(_filePathsConfiguration.HeightmapFilePath,
                                                                                heightmapTextureSize.X, heightmapTextureSize.Y, TextureFormat.ARGB32, true, false);

            TerrainTextureFormatTransformator transformator =
                new TerrainTextureFormatTransformator(_gameInitializationFields.Retrive <CommonExecutorUTProxy>());
            var globalHeightTexture = transformator.EncodedHeightTextureToPlain(new TextureWithSize()
            {
                Size    = heightmapTextureSize,
                Texture = rgbaMainTexture
            });

            if (true)
            {
                _gameInitializationFields.SetField(new TerrainDetailAlignmentCalculator(240));

                TerrainDetailGenerator terrainDetailGenerator =
                    CreateTerrainDetailGenerator(
                        globalHeightTexture,
                        _gameInitializationFields.Retrive <UTTextureRendererProxy>(),
                        _gameInitializationFields.Retrive <CommonExecutorUTProxy>(),
                        _gameInitializationFields.Retrive <UnityThreadComputeShaderExecutorObject>(),
                        _gameInitializationFields.Retrive <ComputeShaderContainerGameObject>());

                var commonExecutorUtProxy = _gameInitializationFields.Retrive <CommonExecutorUTProxy>();

                TerrainDetailProvider terrainDetailProvider =
                    CreateTerrainDetailProvider(terrainDetailGenerator, commonExecutorUtProxy);


                var terrainDetailFileManager =
                    new TerrainDetailFileManager(_configuration.TerrainDetailCachePath, commonExecutorUtProxy);
                var terrainShapeDb = CreateTerrainShapeDb(terrainDetailProvider
                                                          , commonExecutorUtProxy
                                                          , _gameInitializationFields.Retrive <TerrainDetailAlignmentCalculator>()
                                                          , _configuration.TerrainShapeDbConfiguration.MergeTerrainDetail
                                                          , _configuration.TerrainShapeDbConfiguration.UseTextureSavingToDisk
                                                          , _configuration.TerrainShapeDbConfiguration.UseTextureLoadingFromDisk, terrainDetailFileManager);

                TerrainShapeDbProxy terrainShapeDbProxy = new TerrainShapeDbProxy(terrainShapeDb);
                var baseTerrainDetailProvider           = BaseTerrainDetailProvider.CreateFrom(terrainShapeDb);
                _gameInitializationFields.SetField(baseTerrainDetailProvider);
                terrainDetailGenerator.SetBaseTerrainDetailProvider(baseTerrainDetailProvider);

                _ultraUpdatableContainer.AddOtherThreadProxy(terrainShapeDbProxy);

                _gameInitializationFields.SetField(terrainShapeDbProxy);
            }
            else
            {
                ITerrainShapeDb terrainShapeDbProxy = new DebugSlopedTerrainShapeDb(
                    _gameInitializationFields.Retrive <UTTextureRendererProxy>()
                    );

                terrainShapeDbProxy = new RecordingTerrainShapeDb(terrainShapeDbProxy);
                _gameInitializationFields.SetField((RecordingTerrainShapeDb)terrainShapeDbProxy);
            }
        }
        public static TerrainShapeDb CreateTerrainShapeDb(TerrainDetailProvider terrainDetailProvider, CommonExecutorUTProxy commonExecutorUtProxy,
                                                          TerrainDetailAlignmentCalculator terrainDetailAlignmentCalculator, bool mergingEnabled, bool saveTexturesToFile, bool loadTexturesFromFile,
                                                          TerrainDetailFileManager fileManager)
        {
            var cachingConfiguration = new CachingConfiguration()
            {
                SaveAssetsToFile = saveTexturesToFile,
                UseFileCaching   = loadTexturesFromFile
            };

            Func <IAssetsCache <InternalTerrainDetailElementToken, TextureWithSize> > terrainCacheGenerator =
                () => new InMemoryAssetsCache <InternalTerrainDetailElementToken, TextureWithSize>(
                    CreateLevel2AssetsCache <InternalTerrainDetailElementToken, TextureWithSize>(
                        cachingConfiguration,
                        new InMemoryCacheConfiguration(),
                        new TextureWithSizeActionsPerformer(commonExecutorUtProxy),
                        new CachingTerrainDetailFileManager(fileManager)));

            var cachedTerrainDetailProvider = new CachedTerrainDetailProvider(
                terrainDetailProvider,
                terrainCacheGenerator, mergingEnabled);

            cachedTerrainDetailProvider.Initialize().Wait();
            var terrainShapeDb = new TerrainShapeDb(cachedTerrainDetailProvider, terrainDetailAlignmentCalculator);

            return(terrainShapeDb);
        }