// Constructor
 public Cloud(Stage stage, string label, string meshFile, int nClouds)
     : base(stage, label, meshFile)
 {
     random = new Random();
     // add nClouds random cloud instances
     for (int i = 0; i < nClouds; i++)
     {
         int x = (0 + random.Next(512)) * stage.Spacing;          // 128 .. 384
         int z = (0 + random.Next(512)) * stage.Spacing;
         addObject(
             new Vector3(x, stage.surfaceHeight(x, z) + 4000, z),
             new Vector3(0, 1, 0), (random.Next(5)) * 0.01f,
             new Vector3(4 + random.Next(3), random.Next(4) + 1, 3 + random.Next(2)));
     }
 }
        private Vector3 corner(Vector3 vector, int i)           // corner calculations for lerping
        {
            int     x_spacing = 0;
            int     z_spacing = 0;
            Vector3 Base      = new Vector3(
                vector.X - (vector.X % stage.Terrain.Spacing),
                stage.surfaceHeight(vector.X - (vector.X % stage.Terrain.Spacing),
                                    vector.Z - (vector.Z % stage.Terrain.Spacing)), vector.Z - (vector.Z % stage.Terrain.Spacing));

            if (i % 2 == 1)
            {
                x_spacing = stage.Terrain.Spacing;
            }
            if (i > 1)
            {
                z_spacing = stage.Terrain.Spacing;
            }

            return(new Vector3(
                       Base.X + x_spacing,
                       stage.surfaceHeight(Base.X + x_spacing, Base.Z + z_spacing),
                       Base.Z + z_spacing
                       ));
        }