OSDN Git Service

頂点カラー VBOに対応
[qtgeoviewer/QtGeoViewer.git] / Src / QtGeoViewer / GeometryVBO.cpp
1 #include "stdafx.h"
2 #include "GeometryVBO.h"
3
4 #include "Shader/ShaderInterface.h"
5
6 #define VBO_BUFFER_OFFSET(bytes) ((GLubyte *)NULL + (bytes))
7
8
9
10 GeometryVBO::GeometryVBO(void) :
11         m_Vertex(GL_ARRAY_BUFFER),
12         m_Normal(GL_ARRAY_BUFFER),
13         m_Texture(GL_ARRAY_BUFFER),
14         m_VCol(GL_ARRAY_BUFFER),
15         m_Tangents(GL_ARRAY_BUFFER),
16         m_Index(GL_ELEMENT_ARRAY_BUFFER)
17 {
18 }
19
20 void GeometryVBO::Release(void)
21 {
22         m_Vertex.ReleaseBufferElement();
23         m_Normal.ReleaseBufferElement();
24         m_Texture.ReleaseBufferElement();
25         m_VCol.ReleaseBufferElement();
26         m_Tangents.ReleaseBufferElement();
27         m_Index.ReleaseBufferElement();
28
29         NumTriangles = 0;
30 }
31
32 void GeometryVBO::DrawVBOAll(GLenum primiType, ShaderInterface* shader)
33 {
34         if (!m_Vertex.HasBuffer())
35                 return;
36
37         glEnableClientState(GL_VERTEX_ARRAY);
38         m_Vertex.Bind();
39         glVertexPointer(3, GL_FLOAT, 0, VBO_BUFFER_OFFSET(0));
40
41         if (m_Normal.HasBuffer())
42                 m_Normal.BindPtrAsNoral();
43         
44         if (m_Texture.HasBuffer())
45                 m_Texture.BindPtrAsTexcoord();
46
47         if (m_VCol.HasBuffer())
48                 m_VCol.BindPtrAsColor();
49
50         GLint tbuf_id = -1;
51         if (m_Tangents.HasBuffer())
52         {
53                 tbuf_id = shader->GetTangentAttribIndex();
54                 if (tbuf_id != -1)
55                         m_Tangents.BindPtrAsAttrib3f(tbuf_id);
56         }
57
58         m_Index.Bind();
59         glDrawElements(primiType, NumTriangles * 3 * 4, GL_UNSIGNED_INT, VBO_BUFFER_OFFSET(0));
60
61         glDisableClientState(GL_VERTEX_ARRAY);
62         glDisableClientState(GL_NORMAL_ARRAY);
63         glDisableClientState(GL_COLOR_ARRAY);
64         glDisableClientState(GL_TEXTURE_COORD_ARRAY);
65
66         if (tbuf_id != -1)
67                 glDisableVertexAttribArray(tbuf_id);
68 }