public override void OnInspectorGUI() { GrassGenerator pastoGen = (GrassGenerator)target; DrawDefaultInspector(); if (GUILayout.Button("Generar")) { pastoGen.generateMesh(); } }
private void GenGrass(IWorld world, IGrainFactory grainFactory, ChunkColumnCompactStorage chunk, Random random, BlockWorldPos pos) { int grassMaxNum = random.Next(_grassPerChunk); GrassGenerator generator = new GrassGenerator(); for (int grassNum = 0; grassNum < grassMaxNum; ++grassNum) { int x = random.Next(16); int z = random.Next(16); for (int y = 255; y >= 1; --y) { if (!chunk[x, y, z].IsAir()) { generator.Generate(world, grainFactory, chunk, this, random, new BlockWorldPos(pos.X + x, y + 1, pos.Z + z)); break; } } } }
void Awake() { //GenMathData(); sizeBuffer = new ComputeBuffer(6, sizeof(float)); float[] sizeBufferData = new float[6]; sizeBuffer.SetData(sizeBufferData); Shader.SetGlobalBuffer("sizeBuffer", sizeBuffer); //地形 terrainBuilder = new TerrainBuilder(heightMap, terrainHeight, terrainMat); GameObject terrain = GameObject.Find("terrain"); if (!terrain) { terrainBuilder.BuildTerrain(transform); } //视锥体 frustumCalc = new FrustumCalculation(calcShader, terrainBuilder); //草叶 grassGen = new GrassGenerator(grassDensityMap, grassAmountPerTile, pregenerateGrassAmount, grassMaterial, TerrainBuilder.PATCH_SIZE); grassMesh = grassGen.generateGrassTile(); grassGen.PregenerateGrassInfo(); //terrain data buffer Texture terrainTex = terrainBuilder.GetTerrainHeightTexture(); Texture densityTex = grassGen.GetTerrainDensityTexture(); Shader.SetGlobalTexture("terrainHeightTex", terrainTex); frustumCalc.SetTextureFromGlobal("terrainHeightTex"); grassMaterial.SetTexture("terrainDensityTex", densityTex); Shader.SetGlobalFloat("terrainHeight", terrainHeight); frustumCalc.SetFloat("terrainHeight", terrainHeight); grassMaterial.SetInt("grassAmountPerTile", grassAmountPerTile); grassMaterial.SetInt("pregenerateGrassAmount", pregenerateGrassAmount); argsBuffer = new ComputeBuffer(1, sizeof(uint) * 5, ComputeBufferType.IndirectArguments); counterBuffer = new ComputeBuffer(1, sizeof(uint), ComputeBufferType.Counter); SetShadowTexture(); }
public void RemoveGrass() { GrassGenerator.RemoveGrass(); }
public void DrawGrass(MeshData meshData, Texture2D texture, MeshData grassColourMeshData, Texture2D grassColourTexture) { DrawMesh(meshData, texture); meshRenderer.sharedMaterial = (Material)Resources.Load("Material/FieldTexture", typeof(Material)); GrassGenerator.GenerateGrass(meshData, texture, grassColourMeshData, grassColourTexture); }
//public MapMagic.GeneratorsAsset mapMagicGens; #endif public void Generate(Data.Area area, Func <float, bool> stop = null) { if (area.pinned) { return; } change = false; if (stop != null && stop(0)) { return; } //special case for preserving a demo scene on generator change // if (area.coord.x==0 && area.coord.z==0) return; Data.Area savedArea = null; if (leaveDemoUntouched && area.coord.x == 0 && area.coord.z == 0) { savedArea = (Data.Area)area.Clone(); } if (generatorType == GeneratorType.Planar) { area.ClearLand(); area.ClearObjects(); area.ClearGrass(); Matrix matrix = new Matrix(area.rect); planarGen.Generate(matrix, stop); area.AddLayer(matrix, planarGen.blockType, heightFactor: 1, noise: null); } if (generatorType == GeneratorType.Noise) { area.ClearLand(); area.ClearObjects(); area.ClearGrass(); Noise noise = new Noise(123, permutationCount: 512); //random to floor floats Matrix noiseMatrix = new Matrix(area.rect); if (stop != null && stop(0)) { return; } if (noiseGen.enabled) { noiseGen.Generate(noiseMatrix, seed, stop); } if (stop != null && stop(0)) { return; } if (curveGen.enabled) { curveGen.Generate(noiseMatrix, stop); } if (stop != null && stop(0)) { return; } area.AddLayer(noiseMatrix, noiseGen.blockType, heightFactor: heightFactor, noise: noise); //TODO: set block types instead of magical numbers if (slopeGen.enabled) { if (stop != null && stop(0)) { return; } Matrix slopeMatrix = slopeGen.Generate(noiseMatrix, stop); area.PaintLayer(slopeMatrix, slopeGen.blockType, noise: noise, paintThickness: slopeGen.thickness); } if (cavityGen.enabled) { if (stop != null && stop(0)) { return; } Matrix cavityMatrix = cavityGen.Generate(noiseMatrix, stop); area.PaintLayer(cavityMatrix, cavityGen.blockType, noise: noise, paintThickness: cavityGen.thickness); } Matrix blurMatrix; if (blurGen.enabled) { if (stop != null && stop(0)) { return; } blurMatrix = blurGen.Generate(noiseMatrix, stop); blurMatrix.Max(noiseMatrix); area.ClampAppendLayer(blurMatrix, blurGen.blockType, noise: noise, heightFactor: heightFactor); } else { blurMatrix = noiseMatrix; } if (stainsGen.enabled) { Matrix matrix = area.GetSoilMatrix(stainsGen.soilOpacity); //Matrix stains = new Matrix(area.rect); stainsGen.Generate(matrix, seed, stop); area.PaintLayer(matrix, stainsGen.blockType, noise: noise, paintThickness: stainsGen.thickness); } if (noiseGenB.enabled) { Matrix matrix = new Matrix(area.rect); noiseGenB.Generate(matrix, seed, stop); area.SetLayer(matrix, null, noiseGenB.blockType, heightFactor: heightFactor, noise: noise); } if (scatterGen.enabled) { if (stop != null && stop(0)) { return; } SpatialHash spatialHash = new SpatialHash(new Vector2(area.rect.offset.x, area.rect.offset.z), area.rect.size.x, 16); Matrix soil = area.GetSoilMatrix(scatterGen.soilOpacity); scatterGen.Generate(spatialHash, seed, soil); foreach (SpatialObject obj in spatialHash.AllObjs()) { int x = (int)(obj.pos.x + 0.5f); int z = (int)(obj.pos.y + 0.5f); int y = (int)((obj.height + blurMatrix[x, z]) * heightFactor); area.AddObject(new CoordDir(x, y, z), (short)scatterGen.blockType); } } for (int g = 0; g < grassGens.gens.Length; g++) { GrassGenerator grassGen = grassGens.gens[g]; //if (grassGen.enabled) { if (stop != null && stop(0)) { return; } Matrix grassMatrix = area.GetSoilMatrix(grassGen.soilOpacity); grassGen.Generate(grassMatrix, seed); area.SetGrassLayer(grassMatrix, (byte)grassGen.grassType, 1, noise); } } } else if (generatorType == GeneratorType.Heightmap) { area.ClearLand(); area.ClearObjects(); area.ClearGrass(); Noise noise = new Noise(123, permutationCount: 512); //random to floor floats Matrix matrix = new Matrix(area.rect); if (stop != null && stop(0)) { return; } if (standaloneHeightGen.enabled) { standaloneHeightGen.Generate(matrix, seed, stop); } area.AddLayer(matrix, noiseGen.blockType, heightFactor: heightFactor, noise: noise); //TODO: set block types instead of magical numbers } else if (generatorType == GeneratorType.MapMagic) { #if MAPMAGIC if (stop != null && stop(0)) { return; } if (area.results == null) { area.results = new MapMagic.Chunk.Results(); } //MapMagic.Chunk.Size size = new MapMagic.Chunk.Size(area.rect.size.x,area.rect.size.x,heightFactor); if (stop != null && stop(0)) { return; } if (mapMagicGens != null) { //mapMagicGens.Calculate(area.rect.offset.x, area.rect.offset.z, area.rect.size.x, area.results, new MapMagic.Chunk.Size(area.rect.size.x,area.rect.size.x,heightFactor), seed, stop); mapMagicGens.Generate(area.results, area.rect.offset.x, area.rect.offset.z, area.rect.size.x, area.rect.size.x, heightFactor, seed, stop); } else { area.ClearLand(); area.ClearObjects(); area.ClearGrass(); } #else area.ClearLand(); area.ClearObjects(); area.ClearGrass(); #endif } if (stop != null && stop(0)) { return; } if (removeThinLayers) { area.RemoveThinLayers(minLayerThickness); } if (stop != null && stop(0)) { return; } if (polish) { area.Polish(); } //special case for preserving a demo scene on generator change if (leaveDemoUntouched && area.coord.x == 0 && area.coord.z == 0) { Matrix mask = new Matrix(new CoordRect(0, 0, area.lines.Length, area.lines.Length)); for (int x = 0; x < mask.rect.size.x; x++) { for (int z = 0; z < mask.rect.size.z; z++) { int distFromEdge = Mathf.Min(x, mask.rect.size.x - x, z, mask.rect.size.z - z); mask[x, z] = Mathf.Clamp01(distFromEdge / 50f); } } Matrix maskInverted = (Matrix)mask.Clone(); maskInverted.InvertOne(); area.MixAreas(new Data.Area[] { (Data.Area)area.Clone(), savedArea }, new Matrix[] { maskInverted, mask }); area.objects = savedArea.objects; } //area.generated = true; //area.serializable = true; }