예제 #1
0
        public void Start()
        {
            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBillboardMesh(0, 1);

            var normal    = new Vector3(0.5f, 0.5f, 0).normalized;
            var rotationA = Quaternion.LookRotation(normal);
            var transf    = new MyTransformTriplet(
                new Vector3(0, 0, 0),
                rotationA.eulerAngles * Mathf.Deg2Rad,
                new Vector3(1, 1, 1));

            var matrix = transf.ToLocalToWorldMatrix();

            for (int i = 0; i < 360; i += 30)
            {
                CreateObjectDebug(mesh, matrix, i);
            }

            //var transf2 = new MyTransformTriplet(new Vector3(0,0,0), new Vector3(0, 60*Mathf.Deg2Rad, 0), new Vector3(1,1,1)  );
            //var matrix2 = transf2.ToLocalToWorldMatrix();

            //var finalMatrix = matrix * matrix2;

            //go.transform.localPosition = finalMatrix.ExtractPosition();
            //go.transform.rotation = finalMatrix.ExtractRotation();
            //go.transform.localScale = finalMatrix.ExtractScale();
        }
        public void Start(ComputeShaderContainerGameObject computeShaderContainer)
        {
            var commonExecutor       = new CommonExecutorUTProxy();
            var shaderExecutorObject = new UnityThreadComputeShaderExecutorObject();

            var updater =
                new DesignBodySpotUpdater(new DesignBodySpotChangeCalculator(computeShaderContainer,
                                                                             shaderExecutorObject, commonExecutor, HeightDenormalizer.Identity));

            _designBodySpotUpdaterProxy = new DesignBodySpotUpdaterProxy(updater);
            updater.SetChangesListener(new LambdaSpotPositionChangesListener(null, dict =>
            {
                foreach (var pair in dict)
                {
                    _grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value);
                }
            }));
            _designBodySpotUpdaterProxy.StartThreading(() => { });


            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBladeMesh(1);

            var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/Grass.Instanced"));

            instancingMaterial.enableInstancing = true;

            var commonUniforms = new UniformsPack();

            commonUniforms.SetUniform("_BendingStrength", 0.0f);
            commonUniforms.SetUniform("_WindDirection", Vector4.one);

            var instancingContainer = new GpuInstancingVegetationSubjectContainer(
                new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms),
                new GpuInstancingUniformsArrayTemplate(new List <GpuInstancingUniformTemplate>()
            {
                new GpuInstancingUniformTemplate("_Color", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_InitialBendingValue", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantBendingStiffness", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantDirection", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_RandSeed", GpuInstancingUniformType.Float),
            })
                );

            _globalGpuInstancingContainer = new GlobalGpuInstancingContainer();
            var bucketId = _globalGpuInstancingContainer.CreateBucket(instancingContainer);
            GrassGroupsContainer grassGroupsContainer =
                new GrassGroupsContainer(_globalGpuInstancingContainer, bucketId);

            IGrassPositionResolver grassPositionResolver = new SimpleRandomSamplerPositionResolver();

            GrassDetailInstancer grassDetailInstancer = new GrassDetailInstancer();

            _grassGroupsPlanter = new GrassGroupsPlanter(
                grassDetailInstancer, grassPositionResolver, grassGroupsContainer, _designBodySpotUpdaterProxy,
                new LegacyGrass2BladeAspectsGenerator(),
                GrassDebugUtils.TemplatesDictionary, Repositioner.Identity);
        }
예제 #3
0
    public static void GenerateGrass(MeshData meshData, Texture2D texture, MeshData grassColourMeshData, Texture2D grassColourTexture)
    {
        Vector3[] vertices  = meshData.vertices;
        Vector2[] uvs       = meshData.uvs;
        Vector2[] uvsColour = grassColourMeshData.uvs;

        float grassRotationBias = 50f;

        //GameObject MapGenerator = GameObject.Find("MapGenerator");
        //Color standard = MapGenerator.GetComponent<MapGenerator>().regions[2].colour;

        for (int i = 0; i < 5; i++)
        {
            for (int v = 0; v < vertices.Length; v++)
            {
                GrassMeshData grassMeshData = GrassMeshGenerator.GenerateGrassMesh(meshData, v, 0.4f, 0.8f, 0.2f, 2.0f, 0.25f);

                GameObject grass = new GameObject("GrassBlade");

                grass.transform.position = RandomizePosition(vertices[v]);

                Vector3 euler = grass.transform.eulerAngles;


                euler.y = RandomizeRotation(grassRotationBias);


                grass.transform.eulerAngles = euler;
                grass.transform.parent      = GameObject.Find("GrassContainer").transform;

                grass.AddComponent <MeshFilter>();
                grass.AddComponent <MeshRenderer>();
                grass.GetComponent <MeshFilter>().mesh = grassMeshData.CreateMesh();
                MeshRenderer rend = grass.GetComponent <MeshRenderer>();

                Material fieldMaterial = (Material)Resources.Load("Material/FieldTexture", typeof(Material));

                rend.material             = fieldMaterial;
                rend.material.mainTexture = SimulateLighting(fieldMaterial, uvs, v);

                Color standard       = texture.GetPixelBilinear(uvs[v].x, uvs[v].y);
                Color colourMapPixel = grassColourTexture.GetPixelBilinear(uvsColour[v].x, uvsColour[v].y);
                rend.material.color = RandomizeColor(standard, colourMapPixel);

                //Yellow
                // 169 188 34

                /*
                 * green 96 128 56
                 *
                 *
                 *
                 *
                 */
            }
        }
    }
 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;
 }
예제 #5
0
        public void Start2()
        {
            TaskUtils.SetGlobalMultithreading(false);

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


            var generator = new Grass2BillboardGenerator(new UTTextureRendererProxy(new TextureRendererService(
                                                                                        new MultistepTextureRenderer(ComputeShaderContainer), new TextureRendererServiceConfiguration()
            {
                StepSize = new Vector2(10, 10)
            })), new Grass2BillboardGenerator.Grass2BillboardGeneratorConfiguration()
            {
                BillboardSize = new IntVector2(256, 256)
            });

            var tex = generator.GenerateBillboardImageAsync(40, 1).Result;

            tex.filterMode = FilterMode.Point;

            var material = new Material(Shader.Find("Custom/Vegetation/GrassBushBillboard"));

            material.SetTexture("_MainTex", tex);

            for (int x = 0; x < 30; x++)
            {
                for (int y = 0; y < 30; y++)
                {
                    var go = GameObject.CreatePrimitive(PrimitiveType.Capsule);
                    go.transform.localPosition                = new Vector3(x, 0, y);
                    go.GetComponent <MeshFilter>().mesh       = mesh;
                    go.GetComponent <MeshRenderer>().material = material;
                }
            }
        }
        public void Start(ComputeShaderContainerGameObject computeShaderContainer)
        {
            var commonExecutor       = new CommonExecutorUTProxy();
            var shaderExecutorObject = new UnityThreadComputeShaderExecutorObject();

            var updater =
                new DesignBodySpotUpdater(new DesignBodySpotChangeCalculator(computeShaderContainer,
                                                                             shaderExecutorObject, commonExecutor, HeightDenormalizer.Identity));

            _designBodySpotUpdaterProxy = new DesignBodySpotUpdaterProxy(updater);
            updater.SetChangesListener(new LambdaSpotPositionChangesListener(null, dict =>
            {
                foreach (var pair in dict)
                {
                    _grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value);
                }
            }));
            _designBodySpotUpdaterProxy.StartThreading(() => { });


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

            var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/GrassBushBillboard.Instanced"));

            instancingMaterial.enableInstancing = true;

            /// CLAN

            var billboardsFileManger = new Grass2BillboardClanFilesManager();
            var clan        = billboardsFileManger.Load(@"C:\inz\billboards\", new IntVector2(256, 256));
            var singleToDuo = new Grass2BakingBillboardClanGenerator(computeShaderContainer, shaderExecutorObject);
            var bakedClan   = singleToDuo.GenerateBakedAsync(clan).Result;
            ///


            var commonUniforms = new UniformsPack();

            commonUniforms.SetUniform("_BendingStrength", 0.0f);
            commonUniforms.SetUniform("_WindDirection", Vector4.one);

            commonUniforms.SetTexture("_DetailTex", bakedClan.DetailTextureArray);
            commonUniforms.SetTexture("_BladeSeedTex", bakedClan.BladeSeedTextureArray);

            var instancingContainer = new GpuInstancingVegetationSubjectContainer(
                new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms),
                new GpuInstancingUniformsArrayTemplate(new List <GpuInstancingUniformTemplate>()
            {
                new GpuInstancingUniformTemplate("_Color", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_InitialBendingValue", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantBendingStiffness", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantDirection", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_RandSeed", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_ArrayTextureIndex", GpuInstancingUniformType.Float),
            })
                );

            _globalGpuInstancingContainer = new GlobalGpuInstancingContainer();
            var bucketId = _globalGpuInstancingContainer.CreateBucket(instancingContainer);
            GrassGroupsContainer grassGroupsContainer =
                new GrassGroupsContainer(_globalGpuInstancingContainer, bucketId);

            IGrassPositionResolver grassPositionResolver =
                new PoissonDiskSamplerPositionResolver(new MyRange(1.5f * 0.4f * 10, 10 * 2 * 1.3f));
            //IGrassPositionResolver grassPositionResolver = new SimpleRandomSamplerPositionResolver();

            GrassDetailInstancer grassDetailInstancer = new GrassDetailInstancer();


            _grassGroupsPlanter = new GrassGroupsPlanter(
                grassDetailInstancer, grassPositionResolver, grassGroupsContainer, _designBodySpotUpdaterProxy,
                new Grass2BushAspectsGenerator(bakedClan), //todo!
                GrassDebugUtils.BushTemplates, Repositioner.Identity);
        }
예제 #7
0
        public void Start()
        {
            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBladeMesh(1);

            var material = new Material(Shader.Find("Custom/Vegetation/Grass"));

            material.SetFloat("_BendingStrength", 0.2f);
            material.SetFloat("_InitialBendingValue", 0.4f);
            material.SetFloat("_PlantBendingStiffness", 0.3f);
            material.SetVector("_WindDirection", Vector4.one);
            material.SetVector("_PlantDirection", Vector4.one);
            material.SetColor("_Color", Color.green);
            material.SetFloat("_RandSeed", 44.4f);

            var go = GameObject.CreatePrimitive(PrimitiveType.Capsule);

            go.GetComponent <MeshFilter>().mesh       = mesh;
            go.GetComponent <MeshRenderer>().material = material;

            var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/Grass.Instanced"));

            instancingMaterial.enableInstancing = true;


            _globalGpuInstancingContainer = new GlobalGpuInstancingContainer();

            var commonUniforms = new UniformsPack();

            commonUniforms.SetUniform("_BendingStrength", 0.8f);
            commonUniforms.SetUniform("_WindDirection", Vector4.one);

            var instancingContainer = new GpuInstancingVegetationSubjectContainer(
                new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms),
                new GpuInstancingUniformsArrayTemplate(new List <GpuInstancingUniformTemplate>()
            {
                new GpuInstancingUniformTemplate("_Color", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_InitialBendingValue", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantBendingStiffness", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantDirection", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_RandSeed", GpuInstancingUniformType.Float),
            })
                );
            var bucketId = _globalGpuInstancingContainer.CreateBucket(instancingContainer);

            var uniforms = new UniformsPack();

            uniforms.SetUniform("_InitialBendingValue", 0.4f);
            uniforms.SetUniform("_PlantBendingStiffness", 0.3f);
            uniforms.SetUniform("_PlantDirection", Vector4.one);
            uniforms.SetUniform("_Color", Color.green);
            uniforms.SetUniform("_RandSeed", 44.4f);

            var msw = new MyStopWatch();

            msw.StartSegment("AddingClassic");
            for (int x = 0; x < 300; x++)
            {
                for (int y = 0; y < 300; y++)
                {
                    var myTriplet = new MyTransformTriplet(new Vector3(x, 0, y), Vector3.zero, Vector3.one);
                    _globalGpuInstancingContainer.AddInstance(bucketId, myTriplet.ToLocalToWorldMatrix(), uniforms);
                }
            }

            _globalGpuInstancingContainer.StartThread();
            _globalGpuInstancingContainer.FinishUpdateBatch();
            Debug.Log("It took: " + msw.CollectResults());
        }
예제 #8
0
        private GrassGroupsPlanter CreateBushGroupsPlanter(OtherThreadExecutingLocation otherThreadExecutingLocation)
        {
            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBillboardMesh(0, 1);

            var instancingMaterial = new Material(Shader.Find("Custom/Vegetation/GrassBushBillboard.Instanced"));

            instancingMaterial.enableInstancing = true;

            /// CLAN

            var billboardsFileManger = new Grass2BillboardClanFilesManager();
            var clan        = billboardsFileManger.Load(_veConfiguration.Grass2BillboardsPath, new IntVector2(256, 256));
            var singleToDuo = new Grass2BakingBillboardClanGenerator(
                _initializationFields.Retrive <ComputeShaderContainerGameObject>(),
                _initializationFields.Retrive <UnityThreadComputeShaderExecutorObject>());
            var bakedClan = singleToDuo.GenerateBakedAsync(clan).Result;
            ///

            var commonUniforms = new UniformsPack();

            commonUniforms.SetUniform("_BendingStrength", 0.6f);
            commonUniforms.SetUniform("_WindDirection", Vector4.one);

            commonUniforms.SetTexture("_DetailTex", bakedClan.DetailTextureArray);
            commonUniforms.SetTexture("_BladeSeedTex", bakedClan.BladeSeedTextureArray);

            var instancingContainer = new GpuInstancingVegetationSubjectContainer(
                new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms),
                new GpuInstancingUniformsArrayTemplate(new List <GpuInstancingUniformTemplate>()
            {
                new GpuInstancingUniformTemplate("_Color", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_InitialBendingValue", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantBendingStiffness", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantDirection", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_RandSeed", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_ArrayTextureIndex", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_Pointer", GpuInstancingUniformType.Float),
            })
                );

            var globalGpuInstancingContainer = _initializationFields.Retrive <GlobalGpuInstancingContainer>();
            var bucketId = globalGpuInstancingContainer.CreateBucket(instancingContainer);
            GrassGroupsContainer grassGroupsContainer =
                new GrassGroupsContainer(globalGpuInstancingContainer, bucketId);

            IGrassPositionResolver grassPositionResolver =
                new PoissonDiskSamplerPositionResolver(_veConfiguration.BushExclusionRadiusRange);

            GrassDetailInstancer grassDetailInstancer = new GrassDetailInstancer();

            DesignBodySpotUpdaterProxy designBodySpotUpdaterProxy = _initializationFields.Retrive <DesignBodySpotUpdaterProxy>();

            var mediatorSpotUpdater = new ListenerCenteredMediatorDesignBodyChangesUpdater(designBodySpotUpdaterProxy);
            var grassGroupsPlanter  = new GrassGroupsPlanter(
                grassDetailInstancer, grassPositionResolver, grassGroupsContainer, mediatorSpotUpdater,
                new Grass2BushAspectsGenerator(bakedClan), //todo!
                _veConfiguration.BushTemplatesConfiguration, _veConfiguration.VegetationRepositioner);

            mediatorSpotUpdater.SetTargetChangesListener(new LambdaSpotPositionChangesListener(null, dict =>
            {
                otherThreadExecutingLocation.Execute(() =>
                {
                    foreach (var pair in dict)
                    {
                        grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value);
                    }
                    return(TaskUtils.EmptyCompleted());
                });
            }));

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

            rootMediator.AddListener(mediatorSpotUpdater);

            return(grassGroupsPlanter);
        }
예제 #9
0
        private GrassGroupsPlanter CreateGrassGroupsPlanter(OtherThreadExecutingLocation otherThreadExecutingLocation)
        {
            var meshGenerator = new GrassMeshGenerator();
            var mesh          = meshGenerator.GetGrassBladeMesh(1);

            MeshGenerationUtils.SetYBoundsToInfinity(mesh);

            var instancingMaterial = _veConfiguration.ReferencedAssets.GrassMaterial;

            if (_materialCommonPack != null)
            {
                _materialCommonPack.SetToMaterial(instancingMaterial);
            }

            var commonUniforms = new UniformsPack();

            commonUniforms.SetUniform("_BendingStrength", 0.6f);
            commonUniforms.SetUniform("_WindDirection", Vector4.one);

            var gpuInstancerCommonData = new GpuInstancerCommonData(mesh, instancingMaterial, commonUniforms);

            gpuInstancerCommonData.CastShadows = _veConfiguration.GrassCastShadows;
            var instancingContainer = new GpuInstancingVegetationSubjectContainer(
                gpuInstancerCommonData,
                new GpuInstancingUniformsArrayTemplate(new List <GpuInstancingUniformTemplate>()
            {
                new GpuInstancingUniformTemplate("_Color", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_InitialBendingValue", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantBendingStiffness", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_PlantDirection", GpuInstancingUniformType.Vector4),
                new GpuInstancingUniformTemplate("_RandSeed", GpuInstancingUniformType.Float),
                new GpuInstancingUniformTemplate("_Pointer", GpuInstancingUniformType.Float),
            })
                );

            var globalGpuInstancingContainer = _initializationFields.Retrive <GlobalGpuInstancingContainer>();
            var bucketId             = globalGpuInstancingContainer.CreateBucket(instancingContainer);
            var grassGroupsContainer = new GrassGroupsContainer(globalGpuInstancingContainer, bucketId);

            var grassPositionResolver = new SimpleRandomSamplerPositionResolver();

            var grassDetailInstancer = new GrassDetailInstancer();

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

            var mediatorSpotUpdater = new ListenerCenteredMediatorDesignBodyChangesUpdater(designBodySpotUpdaterProxy);

            IGrass2AspectsGenerator grassAspectGenerator;

            if (_veConfiguration.Mode == VegetationMode.Legacy)
            {
                grassAspectGenerator = new LegacyGrass2BladeAspectsGenerator();
            }
            else
            {
                grassAspectGenerator = new EVegetationGrass2BladeAspectsGenerator();
            }

            var grassGroupsPlanter = new GrassGroupsPlanter(
                grassDetailInstancer, grassPositionResolver,
                grassGroupsContainer,
                mediatorSpotUpdater,
                grassAspectGenerator,
                _veConfiguration.GrassTemplates,
                _veConfiguration.VegetationRepositioner);

            mediatorSpotUpdater.SetTargetChangesListener(new LambdaSpotPositionChangesListener(null, dict =>
            {
                otherThreadExecutingLocation.Execute(() =>
                {
                    foreach (var pair in dict)
                    {
                        grassGroupsPlanter.GrassGroupSpotChanged(pair.Key, pair.Value);
                    }
                    return(TaskUtils.EmptyCompleted());
                });
            }));

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

            rootMediator.AddListener(mediatorSpotUpdater);

            return(grassGroupsPlanter);
        }