Example #1
0
        public VoxelChunk GenerateChunk(VoxelChunk chunk, VoxelWorld world)
        {
            var chunkPos = chunk.WorldPosition * VoxelWorld.Configuration.ChunkSegmentSize;

            for (int x = 0; x < VoxelWorld.Configuration.ChunkSegmentSize; x++)
            {
                for (int z = 0; z < VoxelWorld.Configuration.ChunkSegmentSize; z++)
                {
                    var worldPos = chunkPos + new Int2(x, z);

                    var turbX = TurbX.GetValue(worldPos.X / 48f, worldPos.Y / 48f) * 12f;
                    var turbY = TurbY.GetValue(worldPos.X / 48f, worldPos.Y / 48f) * 12f;

                    var worldPosTurb = new Vector2(worldPos.X + turbX, worldPos.Y + turbY);

                    var alt_base  = GetInterpolated(worldPos, (cb) => cb.AltBase);
                    var chaos     = GetInterpolated(worldPos, (cb) => cb.Chaos);
                    var temp      = GetInterpolated(worldPos, (cb) => cb.Temp);
                    var humidity  = GetInterpolated(worldPos, (cb) => cb.Humidity);
                    var rockiness = GetInterpolated(worldPos, (cb) => cb.Rockiness);

                    var river = 0;

                    var riverless_alt = GetInterpolated(worldPos, (cb) => cb.Alt) +
                                        Mathf.Abs(Small.GetValue(worldPosTurb.X / 150f, worldPosTurb.Y / 150f)) *
                                        Mathf.Max(chaos, 0.025f) * 64f +
                                        Mathf.Abs(Small.GetValue(worldPosTurb.X / 450f, worldPosTurb.Y / 450f)) *
                                        (1f - chaos) * (1f - humidity) * 94f;

                    var chunkBase = GetChunkBase(worldPos);

                    var is_cliffs   = chunkBase.IsCliffs;
                    var near_cliffs = chunkBase.NearCliffs;

                    var alt = riverless_alt - (Mathf.Cos((1 - river) * Mathf.Pi) + 1) * 0.5f * 24f;
                    while (alt > 0)
                    {
                        alt--;
                        chunk.SetBlock(x, (int)alt, z, new Block {
                            Color = Color32.White, IsTransparent = false, Id = 0
                        }, false, false);
                    }
                }
            }

            world.UpdateQueue.Enqueue(new ReMeshChunk(chunk));
            world.UpdateQueue.Enqueue(new ReMeshChunk(chunkPos + new Int2(0, -1)));
            world.UpdateQueue.Enqueue(new ReMeshChunk(chunkPos + new Int2(0, 1)));
            world.UpdateQueue.Enqueue(new ReMeshChunk(chunkPos + new Int2(-1, 0)));
            world.UpdateQueue.Enqueue(new ReMeshChunk(chunkPos + new Int2(1, 0)));
            return(chunk);
        }
 public override double Execute(double x, double y, double z, CallableNode flow)
 {
     return(noise.GetValue(x * frequency, z * frequency) * scale);
 }