コード例 #1
0
    public override void OnInspectorGUI()
    {
        GrassGenerator pastoGen = (GrassGenerator)target;

        DrawDefaultInspector();
        if (GUILayout.Button("Generar"))
        {
            pastoGen.generateMesh();
        }
    }
コード例 #2
0
ファイル: BiomePlains.cs プロジェクト: zaoqi-clone/MineCase
        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;
                    }
                }
            }
        }
コード例 #3
0
    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();
    }
コード例 #4
0
 public void RemoveGrass()
 {
     GrassGenerator.RemoveGrass();
 }
コード例 #5
0
 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);
 }
コード例 #6
0
        //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;
        }