1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|
// Copyright (c) 2018 GeometryFactory Sarl (France)
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org).
//
// $URL: https://github.com/CGAL/cgal/blob/v6.1/Three/include/CGAL/Three/Buffer_objects.h $
// $Id: include/CGAL/Three/Buffer_objects.h b26b07a1242 $
// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s) : Maxime Gimeno
#ifndef BUFFER_OBJECTS_H
#define BUFFER_OBJECTS_H
#include <CGAL/license/Three.h>
#include <QOpenGLBuffer>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <vector>
namespace CGAL {
namespace Three {
struct Vbo;
//!
//! \brief The Vao struct is a wrapper for the `QOpenGLVertexArrayObject`.
//! They are context dependent, most of the time it means `Viewer` dependent.
//!
struct Vao{
QOpenGLVertexArrayObject* vao;
QOpenGLShaderProgram* program;
std::vector<Vbo*> vbos;
//!
//! \brief creates a `Vao`.
//! \param program the `QOpenGLShaderProgram` associated with this `Vao`.
//! \attention This must be called within a valid OpenGLContext.
//! Most of the time, initGL() functions are safe places to do so.
//!
Vao( QOpenGLShaderProgram* program)
:vao(new QOpenGLVertexArrayObject()),
program(program)
{
vao->create();
}
//!
//! \brief creates a `Vao` from another one.
//! \param program the `QOpenGLShaderProgram` corresponding to the one of `vao` but from
//! the right viewer.
//! \param vao the Vao to copy.
//!
//! All `vao`'s vbos will be shared. Use it for shared viewers.
//! `initializeBuffers()` will have to be called again.
//!
//! \attention This must be called within a valid OpenGLContext.
//! Most of the time, initGL() functions are safe places to do so.
//!
Vao( Vao* vao, QOpenGLShaderProgram* program)
:vao(new QOpenGLVertexArrayObject()),
program(program)
{
this->vao->create();
vbos = vao->vbos;
}
~Vao()
{
delete vao;
}
//!Adds a `Vbo` to the list of Vbos.
void addVbo(Vbo* vbo)
{
vbos.push_back(vbo);
}
//!Makes the `Vao` and its program active until `release()` is called.
void bind()
{
program->bind();
vao->bind();
}
//!Makes the `Vao` and its program not active.
void release()
{
vao->release();
program->release();
}
};
//!
//! \brief The Vbo struct is a wrapper for the `QOpenGLBufferObject` item.
//! It contains the data necessary for the rendering of any displayed entity.
//! A Vbo can be shared between Vaos of the same context.
struct Vbo
{
enum Flag{
GEOMETRY=0,
COLORS,
NORMALS,
NOT_INSTANCED
};
QOpenGLBuffer vbo;
const char* attribute;
Flag flag;
void* data;
int dataSize;
QOpenGLBuffer::Type vbo_type;
GLenum data_type;
int offset;
int tupleSize;
int stride;
bool allocated;
//!
//! \brief creates a `Vbo`.
//! \param attribute the name of the corresponding data in the shader.
//! \param flag the flag that specifies which type of data this corresponds to.
//! \param vbo_type is almost always `QOpenGLBuffer::VertexBuffer` but can be `QOpenGLBuffer::IndexBuffer`
//! if it contains the indices for an indexed rendering.
//! \param data_type the GL data type. Mostly GL_FLOAT.
//! \param offset the offset in the buffer. See OpenGL documentation.
//! \param tupleSize the size of the tuple. If it contains vector_3s, then tuple_size is 3.
//! \param stride the stride for the buffer. See OpenGL documentation.
//! \attention This must be called within a valid OpenGLContext.
//! Most of the time, initGL() functions are safe places to do so.
//!
Vbo(
const char* attribute,
Flag flag,
QOpenGLBuffer::Type vbo_type = QOpenGLBuffer::VertexBuffer,
GLenum data_type=GL_FLOAT,
int offset = 0,
int tupleSize = 3,
int stride = 0):
attribute(attribute),
flag(flag),
data(0),
dataSize(0),
vbo_type(vbo_type),
data_type(data_type),
offset(offset),
tupleSize(tupleSize),
stride(stride),
allocated(false)
{
vbo = QOpenGLBuffer(vbo_type);
vbo.create();
}
~Vbo()
{
vbo.destroy();
}
//! Makes the `Vbo` active until `release()` is called.
bool bind()
{
return vbo.bind();
}
//!Makes the `Vbo` and its program not active.
void release()
{
vbo.release();
}
//!
//! \brief allocate gives CPU data to the GPU.
//! \param data the content of the buffer.
//! \param datasize the number of bytes in `data`.
//!
void allocate(void* data, int datasize)
{
this->data = data;
this->dataSize = datasize;
}
};
}
}
#endif // BUFFER_OBJECTS_H
|