public IGrassSplat AddGrassEntities(GrassEntitiesWithMaterials grassEntitiesWithMaterials)
        {
            var grassInstancesTemplate = _generator.Generate(grassEntitiesWithMaterials);

            var maticesArray  = grassInstancesTemplate.TransformMatices;
            var uniformArrays = grassInstancesTemplate.UniformArrays;

            var newGrassPacks = new List <GrassPack>();

            for (var i = 0; i < Math.Ceiling((float)maticesArray.Length / Constants.MaxInstancesPerPack); i++)
            {
                var elementsToSkipCount = i * Constants.MaxInstancesPerPack;
                var elementsToTakeCount = Math.Min(Constants.MaxInstancesPerPack,
                                                   maticesArray.Length - i * Constants.MaxInstancesPerPack);
                var packMaticesArray          = maticesArray.Skip(elementsToSkipCount).Take(elementsToTakeCount).ToArray();
                MyMaterialPropertyBlock block = new MyMaterialPropertyBlock(elementsToTakeCount);
                foreach (var aUniformArray in uniformArrays)
                {
                    aUniformArray.AddToBlock(block.Block, elementsToSkipCount, elementsToTakeCount);
                }
                newGrassPacks.Add(new GrassPack(packMaticesArray, block));
            }

            var splatInfo = new SplatInfo(grassEntitiesWithMaterials.Mesh, grassEntitiesWithMaterials.Material);

            if (!_grassPacks.ContainsKey(splatInfo))
            {
                _grassPacks.Add(splatInfo, new Dictionary <PackId, List <GrassPack> >());
            }
            lastPackId++;
            _grassPacks[splatInfo][lastPackId] = newGrassPacks;

            return(new GpuInstancingGrassSplat(splatInfo, lastPackId, this));
        }
        public List <GameObject> Generate(GrassEntitiesWithMaterials grassEntitiesWithMaterials)
        {
            var gameObjects = new List <GameObject>();

            foreach (var aGrass in grassEntitiesWithMaterials.Entities)
            {
                var grassInstance = new GameObject("grassInstance");
                grassInstance.AddComponent <MeshFilter>().mesh = grassEntitiesWithMaterials.Mesh;
                grassInstance.transform.localPosition          = aGrass.Position;
                grassInstance.transform.localEulerAngles       = MyMathUtils.RadToDeg(aGrass.Rotation);
                grassInstance.transform.localScale             = aGrass.Scale;
                var rend = grassInstance.AddComponent <MeshRenderer>();
                rend.material = grassEntitiesWithMaterials.Material;

                foreach (var uniform in aGrass.GetFloatUniforms())
                {
                    rend.material.SetFloat(uniform.Name, uniform.Get());
                }
                foreach (var uniform in aGrass.GetVector4Uniforms())
                {
                    rend.material.SetVector(uniform.Name, uniform.Get());
                }

                gameObjects.Add(grassInstance);
            }

            return(gameObjects);
        }
        public GpuInstancingEntitySplat GenerateEntitySplats(GrassEntitiesWithMaterials grassEntitiesWithMaterials,
                                                             GpuInstancingGrassInstanceContainer container)
        {
            GpuGrassInstancesTemplate grassInstancesTemplate = Generate(grassEntitiesWithMaterials);

            var maticesArray  = grassInstancesTemplate.TransformMatices;
            var uniformArrays = grassInstancesTemplate.UniformArrays;

            var newGrassPacks = new List <InstancesPack>();

            for (var i = 0; i < Math.Ceiling((float)maticesArray.Length / MyConstants.MaxInstancesPerPack); i++)
            {
                var elementsToSkipCount = i * MyConstants.MaxInstancesPerPack;
                var elementsToTakeCount = Math.Min(MyConstants.MaxInstancesPerPack,
                                                   maticesArray.Length - i * MyConstants.MaxInstancesPerPack);
                var packMaticesArray          = maticesArray.Skip(elementsToSkipCount).Take(elementsToTakeCount).ToArray();
                MyMaterialPropertyBlock block = new MyMaterialPropertyBlock(elementsToTakeCount);
                foreach (var aUniformArray in uniformArrays)
                {
                    aUniformArray.AddToBlock(block.Block, elementsToSkipCount, elementsToTakeCount);
                }
                newGrassPacks.Add(new InstancesPack(packMaticesArray, block));
            }

            var splatInfo         = new SplatInfo(grassEntitiesWithMaterials.Mesh, grassEntitiesWithMaterials.Material);
            var newGpuEntitySplat = new GpuInstancingEntitySplat(splatInfo, newGrassPacks, container);

            return(newGpuEntitySplat);
        }
Example #4
0
        public IEntitySplat AddGrassEntities(GrassEntitiesWithMaterials grassEntitiesWithMaterials)
        {
            _lastSplatId++;
            var newEntitySplat = new GameObjectEntitySplat(_generator.Generate(grassEntitiesWithMaterials), this,
                                                           _lastSplatId);

            _gameObjectSplats[_lastSplatId] = newEntitySplat;
            return(newEntitySplat);
        }
Example #5
0
        public GpuGrassInstancesTemplate Generate(GrassEntitiesWithMaterials grassEntitiesWithMaterials)
        {
            //var ab = grassEntitiesWithMaterials.Entities.Select(c => c.InitialBendingValue).ToArray(); //todo
            List <GrassShaderUniform <float> >   floatUniforms   = new List <GrassShaderUniform <float> >();
            List <GrassShaderUniform <Vector4> > vector4Uniforms = new List <GrassShaderUniform <Vector4> >();

            foreach (var entity in grassEntitiesWithMaterials.Entities)
            {
                floatUniforms.AddRange(entity.GetFloatUniforms());
                vector4Uniforms.AddRange(entity.GetVector4Uniforms());
            }

            List <IUniformArray> uniformArrays =
                vector4Uniforms.GroupBy(c => c.Name).Select(c => new UniformArray <Vector4>(c.ToArray())).Cast <IUniformArray>().Union(
                    floatUniforms.GroupBy(c => c.Name).Select(c => new UniformArray <float>(c.ToArray())).Cast <IUniformArray>()).ToList();

            return(new GpuGrassInstancesTemplate(
                       grassEntitiesWithMaterials.Entities.Select(c => c.LocalToWorldMatrix).ToArray(), uniformArrays));
        }
Example #6
0
 public IGrassSplat AddGrassEntities(GrassEntitiesWithMaterials grassEntitiesWithMaterials)
 {
     return(Containers[grassEntitiesWithMaterials.ContainerType].AddGrassEntities(grassEntitiesWithMaterials));
 }
Example #7
0
 public IGrassSplat AddGrassEntities(GrassEntitiesWithMaterials grassEntitiesWithMaterials)
 {
     _lastSplatId++;
     _gameObjectSplats[_lastSplatId] = _generator.Generate(grassEntitiesWithMaterials);
     return(new GameObjectGrassSplat(_lastSplatId, this));
 }