00001 #ifndef _PRIMITIVE_ACCUMULATOR_H_
00002 #define _PRIMITIVE_ACCUMULATOR_H_
00003
00004 #include "fv_inc.h"
00005 #include "BBox3D.h"
00006 #include "RenderParams.h"
00007 #include "MathHelper.h"
00008
00009 #include <string>
00010 #include <vector>
00011
00012
00013 namespace FemViewer {
00014
00015 using namespace fvmath;
00016
00017
00018
00019
00020
00021 class PrimitiveAccumulator
00022 {
00023 public:
00024
00025 PrimitiveAccumulator (const bool pCreateSimplified);
00026 ~PrimitiveAccumulator();
00027
00028 void AddArrow(const Vec3D& p1,const Vec3D& p2,
00029 const float tipprop, const int nrpolygons);
00030
00031 void AddArrowColored(const Vec3D& p1, const ColorRGB& col1,
00032 const Vec3D& p2, const ColorRGB& col2,
00033 const float tipprop, const int nrpolygons);
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 void AddLine(const Vec3D& p1, const Vec3D& p2);
00047
00048 void AddLineColored(const Vec3D& p1, const ColorRGB& col1,
00049 const Vec3D& p2, const ColorRGB& col2);
00050
00051 void AddPoint(const Vec3D& pt);
00052
00053 void AddPointColored(const Vec3D& pt, const ColorRGB& col);
00054
00055 void AddQuad(const Vec3D& p1, const Vec3D& p2,
00056 const Vec3D& p3, const Vec3D& p4);
00057
00058 void AddQuadColored(const Vec3D& p1, const ColorRGB& col1,
00059 const Vec3D& p2, const ColorRGB& col2,
00060 const Vec3D& p3, const ColorRGB& col3,
00061 const Vec3D& p4, const ColorRGB& col4);
00062
00063 void AddTriangle(const Vec3D& p1, const Vec3D& p2,
00064 const Vec3D& p3);
00065
00066 void AddTriangleColored(const Vec3D& p1, const ColorRGB& col1,
00067 const Vec3D& p2, const ColorRGB& col2,
00068 const Vec3D& p3, const ColorRGB& col3);
00069
00070 void AddTriangleNormalColored(const float nv[], const float p1[], const float p2[], const float p3[],
00071 const ColorRGB& col1, const ColorRGB& col2, const ColorRGB& col3);
00072
00073 void DumpCharacteristics(std::ostream& pOstream,
00074 const std::string& pIndentation,
00075 const Matrix<float>& pTransformation);
00076
00077 const BBox3D& GetBBox3D() const;
00078
00079 void Render(const RenderParams& pParams);
00080
00081 private:
00082
00083
00084 PrimitiveAccumulator();
00085 PrimitiveAccumulator(const PrimitiveAccumulator&);
00086 PrimitiveAccumulator& operator=(const PrimitiveAccumulator&);
00087
00088 struct Line {
00089 Vec3D pt[2];
00090
00091 Vec3D getBarycenter() const {
00092 return 0.5*(pt[0] + pt[1]);
00093 }
00094 };
00095
00096 struct LineColored : public Line {
00097 ColorRGB col1;
00098 ColorRGB col2;
00099 };
00100
00101 struct Point {
00102 Vec3D pt;
00103
00104 Vec3D getBarycenter() const {
00105 return pt;
00106 }
00107 };
00108
00109 struct PointColored : public Point {
00110 ColorRGB col;
00111 };
00112
00113 struct Quad {
00114 Vec3D pt[4];
00115
00116 Vec3D getBarycenter() const {
00117 return 0.25*(pt[0] + pt[1] + pt[2] + pt[3]);
00118 }
00119
00120 void renderFacetsFrame() const {
00121 glBegin(GL_LINE_LOOP);
00122 glVertex3f(pt[0]._x(), pt[0]._y(), pt[0]._z());
00123 glVertex3f(pt[1]._x(), pt[1]._y(), pt[1]._z());
00124 glVertex3f(pt[2]._x(), pt[2]._y(), pt[2]._z());
00125 glVertex3f(pt[3]._x(), pt[3]._y(), pt[3]._z());
00126 glEnd();
00127 }
00128 };
00129
00130 struct QuadColored : public Quad {
00131 ColorRGB col1, col2, col3, col4;
00132 };
00133
00134
00135 struct QuadNormals : public Quad {
00136 Vec3D n1, n2, n3, n4;
00137 };
00138
00139 struct QuadNormalsColored : public QuadNormals {
00140 ColorRGB col1, col2, col3, col4;;
00141 };
00142
00143 struct TriEelement {
00144 Vec3f pt[3];
00145
00146 Vec3f getBarycenter() const {
00147 return (1.0f/3.0f)*(pt[0] + pt[1] + pt[2]);
00148 }
00149
00150 void renderFacetFrame() const {
00151 glBegin(GL_LINE_LOOP);
00152 glVertex3fv(pt[0].v);
00153 glVertex3fv(pt[1].v);
00154 glVertex3fv(pt[2].v);
00155 glEnd();
00156 }
00157 };
00158
00159
00160
00161
00162
00163 struct TriEelementNormal : public TriEelement {
00164 Vec3f nv;
00165 };
00166
00167 struct TriEelementNormalColor : public TriEelementNormal {
00168 ColorRGB c1, c2, c3;
00169 };
00170
00171 struct Triangle {
00172 Vec3D pt[3];
00173
00174 Vec3D getBarycenter() const {
00175 return (1.0f/3.0f)*(pt[0] + pt[1] + pt[2]);
00176 }
00177
00178 void renderFacetsFrame() const {
00179 glBegin(GL_LINE_LOOP);
00180 glVertex3f(pt[0]._x(), pt[0]._y(), pt[0]._z());
00181 glVertex3f(pt[1]._x(), pt[1]._y(), pt[1]._z());
00182 glVertex3f(pt[2]._x(), pt[2]._y(), pt[2]._z());
00183 glEnd();
00184 }
00185 };
00186
00187 struct TriangleColored : public Triangle {
00188 ColorRGB col1, col2, col3;
00189 };
00190
00191 struct TriangleNormals : public Triangle {
00192 Vec3D n1, n2, n3;
00193 };
00194
00195 struct TriangleNormalsColored : public TriangleNormals {
00196 ColorRGB col1, col2, col3;
00197 };
00198
00199
00200 void AddArrowTip(const Vec3D& p1, const Vec3D& p2, const ColorRGB& col,
00201 const bool colored, const float tipprop, const int nrpolyons);
00202
00203
00204
00205 void renderFacetsFrame (const RenderParams& pParams);
00206 void renderFull (const RenderParams& pParams);
00207 void renderLines ();
00208 void renderLinesColored ();
00209 void renderPoints ();
00210 void renderPointsColored ();
00211 void renderQuads ();
00212 void renderQuadsColored ();
00213 void renderQuadsNormals ();
00214 void renderQuadsNormalsColored ();
00215 void renderSimplified (const RenderParams& pParams);
00216 void renderTriangles ();
00217 void renderTrianglesColored ();
00218 void renderTrianglesNormals ();
00219 void renderTrianglesNormalsColored();
00220
00221 void renderTriElementNormalColor () const;
00222
00223
00224
00225 typedef std::vector<Line> Lines;
00226 typedef std::vector<LineColored> LinesColored;
00227 typedef std::vector<Point> Points;
00228 typedef std::vector<PointColored> PointsColored;
00229 typedef std::vector<Quad> Quads;
00230 typedef std::vector<QuadColored> QuadsColored;
00231 typedef std::vector<QuadNormals> QuadsNormals;
00232 typedef std::vector<QuadNormalsColored> QuadsNormalsColored;
00233 typedef std::vector<Triangle> Triangles;
00234 typedef std::vector<TriangleColored> TrianglesColored;
00235 typedef std::vector<TriangleNormals> TrianglesNormals;
00236 typedef std::vector<TriangleNormalsColored> TrianglesNormalsColored;
00237 typedef std::vector<TriEelementNormalColor> TriElemsNormalColor;
00238 typedef Lines::size_type SizeType;
00239
00240 mutable BBox3D aBBox3D;
00241 Lines aLines;
00242 mutable SizeType aLinesBBoxCounter;
00243 LinesColored aLinesColored;
00244 mutable SizeType aLinesColoredBBoxCounter;
00245 Points aPoints;
00246 mutable SizeType aPointsBBoxCounter;
00247 PointsColored aPointsColored;
00248 mutable SizeType aPointsColoredBBoxCounter;
00249 Quads aQuads;
00250 mutable SizeType aQuadsBBoxCounter;
00251 QuadsColored aQuadsColored;
00252 mutable SizeType aQuadsColoredBBoxCounter;
00253 QuadsNormals aQuadsNormals;
00254 mutable SizeType aQuadsNormalsBBoxCounter;
00255 QuadsNormalsColored aQuadsNormalsColored;
00256 mutable SizeType aQuadsNormalsColoredBBoxCounter;
00257 PrimitiveAccumulator* aSimplified;
00258 bool aSimplifiedDirty;
00259 Triangles aTriangles;
00260 mutable SizeType aTrianglesBBoxCounter;
00261 TrianglesColored aTrianglesColored;
00262 mutable SizeType aTrianglesColoredBBoxCounter;
00263 TrianglesNormals aTrianglesNormals;
00264 mutable SizeType aTrianglesNormalsBBoxCounter;
00265 TrianglesNormalsColored aTrianglesNormalsColored;
00266 mutable SizeType aTrianglesNormalsColoredBBoxCounter;
00267 TriElemsNormalColor aTriElemsNormalColor;
00268 mutable SizeType aTriElemsNormalColorBBoxCounter;
00269
00270 int iPrimitiveOptimizerValue;
00271
00272 };
00273
00274 }
00275 #endif
00276