

#include <Inventor/Xt/SoXt.h>
#include <Inventor/Xt/viewers/SoXtExaminerViewer.h>
#include <Inventor/nodes/SoSphere.h>
#include <Inventor/nodes/SoTransform.h>
#include <Inventor/nodes/SoDirectionalLight.h>
#include <Inventor/nodes/SoMaterial.h>
#include <Inventor/nodes/SoPerspectiveCamera.h>
#include <Inventor/nodes/SoSeparator.h>

main (int, char **argv)
{
  Widget myWindow = SoXt::init(argv[0]);
  if (myWindow == NULL) 
    exit(1);

  // Contruct material H
  SoMaterial *silver = new SoMaterial;
  silver->ambientColor.setValue (0.20, 0.20, 0.20);
  silver->diffuseColor.setValue (0.60, 0.60, 0.60);
  silver->specularColor.setValue(0.50, 0.50, 0.50);
  silver->shininess = 0.50;

  // Construct material C
  SoMaterial *grey = new SoMaterial;
  grey->ambientColor.setValue (0.22, 0.22, 0.22);
  grey->diffuseColor.setValue (0.48, 0.4, 0.4);
  grey->specularColor.setValue(0.90, 0.94, 0.81);
  grey->shininess = 0.8;

  SoSphere *sphere = new SoSphere;

  // construct hydrogen
  SoSeparator *hydrogen = new SoSeparator;
  SoTransform *hTransform = new SoTransform;
  hTransform->scaleFactor.setValue (0.6, 0.6, 0.6);
  hydrogen->addChild (silver);
  hydrogen->addChild (hTransform);
  hydrogen->addChild (sphere);

  // construct carbon
  SoSeparator *carbon = new SoSeparator;
  carbon->addChild (grey);
  carbon->addChild (sphere);

  // construct CH_2
  SoTransform *upTransform = new SoTransform;
  upTransform->translation.setValue (0.7, 0.7, 0.0);

  SoTransform *downTransform = new SoTransform;
  downTransform->translation.setValue (0.0, -1.4, 0.0);

  SoSeparator *CH2 = new SoSeparator;
  CH2->addChild (carbon);
  CH2->addChild (upTransform);
  CH2->addChild (hydrogen);
  CH2->addChild (downTransform);
  CH2->addChild (hydrogen);

  // construct C_2H_4
  SoTransform *leftTransform = new SoTransform;
  leftTransform->translation.setValue (0.6, 0.0, 0.0);

  SoTransform *rightTransform = new SoTransform;
  rightTransform->translation.setValue (-1.2, 0.0, 0.0);
  rightTransform->scaleFactor.setValue (-1.0, 1.0, 1.0);

  SoSeparator *C2H4 = new SoSeparator;
  C2H4->addChild (leftTransform);
  C2H4->addChild (CH2);
  C2H4->addChild (rightTransform);
  C2H4->addChild (CH2);
  C2H4->ref();

  SoXtExaminerViewer *myViewer = new SoXtExaminerViewer (myWindow);
  myViewer->setSceneGraph (C2H4);
  myViewer->setTitle ("Ethen Inspector");
  myViewer->show ();

  SoXt::show (myWindow);
  SoXt::mainLoop ();
}