MRPT  1.9.9
CRenderizableDisplayList.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | http://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2018, Individual contributors, see AUTHORS file |
6  | See: http://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See details in http://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "opengl-precomp.h" // Precompiled header
11 
14 #include <mutex>
15 #include <cstdlib> // atexit()
16 
17 #include "opengl_internals.h"
18 
19 using namespace std;
20 using namespace mrpt;
21 using namespace mrpt::opengl;
22 
25 
26 // TAuxDLData: needed since it seems we must delete display lists from the same
27 // thread we create them....
28 
29 // Phoenix Singleton pattern
30 void deleteSingleton();
31 struct TAuxDLData
32 {
33  std::vector<unsigned int> dls_to_delete;
34  std::recursive_mutex dls_to_delete_cs;
35 
37  {
38  if (!m_pInstance)
39  {
40  m_pInstance = new TAuxDLData;
41  std::atexit(deleteSingleton);
42  }
43  return *m_pInstance;
44  }
45 
47 };
49 {
51  {
53  TAuxDLData::m_pInstance = nullptr;
54  }
55 }
57 
58 // Default constructor:
59 CRenderizableDisplayList::CRenderizableDisplayList()
60  : m_dl(INVALID_DISPLAY_LIST_ID), m_dl_recreate(true)
61 {
62 }
63 
64 // Destructor:
66 {
67  // If we had an associated display list:
69  {
70  // Delete the graphical memory (actually, enque the request...)
72  obj.dls_to_delete_cs.lock();
73  obj.dls_to_delete.push_back(m_dl);
74  obj.dls_to_delete_cs.unlock();
75  }
76 }
77 
78 // This is the virtual rendering method CRenderizable expects from us.
79 // We call our derived class to save the list, then just call that list:
81 {
82 #if MRPT_HAS_OPENGL_GLUT
84  {
85  // The object is in a state where caching a display list is not
86  // preferred, so render directly:
87  render_dl();
88  }
89  else
90  {
91  // We must delete pending dl's in the same thread we create them, so,
92  // let's do it here, for example:
94  if (!obj.dls_to_delete.empty())
95  {
96  obj.dls_to_delete_cs.lock();
97 #if MRPT_HAS_OPENGL_GLUT
98  for (size_t i = 0; i < obj.dls_to_delete.size(); i++)
99  glDeleteLists(obj.dls_to_delete[i], 1);
100 #endif
101  obj.dls_to_delete.clear();
102  obj.dls_to_delete_cs.unlock();
103  }
104 
106  {
107  m_dl = glGenLists(1); // Assign list ID upon first usage.
108  if (glGetError() != GL_NO_ERROR)
109  std::cerr << "glGenLists: Error" << std::endl;
110  }
111 
112  if (m_dl_recreate)
113  {
114  m_dl_recreate = false;
116  if (glGetError() != GL_NO_ERROR)
117  std::cerr << "glNewList: Error" << std::endl;
118 
119  // Call derived class:
120  render_dl();
121 
122  glEndList();
123  if (glGetError() != GL_NO_ERROR)
124  std::cerr << "glEndList: Error" << std::endl;
125  }
126 
127  // Call the list:
128  glCallList(m_dl);
129  glGetError(); // Clear any error flags that may remain: this is because
130  // it seems FBO rendering lead to "errors" but it
131  // actually renders OK...
132  }
133 #endif
134 }
bool m_dl_recreate
If using display lists, this is true when the list must be updated (the object changes, it&#39;s the first rendering, etc...).
void deleteSingleton()
GLAPI GLuint GLAPIENTRY glGenLists(GLsizei range)
std::vector< unsigned int > dls_to_delete
static TAuxDLData * m_pInstance
void render() const override
Render the object, regenerating the display list if needed, otherwise just calling it...
The base class of 3D objects that can be directly rendered through OpenGL.
Definition: CRenderizable.h:41
IMPLEMENTS_VIRTUAL_SERIALIZABLE(CRenderizableDisplayList, CRenderizable, mrpt::opengl) void deleteSingleton()
GLAPI void GLAPIENTRY glDeleteLists(GLuint list, GLsizei range)
virtual bool should_skip_display_list_cache() const
Optional: If the object has some state in which creating a display list is NOT preferred over direct ...
STL namespace.
GLsizei GLsizei GLuint * obj
Definition: glext.h:4070
unsigned int m_dl
Display list ID, for derived classes that want to use it (it&#39;s automatically deleted and freed on des...
virtual void render_dl() const =0
Derived classes must implement this method to the render the object.
A renderizable object suitable for rendering with OpenGL&#39;s display lists.
GLAPI void GLAPIENTRY glNewList(GLuint list, GLenum mode)
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define GL_NO_ERROR
Definition: glew.h:326
#define INVALID_DISPLAY_LIST_ID
std::recursive_mutex dls_to_delete_cs
static TAuxDLData & getSingleton()
GLAPI GLenum GLAPIENTRY glGetError(void)
The namespace for 3D scene representation and rendering.
Definition: CGlCanvasBase.h:15
GLAPI void GLAPIENTRY glEndList(void)
#define GL_COMPILE
Definition: glew.h:588
GLAPI void GLAPIENTRY glCallList(GLuint list)



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: 7d5e6d718 Fri Aug 24 01:51:28 2018 +0200 at lun nov 2 08:35:50 CET 2020