00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00040 #include "omicron/internal.h"
00041 #include "omicron/render.h"
00042 #include "omicron/texture.h"
00043 #include "omicron/list.h"
00044
00045 static ulong _gl_texfilter[] =
00046 {
00047 GL_NEAREST,
00048 GL_LINEAR,
00049 GL_NEAREST_MIPMAP_NEAREST,
00050 GL_LINEAR_MIPMAP_NEAREST,
00051 GL_NEAREST_MIPMAP_LINEAR,
00052 GL_LINEAR_MIPMAP_LINEAR
00053 };
00054
00055 static ulong _gl_texwrap[] =
00056 {
00057 GL_REPEAT,
00058 GL_CLAMP
00059 };
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 void renderer_c::set_color
00073 (
00074 color_t color
00075 )
00076 {
00077 AssertThis;
00078
00079 state.currentcolor = color;
00080 color_to_vec(state.currentcolor, state.currentcolorvec);
00081 }
00082
00083
00084
00085
00086
00087
00088
00089 void renderer_c::set_blending
00090 (
00091 ushort blendtype
00092 )
00093 {
00094 AssertThis;
00095
00096
00097
00098
00099 state.blendtype = blendtype;
00100
00101 switch(blendtype)
00102 {
00103 case BT_ADD:
00104 glBlendFunc(GL_ONE, GL_ONE);
00105 break;
00106
00107 case BT_BLEND:
00108 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00109 break;
00110
00111 case BT_MODULATE:
00112 glBlendFunc(GL_ZERO, GL_SRC_COLOR);
00113 break;
00114
00115 case BT_MODULATE2X:
00116 glBlendFunc(GL_ONE, GL_SRC_COLOR);
00117 break;
00118
00119 case BT_OPAQUE:
00120 glDisable(GL_BLEND);
00121 return;
00122
00123 case BT_ALPHATEST:
00124 glDisable(GL_BLEND);
00125 glEnable(GL_ALPHA_TEST);
00126 return;
00127
00128 }
00129 glDisable(GL_ALPHA_TEST);
00130 glEnable(GL_BLEND);
00131 }
00132
00133
00134
00135
00136
00137
00138 void renderer_c::set_zbuffer
00139 (
00140 ushort buftype
00141 )
00142 {
00143 AssertThis;
00144
00145
00146
00147
00148 state.zbuffertype = buftype;
00149
00150 switch(buftype)
00151 {
00152 case ZB_NONE:
00153 glEnable(GL_DEPTH_TEST);
00154 glDepthFunc(GL_ALWAYS);
00155 break;
00156
00157 case ZB_LESS:
00158 glEnable(GL_DEPTH_TEST);
00159 glDepthFunc(GL_LESS);
00160 break;
00161
00162 case ZB_LESSEQUAL:
00163 glEnable(GL_DEPTH_TEST);
00164 glDepthFunc(GL_LEQUAL);
00165 break;
00166
00167 case ZB_EQUAL:
00168 glEnable(GL_DEPTH_TEST);
00169 glDepthFunc(GL_EQUAL);
00170 break;
00171
00172 case ZB_GREATEREQUAL:
00173 glEnable(GL_DEPTH_TEST);
00174 glDepthFunc(GL_GEQUAL);
00175 break;
00176
00177 case ZB_GREATER:
00178 glEnable(GL_DEPTH_TEST);
00179 glDepthFunc(GL_GREATER);
00180 break;
00181 }
00182 }
00183
00184
00185
00186
00187
00188
00189 void renderer_c::set_zwrite
00190 (
00191 bool enable
00192 )
00193 {
00194 AssertThis;
00195
00196 glDepthMask(enable);
00197 }
00198
00199
00200
00201
00202
00203
00204 void renderer_c::set_culling
00205 (
00206 ushort cullmode
00207 )
00208 {
00209 AssertThis;
00210
00211 switch(cullmode)
00212 {
00213 case CULL_NONE:
00214 glDisable(GL_CULL_FACE);
00215 break;
00216
00217 case CULL_CW:
00218 glEnable(GL_CULL_FACE);
00219 glCullFace(GL_FRONT);
00220 break;
00221
00222 case CULL_CCW:
00223 glEnable(GL_CULL_FACE);
00224 glCullFace(GL_BACK);
00225 break;
00226 }
00227 }
00228
00229
00230
00231
00232
00233
00234 void renderer_c::set_spheremapping
00235 (
00236 bool enable
00237 )
00238 {
00239 AssertThis;
00240
00241
00242
00243
00244 state.spheremapping = enable;
00245
00246 if (enable)
00247 {
00248 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
00249 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
00250 glEnable(GL_TEXTURE_GEN_S);
00251 glEnable(GL_TEXTURE_GEN_T);
00252
00253 }
00254 else
00255 {
00256 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00257 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
00258 glDisable(GL_TEXTURE_GEN_S);
00259 glDisable(GL_TEXTURE_GEN_T);
00260 }
00261 }
00262
00263
00264
00265
00266
00267
00268 void renderer_c::set_fog
00269 (
00270 bool enable
00271 )
00272 {
00273 AssertThis;
00274
00275 if (state.fog == enable)
00276 return;
00277
00278 if (state.fog = enable)
00279 glEnable(GL_FOG);
00280 else
00281 glDisable(GL_FOG);
00282 }
00283
00284
00285
00286
00287
00288
00289 void renderer_c::set_fog_params
00290 (
00291 float n,
00292 float f,
00293 color_t color
00294 )
00295 {
00296 AssertThis;
00297
00298 vec4_t colvec;
00299
00300 glFogi(GL_FOG_MODE, GL_LINEAR);
00301 glFogf(GL_FOG_START, n );
00302 glFogf(GL_FOG_END, f );
00303
00304 color_to_vec(color, colvec);
00305
00306 glFogfv(GL_FOG_COLOR, colvec);
00307 }
00308
00309
00310
00311
00312
00313
00314 void renderer_c::use_shader
00315 (
00316 const shader_t *shader
00317 )
00318 {
00319 AssertThis;
00320
00321 state.currentshader = shader;
00322 }
00323
00324
00325
00326
00327
00328 void renderer_c::set_target_texture(sshort n)
00329 {
00330
00331
00332
00333
00334 if (!gv.texman->get_gltexture(n))
00335 return;
00336
00337 glViewport(0,0, gv.texman->get_width(n), gv.texman->get_height(n));
00338 state.targettexture = n;
00339
00340
00341 }
00342
00343
00344
00345
00346
00347 void renderer_c::set_target_backbuffer()
00348 {
00349 AssertThis;
00350
00351 if (state.targettexture == -1)
00352 return;
00353
00354 sshort num = state.targettexture;
00355 ushort w = gv.texman->get_width(num);
00356 ushort h = gv.texman->get_height(num);
00357
00358 char *buf = new char[4*w*h];
00359
00360
00361 glReadBuffer(GL_BACK);
00362 glBindTexture(GL_TEXTURE_2D, gv.texman->get_gltexture(num));
00363
00364 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
00365 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
00366 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0,0, w,h, 0);
00367
00368 glViewport(0,0,gv.init.hres, gv.init.vres);
00369
00370 SafeArrayDelete(buf);
00371 }
00372
00373
00374
00375
00376 void renderer_c::set_lightmap(sshort i)
00377 {
00378 AssertThis;
00379
00380 if (i<0)
00381 i = -1;
00382
00383 gv.lightmap = i;
00384 }
00385
00386 void renderer_c::set_texture_params
00387 (
00388 sshort minfilter,
00389 sshort magfilter,
00390 sshort wrapu,
00391 sshort wrapv
00392 )
00393 {
00394
00395 {
00396 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
00397 _gl_texfilter[minfilter]);
00398
00399 state.texminfilter = minfilter;
00400 }
00401
00402
00403 {
00404 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
00405 _gl_texfilter[magfilter]);
00406
00407 state.texmagfilter = magfilter;
00408 }
00409
00410 if (state.texwrapu != wrapu)
00411 {
00412 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
00413 _gl_texwrap[wrapu]);
00414
00415 state.texwrapu = wrapu;
00416 }
00417
00418 if (state.texwrapv != wrapv)
00419 {
00420 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
00421 _gl_texwrap[wrapv]);
00422
00423 state.texwrapv = wrapv;
00424 }
00425 }
00426
00427
00428
00429
00430 void _r_update_lights()
00431 {
00432 if (gv.lightcount)
00433 {
00434 glEnable(GL_LIGHTING);
00435
00436 for (ulong i=0; i<8; i++)
00437 {
00438 if (i>=gv.lightcount)
00439 {
00440 glDisable(GL_LIGHT0+i);
00441 continue;
00442 }
00443
00444 glEnable(GL_LIGHT0+i);
00445
00446 vec4_t color;
00447
00448 color_to_vec(gv.lights[i].color, color);
00449
00450 glLightfv(GL_LIGHT0+i, GL_DIFFUSE, color);
00451 glLightfv(GL_LIGHT0+i, GL_POSITION, gv.lights[i].pos);
00452 }
00453 }
00454 else
00455 glDisable(GL_LIGHTING);
00456 }
00457
00458
00459
00460
00461
00462 color_t color_from_floats
00463 (
00464 float r,
00465 float g,
00466 float b,
00467 float a
00468 )
00469 {
00470 return _COLOR2LONG(CLAMP(r,0,1),CLAMP(g,0,1),CLAMP(b,0,1),CLAMP(a,0,1));
00471 }
00472
00473
00474
00475
00476
00477 color_t color_from_vec
00478 (
00479 const vec4_t color
00480 )
00481 {
00482 return color_from_floats( V4TOFS(color) );
00483 }
00484
00485
00486
00487
00488 void color_to_vec
00489 (
00490 color_t color,
00491 vec4_t out
00492 )
00493 {
00494 vec4_c(
00495 ((float)((color>>0)&0xff))/255.0f,
00496 ((float)((color>>8)&0xff))/255.0f,
00497 ((float)((color>>16)&0xff))/255.0f,
00498 ((float)((color>>24)&0xff))/255.0f).copy(out);
00499 }
00500
00501
00502
00503
00504 color_t color_interpolate
00505 (
00506 color_t color1,
00507 color_t color2,
00508 float frac
00509 )
00510 {
00511 vec4_t c1, c2;
00512
00513 if (!frac)
00514 return color1;
00515
00516 if (frac==1)
00517 return color2;
00518
00519 color_to_vec(color1, c1);
00520 color_to_vec(color2, c2);
00521
00522 return color_from_vec(vec4_c::linear(c1,c2, frac));
00523 }