00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef opengl_CMesh_H
00030 #define opengl_CMesh_H
00031
00032 #include <mrpt/opengl/CRenderizableDisplayList.h>
00033 #include <mrpt/math/CMatrix.h>
00034 #include <mrpt/utils/CImage.h>
00035 #include <mrpt/utils/color_maps.h>
00036 #include <mrpt/opengl/CSetOfTriangles.h>
00037
00038 namespace mrpt
00039 {
00040 namespace opengl
00041 {
00042 class OPENGL_IMPEXP CMesh;
00043
00044
00045 DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE_LINKAGE( CMesh, CRenderizableDisplayList, OPENGL_IMPEXP )
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 class OPENGL_IMPEXP CMesh : public CRenderizableDisplayList
00060 {
00061 DEFINE_SERIALIZABLE( CMesh )
00062 protected:
00063 mrpt::utils::CImage m_textureImage;
00064
00065 bool m_enableTransparency;
00066 bool m_colorFromZ;
00067 bool m_isWireFrame;
00068
00069 math::CMatrix Z;
00070 math::CMatrix mask;
00071 math::CMatrix U, V;
00072 mutable math::CMatrix C;
00073
00074 mrpt::utils::TColormap m_colorMap;
00075
00076 mutable bool m_modified_Z;
00077
00078 void updateColorsMatrix() const;
00079 void updateTriangles() const;
00080 void updatePolygons() const;
00081
00082 float xMin,xMax,yMin,yMax;
00083 mutable std::vector<CSetOfTriangles::TTriangle> actualMesh;
00084 mutable bool trianglesUpToDate;
00085 mutable bool polygonsUpToDate;
00086 mutable std::vector<mrpt::math::TPolygonWithPlane> tmpPolys;
00087
00088 public:
00089 void setGridLimits(float xmin,float xmax, float ymin, float ymax)
00090 {
00091 xMin=xmin; xMax = xmax;
00092 yMin=ymin; yMax = ymax;
00093 CRenderizableDisplayList::notifyChange();
00094 }
00095
00096 void getGridLimits(float &xmin,float &xmax, float &ymin, float &ymax) const
00097 {
00098 xmin=xMin; xmax=xMax;
00099 ymin=yMin; ymax=yMax;
00100 }
00101
00102 void enableTransparency( bool v ) { m_enableTransparency = v; CRenderizableDisplayList::notifyChange(); }
00103 void enableWireFrame( bool v ) { m_isWireFrame = v; CRenderizableDisplayList::notifyChange(); }
00104 void enableColorFromZ( bool v, mrpt::utils::TColormap colorMap = mrpt::utils::cmJET )
00105 {
00106 m_colorFromZ = v;
00107 m_colorMap = colorMap;
00108 CRenderizableDisplayList::notifyChange();
00109 }
00110
00111
00112 void setZ( const mrpt::math::CMatrixTemplateNumeric<float> &in_Z );
00113
00114
00115 inline void getZ(mrpt::math::CMatrixFloat &out) const {
00116 out=Z;
00117 }
00118
00119
00120 inline void getMask(mrpt::math::CMatrixFloat &out) const {
00121 out=mask;
00122 }
00123
00124
00125 void setMask( const mrpt::math::CMatrixTemplateNumeric<float> &in_mask );
00126
00127
00128 void setUV( const mrpt::math::CMatrixTemplateNumeric<float> &in_U, const mrpt::math::CMatrixTemplateNumeric<float> &in_V);
00129
00130 inline float getXMin() const { return xMin; }
00131 inline float getXMax() const { return xMax; }
00132 inline float getYMin() const { return yMin; }
00133 inline float getYMax() const { return yMax; }
00134 inline void setXMin(const float &nxm) {
00135 xMin=nxm;
00136 trianglesUpToDate=false; CRenderizableDisplayList::notifyChange();
00137 }
00138 inline void setXMax(const float &nxm) {
00139 xMax=nxm;
00140 trianglesUpToDate=false; CRenderizableDisplayList::notifyChange();
00141 }
00142 inline void setYMin(const float &nym) {
00143 yMin=nym;
00144 trianglesUpToDate=false; CRenderizableDisplayList::notifyChange();
00145 }
00146 inline void setYMax(const float &nym) {
00147 yMax=nym;
00148 trianglesUpToDate=false; CRenderizableDisplayList::notifyChange();
00149 }
00150 inline void getXBounds(float &min,float &max) const {
00151 min=xMin;
00152 max=xMax;
00153 }
00154 inline void getYBounds(float &min,float &max) const {
00155 min=yMin;
00156 max=yMax;
00157 }
00158 inline void setXBounds(const float &min,const float &max) {
00159 xMin=min;
00160 xMax=max;
00161 trianglesUpToDate=false; CRenderizableDisplayList::notifyChange();
00162 }
00163 inline void setYBounds(const float &min,const float &max) {
00164 yMin=min;
00165 yMax=max;
00166 trianglesUpToDate=false; CRenderizableDisplayList::notifyChange();
00167 }
00168
00169
00170
00171 static CMeshPtr Create(bool enableTransparency, float xMin = 0.0f, float xMax = 0.0f, float yMin = 0.0f, float yMax = 0.0f )
00172 {
00173 return CMeshPtr( new CMesh( enableTransparency, xMin ,xMax , yMin ,yMax ) );
00174 }
00175
00176
00177
00178 void render_dl() const;
00179
00180
00181
00182 void assignImage(const utils::CImage& img );
00183
00184
00185
00186 virtual bool traceRay(const mrpt::poses::CPose3D &o,double &dist) const;
00187
00188 private:
00189
00190
00191 CMesh( bool enableTransparency = false, float xMin = 0.0f, float xMax = 0.0f, float yMin = 0.0f, float yMax = 0.0f ) :
00192 m_textureImage(0,0),
00193 m_enableTransparency(enableTransparency),
00194 m_colorFromZ(false),
00195 m_isWireFrame(false),
00196 Z(0,0), mask(0,0), U(0,0), V(0,0), C(0,0),
00197 m_colorMap( mrpt::utils::cmJET ),
00198 m_modified_Z(true),
00199 xMin(xMin), xMax(xMax), yMin(yMin), yMax(yMax),
00200 trianglesUpToDate(false)
00201 {
00202 m_color.A = 255;
00203 m_color.R = 0;
00204 m_color.G = 0;
00205 m_color.B = 150;
00206 }
00207
00208 virtual ~CMesh() { }
00209
00210 };
00211
00212 }
00213
00214 }
00215
00216 #endif