function Cloud() {
  const viewer = new Cesium.Viewer("cesiumContainer");
  const scene = viewer.scene;
  const position = Cesium.Cartesian3.fromDegrees(-123.0744619, 44.0503706, 50);

  function getColor(colorName) {
    return Cesium.Color[colorName.toUpperCase()];
  }
  // These noise parameters are set to default, but can be changed
  // to produce different cloud results. However, the noise is precomputed,
  // so this cannot be changed dynamically.
  const clouds = scene.primitives.add(
    new Cesium.CloudCollection({
      noiseDetail: 16.0,
      noiseOffset: Cesium.Cartesian3.ZERO,
    })
  );

  const cloudParameters = {
    scaleWithMaximumSize: true,
    scaleX: 25,
    scaleY: 12,
    maximumSizeX: 25,
    maximumSizeY: 12,
    maximumSizeZ: 15,
    renderSlice: true, // if false, renders the entire surface of the ellipsoid
    slice: 0.36,
    brightness: 1.0,
    color: "White",
    colors: ["White", "Red", "Green", "Blue", "Yellow", "Gray"],
  };

  const cloud = clouds.add({
    position: position,
    scale: new Cesium.Cartesian2(
      cloudParameters.scaleX,
      cloudParameters.scaleY
    ),
    maximumSize: new Cesium.Cartesian3(
      cloudParameters.maximumSizeX,
      cloudParameters.maximumSizeY,
      cloudParameters.maximumSizeZ
    ),
    color: getColor(cloudParameters.color),
    slice: cloudParameters.renderSlice ? cloudParameters.slice : -1.0,
    brightness: cloudParameters.brightness,
  });

  Cesium.knockout.track(cloudParameters);
  const toolbar = document.getElementById("toolbar");
  Cesium.knockout.applyBindings(cloudParameters, toolbar);

  Cesium.knockout
    .getObservable(cloudParameters, "scaleWithMaximumSize")
    .subscribe(function (newValue) {
      if (Boolean(newValue)) {
        cloudParameters.scaleX = cloudParameters.maximumSizeX;
        cloudParameters.scaleY = cloudParameters.maximumSizeY;
      }
    });

  Cesium.knockout
    .getObservable(cloudParameters, "scaleX")
    .subscribe(function (newValue) {
      const value = Number(newValue);
      cloud.scale = new Cesium.Cartesian2(value, cloud.scale.y);
    });

  Cesium.knockout
    .getObservable(cloudParameters, "scaleY")
    .subscribe(function (newValue) {
      const value = Number(newValue);
      cloud.scale = new Cesium.Cartesian2(cloud.scale.x, value);
    });

  Cesium.knockout
    .getObservable(cloudParameters, "maximumSizeX")
    .subscribe(function (newValue) {
      const value = Number(newValue);
      cloud.maximumSize = new Cesium.Cartesian3(
        value,
        cloud.maximumSize.y,
        cloud.maximumSize.z
      );
      if (cloudParameters.scaleWithMaximumSize) {
        cloud.scale = new Cesium.Cartesian2(value, cloud.scale.y);
      }
    });

  Cesium.knockout
    .getObservable(cloudParameters, "maximumSizeY")
    .subscribe(function (newValue) {
      const value = Number(newValue);
      cloud.maximumSize = new Cesium.Cartesian3(
        cloud.maximumSize.x,
        value,
        cloud.maximumSize.z
      );
      if (cloudParameters.scaleWithMaximumSize) {
        cloud.scale = new Cesium.Cartesian2(cloud.scale.x, value);
      }
    });

  Cesium.knockout
    .getObservable(cloudParameters, "maximumSizeZ")
    .subscribe(function (newValue) {
      const value = Number(newValue);
      cloud.maximumSize = new Cesium.Cartesian3(
        cloud.maximumSize.x,
        cloud.maximumSize.y,
        value
      );
    });

  Cesium.knockout
    .getObservable(cloudParameters, "renderSlice")
    .subscribe(function (newValue) {
      if (Boolean(newValue)) {
        cloud.slice = Number(cloudParameters.slice);
      } else {
        cloud.slice = -1.0;
      }
    });

  Cesium.knockout
    .getObservable(cloudParameters, "slice")
    .subscribe(function (newValue) {
      cloud.slice = Number(newValue);
    });

  Cesium.knockout
    .getObservable(cloudParameters, "color")
    .subscribe(function (newValue) {
      cloud.color = getColor(newValue);
    });

  Cesium.knockout
    .getObservable(cloudParameters, "brightness")
    .subscribe(function (newValue) {
      cloud.brightness = Number(newValue);
    });

  viewer.camera.lookAt(position, new Cesium.Cartesian3(30, 30, -10));
}

export default Cloud;
