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 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)); }
public GpuInstancingGrassSplat(SplatInfo splatInfo, int packId, GpuInstancingGrassInstanceContainer gpuInstancingGrassInstanceContainer) { _splatInfo = splatInfo; _packId = packId; _gpuInstancingGrassInstanceContainer = gpuInstancingGrassInstanceContainer; }
public void SetMesh(Mesh newMesh) { _splatInfo = new SplatInfo(newMesh, _splatInfo.Material); }