// This applet constructs a spinning cube with a time varying color.  It
// illustrates how one can import a geometry, manipulate it, and view it
// with a camera.
//
// Copyright (c) 1997 Microsoft Corporation

import com.ms.dxmedia.*;
import java.net.*;

// This class extends the Model class.  The createModel method in this class
// is where you construct your animation.
class GeometryModel extends Model {

  // Create the animation in the createModel method.
  public void createModel(BvrsToRun blist) {

    // Build up a URL to where the geometry resides (import relative to it).
    URL mediaBase = getImportBase();
    URL geoBase = buildURL(mediaBase, "geometry/");

    // Import a [-1,1]**3 cube, 2 meters in each dimension
    GeometryBvr cubeGeo = importGeometry(buildURL(geoBase, "cube.x"));

    // Spin it around the Z and Y axis.
    cubeGeo = cubeGeo.transform(compose(rotate(yVector3, localTime),
                        rotate(zVector3, mul(localTime, toBvr(1.3)))));

    // Make the color time-varying.
    cubeGeo = cubeGeo.diffuseColor(colorHsl(mul(localTime, toBvr(0.3)),
                             toBvr(0.8), toBvr(0.6)));

    // set a camera by specifying projection point and near clipping plane
    CameraBvr camera = perspectiveCamera(toBvr(5), toBvr(2));

    // render cube into an image
    ImageBvr cubeImg = union(cubeGeo, directionalLight).render(camera);
    // scale the image to fit in viewport, reduce size by 1/35th, about 3cms
    cubeImg = cubeImg.transform(scale2(toBvr(1.0/70.0)));

    // set model to the result.
    setImage(overlay(cubeImg, solidColorImage(blue)));
  }
}

public class Geometry extends DXMApplet {
  public void init() {
    super.init() ;
    setModel (new GeometryModel());
  }
}