OSDN Git Service

頂点カラー VBOに対応
authorqw_fuku <fkhideaki@gmail.com>
Sat, 16 Jul 2016 17:53:50 +0000 (02:53 +0900)
committerqw_fuku <fkhideaki@gmail.com>
Sat, 16 Jul 2016 17:53:50 +0000 (02:53 +0900)
Src/GLUtility/GlVBO.cpp
Src/GLUtility/GlVBO.h
Src/QtGeoViewer/GeometryVBO.cpp
Src/QtGeoViewer/GeometryVBO.h
Src/QtGeoViewer/VBOBuilder.cpp
Src/QtGeoViewer/VBOBuilder.h

index 34eea6d..335b1fc 100644 (file)
@@ -77,6 +77,13 @@ void GlVBO::BindPtrAsNoral(void)
        glNormalPointer(GL_FLOAT, 0, VBO_BUFFER_OFFSET(0));
 }
 
+void GlVBO::BindPtrAsColor(void)
+{
+       glEnableClientState(GL_COLOR_ARRAY);
+       Bind();
+       glColorPointer(3, GL_FLOAT, 0, VBO_BUFFER_OFFSET(0));
+}
+
 void GlVBO::BindPtrAsTexcoord(void)
 {
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
index c0f3d21..1c7f37c 100644 (file)
@@ -21,6 +21,7 @@ public:
        void AssginBufferi(const std::vector<GLuint>& buf);
 
        void BindPtrAsNoral(void);
+       void BindPtrAsColor(void);
        void BindPtrAsTexcoord(void);
        void BindPtrAsAttrib3f(GLint buf_id);
 
index b494c33..e8acc61 100644 (file)
@@ -11,6 +11,7 @@ GeometryVBO::GeometryVBO(void) :
        m_Vertex(GL_ARRAY_BUFFER),
        m_Normal(GL_ARRAY_BUFFER),
        m_Texture(GL_ARRAY_BUFFER),
+       m_VCol(GL_ARRAY_BUFFER),
        m_Tangents(GL_ARRAY_BUFFER),
        m_Index(GL_ELEMENT_ARRAY_BUFFER)
 {
@@ -21,6 +22,7 @@ void GeometryVBO::Release(void)
        m_Vertex.ReleaseBufferElement();
        m_Normal.ReleaseBufferElement();
        m_Texture.ReleaseBufferElement();
+       m_VCol.ReleaseBufferElement();
        m_Tangents.ReleaseBufferElement();
        m_Index.ReleaseBufferElement();
 
@@ -38,10 +40,13 @@ void GeometryVBO::DrawVBOAll(GLenum primiType, ShaderInterface* shader)
 
        if (m_Normal.HasBuffer())
                m_Normal.BindPtrAsNoral();
-
+       
        if (m_Texture.HasBuffer())
                m_Texture.BindPtrAsTexcoord();
 
+       if (m_VCol.HasBuffer())
+               m_VCol.BindPtrAsColor();
+
        GLint tbuf_id = -1;
        if (m_Tangents.HasBuffer())
        {
@@ -55,6 +60,7 @@ void GeometryVBO::DrawVBOAll(GLenum primiType, ShaderInterface* shader)
 
        glDisableClientState(GL_VERTEX_ARRAY);
        glDisableClientState(GL_NORMAL_ARRAY);
+       glDisableClientState(GL_COLOR_ARRAY);
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
        if (tbuf_id != -1)
index cd1b031..fbf22ea 100644 (file)
@@ -24,6 +24,7 @@ public:
 
 public:
        GlVBO m_Vertex;
+       GlVBO m_VCol;
        GlVBO m_Normal;
        GlVBO m_Tangents;
        GlVBO m_Texture;
index 9dc8c25..360ebc7 100644 (file)
@@ -11,7 +11,7 @@ void GeomVBOTriCache::Create(lib_geo::BaseMesh& mesh, const geom::FaceGroup& fg)
 
        num_triangles = GetNumTrianglesFG(mesh, fg);
 
-       ClearReserve(num_triangles, tf.HasNormal(), tf.HasUV(), mesh.HasTangent());
+       ClearReserve(num_triangles, tf.HasNormal(), tf.HasUV(), mesh.HasTangent(), mesh.HasVCol());
 
        for (size_t i = 0; i < fg.m_Fids.size(); ++i)
        {
@@ -30,6 +30,9 @@ void GeomVBOTriCache::Create(lib_geo::BaseMesh& mesh, const geom::FaceGroup& fg)
                        if (f.HasUV())
                                CopyFUV(mesh, f, i0, i1, i2);
 
+                       if (mesh.HasVCol())
+                               CopyFVCol(mesh, f, i0, i1, i2);
+
                        if (mesh.HasTangent())
                                CopyFT(mesh, f, i0, i1, i2);
 
@@ -78,6 +81,16 @@ void GeomVBOTriCache::CopyFT(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int
        tangents.push_back(mesh.m_Tangents[ti2]);
 }
 
+void GeomVBOTriCache::CopyFVCol(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2)
+{
+       int vi0 = f.m_VertIds[i0];
+       int vi1 = f.m_VertIds[i1];
+       int vi2 = f.m_VertIds[i2];
+       vcol.push_back(mesh.m_Col[vi0]);
+       vcol.push_back(mesh.m_Col[vi1]);
+       vcol.push_back(mesh.m_Col[vi2]);
+}
+
 size_t GeomVBOTriCache::GetNumTrianglesFG(lib_geo::BaseMesh& mesh, const geom::FaceGroup& fg) const
 {
        size_t triangles = 0;
@@ -95,7 +108,7 @@ void GeomVBOTriCache::IncrementTriangleIndex(void)
        indexbuf.push_back(indexbuf.size());
 }
 
-void GeomVBOTriCache::ClearReserve(size_t num_triangles, bool enable_normal, bool enable_uv, bool enable_tangent)
+void GeomVBOTriCache::ClearReserve(size_t num_triangles, bool enable_normal, bool enable_uv, bool enable_tangent, bool enable_vcol)
 {
        size_t buf_len = num_triangles * 3;
 
@@ -105,6 +118,9 @@ void GeomVBOTriCache::ClearReserve(size_t num_triangles, bool enable_normal, boo
        if (enable_normal)
                norms.reserve(buf_len);
 
+       if (enable_vcol)
+               vcol.reserve(buf_len);
+
        if (enable_uv)
                uvs.reserve(buf_len);
 
@@ -119,10 +135,13 @@ void GeomVBOBuilder::CreateFromFaceGroup(GeometryVBO* vbo, lib_geo::BaseMesh& me
        cache.Create(mesh, fg);
 
        vbo->NumTriangles = cache.num_triangles;
-
+       
        if (!cache.verts.empty())
                vbo->m_Vertex.AssginBuffer3f(cache.verts);
 
+       if (!cache.vcol.empty())
+               vbo->m_VCol.AssginBuffer3f(cache.vcol);
+
        if (!cache.norms.empty())
                vbo->m_Normal.AssginBuffer3f(cache.norms);
 
index 9b1a974..75b1ea9 100644 (file)
@@ -28,7 +28,7 @@ public:
 private:
        size_t GetNumTrianglesFG(lib_geo::BaseMesh& mesh, const geom::FaceGroup& fg) const;
 
-       void ClearReserve(size_t num_triangles, bool enable_normal, bool enable_uv, bool enable_tangent);
+       void ClearReserve(size_t num_triangles, bool enable_normal, bool enable_uv, bool enable_tangent, bool enable_vcol);
 
        void IncrementTriangleIndex(void);
 
@@ -36,9 +36,11 @@ private:
        void CopyFN(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2);
        void CopyFUV(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2);
        void CopyFT(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2);
+       void CopyFVCol(lib_geo::BaseMesh& mesh, lib_geo::BaseFace& f, int i0, int i1, int i2);
 
 public:
        std::vector<lm::vec3f> verts;
+       std::vector<lm::vec3f> vcol;
        std::vector<lm::vec3f> norms;
        std::vector<lm::vec3f> tangents;
        std::vector<lm::vec2f> uvs;