public void Start()
        {
            TaskUtils.SetGlobalMultithreading(false);
            var shaderContainerGO = FindObjectOfType <ComputeShaderContainerGameObject>();

            var configuration = new FEConfiguration(new FilePathsConfiguration());
            GlobalServicesProfileInfo servicesProfileInfo = new GlobalServicesProfileInfo();
            var ultraUpdatableContainer = new UltraUpdatableContainer(
                configuration.SchedulerConfiguration,
                servicesProfileInfo,
                configuration.UpdatableContainerConfiguration);
            Dictionary <int, float> intensityPatternPixelsPerUnit = new Dictionary <int, float>()
            {
                { 1, 1 }
            };
            int mipmapLevelToExtract = 2;
            Dictionary <int, float> plateStampPixelsPerUnit = new Dictionary <int, float>()
            {
                { 1, 5 }
            };

            _updatableContainer = new UltraUpdatableContainer(new MyUtSchedulerConfiguration(), new GlobalServicesProfileInfo(), new UltraUpdatableContainerConfiguration());
            _provider           = ESurfaceProviderInitializationHelper.ConstructProvider(
                _updatableContainer, intensityPatternPixelsPerUnit, shaderContainerGO, mipmapLevelToExtract, plateStampPixelsPerUnit);

            _patchesCreatorProxy = new GRing2PatchesCreatorProxy(ESurfaceProviderInitializationHelper.CreateRing2PatchesCreator(_updatableContainer, intensityPatternPixelsPerUnit));

            RegeneratePatch();
        }
 public FEInitializingHelper(GameInitializationFields gameInitializationFields,
                             UltraUpdatableContainer updatableContainer, FEConfiguration configuration)
 {
     _gameInitializationFields = gameInitializationFields;
     _updatableContainer       = updatableContainer;
     _configuration            = configuration;
 }
        public static GRing2PatchesCreator CreateRing2PatchesCreator(UltraUpdatableContainer updatableContainer, Dictionary <int, float> intensityPatternPixelsPerUnit)
        {
            TextureConcieverUTProxy conciever = new TextureConcieverUTProxy();

            updatableContainer.Add(conciever);

            Ring2RandomFieldFigureGenerator figureGenerator = new Ring2RandomFieldFigureGenerator(new TextureRenderer(),
                                                                                                  new Ring2RandomFieldFigureGeneratorConfiguration()
            {
                PixelsPerUnit = new Vector2(1, 1)
            });
            var utFigureGenerator = new RandomFieldFigureGeneratorUTProxy(figureGenerator);

            updatableContainer.Add(utFigureGenerator);

            var randomFieldFigureRepository = new Ring2RandomFieldFigureRepository(utFigureGenerator,
                                                                                   new Ring2RandomFieldFigureRepositoryConfiguration(2, new Vector2(20, 20)));

            Quadtree <Ring2Region> regionsTree = Ring2TestUtils.CreateRegionsTreeWithPath3(randomFieldFigureRepository);

            return(new GRing2PatchesCreator(
                       new MonoliticRing2RegionsDatabase(regionsTree),
                       new GRing2RegionsToPatchTemplateConventer(),
                       new Ring2PatchTemplateCombiner(),
                       new Ring2PatchCreator(),
                       new Ring2IntensityPatternProvider(conciever),
                       new GRing2Deviser(),
                       new Ring2PatchesOverseerConfiguration()
            {
                IntensityPatternPixelsPerUnit = intensityPatternPixelsPerUnit
            }
                       ));
        }
Exemple #4
0
        private void InitializeTerrainDb(bool useTerrainDetailFileCache = false)
        {
            var ultraUpdatableContainer = new UltraUpdatableContainer(new MyUtSchedulerConfiguration(),
                                                                      new GlobalServicesProfileInfo(), new UltraUpdatableContainerConfiguration());

            var feConfiguration      = new FEConfiguration(new FilePathsConfiguration());
            var feGRingConfiguration = new FeGRingConfiguration();

            feGRingConfiguration.FeConfiguration = feConfiguration;

            feConfiguration.TerrainShapeDbConfiguration.UseTextureSavingToDisk    = useTerrainDetailFileCache;
            feConfiguration.TerrainShapeDbConfiguration.UseTextureLoadingFromDisk = useTerrainDetailFileCache;
            feConfiguration.EngraveRoadsInTerrain = false;

            TaskUtils.SetGlobalMultithreading(feConfiguration.Multithreading);
            TaskUtils.SetMultithreadingOverride(true);

            _gameInitializationFields.SetField(feConfiguration.Repositioner);
            _gameInitializationFields.SetField(feConfiguration.HeightDenormalizer);

            var initializingHelper =
                new FEInitializingHelper(_gameInitializationFields, ultraUpdatableContainer, feConfiguration);

            initializingHelper.InitializeUTService(new TextureConcieverUTProxy());
            initializingHelper.InitializeUTService(new UnityThreadComputeShaderExecutorObject());
            initializingHelper.InitializeUTService(new CommonExecutorUTProxy());

            initializingHelper.InitializeUTRendererProxy();


            var finalTerrainShapeDb = new FETerrainShapeDbInitialization(ultraUpdatableContainer,
                                                                         _gameInitializationFields, feConfiguration, _filePathsConfiguration);

            finalTerrainShapeDb.Start();
        }
 public FinalTerrainInitialization(UltraUpdatableContainer ultraUpdatableContainer,
                                   GameInitializationFields gameInitializationFields, FEConfiguration configuration, FeGRingConfiguration gRingConfiguration)
 {
     _ultraUpdatableContainer  = ultraUpdatableContainer;
     _gameInitializationFields = gameInitializationFields;
     _configuration            = configuration;
     _gRingConfiguration       = gRingConfiguration;
 }
 public FETerrainShapeDbInitialization(UltraUpdatableContainer ultraUpdatableContainer,
                                       GameInitializationFields gameInitializationFields, FEConfiguration configuration,
                                       FilePathsConfiguration filePathsConfiguration)
 {
     _ultraUpdatableContainer  = ultraUpdatableContainer;
     _gameInitializationFields = gameInitializationFields;
     _configuration            = configuration;
     _filePathsConfiguration   = filePathsConfiguration;
 }
Exemple #7
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;
            }));
        }
Exemple #8
0
        public FinalVegetation(GameInitializationFields initializationFields,
                               UltraUpdatableContainer ultraUpdatableContainer, FinalVegetationConfiguration veConfiguration, UniformsAndComputeBuffersPack materialCommonPack = null)
        {
            this._initializationFields    = initializationFields;
            this._ultraUpdatableContainer = ultraUpdatableContainer;
            _veConfiguration = veConfiguration;

            if (materialCommonPack == null)
            {
                materialCommonPack = new UniformsAndComputeBuffersPack(new UniformsPack(), new ComputeBuffersPack());
            }
            _materialCommonPack = materialCommonPack;
        }
        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));
        }
Exemple #10
0
        public void Start()
        {
            var msw = new MyStopWatch();

            msw.StartSegment("Start");
            TaskUtils.ExecuteActionWithOverridenMultithreading(true, () =>
            {
                _feConfiguration = new FEConfiguration(new FilePathsConfiguration())
                {
                    Multithreading = Multithreading
                };
                _feConfiguration.EngraveTerrainFeatures = true;
                _feConfiguration.EngraveRoadsInTerrain  = true;

                _feConfiguration.TerrainShapeDbConfiguration.UseTextureLoadingFromDisk = true;
                _feConfiguration.TerrainShapeDbConfiguration.UseTextureSavingToDisk    = false;
                _feConfiguration.TerrainShapeDbConfiguration.MergeTerrainDetail        = true;

                var containerGameObject = GameObject.FindObjectOfType <ComputeShaderContainerGameObject>();
                VegetationConfiguration.FeConfiguration = _feConfiguration;

                _heightmapListenersContainer = new HeightmapSegmentFillingListenersContainer();
                _gameInitializationFields    = new GameInitializationFields();
                _updaterUntilException       = new UpdaterUntilException();
                _movementCustodian           = new TravellerMovementCustodian(Traveller);
                _gameInitializationFields.SetField(_movementCustodian);


                _ultraUpdatableContainer = ETerrainTestUtils.InitializeFinalElements(_feConfiguration, containerGameObject, _gameInitializationFields, initializeLegacyDesignBodySpotUpdater: false);

                var startConfiguration = ETerrainHeightPyramidFacadeStartConfiguration.DefaultConfiguration;
                var initializingHelper = InitializeETerrain(startConfiguration);
                initializingHelper.InitializeUTService(new UnityThreadComputeShaderExecutorObject());
                InitializeUI(startConfiguration);

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

            Debug.Log("Init time " + msw.CollectResults());
            _initializationWasSuccessfull = true;
        }
Exemple #11
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);
        }
Exemple #12
0
        // Use this for initialization
        void Start()
        {
            _configuration = new FEConfiguration(new FilePathsConfiguration())
            {
                Multithreading = UseMultithreading
            };
            _configuration.TerrainShapeDbConfiguration = TerrainShapeDbConfiguration;
            FeGRingConfiguration.FeConfiguration       = _configuration;
            VegetationConfiguration.FeConfiguration    = _configuration;

            TaskUtils.SetGlobalMultithreading(_configuration.Multithreading);
            TaskUtils.ExecuteActionWithOverridenMultithreading(true, () =>
            {
                MyProfiler.BeginSample("Sample1");
                msw.StartSegment("Game initialization");

                GlobalServicesProfileInfo servicesProfileInfo = new GlobalServicesProfileInfo();
                if (GraphicsOverlay != null)
                {
                    GraphicsOverlay.ServicesProfileInfo = servicesProfileInfo;
                }

                _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(_configuration.UseMultistepComputeShaderExecution));
                initializingHelper.InitializeUTService(new CommonExecutorUTProxy());
                initializingHelper.CreatePathProximityTextureDb();

                SetInitialCameraPosition();

                initializingHelper.InitializeDesignBodySpotUpdater();
                initializingHelper.InitializeUTRendererProxy();
                initializingHelper.InitializeUTService(new MeshGeneratorUTProxy(new MeshGeneratorService()));
                initializingHelper.InitializeMonoliticRing2RegionsDatabase();

                var finalSurfacePathInitialization =
                    new Ring2PatchInitializer(_gameInitializationFields, _ultraUpdatableContainer, new Ring2PatchInitializerConfiguration(_configuration));
                finalSurfacePathInitialization.Start();

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

                initializingHelper.InitializeGlobalInstancingContainer();
                var finalVegetation = new FinalVegetation(_gameInitializationFields, _ultraUpdatableContainer, VegetationConfiguration);
                finalVegetation.Start();
            });

            MyProfiler.EndSample();
        }
Exemple #13
0
 public Ring2PatchInitializer(GameInitializationFields gameInitializationFields, UltraUpdatableContainer ultraUpdatableContainer, Ring2PatchInitializerConfiguration ring2InitializerConfiguration)
 {
     _gameInitializationFields      = gameInitializationFields;
     _ultraUpdatableContainer       = ultraUpdatableContainer;
     _ring2InitializerConfiguration = ring2InitializerConfiguration;
 }
Exemple #14
0
        public static OneGroundTypeLevelTextureEntitiesGenerator CreateHeightTextureEntitiesGenerator(
            ETerrainHeightPyramidFacadeStartConfiguration startConfiguration, GameInitializationFields initializationFields,
            UltraUpdatableContainer updatableContainer
            , HeightmapSegmentFillingListenersContainer heightmapListenersesContainer)
        {
            startConfiguration.CommonConfiguration.UseNormalTextures = true;
            var textureRendererProxy = initializationFields.Retrive <UTTextureRendererProxy>();
            var dbProxy      = initializationFields.Retrive <TerrainShapeDbProxy>();
            var repositioner = initializationFields.Retrive <Repositioner>();

            return(new OneGroundTypeLevelTextureEntitiesGenerator
            {
                FloorTextureArrayGenerator = () =>
                {
                    var outList = new List <EGroundTexture>()
                    {
                        new EGroundTexture(
                            texture: EGroundTextureGenerator.GenerateEmptyGroundTextureArray(startConfiguration.CommonConfiguration.FloorTextureSize
                                                                                             , startConfiguration.HeightPyramidLevels.Count, startConfiguration.CommonConfiguration.HeightTextureFormat),
                            textureType: EGroundTextureType.HeightMap
                            ),
                    };
                    if (startConfiguration.CommonConfiguration.UseNormalTextures)
                    {
                        outList.Add(
                            new EGroundTexture(
                                texture: EGroundTextureGenerator.GenerateEmptyGroundTextureArray(startConfiguration.CommonConfiguration.FloorTextureSize
                                                                                                 , startConfiguration.HeightPyramidLevels.Count, startConfiguration.CommonConfiguration.NormalTextureFormat),
                                textureType: EGroundTextureType.NormalTexture
                                )
                            );
                    }

                    return outList;
                },
                SegmentFillingListenerGeneratorFunc = (level, floorTextureArrays) =>
                {
                    var usedGroundTypes = new List <EGroundTextureType>()
                    {
                        EGroundTextureType.HeightMap
                    };
                    if (startConfiguration.CommonConfiguration.UseNormalTextures)
                    {
                        usedGroundTypes.Add(EGroundTextureType.NormalTexture);
                    }

                    var segmentModificationManagers = usedGroundTypes.ToDictionary(groundType => groundType,
                                                                                   groundType =>
                    {
                        var groundTexture = floorTextureArrays.First(c => c.TextureType == groundType);

                        var segmentsPlacer = new HeightSegmentPlacer(
                            textureRendererProxy, initializationFields.Retrive <CommonExecutorUTProxy>(), groundTexture.Texture
                            , level.GetIndex(), startConfiguration.CommonConfiguration.SlotMapSize, startConfiguration.CommonConfiguration.FloorTextureSize
                            , startConfiguration.CommonConfiguration.InterSegmentMarginSize, startConfiguration.CommonConfiguration.SegmentTextureResolution
                            , startConfiguration.CommonConfiguration.MergeSegmentsInFloorTexture
                            );
                        var pyramidLevelManager = new GroundLevelTexturesManager(startConfiguration.CommonConfiguration.SlotMapSize);
                        return new SoleLevelGroundTextureSegmentModificationsManager(segmentsPlacer, pyramidLevelManager);
                    });

                    var otherThreadExecutor = new OtherThreadCompoundSegmentFillingOrdersExecutorProxy("Height-" + level.ToString(),
                                                                                                       new CompoundSegmentOrdersFillingExecutor <TerrainDescriptionOutput>(
                                                                                                           async(sap) =>
                    {
                        var surfaceWorldSpaceRectangle = ETerrainUtils.TerrainShapeSegmentAlignedPositionToWorldSpaceArea(level,
                                                                                                                          startConfiguration.PerLevelConfigurations[level], sap);

                        var terrainDescriptionOutput = await dbProxy.Query(new TerrainDescriptionQuery()
                        {
                            QueryArea = repositioner.InvMove(surfaceWorldSpaceRectangle),
                            RequestedElementDetails = new List <TerrainDescriptionQueryElementDetail>()
                            {
                                new TerrainDescriptionQueryElementDetail()
                                {
                                    Resolution = ETerrainUtils.HeightPyramidLevelToTerrainShapeDatabaseResolution(level),
                                    RequiredMergeStatus = RequiredCornersMergeStatus.MERGED,
                                    Type = TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY
                                },
                                new TerrainDescriptionQueryElementDetail()
                                {
                                    Resolution = ETerrainUtils.HeightPyramidLevelToTerrainShapeDatabaseResolution(level),
                                    RequiredMergeStatus = RequiredCornersMergeStatus.NOT_MERGED,
                                    Type = TerrainDescriptionElementTypeEnum.NORMAL_ARRAY
                                },
                            }
                        });
                        return terrainDescriptionOutput;
                    },
                                                                                                           async(sap, terrainDescriptionOutput) =>
                    {
                        var heightSegmentTexture = terrainDescriptionOutput.GetElementOfType(TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY)
                                                   .TokenizedElement.DetailElement.Texture.Texture;
                        await segmentModificationManagers[EGroundTextureType.HeightMap].AddSegmentAsync(heightSegmentTexture, sap);

                        if (startConfiguration.CommonConfiguration.UseNormalTextures)
                        {
                            var normalSegmentTexture = terrainDescriptionOutput.GetElementOfType(TerrainDescriptionElementTypeEnum.NORMAL_ARRAY)
                                                       .TokenizedElement.DetailElement.Texture.Texture;
                            await segmentModificationManagers[EGroundTextureType.NormalTexture].AddSegmentAsync(normalSegmentTexture, sap);
                        }
                    },
                                                                                                           async(terrainDescriptionOutput) =>
                    {
                        await dbProxy.DisposeTerrainDetailElement(terrainDescriptionOutput
                                                                  .GetElementOfType(TerrainDescriptionElementTypeEnum.HEIGHT_ARRAY).TokenizedElement.Token);
                        if (startConfiguration.CommonConfiguration.UseNormalTextures)
                        {
                            await dbProxy.DisposeTerrainDetailElement(terrainDescriptionOutput
                                                                      .GetElementOfType(TerrainDescriptionElementTypeEnum.NORMAL_ARRAY).TokenizedElement.Token);
                        }
                    }
                                                                                                           ));
                    updatableContainer.AddOtherThreadProxy(otherThreadExecutor);

                    var fillingListener = new UnityThreadCompoundSegmentFillingListener(otherThreadExecutor);
                    heightmapListenersesContainer.AddListener(level, fillingListener);

                    var travellerCustodian = initializationFields.Retrive <TravellerMovementCustodian>();
                    travellerCustodian.AddLimiter(() => new MovementBlockingProcess()
                    {
                        ProcessName = "HeightSegmentsGenerationProcess " + level, BlockCount = fillingListener.BlockingProcessesCount()
                    });
                    //initializationFields.Retrive<InitialSegmentsGenerationInspector>().SetConditionToCheck(() => fillingListener.BlockingProcessesCount() == 0);
                    return fillingListener;
                }
            });
        }
Exemple #15
0
        public static OneGroundTypeLevelTextureEntitiesGenerator CreateSurfaceTextureEntitiesGenerator(
            FEConfiguration configuration, ETerrainHeightPyramidFacadeStartConfiguration startConfiguration, GameInitializationFields gameInitializationFields
            , UltraUpdatableContainer ultraUpdatableContainer)
        {
            var repositioner         = gameInitializationFields.Retrive <Repositioner>();
            var surfaceTextureFormat = RenderTextureFormat.ARGB32;
            var commonExecutor       = gameInitializationFields.Retrive <CommonExecutorUTProxy>();

            var feRing2PatchConfiguration = new Ring2PatchInitializerConfiguration(configuration);

            feRing2PatchConfiguration.Ring2PlateStamperConfiguration.PlateStampPixelsPerUnit =
                feRing2PatchConfiguration.Ring2PlateStamperConfiguration.PlateStampPixelsPerUnit.ToDictionary(
                    c => c.Key,
                    c => c.Value * Mathf.Pow(2, feRing2PatchConfiguration.MipmapLevelToExtract)
                    );

            var patchInitializer = new Ring2PatchInitializer(gameInitializationFields, ultraUpdatableContainer, feRing2PatchConfiguration);

            patchInitializer.Start();

            var mipmapExtractor               = new MipmapExtractor(gameInitializationFields.Retrive <UTTextureRendererProxy>());
            var patchesCreatorProxy           = gameInitializationFields.Retrive <GRing2PatchesCreatorProxy>();
            var patchStamperOverseerFinalizer = gameInitializationFields.Retrive <Ring2PatchStamplingOverseerFinalizer>();
            var surfacePatchProvider          = new ESurfacePatchProvider(patchesCreatorProxy, patchStamperOverseerFinalizer, commonExecutor,
                                                                          mipmapExtractor, feRing2PatchConfiguration.MipmapLevelToExtract);

            var cachedSurfacePatchProvider =
                new CachedESurfacePatchProvider(surfacePatchProvider
                                                , new InMemoryAssetsCache <ESurfaceTexturesPackToken, NullableESurfaceTexturesPack>(
                                                    FETerrainShapeDbInitialization.CreateLevel2AssetsCache <ESurfaceTexturesPackToken, NullableESurfaceTexturesPack>(
                                                        cachingConfiguration: new CachingConfiguration()
            {
                SaveAssetsToFile = true,
                UseFileCaching   = true,
            }
                                                        , new InMemoryCacheConfiguration() /*{ MaxTextureMemoryUsed = 0}*/
                                                        , new ESurfaceTexturesPackEntityActionsPerformer(commonExecutor)
                                                        , new ESurfaceTexturesPackFileManager(commonExecutor, configuration.FilePathsConfiguration.SurfacePatchCachePath))));

            cachedSurfacePatchProvider.Initialize().Wait();

            var cachedSurfacePatchDbProxy = new ESurfacePatchDbProxy(cachedSurfacePatchProvider);

            ultraUpdatableContainer.AddOtherThreadProxy(cachedSurfacePatchDbProxy);

            var textureRendererProxy = gameInitializationFields.Retrive <UTTextureRendererProxy>();

            return(new OneGroundTypeLevelTextureEntitiesGenerator()
            {
                FloorTextureArrayGenerator = () =>
                {
                    return new List <EGroundTexture>()
                    {
                        new EGroundTexture(EGroundTextureGenerator.GenerateEmptyGroundTextureArray(startConfiguration.CommonConfiguration.FloorTextureSize,
                                                                                                   startConfiguration.HeightPyramidLevels.Count, surfaceTextureFormat),
                                           EGroundTextureType.SurfaceTexture)
                    };
                },
                SegmentFillingListenerGeneratorFunc = (level, floorTextureArrays) =>
                {
                    var floorTextureArray = floorTextureArrays.First(c => c.TextureType == EGroundTextureType.SurfaceTexture);
                    var segmentsPlacer = new ESurfaceSegmentPlacer(textureRendererProxy, floorTextureArray.Texture, level.GetIndex()
                                                                   , startConfiguration.CommonConfiguration.SlotMapSize, startConfiguration.CommonConfiguration.FloorTextureSize);
                    var pyramidLevelManager = new GroundLevelTexturesManager(startConfiguration.CommonConfiguration.SlotMapSize);
                    var segmentModificationManager = new SoleLevelGroundTextureSegmentModificationsManager(segmentsPlacer, pyramidLevelManager);

                    var otherThreadExecutor = new OtherThreadCompoundSegmentFillingOrdersExecutorProxy("ESurface-" + level.ToString(),
                                                                                                       new CompoundSegmentOrdersFillingExecutor <TokenizedESurfaceTexturesPackToken>(
                                                                                                           async(sap) =>
                    {
                        var surfaceWorldSpaceRectangle = ETerrainUtils.SurfaceTextureSegmentAlignedPositionToWorldSpaceArea(level,
                                                                                                                            startConfiguration.PerLevelConfigurations[level], sap);
                        var lod = ETerrainUtils.HeightPyramidLevelToSurfaceTextureFlatLod(level);
                        return await cachedSurfacePatchDbProxy.ProvideSurfaceDetail(repositioner.InvMove(surfaceWorldSpaceRectangle), lod);
                    },
                                                                                                           async(sap, packAndToken) =>
                    {
                        var pack = packAndToken.Pack;
                        if (pack != null)
                        {
                            var mainTexture = pack.MainTexture;
                            await segmentModificationManager.AddSegmentAsync(mainTexture, sap);
                        }
                    },
                                                                                                           segmentRemovalFunc: async(packAndToken) =>
                    {
                        if (packAndToken != null)
                        {
                            var pack = packAndToken.Pack;
                            if (pack != null)
                            {
                                Preconditions.Assert(packAndToken.Token != null, "Token is null. Unexpected");
                                cachedSurfacePatchDbProxy.RemoveSurfaceDetailAsync(pack, packAndToken.Token);
                            }
                        }
                    }
                                                                                                           ));

                    ultraUpdatableContainer.AddOtherThreadProxy(otherThreadExecutor);
                    var fillingListener = new UnityThreadCompoundSegmentFillingListener(otherThreadExecutor);
                    var travellerCustodian = gameInitializationFields.Retrive <TravellerMovementCustodian>();
                    travellerCustodian.AddLimiter(() => new MovementBlockingProcess()
                    {
                        BlockCount = fillingListener.BlockingProcessesCount(), ProcessName = "SurfaceSegmentsGeneration " + level
                    });
                    return fillingListener;
                }
            });
        }