Main Page   Class Hierarchy   Alphabetical List   Data Structures   File List   Data Fields   Globals   Related Pages  

r_state.cpp

Go to the documentation of this file.
00001 // OMICRON ENGINE HEADER FILE
00002 //
00003 // --------------------------------------------------------------------------
00004 // Copyright (C) 2001-2002 by Bjoern Paetzel <kolrabi@gmx.de>
00005 //
00006 // This file is part of the Omicron Engine.
00007 //
00008 // The Omicron Engine is free software; you can redistribute it and/or modify
00009 // it under the terms of the  GNU General Public License  as published by the
00010 // Free Software Foundation;  either version  2  of the License,  or (at your
00011 // option) any later version.
00012 //
00013 // The Omicron Engine  is distributed in the hope that it will be useful, but
00014 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
00015 // or  FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License
00016 // for more details.
00017 //
00018 // You should have  received a copy of the  GNU General Public License  along
00019 // with The Omicron Engine;  if not,  write to the  Free Software Foundation,
00020 // Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
00021 //
00022 // --------------------------------------------------------------------------
00023 // Last modified:       $Date: 2002/12/07 19:02:04 $
00024 // By           :       $Author: kolrabi $
00025 // $Id: r_state.cpp,v 1.1.1.1 2002/12/07 19:02:04 kolrabi Exp $ 
00026 
00027 /*
00028 
00029   $Log: r_state.cpp,v $
00030   Revision 1.1.1.1  2002/12/07 19:02:04  kolrabi
00031   initial release
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  * RENDERING STATE ROUTINES ************************************************* 
00064  **************************************************************************** 
00065  ****************************************************************************/ 
00066  
00067  
00068 
00069 /**************************************************************************** 
00070  * _r_set_color_from                                 sets the current color * 
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  * _r_set_blending                                             set blending *
00088  ****************************************************************************/
00089 void renderer_c::set_blending
00090 (
00091     ushort          blendtype
00092 )
00093 {
00094     AssertThis;
00095 
00096 //    if (blendtype == state.blendtype)
00097 //        return;
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  * _r_set_zbuffer                                          set zbuffer mode *
00137  ****************************************************************************/
00138 void renderer_c::set_zbuffer
00139 (
00140     ushort      buftype
00141 )
00142 {
00143     AssertThis;
00144 
00145 //    if (buftype == state.zbuffertype)
00146 //        return;
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  * _r_set_zwrite                                            set zwrite mode * 
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  * _r_set_culling                                 set backface culling mode *
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  * _r_set_spheremapping                        enable/disable spheremapping * 
00233  ****************************************************************************/ 
00234 void renderer_c::set_spheremapping 
00235 ( 
00236     bool        enable 
00237 ) 
00238 { 
00239     AssertThis;
00240 
00241     //if (enable == state.spheremapping)
00242         //return;
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  * _r_set_fog                                            enable/disable fog * 
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  * _r_set_fog_params                                     set fog parameters * 
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  * _r_use_shader                                         set current shader * 
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  * _r_set_target_backbuffer                              renders to texture *
00327  ****************************************************************************/
00328 void renderer_c::set_target_texture(sshort n) 
00329 { 
00330     // WARNING: everything will still be written to the backbuffer.
00331     // the actual transfer to the texture is in set_target_backbuffer()
00332     // which copies the backbuffer contents into the texture you define here.
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     /* dont forget to call set_target_backbuffer() */
00341 } 
00342 
00343  
00344 /****************************************************************************
00345  * _r_set_target_backbuffer                           renders to backbuffer *
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     /* put backbuffer into texture */
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  * _r_set_lightmap                                 sets the active lightmap *
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     //if (state.texminfilter != minfilter)
00395     {
00396         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
00397             _gl_texfilter[minfilter]); 
00398 
00399         state.texminfilter = minfilter;
00400     }
00401 
00402     //if (state.texmagfilter != magfilter)
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  * _r_update_lights                                update light information *
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  * _r_color_from_floats                                         get a color * 
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  * _r_color_from_vec                                            get a color * 
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  * _r_color_to_vec                                          convert a color * 
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  * _r_color_interpolate                        interpolate between 2 colors *
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 } 

Generated on Wed Dec 18 15:48:47 2002 for omicron engine by doxygen1.2.18