[DEV] start to work on VBO integration

This commit is contained in:
Edouard DUPIN 2013-01-15 22:35:52 +01:00
parent 5592c02b28
commit ba5bbea967
7 changed files with 31 additions and 13 deletions

View File

@ -336,7 +336,7 @@ bool ewol::resource::Keep(etk::UString& filename, ewol::MeshObj*& object)
} }
bool ewol::resource::Keep(etk::UString& accesMode, ewol::VirtualBufferObject*& object) bool ewol::resource::Keep(const etk::UString& accesMode, ewol::VirtualBufferObject*& object)
{ {
// this element create a new one every time .... // this element create a new one every time ....
object = new ewol::VirtualBufferObject(accesMode); object = new ewol::VirtualBufferObject(accesMode);
@ -458,3 +458,10 @@ void ewol::resource::Release(ewol::Colored3DObject*& object)
Release(object2); Release(object2);
object = NULL; object = NULL;
} }
void ewol::resource::Release(ewol::VirtualBufferObject*& object)
{
ewol::Resource* object2 = static_cast<ewol::Resource*>(object);
Release(object2);
object = NULL;
}

View File

@ -72,7 +72,7 @@ namespace ewol
bool Keep(etk::UString& filename, ewol::Shader*& object); bool Keep(etk::UString& filename, ewol::Shader*& object);
bool Keep(ewol::Texture*& object); // no name needed here ... bool Keep(ewol::Texture*& object); // no name needed here ...
bool Keep(etk::UString& filename, ewol::TextureFile*& object, ivec2 size); bool Keep(etk::UString& filename, ewol::TextureFile*& object, ivec2 size);
bool Keep(etk::UString& accesMode, ewol::VirtualBufferObject*& object); bool Keep(const etk::UString& accesMode, ewol::VirtualBufferObject*& object);
bool Keep(etk::UString& filename, ewol::MeshObj*& object); bool Keep(etk::UString& filename, ewol::MeshObj*& object);
bool Keep(etk::UString& filename, ewol::ConfigFile*& object); bool Keep(etk::UString& filename, ewol::ConfigFile*& object);
bool Keep(ewol::Colored3DObject*& object); bool Keep(ewol::Colored3DObject*& object);

View File

@ -25,6 +25,7 @@ ewol::Mesh::Mesh(etk::UString genName) :
m_GLMatrix = m_GLprogram->GetUniform("EW_MatrixTransformation"); m_GLMatrix = m_GLprogram->GetUniform("EW_MatrixTransformation");
m_GLtexID = m_GLprogram->GetUniform("EW_texID"); m_GLtexID = m_GLprogram->GetUniform("EW_texID");
} }
//ewol::resource::Keep("w", m_verticesVBO);
} }
ewol::Mesh::~Mesh(void) ewol::Mesh::~Mesh(void)
@ -34,6 +35,7 @@ ewol::Mesh::~Mesh(void)
ewol::resource::Release(m_texture1); ewol::resource::Release(m_texture1);
} }
ewol::resource::Release(m_GLprogram); ewol::resource::Release(m_GLprogram);
//ewol::resource::Release(m_verticesVBO);
} }

View File

@ -14,6 +14,7 @@
#include <ewol/renderer/resources/Image.h> #include <ewol/renderer/resources/Image.h>
#include <ewol/renderer/resources/Shader.h> #include <ewol/renderer/resources/Shader.h>
#include <ewol/renderer/resources/Program.h> #include <ewol/renderer/resources/Program.h>
#include <ewol/renderer/resources/VirtualBufferObject.h>
namespace ewol namespace ewol
{ {
@ -28,6 +29,7 @@ namespace ewol
int32_t m_GLtexID; int32_t m_GLtexID;
public: public:
etk::Vector<uint32_t> m_indices; etk::Vector<uint32_t> m_indices;
ewol::VirtualBufferObject* m_verticesVBO;
etk::Vector<vec3> m_vertices; etk::Vector<vec3> m_vertices;
etk::Vector<vec2> m_uvTextures; etk::Vector<vec2> m_uvTextures;
etk::Vector<vec3> m_normals; etk::Vector<vec3> m_normals;

View File

@ -181,6 +181,9 @@ ewol::MeshObj::MeshObj(etk::UString _fileName) :
// Put the attributes in buffers // Put the attributes in buffers
m_vertices.PushBack(vertices[vertexIndex-1]); m_vertices.PushBack(vertices[vertexIndex-1]);
m_verticesVBO->GetRefBuffer().PushBack(vertices[vertexIndex-1].x);
m_verticesVBO->GetRefBuffer().PushBack(vertices[vertexIndex-1].y);
m_verticesVBO->GetRefBuffer().PushBack(vertices[vertexIndex-1].z);
m_uvTextures.PushBack(uvTextures[uvIndex-1]); m_uvTextures.PushBack(uvTextures[uvIndex-1]);
draw::Color tmpppp(0xFFFFFFFF); draw::Color tmpppp(0xFFFFFFFF);
draw::Colorf tmppppp(tmpppp); draw::Colorf tmppppp(tmpppp);
@ -191,6 +194,7 @@ ewol::MeshObj::MeshObj(etk::UString _fileName) :
m_normals.PushBack(normals[normalIndex-1]); m_normals.PushBack(normals[normalIndex-1]);
} }
} }
m_verticesVBO->Flush();
} }

View File

@ -12,20 +12,13 @@
ewol::VirtualBufferObject::VirtualBufferObject(etk::UString& accesMode): ewol::VirtualBufferObject::VirtualBufferObject(const etk::UString& accesMode):
ewol::Resource(), ewol::Resource(),
m_exist(false), m_exist(false),
m_vbo(0) m_vbo(0)
{ {
m_resourceLevel = 3; m_resourceLevel = 3;
EWOL_DEBUG("OGL : load VBO mode\"" << accesMode << "\""); EWOL_DEBUG("OGL : load VBO mode=\"" << accesMode << "\"");
// load data from file "all the time ..."
/*
glGenBuffers(1, &m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(cube_vertices), cube_vertices, GL_STATIC_DRAW);
*/
} }
@ -48,16 +41,24 @@ void ewol::VirtualBufferObject::UpdateContext(void)
if (m_buffer.Size()<=0) { if (m_buffer.Size()<=0) {
RemoveContext(); RemoveContext();
} else { } else {
EWOL_INFO("VBO: Update [" << m_uniqueId << "]=" << m_buffer.Size() << "*sizeof(float) OGl_Id=" << m_vbo);
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*m_buffer.Size(), &m_buffer[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(float)*m_buffer.Size(), &m_buffer[0], GL_STATIC_DRAW);
//
} }
} else { } else {
// create the Buffer // create the Buffer
if (m_buffer.Size()>0) { if (m_buffer.Size()>0) {
// Allocate and assign a Vertex Array Object to our handle
glGenVertexArrays(1, &m_vao);
glGenBuffers(1, &m_vbo); glGenBuffers(1, &m_vbo);
EWOL_INFO("VBO: Add [" << m_uniqueId << "]=" << m_buffer.Size() << "*sizeof(float) OGl_Id=" << m_vbo);
m_exist = true; m_exist = true;
glBindBuffer(GL_ARRAY_BUFFER, m_vbo); glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*m_buffer.Size(), &m_buffer[0], GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(float)*m_buffer.Size(), &m_buffer[0], GL_STATIC_DRAW);
//glEnableVertexAttribArray(0);
//glDisableVertexAttribArray(0);
} }
// Note we did not create the buffer when no data is needed // Note we did not create the buffer when no data is needed
} }
@ -66,6 +67,7 @@ void ewol::VirtualBufferObject::UpdateContext(void)
void ewol::VirtualBufferObject::RemoveContext(void) void ewol::VirtualBufferObject::RemoveContext(void)
{ {
if (true==m_exist) { if (true==m_exist) {
EWOL_INFO("VBO: Remove [" << m_uniqueId << "]=" << m_buffer.Size() << "*sizeof(float) OGl_Id=" << m_vbo);
glDeleteBuffers(1, &m_vbo); glDeleteBuffers(1, &m_vbo);
m_exist = false; m_exist = false;
m_vbo = 0; m_vbo = 0;

View File

@ -25,13 +25,14 @@ namespace ewol
private : private :
bool m_exist; //!< This data is availlable in the Graphic card bool m_exist; //!< This data is availlable in the Graphic card
GLuint m_vbo; //!< OpenGl ID of this VBO GLuint m_vbo; //!< OpenGl ID of this VBO
GLuint m_vao;
etk::Vector<float> m_buffer; //!< data that is availlable in the VBO system ... etk::Vector<float> m_buffer; //!< data that is availlable in the VBO system ...
public: public:
/** /**
* @brief Constructor of this VBO. * @brief Constructor of this VBO.
* @param[in] accesMode Acces mode : ??? * @param[in] accesMode Acces mode : ???
*/ */
VirtualBufferObject(etk::UString& accesMode); VirtualBufferObject(const etk::UString& accesMode);
/** /**
* @brief Destructor of this VBO. * @brief Destructor of this VBO.
*/ */
@ -58,7 +59,7 @@ namespace ewol
/** /**
* @brief Send the data to the graphic card. * @brief Send the data to the graphic card.
*/ */
void Flush(void) {}; void Flush(void) { UpdateContext(); };
/** /**
* @brief This load/reload the data in the opengl context, needed when removed previously. * @brief This load/reload the data in the opengl context, needed when removed previously.
*/ */