@@ -88,8 +88,8 @@ class RA_ENGINE_API AttribArrayDisplayable : public Displayable
8888 };
8989
9090 public:
91- explicit AttribArrayDisplayable ( const std::string& name );
92- // , MeshRenderMode renderMode = RM_TRIANGLES
91+ explicit AttribArrayDisplayable ( const std::string& name ,
92+ MeshRenderMode renderMode = RM_TRIANGLES );
9393
9494 AttribArrayDisplayable ( const AttribArrayDisplayable& rhs ) = delete ;
9595 void operator =( const AttribArrayDisplayable& rhs ) = delete ;
@@ -99,10 +99,10 @@ class RA_ENGINE_API AttribArrayDisplayable : public Displayable
9999
100100 using Displayable::getName;
101101
102- // /// Set the render mode.
103- // inline void setRenderMode( MeshRenderMode mode );
104- // /// Get the render mode.
105- // inline MeshRenderMode getRenderMode() const;
102+ // / Set the render mode.
103+ inline void setRenderMode ( MeshRenderMode mode );
104+ // / Get the render mode.
105+ inline MeshRenderMode getRenderMode () const ;
106106
107107 // / @name
108108 // / Mark attrib data as dirty, forcing an update of the OpenGL buffer.
@@ -165,7 +165,7 @@ class RA_ENGINE_API AttribArrayDisplayable : public Displayable
165165 protected:
166166 std::unique_ptr<globjects::VertexArray> m_vao;
167167
168- // MeshRenderMode m_renderMode { MeshRenderMode::RM_TRIANGLES };
168+ MeshRenderMode m_renderMode { MeshRenderMode::RM_TRIANGLES };
169169
170170 // m_vbos and m_dataDirty have the same size and are indexed thru m_handleToBuffer[attribName]
171171 std::vector<std::unique_ptr<globjects::Buffer>> m_vbos;
@@ -293,27 +293,27 @@ class CoreGeometryDisplayable : public AttribArrayDisplayable
293293};
294294
295295// / A PointCloud without indices
296- // class RA_ENGINE_API PointCloud : public CoreGeometryDisplayable<Core::Geometry::PointCloud>
297- // {
298- // using base = CoreGeometryDisplayable<Core::Geometry::PointCloud>;
299- //
300- // public:
301- // using base::CoreGeometryDisplayable;
302- // inline explicit PointCloud(
303- // const std::string& name,
304- // typename base::CoreGeometry&& geom,
305- // typename base::MeshRenderMode renderMode = base::MeshRenderMode::RM_POINTS );
306- //
307- // inline explicit PointCloud( const std::string& name, MeshRenderMode renderMode = RM_POINTS );
308- //
309- // /// use glDrawArrays to draw all the points in the point cloud
310- // void render( const ShaderProgram* prog ) override;
311- //
312- // void loadGeometry( Core::Geometry::PointCloud&& mesh ) override;
313- //
314- // protected:
315- // void updateGL_specific_impl() override;
316- // };
296+ class RA_ENGINE_API PointCloud : public CoreGeometryDisplayable<Core::Geometry::PointCloud>
297+ {
298+ using base = CoreGeometryDisplayable<Core::Geometry::PointCloud>;
299+
300+ public:
301+ using base::CoreGeometryDisplayable;
302+ inline explicit PointCloud (
303+ const std::string& name,
304+ typename base::CoreGeometry&& geom,
305+ typename base::MeshRenderMode renderMode = base::MeshRenderMode::RM_POINTS );
306+
307+ inline explicit PointCloud ( const std::string& name, MeshRenderMode renderMode = RM_POINTS );
308+
309+ // / use glDrawArrays to draw all the points in the point cloud
310+ void render ( const ShaderProgram* prog ) override ;
311+
312+ void loadGeometry ( Core::Geometry::PointCloud&& mesh ) override ;
313+
314+ protected:
315+ void updateGL_specific_impl () override ;
316+ };
317317
318318// / An engine mesh owning CoreGeometry, with indices
319319template <typename T>
@@ -369,18 +369,20 @@ class RA_ENGINE_API GeometryDisplayable : public AttribArrayDisplayable
369369 const std::string& shaderAttribName );
370370
371371 void loadGeometry ( Core::Geometry::MultiIndexedGeometry&& mesh );
372- inline void loadGeometry ( Core::Geometry::MultiIndexedGeometry&& mesh, LayerKeyType key ) {
372+ inline void loadGeometry ( Core::Geometry::MultiIndexedGeometry&& mesh, LayerKeyType key, base::MeshRenderMode renderMode ) {
373373 loadGeometry ( std::move ( mesh ) );
374- addRenderLayer ( key );
374+ addRenderLayer ( key, renderMode );
375375 }
376+
377+ // / \param r is a collection of keys and renderMode, e.g. { {key1, RM_TRIANGLES}, {key2, RM_LINES} }
376378 template <typename RangeOfLayerKeys>
377379 inline void loadGeometry ( Core::Geometry::MultiIndexedGeometry&& mesh,
378380 const RangeOfLayerKeys& r ) {
379381 loadGeometry ( std::move ( mesh ) );
380382 for ( const auto & k : r )
381- addRenderLayer ( k );
383+ addRenderLayer ( k. first , k. second );
382384 }
383- bool addRenderLayer ( LayerKeyType key );
385+ bool addRenderLayer ( LayerKeyType key, base::MeshRenderMode renderMode );
384386 bool removeRenderLayer ( LayerKeyType key );
385387 // bool setRenderMode( LayerKeyType key, RenderMode );
386388 // RenderMode getRenderMode( LayerKeyType key );
@@ -403,17 +405,21 @@ class RA_ENGINE_API GeometryDisplayable : public AttribArrayDisplayable
403405 Core::Geometry::MultiIndexedGeometry m_geom;
404406
405407 // / Data required to configure rendering for each layer
408+ // / \note In the current version, do not know which VBOEntryType is associated to this vao:
409+ // / there is no way to clean m_indicesVBOs when a LayerEntryType is removed.
406410 struct LayerEntryType {
407411 int observerId { -1 };
408- globjects::VertexArray vao {};
412+ std::unique_ptr< globjects::VertexArray> vao {nullptr };
409413 base::MeshRenderMode renderMode { RM_TRIANGLES };
414+
415+ inline LayerEntryType () = default;
410416 };
411417 std::unordered_map<LayerKeyType, LayerEntryType, LayerKeyHash> m_geomLayers;
412418
413419 // / Data required to store and used VBOs
414420 struct VBOEntryType {
415421 bool dirty { false };
416- globjects::Buffer buffer {};
422+ std::unique_ptr< globjects::Buffer> buffer { nullptr };
417423 size_t numElements { 0 };
418424 };
419425 using VBOCollection = std::vector<VBOEntryType>;
0 commit comments