From 53a678cdd180ecfb7792f14f0c5a0bef70762eca Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 16 Jan 2013 23:42:34 +0100 Subject: [PATCH] [DEV] VBO work correctly on computer --- data/textured3D.frag | 2 +- sources/ewol/renderer/resources/Mesh.cpp | 13 +++++----- sources/ewol/renderer/resources/Mesh.h | 25 +++++++++++++------ sources/ewol/renderer/resources/MeshObj.cpp | 3 +++ sources/ewol/renderer/resources/Program.cpp | 5 ++-- sources/ewol/renderer/resources/Program.h | 2 +- .../resources/VirtualBufferObject.cpp | 6 +++-- 7 files changed, 35 insertions(+), 21 deletions(-) diff --git a/data/textured3D.frag b/data/textured3D.frag index b31dde4a..ce2a0705 100644 --- a/data/textured3D.frag +++ b/data/textured3D.frag @@ -11,5 +11,5 @@ varying vec4 f_color; void main(void) { gl_FragColor = texture2D(EW_texID, f_texcoord) * f_color; - gl_FragColor = vec4(1.0,1.0,0.2,0.6); + //gl_FragColor = vec4(1.0,1.0,0.2,0.6); } diff --git a/sources/ewol/renderer/resources/Mesh.cpp b/sources/ewol/renderer/resources/Mesh.cpp index 69bdaee2..143b6803 100644 --- a/sources/ewol/renderer/resources/Mesh.cpp +++ b/sources/ewol/renderer/resources/Mesh.cpp @@ -13,6 +13,7 @@ ewol::Mesh::Mesh(etk::UString genName) : ewol::Resource(genName), + m_numberOfElments(0), m_texture1(NULL) { etk::UString tmpString("DATA:textured3D.prog"); @@ -36,12 +37,13 @@ ewol::Mesh::~Mesh(void) } ewol::resource::Release(m_GLprogram); ewol::resource::Release(m_verticesVBO); + m_numberOfElments=0; } void ewol::Mesh::Draw(mat4& positionMatrix) { - if (m_vertices.Size()<=0) { + if (m_numberOfElments<=0) { return; } if (NULL == m_texture1) { @@ -63,16 +65,13 @@ void ewol::Mesh::Draw(mat4& positionMatrix) // TextureID m_GLprogram->SetTexture0(m_GLtexID, m_texture1->GetId()); // position : - //m_GLprogram->SendAttribute(m_GLPosition, 3/*x,y,z*/, &m_vertices[0]); m_GLprogram->SendAttributePointer(m_GLPosition, 3/*x,y,z*/, m_verticesVBO, 0); // Texture : - //m_GLprogram->SendAttribute(m_GLtexture, 2/*u,v*/, &m_uvTextures[0]); - //m_GLprogram->SendAttributePointer(m_GLPosition, 2/*u,v*/, m_verticesVBO, 1); + m_GLprogram->SendAttributePointer(m_GLtexture, 2/*u,v*/, m_verticesVBO, 1); // color : - //m_GLprogram->SendAttribute(m_GLColor, 4/*r,g,b,a*/, &m_coordColor[0]); - //m_GLprogram->SendAttributePointer(m_GLPosition, 4/*r,g,b,a*/, m_verticesVBO, 2); + m_GLprogram->SendAttributePointer(m_GLColor, 4/*r,g,b,a*/, m_verticesVBO, 2); // Request the draw od the elements : - glDrawArrays(GL_TRIANGLES, 0, m_vertices.Size()); + glDrawArrays(GL_TRIANGLES, 0, m_numberOfElments); m_GLprogram->UnUse(); glDisable(GL_DEPTH_TEST); glBindBuffer(GL_ARRAY_BUFFER,0); diff --git a/sources/ewol/renderer/resources/Mesh.h b/sources/ewol/renderer/resources/Mesh.h index 1c35c05c..6a17e107 100644 --- a/sources/ewol/renderer/resources/Mesh.h +++ b/sources/ewol/renderer/resources/Mesh.h @@ -20,6 +20,15 @@ namespace ewol { class Mesh : public ewol::Resource { + // 3 "float" elements + #define MESH_VBO_VERTICES (0) + // 2 "float" elements + #define MESH_VBO_TEXTURE (1) + // 4 "float" elements + #define MESH_VBO_COLOR (2) + // 3 "float" elements + #define MESH_VBO_NORMAL (3) + // TODO : Use indice system ... protected: ewol::Program* m_GLprogram; int32_t m_GLPosition; @@ -27,15 +36,17 @@ namespace ewol int32_t m_GLColor; int32_t m_GLtexture; int32_t m_GLtexID; + int32_t m_bufferOfset; + int32_t m_numberOfElments; public: - etk::Vector m_indices; - ewol::VirtualBufferObject* m_verticesVBO; - etk::Vector m_vertices; - etk::Vector m_uvTextures; - etk::Vector m_normals; - protected: - ewol::TextureFile* m_texture1; + etk::Vector m_indices; + etk::Vector m_vertices; + etk::Vector m_uvTextures; + etk::Vector m_normals; etk::Vector m_coordColor; //!< internal color of the different point + protected: + ewol::VirtualBufferObject* m_verticesVBO; + ewol::TextureFile* m_texture1; public: Mesh(etk::UString genName); virtual ~Mesh(void); diff --git a/sources/ewol/renderer/resources/MeshObj.cpp b/sources/ewol/renderer/resources/MeshObj.cpp index 02bb961f..48540cbe 100644 --- a/sources/ewol/renderer/resources/MeshObj.cpp +++ b/sources/ewol/renderer/resources/MeshObj.cpp @@ -173,6 +173,8 @@ ewol::MeshObj::MeshObj(etk::UString _fileName) : } } fileName.FileClose(); + // update the number of element in the display ... + m_numberOfElments = indicesVertices.Size(); // For each vertex of each triangle for( uint32_t iii=0; iiiGetRefBuffer(3).PushBack(normals[normalIndex-1].z); } } + // update all the VBO elements ... m_verticesVBO->Flush(); } diff --git a/sources/ewol/renderer/resources/Program.cpp b/sources/ewol/renderer/resources/Program.cpp index 04f7fbb6..bd28d7d3 100644 --- a/sources/ewol/renderer/resources/Program.cpp +++ b/sources/ewol/renderer/resources/Program.cpp @@ -71,7 +71,6 @@ ewol::Program::Program(etk::UString& filename) : file.FileClose(); UpdateContext(); - } @@ -301,7 +300,7 @@ void ewol::Program::SendAttribute(int32_t idElem, int32_t nbElement, void* point //checkGlError("glEnableVertexAttribArray", __LINE__); } -void ewol::Program::SendAttributePointer(int32_t idElem, int32_t nbElement, ewol::VirtualBufferObject* vbo, int32_t index, int32_t jumpBetweenSample) +void ewol::Program::SendAttributePointer(int32_t idElem, int32_t nbElement, ewol::VirtualBufferObject* vbo, int32_t index, int32_t jumpBetweenSample, int32_t offset) { if (0==m_program) { return; @@ -319,7 +318,7 @@ void ewol::Program::SendAttributePointer(int32_t idElem, int32_t nbElement, ewol GL_FLOAT, // the type of each element GL_FALSE, // take our values as-is jumpBetweenSample, // no extra data between each position - 0); // Pointer on the buffer + (GLvoid *)offset); // Pointer on the buffer //checkGlError("glVertexAttribPointer", __LINE__); glEnableVertexAttribArray(m_elementList[idElem].m_elementId); //checkGlError("glEnableVertexAttribArray", __LINE__); diff --git a/sources/ewol/renderer/resources/Program.h b/sources/ewol/renderer/resources/Program.h index 1f034df7..bccace9e 100644 --- a/sources/ewol/renderer/resources/Program.h +++ b/sources/ewol/renderer/resources/Program.h @@ -82,7 +82,7 @@ namespace ewol * @param[in] jumpBetweenSample Number of byte to jump between 2 vertex (this permit to enterlace informations) */ void SendAttribute(int32_t idElem, int32_t nbElement, void* pointer, int32_t jumpBetweenSample=0); - void SendAttributePointer(int32_t idElem, int32_t nbElement, ewol::VirtualBufferObject* vbo, int32_t index, int32_t jumpBetweenSample=0); + void SendAttributePointer(int32_t idElem, int32_t nbElement, ewol::VirtualBufferObject* vbo, int32_t index, int32_t jumpBetweenSample=0, int32_t offset=0); /** * @brief User request an Uniform on this program. * @note uniform value is availlable for all the fragment shader in the program (only one value for all) diff --git a/sources/ewol/renderer/resources/VirtualBufferObject.cpp b/sources/ewol/renderer/resources/VirtualBufferObject.cpp index a27e1650..183f70aa 100644 --- a/sources/ewol/renderer/resources/VirtualBufferObject.cpp +++ b/sources/ewol/renderer/resources/VirtualBufferObject.cpp @@ -46,8 +46,10 @@ void ewol::VirtualBufferObject::UpdateContext(void) for (int32_t iii=0; iii