38 #if defined(OPENGLVIEWPORT_ENABLE_TIMEPROFILING)
55 m_isClonedCamera(false),
58 m_isTransparent(false),
66 m_custom_backgb_color(false),
67 m_background_color(0.6f, 0.6f, 0.6f),
72 m_OpenGL_enablePolygonNicest(true),
80 m_lights[0].setDirection(-1, -1, -1);
83 m_lights[1].setPosition(1, 2, -1, 0);
113 const double x,
const double y,
const double width,
const double height)
155 const int render_width,
const int render_height)
const
157 #if MRPT_HAS_OPENGL_GLUT
232 old_colors[0], old_colors[1], old_colors[2], old_colors[3]);
244 #if defined(OPENGLVIEWPORT_ENABLE_TIMEPROFILING)
245 glv_timlog.enter(
"COpenGLViewport::render imageview");
258 const int img_w =
img->getWidth();
259 const int img_h =
img->getHeight();
261 if (img_w != 0 && img_h != 0)
268 const double ratio = vw * img_h / double(vh * img_w);
269 double ortho_w = img_w;
270 double ortho_h = img_h;
276 glOrtho(-0.5, ortho_h - 0.5, ortho_w - 0.5, -0.5, -1, 1);
280 glPixelZoom(vw /
float(ortho_w), -vh /
float(ortho_h));
284 const int nBytesPerPixel =
img->isColor() ? 3 : 1;
285 const bool is_RGB_order =
287 img->getChannelsOrder(),
296 img->getRowStride() / nBytesPerPixel);
298 img_w, img_h, img_format, img_type,
299 img->get_unsafe(0, 0));
305 #if defined(OPENGLVIEWPORT_ENABLE_TIMEPROFILING)
306 glv_timlog.leave(
"COpenGLViewport::render imageview");
329 "Cloned viewport '%s' not found in parent COpenGLScene",
332 objectsToRender = &view->m_objects;
351 myCamera = getAs<CCamera>(cam_ptr);
355 if (!myCamera) myCamera = &viewForGetCamera->
m_camera;
362 const float dis = max(0.01f, myCamera->m_distanceZoom);
364 myCamera->m_pointingX +
367 myCamera->m_pointingY +
372 if (fabs(fabs(myCamera->m_elevationDeg) - 90) > 1e-6)
380 float sgn = myCamera->m_elevationDeg > 0 ? 1 : -1;
382 -cos(
DEG2RAD(myCamera->m_azimuthDeg)) * sgn;
384 -sin(
DEG2RAD(myCamera->m_azimuthDeg)) * sgn;
395 if (myCamera->m_projectiveModel)
398 myCamera->m_projectiveFOVdeg, vw /
double(vh),
m_clip_min,
404 const double ratio = vw / double(vh);
405 double Ax = myCamera->m_distanceZoom * 0.5;
406 double Ay = myCamera->m_distanceZoom * 0.5;
412 if (ratio != 0) Ay /= ratio;
419 if (myCamera->is6DOFMode())
427 at = pose + viewDirection;
429 pose.
x(), pose.
y(), pose.z(), at.
x(), at.
y(), at.z(),
476 for (
size_t i = 0; i <
m_lights.size(); i++)
522 "Exception while rendering a class '%s'\n%s",
525 msg =
format(
"Exception while rendering:\n%s", e.what());
537 "The MRPT has been compiled with MRPT_HAS_OPENGL_GLUT=0! OpenGL "
538 "functions are not implemented");
653 if ((*it)->m_name == str)
656 (*it)->GetRuntimeClass() ==
671 #if MRPT_HAS_OPENGL_GLUT
676 getAs<CTexturedObject>(*it)->loadTextureInOpenGL();
678 getAs<CSetOfObjects>(*it)->initializeAllTextures();
692 string s((*it)->GetRuntimeClass()->className);
693 if ((*it)->m_name.size())
697 if ((*it)->GetRuntimeClass() ==
702 getAs<CSetOfObjects>(*it)->dumpListOfObjects(auxLst);
704 for (
size_t i = 0; i < auxLst.
size(); i++)
705 lst.
add(
string(
" ") + auxLst(i));
723 (*it)->GetRuntimeClass() ==
725 getAs<CSetOfObjects>(*it)->removeObject(
obj);
732 const double clip_min,
const double clip_max)
744 double& clip_min,
double& clip_max)
const
760 const double ASPECT =
792 if (ASPECT != 0) Ay /= ASPECT;
795 const double point_lx =
797 const double point_ly =
802 point_ly * cam_up_3d.
x,
804 point_ly * cam_up_3d.
y,
806 point_ly * cam_up_3d.
z);
808 out_ray.
pBase = ray_origin;
824 const double FOVx = 2.0 * atan(ASPECT * tan(FOVy * 0.5));
826 const double ang_horz =
828 const double ang_vert =
832 tan(ang_horz), tan(ang_vert),
836 l.
x * cam_x_3d.
x + l.
y * cam_up_3d.
x + l.
z * pointing_dir.
x,
837 l.
x * cam_x_3d.
y + l.
y * cam_up_3d.
y + l.
z * pointing_dir.
y,
838 l.
x * cam_x_3d.
z + l.
y * cam_up_3d.
z + l.
z * pointing_dir.
z);
852 M.get_unsafe(0, 0) = cam_x_3d.
x;
853 M.get_unsafe(1, 0) = cam_x_3d.
y;
854 M.get_unsafe(2, 0) = cam_x_3d.
z;
855 M.get_unsafe(3, 0) = 0;
857 M.get_unsafe(0, 1) = cam_up_3d.
x;
858 M.get_unsafe(1, 1) = cam_up_3d.
y;
859 M.get_unsafe(2, 1) = cam_up_3d.
z;
860 M.get_unsafe(3, 1) = 0;
862 M.get_unsafe(0, 2) = pointing_dir.
x;
863 M.get_unsafe(1, 2) = pointing_dir.
y;
864 M.get_unsafe(2, 2) = pointing_dir.
z;
865 M.get_unsafe(3, 2) = 0;
870 M.get_unsafe(3, 3) = 1;
876 MRPT_TODO(
"Implement a setCurrentCameraFromPose() method")
882 get3DRayForPixelCoord(0, 0, dum, &out_cameraPose);
929 std::numeric_limits<double>::max(), std::numeric_limits<double>::max(),
930 std::numeric_limits<double>::max());
932 -std::numeric_limits<double>::max(),
933 -std::numeric_limits<double>::max(),
934 -std::numeric_limits<double>::max());
940 std::numeric_limits<double>::max(),
941 std::numeric_limits<double>::max(),
942 std::numeric_limits<double>::max());
944 -std::numeric_limits<double>::max(),
945 -std::numeric_limits<double>::max(),
946 -std::numeric_limits<double>::max());
947 (*it)->getBoundingBox(child_bbmin, child_bbmax);
#define CLASS_ID_NAMESPACE(class_name, namespaceName)
#define IS_CLASS(ptrObj, class_name)
Evaluates to true if the given pointer to an object (derived from mrpt::utils::CSerializable) is of t...
#define IS_DERIVED(ptrObj, class_name)
Evaluates to true if the given pointer to an object (derived from mrpt::utils::CSerializable) is an i...
#define IMPLEMENTS_SERIALIZABLE(class_name, base, NameSpace)
This must be inserted in all CSerializable classes implementation files.
A numeric matrix of compile-time fixed size.
A camera: if added to a scene, the viewpoint defined by this camera will be used instead of the camer...
This class allows the user to create, load, save, and render 3D scenes using OpenGL primitives.
A viewport within a COpenGLScene, containing a set of OpenGL objects to render.
double m_view_x
The viewport position [0,1].
std::string m_clonedViewport
Only if m_isCloned=true.
opengl::CListOpenGLObjects m_objects
The list of objects that comprise the 3D scene.
void setImageView(const mrpt::utils::CImage &img)
Set this viewport into "image view"-mode, where an image is efficiently drawn (fitting the viewport a...
void clear()
Delete all internal obejcts.
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 setViewportClipDistances(const double clip_min, const double clip_max)
Set the min/max clip depth distances of the rendering frustum (default: 0.1 - 10000)
void writeToStream(mrpt::utils::CStream &out, int *getVersion) const override
Introduces a pure virtual method responsible for writing to a CStream.
void insert(const CRenderizable::Ptr &newObject)
Insert a new object into the list.
void removeObject(const CRenderizable::Ptr &obj)
Removes the given object from the scene (it also deletes the object to free its memory).
void getViewportPosition(double &x, double &y, double &width, double &height)
Get the current viewport position and dimension on the rendering window.
mrpt::utils::CImage::Ptr m_imageview_img
The image to display, after calling setImageView()
void dumpListOfObjects(mrpt::utils::CStringList &lst)
Retrieves a list of all objects in text form.
bool m_isClonedCamera
Set by setCloneCamera.
bool m_custom_backgb_color
uint32_t m_borderWidth
Default=0, the border around the viewport.
void setCloneView(const std::string &clonedViewport)
Set this viewport as a clone of some other viewport, given its name - as a side effect,...
bool m_isTransparent
Whether to clear color buffer.
utils::safe_ptr< COpenGLScene > m_parent
The scene that contains this viewport.
bool m_isImageView
Set by setImageView.
std::shared_ptr< COpenGLViewport > Ptr
void getViewportClipDistances(double &clip_min, double &clip_max) const
Get the current min/max clip depth distances of the rendering frustum (default: 0....
void initializeAllTextures()
Initializes all textures in the scene (See opengl::CTexturedPlane::loadTextureInOpenGL)
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...
void setImageView_fast(mrpt::utils::CImage &img)
Just like setImageView but moves the internal image memory instead of making a copy,...
opengl::CCamera m_camera
The camera associated to the viewport.
void setNormalMode()
Resets the viewport to a normal 3D viewport.
std::vector< CLight > m_lights
void setViewportPosition(const double x, const double y, const double width, const double height)
Change the viewport position and dimension on the rendering window.
bool m_isCloned
Set by setCloneView.
void readFromStream(mrpt::utils::CStream &in, int version) override
Introduces a pure virtual method responsible for loading from a CStream This can not be used directly...
TLastProjectiveMatrixInfo m_lastProjMat
Info updated with each "render()" and used in "get3DRayForPixelCoord".
double m_clip_min
The min/max clip depth distances (default: 0.1 - 10000)
std::string m_name
The viewport's name.
T::Ptr getByClass(const 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...
mrpt::utils::TColorf m_background_color
used only if m_custom_backgb_color
virtual ~COpenGLViewport()
Destructor: clears all objects.
CRenderizable::Ptr getByName(const std::string &str)
Returns the first object with a given name, or nullptr if not found.
void internal_setImageView_fast(const mrpt::utils::CImage &img, bool is_fast)
void render(const int render_width, const int render_height) const
Render the objects in this viewport (called from COpenGLScene only)
bool m_OpenGL_enablePolygonNicest
The base class of 3D objects that can be directly rendered through OpenGL.
std::shared_ptr< CRenderizable > Ptr
static void checkOpenGLError()
Checks glGetError and throws an exception if an error situation is found.
virtual const mrpt::utils::TRuntimeClassId * GetRuntimeClass() const override
Returns information about the class of an object in runtime.
A set of object, which are referenced to the coordinates framework established in this object.
A base class for all OpenGL objects with loadable textures.
An event sent by an mrpt::opengl::COpenGLViewport after calling the scene OpenGL drawing primitives a...
An event sent by an mrpt::opengl::COpenGLViewport just after clearing the viewport and setting the GL...
A class used to store a 3D pose (a 3D translation + a rotation in 3D).
void getRotationMatrix(mrpt::math::CMatrixDouble33 &ROT) const
Get the 3x3 rotation matrix.
double x() const
Common members of all points & poses classes.
A class for storing images as grayscale or RGB bitmaps.
void copyFastFrom(CImage &o)
Moves an image from another object, erasing the origin image in the process (this is much faster than...
bool hasSubscribers() const
Can be called by a derived class before preparing an event for publishing with publishEvent to determ...
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...
The virtual base class which provides a unified interface for all persistent objects in MRPT.
This base class is used to provide a unified interface to files,memory buffers,..Please see the deriv...
A class for storing a list of text lines.
void add(const std::string &str)
Appends a new string at the end of the string list.
size_t size() const
Returns the number of text lines in the list.
A versatile "profiler" that logs the time spent within each pair of calls to enter(X)-leave(X),...
const Scalar * const_iterator
GLAPI void GLAPIENTRY glPixelZoom(GLfloat xfactor, GLfloat yfactor)
GLAPI void GLAPIENTRY glDepthFunc(GLenum func)
GLAPI void GLAPIENTRY glEnable(GLenum cap)
#define GL_ACCUM_BUFFER_BIT
GLAPI void GLAPIENTRY glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
#define GL_AMBIENT_AND_DIFFUSE
#define GL_FRONT_AND_BACK
GLAPI void GLAPIENTRY glColorMaterial(GLenum face, GLenum mode)
GLAPI void GLAPIENTRY glHint(GLenum target, GLenum mode)
GLAPI void GLAPIENTRY glVertex2f(GLfloat x, GLfloat y)
GLAPI void GLAPIENTRY glLoadIdentity(void)
GLAPI void GLAPIENTRY glLineWidth(GLfloat width)
GLAPI void GLAPIENTRY glGetDoublev(GLenum pname, GLdouble *params)
GLAPI void GLAPIENTRY glViewport(GLint x, GLint y, GLsizei width, GLsizei height)
#define GL_COLOR_BUFFER_BIT
GLAPI void GLAPIENTRY glBegin(GLenum mode)
#define GL_COLOR_MATERIAL
GLAPI void GLAPIENTRY glScissor(GLint x, GLint y, GLsizei width, GLsizei height)
GLAPI void GLAPIENTRY glLightModeli(GLenum pname, GLint param)
GLAPI void GLAPIENTRY glEnd(void)
#define GL_STENCIL_BUFFER_BIT
GLAPI void GLAPIENTRY glDisable(GLenum cap)
#define GL_LIGHT_MODEL_TWO_SIDE
GLAPI void GLAPIENTRY glDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
GLAPI void GLAPIENTRY glPixelStorei(GLenum pname, GLint param)
#define GL_PERSPECTIVE_CORRECTION_HINT
GLAPI void GLAPIENTRY glRasterPos2f(GLfloat x, GLfloat y)
GLAPI void GLAPIENTRY glColor4f(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
#define GL_POLYGON_SMOOTH_HINT
#define GL_DEPTH_BUFFER_BIT
GLAPI void GLAPIENTRY glMatrixMode(GLenum mode)
GLAPI void GLAPIENTRY glShadeModel(GLenum mode)
GLAPI void GLAPIENTRY glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)
#define GL_UNPACK_ROW_LENGTH
GLAPI void GLAPIENTRY glClear(GLbitfield mask)
#define GL_COLOR_CLEAR_VALUE
GLsizei GLsizei GLuint * obj
typedef void(APIENTRYP PFNGLBLENDCOLORPROC)(GLclampf red
GLuint const GLchar * name
GLenum GLsizei GLsizei height
GLsizei const GLchar ** string
void crossProduct3D(const T &v0, const U &v1, V &vOut)
Computes the cross product of two 3D vectors, returning a vector normal to both.
#define ASSERTDEB_(f)
Defines an assertion mechanism - only when compiled in debug.
#define MRPT_THROW_UNKNOWN_SERIALIZATION_VERSION(__V)
For use in CSerializable implementations.
#define THROW_EXCEPTION(msg)
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler.
#define THROW_EXCEPTION_FMT(_FORMAT_STRING,...)
This base provides a set of functions for maths stuff.
void renderSetOfObjects(const mrpt::opengl::CListOpenGLObjects &objs)
For each object in the list:
The namespace for 3D scene representation and rendering.
std::deque< CRenderizable::Ptr > CListOpenGLObjects
A list of objects pointers, automatically managing memory free at destructor, and managing copies cor...
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values,...
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.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
std::string format(const char *fmt,...) MRPT_printf_format_check(1
A std::string version of C sprintf.
unsigned __int32 uint32_t
3D line, represented by a base point and a director vector.
double director[3]
Director vector.
TPoint3D pBase
Base point.
double x
X,Y,Z coordinates.
Each of the possible lights of a 3D scene.
float azimuth
Camera elev & azimuth, in radians.
mrpt::math::TPoint3D pointing
The camera points to here.
mrpt::math::TPoint3D eye
The camera is here.
mrpt::math::TPoint3D up
Up vector of the camera.
size_t viewport_width
In pixels.