OSDN Git Service

頂点カラーに一部対応
authorqw_fuku <fkhideaki@gmail.com>
Sat, 16 Jul 2016 17:26:15 +0000 (02:26 +0900)
committerqw_fuku <fkhideaki@gmail.com>
Sat, 16 Jul 2016 17:26:15 +0000 (02:26 +0900)
標準シェーダ+VBO無し時限定

Src/QtGeoViewer/GeometryRender.cpp
Src/QtGeoViewer/GeometryRender.h

index e6d8c47..cbb3c49 100644 (file)
@@ -293,7 +293,8 @@ void GeometryRender::DrawFace_WireConstantColorVBO(MeshBuf& mbuf, SceneMain& sce
                if (fg.IsEmpty())
                        continue;
 
-               DrawFaceGroupGeometry(mesh, fg, GL_POLYGON, shader);
+               VertAttrOption attr;
+               DrawFaceGroupGeometry(mesh, fg, GL_POLYGON, shader, attr);
        }
 
        shader->EndShader();
@@ -366,13 +367,16 @@ void GeometryRender::DrawFaceGroupFB(MeshBuf& mbuf, SceneMain& scene, ShaderInte
        glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);
        glEnable(GL_CULL_FACE);
 
+       VertAttrOption attr;
+       attr.tangent = true;
+
        glCullFace(GL_FRONT);
        lib_gl::MaterialSetter::SetGL(Mat_B);
-       DrawFaceGroupGeometry(mesh, fg, GL_TRIANGLE_FAN, shader);
+       DrawFaceGroupGeometry(mesh, fg, GL_TRIANGLE_FAN, shader, attr);
 
        glCullFace(GL_BACK);
        lib_gl::MaterialSetter::SetGL(Mat_F);
-       DrawFaceGroupGeometry(mesh, fg, GL_TRIANGLE_FAN, shader);
+       DrawFaceGroupGeometry(mesh, fg, GL_TRIANGLE_FAN, shader, attr);
 
        glPopAttrib();
 }
@@ -403,7 +407,26 @@ void GeometryRender::DrawFaceGroupFill(MeshBuf& mbuf, SceneMain& scene, ShaderIn
        else
                lib_gl::MaterialSetter::SetGL(*mat);
 
-       DrawFaceGroupGeometry(mesh, fg, GL_TRIANGLE_FAN, shader);
+       bool enableVCol = (m_Config->m_EnableVertexColor && mesh.HasVCol());
+
+       VertAttrOption attr;
+       attr.tangent = true;
+
+       glPushAttrib(GL_ENABLE_BIT);
+
+       if (enableVCol)
+       {
+               attr.vertCol = true;
+               if (m_Config->m_EnableLighting)
+               {
+                       glEnable(GL_COLOR_MATERIAL);
+                       glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
+               }
+       }
+
+       DrawFaceGroupGeometry(mesh, fg, GL_TRIANGLE_FAN, shader, attr);
+
+       glPopAttrib();
 }
 
 void GeometryRender::SetShaderConfig(ShaderInterface* shader)
@@ -439,21 +462,21 @@ GeometryVBO* GeometryRender::GetOrCreateVBO(lib_geo::BaseMesh& mesh, const FaceG
 }
 
 //! \8ew\92è\82µ\82½\83t\83F\81[\83X\83O\83\8b\81[\83v\82Ì\8c`\8fó\95`\89æ\82ð\8eÀ\8ds
-void GeometryRender::DrawFaceGroupGeometry(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader)
+void GeometryRender::DrawFaceGroupGeometry(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader, const VertAttrOption& attr)
 {
        if (m_Config->m_EnableFaceVBO)
-               return DrawFaceGroupGeometry_VBO(mesh, fg, primiType, shader);
+               return DrawFaceGroupGeometry_VBO(mesh, fg, primiType, shader, attr);
        else
-               return DrawFaceGroupGeometry_STD(mesh, fg, primiType, shader);
+               return DrawFaceGroupGeometry_STD(mesh, fg, primiType, shader, attr);
 }
 
-void GeometryRender::DrawFaceGroupGeometry_VBO(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader)
+void GeometryRender::DrawFaceGroupGeometry_VBO(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader, const VertAttrOption& attr)
 {
        GeometryVBO* vbo = GetOrCreateVBO(mesh, fg);
        vbo->DrawVBOAll(GL_TRIANGLES, shader);
 }
 
-void GeometryRender::DrawFaceGroupGeometry_STD(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader)
+void GeometryRender::DrawFaceGroupGeometry_STD(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader, const VertAttrOption& attr)
 {
        for (int fid : fg.m_Fids)
        {
@@ -468,6 +491,15 @@ void GeometryRender::DrawFaceGroupGeometry_STD(lib_geo::BaseMesh& mesh, const Fa
                        if (f.HasNormal())
                                glNormal3fv(mesh.m_Normals[f.m_NormIds[j]].v());
 
+                       if (attr.vertCol && mesh.HasVCol())
+                       {
+                               const lib_graph::color3f& c = mesh.m_Col[f.m_VertIds[j]];
+                               if (m_Config->m_VertColorTo01)
+                                       glColor3fv((c / 255.0f).v());
+                               else
+                                       glColor3fv(c.v());
+                       }
+
                        glVertex3fv(mesh.m_Verts[f.m_VertIds[j]].v());
                }
 
@@ -615,7 +647,8 @@ void GeometryRender::DrawFaceIndexColor(MeshBuf& mbuf, SceneMain& scene, unsigne
                if (fg.IsEmpty())
                        continue;
 
-               DrawFaceGroupGeometry(mesh, fg, GL_TRIANGLE_FAN, m_Shaders->GetConstantShader());
+               VertAttrOption attr;
+               DrawFaceGroupGeometry(mesh, fg, GL_TRIANGLE_FAN, m_Shaders->GetConstantShader(), attr);
        }
 
        glPopAttrib();
index ef5f4f8..d760463 100644 (file)
@@ -66,9 +66,9 @@ private:
        void AssignMatcap(SceneMain& scene, MeshBuf& mbuf, ShaderInterface* shader, const lib_geo::BaseFace& f) const;
        gl::GlTexture* GetSceneFixedTexture(SceneMain& scene) const;
 
-       void DrawFaceGroupGeometry(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader);
-       void DrawFaceGroupGeometry_VBO(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader);
-       void DrawFaceGroupGeometry_STD(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader);
+       void DrawFaceGroupGeometry(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader, const VertAttrOption& attr);
+       void DrawFaceGroupGeometry_VBO(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader, const VertAttrOption& attr);
+       void DrawFaceGroupGeometry_STD(lib_geo::BaseMesh& mesh, const FaceGroup& fg, GLenum primiType, ShaderInterface* shader, const VertAttrOption& attr);
 
        GeometryVBO* GetOrCreateVBO(lib_geo::BaseMesh& mesh, const FaceGroup& fg);