public GrassTuftEntitySplatGenerator(GrassTuftGenerator grassTuftGenerator, IEntityPositionProvider grassTuftPositionProvider, GrassTuftAbstractSettingGenerator grassTuftAbstractSettingGenerator, IGrassInstanceContainer grassInstanceContainer, GrassMeshGenerator meshGenerator, Material grassTuftMaterial)
 {
     _grassTuftGenerator                = grassTuftGenerator;
     _grassTuftPositionProvider         = grassTuftPositionProvider;
     _grassTuftAbstractSettingGenerator = grassTuftAbstractSettingGenerator;
     _grassInstanceContainer            = grassInstanceContainer;
     _meshGenerator     = meshGenerator;
     _grassTuftMaterial = grassTuftMaterial;
 }
 public SingleGrassLodEntitySplatGenerator(GrassSingleGenerator grassSingleGenerator, IEntityPositionProvider singleGrassUniformPositionProvider, GrassSingleAbstractSettingGenerator grassSingleAbstractSettingGenerator, IGrassInstanceContainer grassInstanceContainer, GrassMeshGenerator meshGenerator, Material grassMaterial)
 {
     _grassSingleGenerator = grassSingleGenerator;
     _singleGrassUniformPositionProvider  = singleGrassUniformPositionProvider;
     _grassSingleAbstractSettingGenerator = grassSingleAbstractSettingGenerator;
     _grassInstanceContainer = grassInstanceContainer;
     _meshGenerator          = meshGenerator;
     _grassMaterial          = grassMaterial;
 }
 public SingleGrassEntitySplatGenerator(GrassSingleGenerator entityGenerator, IEntityPositionProvider positionProvider, GrassSingleAbstractSettingGenerator grassSingleAbstractSettingGenerator, IGrassInstanceContainer grassInstanceContainer, GrassMeshGenerator meshGenerator, Material material)
 {
     this._entityGenerator  = entityGenerator;
     this._positionProvider = positionProvider;
     this._grassSingleAbstractSettingGenerator = grassSingleAbstractSettingGenerator;
     this._grassInstanceContainer = grassInstanceContainer;
     _meshGenerator = meshGenerator;
     this._material = material;
 }
Пример #4
0
        private void Start()
        {
            UnityEngine.Random.InitState(DateTime.Now.Second); //todo to provider

            GpuInstancingGrassInstanceContainer gpuInstancingGrassContainer = new GpuInstancingGrassInstanceContainer();
            GameObjectGrassInstanceContainer    gameObjectContainer         = new GameObjectGrassInstanceContainer();

            _rootInstanceContainer  = new RootInstanceContainer(gameObjectContainer, gpuInstancingGrassContainer);
            _grassInstanceContainer = _rootInstanceContainer;
            Material grassMaterial = new Material(Shader.Find("Custom/Vegetation/Grass.Instanced"));

            var meshGenerator = new GrassMeshGenerator();

            var singleGrassMeshProvider          = new SingleGrassMeshProvider(meshGenerator);
            var singleGrassUpdater               = new SingleGrassEntitySplatUpdater(singleGrassMeshProvider);
            var grassTuftLodEntitySplatGenerator = new GenericEntitySplatGenerator((position) =>
                                                                                   new LodEntitySplat(position,
                                                                                                      new SingleGrassLodResolver(),
                                                                                                      new GpuInstancingEntitySplatGenerator(new GrassTuftGenerator(),
                                                                                                                                            new SingleGrassUniformPositionProvider(),
                                                                                                                                            new GrassTuftAbstractSettingGenerator(), grassMaterial,
                                                                                                                                            new ConstantCount(20), singleGrassMeshProvider, gpuInstancingGrassContainer,
                                                                                                                                            new GpuInstancingGrassInstanceGenerator()),
                                                                                                      singleGrassUpdater));

            var singleGrassLodEntitySplatGenerator = new GenericEntitySplatGenerator((position) =>
                                                                                     new LodEntitySplat(position,
                                                                                                        new SingleGrassLodResolver(),
                                                                                                        new GpuInstancingEntitySplatGenerator(new GrassSingleGenerator(),
                                                                                                                                              new SingleGrassUniformPositionProvider(),
                                                                                                                                              new GrassSingleAbstractSettingGenerator(), grassMaterial,
                                                                                                                                              new ConstantCount(20), singleGrassMeshProvider, gpuInstancingGrassContainer,
                                                                                                                                              new GpuInstancingGrassInstanceGenerator()),
                                                                                                        singleGrassUpdater));


            var lodGroupProvider =
                new LodGroupsProvider(new List <ILodEntitySplatGenerator>
            {
                singleGrassLodEntitySplatGenerator,
                grassTuftLodEntitySplatGenerator
            });

            var mapSize             = new Vector2(100, 100);
            var splatSize           = mapSize / 10;
            var singleLevelDistance = (int)splatSize.x * 2;
            var singleLevelMargin   = 0.1f;
            var lodMarginPowCoef    = 0.8f;

            _grassLodManager =
                new GrassLodManager(new LodLevelResolver(7, singleLevelDistance, singleLevelMargin, lodMarginPowCoef),
                                    new GrassLodManager.MultithreadLodGroupsActioner(lodGroupProvider), mapSize, splatSize);
            _grassLodManager.InitializeGroups(new Vector3(0, 0, 0));
            _grassLodManager.UpdateLod(new Vector3(0, 0, 0));
        }