OSDN Git Service

34eea6dbe32fdd89a00493c3cb8183853aa6fbc8
[qtgeoviewer/QtGeoViewer.git] / Src / GLUtility / GlVBO.cpp
1 #include "stdafx.h"
2 #include "GlVBO.h"
3
4 #define VBO_BUFFER_OFFSET(bytes) ((GLubyte *)NULL + (bytes))
5
6
7
8 GlVBO::GlVBO(GLenum target) :
9         m_Target(target)
10 {
11         m_BufID = 0;
12 }
13
14 GlVBO::~GlVBO(void)
15 {
16         ReleaseBufferElement();
17 }
18
19 void GlVBO::GenerateBuffer(void)
20 {
21         glGenBuffers(1, &m_BufID);
22 }
23
24 GLuint GlVBO::GetID(void)
25 {
26         return m_BufID;
27 }
28
29 void GlVBO::ReleaseBufferElement(void)
30 {
31         if(m_BufID == 0)
32                 return;
33
34         glDeleteBuffers(1, &m_BufID);
35         m_BufID = 0;
36 }
37
38 bool GlVBO::HasBuffer(void) const
39 {
40         return m_BufID != 0;
41 }
42
43 void GlVBO::Bind(void)
44 {
45         glBindBuffer(m_Target, m_BufID);
46 }
47
48 void GlVBO::AssginBuffer2f(const std::vector<lm::vec2f>& buf)
49 {
50         int num_elems = 2;
51
52         GenerateBuffer();
53         Bind();
54         glBufferData(GL_ARRAY_BUFFER, buf.size() * num_elems * 4, buf[0].v(), GL_STATIC_DRAW);
55 }
56
57 void GlVBO::AssginBuffer3f(const std::vector<lm::vec3f>& buf)
58 {
59         int num_elems = 3;
60
61         GenerateBuffer();
62         Bind();
63         glBufferData(GL_ARRAY_BUFFER, buf.size() * num_elems * 4, buf[0].v(), GL_STATIC_DRAW);
64 }
65
66 void GlVBO::AssginBufferi(const std::vector<GLuint>& buf)
67 {
68         GenerateBuffer();
69         Bind();
70         glBufferData(GL_ELEMENT_ARRAY_BUFFER, buf.size() * 4, &buf[0], GL_STATIC_DRAW);
71 }
72
73 void GlVBO::BindPtrAsNoral(void)
74 {
75         glEnableClientState(GL_NORMAL_ARRAY);
76         Bind();
77         glNormalPointer(GL_FLOAT, 0, VBO_BUFFER_OFFSET(0));
78 }
79
80 void GlVBO::BindPtrAsTexcoord(void)
81 {
82         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
83         Bind();
84         glTexCoordPointer(2, GL_FLOAT, 0, VBO_BUFFER_OFFSET(0));
85 }
86
87 void GlVBO::BindPtrAsAttrib3f(GLint buf_id)
88 {
89         glEnableVertexAttribArray(buf_id);
90         Bind();
91         glVertexAttribPointer(buf_id, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, VBO_BUFFER_OFFSET(0));
92 }