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); }
public IEntitySplat AddGrassEntities(GrassEntitiesWithMaterials grassEntitiesWithMaterials) { _lastSplatId++; var newEntitySplat = new GameObjectEntitySplat(_generator.Generate(grassEntitiesWithMaterials), this, _lastSplatId); _gameObjectSplats[_lastSplatId] = newEntitySplat; return(newEntitySplat); }
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)); }
public IGrassSplat AddGrassEntities(GrassEntitiesWithMaterials grassEntitiesWithMaterials) { return(Containers[grassEntitiesWithMaterials.ContainerType].AddGrassEntities(grassEntitiesWithMaterials)); }
public IGrassSplat AddGrassEntities(GrassEntitiesWithMaterials grassEntitiesWithMaterials) { _lastSplatId++; _gameObjectSplats[_lastSplatId] = _generator.Generate(grassEntitiesWithMaterials); return(new GameObjectGrassSplat(_lastSplatId, this)); }