예제 #1
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));
        }
        private void Update()
        {
            if (Input.GetKey(KeyCode.UpArrow))
            {
                _rootInstanceContainer.SetGlobalColor("_Color", new Color(a % 1.0f, (a + 0.5f) % 1.0f, (a + 0.3f) % 1.0f));
                a += 0.1f;
            }

            if (Input.GetKey(KeyCode.Q))
            {
                _rootInstanceContainer.SetGlobalUniform(GrassShaderUniformName._BendingStrength, windStrength);
                windStrength += 0.1f;
                windStrength  = Mathf.Clamp01(windStrength);
            }
            if (Input.GetKey(KeyCode.W))
            {
                _rootInstanceContainer.SetGlobalUniform(GrassShaderUniformName._BendingStrength, windStrength);
                windStrength -= 0.1f;
                windStrength  = Mathf.Clamp01(windStrength);
            }
            if (Input.GetKey(KeyCode.T))
            {
                grassSplat.Remove();
            }

            //if (Time.frameCount%100 == 0)
            //{
            //   _manager.UpdateLod(new Vector3(0, 0, 0));

            //}
            if (windStrength < 1)
            {
                //_manager.UpdateLod(new Vector3(0,0,0));
                //windStrength = 2;
            }

            if (Time.frameCount % 100 == 0)
            {
                _grassLodManager.UpdateLod(CameraGameObject.transform.position);
            }
            _rootInstanceContainer.Draw();
        }
        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));
        }
예제 #4
0
        private void Update()
        {
            //if (Input.GetKey(KeyCode.UpArrow))
            //{
            //    _rootInstanceContainer.SetGlobalColor("_Color", new Color(a%1.0f, (a + 0.5f)%1.0f, (a + 0.3f)%1.0f));
            //    a += 0.1f;
            //}

            //if (Input.GetKey(KeyCode.Q))
            //{
            //    _rootInstanceContainer.SetGlobalUniform(GrassShaderUniformName._BendingStrength, windStrength);
            //    windStrength += 0.1f;
            //    windStrength = Mathf.Clamp01(windStrength);
            //}
            //if (Input.GetKey(KeyCode.W))
            //{
            //    _rootInstanceContainer.SetGlobalUniform(GrassShaderUniformName._BendingStrength, windStrength);
            //    windStrength -= 0.1f;
            //    windStrength = Mathf.Clamp01(windStrength);
            //}
            //if (Input.GetKey(KeyCode.T))
            //{
            //    grassSplat.Remove();
            //}

            ////if (Time.frameCount%100 == 0)
            ////{
            ////   _manager.UpdateLod(new Vector3(0, 0, 0));

            ////}
            //if (windStrength < 1)
            //{
            //    //_manager.UpdateLod(new Vector3(0,0,0));
            //    //windStrength = 2;
            //}
            float move = 0.05f;

            if (Input.GetKey(KeyCode.L))
            {
                CameraGameObject.transform.position += new Vector3(move, 0, 0);
            }
            if (Input.GetKey(KeyCode.I))
            {
                CameraGameObject.transform.position += new Vector3(0, 0, move);
            }
            if (Input.GetKey(KeyCode.K))
            {
                CameraGameObject.transform.position += new Vector3(0, 0, -move);
            }
            if (Input.GetKey(KeyCode.J))
            {
                CameraGameObject.transform.position += new Vector3(-move, 0, 0);
            }

            if (Time.frameCount % 100 == 0)
            {
                _grassLodManager.UpdateLod(CameraGameObject.transform.position);
            }
            _grassLodManager.UpdateNewGroups();
            _rootInstanceContainer.Draw();
        }