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;
 }
        private GrassEntitiesWithMaterials generateTurf(GrassBillboardGenerator billboardGenerator)
        {
            var meshGenerator         = new GrassMeshGenerator();
            var mesh                  = meshGenerator.GetGrassBillboardMesh(0, 1);
            var xgenerateTriangleTurf = billboardGenerator.GenerateTriangleTurf(); //todo : use grass entities set and rotate

            //xgenerateTriangleTurf.Rotation = (MyMathUtils.DegToRad(new Vector3(0, 90, 0)));
            //xgenerateTriangleTurf.Position = new Vector3(2,2,2);
            return(new GrassEntitiesWithMaterials(xgenerateTriangleTurf.EntitiesAfterTransform, BillboardMaterial, mesh, ContainerType.GameObject));
        }
Beispiel #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));
        }
        public GrassEntitiesWithMaterials GenerateUniformRectangeBillboardGrass(Material material, IGrassPlacer placer, int lodLevel)
        {
            List <GrassEntity> createdEntities = new List <GrassEntity>();
            var billboardGenerator             = new GrassBillboardGenerator();

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

            for (int i = 0; i < 75; i++)
            {
                var triangleTurf = billboardGenerator.GenerateTriangleTurf(); //todo : use grass entities set and rotate
                triangleTurf.Rotation = (MyMathUtils.DegToRad(new Vector3(0, UnityEngine.Random.Range(0, 360), 0)));
                placer.Set(triangleTurf);
                createdEntities.AddRange(triangleTurf.EntitiesAfterTransform);
            }

            return(null); // new GrassEntitiesWithMaterials(createdEntities, material, mesh);
        }
        private void Start()
        {
            Random.InitState(DateTime.Now.Second);
            _rootInstanceContainer = new RootInstanceContainer();
            Material grassMaterial = new Material(Shader.Find("Custom/testSurfaceShader23.Instanced"));

            var meshGenerator = new GrassMeshGenerator();

            var grassTuftLodEntitySplatGenerator = new GrassTuftLodEntitySplatGenerator(
                new GrassTuftGenerator(),
                new SingleGrassUniformPositionProvider(),
                new GrassTuftAbstractSettingGenerator(),
                _rootInstanceContainer,
                meshGenerator,
                grassMaterial);

            var singleGrassLodEntitySplatGenerator = new SingleGrassLodEntitySplatGenerator(
                new GrassSingleGenerator(),
                new SingleGrassUniformPositionProvider(),
                new GrassSingleAbstractSettingGenerator(),
                _rootInstanceContainer,
                meshGenerator,
                grassMaterial);

            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), lodGroupProvider, mapSize, splatSize);
            _grassLodManager.UpdateLod(new Vector3(0, 0, 0));
        }