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));
        }
예제 #2
0
 public GpuInstancingEntitySplat(SplatInfo splatInfo, List <InstancesPack> GrassPacks,
                                 GpuInstancingGrassInstanceContainer gpuInstancingGrassInstanceContainer, int?splatId = null)
 {
     _splatInfo  = splatInfo;
     _grassPacks = GrassPacks;
     _gpuInstancingGrassInstanceContainer = gpuInstancingGrassInstanceContainer;
     _splatId = splatId;
 }
 public void RemoveSplat(SplatInfo splatInfo, int packId)
 {
     _grassPacks[splatInfo].Remove(packId);
 }
 protected bool Equals(SplatInfo other)
 {
     return(Equals(_mesh, other._mesh) && Equals(_material, other._material));
 }
예제 #5
0
 public GpuInstancingGrassSplat(SplatInfo splatInfo, int packId, GpuInstancingGrassInstanceContainer gpuInstancingGrassInstanceContainer)
 {
     _splatInfo = splatInfo;
     _packId    = packId;
     _gpuInstancingGrassInstanceContainer = gpuInstancingGrassInstanceContainer;
 }
예제 #6
0
 public void SetMesh(Mesh newMesh)
 {
     _splatInfo = new SplatInfo(newMesh, _splatInfo.Material);
 }