[DEV] simplify VBO & program API

This commit is contained in:
Edouard DUPIN 2014-11-06 21:54:27 +01:00
parent ec3c7b2902
commit 8ff2bfc20f
5 changed files with 115 additions and 23 deletions

2
external/ege vendored

@ -1 +1 @@
Subproject commit 6adec3434ea382c94554f5d8fac3b60573eae382 Subproject commit eb762e5c93b8e20ac862b32879da7fb3e55b6fce

View File

@ -330,7 +330,6 @@ void ewol::resource::Program::sendAttribute(int32_t _idElem,
} }
void ewol::resource::Program::sendAttributePointer(int32_t _idElem, void ewol::resource::Program::sendAttributePointer(int32_t _idElem,
int32_t _nbElement,
const std::shared_ptr<ewol::resource::VirtualBufferObject>& _vbo, const std::shared_ptr<ewol::resource::VirtualBufferObject>& _vbo,
int32_t _index, int32_t _index,
int32_t _jumpBetweenSample, int32_t _jumpBetweenSample,
@ -347,7 +346,7 @@ void ewol::resource::Program::sendAttributePointer(int32_t _idElem,
} }
glBindBuffer(GL_ARRAY_BUFFER, _vbo->getGL_ID(_index)); glBindBuffer(GL_ARRAY_BUFFER, _vbo->getGL_ID(_index));
glVertexAttribPointer(m_elementList[_idElem].m_elementId, // attribute ID of openGL glVertexAttribPointer(m_elementList[_idElem].m_elementId, // attribute ID of openGL
_nbElement, // number of elements per vertex, here (r,g,b,a) _vbo->getElementSize(_index), // number of elements per vertex, here (r,g,b,a)
GL_FLOAT, // the type of each element GL_FLOAT, // the type of each element
GL_FALSE, // take our values as-is GL_FALSE, // take our values as-is
_jumpBetweenSample, // no extra data between each position _jumpBetweenSample, // no extra data between each position

View File

@ -87,18 +87,17 @@ namespace ewol {
const void* _pointer, const void* _pointer,
int32_t _jumpBetweenSample=0); int32_t _jumpBetweenSample=0);
void sendAttributePointer(int32_t _idElem, void sendAttributePointer(int32_t _idElem,
int32_t _nbElement,
const std::shared_ptr<ewol::resource::VirtualBufferObject>& _vbo, const std::shared_ptr<ewol::resource::VirtualBufferObject>& _vbo,
int32_t _index, int32_t _index,
int32_t _jumpBetweenSample=0, int32_t _jumpBetweenSample=0,
int32_t _offset=0); int32_t _offset=0);
inline void sendAttribute(int32_t _idElem, const std::vector<vec2 >& _data) { inline void sendAttribute(int32_t _idElem, const std::vector<vec2>& _data) {
sendAttribute(_idElem, 2/*u,v / x,y*/, &_data[0]); sendAttribute(_idElem, 2/*u,v / x,y*/, &_data[0]);
} }
inline void sendAttribute(int32_t _idElem, const std::vector<vec3 >& _data) { inline void sendAttribute(int32_t _idElem, const std::vector<vec3>& _data) {
sendAttribute(_idElem, 3/*x,y,z,unused*/, &_data[0], 4*sizeof(btScalar)); sendAttribute(_idElem, 3/*x,y,z,unused*/, &_data[0], 4*sizeof(btScalar));
} }
inline void sendAttribute(int32_t _idElem, const std::vector<etk::Color<float> >& _data) { inline void sendAttribute(int32_t _idElem, const std::vector<etk::Color<float>>& _data) {
sendAttribute(_idElem, 4/*r,g,b,a*/, &_data[0]); sendAttribute(_idElem, 4/*r,g,b,a*/, &_data[0]);
} }
inline void sendAttribute(int32_t _idElem, const std::vector<float>& _data) { inline void sendAttribute(int32_t _idElem, const std::vector<float>& _data) {

View File

@ -20,6 +20,7 @@ void ewol::resource::VirtualBufferObject::init(int32_t _number) {
for (size_t iii=0; iii<NB_VBO_MAX; iii++) { for (size_t iii=0; iii<NB_VBO_MAX; iii++) {
m_vbo[iii]=0; m_vbo[iii]=0;
m_vboUsed[iii]=false; m_vboUsed[iii]=false;
m_vboSizeDataOffset[iii]=-1;
} }
EWOL_DEBUG("OGL : load VBO count=\"" << _number << "\""); EWOL_DEBUG("OGL : load VBO count=\"" << _number << "\"");
} }
@ -89,6 +90,12 @@ void ewol::resource::VirtualBufferObject::flush() {
} }
void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const vec3& _data) { void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const vec3& _data) {
if (m_vboSizeDataOffset[_id] == -1) {
m_vboSizeDataOffset[_id] = 3;
} else if (m_vboSizeDataOffset[_id] != 3) {
EWOL_WARNING("set multiType in VBO (Not supported ==> TODO : Maybe update it");
return;
}
m_vboUsed[_id] = true; m_vboUsed[_id] = true;
m_buffer[_id].push_back(_data.x()); m_buffer[_id].push_back(_data.x());
m_buffer[_id].push_back(_data.y()); m_buffer[_id].push_back(_data.y());
@ -104,11 +111,20 @@ vec3 ewol::resource::VirtualBufferObject::getOnBufferVec3(int32_t _id, int32_t _
m_buffer[_id][3*_elementID+2]); m_buffer[_id][3*_elementID+2]);
} }
int32_t ewol::resource::VirtualBufferObject::sizeOnBufferVec3(int32_t _id) { int32_t ewol::resource::VirtualBufferObject::bufferSize(int32_t _id) {
return m_buffer[_id].size()/3; return m_buffer[_id].size()/m_vboSizeDataOffset[_id];
}
int32_t ewol::resource::VirtualBufferObject::getElementSize(int32_t _id) {
return m_vboSizeDataOffset[_id];
} }
void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const vec2& _data) { void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const vec2& _data) {
if (m_vboSizeDataOffset[_id] == -1) {
m_vboSizeDataOffset[_id] = 2;
} else if (m_vboSizeDataOffset[_id] != 2) {
EWOL_WARNING("set multiType in VBO (Not supported ==> TODO : Maybe update it");
return;
}
m_vboUsed[_id] = true; m_vboUsed[_id] = true;
m_buffer[_id].push_back(_data.x()); m_buffer[_id].push_back(_data.x());
m_buffer[_id].push_back(_data.y()); m_buffer[_id].push_back(_data.y());
@ -122,6 +138,54 @@ vec2 ewol::resource::VirtualBufferObject::getOnBufferVec2(int32_t _id, int32_t _
m_buffer[_id][2*_elementID+1]); m_buffer[_id][2*_elementID+1]);
} }
int32_t ewol::resource::VirtualBufferObject::sizeOnBufferVec2(int32_t _id) {
return m_buffer[_id].size()/2; void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const etk::Color<float,4>& _data) {
if (m_vboSizeDataOffset[_id] == -1) {
m_vboSizeDataOffset[_id] = 4;
} else if (m_vboSizeDataOffset[_id] != 4) {
EWOL_WARNING("set multiType in VBO (Not supported ==> TODO : Maybe update it");
return;
}
m_vboUsed[_id] = true;
m_buffer[_id].push_back(_data.r());
m_buffer[_id].push_back(_data.g());
m_buffer[_id].push_back(_data.b());
m_buffer[_id].push_back(_data.a());
} }
void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const etk::Color<float,3>& _data) {
if (m_vboSizeDataOffset[_id] == -1) {
m_vboSizeDataOffset[_id] = 3;
} else if (m_vboSizeDataOffset[_id] != 3) {
EWOL_WARNING("set multiType in VBO (Not supported ==> TODO : Maybe update it");
return;
}
m_vboUsed[_id] = true;
m_buffer[_id].push_back(_data.r());
m_buffer[_id].push_back(_data.g());
m_buffer[_id].push_back(_data.b());
}
void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const etk::Color<float,2>& _data) {
if (m_vboSizeDataOffset[_id] == -1) {
m_vboSizeDataOffset[_id] = 2;
} else if (m_vboSizeDataOffset[_id] != 2) {
EWOL_WARNING("set multiType in VBO (Not supported ==> TODO : Maybe update it");
return;
}
m_vboUsed[_id] = true;
m_buffer[_id].push_back(_data.r());
m_buffer[_id].push_back(_data.g());
}
void ewol::resource::VirtualBufferObject::pushOnBuffer(int32_t _id, const etk::Color<float,1>& _data) {
if (m_vboSizeDataOffset[_id] == -1) {
m_vboSizeDataOffset[_id] = 1;
} else if (m_vboSizeDataOffset[_id] != 1) {
EWOL_WARNING("set multiType in VBO (Not supported ==> TODO : Maybe update it");
return;
}
m_vboUsed[_id] = true;
m_buffer[_id].push_back(_data.r());
}

View File

@ -14,7 +14,9 @@
#include <ewol/debug.h> #include <ewol/debug.h>
#include <ewol/resource/Resource.h> #include <ewol/resource/Resource.h>
#include <ewol/openGL/openGL.h> #include <ewol/openGL/openGL.h>
#include <etk/Color.h>
// TODO : Remove this ...
#define NB_VBO_MAX (20) #define NB_VBO_MAX (20)
namespace ewol { namespace ewol {
@ -29,6 +31,7 @@ namespace ewol {
GLuint m_vbo[NB_VBO_MAX]; //!< openGl ID of this VBO GLuint m_vbo[NB_VBO_MAX]; //!< openGl ID of this VBO
bool m_vboUsed[NB_VBO_MAX]; //!< true if the VBO is allocated or used ... bool m_vboUsed[NB_VBO_MAX]; //!< true if the VBO is allocated or used ...
std::vector<float> m_buffer[NB_VBO_MAX]; //!< data that is availlable in the VBO system ... std::vector<float> m_buffer[NB_VBO_MAX]; //!< data that is availlable in the VBO system ...
int8_t m_vboSizeDataOffset[NB_VBO_MAX]; //!< Internal size of the VBO (dynamicly set)
protected: protected:
/** /**
* @brief Constructor of this VBO. * @brief Constructor of this VBO.
@ -47,29 +50,56 @@ namespace ewol {
* @brief get the real openGL ID. * @brief get the real openGL ID.
* @return the Ogl id reference of this VBO. * @return the Ogl id reference of this VBO.
*/ */
GLuint getGL_ID(int32_t id) { return m_vbo[id]; }; GLuint getGL_ID(int32_t _id) {
return m_vbo[_id];
};
/** /**
* @brief get a reference on hte buffer data for this VBO. * @brief get a reference on hte buffer data for this VBO.
* @param[in] id Id of the buffer requested * @param[in] id Id of the buffer requested
* @return A reference on the data. * @return A reference on the data.
*/ */
std::vector<float>& getRefBuffer(int32_t id) { m_vboUsed[id] = true; return m_buffer[id]; }; std::vector<float>& getRefBuffer(int32_t _id) {
m_vboUsed[_id] = true;
return m_buffer[_id];
};
/**
* @brief Get the buffer Number of element.
* @param[in] _id VBO Element
* @return Number of Float in the buffer.
*/
int32_t bufferSize(int32_t _id);
/**
* @brief Get the offset between element.
* @param[in] _id VBO Element
* @return Number of Float to jump between target.
*/
int32_t getElementSize(int32_t _id);
/** /**
* @brief push data on a buffer with a custum type : * @brief push data on a buffer with a custum type :
* @param[in] id Id of the buffer requested. * @param[in] _id Id of the buffer requested.
* @param[in] data Direct data that might be set. * @param[in] _data Direct data that might be set.
*/ */
void pushOnBuffer(int32_t id, const vec3& data); void pushOnBuffer(int32_t _id, const vec3& _data);
vec3 getOnBufferVec3(int32_t id, int32_t elementID); vec3 getOnBufferVec3(int32_t _id, int32_t _elementID);
int32_t sizeOnBufferVec3(int32_t id);
/** /**
* @brief push data on a buffer with a custum type : * @brief push data on a buffer with a custum type :
* @param[in] id Id of the buffer requested. * @param[in] _id Id of the buffer requested.
* @param[in] data Direct data that might be set. * @param[in] _data Direct data that might be set.
*/ */
void pushOnBuffer(int32_t id, const vec2& data); void pushOnBuffer(int32_t _id, const vec2& _data);
vec2 getOnBufferVec2(int32_t id, int32_t elementID); vec2 getOnBufferVec2(int32_t _id, int32_t _elementID);
int32_t sizeOnBufferVec2(int32_t id); /**
* @brief push data on a buffer with a custum type :
* @param[in] _id Id of the buffer requested.
* @param[in] _data Direct data that might be set (Color).
*/
void pushOnBuffer(int32_t _id, const etk::Color<float,4>& _data);
//! @previous
void pushOnBuffer(int32_t _id, const etk::Color<float,3>& _data);
//! @previous
void pushOnBuffer(int32_t _id, const etk::Color<float,2>& _data);
//! @previous
void pushOnBuffer(int32_t _id, const etk::Color<float,1>& _data);
/** /**
* @brief get the data from the graphic card. * @brief get the data from the graphic card.
*/ */