Ocean
GLESVertexSet.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) Meta Platforms, Inc. and affiliates.
3  *
4  * This source code is licensed under the MIT license found in the
5  * LICENSE file in the root directory of this source tree.
6  */
7 
8 #ifndef META_OCEAN_RENDERING_GLES_VERTEX_SET_H
9 #define META_OCEAN_RENDERING_GLES_VERTEX_SET_H
10 
14 
15 #include "ocean/math/BoundingBox.h"
16 
19 
20 namespace Ocean
21 {
22 
23 namespace Rendering
24 {
25 
26 namespace GLESceneGraph
27 {
28 
29 /**
30  * This class implements a GLESceneGraph vertex set object.
31  * @ingroup renderinggles
32  */
33 class OCEAN_RENDERING_GLES_EXPORT GLESVertexSet :
34  virtual public GLESObject,
35  virtual public VertexSet
36 {
37  public:
38 
39  /**
40  * This class is the base class for all VertexBufferObjects
41  */
43  {
44  public:
45 
46  /**
47  * Destructs a vertex buffer object and releases all resources.
48  */
49  virtual ~VertexBufferObject() = default;
50 
51  /**
52  * Binds a vertex buffer object to a given program.
53  * @param programId The id of the program to which this object will be bound.
54  */
55  virtual void bind(const GLuint programId) const = 0;
56  };
57 
58  /**
59  * This class implements the wrapper around a vertex buffer object.
60  * @tparam T The data type of the elements the vertex buffer object is holding
61  */
62  template <typename T>
64  {
65  public:
66 
67  /**
68  * Creates a new vertex buffer object.
69  * @param attributeName The attribute name to which this vertex buffer will be bound
70  */
71  explicit VertexBufferObjectT(std::string attributeName);
72 
73  /**
74  * Move constructor.
75  * @param vertexBufferObject Vertex buffer object to be moved
76  */
78 
79  /**
80  * Destructs the object and releases all resources.
81  */
82  ~VertexBufferObjectT() override // need to be defined here in the class as Clang will complain otherwise
83  {
84  release();
85  }
86 
87  /**
88  * Sets the data of this buffer.
89  * @param elements The elements to be set, must be valid
90  * @param numberElements The number of elements to set, with range [1, infinity)
91  * @param usage Specifies the expected usage pattern of the data store
92  */
93  void setData(const T* elements, const size_t numberElements, const GLenum usage = GL_STATIC_DRAW);
94 
95  /**
96  * Binds this vertex buffer to a specified program.
97  * @param programId The id of the program to which the buffer will be bound
98  * @param attributeName Optional explicit attribute name to be used instead of the object's attribute name; nullptr to use the object's attribute name
99  */
100  void bind(const GLuint programId, const char* attributeName) const;
101 
102  /**
103  * Binds a vertex buffer object to a given program.
104  * @see VertexBufferObject::bind().
105  */
106  void bind(const GLuint programId) const override;
107 
108  /**
109  * Returns the number of elements the object holds.
110  * @return The object's elements
111  */
112  inline unsigned int numberElements() const;
113 
114  /**
115  * Explicitly releases the vertex buffer object and all resources.
116  */
117  void release();
118 
119  protected:
120 
121  /**
122  * Disabled copy constructor.
123  * @param vertexBufferObject The vertex buffer object which would be copied
124  */
125  VertexBufferObjectT(const VertexBufferObjectT& vertexBufferObject) = delete;
126 
127  protected:
128 
129  /// The attribute name associated with this buffer object.
130  std::string attributeName_;
131 
132  /// The buffer object.
133  GLuint buffer_ = 0u;
134 
135  /// The number of elements stored in the buffer object.
136  unsigned int numberElements_ = 0u;
137  };
138 
139  protected:
140 
141  typedef std::unordered_map<std::string, std::shared_ptr<VertexBufferObject>> VertexBufferObjectMap;
142 
143  /**
144  * Returns the number of components a data type has.
145  * @return The data type's number of components
146  * @tparam T The data type
147  */
148  template <typename T>
149  static constexpr size_t numberComponents();
150 
151  /**
152  * Returns the type of the components of a data type.
153  * @return The data type's component type
154  * @tparam T The data type
155  */
156  template <typename T>
157  static constexpr GLenum componentType();
158 
159  /**
160  * Returns whether the component is float component.
161  * @return True, if so; False, if the component is an integer component
162  * @tparam T The data type
163  */
164  template <typename T>
165  static constexpr bool isFloatComponent();
166 
167  public:
168 
169  /**
170  * Creates a new GLESceneGraph vertex set object.
171  */
173 
174  /**
175  * Destructs a GLESceneGraph vertex set object.
176  */
177  ~GLESVertexSet() override;
178 
179  /**
180  * Returns the normals of this set.
181  * @see VertexSet::normals().
182  */
183  Normals normals() const override;
184 
185  /**
186  * Returns the texture coordinates of this set.
187  * @see VertexSet::textureCoordinates().
188  */
189  TextureCoordinates textureCoordinates(const unsigned int layerIndex) const override;
190 
191  /**
192  * Returns the explicit reference coordinate system of the phantom object, if any.
193  * @return The name of the reference coordinate system
194  */
195  std::string phantomTextureCoordinateSystem() const override;
196 
197  /**
198  * Returns the vertices of this set.
199  * @see VertexSet::vertices().
200  */
201  Vertices vertices() const override;
202 
203  /**
204  * Returns the colors of this set.
205  * @see VertexSet::colors();
206  */
207  RGBAColors colors() const override;
208 
209  /**
210  * Returns the number of normals of this set.
211  * @see VertexSet::numberNormals().
212  */
213  unsigned int numberNormals() const override;
214 
215  /**
216  * Returns the number of texture coordinates of this set.
217  * @see VertexSet::numberTextureCoordinates().
218  */
219  unsigned int numberTextureCoordinates(const unsigned int layerIndex) const override;
220 
221  /**
222  * Returns the number of vertices of this set.
223  * @see VertexSet::numberVertices().
224  */
225  unsigned int numberVertices() const override;
226 
227  /**
228  * Returns the number of colors of this set.
229  * @see VertexSet::numberColors().
230  */
231  unsigned int numberColors() const override;
232 
233  /**
234  * Sets the normals for this set.
235  * @see VertexSet::setNormals().
236  */
237  void setNormals(const Normals& normals) override;
238 
239  /**
240  * Sets the normals for this set.
241  * @see VertexSet::setNormals().
242  */
243  void setNormals(const Vector3* normals, const size_t size) override;
244 
245  /**
246  * Sets the texels for this set.
247  * @see VertexSet::setTextureCoordinates().
248  */
249  void setTextureCoordinates(const TextureCoordinates& textureCoordinates, const unsigned int layerIndex) override;
250 
251  /**
252  * Sets 3D texels for this set used for phantom objects.
253  * @see VertexSet::setPhantomTextureCoordinates().
254  */
255  void setPhantomTextureCoordinates(const Vertices& textureCoordinates, const unsigned int layerIndex) override;
256 
257  /**
258  * Sets the explicit reference coordinate system of the phantom objects.
259  * @see VertexSet::setPhantomTextureCoordinateSystem().
260  */
261  void setPhantomTextureCoordinateSystem(const std::string& reference) override;
262 
263  /**
264  * Sets the vertices for this set.
265  * @see VertexSet::setVertices().
266  */
267  void setVertices(const Vertices& vertices) override;
268 
269  /**
270  * Sets the vertices for this set.
271  * @see VertexSet::setVertices().
272  */
273  void setVertices(const Vector3* vertices, const size_t size) override;
274 
275  /**
276  * Sets the colors for this set.
277  * @see VertexSet::setColors().
278  */
279  void setColors(const RGBAColors& colors) override;
280 
281  /**
282  * Sets several attributes concurrently.
283  * @see VertexSet::set().
284  */
285  void set(const Vertices& vertices, const Normals& normals, const TextureCoordinates& textureCoordinates, const RGBAColors& colors) override;
286 
287  /**
288  * Sets a custom VertexSet attribute in addition to the standard attributes like e.g., vertices, normals, textureCoordinates etc.
289  * @param attributeName The name of the attribute, must be valid
290  * @param elements The elements of the attribute to set, must be valid
291  * @param numberElements The number of elements to set, with range [1, infinity)
292  * @tparam T The data type of the elements of the attribute
293  */
294  template <typename T>
295  void setAttribute(const std::string& attributeName, const T* elements, const size_t numberElements);
296 
297  /**
298  * Binds the vertex set to a program.
299  * @param programId The id of the program to which the buffer will be bound
300  */
301  void bindVertexSet(const GLuint programId);
302 
303  /**
304  * Determines the bounding box of this vertex set.
305  * @param vertexIndices The indices of the vertices for which the bounding box will be determined, can be empty
306  * @return The resulting bounding box
307  */
308  BoundingBox boundingBox(const VertexIndices& vertexIndices) const;
309 
310  /**
311  * Determines the bounding box of this vertex set.
312  * @param triangleFaces The triangle faces of the vertices for which the bounding box will be determined, can be empty
313  * @return The resulting bounding box
314  */
315  BoundingBox boundingBox(const TriangleFaces& triangleFaces) const;
316 
317  /**
318  * Determines the bounding box of this vertex set.
319  * @param strips The triangle strips of the vertices for which the bounding box will be determined, can be empty
320  * @return The resulting bounding box
321  */
323 
324  /**
325  * Determines the bounding box of this vertex set.
326  * @param numberVertices The number of vertices for which the bounding box will be determined, with range [0, infinity)
327  * @return The resulting bounding box
328  */
329  BoundingBox boundingBox(const unsigned int numberVertices) const;
330 
331  /**
332  * Creates and initializes a buffer object's data store.
333  * @param target Specifies the target to which the buffer object is bound
334  * @param values The values to be set, must be valid
335  * @param size The number of values to be set, with range [1, infinity)
336  * @param usage Specifies the expected usage pattern of the data store
337  */
338  template <typename T>
339  static void setBufferData(const GLenum target, const T* values, const size_t size, const GLenum usage);
340 
341  protected:
342 
343  /**
344  * Releases all internal OpenGL ES vertex buffer objects.
345  */
346  void release();
347 
348  protected:
349 
350  /// The vertex array for this VertexSet.
351  GLuint vertexArray_ = 0u;
352 
353  /// The buffer object for the vertices.
355 
356  /// The buffer object for the normals.
358 
359  /// The buffer object for the 2D texture coordinates.
360  VertexBufferObjectT<Vector2> bufferTextureCoordinates2D_ = VertexBufferObjectT<Vector2>("aTextureCoordinate");
361 
362  /// The buffer object for the 3D textures coordinates (for phantom objects).
363  VertexBufferObjectT<Vector3> bufferTextureCoordinates3D_ = VertexBufferObjectT<Vector3>("aTextureCoordinate");
364 
365  /// The buffer object for the colors.
367 
368  /// The custom buffer objects.
370 
371  /// Explicit reference coordinate system for phantom texture coordinates.
373 
374  /// The vertices stored in this vertex set.
376 };
377 
378 template <typename T>
380  attributeName_(std::move(attributeName))
381 {
382  // nothing to do here
383 }
384 
385 template <typename T>
387  attributeName_(std::move(vertexBufferObject.attributeName_)),
388  buffer_(vertexBufferObject.buffer_),
389  numberElements_(vertexBufferObject.numberElements_)
390 {
391  vertexBufferObject.buffer_ = 0u;
392  vertexBufferObject.numberElements_ = 0u;
393 }
394 
395 template <typename T>
396 void GLESVertexSet::VertexBufferObjectT<T>::setData(const T* elements, const size_t numberElements, const GLenum usage)
397 {
398  ocean_assert(elements != nullptr);
399  ocean_assert(numberElements != 0);
400 
401  if (buffer_ == 0u)
402  {
403  glGenBuffers(1, &buffer_);
404  ocean_assert(GL_NO_ERROR == glGetError());
405  ocean_assert(buffer_ != 0u);
406  }
407 
408  glBindBuffer(GL_ARRAY_BUFFER, buffer_);
409  ocean_assert(GL_NO_ERROR == glGetError());
410 
411  setBufferData(GL_ARRAY_BUFFER, elements, numberElements, usage);
412  numberElements_ = (unsigned int)(numberElements);
413 
414  if (glGetError() == GL_OUT_OF_MEMORY)
415  {
416  release();
417 
418  ocean_assert(false && "Out of memory!");
419  }
420 }
421 
422 template <typename T>
423 void GLESVertexSet::VertexBufferObjectT<T>::bind(const GLuint programId, const char* attributeName) const
424 {
425  if (buffer_ != 0u)
426  {
427  glBindBuffer(GL_ARRAY_BUFFER, buffer_);
428  ocean_assert(GL_NO_ERROR == glGetError());
429 
430  ocean_assert(glIsProgram(programId));
431  const GLint location = glGetAttribLocation(programId, attributeName != nullptr ? attributeName : attributeName_.c_str());
432  ocean_assert(GL_NO_ERROR == glGetError());
433 
434  if (location != -1)
435  {
436  glEnableVertexAttribArray(location);
437  ocean_assert(GL_NO_ERROR == glGetError());
438 
439  constexpr GLint size = GLint(numberComponents<T>());
440  constexpr GLenum type = componentType<T>();
441 
442  if (isFloatComponent<T>())
443  {
444  glVertexAttribPointer(location, size, type, GL_FALSE, 0, nullptr);
445  }
446  else
447  {
448  glVertexAttribIPointer(location, size, type, 0, nullptr);
449  }
450 
451  ocean_assert(GL_NO_ERROR == glGetError());
452  }
453  }
454 }
455 
456 template <typename T>
457 void GLESVertexSet::VertexBufferObjectT<T>::bind(const GLuint programId) const
458 {
459  bind(programId, attributeName_.c_str());
460 }
461 
462 template <typename T>
464 {
465  return numberElements_;
466 }
467 
468 template <typename T>
470 {
471  if (buffer_ != 0u)
472  {
473  glDeleteBuffers(1, &buffer_);
474  ocean_assert(GL_NO_ERROR == glGetError());
475 
476  buffer_ = 0u;
477  numberElements_ = 0u;
478  }
479 }
480 
481 template <>
482 constexpr size_t GLESVertexSet::numberComponents<uint8_t>()
483 {
484  return 1;
485 }
486 
487 template <>
488 constexpr size_t GLESVertexSet::numberComponents<uint16_t>()
489 {
490  return 1;
491 }
492 
493 template <>
494 constexpr size_t GLESVertexSet::numberComponents<uint32_t>()
495 {
496  return 1;
497 }
498 
499 template <>
500 constexpr size_t GLESVertexSet::numberComponents<float>()
501 {
502  return 1;
503 }
504 
505 template <>
506 constexpr size_t GLESVertexSet::numberComponents<double>()
507 {
508  return 1;
509 }
510 
511 template <>
512 constexpr size_t GLESVertexSet::numberComponents<RGBAColor>()
513 {
514  return 4;
515 }
516 
517 template <>
518 constexpr size_t GLESVertexSet::numberComponents<VectorF2>()
519 {
520  return 2;
521 }
522 
523 template <>
524 constexpr size_t GLESVertexSet::numberComponents<VectorD2>()
525 {
526  return 2;
527 }
528 
529 template <>
530 constexpr size_t GLESVertexSet::numberComponents<VectorF3>()
531 {
532  return 3;
533 }
534 
535 template <>
536 constexpr size_t GLESVertexSet::numberComponents<VectorD3>()
537 {
538  return 3;
539 }
540 
541 template <>
542 constexpr size_t GLESVertexSet::numberComponents<VectorF4>()
543 {
544  return 4;
545 }
546 
547 template <>
548 constexpr size_t GLESVertexSet::numberComponents<VectorD4>()
549 {
550  return 4;
551 }
552 
553 template <>
554 constexpr size_t GLESVertexSet::numberComponents<VectorT4<uint16_t>>()
555 {
556  return 4;
557 }
558 
559 template <>
560 constexpr size_t GLESVertexSet::numberComponents<VectorT4<uint32_t>>()
561 {
562  return 4;
563 }
564 
565 template <typename T>
567 {
568  ocean_assert(false && "Missing implementation!");
569  return 0;
570 }
571 
572 template <>
573 constexpr GLenum GLESVertexSet::componentType<uint8_t>()
574 {
575  return GL_UNSIGNED_BYTE;
576 }
577 
578 template <>
579 constexpr GLenum GLESVertexSet::componentType<uint16_t>()
580 {
581  return GL_UNSIGNED_SHORT;
582 }
583 
584 template <>
585 constexpr GLenum GLESVertexSet::componentType<uint32_t>()
586 {
587  return GL_UNSIGNED_INT;
588 }
589 
590 template <>
591 constexpr GLenum GLESVertexSet::componentType<float>()
592 {
593  return GL_FLOAT;
594 }
595 
596 template <>
597 constexpr GLenum GLESVertexSet::componentType<double>()
598 {
599  return GL_FLOAT; // float as we use float32 only
600 }
601 
602 template <>
603 constexpr GLenum GLESVertexSet::componentType<RGBAColor>()
604 {
605  return GL_FLOAT;
606 }
607 
608 template <>
609 constexpr GLenum GLESVertexSet::componentType<VectorF2>()
610 {
611  return GL_FLOAT;
612 }
613 
614 template <>
615 constexpr GLenum GLESVertexSet::componentType<VectorD2>()
616 {
617  return GL_FLOAT;
618 }
619 
620 template <>
621 constexpr GLenum GLESVertexSet::componentType<VectorF3>()
622 {
623  return GL_FLOAT;
624 }
625 
626 template <>
627 constexpr GLenum GLESVertexSet::componentType<VectorD3>()
628 {
629  return GL_FLOAT;
630 }
631 
632 template <>
633 constexpr GLenum GLESVertexSet::componentType<VectorF4>()
634 {
635  return GL_FLOAT;
636 }
637 
638 template <>
639 constexpr GLenum GLESVertexSet::componentType<VectorD4>()
640 {
641  return GL_FLOAT;
642 }
643 
644 template <>
645 constexpr GLenum GLESVertexSet::componentType<VectorT4<uint16_t>>()
646 {
647  return GL_UNSIGNED_SHORT;
648 }
649 
650 template <>
651 constexpr GLenum GLESVertexSet::componentType<VectorT4<uint32_t>>()
652 {
653  return GL_UNSIGNED_INT;
654 }
655 
656 template <typename T>
658 {
659  ocean_assert(false && "Missing implementation!");
660  return 0;
661 }
662 
663 template <>
664 constexpr bool GLESVertexSet::isFloatComponent<uint8_t>()
665 {
666  return false;
667 }
668 
669 template <>
670 constexpr bool GLESVertexSet::isFloatComponent<uint16_t>()
671 {
672  return false;
673 }
674 
675 template <>
676 constexpr bool GLESVertexSet::isFloatComponent<uint32_t>()
677 {
678  return false;
679 }
680 
681 template <>
682 constexpr bool GLESVertexSet::isFloatComponent<VectorT4<uint16_t>>()
683 {
684  return false;
685 }
686 
687 template <>
688 constexpr bool GLESVertexSet::isFloatComponent<VectorT4<uint32_t>>()
689 {
690  return false;
691 }
692 
693 template <typename T>
695 {
696  return true;
697 }
698 
699 template <typename T>
700 void GLESVertexSet::setAttribute(const std::string& attibuteName, const T* elements, const size_t numberElements)
701 {
702  VertexBufferObjectMap::iterator iObject = customVertexBufferObjectMap_.find(attibuteName);
703 
704  if (iObject == customVertexBufferObjectMap_.cend())
705  {
706  iObject = customVertexBufferObjectMap_.emplace(attibuteName, std::make_shared<VertexBufferObjectT<T>>(attibuteName)).first;
707  }
708 
709  dynamic_cast<VertexBufferObjectT<T>*>(iObject->second.get())->setData(elements, numberElements);
710 }
711 
712 template <>
713 inline void GLESVertexSet::setBufferData(const GLenum target, const uint8_t* values, const size_t size, const GLenum usage)
714 {
715  ocean_assert(GL_NO_ERROR == glGetError());
716 
717  static_assert(sizeof(GLbyte) == sizeof(uint8_t), "Invalid data type!");
718 
719  glBufferData(target, GLsizeiptr(size * sizeof(GLbyte)), values, usage);
720  ocean_assert(GL_NO_ERROR == glGetError());
721 }
722 
723 template <>
724 inline void GLESVertexSet::setBufferData(const GLenum target, const uint16_t* values, const size_t size, const GLenum usage)
725 {
726  ocean_assert(GL_NO_ERROR == glGetError());
727 
728  static_assert(sizeof(GLshort) == sizeof(uint16_t), "Invalid data type!");
729 
730  glBufferData(target, GLsizeiptr(size * sizeof(GLshort)), values, usage);
731  ocean_assert(GL_NO_ERROR == glGetError());
732 }
733 
734 template <>
735 inline void GLESVertexSet::setBufferData(const GLenum target, const uint32_t* values, const size_t size, const GLenum usage)
736 {
737  ocean_assert(GL_NO_ERROR == glGetError());
738 
739  static_assert(sizeof(GLint) == sizeof(uint32_t), "Invalid data type!");
740 
741  glBufferData(target, GLsizeiptr(size * sizeof(GLint)), values, usage);
742  ocean_assert(GL_NO_ERROR == glGetError());
743 }
744 
745 template <>
746 inline void GLESVertexSet::setBufferData(const GLenum target, const float* values, const size_t size, const GLenum usage)
747 {
748  ocean_assert(GL_NO_ERROR == glGetError());
749 
750  static_assert(sizeof(GLfloat) == sizeof(float), "Invalid data type!");
751 
752  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat)), values, usage);
753  ocean_assert(GL_NO_ERROR == glGetError());
754 }
755 
756 template <>
757 inline void GLESVertexSet::setBufferData(const GLenum target, const double* values, const size_t size, const GLenum usage)
758 {
759  ocean_assert(GL_NO_ERROR == glGetError());
760 
761  std::vector<float> floatValues(size);
762 
763  for (size_t n = 0; n < size; n++)
764  {
765  floatValues[n] = float(values[n]);
766  }
767 
768  static_assert(sizeof(GLfloat) == sizeof(float), "Invalid data type!");
769 
770  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat)), floatValues.data(), usage);
771  ocean_assert(GL_NO_ERROR == glGetError());
772 }
773 
774 template <>
775 inline void GLESVertexSet::setBufferData(const GLenum target, const RGBAColor* values, const size_t size, const GLenum usage)
776 {
777  ocean_assert(GL_NO_ERROR == glGetError());
778 
779  static_assert(sizeof(GLfloat) * 4 == sizeof(RGBAColor), "Invalid data type!");
780 
781  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat) * 4), values, usage);
782  ocean_assert(GL_NO_ERROR == glGetError());
783 }
784 
785 template <>
786 inline void GLESVertexSet::setBufferData(const GLenum target, const VectorF2* values, const size_t size, const GLenum usage)
787 {
788  ocean_assert(GL_NO_ERROR == glGetError());
789 
790  static_assert(sizeof(GLfloat) * 2 == sizeof(VectorF2), "Invalid data type!");
791 
792  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat) * 2), values, usage);
793  ocean_assert(GL_NO_ERROR == glGetError());
794 }
795 
796 template <>
797 inline void GLESVertexSet::setBufferData(const GLenum target, const VectorD2* values, const size_t size, const GLenum usage)
798 {
799  ocean_assert(GL_NO_ERROR == glGetError());
800 
801  std::vector<float> floatValues(size * 2);
802 
803  for (size_t n = 0; n < size; n++)
804  {
805  floatValues[2 * n + 0] = float(values[n][0]);
806  floatValues[2 * n + 1] = float(values[n][1]);
807  }
808 
809  static_assert(sizeof(GLfloat) * 2 == sizeof(VectorF2), "Invalid data type!");
810 
811  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat) * 2), floatValues.data(), usage);
812  ocean_assert(GL_NO_ERROR == glGetError());
813 }
814 
815 template <>
816 inline void GLESVertexSet::setBufferData(const GLenum target, const VectorF3* values, const size_t size, const GLenum usage)
817 {
818  ocean_assert(GL_NO_ERROR == glGetError());
819 
820  static_assert(sizeof(GLfloat) * 3 == sizeof(VectorF3), "Invalid data type!");
821 
822  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat) * 3), values, usage);
823  ocean_assert(GL_NO_ERROR == glGetError());
824 }
825 
826 template <>
827 inline void GLESVertexSet::setBufferData(const GLenum target, const VectorD3* values, const size_t size, const GLenum usage)
828 {
829  ocean_assert(GL_NO_ERROR == glGetError());
830 
831  std::vector<float> floatValues(size * 3);
832 
833  for (size_t n = 0; n < size; n++)
834  {
835  floatValues[3 * n + 0] = float(values[n][0]);
836  floatValues[3 * n + 1] = float(values[n][1]);
837  floatValues[3 * n + 2] = float(values[n][2]);
838  }
839 
840  static_assert(sizeof(GLfloat) * 3 == sizeof(VectorF3), "Invalid data type!");
841 
842  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat) * 3), floatValues.data(), usage);
843  ocean_assert(GL_NO_ERROR == glGetError());
844 }
845 
846 template <>
847 inline void GLESVertexSet::setBufferData(const GLenum target, const VectorF4* values, const size_t size, const GLenum usage)
848 {
849  ocean_assert(GL_NO_ERROR == glGetError());
850 
851  static_assert(sizeof(GLfloat) * 4 == sizeof(VectorF4), "Invalid data type!");
852 
853  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat) * 4), values, usage);
854  ocean_assert(GL_NO_ERROR == glGetError());
855 }
856 
857 template <>
858 inline void GLESVertexSet::setBufferData(const GLenum target, const VectorD4* values, const size_t size, const GLenum usage)
859 {
860  ocean_assert(GL_NO_ERROR == glGetError());
861 
862  std::vector<float> floatValues(size * 4);
863 
864  for (size_t n = 0; n < size; n++)
865  {
866  floatValues[4 * n + 0] = float(values[n][0]);
867  floatValues[4 * n + 1] = float(values[n][1]);
868  floatValues[4 * n + 2] = float(values[n][2]);
869  floatValues[4 * n + 3] = float(values[n][3]);
870  }
871 
872  static_assert(sizeof(GLfloat) * 4 == sizeof(VectorF4), "Invalid data type!");
873 
874  glBufferData(target, GLsizeiptr(size * sizeof(GLfloat) * 4), floatValues.data(), usage);
875  ocean_assert(GL_NO_ERROR == glGetError());
876 }
877 
878 template <>
879 inline void GLESVertexSet::setBufferData(const GLenum target, const VectorT4<uint16_t>* values, const size_t size, const GLenum usage) // **TODO** use template parameters to remove functions above
880 {
881  ocean_assert(GL_NO_ERROR == glGetError());
882 
883  static_assert(sizeof(GLushort) * 4 == sizeof(VectorT4<uint16_t>), "Invalid data type!");
884 
885  glBufferData(target, GLsizeiptr(size * sizeof(GLushort) * 4), values, usage);
886  ocean_assert(GL_NO_ERROR == glGetError());
887 }
888 
889 template <>
890 inline void GLESVertexSet::setBufferData(const GLenum target, const VectorT4<uint32_t>* values, const size_t size, const GLenum usage) // **TODO** use template parameters to remove functions above
891 {
892  ocean_assert(GL_NO_ERROR == glGetError());
893 
894  static_assert(sizeof(GLuint) * 4 == sizeof(VectorT4<uint32_t>), "Invalid data type!");
895 
896  glBufferData(target, GLsizeiptr(size * sizeof(GLuint) * 4), values, usage);
897  ocean_assert(GL_NO_ERROR == glGetError());
898 }
899 
900 template <typename T>
901 void GLESVertexSet::setBufferData(const GLenum /*target*/, const T* /*values*/, const size_t /*size*/, const GLenum /*usage*/)
902 {
903  ocean_assert(false && "Missing implementation!");
904 }
905 
906 }
907 
908 }
909 
910 }
911 
912 #endif // META_OCEAN_RENDERING_GLES_VERTEX_SET_H
This class implements a 3D bounding box.
Definition: BoundingBox.h:23
This class implements a color defined by red, green, blue and alpha parameters.
Definition: RGBAColor.h:41
This class is the base class for all GLESceneGraph objects.
Definition: GLESObject.h:57
This class is the base class for all VertexBufferObjects.
Definition: GLESVertexSet.h:43
virtual void bind(const GLuint programId) const =0
Binds a vertex buffer object to a given program.
virtual ~VertexBufferObject()=default
Destructs a vertex buffer object and releases all resources.
This class implements the wrapper around a vertex buffer object.
Definition: GLESVertexSet.h:64
VertexBufferObjectT(const VertexBufferObjectT &vertexBufferObject)=delete
Disabled copy constructor.
VertexBufferObjectT(std::string attributeName)
Creates a new vertex buffer object.
Definition: GLESVertexSet.h:379
~VertexBufferObjectT() override
Destructs the object and releases all resources.
Definition: GLESVertexSet.h:82
void setData(const T *elements, const size_t numberElements, const GLenum usage=GL_STATIC_DRAW)
Sets the data of this buffer.
Definition: GLESVertexSet.h:396
void bind(const GLuint programId) const override
Binds a vertex buffer object to a given program.
Definition: GLESVertexSet.h:457
VertexBufferObjectT(VertexBufferObjectT< T > &&vertexBufferObject)
Move constructor.
Definition: GLESVertexSet.h:386
unsigned int numberElements() const
Returns the number of elements the object holds.
Definition: GLESVertexSet.h:463
void bind(const GLuint programId, const char *attributeName) const
Binds this vertex buffer to a specified program.
Definition: GLESVertexSet.h:423
std::string attributeName_
The attribute name associated with this buffer object.
Definition: GLESVertexSet.h:130
void release()
Explicitly releases the vertex buffer object and all resources.
Definition: GLESVertexSet.h:469
This class implements a GLESceneGraph vertex set object.
Definition: GLESVertexSet.h:36
std::string phantomTextureReferenceCoordinateSystem_
Explicit reference coordinate system for phantom texture coordinates.
Definition: GLESVertexSet.h:372
TextureCoordinates textureCoordinates(const unsigned int layerIndex) const override
Returns the texture coordinates of this set.
void setNormals(const Vector3 *normals, const size_t size) override
Sets the normals for this set.
BoundingBox boundingBox(const VertexIndices &vertexIndices) const
Determines the bounding box of this vertex set.
BoundingBox boundingBox(const unsigned int numberVertices) const
Determines the bounding box of this vertex set.
std::string phantomTextureCoordinateSystem() const override
Returns the explicit reference coordinate system of the phantom object, if any.
Vectors3 vertices_
The vertices stored in this vertex set.
Definition: GLESVertexSet.h:375
void setPhantomTextureCoordinateSystem(const std::string &reference) override
Sets the explicit reference coordinate system of the phantom objects.
void setVertices(const Vertices &vertices) override
Sets the vertices for this set.
void setAttribute(const std::string &attributeName, const T *elements, const size_t numberElements)
Sets a custom VertexSet attribute in addition to the standard attributes like e.g....
Definition: GLESVertexSet.h:700
Vertices vertices() const override
Returns the vertices of this set.
unsigned int numberColors() const override
Returns the number of colors of this set.
std::unordered_map< std::string, std::shared_ptr< VertexBufferObject > > VertexBufferObjectMap
Definition: GLESVertexSet.h:141
void release()
Releases all internal OpenGL ES vertex buffer objects.
VertexBufferObjectMap customVertexBufferObjectMap_
The custom buffer objects.
Definition: GLESVertexSet.h:369
void set(const Vertices &vertices, const Normals &normals, const TextureCoordinates &textureCoordinates, const RGBAColors &colors) override
Sets several attributes concurrently.
Normals normals() const override
Returns the normals of this set.
static constexpr bool isFloatComponent()
Returns whether the component is float component.
Definition: GLESVertexSet.h:694
static constexpr GLenum componentType()
Returns the type of the components of a data type.
Definition: GLESVertexSet.h:657
void setPhantomTextureCoordinates(const Vertices &textureCoordinates, const unsigned int layerIndex) override
Sets 3D texels for this set used for phantom objects.
BoundingBox boundingBox(const VertexIndexGroups &strips) const
Determines the bounding box of this vertex set.
unsigned int numberVertices() const override
Returns the number of vertices of this set.
BoundingBox boundingBox(const TriangleFaces &triangleFaces) const
Determines the bounding box of this vertex set.
void bindVertexSet(const GLuint programId)
Binds the vertex set to a program.
RGBAColors colors() const override
Returns the colors of this set.
void setTextureCoordinates(const TextureCoordinates &textureCoordinates, const unsigned int layerIndex) override
Sets the texels for this set.
static void setBufferData(const GLenum target, const T *values, const size_t size, const GLenum usage)
Creates and initializes a buffer object's data store.
Definition: GLESVertexSet.h:901
static constexpr size_t numberComponents()
Returns the number of components a data type has.
Definition: GLESVertexSet.h:566
unsigned int numberNormals() const override
Returns the number of normals of this set.
~GLESVertexSet() override
Destructs a GLESceneGraph vertex set object.
void setNormals(const Normals &normals) override
Sets the normals for this set.
GLESVertexSet()
Creates a new GLESceneGraph vertex set object.
unsigned int numberTextureCoordinates(const unsigned int layerIndex) const override
Returns the number of texture coordinates of this set.
void setVertices(const Vector3 *vertices, const size_t size) override
Sets the vertices for this set.
void setColors(const RGBAColors &colors) override
Sets the colors for this set.
This class is the base class for all rendering vertex sets.
Definition: VertexSet.h:47
ObjectType type() const override
Returns the type of this object.
This class implements a vector with two elements.
Definition: Vector2.h:96
This class implements a vector with four elements.
Definition: Vector4.h:97
std::vector< RGBAColor > RGBAColors
Definition of a vector holding rgba color objects.
Definition: RGBAColor.h:21
std::vector< Vector3 > Vectors3
Definition of a vector holding Vector3 objects.
Definition: Vector3.h:65
void release(T *object)
This functions allows to release a DirectShow object if it does exist.
Definition: DSObject.h:266
std::vector< Vertex > Vertices
Definition of a vector holding vertices.
Definition: rendering/Rendering.h:119
std::vector< TextureCoordinate > TextureCoordinates
Definition of a vector holding texture coordinates.
Definition: rendering/Rendering.h:113
std::vector< Normal > Normals
Definition of a vector holding normals.
Definition: rendering/Rendering.h:107
std::vector< TriangleFace > TriangleFaces
Definition of a vector holding triangle faces.
Definition: TriangleFace.h:23
std::vector< VertexIndices > VertexIndexGroups
Definition of a vector holding vertex indices.
Definition: rendering/Rendering.h:125
std::vector< VertexIndex > VertexIndices
Definition of a vector holding vertex indices.
Definition: rendering/Rendering.h:101
The namespace covering the entire Ocean framework.
Definition: Accessor.h:15