Go to the documentation of this file.
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() ==
692 std::dynamic_pointer_cast<CSetOfObjects>(m_object)->getByName(
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() ==
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);
A description of a bitmapped or vectorized text font.
Program::Ptr LoadDefaultShader(const shader_id_t id)
Loads a set of OpenGL Vertex+Fragment shaders from the default library available in mrpt::opengl.
#define ASSERT_ABOVE_(__A, __B)
mrpt::math::CMatrixFloat44 mv_matrix
Model-view matrix.
mrpt::img::TColor m_borderColor
bool m_isImageView
Set by setImageView.
TLightParameters m_lights
void setImageView(const mrpt::img::CImage &img)
Set this viewport into "image view"-mode, where an image is efficiently drawn (fitting the viewport a...
TPoint3D_< double > TPoint3D
Lightweight 3D point.
CRenderizable & setPose(const mrpt::poses::CPose3D &o)
Set the 3D pose from a mrpt::poses::CPose3D object (return a ref to this)
void unloadShaders()
Unload shader programs in m_shaders.
mrpt::safe_ptr< COpenGLScene > m_parent
The scene that contains this viewport.
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...
TOpenGLFontStyle
Different style for vectorized font rendering.
std::string m_name
The viewport's name.
void getCurrentCameraPose(mrpt::poses::CPose3D &out_cameraPose) const
Compute the current 3D camera pose.
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...
A versatile "profiler" that logs the time spent within each pair of calls to enter(X)-leave(X),...
TPoint3D pBase
Base point.
mrpt::opengl::CText::Ptr gl_text
std::map< shader_id_t, mrpt::opengl::Program::Ptr > m_shaders
Default shader program.
double x() const
Common members of all points & poses classes.
This class allows the user to create, load, save, and render 3D scenes using OpenGL primitives.
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 setNormalMode()
Resets the viewport to a normal 3D viewport.
std::map< uint32_t, DataPerText > messages
size_t viewport_width
In pixels.
static constexpr shader_id_t TEXTURED_TRIANGLES
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...
An event sent by an mrpt::opengl::COpenGLViewport after calling the scene OpenGL drawing primitives a...
opengl::CCamera m_camera
The camera associated to the viewport.
uint32_t m_borderWidth
Default=0, the border around the viewport.
static int startFromRatio(const double frac, const int dSize)
mrpt::opengl::CTexturedPlane::Ptr m_imageview_plane
The image to display, after calling setImageView()
bool m_custom_backgb_color
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)
mrpt::img::TColorf m_background_color
used only if m_custom_backgb_color
double m_view_x
The viewport position [0,1].
static constexpr shader_id_t TEXT
void initializeTextures()
Initializes all textures in the scene (See opengl::CTexturedPlane::initializeTextures)
double azimuth
Camera elev & azimuth, in radians.
mrpt::vision::TStereoCalibResults out
void getRotationMatrix(mrpt::math::CMatrixDouble33 &ROT) const
Get the 3x3 rotation matrix.
std::shared_ptr< CRenderizable > Ptr
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
float m_projectiveFOVdeg
Field-of-View in degs, only when projectiveModel=true (default=30 deg).
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
TOpenGLFontStyle vfont_style
(default: FILL) See TOpenGLFontStyle.
void insert(const CRenderizable::Ptr &newObject)
Insert a new object into the list.
#define THROW_EXCEPTION(msg)
#define ASSERT_(f)
Defines an assertion mechanism.
void clear()
Delete all internal obejcts.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
mrpt::opengl::CText::Ptr gl_text_shadow
static Ptr Create(Args &&... args)
void dumpListOfObjects(std::vector< std::string > &lst)
Retrieves a list of all objects in text form.
void loadDefaultShaders() const
Load all MPRT predefined shader programs into m_shaders.
Virtual base class for "archives": classes abstracting I/O streams.
static Ptr Create(Args &&... args)
void renderImageMode() const
Render in image mode.
bool m_isCloned
Set by setCloneView.
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.
STORED_TYPE ReadAs()
De-serialize a variable and returns it by value.
mrpt::img::TColorf shadow_color
A set of object, which are referenced to the coordinates framework established in this object.
An event sent by an mrpt::opengl::COpenGLViewport just after clearing the viewport and setting the GL...
static constexpr shader_id_t WIREFRAME
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)
float vfont_scale
Size of characters [pixels].
opengl::CListOpenGLObjects m_objects
The list of objects that comprise the 3D scene.
static constexpr shader_id_t TRIANGLES
static int sizeFromRatio(const int startCoord, const double dSize, const int iLength)
A compile-time fixed-size numeric matrix container.
std::shared_ptr< mrpt::opengl ::COpenGLViewport > Ptr
CRenderizable::Ptr getByName(const std::string &str)
Returns the first object with a given name, or nullptr if not found.
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
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void regenerateGLobjects() const
(re)generate all CText objects in the gl_text fields
void set6DOFMode(bool v)
Set 6DOFMode, if enabled camera is set according to its pose (default=false).
double vfont_spacing
(default: 1.5) Refer to mrpt::opengl::gl_utils::glDrawText
float m_clip_min
The min/max clip depth distances (default: 0.1 - 10000)
A camera: if added to a scene, the viewpoint defined by this camera will be used instead of the camer...
double FOV
Vertical FOV in degrees.
#define CLASS_ID_NAMESPACE(class_name, namespaceName)
mrpt::math::CMatrixFloat44 p_matrix
Projection matrix, computed by renderNormalScene() from all the parameters above.
void setCurrentCameraFromPose(mrpt::poses::CPose3D &p)
Changes the point of view of the camera, from a given pose.
double vfont_kerning
(default: 0.1) Refer to mrpt::opengl::gl_utils::glDrawText
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.
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.
TListTextMessages m_2D_texts
mrpt::math::TPoint3D eye
The camera is here.
constexpr double DEG2RAD(const double x)
Degrees to radians
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
To be added to all CSerializable-classes implementation files.
void serializeTo(mrpt::serialization::CArchive &out) const override
Pure virtual method for writing (serializing) to an abstract archive.
void setViewportPosition(const double x, const double y, const double width, const double height)
Change the viewport position and dimension on the rendering window.
A class for storing images as grayscale or RGB bitmaps.
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...
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 m_clonedViewport
Only if m_isCloned=true.
bool m_isClonedCamera
Set by setCloneCamera.
A safe way to call enter() and leave() of a mrpt::system::CTimeLogger upon construction and destructi...
~COpenGLViewport() override
Destructor: clears all objects.
bool m_isTransparent
Whether to clear color buffer.
Rendering state related to the projection and model-view matrices.
TRenderMatrices m_state
Info updated with each "render()" and used in "get3DRayForPixelCoord".
void renderViewportBorder() const
Render the viewport border, if enabled.
bool m_projectiveModel
If set to true (default), camera model is projective, otherwise, it's orthogonal.
std::deque< CRenderizable::Ptr > CListOpenGLObjects
A list of smart pointers to renderizable objects.
void serializeFrom(mrpt::serialization::CArchive &in, uint8_t serial_version) override
Pure virtual method for reading (deserializing) from an abstract archive.
bool m_OpenGL_enablePolygonNicest
A viewport within a COpenGLScene, containing a set of OpenGL objects to render.
This base provides a set of functions for maths stuff.
void renderTextMessages() const
Renders all messages in the underlying class CTextMessageCapable.
void getViewportClipDistances(float &clip_min, float &clip_max) const
Get the current min/max clip depth distances of the rendering frustum (default: 0....
#define ASSERTDEB_(f)
Defines an assertion mechanism - only when compiled in debug.
3D line, represented by a base point and a director vector.
void internal_enableImageView()
std::string vfont_name
Vectorized font name ("sans","mono","serif")
void setCloneView(const std::string &clonedViewport)
Set this viewport as a clone of some other viewport, given its name - as a side effect,...
Lighting parameters, mostly for triangle shaders.
uint8_t serializeGetVersion() const override
Must return the current versioning number of the object.
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
TVector3D director
Director vector.
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.
std::shared_ptr< mrpt::opengl ::CText > Ptr
The namespace for 3D scene representation and rendering.
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...
static constexpr shader_id_t POINTS
void renderNormalSceneMode() const
Render a normal scene with 3D objects.
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...
void removeObject(const CRenderizable::Ptr &obj)
Removes the given object from the scene (it also deletes the object to free its memory).
bool is_projective
true: projective, false: ortho
Page generated by Doxygen 1.8.18 for MRPT 2.0.4 at Thu Sep 24 07:14:18 UTC 2020 | |