/*
 *
 *  Copyright (C) 2000 Silicon Graphics, Inc.  All Rights Reserved. 
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  Further, this software is distributed without any warranty that it is
 *  free of the rightful claim of any third person regarding infringement
 *  or the like.  Any license provided herein, whether implied or
 *  otherwise, applies only to this software file.  Patent licenses, if
 *  any, provided herein do not apply to combinations of this program with
 *  other software, or any other product whatsoever.
 * 
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
 *  Mountain View, CA  94043, or:
 * 
 *  http://www.sgi.com 
 * 
 *  For further information regarding this notice, see: 
 * 
 *  http://oss.sgi.com/projects/GenInfo/NoticeExplan/
 *
 */

/*--------------------------------------------------------------
 *  This is an example from the Inventor Mentor,
 *  chapter 11, example 2.
 *
 *  Example of creatinge a scene graph by reading from a string.
 *  Create a dodecahedron, made of an IndexedFaceSet.  
 *------------------------------------------------------------*/

#include <cstdlib>
#include <cstring>

#include <Inventor/SoDB.h>
#include <Inventor/SoInput.h>
#include <Inventor/Xt/SoXt.h>
#include <Inventor/Xt/viewers/SoXtExaminerViewer.h>
#include <Inventor/nodes/SoSeparator.h>

/////////////////////////////////////////////////////////////
// CODE FOR The Inventor Mentor STARTS HERE

// Reads a dodecahedron from the following string: 
// (Note: ANSI compilers automatically concatenate 
// adjacent string literals together, so the compiler sees 
// this as one big string)

static char *dodecahedron =
   "Separator {"
   "   Normal {"
   "      vector ["
   "         0.553341 0 0.832955, 0.832955 0.553341 0,"
   "         0.832955 -0.553341 0, 0 -0.832955 0.553341,"
   "         -0.553341 0 0.832955, 0 0.832955 0.553341,"
   "         0 0.832955 -0.553341, -0.832955 0.553341 0,"
   "         -0.832955 -0.553341 0, 0 -0.832955 -0.553341,"
   "         0.553341 0 -0.832955, -0.553341 0 -0.832955,"
   "      ]"
   "   }"
   "   NormalBinding { value PER_FACE }"
   "   Material {"
   "      diffuseColor ["
   "         1  0  0,   0 1  0,   0  0 1,   0  1  1,"
   "         1  0  1,  .5 1  0,  .5  0 1,  .5  1  1,"
   "         1 .3 .7,  .3 1 .7,  .3 .7 1,  .5 .5 .8"
   "      ]"
   "   }"
   "   MaterialBinding { value PER_FACE }"
   "   Coordinate3 {"
   "      point ["
   "         1.7265 0 0.618,    1 1 1,"
   "         0 0.618 1.7265,    0 -0.618 1.7265,"
   "         1 -1 1,    -1 -1 1,"
   "         -0.618 -1.7265 0,    0.618 -1.7265 0,"
   "         1 -1 -1,    1.7265 0 -0.618,"
   "         1 1 -1,    0.618 1.7265 0,"
   "         -0.618 1.7265 0,    -1 1 1,"
   "         -1.7265 0 0.618,    -1.7265 0 -0.618,"
   "         -1 -1 -1,    0 -0.618 -1.7265,"
   "         0 0.618 -1.7265,    -1 1 -1"
   "      ]"
   "   }"
   "   IndexedFaceSet {"
   "      coordIndex ["
   "         1, 2, 3, 4, 0, -1,  0, 9, 10, 11, 1, -1,"
   "         4, 7, 8, 9, 0, -1,  3, 5, 6, 7, 4, -1,"
   "         2, 13, 14, 5, 3, -1,  1, 11, 12, 13, 2, -1,"
   "         10, 18, 19, 12, 11, -1,  19, 15, 14, 13, 12, -1,"
   "         15, 16, 6, 5, 14, -1,  8, 7, 6, 16, 17, -1,"
   "         9, 8, 17, 18, 10, -1,  18, 17, 16, 15, 19, -1,"
   "      ]"
   "   }"
   "}";

// Routine to create a scene graph representing a dodecahedron
SoNode *
makeDodecahedron()
{
   // Read from the string.
   SoInput in;
   in.setBuffer(dodecahedron, strlen(dodecahedron));

   SoNode *result;
   SoDB::read(&in, result);

   return result;
}

// CODE FOR The Inventor Mentor ENDS HERE
/////////////////////////////////////////////////////////////

int
main(int argc, char **argv)
{
   // Initialize Inventor and Xt
   Widget myWindow = SoXt::init(argv[0]);
   if (myWindow == NULL) exit(1);

   SoNode *root = makeDodecahedron();
   root->ref();

   SoXtExaminerViewer *myViewer = 
            new SoXtExaminerViewer(myWindow);
   myViewer->setSceneGraph(root);
   myViewer->setTitle("String Reader");
   myViewer->show();

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