OpenMesh
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
PropertyT.hh
1 /*===========================================================================*\
2  * *
3  * OpenMesh *
4  * Copyright (C) 2001-2015 by Computer Graphics Group, RWTH Aachen *
5  * www.openmesh.org *
6  * *
7  *---------------------------------------------------------------------------*
8  * This file is part of OpenMesh. *
9  * *
10  * OpenMesh is free software: you can redistribute it and/or modify *
11  * it under the terms of the GNU Lesser General Public License as *
12  * published by the Free Software Foundation, either version 3 of *
13  * the License, or (at your option) any later version with the *
14  * following exceptions: *
15  * *
16  * If other files instantiate templates or use macros *
17  * or inline functions from this file, or you compile this file and *
18  * link it with other files to produce an executable, this file does *
19  * not by itself cause the resulting executable to be covered by the *
20  * GNU Lesser General Public License. This exception does not however *
21  * invalidate any other reasons why the executable file might be *
22  * covered by the GNU Lesser General Public License. *
23  * *
24  * OpenMesh is distributed in the hope that it will be useful, *
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
27  * GNU Lesser General Public License for more details. *
28  * *
29  * You should have received a copy of the GNU LesserGeneral Public *
30  * License along with OpenMesh. If not, *
31  * see <http://www.gnu.org/licenses/>. *
32  * *
33 \*===========================================================================*/
34 
35 /*===========================================================================*\
36  * *
37  * $Revision: 1188 $ *
38  * $Date: 2015-01-05 16:34:10 +0100 (Mo, 05 Jan 2015) $ *
39  * *
40 \*===========================================================================*/
41 
42 #ifndef OPENMESH_KERNEL_OSG_PROPERTYT_HH
43 #define OPENMESH_KERNEL_OSG_PROPERTYT_HH
44 
45 
46 //== INCLUDES =================================================================
47 
49 #include <OpenMesh/Core/Mesh/BaseKernel.hh>
50 #include <OpenMesh/Core/Utils/GenProg.hh>
51 #include <OpenMesh/Core/Utils/Property.hh>
52 //
53 #include <osg/Geometry>
54 //
55 #include <stdexcept>
56 #include <vector>
57 
58 
59 //== NAMESPACES ===============================================================
60 
61 namespace OpenMesh {
62 namespace Kernel_OSG {
63 
64 
65 //== CLASS DEFINITION =========================================================
66 
67 
68 // ----------------------------------------------------------------------------
69 
84 template <typename GeoProperty>
85 class oPropertyT : public BaseProperty
86 {
87 public:
88 
89  // Type of the encapsulated OpenSG Geometry Property
90  typedef GeoProperty property_t;
91  typedef typename property_t::PtrType property_ptr_t;
92 
93  typedef typename property_t::StoredFieldType field_t;
94  typedef typename field_t::StoredType element_t;
95  typedef typename field_t::StoredType value_type;
96 
97 public:
98 
99  //
100  oPropertyT( property_ptr_t _geo_prop,
101  const std::string& _name = "<unknown>" )
102  : BaseProperty(_name), data_( _geo_prop )
103  {
104  osg_init_check();
105  }
106 
107  //
108  oPropertyT( const std::string& _name = "<unknown>" )
109  : BaseProperty(_name), data_(NULL)
110  {
111  data_ = property_t::create();
112 
113  // make sure data_ is not null. In that case most probably
114  // osg::osgInit() hasn't been executed!
115  osg_init_check();
116  }
117 
119  virtual ~oPropertyT()
120  { }
121 
122 public:
123 
124  oPropertyT& operator = (const oPropertyT& _rhs )
125  {
126  // Shallow copy! Remember, data_ is a osg pointer type, and the assign
127  // operator makes a shallow copy!
128  data_ = _rhs.data_;
129  return *this;
130 
131  }
132 
133 
134 public: // interface BaseProperty
135 
136  virtual void reserve(size_t _n) { data_->getField().reserve( _n ); }
137  virtual void resize(size_t _n) { data_->resize( _n ); }
138  virtual void push_back() { data_->resize( data_->size()+1 ); }
139  virtual void swap(size_t _i0, size_t _i1)
140  { std::swap( data_->getField()[_i0], data_->getField()[_i1] ); }
141 
142  virtual oPropertyT<property_t>* clone() const
143  {
145  if (n_elements() > 0)
146  {
147  // OSGGeoProperty does not provide a deep copy
148  dolly->resize(n_elements());
149  element_t *begin = const_cast<element_t*>(data());
150  element_t *end = begin+n_elements();
151  element_t *dst = const_cast<element_t*>(dolly->data());
152  std::copy( begin, end, dst );
153  }
154  return dolly;
155  }
156 
157 public:
158 
159  virtual void set_persistent( bool _yn )
160  {
161  check_and_set_persistent<element_t>(_yn);
162  }
163 
164  virtual size_t n_elements() const
165  { return data_==osg::NullFC ? UnknownSize : data_->getSize(); }
166 
167  virtual size_t element_size() const
168  { return UnknownSize; }
169 
170  virtual size_t store( std::ostream& _ostr, bool _swap ) const
171  { return 0; }
172 
173  virtual size_t restore( std::istream& _istr, bool _swap )
174  { return 0; }
175 
176 
177 public: // OpenSG GeoPropertyInterface compatibility
178 
179  void clear(void) { data_->clear(); }
180 
181 
182 public: // access to OpenSG GeoProperty
183 
184  property_ptr_t& osg_ptr()
185  { return data_; }
186 
187  const property_ptr_t& osg_ptr() const
188  { return data_; }
189 
190 
191  const element_t *data() const
192  { return &( (*this)[ 0 ] ); }
193 
194  element_t& operator[](size_t idx)
195  { return data_->getField()[ idx ]; }
196 
197  const element_t& operator[](size_t idx) const
198  { return data_->getField()[ idx ]; }
199 
200 
201 protected:
202 
203  property_ptr_t data_;
204 
205 
206 private:
207 
208  void osg_init_check(void)
209  {
210  // make sure data_ is not null. In that case most probably
211  // osg::osgInit() hasn't been executed!
212  if ( data_ == osg::NullFC )
213  throw std::logic_error("OpenSG Runtime Environment is not initialized: " \
214  "Use osg::osgInit()");
215  }
216 
217  oPropertyT( const oPropertyT& );
218 };
219 
220 // ----------------------------------------------------------------- class ----
221 
222 
223 // ------------------------------------------------------------ properties ----
224 
226 namespace VP {
227 
228  // ---------------------------------------- Positions
230 
239 
240  // ---------------------------------------- Normals
242 
246 
247  // ---------------------------------------- TexCoords
249 
255 
256  // ---------------------------------------- Colors
258 
265 
266 } // namespace VP
267 
268 
270 namespace FP {
271 
272  // ---------------------------------------- Types
275 
276  // ---------------------------------------- Lengths
279 
280  // ---------------------------------------- Indices
281 
283 
285  template < typename IsTriMesh >
286  class GeoIndicesUI32 : public _GeoIndicesUI32
287  {
288  public: // ---------------------------------------- typedefs
289 
290  typedef _GeoIndicesUI32 inherited_t;
291  typedef typename inherited_t::property_ptr_t property_ptr_t;
292 
293  public: // ---------------------------------------- ctor/dtor
294 
295  GeoIndicesUI32( property_ptr_t _geo_prop,
296  GeoPTypesUI8& _types,
297  GeoPLengthsUI32& _lengths)
298  : inherited_t( _geo_prop ), types_(_types), length_(_lengths)
299  { }
300 
301  GeoIndicesUI32( GeoPTypesUI8& _types,
302  GeoPLengthsUI32& _lengths)
303  : inherited_t(), types_(_types), length_(_lengths)
304  { }
305 
306  virtual ~GeoIndicesUI32()
307  { }
308 
309  public: // ---------------------------------------- inherited
310 
311  void swap(size_t _i0, size_t _i1) { _swap( _i0, _i1, IsTriMesh() ); }
312  virtual void reserve(size_t _n) { _reserve( _n, IsTriMesh() ); }
313  virtual void resize(size_t _n) { _resize( _n, IsTriMesh() ); }
314 
315  protected: // ------------------------------------- swap
316 
317  void _swap(size_t _i0, size_t _i1, GenProg::False )
318  {
319  omerr() << "Unsupported mesh type!" << std::endl;
320  assert(0);
321  }
322 
323  void _swap(size_t _i0, size_t _i1, GenProg::True )
324  {
325  size_t j0 = _i0 + _i0 + _i0;
326  size_t j1 = _i1 + _i1 + _i1;
327 
328  inherited_t::swap( j0, j1 );
329  inherited_t::swap( ++j0, ++j1 );
330  inherited_t::swap( ++j0, ++j1 );
331  }
332 
333  virtual void _reserve(size_t _n, GenProg::True )
334  { inherited_t::reserve( _n + _n + _n ); }
335 
336  virtual void _reserve(size_t _n, GenProg::False )
337  { assert( false ); }
338 
339  virtual void _resize(size_t _n, GenProg::True )
340  { inherited_t::resize( _n + _n + _n ); }
341 
342  virtual void _resize(size_t _n, GenProg::False )
343  { assert( false ); }
344 
345 
346  protected:
347 
348  GeoPTypesUI8 &types_;
349  GeoPLengthsUI32 &length_;
350 
351  };
352 
353 } // namespace FP
354 
355 
356 // ----------------------------------------------------------------------------
357 
358 #ifndef DOXY_IGNORE_THIS
359 
360 template <typename T> struct _t2vp;
361 template <> struct _t2vp< osg::Pnt2f >
362 { typedef osg::GeoPositions2f type; typedef VP::GeoPositions2f prop; };
363 
364 template <> struct _t2vp< osg::Pnt3f >
365 { typedef osg::GeoPositions3f type; typedef VP::GeoPositions3f prop; };
366 
367 template <> struct _t2vp< osg::Pnt4f >
368 { typedef osg::GeoPositions4f type; typedef VP::GeoPositions4f prop; };
369 
370 template <> struct _t2vp< osg::Pnt2d >
371 { typedef osg::GeoPositions2d type; typedef VP::GeoPositions2d prop; };
372 template <> struct _t2vp< osg::Pnt3d >
373 { typedef osg::GeoPositions3d type; typedef VP::GeoPositions3d prop; };
374 template <> struct _t2vp< osg::Pnt4d >
375 { typedef osg::GeoPositions4d type; typedef VP::GeoPositions4d prop; };
376 
377 template <typename T> struct _t2vn;
378 template <> struct _t2vn< osg::Vec3f >
379 { typedef osg::GeoNormals3f type; typedef VP::GeoNormals3f prop; };
380 
381 template <typename T> struct _t2vc;
382 template <> struct _t2vc< osg::Color3f >
383 { typedef osg::GeoColors3f type; typedef VP::GeoColors3f prop; };
384 
385 template <> struct _t2vc< osg::Color4f >
386 { typedef osg::GeoColors4f type; typedef VP::GeoColors4f prop; };
387 
388 template <> struct _t2vc< osg::Color3ub >
389 { typedef osg::GeoColors3ub type; typedef VP::GeoColors3ub prop; };
390 
391 template <> struct _t2vc< osg::Color4ub >
392 { typedef osg::GeoColors4ub type; typedef VP::GeoColors3ub prop; };
393 
394 template <typename T> struct _t2vtc;
395 template <> struct _t2vtc< osg::Vec2f >
396 { typedef osg::GeoTexCoords2f type; typedef VP::GeoTexCoords2f prop; };
397 
398 template <> struct _t2vtc< osg::Vec3f >
399 { typedef osg::GeoTexCoords3f type; typedef VP::GeoTexCoords3f prop; };
400 
401 #endif
402 
403 //=============================================================================
404 } // namespace Kernel_OSG
405 } // namespace OpenMesh
406 //=============================================================================
407 #endif // OPENMESH_PROPERTYT_HH defined
408 //=============================================================================
409 
virtual size_t element_size() const
Size of one element in bytes or UnknownSize if not known.
Definition: PropertyT.hh:167
virtual void set_persistent(bool _yn)
Enable or disable persistency.
Definition: PropertyT.hh:159
virtual size_t store(std::ostream &_ostr, bool _swap) const
Store self as one binary block.
Definition: PropertyT.hh:170
oPropertyT< osg::GeoNormals3f > GeoNormals3f
Adaptor for osg::GeoNormals.
Definition: PropertyT.hh:244
oPropertyT< osg::GeoColors4f > GeoColors4f
Adaptor for osg::GeoColors.
Definition: PropertyT.hh:262
virtual void resize(size_t _n)
Resize storage to hold n elements.
Definition: PropertyT.hh:313
virtual void swap(size_t _i0, size_t _i1)
Let two elements swap their storage place.
Definition: PropertyT.hh:139
void clear(void)
Clear all elements and free memory.
Definition: PropertyT.hh:179
oPropertyT< osg::GeoTexCoords2f > GeoTexCoords2f
Adaptor for osg::GeoTexCoords.
Definition: PropertyT.hh:252
static const size_t UnknownSize
Indicates an error when a size is returned by a member.
Definition: BaseProperty.hh:63
virtual size_t restore(std::istream &_istr, bool _swap)
Restore self from a binary block.
Definition: PropertyT.hh:173
virtual void resize(size_t _n)
Resize storage to hold n elements.
Definition: PropertyT.hh:137
virtual void reserve(size_t _n)
Reserve memory for n elements.
Definition: PropertyT.hh:136
virtual size_t n_elements() const
Number of elements in property.
Definition: PropertyT.hh:164
oPropertyT< osg::GeoPLengthsUI32 > GeoPLengthsUI32
Adaptor for osg::GeoPLengthsUI32.
Definition: PropertyT.hh:278
oPropertyT< osg::GeoColors3f > GeoColors3f
Adaptor for osg::GeoColors.
Definition: PropertyT.hh:260
oPropertyT< osg::GeoColors4ub > GeoColors4ub
Adaptor for osg::GeoColors.
Definition: PropertyT.hh:263
oPropertyT< osg::GeoTexCoords1f > GeoTexCoords1f
Adaptor for osg::GeoTexCoords.
Definition: PropertyT.hh:251
Abstract class defining the basic interface of a dynamic property.
Definition: BaseProperty.hh:58
oPropertyT< osg::GeoPositions2d > GeoPositions2d
Adaptor for osg::GeoPositions.
Definition: PropertyT.hh:232
Property adaptor for OpenSG GeoProperties.
Definition: PropertyT.hh:85
oPropertyT< osg::GeoPositions2f > GeoPositions2f
Adaptor for osg::GeoPositions.
Definition: PropertyT.hh:233
virtual oPropertyT< property_t > * clone() const
Return a deep copy of self.
Definition: PropertyT.hh:142
virtual void reserve(size_t _n)
Reserve memory for n elements.
Definition: PropertyT.hh:312
Adaptor for osg::GeoIndicesUI32.
Definition: PropertyT.hh:286
oPropertyT< osg::GeoPositions3f > GeoPositions3f
Adaptor for osg::GeoPositions.
Definition: PropertyT.hh:235
This file provides some macros containing attribute usage.
oPropertyT< osg::GeoPositions4d > GeoPositions4d
Adaptor for osg::GeoPositions.
Definition: PropertyT.hh:236
oPropertyT< osg::GeoColors3ub > GeoColors3ub
Adaptor for osg::GeoColors.
Definition: PropertyT.hh:261
BaseProperty(const std::string &_name="<unknown>")
Default constructor.
Definition: BaseProperty.hh:81
virtual void push_back()
Extend the number of elements by one.
Definition: PropertyT.hh:138
void swap(size_t _i0, size_t _i1)
Let two elements swap their storage place.
Definition: PropertyT.hh:311
Contains all the mesh ingredients like the polygonal mesh, the triangle mesh, different mesh kernels ...
Definition: MeshItems.hh:56
oPropertyT< osg::GeoPTypesUI8 > GeoPTypesUI8
Adaptor for osg::GeoPTypesUI8.
Definition: PropertyT.hh:274
oPropertyT< osg::GeoPositions3d > GeoPositions3d
Adaptor for osg::GeoPositions.
Definition: PropertyT.hh:234
oPropertyT< osg::GeoPositions4f > GeoPositions4f
Adaptor for osg::GeoPositions.
Definition: PropertyT.hh:237
oPropertyT< osg::GeoTexCoords3f > GeoTexCoords3f
Adaptor for osg::GeoTexCoords.
Definition: PropertyT.hh:253

acg pic Project OpenMesh, ©  Computer Graphics Group, RWTH Aachen. Documentation generated using doxygen .