8 #ifndef META_OCEAN_RENDERING_GLES_VERTEX_SET_H
9 #define META_OCEAN_RENDERING_GLES_VERTEX_SET_H
26 namespace GLESceneGraph
55 virtual void bind(
const GLuint programId)
const = 0;
93 void setData(
const T* elements,
const size_t numberElements,
const GLenum usage = GL_STATIC_DRAW);
100 void bind(
const GLuint programId,
const char* attributeName)
const;
106 void bind(
const GLuint programId)
const override;
136 unsigned int numberElements_ = 0u;
148 template <
typename T>
149 static constexpr
size_t numberComponents();
156 template <
typename T>
157 static constexpr GLenum componentType();
164 template <
typename T>
165 static constexpr
bool isFloatComponent();
294 template <
typename T>
295 void setAttribute(
const std::string& attributeName,
const T* elements,
const size_t numberElements);
338 template <
typename T>
339 static void setBufferData(
const GLenum target,
const T* values,
const size_t size,
const GLenum usage);
351 GLuint vertexArray_ = 0u;
378 template <
typename T>
380 attributeName_(std::move(attributeName))
385 template <
typename T>
387 attributeName_(std::move(vertexBufferObject.attributeName_)),
388 buffer_(vertexBufferObject.buffer_),
389 numberElements_(vertexBufferObject.numberElements_)
391 vertexBufferObject.buffer_ = 0u;
392 vertexBufferObject.numberElements_ = 0u;
395 template <
typename T>
398 ocean_assert(elements !=
nullptr);
399 ocean_assert(numberElements != 0);
403 glGenBuffers(1, &buffer_);
404 ocean_assert(GL_NO_ERROR == glGetError());
405 ocean_assert(buffer_ != 0u);
408 glBindBuffer(GL_ARRAY_BUFFER, buffer_);
409 ocean_assert(GL_NO_ERROR == glGetError());
411 setBufferData(GL_ARRAY_BUFFER, elements, numberElements, usage);
412 numberElements_ = (
unsigned int)(numberElements);
414 if (glGetError() == GL_OUT_OF_MEMORY)
418 ocean_assert(
false &&
"Out of memory!");
422 template <
typename T>
427 glBindBuffer(GL_ARRAY_BUFFER, buffer_);
428 ocean_assert(GL_NO_ERROR == glGetError());
430 ocean_assert(glIsProgram(programId));
431 const GLint location = glGetAttribLocation(programId, attributeName !=
nullptr ? attributeName : attributeName_.c_str());
432 ocean_assert(GL_NO_ERROR == glGetError());
436 glEnableVertexAttribArray(location);
437 ocean_assert(GL_NO_ERROR == glGetError());
439 constexpr GLint size = GLint(numberComponents<T>());
440 constexpr GLenum
type = componentType<T>();
442 if (isFloatComponent<T>())
444 glVertexAttribPointer(location, size,
type, GL_FALSE, 0,
nullptr);
448 glVertexAttribIPointer(location, size,
type, 0,
nullptr);
451 ocean_assert(GL_NO_ERROR == glGetError());
456 template <
typename T>
459 bind(programId, attributeName_.c_str());
462 template <
typename T>
465 return numberElements_;
468 template <
typename T>
473 glDeleteBuffers(1, &buffer_);
474 ocean_assert(GL_NO_ERROR == glGetError());
477 numberElements_ = 0u;
482 constexpr
size_t GLESVertexSet::numberComponents<uint8_t>()
488 constexpr
size_t GLESVertexSet::numberComponents<uint16_t>()
494 constexpr
size_t GLESVertexSet::numberComponents<uint32_t>()
500 constexpr
size_t GLESVertexSet::numberComponents<float>()
506 constexpr
size_t GLESVertexSet::numberComponents<double>()
512 constexpr
size_t GLESVertexSet::numberComponents<RGBAColor>()
518 constexpr
size_t GLESVertexSet::numberComponents<VectorF2>()
524 constexpr
size_t GLESVertexSet::numberComponents<VectorD2>()
530 constexpr
size_t GLESVertexSet::numberComponents<VectorF3>()
536 constexpr
size_t GLESVertexSet::numberComponents<VectorD3>()
542 constexpr
size_t GLESVertexSet::numberComponents<VectorF4>()
548 constexpr
size_t GLESVertexSet::numberComponents<VectorD4>()
554 constexpr
size_t GLESVertexSet::numberComponents<VectorT4<uint16_t>>()
560 constexpr
size_t GLESVertexSet::numberComponents<VectorT4<uint32_t>>()
565 template <
typename T>
568 ocean_assert(
false &&
"Missing implementation!");
573 constexpr GLenum GLESVertexSet::componentType<uint8_t>()
575 return GL_UNSIGNED_BYTE;
579 constexpr GLenum GLESVertexSet::componentType<uint16_t>()
581 return GL_UNSIGNED_SHORT;
585 constexpr GLenum GLESVertexSet::componentType<uint32_t>()
587 return GL_UNSIGNED_INT;
591 constexpr GLenum GLESVertexSet::componentType<float>()
597 constexpr GLenum GLESVertexSet::componentType<double>()
603 constexpr GLenum GLESVertexSet::componentType<RGBAColor>()
609 constexpr GLenum GLESVertexSet::componentType<VectorF2>()
615 constexpr GLenum GLESVertexSet::componentType<VectorD2>()
621 constexpr GLenum GLESVertexSet::componentType<VectorF3>()
627 constexpr GLenum GLESVertexSet::componentType<VectorD3>()
633 constexpr GLenum GLESVertexSet::componentType<VectorF4>()
639 constexpr GLenum GLESVertexSet::componentType<VectorD4>()
645 constexpr GLenum GLESVertexSet::componentType<VectorT4<uint16_t>>()
647 return GL_UNSIGNED_SHORT;
651 constexpr GLenum GLESVertexSet::componentType<VectorT4<uint32_t>>()
653 return GL_UNSIGNED_INT;
656 template <
typename T>
659 ocean_assert(
false &&
"Missing implementation!");
664 constexpr
bool GLESVertexSet::isFloatComponent<uint8_t>()
670 constexpr
bool GLESVertexSet::isFloatComponent<uint16_t>()
676 constexpr
bool GLESVertexSet::isFloatComponent<uint32_t>()
682 constexpr
bool GLESVertexSet::isFloatComponent<VectorT4<uint16_t>>()
688 constexpr
bool GLESVertexSet::isFloatComponent<VectorT4<uint32_t>>()
693 template <
typename T>
699 template <
typename T>
715 ocean_assert(GL_NO_ERROR == glGetError());
717 static_assert(
sizeof(GLbyte) ==
sizeof(uint8_t),
"Invalid data type!");
719 glBufferData(target, GLsizeiptr(size *
sizeof(GLbyte)), values, usage);
720 ocean_assert(GL_NO_ERROR == glGetError());
726 ocean_assert(GL_NO_ERROR == glGetError());
728 static_assert(
sizeof(GLshort) ==
sizeof(uint16_t),
"Invalid data type!");
730 glBufferData(target, GLsizeiptr(size *
sizeof(GLshort)), values, usage);
731 ocean_assert(GL_NO_ERROR == glGetError());
737 ocean_assert(GL_NO_ERROR == glGetError());
739 static_assert(
sizeof(GLint) ==
sizeof(uint32_t),
"Invalid data type!");
741 glBufferData(target, GLsizeiptr(size *
sizeof(GLint)), values, usage);
742 ocean_assert(GL_NO_ERROR == glGetError());
748 ocean_assert(GL_NO_ERROR == glGetError());
750 static_assert(
sizeof(GLfloat) ==
sizeof(
float),
"Invalid data type!");
752 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat)), values, usage);
753 ocean_assert(GL_NO_ERROR == glGetError());
759 ocean_assert(GL_NO_ERROR == glGetError());
761 std::vector<float> floatValues(size);
763 for (
size_t n = 0; n < size; n++)
765 floatValues[n] = float(values[n]);
768 static_assert(
sizeof(GLfloat) ==
sizeof(
float),
"Invalid data type!");
770 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat)), floatValues.data(), usage);
771 ocean_assert(GL_NO_ERROR == glGetError());
777 ocean_assert(GL_NO_ERROR == glGetError());
779 static_assert(
sizeof(GLfloat) * 4 ==
sizeof(
RGBAColor),
"Invalid data type!");
781 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat) * 4), values, usage);
782 ocean_assert(GL_NO_ERROR == glGetError());
788 ocean_assert(GL_NO_ERROR == glGetError());
790 static_assert(
sizeof(GLfloat) * 2 ==
sizeof(
VectorF2),
"Invalid data type!");
792 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat) * 2), values, usage);
793 ocean_assert(GL_NO_ERROR == glGetError());
799 ocean_assert(GL_NO_ERROR == glGetError());
801 std::vector<float> floatValues(size * 2);
803 for (
size_t n = 0; n < size; n++)
805 floatValues[2 * n + 0] = float(values[n][0]);
806 floatValues[2 * n + 1] = float(values[n][1]);
809 static_assert(
sizeof(GLfloat) * 2 ==
sizeof(
VectorF2),
"Invalid data type!");
811 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat) * 2), floatValues.data(), usage);
812 ocean_assert(GL_NO_ERROR == glGetError());
818 ocean_assert(GL_NO_ERROR == glGetError());
820 static_assert(
sizeof(GLfloat) * 3 ==
sizeof(
VectorF3),
"Invalid data type!");
822 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat) * 3), values, usage);
823 ocean_assert(GL_NO_ERROR == glGetError());
829 ocean_assert(GL_NO_ERROR == glGetError());
831 std::vector<float> floatValues(size * 3);
833 for (
size_t n = 0; n < size; n++)
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]);
840 static_assert(
sizeof(GLfloat) * 3 ==
sizeof(
VectorF3),
"Invalid data type!");
842 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat) * 3), floatValues.data(), usage);
843 ocean_assert(GL_NO_ERROR == glGetError());
849 ocean_assert(GL_NO_ERROR == glGetError());
851 static_assert(
sizeof(GLfloat) * 4 ==
sizeof(
VectorF4),
"Invalid data type!");
853 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat) * 4), values, usage);
854 ocean_assert(GL_NO_ERROR == glGetError());
860 ocean_assert(GL_NO_ERROR == glGetError());
862 std::vector<float> floatValues(size * 4);
864 for (
size_t n = 0; n < size; n++)
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]);
872 static_assert(
sizeof(GLfloat) * 4 ==
sizeof(
VectorF4),
"Invalid data type!");
874 glBufferData(target, GLsizeiptr(size *
sizeof(GLfloat) * 4), floatValues.data(), usage);
875 ocean_assert(GL_NO_ERROR == glGetError());
881 ocean_assert(GL_NO_ERROR == glGetError());
883 static_assert(
sizeof(GLushort) * 4 ==
sizeof(
VectorT4<uint16_t>),
"Invalid data type!");
885 glBufferData(target, GLsizeiptr(size *
sizeof(GLushort) * 4), values, usage);
886 ocean_assert(GL_NO_ERROR == glGetError());
892 ocean_assert(GL_NO_ERROR == glGetError());
894 static_assert(
sizeof(GLuint) * 4 ==
sizeof(
VectorT4<uint32_t>),
"Invalid data type!");
896 glBufferData(target, GLsizeiptr(size *
sizeof(GLuint) * 4), values, usage);
897 ocean_assert(GL_NO_ERROR == glGetError());
900 template <
typename T>
903 ocean_assert(
false &&
"Missing implementation!");
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
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