X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_geometry.c;h=d12b3f65f83e269dd3753aa8c4c3b0c91900c646;hb=6b8566e1d152df1b58136f3d3b861d2e94bde9df;hp=837b4fb5d114a8e7ca13c6a0acbb6abd059fc655;hpb=2291ef8a2cdae0a2f30952e527fd4363ec31f2a2;p=freeglut diff --git a/src/fg_geometry.c b/src/fg_geometry.c index 837b4fb..d12b3f6 100644 --- a/src/fg_geometry.c +++ b/src/fg_geometry.c @@ -76,6 +76,7 @@ static void fghDrawGeometry(GLenum vertexMode, GLdouble *vertices, GLdouble *nor { glPushAttrib(GL_POLYGON_BIT); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + glDisable(GL_CULL_FACE); } if (1) @@ -165,7 +166,6 @@ static void fghGenerateGeometryWithEdgeFlag(int numFaces, int numEdgePerFaceIn, { int outIdx = i*numEdgePerFaceOut*3+j*3; int vertIdx = vertIndices[faceIdxVertIdx+vertSamps[j]]*3; - printf("%i,",outIdx); vertOut[outIdx ] = vertices[vertIdx ]; vertOut[outIdx+1] = vertices[vertIdx+1]; @@ -178,9 +178,7 @@ static void fghGenerateGeometryWithEdgeFlag(int numFaces, int numEdgePerFaceIn, if (edgeFlagsOut) edgeFlagsOut[i*numEdgePerFaceOut+j] = edgeFlags[j]; } - printf("\n"); } - printf("\n"); } static void fghGenerateGeometry(int numFaces, int numEdgePerFace, GLdouble *vertices, GLubyte *vertIndices, GLdouble *normals, GLdouble *vertOut, GLdouble *normOut) @@ -190,11 +188,6 @@ static void fghGenerateGeometry(int numFaces, int numEdgePerFace, GLdouble *vert /* -- INTERNAL SETUP OF GEOMETRY --------------------------------------- */ -static unsigned int ipow (int x, unsigned int y) -{ - return y==0? 1: y==1? x: (y%2? x: 1) * ipow(x*x, y/2); -} - /* -- stuff that can be cached -- */ /* Cache of input to glDrawArrays */ #define DECLARE_SHAPE_CACHE(name,nameICaps,nameCaps)\ @@ -266,7 +259,84 @@ static GLubyte cube_vi[CUBE_VERT_PER_OBJ] = }; DECLARE_SHAPE_CACHE_DECOMPOSE_TO_TRIANGLE(cube,Cube,CUBE); -/* Icosahedron */ +/* -- Dodecahedron -- */ +/* Magic Numbers: It is possible to create a dodecahedron by attaching two + * pentagons to each face of of a cube. The coordinates of the points are: + * (+-x,0, z); (+-1, 1, 1); (0, z, x ) + * where x = (-1 + sqrt(5))/2, z = (1 + sqrt(5))/2 or + * x = 0.61803398875 and z = 1.61803398875. + */ +#define DODECAHEDRON_NUM_VERT 20 +#define DODECAHEDRON_NUM_FACES 12 +#define DODECAHEDRON_NUM_EDGE_PER_FACE 5 +#define DODECAHEDRON_VERT_PER_OBJ (DODECAHEDRON_NUM_FACES*DODECAHEDRON_NUM_EDGE_PER_FACE) +#define DODECAHEDRON_VERT_PER_OBJ_TRI (DODECAHEDRON_VERT_PER_OBJ+DODECAHEDRON_NUM_FACES*4) /* 4 extra edges per face when drawing pentagons as triangles */ +#define DODECAHEDRON_VERT_ELEM_PER_OBJ (DODECAHEDRON_VERT_PER_OBJ_TRI*3) +/* Vertex Coordinates */ +static GLdouble dodecahedron_v[DODECAHEDRON_NUM_VERT*3] = +{ + 0.0 , 1.61803398875, 0.61803398875, + -1.0 , 1.0 , 1.0 , + -0.61803398875, 0.0 , 1.61803398875, + 0.61803398875, 0.0 , 1.61803398875, + 1.0 , 1.0 , 1.0 , + 0.0 , 1.61803398875, -0.61803398875, + 1.0 , 1.0 , -1.0 , + 0.61803398875, 0.0 , -1.61803398875, + -0.61803398875, 0.0 , -1.61803398875, + -1.0 , 1.0 , -1.0 , + 0.0 , -1.61803398875, 0.61803398875, + 1.0 , -1.0 , 1.0 , + -1.0 , -1.0 , 1.0 , + 0.0 , -1.61803398875, -0.61803398875, + -1.0 , -1.0 , -1.0 , + 1.0 , -1.0 , -1.0 , + 1.61803398875, -0.61803398875, 0.0 , + 1.61803398875, 0.61803398875, 0.0 , + -1.61803398875, 0.61803398875, 0.0 , + -1.61803398875, -0.61803398875, 0.0 +}; +/* Normal Vectors */ +static GLdouble dodecahedron_n[DODECAHEDRON_NUM_FACES*3] = +{ + 0.0 , 0.525731112119, 0.850650808354, + 0.0 , 0.525731112119, -0.850650808354, + 0.0 , -0.525731112119, 0.850650808354, + 0.0 , -0.525731112119, -0.850650808354, + + 0.850650808354, 0.0 , 0.525731112119, + -0.850650808354, 0.0 , 0.525731112119, + 0.850650808354, 0.0 , -0.525731112119, + -0.850650808354, 0.0 , -0.525731112119, + + 0.525731112119, 0.850650808354, 0.0 , + 0.525731112119, -0.850650808354, 0.0 , + -0.525731112119, 0.850650808354, 0.0 , + -0.525731112119, -0.850650808354, 0.0 , +}; + +/* Vertex indices */ +static GLubyte dodecahedron_vi[DODECAHEDRON_VERT_PER_OBJ] = +{ + 0, 1, 2, 3, 4, + 5, 6, 7, 8, 9, + 10, 11, 3, 2, 12, + 13, 14, 8, 7, 15, + + 3, 11, 16, 17, 4, + 2, 1, 18, 19, 12, + 7, 6, 17, 16, 15, + 8, 14, 19, 18, 9, + + 17, 6, 5, 0, 4, + 16, 11, 10, 13, 15, + 18, 1, 0, 5, 9, + 19, 14, 13, 10, 12 +}; +DECLARE_SHAPE_CACHE_DECOMPOSE_TO_TRIANGLE(dodecahedron,Dodecahedron,DODECAHEDRON); + + +/* -- Icosahedron -- */ #define ICOSAHEDRON_NUM_VERT 12 #define ICOSAHEDRON_NUM_FACES 20 #define ICOSAHEDRON_NUM_EDGE_PER_FACE 3 @@ -497,6 +567,11 @@ static GLubyte tetrahedron_vi[TETRAHEDRON_VERT_PER_OBJ] = DECLARE_SHAPE_CACHE(tetrahedron,Tetrahedron,TETRAHEDRON); /* -- Sierpinski Sponge -- */ +static unsigned int ipow (int x, unsigned int y) +{ + return y==0? 1: y==1? x: (y%2? x: 1) * ipow(x*x, y/2); +} + static void fghSierpinskiSpongeGenerate ( int numLevels, GLdouble offset[3], GLdouble scale, GLdouble* vertices, GLdouble* normals ) { int i, j; @@ -591,8 +666,8 @@ static void fghCircleTable(double **sint,double **cost,const int n) } -/* -- INTERNAL DRAWING functions to avoid code duplication ------------- */ -#define DECLARE_INTERNAL_DRAW(vertexMode,name,nameICaps,nameCaps)\ +/* -- INTERNAL DRAWING functions --------------------------------------- */ +#define _DECLARE_INTERNAL_DRAW_DO_DECLARE(name,nameICaps,nameCaps,edgeFlags)\ static void fgh##nameICaps( GLboolean useWireMode )\ {\ if (!name##Cached)\ @@ -600,8 +675,10 @@ static void fghCircleTable(double **sint,double **cost,const int n) fgh##nameICaps##Generate();\ name##Cached = GL_TRUE;\ }\ - fghDrawGeometry(vertexMode,name##_verts,name##_norms,NULL,nameCaps##_VERT_PER_OBJ_TRI,useWireMode);\ + fghDrawGeometry(GL_TRIANGLES,name##_verts,name##_norms,edgeFlags,nameCaps##_VERT_PER_OBJ_TRI,useWireMode);\ } +#define DECLARE_INTERNAL_DRAW(name,nameICaps,nameCaps) _DECLARE_INTERNAL_DRAW_DO_DECLARE(name,nameICaps,nameCaps,NULL) +#define DECLARE_INTERNAL_DRAW_DECOMPOSED_TO_TRIANGLE(name,nameICaps,nameCaps) _DECLARE_INTERNAL_DRAW_DO_DECLARE(name,nameICaps,nameCaps,name##_edgeFlags) static void fghCube( GLdouble dSize, GLboolean useWireMode ) { @@ -626,10 +703,11 @@ static void fghCube( GLdouble dSize, GLboolean useWireMode ) fghDrawGeometry(GL_TRIANGLES,cube_verts,cube_norms,cube_edgeFlags,CUBE_VERT_PER_OBJ_TRI,useWireMode); } -DECLARE_INTERNAL_DRAW(GL_TRIANGLES,icosahedron,Icosahedron,ICOSAHEDRON); -DECLARE_INTERNAL_DRAW(GL_TRIANGLES,octahedron,Octahedron,OCTAHEDRON); -DECLARE_INTERNAL_DRAW(GL_QUADS,rhombicdodecahedron,RhombicDodecahedron,RHOMBICDODECAHEDRON); -DECLARE_INTERNAL_DRAW(GL_TRIANGLES,tetrahedron,Tetrahedron,TETRAHEDRON); +DECLARE_INTERNAL_DRAW_DECOMPOSED_TO_TRIANGLE(dodecahedron,Dodecahedron,DODECAHEDRON); +DECLARE_INTERNAL_DRAW(icosahedron,Icosahedron,ICOSAHEDRON); +DECLARE_INTERNAL_DRAW(octahedron,Octahedron,OCTAHEDRON); +DECLARE_INTERNAL_DRAW_DECOMPOSED_TO_TRIANGLE(rhombicdodecahedron,RhombicDodecahedron,RHOMBICDODECAHEDRON); +DECLARE_INTERNAL_DRAW(tetrahedron,Tetrahedron,TETRAHEDRON); static void fghSierpinskiSponge ( int numLevels, GLdouble offset[3], GLdouble scale, GLboolean useWireMode ) { @@ -1251,112 +1329,6 @@ void FGAPIENTRY glutSolidTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GL glPopMatrix(); } -/* - * - */ -void FGAPIENTRY glutWireDodecahedron( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireDodecahedron" ); - - /* Magic Numbers: It is possible to create a dodecahedron by attaching two pentagons to each face of - * of a cube. The coordinates of the points are: - * (+-x,0, z); (+-1, 1, 1); (0, z, x ) - * where x = (-1 + sqrt(5))/2, z = (1 + sqrt(5))/2 or - * x = 0.61803398875 and z = 1.61803398875. - */ - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( 0.0, 0.525731112119, 0.850650808354 ) ; glVertex3d ( 0.0, 1.61803398875, 0.61803398875 ) ; glVertex3d ( -1.0, 1.0, 1.0 ) ; glVertex3d ( -0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( 0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( 1.0, 1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( 0.0, 0.525731112119, -0.850650808354 ) ; glVertex3d ( 0.0, 1.61803398875, -0.61803398875 ) ; glVertex3d ( 1.0, 1.0, -1.0 ) ; glVertex3d ( 0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -1.0, 1.0, -1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( 0.0, -0.525731112119, 0.850650808354 ) ; glVertex3d ( 0.0, -1.61803398875, 0.61803398875 ) ; glVertex3d ( 1.0, -1.0, 1.0 ) ; glVertex3d ( 0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( -1.0, -1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( 0.0, -0.525731112119, -0.850650808354 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( 0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( 1.0, -1.0, -1.0 ) ; - glEnd () ; - - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( 0.850650808354, 0.0, 0.525731112119 ) ; glVertex3d ( 0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( 1.0, -1.0, 1.0 ) ; glVertex3d ( 1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( 1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( 1.0, 1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( -0.850650808354, 0.0, 0.525731112119 ) ; glVertex3d ( -0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( -1.0, 1.0, 1.0 ) ; glVertex3d ( -1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.0, -1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( 0.850650808354, 0.0, -0.525731112119 ) ; glVertex3d ( 0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( 1.0, 1.0, -1.0 ) ; glVertex3d ( 1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( 1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( 1.0, -1.0, -1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( -0.850650808354, 0.0, -0.525731112119 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( -1.0, 1.0, -1.0 ) ; - glEnd () ; - - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( 0.525731112119, 0.850650808354, 0.0 ) ; glVertex3d ( 1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( 1.0, 1.0, -1.0 ) ; glVertex3d ( 0.0, 1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0, 1.61803398875, 0.61803398875 ) ; glVertex3d ( 1.0, 1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( 0.525731112119, -0.850650808354, 0.0 ) ; glVertex3d ( 1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( 1.0, -1.0, 1.0 ) ; glVertex3d ( 0.0, -1.61803398875, 0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( 1.0, -1.0, -1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( -0.525731112119, 0.850650808354, 0.0 ) ; glVertex3d ( -1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( -1.0, 1.0, 1.0 ) ; glVertex3d ( 0.0, 1.61803398875, 0.61803398875 ) ; glVertex3d ( 0.0, 1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0, 1.0, -1.0 ) ; - glEnd () ; - glBegin ( GL_LINE_LOOP ) ; - glNormal3d ( -0.525731112119, -0.850650808354, 0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875, 0.61803398875 ) ; glVertex3d ( -1.0, -1.0, 1.0 ) ; - glEnd () ; -} - -/* - * - */ -void FGAPIENTRY glutSolidDodecahedron( void ) -{ - FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidDodecahedron" ); - - /* Magic Numbers: It is possible to create a dodecahedron by attaching two pentagons to each face of - * of a cube. The coordinates of the points are: - * (+-x,0, z); (+-1, 1, 1); (0, z, x ) - * where x = (-1 + sqrt(5))/2, z = (1 + sqrt(5))/2 or - * x = 0.61803398875 and z = 1.61803398875. - */ - glBegin ( GL_POLYGON ) ; - glNormal3d ( 0.0, 0.525731112119, 0.850650808354 ) ; glVertex3d ( 0.0, 1.61803398875, 0.61803398875 ) ; glVertex3d ( -1.0, 1.0, 1.0 ) ; glVertex3d ( -0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( 0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( 1.0, 1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( 0.0, 0.525731112119, -0.850650808354 ) ; glVertex3d ( 0.0, 1.61803398875, -0.61803398875 ) ; glVertex3d ( 1.0, 1.0, -1.0 ) ; glVertex3d ( 0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -1.0, 1.0, -1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( 0.0, -0.525731112119, 0.850650808354 ) ; glVertex3d ( 0.0, -1.61803398875, 0.61803398875 ) ; glVertex3d ( 1.0, -1.0, 1.0 ) ; glVertex3d ( 0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( -0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( -1.0, -1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( 0.0, -0.525731112119, -0.850650808354 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( 0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( 1.0, -1.0, -1.0 ) ; - glEnd () ; - - glBegin ( GL_POLYGON ) ; - glNormal3d ( 0.850650808354, 0.0, 0.525731112119 ) ; glVertex3d ( 0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( 1.0, -1.0, 1.0 ) ; glVertex3d ( 1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( 1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( 1.0, 1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( -0.850650808354, 0.0, 0.525731112119 ) ; glVertex3d ( -0.61803398875, 0.0, 1.61803398875 ) ; glVertex3d ( -1.0, 1.0, 1.0 ) ; glVertex3d ( -1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.0, -1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( 0.850650808354, 0.0, -0.525731112119 ) ; glVertex3d ( 0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( 1.0, 1.0, -1.0 ) ; glVertex3d ( 1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( 1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( 1.0, -1.0, -1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( -0.850650808354, 0.0, -0.525731112119 ) ; glVertex3d ( -0.61803398875, 0.0, -1.61803398875 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( -1.0, 1.0, -1.0 ) ; - glEnd () ; - - glBegin ( GL_POLYGON ) ; - glNormal3d ( 0.525731112119, 0.850650808354, 0.0 ) ; glVertex3d ( 1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( 1.0, 1.0, -1.0 ) ; glVertex3d ( 0.0, 1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0, 1.61803398875, 0.61803398875 ) ; glVertex3d ( 1.0, 1.0, 1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( 0.525731112119, -0.850650808354, 0.0 ) ; glVertex3d ( 1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( 1.0, -1.0, 1.0 ) ; glVertex3d ( 0.0, -1.61803398875, 0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( 1.0, -1.0, -1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( -0.525731112119, 0.850650808354, 0.0 ) ; glVertex3d ( -1.61803398875, 0.61803398875, 0.0 ) ; glVertex3d ( -1.0, 1.0, 1.0 ) ; glVertex3d ( 0.0, 1.61803398875, 0.61803398875 ) ; glVertex3d ( 0.0, 1.61803398875, -0.61803398875 ) ; glVertex3d ( -1.0, 1.0, -1.0 ) ; - glEnd () ; - glBegin ( GL_POLYGON ) ; - glNormal3d ( -0.525731112119, -0.850650808354, 0.0 ) ; glVertex3d ( -1.61803398875, -0.61803398875, 0.0 ) ; glVertex3d ( -1.0, -1.0, -1.0 ) ; glVertex3d ( 0.0, -1.61803398875, -0.61803398875 ) ; glVertex3d ( 0.0, -1.61803398875, 0.61803398875 ) ; glVertex3d ( -1.0, -1.0, 1.0 ) ; - glEnd () ; -} - /* -- INTERFACE FUNCTIONS -------------------------------------------------- */ @@ -1384,6 +1356,7 @@ void FGAPIENTRY glutSolidCube( GLdouble dSize ) fghCube( dSize, FALSE ); } +DECLARE_SHAPE_INTERFACE(Dodecahedron); DECLARE_SHAPE_INTERFACE(Icosahedron); DECLARE_SHAPE_INTERFACE(Octahedron); DECLARE_SHAPE_INTERFACE(RhombicDodecahedron);