00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef COIN_SOSHAPE_H
00021 #define COIN_SOSHAPE_H
00022
00023 #include <Inventor/nodes/SoSubNode.h>
00024 #include <Inventor/SbMatrix.h>
00025 #include <Inventor/SbVec2s.h>
00026 #include <Inventor/SbBox3f.h>
00027
00028 class SoPrimitiveVertex;
00029 class SoDetail;
00030 class SoPickedPoint;
00031 class SoFaceDetail;
00032 class SoState;
00033 class SoTextureCoordinateElement;
00034 class SbVec2f;
00035 class SoMaterialBundle;
00036
00037
00038 class COIN_DLL_API SoShape : public SoNode {
00039 typedef SoNode inherited;
00040
00041 SO_NODE_ABSTRACT_HEADER(SoShape);
00042
00043 public:
00044 static void initClass(void);
00045
00046 enum TriangleShape {
00047 TRIANGLE_STRIP, TRIANGLE_FAN, TRIANGLES, POLYGON,
00048
00049 QUADS, QUAD_STRIP, POINTS, LINES, LINE_STRIP
00050 };
00051
00052 virtual SbBool affectsState(void) const;
00053
00054 virtual void getBoundingBox(SoGetBoundingBoxAction * action);
00055 virtual void GLRender(SoGLRenderAction * action);
00056 virtual void rayPick(SoRayPickAction * action);
00057 virtual void callback(SoCallbackAction * action);
00058 virtual void computeBBox(SoAction * action, SbBox3f & box,
00059 SbVec3f & center) = 0;
00060 virtual void getPrimitiveCount(SoGetPrimitiveCountAction * action);
00061
00062 static void getScreenSize(SoState * const state, const SbBox3f & boundingbox,
00063 SbVec2s & rectsize);
00064 static float getDecimatedComplexity(SoState * state, float complexity);
00065
00066 protected:
00067 SoShape(void);
00068 virtual ~SoShape();
00069
00070 float getComplexityValue(SoAction * action);
00071 virtual void generatePrimitives(SoAction * action) = 0;
00072 virtual SbBool shouldGLRender(SoGLRenderAction * action);
00073 void beginSolidShape(SoGLRenderAction * action);
00074 void endSolidShape(SoGLRenderAction * action);
00075 void GLRenderBoundingBox(SoGLRenderAction * action);
00076 SbBool shouldPrimitiveCount(SoGetPrimitiveCountAction * action);
00077
00078 SbBool shouldRayPick(SoRayPickAction * const action);
00079 void computeObjectSpaceRay(SoRayPickAction * const action);
00080 void computeObjectSpaceRay(SoRayPickAction * const action,
00081 const SbMatrix & matrix);
00082 virtual SoDetail * createTriangleDetail(SoRayPickAction * action,
00083 const SoPrimitiveVertex * v1,
00084 const SoPrimitiveVertex * v2,
00085 const SoPrimitiveVertex * v3,
00086 SoPickedPoint * pp);
00087 virtual SoDetail * createLineSegmentDetail(SoRayPickAction * action,
00088 const SoPrimitiveVertex * v1,
00089 const SoPrimitiveVertex * v2,
00090 SoPickedPoint * pp);
00091 virtual SoDetail * createPointDetail(SoRayPickAction * action,
00092 const SoPrimitiveVertex * v,
00093 SoPickedPoint * pp);
00094
00095 void invokeTriangleCallbacks(SoAction * const action,
00096 const SoPrimitiveVertex * const v1,
00097 const SoPrimitiveVertex * const v2,
00098 const SoPrimitiveVertex * const v3);
00099 void invokeLineSegmentCallbacks(SoAction * const action,
00100 const SoPrimitiveVertex * const v1,
00101 const SoPrimitiveVertex * const v2);
00102 void invokePointCallbacks(SoAction * const action,
00103 const SoPrimitiveVertex * const v);
00104 void beginShape(SoAction * const action, const TriangleShape shapetype,
00105 SoDetail * const detail = NULL);
00106 void shapeVertex(const SoPrimitiveVertex * const v);
00107 void endShape(void);
00108
00109 void generateVertex(SoPrimitiveVertex * const pv,
00110 const SbVec3f & point,
00111 const SbBool useTexFunc,
00112 const SoTextureCoordinateElement * const tce,
00113 const float s,
00114 const float t,
00115 const SbVec3f & normal);
00116
00117 private:
00118 void rayPickBoundingBox(SoRayPickAction * action);
00119 friend class shapePrimitiveData;
00120 friend class so_generate_prim_private;
00121 };
00122
00123 #endif // !COIN_SOSHAPE_H