00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "gl.h"
00014 #include "glext.h"
00015 #include "regcombine.h"
00016
00017 #if 0
00018 namespace rc
00019 {
00020 enum {
00021 Combiner0 = GL_COMBINER0_NV,
00022 Combiner1 = GL_COMBINER1_NV,
00023 Combiner2 = GL_COMBINER2_NV,
00024 Combiner3 = GL_COMBINER3_NV,
00025 };
00026
00027 enum {
00028 A = GL_VARIABLE_A_NV,
00029 B = GL_VARIABLE_B_NV,
00030 C = GL_VARIABLE_C_NV,
00031 D = GL_VARIABLE_D_NV,
00032 E = GL_VARIABLE_E_NV,
00033 F = GL_VARIABLE_F_NV,
00034 G = GL_VARIABLE_G_NV,
00035 };
00036
00037 enum {
00038 RGBPortion = GL_RGB,
00039 AlphaPortion = GL_ALPHA,
00040 BluePortion = GL_BLUE,
00041 };
00042
00043 enum {
00044 UnsignedIdentity = GL_UNSIGNED_IDENTITY_NV,
00045 UnsignedInvert = GL_UNSIGNED_INVERT_NV,
00046 ExpandNormal = GL_EXPAND_NORMAL_NV,
00047 };
00048 };
00049 #endif
00050
00051 namespace rc
00052 {
00053 void parameter(GLenum, Color);
00054 };
00055
00056
00057 void rc::parameter(GLenum which, Color color)
00058 {
00059 float f[4];
00060 f[0] = color.red();
00061 f[1] = color.green();
00062 f[2] = color.blue();
00063 f[3] = color.alpha();
00064 glx::glCombinerParameterfvNV(which, f);
00065 }
00066
00067 void SetupCombinersBumpMap(Texture& bumpTexture,
00068 Texture& normalizationTexture,
00069 Color ambientColor)
00070 {
00071 glEnable(GL_REGISTER_COMBINERS_NV);
00072
00073 glDisable(GL_LIGHTING);
00074 glx::glActiveTextureARB(GL_TEXTURE1_ARB);
00075 glEnable(GL_TEXTURE_CUBE_MAP_EXT);
00076 normalizationTexture.bind();
00077
00078 glx::glActiveTextureARB(GL_TEXTURE0_ARB);
00079 glEnable(GL_TEXTURE_2D);
00080 bumpTexture.bind();
00081
00082
00083 glx::glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, 1);
00084
00085 float ambient[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
00086 ambient[0] = ambientColor.red();
00087 ambient[1] = ambientColor.green();
00088 ambient[2] = ambientColor.blue();
00089 glx::glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, ambient);
00090
00091
00092
00093 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB,
00094 GL_VARIABLE_A_NV, GL_TEXTURE0_ARB,
00095 GL_EXPAND_NORMAL_NV, GL_RGB);
00096
00097
00098 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB,
00099 GL_VARIABLE_B_NV, GL_TEXTURE1_ARB,
00100 GL_EXPAND_NORMAL_NV, GL_RGB);
00101
00102
00103 glx::glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB,
00104 GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV,
00105 GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE);
00106
00107
00108
00109 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV,
00110 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
00111
00112 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV,
00113 GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_BLUE);
00114
00115 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV,
00116 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
00117
00118 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV,
00119 GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV, GL_BLUE);
00120
00121
00122
00123 glx::glCombinerOutputNV(GL_COMBINER0_NV, GL_ALPHA,
00124 GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV,
00125 GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
00126
00127
00128 glx::glFinalCombinerInputNV(GL_VARIABLE_A_NV,
00129 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
00130 glx::glFinalCombinerInputNV(GL_VARIABLE_B_NV,
00131 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00132
00133 glx::glFinalCombinerInputNV(GL_VARIABLE_C_NV,
00134 GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00135
00136 glx::glFinalCombinerInputNV(GL_VARIABLE_D_NV,
00137 GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00138
00139 glx::glFinalCombinerInputNV(GL_VARIABLE_G_NV,
00140 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
00141 }
00142
00143
00144
00145
00146
00147
00148
00149 void SetupCombinersSmooth(Texture& baseTexture,
00150 Texture& normalizationTexture,
00151 Color ambientColor,
00152 bool invert)
00153 {
00154 glEnable(GL_REGISTER_COMBINERS_NV);
00155
00156 glDisable(GL_LIGHTING);
00157 glx::glActiveTextureARB(GL_TEXTURE1_ARB);
00158 glEnable(GL_TEXTURE_CUBE_MAP_EXT);
00159 normalizationTexture.bind();
00160 glx::glActiveTextureARB(GL_TEXTURE0_ARB);
00161 glEnable(GL_TEXTURE_2D);
00162 baseTexture.bind();
00163
00164
00165 glx::glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, 1);
00166
00167 float ambient[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
00168 ambient[0] = ambientColor.red();
00169 ambient[1] = ambientColor.green();
00170 ambient[2] = ambientColor.blue();
00171 glx::glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, ambient);
00172
00173
00174 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV,
00175 GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV,
00176 GL_RGB);
00177
00178 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV,
00179 GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00180
00181 glx::glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB,
00182 GL_SPARE1_NV, GL_DISCARD_NV, GL_DISCARD_NV,
00183 GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
00184
00185
00186 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV,
00187 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
00188
00189 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV,
00190 GL_TEXTURE1_ARB, GL_EXPAND_NORMAL_NV,
00191 GL_BLUE);
00192
00193 glx::glCombinerOutputNV(GL_COMBINER0_NV, GL_ALPHA,
00194 GL_SPARE0_NV, GL_DISCARD_NV, GL_DISCARD_NV,
00195 GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
00196
00197
00198 glx::glFinalCombinerInputNV(GL_VARIABLE_E_NV,
00199 GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00200
00201 glx::glFinalCombinerInputNV(GL_VARIABLE_F_NV,
00202 GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00203
00204 glx::glFinalCombinerInputNV(GL_VARIABLE_A_NV,
00205 GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00206
00207 glx::glFinalCombinerInputNV(GL_VARIABLE_B_NV,
00208 GL_SPARE0_NV,
00209 invert ? GL_UNSIGNED_INVERT_NV : GL_UNSIGNED_IDENTITY_NV,
00210 GL_ALPHA);
00211
00212 glx::glFinalCombinerInputNV(GL_VARIABLE_C_NV,
00213 GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00214
00215 glx::glFinalCombinerInputNV(GL_VARIABLE_D_NV,
00216 GL_E_TIMES_F_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00217
00218 glx::glFinalCombinerInputNV(GL_VARIABLE_G_NV,
00219 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
00220
00221 }
00222
00223
00224
00225
00226 void SetupCombinersDecalAndBumpMap(Texture& bumpTexture,
00227 Color ambientColor,
00228 Color diffuseColor)
00229 {
00230 glEnable(GL_REGISTER_COMBINERS_NV);
00231 glx::glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, 2);
00232
00233 rc::parameter(GL_CONSTANT_COLOR0_NV, ambientColor);
00234 rc::parameter(GL_CONSTANT_COLOR1_NV, diffuseColor);
00235
00236
00237
00238 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB,
00239 GL_VARIABLE_A_NV, GL_TEXTURE1_ARB,
00240 GL_EXPAND_NORMAL_NV, GL_RGB);
00241
00242
00243
00244
00245
00246
00247 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB,
00248 GL_VARIABLE_B_NV, GL_PRIMARY_COLOR_NV,
00249 GL_EXPAND_NORMAL_NV, GL_RGB);
00250
00251
00252 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB,
00253 GL_VARIABLE_C_NV, GL_TEXTURE0_ARB,
00254 GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00255 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB,
00256 GL_VARIABLE_D_NV, GL_CONSTANT_COLOR1_NV,
00257 GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00258
00259
00260 glx::glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB,
00261 GL_SPARE0_NV, GL_SPARE1_NV, GL_DISCARD_NV,
00262 GL_NONE, GL_NONE, GL_TRUE, GL_FALSE, GL_FALSE);
00263
00264
00265
00266 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_A_NV,
00267 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
00268
00269 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_B_NV,
00270 GL_PRIMARY_COLOR_NV, GL_EXPAND_NORMAL_NV, GL_BLUE);
00271
00272 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_C_NV,
00273 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
00274
00275 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_ALPHA, GL_VARIABLE_D_NV,
00276 GL_PRIMARY_COLOR_NV, GL_EXPAND_NORMAL_NV, GL_BLUE);
00277
00278
00279
00280 glx::glCombinerOutputNV(GL_COMBINER0_NV, GL_ALPHA,
00281 GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV,
00282 GL_SCALE_BY_FOUR_NV, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
00283
00284
00285
00286 glx::glCombinerInputNV(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_A_NV,
00287 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
00288 glx::glCombinerInputNV(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_B_NV,
00289 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00290 glx::glCombinerInputNV(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_C_NV,
00291 GL_CONSTANT_COLOR0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00292 glx::glCombinerInputNV(GL_COMBINER1_NV, GL_RGB, GL_VARIABLE_D_NV,
00293 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB);
00294 glx::glCombinerOutputNV(GL_COMBINER1_NV, GL_RGB,
00295 GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV,
00296 GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
00297
00298
00299
00300 glx::glFinalCombinerInputNV(GL_VARIABLE_E_NV,
00301 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00302
00303 glx::glFinalCombinerInputNV(GL_VARIABLE_F_NV,
00304 GL_SPARE1_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00305
00306
00307 glx::glFinalCombinerInputNV(GL_VARIABLE_A_NV,
00308 GL_FOG, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
00309
00310 glx::glFinalCombinerInputNV(GL_VARIABLE_B_NV,
00311 GL_E_TIMES_F_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00312
00313 glx::glFinalCombinerInputNV(GL_VARIABLE_C_NV,
00314 GL_FOG, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00315
00316 glx::glFinalCombinerInputNV(GL_VARIABLE_D_NV,
00317 GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00318
00319
00320 glx::glFinalCombinerInputNV(GL_VARIABLE_G_NV,
00321 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
00322 }
00323
00324
00325
00326 void SetupCombinersGlossMap(int glossMap)
00327 {
00328 glEnable(GL_REGISTER_COMBINERS_NV);
00329
00330
00331 glx::glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, 1);
00332
00333
00334 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV,
00335 GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00336
00337 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV,
00338 GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00339
00340 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV,
00341 GL_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00342 if (glossMap != 0)
00343 {
00344
00345 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV,
00346 glossMap, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00347 }
00348 else
00349 {
00350
00351 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV,
00352 GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
00353 }
00354
00355
00356 glx::glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB,
00357 GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV,
00358 GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
00359
00360
00361 glx::glFinalCombinerInputNV(GL_VARIABLE_A_NV,
00362 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00363
00364 glx::glFinalCombinerInputNV(GL_VARIABLE_B_NV,
00365 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_RGB);
00366
00367 glx::glFinalCombinerInputNV(GL_VARIABLE_C_NV,
00368 GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00369
00370 glx::glFinalCombinerInputNV(GL_VARIABLE_D_NV,
00371 GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00372
00373 glx::glFinalCombinerInputNV(GL_VARIABLE_G_NV,
00374 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
00375 }
00376
00377
00378
00379 void SetupCombinersGlossMapWithFog(int glossMap)
00380 {
00381 glEnable(GL_REGISTER_COMBINERS_NV);
00382
00383
00384 glx::glCombinerParameteriNV(GL_NUM_GENERAL_COMBINERS_NV, 1);
00385
00386
00387 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_A_NV,
00388 GL_PRIMARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00389
00390 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_B_NV,
00391 GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00392
00393 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_C_NV,
00394 GL_SECONDARY_COLOR_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00395 if (glossMap != 0)
00396 {
00397
00398 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV,
00399 glossMap, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00400 }
00401 else
00402 {
00403
00404 glx::glCombinerInputNV(GL_COMBINER0_NV, GL_RGB, GL_VARIABLE_D_NV,
00405 GL_TEXTURE0_ARB, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
00406 }
00407
00408
00409 glx::glCombinerOutputNV(GL_COMBINER0_NV, GL_RGB,
00410 GL_DISCARD_NV, GL_DISCARD_NV, GL_SPARE0_NV,
00411 GL_NONE, GL_NONE, GL_FALSE, GL_FALSE, GL_FALSE);
00412
00413
00414 glx::glFinalCombinerInputNV(GL_VARIABLE_A_NV,
00415 GL_FOG, GL_UNSIGNED_IDENTITY_NV, GL_ALPHA);
00416
00417 glx::glFinalCombinerInputNV(GL_VARIABLE_B_NV,
00418 GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00419
00420 glx::glFinalCombinerInputNV(GL_VARIABLE_C_NV,
00421 GL_FOG, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00422
00423 glx::glFinalCombinerInputNV(GL_VARIABLE_D_NV,
00424 GL_ZERO, GL_UNSIGNED_IDENTITY_NV, GL_RGB);
00425
00426 glx::glFinalCombinerInputNV(GL_VARIABLE_G_NV,
00427 GL_ZERO, GL_UNSIGNED_INVERT_NV, GL_ALPHA);
00428 }
00429
00430
00431 void DisableCombiners()
00432 {
00433 glDisable(GL_REGISTER_COMBINERS_NV);
00434 glx::glActiveTextureARB(GL_TEXTURE1_ARB);
00435 glDisable(GL_TEXTURE_CUBE_MAP_EXT);
00436 glDisable(GL_TEXTURE_2D);
00437 glx::glActiveTextureARB(GL_TEXTURE0_ARB);
00438 }