File: gl_state_checker.h

package info (click to toggle)
clanlib 1.0~svn3827-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 24,312 kB
  • ctags: 16,513
  • sloc: cpp: 101,606; xml: 6,410; makefile: 1,747; ansic: 463; perl: 424; php: 247; sh: 53
file content (215 lines) | stat: -rw-r--r-- 5,542 bytes parent folder | download | duplicates (7)
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/*
**  ClanLib SDK
**  Copyright (c) 1997-2005 The ClanLib Team
**
**  This software is provided 'as-is', without any express or implied
**  warranty.  In no event will the authors be held liable for any damages
**  arising from the use of this software.
**
**  Permission is granted to anyone to use this software for any purpose,
**  including commercial applications, and to alter it and redistribute it
**  freely, subject to the following restrictions:
**
**  1. The origin of this software must not be misrepresented; you must not
**     claim that you wrote the original software. If you use this software
**     in a product, an acknowledgment in the product documentation would be
**     appreciated but is not required.
**  2. Altered source versions must be plainly marked as such, and must not be
**     misrepresented as being the original software.
**  3. This notice may not be removed or altered from any source distribution.
**
**  Note: Some of the libraries ClanLib may link to may have additional
**  requirements or restrictions.
**
**  File Author(s):
**
**    Magnus Norddahl
**    (if your name is missing here, please add it)
*/

#ifndef header_gl_state_checker
#define header_gl_state_checker

#if _MSC_VER > 1000
#pragma once
#endif

#include "API/GL/opengl_state_data.h"
#include "API/Display/stencil_func.h"

#ifdef WIN32
#include <windows.h>
#endif 

#include <stack>
#include "gl_state.h"

class CL_Quad;
class CL_Rect;
class CL_Rectf;
class CL_Pointf;
class CL_Color;
class CL_GraphicContext;
class CL_OpenGLState;
class CL_GraphicContext_OpenGL;
class CL_Surface_Target;
struct CL_TriangleParams;

class CL_GLStateChecker : private CL_OpenGLStateData
{
//! Construction:
public:
	CL_GLStateChecker(CL_GraphicContext_OpenGL *gc_opengl);

	~CL_GLStateChecker();

//! Attributes:
public:
	CL_OpenGLState *opengl_state;

	CL_GraphicContext_OpenGL *gc_opengl;

	CLint stencil_op_pass;
	CLint stencil_op_fail;
	CLint stencil_func_write;
	CLint stencil_write_ref;

//! Operations:
public:
	static CL_GLStateChecker *from_gc(CL_GraphicContext *gc);

	//: clear the screen. 
	void add_clear(
		const CL_Color &color);

	//: add a pixel
	void add_pixel(
		const CL_GLState &state,
		int x, int y);

	//: add a line
	void add_line(
		const CL_GLState &state,
		float x1, float y1, float x2, float y2);

	//: add lines
	void add_lines(
		const CL_GLState &state,
		unsigned int count,
		double *vertices);

	//: add a gradient filled rectangle.
	void add_gradient(
		const CL_GLState &state,
		const CL_Rectf &position,
		const CL_Gradient &gradient);
	
	//: add a gradient filled quad.
	void add_gradient(
		const CL_GLState &state,
		const CL_Quad &quad,
		const CL_Gradient &gradient);

	//: add a textured quad.
	void add_quad(
		const CL_GLState &state,
		double px1,
		double py1,
		double px2,
		double py2,
		int tx1,
		int ty1,
		int tx2,
		int ty2);

	//: add a textured quad.
	void add_quad(
		const CL_GLState &state,
		const double destX[4],
		const double destY[4],
		const int tx[4],
		const int ty[4]);

	//: add triangles (optionally colored and uv-mapped).
	void add_triangles( const CL_GLState &state, CL_TriangleParams *params);

	//: Renders state tree objects.
	void flush(bool rebind_texture=false) const;

	//: Reads a pixel from opengl context.
	CL_Color get_pixel(int x, int y) const;

	//: Clears the Stencil buffer
	void clear_stencil(int value);

	//: Enable writing to stencil buffer
	void enable_stencil_write(bool enabled, bool visible, double alpha_limit);

	//: Enable testing pixels to be drawn with stencil buffer
	void enable_stencil_test(bool enabled, CL_StencilFunc func, int ref);

	void reinitialize_asap(); //MacOS needed method after toggling windowed/fullscreen mode

//! CL_OpenGLStateData:
private:
	//: Save state information needed to restore this OpenGL state.
	virtual void on_save();

	//: Load state information and setup OpenGL to this state.
	virtual void on_load();

	//: Flush current rendering batch.
	virtual void on_flush();

//! Implementation:
private:
	inline void add_quad_vertices(const CL_GLState &state, double px1, double py1, double px2, double py2 );
	
	inline void add_quad_vertices(const CL_GLState &state, double px1, double py1, double px2, double py2, double px3, double py3, double px4, double py4 );

	void set_state(const CL_GLState &state, CLenum primitive);

	//: set_state helper.
	void set_blendfunc(const CL_GLState &state);

	void set_fillmode(const CL_GLState &state);

	mutable CL_GLState internal_state;

	mutable CLenum primitive;

	// Primitive texture.
	// Store pointer to surface used for texturing primitives (triangle)
	// Used for inc/dec of reference counting of the surface.
	// Makes sure the texture isn't free'ed before draw operations are completed.
	CL_Surface_Target *primitive_texture;

	// Number of quads that can be drawn at once.
	// If more are drawn, a flush() will take place.
	#define MAX_QUAD_COUNT 256

	// Need to distinguish gradients from plain quads.
	// This can be whatever except CL_QUADS, CL_LINES or CL_POINTS.
	#define CL_GRADIENT 0x1337

	//: keep track of how many primitives to draw.
	mutable int primitive_count;

	CLdouble vertex_array[MAX_QUAD_COUNT*3*4];
	CLint i_uv_array[MAX_QUAD_COUNT*2*4];
	CLdouble d_uv_array[MAX_QUAD_COUNT*2*4];
	CLdouble d_color_array[MAX_QUAD_COUNT*4*4];
	CLubyte b_color_array[MAX_QUAD_COUNT*4*4];

	bool tri_use_uv;
	bool tri_use_color;
	
	bool first_call;
	
	bool color_array_enabled;

	bool color_array_range_zero2one;
	bool uv_array_range_zero2one;
};

#endif