Beispiel #1
0
        public static HeightMap GenerateHeightMap(int width, int height, HeightMapSettings settings, Vector2 sampleCenter)
        {
            float[,] values = Noise.GenerateNoiseMap(width, height, settings.noiseSettings, sampleCenter);

            AnimationCurve heightCurve_threadSafe = new AnimationCurve(settings.heightCurve.keys);
            float          minValue = float.MaxValue;
            float          maxValue = float.MinValue;

            for (int i = 0; i < width; ++i)
            {
                for (int j = 0; j < height; ++j)
                {
                    values[i, j] *= heightCurve_threadSafe.Evaluate(values[i, j]) * settings.heightMultiplier;

                    if (values[i, j] > maxValue)
                    {
                        maxValue = values[i, j];
                    }
                    if (values[i, j] < minValue)
                    {
                        minValue = values[i, j];
                    }
                }
            }

            return(new HeightMap(values, minValue, maxValue));
        }
        public TerrainChunk(Vector2 coords, HeightMapSettings heightMapSettings, MeshSettings meshSettings,
                            LODInfo[] detailLevels, int colliderLODIndex, Transform parent, Transform viewer, Material material)
        {
            this.coord             = coords;
            this.heightMapSettings = heightMapSettings;
            this.meshSettings      = meshSettings;
            this.detailLevels      = detailLevels;
            this.colliderLODIndex  = colliderLODIndex;
            this.viewer            = viewer;
            maxViewDist            = detailLevels[detailLevels.Length - 1].visibleDistThreshold;

            sampleCenter = coords * meshSettings.meshWorldSize / meshSettings.meshScale;
            Vector2 position = coord * meshSettings.meshWorldSize;

            bounds = new Bounds(sampleCenter, Vector2.one * meshSettings.meshWorldSize);

            meshObject            = new GameObject("Terrain Chunk");
            meshRenderer          = meshObject.AddComponent <MeshRenderer>();
            meshCollider          = meshObject.AddComponent <MeshCollider>();
            meshFilter            = meshObject.AddComponent <MeshFilter>();
            meshRenderer.material = material;

            meshObject.transform.position = new Vector3(position.x, 0, position.y);
            meshObject.transform.SetParent(parent, false);
            SetVisible(false);

            lodMeshes = new LODMesh[detailLevels.Length];
            for (int i = 0; i < lodMeshes.Length; ++i)
            {
                lodMeshes[i] = new LODMesh(detailLevels[i].lod);
                lodMeshes[i].updateCallback += UpdateTerrainChunk;
                if (i == colliderLODIndex)
                {
                    lodMeshes[i].updateCallback += UpdateCollisionMesh;
                }
            }
        }