Esempio n. 1
0
        public void InitializeMonoliticRing2RegionsDatabase()
        {
            var habitatMap = new HabitatMapDbProxy(new HabitatMapDb(_configuration.HabitatDbInitializationInfo));

            _updatableContainer.AddOtherThreadProxy(habitatMap);

            _gameInitializationFields.SetField(habitatMap);

            var regionsDbGenerator = new Ring2RegionsDbGenerator(habitatMap,
                                                                 _configuration.Ring2RegionsDbGeneratorConfiguration(new Ring2AreaDistanceDatabase()),
                                                                 _gameInitializationFields.Retrive <RoadDatabaseProxy>());
            var regionsDatabase = regionsDbGenerator.GenerateDatabaseAsync(_configuration.Ring2GenerationArea).Result;

            _gameInitializationFields.SetField(regionsDatabase);
        }
        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);
            }
        }
Esempio n. 3
0
        public void Start()
        {
            var ring2ShaderRepository = Ring2PlateShaderRepository.Create();

            var conciever      = _gameInitializationFields.Retrive <TextureConcieverUTProxy>();
            var detailEnhancer =
                new Ring2IntensityPatternEnhancer(_gameInitializationFields.Retrive <UTTextureRendererProxy>(),
                                                  _ring2InitializerConfiguration.Ring2IntensityPatternEnhancingSizeMultiplier);

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

            _ultraUpdatableContainer.Add(ring2PatchesPainterUtProxy);

            var patchesCreator = new GRing2PatchesCreator(
                _gameInitializationFields.Retrive <IRing2RegionsDatabase>(),
                new GRing2RegionsToPatchTemplateConventer(),
                new Ring2PatchTemplateCombiner(),
                new Ring2PatchCreator(),
                new Ring2IntensityPatternProvider(conciever, detailEnhancer),
                new GRing2Deviser(),
                _ring2InitializerConfiguration.Ring2PatchesOverseerConfiguration
                );

            var gRing2PatchesCreatorProxy = new GRing2PatchesCreatorProxy(patchesCreator);

            _ultraUpdatableContainer.AddOtherThreadProxy(gRing2PatchesCreatorProxy);

            _gameInitializationFields.SetField(gRing2PatchesCreatorProxy);

            UTRing2PlateStamperProxy stamperProxy = new UTRing2PlateStamperProxy(
                new Ring2PlateStamper(_ring2InitializerConfiguration.Ring2PlateStamperConfiguration,
                                      _gameInitializationFields.Retrive <ComputeShaderContainerGameObject>()));

            _ultraUpdatableContainer.Add(stamperProxy);

            Ring2PatchStamplingOverseerFinalizer patchStamper = new Ring2PatchStamplingOverseerFinalizer(
                stamperProxy,
                _gameInitializationFields.Retrive <UTTextureRendererProxy>(), _gameInitializationFields.Retrive <CommonExecutorUTProxy>());

            _gameInitializationFields.SetField(patchStamper);
        }
        public void Start()
        {
            InitializeWelding();
            /// /// VISIBILITY TEXTURE
            var visibilityTextureSideLength = 16;
            var visibilityTexture           = new Texture2D(visibilityTextureSideLength, visibilityTextureSideLength,
                                                            TextureFormat.RFloat, false);

            visibilityTexture.filterMode = FilterMode.Point;

            var visibilityTextureProcessorProxy =
                new Ring1VisibilityTextureProcessorUTProxy(new Ring1VisibilityTextureProcessor(visibilityTexture));

            _ultraUpdatableContainer.Add(visibilityTextureProcessorProxy);

            var visibilityTextureChangeGrabber = new Ring1VisibilityTextureChangeGrabber();

            var terrainParentGameObject = new GameObject("TerrainParent");

            terrainParentGameObject.transform.localPosition = new Vector3(0, 0, 0);

            var globalSideLength      = _gRingConfiguration.Ring1GlobalSideLength;
            var globalSize            = new Vector2(globalSideLength, globalSideLength);
            var unityCoordsCalculator = new UnityCoordsCalculator(globalSize);
            var orderGrabber          = new Ring1PaintingOrderGrabber();

            var painterProxy = new RingTerrainPainterUTProxy(new RingTerrainPainter(_gRingConfiguration.MakeTerrainVisible));

            _ultraUpdatableContainer.Add(painterProxy);

            painterProxy.Update();

            var mainRespondingProxy = new Ring1NodeEventMainRespondingProxy(new Ring1NodeEventMainResponder());

            _ultraUpdatableContainer.AddOtherThreadProxy(new OtherThreadProxyWithPerPostAction()
            {
                OtherThreadProxy = mainRespondingProxy,
                PerPostAction    =
                    () =>
                {
                    var delta = visibilityTextureChangeGrabber.RetriveVisibilityChanges();

                    if (delta.AnyChange)
                    {
                        var visibilityTextureChagnes =
                            visibilityTextureChangeGrabber.RetriveVisibilityChanges();
                        visibilityTextureProcessorProxy.AddOrder(visibilityTextureChagnes);
                    }

                    if (orderGrabber.IsAnyOrder)
                    {
                        painterProxy.AddOrder(orderGrabber.RetriveOrderAndClear());
                    }
                }
            });

            var stainTerrainResourceCreatorUtProxy =
                new StainTerrainResourceCreatorUTProxy(new StainTerrainResourceCreator());

            _ultraUpdatableContainer.Add(stainTerrainResourceCreatorUtProxy);

            var stainTerrainServiceProxy = new StainTerrainServiceProxy(
                new StainTerrainService(
                    new FromFileStainTerrainResourceGenerator(_configuration.StainTerrainServicePath, _gameInitializationFields.Retrive <CommonExecutorUTProxy>()),
                    //new ComputationStainTerrainResourceGenerator(
                    //    new StainTerrainResourceComposer(
                    //        _stainTerrainResourceCreatorUtProxy
                    //        ),
                    //    new StainTerrainArrayMelder(),
                    //    new DummyStainTerrainArrayFromBiomesGenerator(
                    //        new DebugBiomeContainerGenerator().GenerateBiomesContainer(new BiomesContainerConfiguration()),
                    //        new StainTerrainArrayFromBiomesGeneratorConfiguration()
                    //    )),
                    _gRingConfiguration.Ring1GenerationArea));

            _ultraUpdatableContainer.AddOtherThreadProxy(stainTerrainServiceProxy);

            var ring1Tree      = new Ring1Tree(_gRingConfiguration.Ring1TreeConfiguration);
            var ring1TreeProxy = new Ring1TreeProxy(ring1Tree);

            _gameInitializationFields.Retrive <LateAssignBox <Ring1TreeProxy> >().Set(ring1TreeProxy);
            _ultraUpdatableContainer.AddOtherThreadProxy(ring1TreeProxy);

            var terrainShapeDbInitialization = new FETerrainShapeDbInitialization(_ultraUpdatableContainer,
                                                                                  _gameInitializationFields, _configuration, new FilePathsConfiguration());

            terrainShapeDbInitialization.Start();


            var gRing0NodeTerrainCreator = new GRing0NodeTerrainCreator(
                orderGrabber,
                terrainParentGameObject,
                _gameInitializationFields.Retrive <MeshGeneratorUTProxy>(),
                _gameInitializationFields.Retrive <ITerrainShapeDb>(),
                unityCoordsCalculator,
                _gameInitializationFields.Retrive <GRingSpotUpdater>(),
                _gameInitializationFields.Retrive <HeightArrayWeldingPack>(),
                _gRingConfiguration.GroundShapeProviderConfiguration,
                _gRingConfiguration.TerrainMeshProviderConfiguration);

            var gRing1NodeTerrainCreator = new GRing1NodeTerrainCreator(
                orderGrabber,
                terrainParentGameObject,
                _gameInitializationFields.Retrive <MeshGeneratorUTProxy>(),
                _gameInitializationFields.Retrive <ITerrainShapeDb>(),
                stainTerrainServiceProxy,
                unityCoordsCalculator,
                _gameInitializationFields.Retrive <GRingSpotUpdater>(),
                _gameInitializationFields.Retrive <HeightArrayWeldingPack>(),
                _gRingConfiguration.GroundShapeProviderConfiguration,
                _gRingConfiguration.TerrainMeshProviderConfiguration);

            var gRing2PatchesCreatorProxy = _gameInitializationFields.Retrive <GRing2PatchesCreatorProxy>();

            var gRing2NodeTerrainCreator = new GRing2NodeTerrainCreator(
                orderGrabber,
                terrainParentGameObject,
                _gameInitializationFields.Retrive <MeshGeneratorUTProxy>(),
                _gameInitializationFields.Retrive <ITerrainShapeDb>(),
                unityCoordsCalculator,
                gRing2PatchesCreatorProxy,
                _gameInitializationFields.Retrive <GRingSpotUpdater>(),
                _gameInitializationFields.Retrive <HeightArrayWeldingPack>(),
                _gRingConfiguration.GroundShapeProviderConfiguration,
                _gRingConfiguration.TerrainMeshProviderConfiguration);

            var gDebugNodeTerrainCreator = new GDebugLodNodeTerrainCreator(
                orderGrabber,
                terrainParentGameObject,
                unityCoordsCalculator,
                _gameInitializationFields.Retrive <MeshGeneratorUTProxy>()
                );

            var gDebugTerrainedNodeTerrainCreator = new GDebugTerrainedLodNodeTerrainCreator(
                orderGrabber,
                terrainParentGameObject,
                unityCoordsCalculator,
                _gameInitializationFields.Retrive <MeshGeneratorUTProxy>(),
                _gameInitializationFields.Retrive <ITerrainShapeDb>(),
                _gRingConfiguration.GroundShapeProviderConfiguration,
                _gameInitializationFields.Retrive <GRingSpotUpdater>()
                );


            var gStampedRing2NodeTerrainCreator = new GStampedRing2NodeTerrainCreator(
                orderGrabber,
                terrainParentGameObject,
                _gameInitializationFields.Retrive <MeshGeneratorUTProxy>(),
                _gameInitializationFields.Retrive <ITerrainShapeDb>(),
                unityCoordsCalculator,
                gRing2PatchesCreatorProxy,
                _gameInitializationFields.Retrive <Ring2PatchStamplingOverseerFinalizer>(),
                _gameInitializationFields.Retrive <GRingSpotUpdater>(),
                _gameInitializationFields.Retrive <HeightArrayWeldingPack>(),
                _gRingConfiguration.GroundShapeProviderConfiguration,
                _gRingConfiguration.TerrainMeshProviderConfiguration);

            var gCompositeRing2NodeTerrainCreator = new GCompositeRing2NodeTerrainCreator(
                orderGrabber,
                terrainParentGameObject,
                _gameInitializationFields.Retrive <MeshGeneratorUTProxy>(),
                _gameInitializationFields.Retrive <ITerrainShapeDb>(),
                unityCoordsCalculator,
                gRing2PatchesCreatorProxy,
                _gameInitializationFields.Retrive <GRingSpotUpdater>(),
                _gameInitializationFields.Retrive <HeightArrayWeldingPack>(),
                _gameInitializationFields.Retrive <Ring2PatchStamplingOverseerFinalizer>(),
                _gRingConfiguration.GroundShapeProviderConfiguration,
                _gRingConfiguration.TerrainMeshProviderConfiguration);

            //var gCompositeRing2NodeTerrainCreator = new GCompositeRing2NodeTerrainCreator(
            //    new List<INewGRingListenersCreator>()
            //    {
            //        gRing2NodeTerrainCreator,
            //        gStampedRing2NodeTerrainCreator,
            //    });

            var subCreator = new SupremeGRingNodeTerrainCreator(new List <NewListenersCreatorWithLimitation>()
            {
                //new NewListenersCreatorWithLimitation()
                //{
                //    Creator = gDebugTerrainedNodeTerrainCreator,
                //    MaximumLod = new FlatLod(14),
                //    //PositionLimiter = new NewListenersCreatorPositionLimiter(new Vector2(0.5f, 0.6f), 0.025f)
                //},

                //new NewListenersCreatorWithLimitation()
                //{
                //    Creator = gRing0NodeTerrainCreator,
                //    MaximumLod = new FlatLod(5),
                //},

                new NewListenersCreatorWithLimitation()
                {
                    Creator    = new GVoidNodeTerrainCreator(),
                    MaximumLod = new FlatLod(5),
                    //IsFallthroughCreator = true
                },

                new NewListenersCreatorWithLimitation()
                {
                    Creator    = gRing1NodeTerrainCreator,
                    MaximumLod = new FlatLod(10)
                },

                new NewListenersCreatorWithLimitation()
                {
                    Creator    = gRing2NodeTerrainCreator,
                    MaximumLod = new FlatLod(14)
                },

                new NewListenersCreatorWithLimitation()
                {
                    Creator    = gStampedRing2NodeTerrainCreator,
                    MaximumLod = new FlatLod(13)
                },

                new NewListenersCreatorWithLimitation()
                {
                    Creator    = gCompositeRing2NodeTerrainCreator,
                    MaximumLod = new FlatLod(14)
                }

                //new NewListenersCreatorWithLimitation()
                //{
                //    Creator = gDebugNodeTerrainCreator,
                //    MaximumLod = new FlatLod(11)
                //},
            });

            var eventCollector = new Ring1NodeEventCollector(
                new DynamicFlatLodGRingNodeTerrainCreator(subCreator,
                                                          new FlatLodCalculator(unityCoordsCalculator, _gRingConfiguration.FlatLodConfiguration)));

            _ultraUpdatableContainer.AddOtherThreadProxy(
                new OtherThreadProxyWithPerPostAction()
            {
                OtherThreadProxy = ring1TreeProxy,
                PerPostAction    = () =>
                {
                    if (eventCollector.Any)
                    {
                        mainRespondingProxy.AddOrder(eventCollector.RetriveOrderAndClear());
                    }
                }
            }
                );
            var repositioner = _gameInitializationFields.Retrive <Repositioner>();

            _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable()
            {
                UpdateCameraField = (camera) =>
                {
                    if (_configuration.UpdateRingTree)
                    {
                        ring1TreeProxy.UpdateCamera(FovData.FromCamera(camera, repositioner));
                    }
                }
            });

            _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable()
            {
                StartCameraField = (camera) =>
                {
                    ring1TreeProxy.CreateHeightmap(
                        new Ring1Tree.RootNodeCreationParameters()
                    {
                        InitialCameraPosition = repositioner.InvMove(camera.Position),
                        NodeListener          = eventCollector,
                        PrecisionDistances    = _gRingConfiguration.QuadLodPrecisionDistances,
                        UnityCoordsCalculator = unityCoordsCalculator
                    });
                }
            });
        }
Esempio n. 5
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;
                }
            });
        }
Esempio n. 6
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;
                }
            });
        }
Esempio n. 7
0
        private void StartTreesRuntimeManagment()
        {
            var globalInstancingContainer = _initializationFields.Retrive <GlobalGpuInstancingContainer>();
            var representationContainer   = new DesignBodyRepresentationContainer();
            var instanceBucketsContainer  = new DesignBodyInstanceBucketsContainer(globalInstancingContainer);

            var quadBillboardMesh = GameObject.CreatePrimitive(PrimitiveType.Quad).GetComponent <MeshFilter>().mesh;

            IDesignBodyRepresentationInstanceCombinationProvider combinationProvider;

            if (_veConfiguration.Mode == VegetationMode.Legacy)
            {
                var gShifter        = new GTreeDetailProviderShifter(new DetailProviderRepository(), quadBillboardMesh);
                var treeFileManager = new TreeFileManager(new TreeFileManagerConfiguration()
                {
                    WritingTreeCompletedClanDirectory = _veConfiguration.TreeCompletedClanDirectiory
                });
                combinationProvider = new GDesignBodyRepresentationInstanceCombinationProvider(treeFileManager, gShifter);
            }
            else
            {
                var eVegetationShifter = new EVegetationDetailProviderShifter(
                    _veConfiguration.ShaderNames,
                    new DetailProviderRepository(), quadBillboardMesh,
                    _veConfiguration.ReferencedAssets, _materialCommonPack);
                combinationProvider = new EVegetationDesignBodyRepresentationInstanceCombinationProvider(new TreePrefabManager(), eVegetationShifter, _veConfiguration.ReferencedAssets);
            }

            foreach (var pair in _veConfiguration.ShiftingConfigurations.Where(c => _veConfiguration.SupportedVegetationSpecies.Contains(c.Key)))
            {
                var clanRepresentations = combinationProvider.CreateRepresentations(pair.Value, pair.Key);
                representationContainer.InitializeLists(clanRepresentations);
                instanceBucketsContainer.InitializeLists(clanRepresentations);
            }

            var designBodySpotUpdaterProxy = _initializationFields.Retrive <DesignBodySpotUpdaterProxy>();
            var mediatorSpotUpdater        = new ListenerCenteredMediatorDesignBodyChangesUpdater(designBodySpotUpdaterProxy);

            var rootMediator = _initializationFields.Retrive <RootMediatorSpotPositionsUpdater>();

            rootMediator.AddListener(mediatorSpotUpdater);

            var repositioner          = _veConfiguration.VegetationRepositioner;
            var forgingContainerProxy = new ForgingVegetationSubjectInstanceContainerProxy(
                new ForgingVegetationSubjectInstanceContainer(
                    new DesignBodyPortrayalForger(
                        representationContainer,
                        instanceBucketsContainer,
                        repositioner),
                    mediatorSpotUpdater//teraz napisz tak, zeby info zwrotne se spotupdatera wracalo zgodnie z multithreadingiem (szlo do innego watku!)
                    ));

            mediatorSpotUpdater.SetTargetChangesListener(new LambdaSpotPositionChangesListener(dict =>
            {
                forgingContainerProxy.AddSpotModifications(dict);
            }));

            _ultraUpdatableContainer.AddOtherThreadProxy(forgingContainerProxy);

            MyProfiler.BeginSample("Vegetation1: Loading from file");
            var baseVegetationList = VegetationDatabaseFileUtils.LoadListFromFiles(_veConfiguration.LoadingVegetationDatabaseDictionaryPath);

            MyProfiler.EndSample();

            if (_veConfiguration.GenerateTrees)
            {
                MyProfiler.BeginSample("Vegetation2: pushingToFile");
                foreach (var pair in _veConfiguration.PerRankVegetationRuntimeManagementConfigurations)
                {
                    var rank = pair.Key;
                    var managementConfiguration = pair.Value;

                    var baseRankedDb = baseVegetationList[rank];

                    var supportedSpecies = _veConfiguration.SupportedTreeSpecies;

                    var filteredEntities = baseRankedDb.Where(c => supportedSpecies.Contains(c.Detail.SpeciesEnum)).ToList();

                    var stagnantEntities    = new List <VegetationSubjectEntity>();
                    var nonStagnantEntities = new List <VegetationSubjectEntity>();

                    var nonStagnantVegetationRect = _veConfiguration.NonStagnantVegetationArea;
                    foreach (var entity in filteredEntities)
                    {
                        if (nonStagnantVegetationRect.Contains(entity.Position2D))
                        {
                            nonStagnantEntities.Add(entity);
                        }
                        else
                        {
                            stagnantEntities.Add(entity);
                        }
                    }

                    var stagnantVegetationRuntimeManagement = new StagnantVegetationRuntimeManagement(forgingContainerProxy,
                                                                                                      stagnantEntities, _veConfiguration.StagnantVegetationRuntimeManagementConfiguration);
                    var stagnantVegetationRuntimaManagementProxy = new StagnantVegetationRuntimeManagementProxy(stagnantVegetationRuntimeManagement);

                    _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable()
                    {
                        StartField = () => { stagnantVegetationRuntimaManagementProxy.StartThreading(); }
                    });


                    var quadtree = new Quadtree <VegetationSubjectEntity>();
                    foreach (var entity in nonStagnantEntities)
                    {
                        quadtree.Insert(MyNetTopologySuiteUtils.ToPointEnvelope(entity.Position2D), entity);
                    }

                    var positionsProvider = new VegetationSubjectsPositionsDatabase(quadtree);

                    var runtimeManagement = new VegetationRuntimeManagement(
                        positionsProvider: positionsProvider,
                        vegetationSubjectsChangesListener: forgingContainerProxy,
                        visibleEntitiesContainer: new VegetationSubjectsVisibleEntitiesContainer(),
                        configuration: managementConfiguration);

                    var outerVegetationRuntimeManagementProxy = new VegetationRuntimeManagementProxy(runtimeManagement);

                    _ultraUpdatableContainer.AddUpdatableElement(new FieldBasedUltraUpdatable()
                    {
                        StartCameraField = (camera) =>
                        {
                            outerVegetationRuntimeManagementProxy.StartThreading();
                            var position = camera.Position;
                            outerVegetationRuntimeManagementProxy.Start(repositioner.InvMove(position));
                        },
                        UpdateCameraField = (camera) =>
                        {
                            var position = camera.Position;
                            outerVegetationRuntimeManagementProxy.AddUpdate(repositioner.InvMove(position));
                            outerVegetationRuntimeManagementProxy.SynchronicUpdate(repositioner.InvMove(position));
                        },
                    });
                }
                MyProfiler.EndSample();
            }

            if (_veConfiguration.GenerateBigBushes)
            {
                InitializeBushObjectsDb(baseVegetationList[VegetationLevelRank.Small], forgingContainerProxy);
            }
        }