23 #include <Eigen/Dense>    38 #if defined(OPENGLVIEWPORT_ENABLE_TIMEPROFILING)    51 COpenGLViewport::COpenGLViewport(
COpenGLScene* parent, 
const string& name)
    52     : m_parent(parent), m_name(name)
    66     const double x, 
const double y, 
const double width, 
const double height)
    84     double& x, 
double& y, 
double& width, 
double& height)
   106     const int startCoord, 
const double dSize, 
const int iLength)
   109         return static_cast<int>(dSize);
   114             return static_cast<int>(-iLength * dSize - startCoord + 1);
   116             return static_cast<int>(-dSize - startCoord + 1);
   119     return static_cast<int>(iLength * dSize);
   123     return frac > 1 ? 
static_cast<int>(frac)
   124                     : (frac < 0 ? static_cast<int>(dSize + frac)
   125                                 : 
static_cast<int>(dSize * frac));
   131 #if MRPT_HAS_OPENGL_GLUT   132 #if defined(OPENGLVIEWPORT_ENABLE_TIMEPROFILING)   134         glv_timlog, 
"COpenGLViewport::render imageview");
   142     glDisable(GL_DEPTH_TEST);
   144     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   149     const double img_ratio = double(img_w) / img_h;
   150     const double vw_ratio = double(_.viewport_width) / _.viewport_height;
   151     const double ratio = vw_ratio / img_ratio;
   153     _.mv_matrix.setIdentity();
   154     _.p_matrix.setIdentity();
   157         _.p_matrix(1, 1) /= img_ratio;
   158     else if (img_ratio > 0)
   159         _.p_matrix(0, 0) /= img_ratio;
   161     if (ratio > 0) _.p_matrix(0, 0) /= ratio;
   163     auto &p00 = _.p_matrix(0, 0), &p11 = _.p_matrix(1, 1);
   164     if (p00 > 0 && p11 > 0)
   166         const double s = (p00 > p11) ? p00 : p11;
   171     _.pmv_matrix.asEigen() = _.p_matrix.asEigen() * _.mv_matrix.asEigen();
   189 #if MRPT_HAS_OPENGL_GLUT   192     std::vector<shader_id_t> lstShaderIDs = {
   197     for (
const auto& 
id : lstShaderIDs)
   212 #if MRPT_HAS_OPENGL_GLUT   226                 "Cloned viewport '%s' not found in parent COpenGLScene",
   229         objectsToRender = &view->m_objects;
   245     if (!myCamera) myCamera = &viewForGetCamera->
m_camera;
   265         at = pose + viewDirection;
   270         _.pointing.
x = at.
x();
   271         _.pointing.y = at.
y();
   272         _.pointing.z = at.z();
   281         const double dis = std::max<double>(0.005, myCamera->
m_eyeDistance);
   282         _.eye.x = _.pointing.x + dis * cos(_.azimuth) * cos(_.elev);
   283         _.eye.y = _.pointing.y + dis * sin(_.azimuth) * cos(_.elev);
   284         _.eye.z = _.pointing.z + dis * sin(_.elev);
   290         _.up.x = -cos(_.azimuth) * sin(_.elev);
   291         _.up.y = -sin(_.azimuth) * sin(_.elev);
   292         _.up.z = cos(_.elev);
   311         GL_POLYGON_SMOOTH_HINT,
   313     CHECK_OPENGL_ERROR();
   316     _.mv_matrix.setIdentity();
   318     glEnable(GL_DEPTH_TEST);
   319     glDepthFunc(GL_LEQUAL);  
   322     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   325 #if defined(GL_PROGRAM_POINT_SIZE)  // it seems it's undefined in OSX (?)   326     glEnable(GL_PROGRAM_POINT_SIZE);
   327     CHECK_OPENGL_ERROR();
   344 #if MRPT_HAS_OPENGL_GLUT   351     _.p_matrix.setIdentity();
   352     _.pmv_matrix.setIdentity();
   354     glDisable(GL_DEPTH_TEST);
   356     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   385 #if MRPT_HAS_OPENGL_GLUT   410     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   421             label.
x >= 1 ? label.
x : (label.
x < 0 ? w + label.
x : label.
x * w);
   423             label.
y >= 1 ? label.
y : (label.
y < 0 ? h + label.
y : label.
y * h);
   428             o->setString(label.
text);
   429             o->setColor(label.
color);
   432             o->setLocation(-1.0f + 2 * x / w, -1.0f + 2 * y / h, 0);
   438             o->setString(label.
text);
   443                 -1.0f + 2 * (x + 1) / w, -1.0f + 2 * (y - 1) / h, 0.1);
   459     [[maybe_unused]] 
const int render_width,
   460     [[maybe_unused]] 
const int render_height,
   461     [[maybe_unused]] 
const int render_offset_x,
   462     [[maybe_unused]] 
const int render_offset_y)
 const   464 #if MRPT_HAS_OPENGL_GLUT   474     glViewport(vx, vy, vw, vh);
   475     CHECK_OPENGL_ERROR();
   482     glScissor(vx, vy, vw, vh);
   483     CHECK_OPENGL_ERROR();
   485     glEnable(GL_SCISSOR_TEST);
   486     CHECK_OPENGL_ERROR();
   495             glGetFloatv(GL_COLOR_CLEAR_VALUE, prevCol);
   496             CHECK_OPENGL_ERROR();
   500             CHECK_OPENGL_ERROR();
   504             GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
   505         CHECK_OPENGL_ERROR();
   510             glClearColor(prevCol[0], prevCol[1], prevCol[2], prevCol[3]);
   511             CHECK_OPENGL_ERROR();
   516         glClear(GL_DEPTH_BUFFER_BIT);
   517         CHECK_OPENGL_ERROR();
   519     glDisable(GL_SCISSOR_TEST);
   520     CHECK_OPENGL_ERROR();
   548         "The MRPT has been compiled with MRPT_HAS_OPENGL_GLUT=0! OpenGL "   549         "functions are not implemented");
   569     for (
const auto& m_object : 
m_objects) 
out << *m_object;
   582         out << kv.second.x << kv.second.y << kv.second.text;
   584         const auto& fp = kv.second;
   586         out << fp.vfont_name << fp.vfont_scale << fp.color << fp.draw_shadow
   587             << fp.shadow_color << fp.vfont_spacing << fp.vfont_kerning;
   588         out.WriteAs<uint8_t>(
static_cast<uint8_t
>(fp.vfont_style));
   652             if (version >= 4) nTexts = in.
ReadAs<uint32_t>();
   654             for (uint32_t i = 0; i < nTexts; i++)
   656                 const auto id = in.
ReadAs<uint32_t>();
   659                 in >> x >> y >> text;
   685         if (m_object->m_name == str)
   688             m_object->GetRuntimeClass() ==
   702     for (
auto& obj : 
m_objects) obj->initializeTextures();
   710         string s(m_object->GetRuntimeClass()->className);
   711         if (m_object->m_name.size())
   712             s += 
string(
" (") + m_object->m_name + string(
")");
   715         if (m_object->GetRuntimeClass() ==
   718             std::vector<std::string> auxLst;
   723             for (
const auto& i : auxLst) lst.emplace_back(
string(
" ") + i);
   740             (*it)->GetRuntimeClass() ==
   742             dynamic_cast<CSetOfObjects*>(it->get())->
removeObject(obj);
   746     const float clip_min, 
const float clip_max)
   755     float& clip_min, 
float& clip_max)
 const   770     const double ASPECT =
   802             if (ASPECT != 0) Ay /= ASPECT;
   805         const double point_lx =
   807         const double point_ly =
   811             m_state.
eye.
x + point_lx * cam_x_3d.
x + point_ly * cam_up_3d.
x,
   812             m_state.
eye.
y + point_lx * cam_x_3d.
y + point_ly * cam_up_3d.
y,
   813             m_state.
eye.
z + point_lx * cam_x_3d.
z + point_ly * cam_up_3d.
z);
   815         out_ray.
pBase = ray_origin;
   831         const double FOVx = 2.0 * atan(ASPECT * tan(FOVy * 0.5));
   835         const double len_horz = 2.0 * (-0.5 + x_coord / vw) * tan(0.5 * FOVx);
   836         const double len_vert = -2.0 * (-0.5 + y_coord / vh) * tan(0.5 * FOVy);
   841             l.x * cam_x_3d.
x + l.y * cam_up_3d.
x + l.z * pointing_dir.
x,
   842             l.x * cam_x_3d.
y + l.y * cam_up_3d.
y + l.z * pointing_dir.
y,
   843             l.x * cam_x_3d.
z + l.y * cam_up_3d.
z + l.z * pointing_dir.
z);
   857         M(0, 0) = cam_x_3d.
x;
   858         M(1, 0) = cam_x_3d.
y;
   859         M(2, 0) = cam_x_3d.
z;
   862         M(0, 1) = cam_up_3d.
x;
   863         M(1, 1) = cam_up_3d.
y;
   864         M(2, 1) = cam_up_3d.
z;
   867         M(0, 2) = pointing_dir.
x;
   868         M(1, 2) = pointing_dir.
y;
   869         M(2, 2) = pointing_dir.
z;
   935         std::numeric_limits<double>::max(), std::numeric_limits<double>::max(),
   936         std::numeric_limits<double>::max());
   938         -std::numeric_limits<double>::max(),
   939         -std::numeric_limits<double>::max(),
   940         -std::numeric_limits<double>::max());
   945             std::numeric_limits<double>::max(),
   946             std::numeric_limits<double>::max(),
   947             std::numeric_limits<double>::max());
   949             -std::numeric_limits<double>::max(),
   950             -std::numeric_limits<double>::max(),
   951             -std::numeric_limits<double>::max());
   952         m_object->getBoundingBox(child_bbmin, child_bbmax);
 float m_projectiveFOVdeg
Field-of-View in degs, only when projectiveModel=true (default=30 deg). 
 
void serializeFrom(mrpt::serialization::CArchive &in, uint8_t serial_version) override
Pure virtual method for reading (deserializing) from an abstract archive. 
 
static int startFromRatio(const double frac, const int dSize)
 
float m_clip_min
The min/max clip depth distances (default: 0.1 - 10000) 
 
opengl::CListOpenGLObjects m_objects
The list of objects that comprise the 3D scene. 
 
void serializeTo(mrpt::serialization::CArchive &out) const override
Pure virtual method for writing (serializing) to an abstract archive. 
 
void keep_min(T &var, const K test_val)
If the second argument is below the first one, set the first argument to this lower value...
 
static Ptr Create(Args &&... args)
 
A compile-time fixed-size numeric matrix container. 
 
CRenderizable::Ptr getByName(const std::string &str)
Returns the first object with a given name, or nullptr if not found. 
 
void get3DRayForPixelCoord(const double x_coord, const double y_coord, mrpt::math::TLine3D &out_ray, mrpt::poses::CPose3D *out_cameraPose=nullptr) const
Compute the 3D ray corresponding to a given pixel; this can be used to allow the user to pick and sel...
 
mrpt::opengl::CText::Ptr gl_text
 
bool m_isTransparent
Whether to clear color buffer. 
 
static constexpr shader_id_t TEXTURED_TRIANGLES
 
mrpt::opengl::CTexturedPlane::Ptr m_imageview_plane
The image to display, after calling setImageView() 
 
A set of object, which are referenced to the coordinates framework established in this object...
 
#define THROW_EXCEPTION(msg)
 
uint32_t m_borderWidth
Default=0, the border around the viewport. 
 
A safe way to call enter() and leave() of a mrpt::system::CTimeLogger upon construction and destructi...
 
void setCloneView(const std::string &clonedViewport)
Set this viewport as a clone of some other viewport, given its name - as a side effect, current list of internal OpenGL objects is cleared. 
 
mrpt::opengl::CText::Ptr gl_text_shadow
 
void setViewportClipDistances(const float clip_min, const float clip_max)
Set the min/max clip depth distances of the rendering frustum (default: 0.1 - 10000) ...
 
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
To be added to all CSerializable-classes implementation files. 
 
std::deque< CRenderizable::Ptr > CListOpenGLObjects
A list of smart pointers to renderizable objects. 
 
A description of a bitmapped or vectorized text font. 
 
void set6DOFMode(bool v)
Set 6DOFMode, if enabled camera is set according to its pose (default=false). 
 
void processRenderQueue(const RenderQueue &rq, std::map< shader_id_t, mrpt::opengl::Program::Ptr > &shaders, const mrpt::opengl::TLightParameters &lights)
After enqueForRendering(), actually executes the rendering tasks, grouped shader by shader...
 
void setImageView(const mrpt::img::CImage &img)
Set this viewport into "image view"-mode, where an image is efficiently drawn (fitting the viewport a...
 
bool m_custom_backgb_color
 
void renderImageMode() const
Render in image mode. 
 
std::shared_ptr< CRenderizable > Ptr
 
static constexpr shader_id_t TEXT
 
TPoint3D pBase
Base point. 
 
A viewport within a COpenGLScene, containing a set of OpenGL objects to render. 
 
void getViewportClipDistances(float &clip_min, float &clip_max) const
Get the current min/max clip depth distances of the rendering frustum (default: 0.1 - 10000) 
 
mrpt::safe_ptr< COpenGLScene > m_parent
The scene that contains this viewport. 
 
TRenderMatrices m_state
Info updated with each "render()" and used in "get3DRayForPixelCoord". 
 
mrpt::img::TColor m_borderColor
 
void loadDefaultShaders() const
Load all MPRT predefined shader programs into m_shaders. 
 
void crossProduct3D(const T &v0, const U &v1, V &vOut)
Computes the cross product of two 3D vectors, returning a vector normal to both. 
 
std::string vfont_name
Vectorized font name ("sans","mono","serif") 
 
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations. 
 
bool m_isClonedCamera
Set by setCloneCamera. 
 
#define ASSERT_(f)
Defines an assertion mechanism. 
 
void internal_enableImageView()
 
This base provides a set of functions for maths stuff. 
 
bool m_isImageView
Set by setImageView. 
 
void getBoundingBox(mrpt::math::TPoint3D &bb_min, mrpt::math::TPoint3D &bb_max) const
Evaluates the bounding box of this object (including possible children) in the coordinate frame of th...
 
void addTextMessage(const double x_frac, const double y_frac, const std::string &text, const size_t unique_index=0, const TFontParams &fontParams=TFontParams())
Add 2D text messages overlapped to the 3D rendered scene. 
 
void enqueForRendering(const mrpt::opengl::CListOpenGLObjects &objs, const mrpt::opengl::TRenderMatrices &state, RenderQueue &rq)
Processes, recursively, all objects in the list, classifying them by shader programs into a list suit...
 
static int sizeFromRatio(const int startCoord, const double dSize, const int iLength)
 
constexpr double DEG2RAD(const double x)
Degrees to radians. 
 
STORED_TYPE ReadAs()
De-serialize a variable and returns it by value. 
 
static constexpr shader_id_t WIREFRAME
 
TOpenGLFontStyle
Different style for vectorized font rendering. 
 
void render(const int render_width, const int render_height, const int render_offset_x=0, const int render_offset_y=0) const
Render the objects in this viewport (called from COpenGLScene) 
 
~COpenGLViewport() override
Destructor: clears all objects. 
 
void unloadShaders()
Unload shader programs in m_shaders. 
 
double vfont_kerning
(default: 0.1) Refer to mrpt::opengl::gl_utils::glDrawText 
 
void removeObject(const CRenderizable::Ptr &obj)
Removes the given object from the scene (it also deletes the object to free its memory). 
 
TVector3D director
Director vector. 
 
TPoint3D_< double > TPoint3D
Lightweight 3D point. 
 
double x() const
Common members of all points & poses classes. 
 
void setNormalMode()
Resets the viewport to a normal 3D viewport. 
 
std::map< uint32_t, DataPerText > messages
 
mrpt::math::CMatrixFloat44 mv_matrix
Model-view matrix. 
 
bool m_OpenGL_enablePolygonNicest
 
Rendering state related to the projection and model-view matrices. 
 
void getCurrentCameraPose(mrpt::poses::CPose3D &out_cameraPose) const
Compute the current 3D camera pose. 
 
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
 
double azimuth
Camera elev & azimuth, in radians. 
 
TLightParameters m_lights
 
static constexpr shader_id_t TRIANGLES
 
void renderTextMessages() const
Renders all messages in the underlying class CTextMessageCapable. 
 
void keep_max(T &var, const K test_val)
If the second argument is above the first one, set the first argument to this higher value...
 
TListTextMessages m_2D_texts
 
#define CLASS_ID_NAMESPACE(class_name, namespaceName)
 
std::map< shader_id_t, mrpt::opengl::Program::Ptr > m_shaders
Default shader program. 
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
bool m_projectiveModel
If set to true (default), camera model is projective, otherwise, it's orthogonal. ...
 
Virtual base class for "archives": classes abstracting I/O streams. 
 
void clear()
Delete all internal obejcts. 
 
size_t viewport_width
In pixels. 
 
mrpt::math::TPoint3D eye
The camera is here. 
 
An event sent by an mrpt::opengl::COpenGLViewport just after clearing the viewport and setting the GL...
 
double vfont_spacing
(default: 1.5) Refer to mrpt::opengl::gl_utils::glDrawText 
 
A versatile "profiler" that logs the time spent within each pair of calls to enter(X)-leave(X), among other stats. 
 
void regenerateGLobjects() const
(re)generate all CText objects in the gl_text fields 
 
A class used to store a 3D pose (a 3D translation + a rotation in 3D). 
 
mrpt::vision::TStereoCalibResults out
 
uint8_t serializeGetVersion() const override
Must return the current versioning number of the object. 
 
#define ASSERTDEB_(f)
Defines an assertion mechanism - only when compiled in debug. 
 
void initializeTextures()
Initializes all textures in the scene (See opengl::CTexturedPlane::initializeTextures) ...
 
Program::Ptr LoadDefaultShader(const shader_id_t id)
Loads a set of OpenGL Vertex+Fragment shaders from the default library available in mrpt::opengl...
 
An event sent by an mrpt::opengl::COpenGLViewport after calling the scene OpenGL drawing primitives a...
 
#define ASSERT_ABOVE_(__A, __B)
 
void publishEvent(const mrptEvent &e) const
Called when you want this object to emit an event to all the observers currently subscribed to this o...
 
bool hasSubscribers() const
Can be called by a derived class before preparing an event for publishing with publishEvent to determ...
 
mrpt::opengl::CSetOfLines::Ptr m_borderLines
 
The namespace for 3D scene representation and rendering. 
 
This class allows the user to create, load, save, and render 3D scenes using OpenGL primitives...
 
std::string m_clonedViewport
Only if m_isCloned=true. 
 
CRenderizable & setPose(const mrpt::poses::CPose3D &o)
Set the 3D pose from a mrpt::poses::CPose3D object (return a ref to this) 
 
mrpt::img::TColorf m_background_color
used only if m_custom_backgb_color 
 
void renderNormalSceneMode() const
Render a normal scene with 3D objects. 
 
double FOV
Vertical FOV in degrees. 
 
mrpt::math::CMatrixFloat44 p_matrix
Projection matrix, computed by renderNormalScene() from all the parameters above. ...
 
void getRotationMatrix(mrpt::math::CMatrixDouble33 &ROT) const
Get the 3x3 rotation matrix. 
 
A camera: if added to a scene, the viewpoint defined by this camera will be used instead of the camer...
 
void renderViewportBorder() const
Render the viewport border, if enabled. 
 
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
 
void setViewportPosition(const double x, const double y, const double width, const double height)
Change the viewport position and dimension on the rendering window. 
 
void dumpListOfObjects(std::vector< std::string > &lst)
Retrieves a list of all objects in text form. 
 
mrpt::math::TPose3D getPose() const
Returns the 3D pose of the object as TPose3D. 
 
void getViewportPosition(double &x, double &y, double &width, double &height)
Get the current viewport position and dimension on the rendering window. 
 
void insert(const CRenderizable::Ptr &newObject)
Insert a new object into the list. 
 
T::Ptr getByClass(size_t ith=0) const
Returns the i'th object of a given class (or of a descendant class), or nullptr (an empty smart point...
 
double m_view_x
The viewport position [0,1]. 
 
Lighting parameters, mostly for triangle shaders. 
 
mrpt::img::TColorf shadow_color
 
static Ptr Create(Args &&... args)
 
void setCurrentCameraFromPose(mrpt::poses::CPose3D &p)
Changes the point of view of the camera, from a given pose. 
 
static constexpr shader_id_t POINTS
 
opengl::CCamera m_camera
The camera associated to the viewport. 
 
std::string m_name
The viewport's name. 
 
A class for storing images as grayscale or RGB bitmaps. 
 
float vfont_scale
Size of characters [pixels]. 
 
bool is_projective
true: projective, false: ortho 
 
std::map< shader_id_t, std::multimap< float, RenderQueueElement > > RenderQueue
A queue for rendering, sorted by shader program to minimize changes of OpenGL shader programs while r...
 
bool m_isCloned
Set by setCloneView. 
 
3D line, represented by a base point and a director vector. 
 
TOpenGLFontStyle vfont_style
(default: FILL) See TOpenGLFontStyle.