Main MRPT website > C++ reference
MRPT logo
CRenderizable.h
Go to the documentation of this file.
00001 /* +---------------------------------------------------------------------------+
00002    |          The Mobile Robot Programming Toolkit (MRPT) C++ library          |
00003    |                                                                           |
00004    |                       http://www.mrpt.org/                                |
00005    |                                                                           |
00006    |   Copyright (C) 2005-2011  University of Malaga                           |
00007    |                                                                           |
00008    |    This software was written by the Machine Perception and Intelligent    |
00009    |      Robotics Lab, University of Malaga (Spain).                          |
00010    |    Contact: Jose-Luis Blanco  <jlblanco@ctima.uma.es>                     |
00011    |                                                                           |
00012    |  This file is part of the MRPT project.                                   |
00013    |                                                                           |
00014    |     MRPT is free software: you can redistribute it and/or modify          |
00015    |     it under the terms of the GNU General Public License as published by  |
00016    |     the Free Software Foundation, either version 3 of the License, or     |
00017    |     (at your option) any later version.                                   |
00018    |                                                                           |
00019    |   MRPT is distributed in the hope that it will be useful,                 |
00020    |     but WITHOUT ANY WARRANTY; without even the implied warranty of        |
00021    |     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         |
00022    |     GNU General Public License for more details.                          |
00023    |                                                                           |
00024    |     You should have received a copy of the GNU General Public License     |
00025    |     along with MRPT.  If not, see <http://www.gnu.org/licenses/>.         |
00026    |                                                                           |
00027    +---------------------------------------------------------------------------+ */
00028 #ifndef opengl_CRenderizable_H
00029 #define opengl_CRenderizable_H
00030 
00031 #include <mrpt/utils/utils_defs.h>
00032 #include <mrpt/utils/CSerializable.h>
00033 #include <mrpt/utils/TColor.h>
00034 
00035 #include <mrpt/poses/CPose3D.h>
00036 
00037 #include <mrpt/synch/CCriticalSection.h>
00038 #include <mrpt/math/lightweight_geom_data.h>
00039 
00040 #include <mrpt/opengl/opengl_fonts.h>
00041 
00042 #include <mrpt/opengl/link_pragmas.h>
00043 
00044 namespace mrpt
00045 {
00046         namespace poses { class CPoint3D; class CPoint2D; }
00047         namespace utils { class CStringList; }
00048 
00049         namespace opengl
00050         {
00051                 class COpenGLViewport;
00052                 class CSetOfObjects;
00053 
00054 
00055                 // This must be added to any CSerializable derived class:
00056                 DEFINE_SERIALIZABLE_PRE_CUSTOM_BASE_LINKAGE( CRenderizable, mrpt::utils::CSerializable, OPENGL_IMPEXP )
00057 
00058                 /** A list of objects pointers, automatically managing memory free at destructor, and managing copies correctly. */
00059                 typedef std::deque<CRenderizablePtr> CListOpenGLObjects;
00060 
00061                 /** The base class of 3D objects that can be directly rendered through OpenGL.
00062                   *  In this class there are a set of common properties to all 3D objects, mainly:
00063                   *             - A name (m_name): A name that can be optionally asigned to objects for easing its reference.
00064                   *             - 6D coordinates (x,y,z,yaw,pitch,roll), relative to the "current" reference framework. By default, any object is referenced to global scene coordinates.
00065                   *             - A RGB color: This field will be used in simple elements (points, lines, text,...) but is ignored in more complex objects that carry their own color information (triangle sets,...)
00066                   *  See the main class opengl::COpenGLScene
00067                   *  \sa opengl::COpenGLScene, mrpt::opengl
00068                   * \ingroup mrpt_opengl_grp
00069                   */
00070                 class OPENGL_IMPEXP CRenderizable : public mrpt::utils::CSerializable
00071                 {
00072                         DEFINE_VIRTUAL_SERIALIZABLE( CRenderizable )
00073 
00074                         friend class mrpt::opengl::COpenGLViewport;
00075                         friend class mrpt::opengl::CSetOfObjects;
00076 
00077                 protected:
00078                         std::string                             m_name;
00079                         bool                                    m_show_name;
00080                         mrpt::utils::TColor             m_color;        //!< Color components in the range [0,255]
00081                         mrpt::poses::CPose3D    m_pose;                                     //!< 6D pose wrt the parent coordinate reference. This class automatically holds the cached 3x3 rotation matrix for quick load into opengl stack.
00082                         float                                   m_scale_x, m_scale_y, m_scale_z;                        //!< Scale components to apply to the object (default=1)
00083                         bool                                    m_visible; //!< Is the object visible? (default=true)
00084 
00085                 public:
00086                         /** @name Changes the appearance of the object to render
00087                             @{ */
00088 
00089                         void setName(const std::string &n) { m_name=n; }        //!< Changes the name of the object
00090                         const std::string &getName() const { return m_name; }           //!< Returns the name of the object
00091 
00092                         inline bool isVisible() const /** Is the object visible? \sa setVisibility */  { return m_visible; }
00093                         inline void setVisibility(bool visible=true) /** Set object visibility (default=true) \sa isVisible */  { m_visible=visible; }
00094 
00095                         inline void enableShowName(bool showName=true) { m_show_name=showName; }        //!< Enables or disables showing the name of the object as a label when rendering
00096                         inline bool isShowNameEnabled() const { return m_show_name; }   //!< \sa enableShowName
00097 
00098                         CRenderizable& setPose( const mrpt::poses::CPose3D &o );        //!< Set the 3D pose from a mrpt::poses::CPose3D object (return a ref to this)
00099                         CRenderizable& setPose( const mrpt::math::TPose3D &o ); //!< Set the 3D pose from a  mrpt::math::TPose3D object (return a ref to this)
00100                         CRenderizable& setPose( const mrpt::poses::CPoint3D &o );       //!< Set the 3D pose from a mrpt::poses::CPose3D object (return a ref to this)
00101                         CRenderizable& setPose( const mrpt::poses::CPoint2D &o );       //!< Set the 3D pose from a mrpt::poses::CPose3D object (return a ref to this)
00102 
00103                         mrpt::math::TPose3D getPose() const;    //!< Returns the 3D pose of the object as TPose3D
00104                         /** Returns a const ref to the 3D pose of the object as CPose3D (which explicitly contains the 3x3 rotation matrix) */
00105                         inline const mrpt::poses::CPose3D & getPoseRef() const { return m_pose; }
00106 
00107                         /** Changes the location of the object, keeping untouched the orientation  \return a ref to this */
00108                         inline CRenderizable& setLocation(double x,double y,double z) { m_pose.x(x); m_pose.y(y); m_pose.z(z); return *this; }
00109 
00110                         /** Changes the location of the object, keeping untouched the orientation  \return a ref to this  */
00111                         inline CRenderizable& setLocation(const mrpt::math::TPoint3D &p ) { m_pose.x(p.x); m_pose.y(p.y); m_pose.z(p.z); return *this;  }
00112 
00113                         inline double getPoseX() const { return m_pose.x(); } //!< Translation relative to parent coordinate origin.
00114                         inline double getPoseY() const { return m_pose.y(); } //!< Translation relative to parent coordinate origin.
00115                         inline double getPoseZ() const { return m_pose.z(); } //!< Translation relative to parent coordinate origin.
00116                         inline double getPoseYaw() const { return mrpt::utils::RAD2DEG(m_pose.yaw()); } //!< Rotation relative to parent coordinate origin, in **DEGREES**.
00117                         inline double getPosePitch() const { return mrpt::utils::RAD2DEG(m_pose.pitch()); } //!< Rotation relative to parent coordinate origin, in **DEGREES**.
00118                         inline double getPoseRoll() const { return mrpt::utils::RAD2DEG(m_pose.roll()); } //!< Rotation relative to parent coordinate origin, in **DEGREES**.
00119                         inline double getPoseYawRad() const { return m_pose.yaw(); } //!< Rotation relative to parent coordinate origin, in radians.
00120                         inline double getPosePitchRad() const { return m_pose.pitch(); } //!< Rotation relative to parent coordinate origin, in radians.
00121                         inline double getPoseRollRad() const { return m_pose.roll(); } //!< Rotation relative to parent coordinate origin, in radians.
00122 
00123                         inline double getColorR() const { return m_color.R/255.; } //!< Color components in the range [0,1]
00124                         inline double getColorG() const { return m_color.G/255.; } //!< Color components in the range [0,1]
00125                         inline double getColorB() const { return m_color.B/255.; } //!< Color components in the range [0,1]
00126                         inline double getColorA() const { return m_color.A/255.; } //!< Color components in the range [0,1]
00127 
00128                         inline uint8_t getColorR_u8() const { return m_color.R; } //!< Color components in the range [0,255]
00129                         inline uint8_t getColorG_u8() const { return m_color.G; } //!< Color components in the range [0,255]
00130                         inline uint8_t getColorB_u8() const { return m_color.B; } //!< Color components in the range [0,255]
00131                         inline uint8_t getColorA_u8() const { return m_color.A; } //!< Color components in the range [0,255]
00132 
00133                         CRenderizable&  setColorR(const double r)       {return setColorR_u8(static_cast<uint8_t>(255*r));}     //!<Color components in the range [0,1] \return a ref to this
00134                         CRenderizable&  setColorG(const double g)       {return setColorG_u8(static_cast<uint8_t>(255*g));}     //!<Color components in the range [0,1] \return a ref to this
00135                         CRenderizable&  setColorB(const double b)       {return setColorB_u8(static_cast<uint8_t>(255*b));}     //!<Color components in the range [0,1] \return a ref to this
00136                         CRenderizable&  setColorA(const double a)       {return setColorA_u8(static_cast<uint8_t>(255*a));}     //!<Color components in the range [0,1] \return a ref to this
00137 
00138                         virtual CRenderizable&  setColorR_u8(const uint8_t r)   {m_color.R=r; return *this;}    //!<Color components in the range [0,255] \return a ref to this
00139                         virtual CRenderizable&  setColorG_u8(const uint8_t g)   {m_color.G=g; return *this;}    //!<Color components in the range [0,255] \return a ref to this
00140                         virtual CRenderizable&  setColorB_u8(const uint8_t b)   {m_color.B=b; return *this;}    //!<Color components in the range [0,255] \return a ref to this
00141                         virtual CRenderizable&  setColorA_u8(const uint8_t a)   {m_color.A=a; return *this;}    //!<Color components in the range [0,255] \return a ref to this
00142 
00143                         inline CRenderizable& setScale(float s)  { m_scale_x=m_scale_y=m_scale_z = s; return *this; } //!< Scale to apply to the object, in all three axes (default=1)  \return a ref to this
00144                         inline CRenderizable& setScale(float sx,float sy,float sz)  { m_scale_x=sx; m_scale_y=sy; m_scale_z = sz; return *this; } //!< Scale to apply to the object in each axis (default=1)  \return a ref to this
00145                         inline float getScaleX() const { return m_scale_x; }  //!< Get the current scaling factor in one axis
00146                         inline float getScaleY() const { return m_scale_y; }  //!< Get the current scaling factor in one axis
00147                         inline float getScaleZ() const { return m_scale_z; }  //!< Get the current scaling factor in one axis
00148 
00149 
00150                         inline mrpt::utils::TColorf getColor() const { return mrpt::utils::TColorf(m_color); }  //!< Returns the object color property as a TColorf
00151                         CRenderizable& setColor( const mrpt::utils::TColorf &c) //!< Changes the default object color \return a ref to this
00152                         {
00153                                 return setColor_u8(mrpt::utils::TColor(c.R*255.f,c.G*255.f,c.B*255.f,c.A*255.f));
00154                         }
00155 
00156                         /** Set the color components of this object (R,G,B,Alpha, in the range 0-1)  \return a ref to this */
00157                         inline CRenderizable& setColor( double R, double G, double B, double A=1) { return setColor_u8(R*255,G*255,B*255,A*255); }
00158 
00159                         inline const mrpt::utils::TColor &getColor_u8() const { return m_color; }  //!< Returns the object color property as a TColor
00160                         /*** Changes the default object color \return a ref to this */
00161                         virtual CRenderizable& setColor_u8( const mrpt::utils::TColor &c);
00162 
00163                         /** Set the color components of this object (R,G,B,Alpha, in the range 0-1)  \return a ref to this */
00164                         inline CRenderizable& setColor_u8( uint8_t R, uint8_t G, uint8_t B, uint8_t A=255) { return setColor_u8(mrpt::utils::TColor(R,G,B,A)); }
00165 
00166                         /** @} */
00167 
00168 
00169                         /** Default constructor:  */
00170                         CRenderizable();
00171                         virtual ~CRenderizable();
00172 
00173                         /** Interface for the stlplus smart pointer class. */
00174                         inline CRenderizable * clone() const
00175                         {
00176                                 return static_cast<CRenderizable*>( this->duplicate() );
00177                         }
00178 
00179                         /** Implements the rendering of 3D objects in each class derived from CRenderizable.
00180                           */
00181                         virtual void  render() const = 0;
00182 
00183                         /** Simulation of ray-trace, given a pose. Returns true if the ray effectively collisions with the object (returning the distance to the origin of the ray in "dist"), or false in other case. "dist" variable yields undefined behaviour when false is returned
00184                           */
00185                         virtual bool traceRay(const mrpt::poses::CPose3D &o,double &dist) const;
00186 
00187 
00188                         /** This method is safe for calling from within ::render() methods \sa renderTextBitmap, mrpt::opengl::gl_utils */
00189                         static void     renderTextBitmap( const char *str, void *fontStyle );
00190 
00191                         /** Return the exact width in pixels for a given string, as will be rendered by renderTextBitmap().
00192                           * \sa renderTextBitmap, mrpt::opengl::gl_utils
00193                           */
00194                         static int textBitmapWidth(
00195                                 const std::string &str,
00196                                 mrpt::opengl::TOpenGLFont    font = mrpt::opengl::MRPT_GLUT_BITMAP_TIMES_ROMAN_24 );
00197 
00198                         /** Render a text message in the current rendering context, creating a glViewport in the way (do not call within ::render() methods)
00199                           *   - Coordinates (x,y) are 2D pixels, starting at bottom-left of the viewport. Negative numbers will wrap to the opposite side of the viewport (e.g. x=-10 means 10px fromt the right).
00200                           *   - The text color is defined by (color_r,color_g,color_b), each float numbers in the range [0,1].
00201                           *  \sa renderTextBitmap, textBitmapWidth, mrpt::opengl::gl_utils
00202                           */
00203                         static void renderTextBitmap(
00204                                 int screen_x,
00205                                 int screen_y,
00206                                 const std::string &str,
00207                                 float  color_r=1,
00208                                 float  color_g=1,
00209                                 float  color_b=1,
00210                                 mrpt::opengl::TOpenGLFont    font = mrpt::opengl::MRPT_GLUT_BITMAP_TIMES_ROMAN_24
00211                                 );
00212 
00213                 protected:
00214                         /** Checks glGetError and throws an exception if an error situation is found */
00215                         static void checkOpenGLError();
00216 
00217                         void  writeToStreamRender(utils::CStream &out) const;
00218                         void  readFromStreamRender(utils::CStream &in);
00219 
00220                         /** Returns the lowest next free texture name (avoid using OpenGL's own function since we may call them from different threads and seem it's not cool).  */
00221                         static unsigned int getNewTextureNumber();
00222                         static void releaseTextureName(unsigned int i);
00223 
00224                 };
00225                 /**
00226                   * Applies a CPose3D transformation to the object. Note that this method doesn't <i>set</i> the pose to the given value, but <i>combines</i> it with the existing one.
00227                   * \sa setPose
00228                   */
00229                 OPENGL_IMPEXP CRenderizablePtr & operator<<(CRenderizablePtr &r,const mrpt::poses::CPose3D &p);
00230 
00231         } // end namespace
00232 
00233 } // End of namespace
00234 
00235 // This header goes here so there we can use "CRenderizablePtr"
00236 #include <mrpt/opengl/gl_utils.h>
00237 
00238 
00239 #endif



Page generated by Doxygen 1.7.5 for MRPT 0.9.5 SVN: at Thu Oct 13 21:25:36 UTC 2011