/*
*
* 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 5, example 1.
*
* This example builds an obelisk using the Face Set node.
*------------------------------------------------------------*/
#include <stdlib.h>
#include <Inventor/Xt/SoXt.h>
#include <Inventor/Xt/viewers/SoXtExaminerViewer.h>
#include <Inventor/nodes/SoCoordinate3.h>
#include <Inventor/nodes/SoFaceSet.h>
#include <Inventor/nodes/SoMaterial.h>
#include <Inventor/nodes/SoNormal.h>
#include <Inventor/nodes/SoNormalBinding.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoVertexProperty.h>
//////////////////////////////////////////////////////////////
// CODE FOR The Inventor Mentor STARTS HERE
// Eight polygons. The first four are triangles
// The second four are quadrilaterals for the sides.
static float vertices[28][3] =
{
{ 0, 30, 0}, {-2,27, 2}, { 2,27, 2}, //front tri
{ 0, 30, 0}, {-2,27,-2}, {-2,27, 2}, //left tri
{ 0, 30, 0}, { 2,27,-2}, {-2,27,-2}, //rear tri
{ 0, 30, 0}, { 2,27, 2}, { 2,27,-2}, //right tri
{-2, 27, 2}, {-4,0, 4}, { 4,0, 4}, { 2,27, 2}, //front quad
{-2, 27,-2}, {-4,0,-4}, {-4,0, 4}, {-2,27, 2}, //left quad
{ 2, 27,-2}, { 4,0,-4}, {-4,0,-4}, {-2,27,-2}, //rear quad
{ 2, 27, 2}, { 4,0, 4}, { 4,0,-4}, { 2,27,-2} //right quad
};
// Number of vertices in each polygon:
static int32_t numvertices[8] = {3, 3, 3, 3, 4, 4, 4, 4};
// Normals for each polygon:
static float norms[8][3] =
{
{0, .555, .832}, {-.832, .555, 0}, //front, left tris
{0, .555, -.832}, { .832, .555, 0}, //rear, right tris
{0, .0739, .9973}, {-.9972, .0739, 0},//front, left quads
{0, .0739, -.9973}, { .9972, .0739, 0},//rear, right quads
};
SoSeparator *
makeObeliskFaceSet()
{
SoSeparator *obelisk = new SoSeparator();
obelisk->ref();
#ifdef IV_STRICT
// This is the preferred code for Inventor 2.1
// Using the new SoVertexProperty node is more efficient
SoVertexProperty *myVertexProperty = new SoVertexProperty;
// Define the normals used:
myVertexProperty->normal.setValues(0, 8, norms);
myVertexProperty->normalBinding = SoNormalBinding::PER_FACE;
// Define material for obelisk
myVertexProperty->orderedRGBA.setValue(SbColor(.4,.4,.4).getPackedValue());
// Define coordinates for vertices
myVertexProperty->vertex.setValues(0, 28, vertices);
// Define the FaceSet
SoFaceSet *myFaceSet = new SoFaceSet;
myFaceSet->numVertices.setValues(0, 8, numvertices);
myFaceSet->vertexProperty.setValue(myVertexProperty);
obelisk->addChild(myFaceSet);
#else
// Define the normals used:
SoNormal *myNormals = new SoNormal;
myNormals->vector.setValues(0, 8, norms);
obelisk->addChild(myNormals);
SoNormalBinding *myNormalBinding = new SoNormalBinding;
myNormalBinding->value = SoNormalBinding::PER_FACE;
obelisk->addChild(myNormalBinding);
// Define material for obelisk
SoMaterial *myMaterial = new SoMaterial;
myMaterial->diffuseColor.setValue(.4, .4, .4);
obelisk->addChild(myMaterial);
// Define coordinates for vertices
SoCoordinate3 *myCoords = new SoCoordinate3;
myCoords->point.setValues(0, 28, vertices);
obelisk->addChild(myCoords);
// Define the FaceSet
SoFaceSet *myFaceSet = new SoFaceSet;
myFaceSet->numVertices.setValues(0, 8, numvertices);
obelisk->addChild(myFaceSet);
#endif
obelisk->unrefNoDelete();
return obelisk;
}
// CODE FOR The Inventor Mentor ENDS HERE
//////////////////////////////////////////////////////////////
int
main(int, char **argv)
{
// Initialize Inventor and Xt
Widget myWindow = SoXt::init(argv[0]);
if (myWindow == NULL) exit(1);
SoSeparator *root = new SoSeparator;
root->ref();
root->addChild(makeObeliskFaceSet());
SoXtExaminerViewer *myViewer =
new SoXtExaminerViewer(myWindow);
myViewer->setSceneGraph(root);
myViewer->setTitle("Face Set: Obelisk");
myViewer->show();
myViewer->viewAll();
SoXt::show(myWindow);
SoXt::mainLoop();
}