MRPT  1.9.9
CRenderizableDisplayList.cpp
Go to the documentation of this file.
1 /* +------------------------------------------------------------------------+
2  | Mobile Robot Programming Toolkit (MRPT) |
3  | https://www.mrpt.org/ |
4  | |
5  | Copyright (c) 2005-2019, Individual contributors, see AUTHORS file |
6  | See: https://www.mrpt.org/Authors - All rights reserved. |
7  | Released under BSD License. See: https://www.mrpt.org/License |
8  +------------------------------------------------------------------------+ */
9 
10 #include "opengl-precomp.h" // Precompiled header
11 
14 #include <cstdlib> // atexit()
15 #include <mutex>
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()
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 (unsigned int i : obj.dls_to_delete) glDeleteLists(i, 1);
99 #endif
100  obj.dls_to_delete.clear();
101  obj.dls_to_delete_cs.unlock();
102  }
103 
105  {
106  m_dl = glGenLists(1); // Assign list ID upon first usage.
107  if (glGetError() != GL_NO_ERROR)
108  std::cerr << "glGenLists: Error" << std::endl;
109  }
110 
111  if (m_dl_recreate)
112  {
113  m_dl_recreate = false;
115  if (glGetError() != GL_NO_ERROR)
116  std::cerr << "glNewList: Error" << std::endl;
117 
118  // Call derived class:
119  render_dl();
120 
121  glEndList();
122  if (glGetError() != GL_NO_ERROR)
123  std::cerr << "glEndList: Error" << std::endl;
124  }
125 
126  // Call the list:
127  glCallList(m_dl);
128  glGetError(); // Clear any error flags that may remain: this is because
129  // it seems FBO rendering lead to "errors" but it
130  // actually renders OK...
131  }
132 #endif
133 }
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:40
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:4085
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:327
#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:589
GLAPI void GLAPIENTRY glCallList(GLuint list)



Page generated by Doxygen 1.8.14 for MRPT 1.9.9 Git: abb8b1a1e Fri Oct 18 14:19:12 2019 +0200 at vie oct 18 14:20:13 CEST 2019