aboutsummaryrefslogtreecommitdiff
path: root/src/3rdparty/ogl/OpenGL.h
blob: 3e416c700481d62ae57c312d997b66cfaa6c5721 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#ifndef __OGL2D_H
#define __OGL2D_H
#include <vector>

/* include gl.h before this file */
namespace ogl2d
{
	/* 2d wrap of opengl 3.0 */
	class OpenGL
	{
	public:
		OpenGL();
		~OpenGL();

		inline void enable(GLenum cap)
		{
			glEnable(cap);
		}

		inline void disable(GLenum cap)
		{
			glDisable(cap);
		}

		inline void setBlendFunc(GLenum sfactor, GLenum dfactor)
		{
			glBlendFunc(sfactor, dfactor);
		}

		inline void setClearColor(GLubyte r, GLubyte g, GLubyte b, GLubyte a)
		{
			glClearColor(r / 255.f, g / 255.f, b / 255.f, a / 255.f);
		}

		void pushColor(GLubyte r, GLubyte g, GLubyte b, GLubyte a = 255);
		void popColor();
		void flushError();
		GLuint genTexture();
        void deleteTexture(GLuint texture);
		void bindTexture(GLuint texture = 0);
		inline GLuint curTexture()
		{
			return _texture;
		}
		void setTexParameter(GLenum pname, GLint param);
		void texImage(GLint internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels = NULL);
		void texSubImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels);
		void activeTexUnit(unsigned int unit = 0);

		inline void drawArrays(GLenum mode, GLint first, GLsizei count)
		{
			glDrawArrays(mode, first, count);
		}

		inline void drawBuffer(GLenum mode)
		{

		}

		inline void drawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)
		{

		}

		inline void enableClientState(GLenum arr)
		{
			glEnableClientState(arr);
		}

		inline void disableClientState(GLenum arr)
		{
			glDisableClientState(arr);
		}

		inline GLuint genFrameBuffer()
		{
			GLuint fbo;
			glGenFramebuffers(1, &fbo);
			return fbo;
		}

		inline void bindFrameBuffer(GLuint fbo)
		{
			glBindFramebuffer(GL_FRAMEBUFFER, fbo);
		}

        // Ļһ
        inline void ortho(int w, float radio)
        {
            glOrtho(0, w, w*radio, 0, -1, 1);
        }

        inline void orthox(int w, int h)
        {
            glOrtho(0, w, h, 0, -1, 1);
        }

	protected:
		struct { GLubyte r, g, b, a; } _color;    // current draw color
		struct { GLubyte r, g, b, a; } _precolor; // previous draw color
		GLuint _texture;                          // current binded texture

	};

	///* OpenGL instance singleton */
	extern OpenGL gl;

#if defined(OGL2D_IMPLEMENT)

	OpenGL gl;

	OpenGL::OpenGL()
	{
		memset(&_color, 0xff, sizeof(_color));
		memset(&_precolor, 0xff, sizeof(_precolor));
	}

	OpenGL::~OpenGL()
	{
	}

	void OpenGL::pushColor(GLubyte r, GLubyte g, GLubyte b, GLubyte a)
	{
		memcpy(&_precolor, &_color, sizeof(_precolor));
		_color.r = r;
		_color.g = g;
		_color.b = b;
		_color.a = a;
		glColor4ub(r, g, b, a);
	}

	void OpenGL::popColor()
	{
		memcpy(&_color, &_precolor, sizeof(_precolor));
		glColor4ub(_color.r, _color.g, _color.b, _color.a);
	}

	void OpenGL::flushError()
	{
		while (glGetError() != GL_NO_ERROR);
	}

	GLuint OpenGL::genTexture()
	{
		GLuint t;
		glGenTextures(1, &t);
		return t;
	}

	void OpenGL::bindTexture(GLuint texture)
	{
		glBindTexture(GL_TEXTURE_2D, texture);
	}

    void OpenGL::deleteTexture(GLuint texture)
    {
        glDeleteTextures(1, &texture);
    }

	void OpenGL::setTexParameter(GLenum pname, GLint param)
	{
		glTexParameteri(GL_TEXTURE_2D, pname, param);
	}

	void OpenGL::texImage(GLint internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
	{
		glTexImage2D(GL_TEXTURE_2D, 0, internalformat, width, height, 0, format, type, pixels);
	}

	void OpenGL::texSubImage(GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)
	{
		glTexSubImage2D(GL_TEXTURE_2D, 0, xoffset, yoffset, width, height, format, type, pixels);
	}

	void OpenGL::activeTexUnit(unsigned int unit)
	{
		// glActiveTexture selects which texture unit subsequent texture state calls will affect. 
		glActiveTexture(GL_TEXTURE0 + unit);
	}

#endif // OGL2D_IMPLEMENT
}

#endif