00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "xrb_gl.hpp"
00012
00013 #include "xrb_texture.hpp"
00014 #include "xrb_gltexture.hpp"
00015
00016 namespace Xrb
00017 {
00018
00019 namespace
00020 {
00021
00022 GLTexture *g_gltexture_opaque_white = NULL;
00023
00024 void CheckForExtension (char const *extension_name)
00025 {
00026 fprintf(stderr, " %s: ", extension_name);
00027 if (strstr(reinterpret_cast<char const *>(glGetString(GL_EXTENSIONS)), extension_name) == NULL)
00028 {
00029 fprintf(stderr, "NOT SUPPORTED -- aborting.\n");
00030 ASSERT0(false);
00031 }
00032 else
00033 fprintf(stderr, "supported.\n");
00034 }
00035
00036 }
00037
00038 GLTexture const &GL::GLTexture_OpaqueWhite ()
00039 {
00040 ASSERT1(g_gltexture_opaque_white != NULL && "You must call GL::Initialize before this function");
00041 return *g_gltexture_opaque_white;
00042 }
00043
00044 void GL::Initialize ()
00045 {
00046
00047 fprintf(stderr, "GL::Initialize();\n");
00048 fprintf(stderr, " GL_VENDOR = \"%s\"\n", glGetString(GL_VENDOR));
00049 fprintf(stderr, " GL_RENDERER = \"%s\"\n", glGetString(GL_RENDERER));
00050 fprintf(stderr, " GL_VERSION = \"%s\"\n", glGetString(GL_VERSION));
00051
00052
00053 {
00054 GLint max_texture_units;
00055 glGetIntegerv(GL_MAX_TEXTURE_UNITS, &max_texture_units);
00056 fprintf(stderr, " Checking GL_MAX_TEXTURE_UNITS (must be at least 2): %d\n", max_texture_units);
00057 ASSERT0(max_texture_units >= 2 && "GL_MAX_TEXTURE_UNITS must be at least 2");
00058 }
00059
00060
00061 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00062
00063
00064
00065
00066 {
00067 Texture *opaque_white = Texture::Create(ScreenCoordVector2(1, 1), true);
00068 opaque_white->Data()[0] = 255;
00069 opaque_white->Data()[1] = 255;
00070 opaque_white->Data()[2] = 255;
00071 opaque_white->Data()[3] = 255;
00072 g_gltexture_opaque_white = GLTexture::Create(opaque_white);
00073 }
00074
00075
00076 glCullFace(GL_BACK);
00077 glFrontFace(GL_CCW);
00078 glEnable(GL_CULL_FACE);
00079 glEnable(GL_BLEND);
00080 glEnable(GL_TEXTURE_2D);
00081 glDisable(GL_DEPTH_TEST);
00082 glDisable(GL_LIGHTING);
00083 glShadeModel(GL_FLAT);
00084 glDepthFunc(GL_LEQUAL);
00085
00086
00087 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00088
00089
00090 glEnable(GL_ALPHA_TEST);
00091 glAlphaFunc(GL_GREATER, 0.0f);
00092
00093 glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 {
00119 glActiveTexture(GL_TEXTURE0);
00120
00121
00122 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
00123
00124
00125 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
00126 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
00127 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
00128 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
00129
00130 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
00131
00132
00133
00134 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
00135 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
00136 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
00137 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_PREVIOUS);
00138
00139 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
00140
00141 }
00142
00143
00144
00145
00146
00147
00148 {
00149 glActiveTexture(GL_TEXTURE1);
00150
00151
00152 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
00153
00154
00155 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
00156 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_CONSTANT);
00157 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
00158 glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);
00159 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
00160 glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT);
00161 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
00162
00163
00164 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
00165 glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
00166 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
00167
00168
00169
00170
00171
00172
00173
00174 glBindTexture(GL_TEXTURE_2D, GLTexture_OpaqueWhite().Handle());
00175 }
00176
00177 glActiveTexture(GL_TEXTURE0);
00178
00179 }
00180
00181 bool GL::Boolean (GLenum name)
00182 {
00183 return Integer(name) != 0;
00184 }
00185
00186 GLint GL::Integer (GLenum name)
00187 {
00188
00189
00190
00191
00192 ASSERT1(name != GL_COMPRESSED_TEXTURE_FORMATS && "unsupported name");
00193 #if !defined(__IPHONEOS__)
00194 ASSERT1(name != GL_TRANSPOSE_COLOR_MATRIX && "unsupported name");
00195 ASSERT1(name != GL_TRANSPOSE_MODELVIEW_MATRIX && "unsupported name");
00196 ASSERT1(name != GL_TRANSPOSE_PROJECTION_MATRIX && "unsupported name");
00197 ASSERT1(name != GL_TRANSPOSE_TEXTURE_MATRIX && "unsupported name");
00198 ASSERT1(name != GL_COLOR_MATRIX && "unsupported name");
00199 #endif
00200 ASSERT1(name != GL_MODELVIEW_MATRIX && "unsupported name");
00201 ASSERT1(name != GL_PROJECTION_MATRIX && "unsupported name");
00202 ASSERT1(name != GL_TEXTURE_MATRIX && "unsupported name");
00203
00204
00205 GLint integer[4];
00206 glGetIntegerv(name, integer);
00207 return integer[0];
00208 }
00209
00210 void GL::SetClipRect (ScreenCoordRect const &clip_rect)
00211 {
00212 ASSERT1(clip_rect.IsValid());
00213
00214
00215 glMatrixMode(GL_PROJECTION);
00216 glLoadIdentity();
00217 glOrtho(
00218 clip_rect.Left(), clip_rect.Right(),
00219 clip_rect.Bottom(), clip_rect.Top(),
00220 -1.0, 1.0);
00221
00222
00223
00224
00225 glViewport(
00226 clip_rect.Left(),
00227 clip_rect.Bottom(),
00228 clip_rect.Width(),
00229 clip_rect.Height());
00230 }
00231
00232 }