driver_material_inline.h

Go to the documentation of this file.
00001 
00005 /* Copyright, 2000 Nevrax Ltd.
00006  *
00007  * This file is part of NEVRAX NEL.
00008  * NEVRAX NEL is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2, or (at your option)
00011  * any later version.
00012 
00013  * NEVRAX NEL is distributed in the hope that it will be useful, but
00014  * WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00016  * General Public License for more details.
00017 
00018  * You should have received a copy of the GNU General Public License
00019  * along with NEVRAX NEL; see the file COPYING. If not, write to the
00020  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00021  * MA 02111-1307, USA.
00022  */
00023 
00024 #ifndef NL_DRIVER_MATERIAL_INLINE_H
00025 #define NL_DRIVER_MATERIAL_INLINE_H
00026 
00027 #include "nel/misc/debug.h"
00028 
00029 namespace NL3D
00030 {
00031 
00032 // --------------------------------------------------
00033 
00034 inline bool CMaterial::texturePresent(uint8 n) const
00035 {
00036     nlassert(n<IDRV_MAT_MAXTEXTURES);
00037     if (_Textures[n])
00038     {
00039         return(true);
00040     }
00041     return(false);
00042 }
00043 
00044 inline ITexture*        CMaterial::getTexture(uint8 n) const
00045 {
00046     nlassert(n<IDRV_MAT_MAXTEXTURES);
00047     return(_Textures[n]);
00048 }
00049 
00050 inline void CMaterial::setSrcBlend(TBlend val)
00051 {
00052     _SrcBlend=val;
00053     _Touched|=IDRV_TOUCHED_BLENDFUNC;
00054 }
00055 
00056 inline void CMaterial::setDstBlend(TBlend val)
00057 {
00058     _DstBlend=val;
00059     _Touched|=IDRV_TOUCHED_BLENDFUNC;
00060 }
00061 
00062 inline void CMaterial::setBlend(bool active)
00063 {
00064     if (active) _Flags|=IDRV_MAT_BLEND;
00065     else        _Flags&=~IDRV_MAT_BLEND;
00066     _Touched|=IDRV_TOUCHED_BLEND;
00067 }
00068 
00069 inline void CMaterial::setDoubleSided(bool active)
00070 {
00071     if (active) _Flags|=IDRV_MAT_DOUBLE_SIDED;
00072     else        _Flags&=~IDRV_MAT_DOUBLE_SIDED;
00073     _Touched|=IDRV_TOUCHED_DOUBLE_SIDED;
00074 }
00075 
00076 inline void CMaterial::setAlphaTest(bool active)
00077 {
00078     if (active) _Flags|=IDRV_MAT_ALPHA_TEST;
00079     else        _Flags&=~IDRV_MAT_ALPHA_TEST;
00080     _Touched|=IDRV_TOUCHED_ALPHA_TEST;
00081 }
00082 
00083 inline void CMaterial::setAlphaTestThreshold(float thre)
00084 {
00085     _AlphaTestThreshold= thre;
00086     _Touched|=IDRV_TOUCHED_ALPHA_TEST_THRE;
00087 }
00088 
00089 inline void CMaterial::setBlendFunc(TBlend src, TBlend dst)
00090 {
00091     _SrcBlend=src;
00092     _DstBlend=dst;
00093     _Touched|=IDRV_TOUCHED_BLENDFUNC;
00094 }
00095 
00096 
00097 inline void CMaterial::setZFunc(ZFunc val)
00098 {
00099     _ZFunction=val;
00100     _Touched|=IDRV_TOUCHED_ZFUNC;
00101 }
00102 
00103 inline void CMaterial::setZWrite(bool active)
00104 {
00105     if (active) _Flags|=IDRV_MAT_ZWRITE;
00106     else        _Flags&=~IDRV_MAT_ZWRITE;
00107     _Touched|=IDRV_TOUCHED_ZWRITE;
00108 }
00109 
00110 inline void CMaterial::setZBias(float val)
00111 {
00112     _ZBias=val;
00113     _Touched|=IDRV_TOUCHED_ZBIAS;
00114 }
00115 
00116 inline void CMaterial::setColor(NLMISC::CRGBA rgba)
00117 {
00118     if (_Color != rgba)
00119     {
00120         _Color=rgba;
00121         _Touched|=IDRV_TOUCHED_COLOR;
00122     }
00123 }
00124 
00125 inline void CMaterial::setLighting( bool active,
00126                                     NLMISC::CRGBA emissive,
00127                                     NLMISC::CRGBA ambient,
00128                                     NLMISC::CRGBA diffuse,
00129                                     NLMISC::CRGBA specular,
00130                                     float   shininess)
00131 {
00132     if (active)
00133     {
00134         _Flags|=IDRV_MAT_LIGHTING;
00135     }
00136     else
00137     {
00138         _Flags&=~IDRV_MAT_LIGHTING;
00139     }
00140     _Emissive=emissive;
00141     _Ambient=ambient;
00142     _Diffuse=diffuse;
00143     _Specular=specular;
00144     _Shininess= shininess;
00145     _Touched|=IDRV_TOUCHED_LIGHTING;
00146 }
00147 
00148 
00149 // ***************************************************************************
00150 inline void CMaterial::setEmissive( CRGBA emissive)
00151 {
00152     _Emissive= emissive;
00153     _Touched|=IDRV_TOUCHED_LIGHTING;
00154 }
00155 // ***************************************************************************
00156 inline void CMaterial::setAmbient( CRGBA ambient)
00157 {
00158     _Ambient= ambient;
00159     _Touched|=IDRV_TOUCHED_LIGHTING;
00160 }
00161 // ***************************************************************************
00162 inline void CMaterial::setDiffuse( CRGBA diffuse)
00163 {
00164     // Keep opacity.
00165     _Diffuse.R= diffuse.R;
00166     _Diffuse.G= diffuse.G;
00167     _Diffuse.B= diffuse.B;
00168     _Touched|=IDRV_TOUCHED_LIGHTING;
00169 }
00170 // ***************************************************************************
00171 inline void CMaterial::setOpacity( uint8    opa )
00172 {
00173     _Diffuse.A= opa;
00174     _Touched|=IDRV_TOUCHED_LIGHTING;
00175 }
00176 // ***************************************************************************
00177 inline void CMaterial::setSpecular( CRGBA specular)
00178 {
00179     _Specular= specular;
00180     _Touched|=IDRV_TOUCHED_LIGHTING;
00181 }
00182 // ***************************************************************************
00183 inline void CMaterial::setShininess( float shininess )
00184 {
00185     _Shininess= shininess;
00186     _Touched|=IDRV_TOUCHED_LIGHTING;
00187 }
00188 // ***************************************************************************
00189 inline void CMaterial::setLightedVertexColor( bool useLightedVertexColor )
00190 {
00191     if (useLightedVertexColor)
00192         _Flags |= IDRV_MAT_LIGHTED_VERTEX_COLOR;
00193     else
00194         _Flags &= ~IDRV_MAT_LIGHTED_VERTEX_COLOR;
00195     _Touched|=IDRV_TOUCHED_LIGHTING;
00196 }
00197 
00198 // ***************************************************************************
00199 inline bool     CMaterial::getLightedVertexColor () const
00200 {
00201     return (_Flags & IDRV_MAT_LIGHTED_VERTEX_COLOR) != 0;
00202 }
00203 
00204 
00205 // ***************************************************************************
00206 // ***************************************************************************
00207 // ***************************************************************************
00208 
00209 
00210 
00211 // ***************************************************************************
00212 inline void                 CMaterial::texEnvOpRGB(uint stage, TTexOperator ope)
00213 {
00214     nlassert(_ShaderType==CMaterial::Normal);
00215     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00216     _TexEnvs[stage].Env.OpRGB= ope;
00217     _Touched|=IDRV_TOUCHED_TEXENV;
00218 }
00219 
00220 // ***************************************************************************
00221 inline CMaterial::TTexOperator      CMaterial::getTexEnvOpRGB(uint stage) const
00222 {
00223     nlassert(_ShaderType==CMaterial::Normal);
00224     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00225     return (TTexOperator) _TexEnvs[stage].Env.OpRGB;
00226 }
00227 
00228 // ***************************************************************************
00229 inline void                 CMaterial::texEnvArg0RGB(uint stage, TTexSource src, TTexOperand oper)
00230 {
00231     nlassert(_ShaderType==CMaterial::Normal);
00232     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00233     _TexEnvs[stage].Env.SrcArg0RGB= src;
00234     _TexEnvs[stage].Env.OpArg0RGB= oper;
00235     _Touched|=IDRV_TOUCHED_TEXENV;
00236 }
00237 // ***************************************************************************
00238 inline void                 CMaterial::texEnvArg1RGB(uint stage, TTexSource src, TTexOperand oper)
00239 {
00240     nlassert(_ShaderType==CMaterial::Normal);
00241     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00242     _TexEnvs[stage].Env.SrcArg1RGB= src;
00243     _TexEnvs[stage].Env.OpArg1RGB= oper;
00244     _Touched|=IDRV_TOUCHED_TEXENV;
00245 }
00246 // ***************************************************************************
00247 inline void                 CMaterial::texEnvArg2RGB(uint stage, TTexSource src, TTexOperand oper)
00248 {
00249     nlassert(_ShaderType==CMaterial::Normal);
00250     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00251     _TexEnvs[stage].Env.SrcArg2RGB= src;
00252     _TexEnvs[stage].Env.OpArg2RGB= oper;
00253 }
00254 
00255 // ***************************************************************************
00256 inline void                 CMaterial::texEnvOpAlpha(uint stage, TTexOperator ope)
00257 {
00258     nlassert(_ShaderType==CMaterial::Normal);
00259     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00260     _TexEnvs[stage].Env.OpAlpha= ope;
00261     _Touched|=IDRV_TOUCHED_TEXENV;
00262 }
00263 
00264 // ***************************************************************************
00265 inline CMaterial::TTexOperator      CMaterial::getTexEnvOpAlpha(uint stage) const
00266 {
00267     nlassert(_ShaderType==CMaterial::Normal);
00268     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00269     return (TTexOperator) _TexEnvs[stage].Env.OpAlpha;
00270 }
00271 
00272 // ***************************************************************************
00273 inline void                 CMaterial::texEnvArg0Alpha(uint stage, TTexSource src, TTexOperand oper)
00274 {
00275     nlassert(_ShaderType==CMaterial::Normal);
00276     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00277     nlassert(oper==SrcAlpha || oper==InvSrcAlpha);
00278     _TexEnvs[stage].Env.SrcArg0Alpha= src;
00279     _TexEnvs[stage].Env.OpArg0Alpha= oper;
00280     _Touched|=IDRV_TOUCHED_TEXENV;
00281 }
00282 // ***************************************************************************
00283 inline void                 CMaterial::texEnvArg1Alpha(uint stage, TTexSource src, TTexOperand oper)
00284 {
00285     nlassert(_ShaderType==CMaterial::Normal);
00286     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00287     nlassert(oper==SrcAlpha || oper==InvSrcAlpha);
00288     _TexEnvs[stage].Env.SrcArg1Alpha= src;
00289     _TexEnvs[stage].Env.OpArg1Alpha= oper;
00290     _Touched|=IDRV_TOUCHED_TEXENV;
00291 }
00292 // ***************************************************************************
00293 inline void                 CMaterial::texEnvArg2Alpha(uint stage, TTexSource src, TTexOperand oper)
00294 {
00295     nlassert(_ShaderType==CMaterial::Normal);
00296     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00297     nlassert(oper==SrcAlpha || oper==InvSrcAlpha);
00298     _TexEnvs[stage].Env.SrcArg2Alpha= src;
00299     _TexEnvs[stage].Env.OpArg2Alpha= oper;
00300 }
00301 
00302 
00303 
00304 // ***************************************************************************
00305 inline void                 CMaterial::texConstantColor(uint stage, CRGBA color)
00306 {
00307     nlassert(_ShaderType==CMaterial::Normal);
00308     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00309     _TexEnvs[stage].ConstantColor= color;
00310     _Touched|=IDRV_TOUCHED_TEXENV;
00311 }
00312 
00313 
00314 // ***************************************************************************
00315 inline uint32               CMaterial::getTexEnvMode(uint stage)
00316 {
00317     nlassert(_ShaderType==CMaterial::Normal);
00318     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00319     return _TexEnvs[stage].EnvPacked;
00320 }
00321 // ***************************************************************************
00322 inline void                 CMaterial::setTexEnvMode(uint stage, uint32 packed)
00323 {
00324     nlassert(_ShaderType==CMaterial::Normal);
00325     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00326     _TexEnvs[stage].EnvPacked= packed;
00327     _Touched|=IDRV_TOUCHED_TEXENV;
00328 }
00329 // ***************************************************************************
00330 inline CRGBA                CMaterial::getTexConstantColor(uint stage)
00331 {
00332     nlassert(_ShaderType==CMaterial::Normal);
00333     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00334     return _TexEnvs[stage].ConstantColor;
00335 }
00336 // ***************************************************************************
00337 inline bool                 CMaterial::getTexCoordGen(uint stage) const
00338 {
00339     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00340     return (_Flags&(IDRV_MAT_GEN_TEX_0<<stage))!=0;
00341 }
00342 // ***************************************************************************
00343 inline void                 CMaterial::setTexCoordGen(uint stage, bool generate)
00344 {
00345     nlassert(stage<IDRV_MAT_MAXTEXTURES);
00346     if (generate)
00347         _Flags|=(IDRV_MAT_GEN_TEX_0<<stage);
00348     else
00349         _Flags&=~(IDRV_MAT_GEN_TEX_0<<stage);
00350     _Touched|=IDRV_TOUCHED_TEXGEN;
00351 }
00352 
00353 
00354 // ***************************************************************************
00355 // ***************************************************************************
00356 // ***************************************************************************
00357 
00358 
00359 
00360 // ***************************************************************************
00361 inline void                 CMaterial::setUserColor(CRGBA userColor)
00362 {
00363     nlassert(_ShaderType==CMaterial::UserColor);
00364     // setup stage 0 constant color (don't use texConstantColor() because of assert).
00365     _TexEnvs[0].ConstantColor= userColor;
00366     _Touched|=IDRV_TOUCHED_TEXENV;
00367 }
00368 
00369 // ***************************************************************************
00370 inline CRGBA                CMaterial::getUserColor() const
00371 {
00372     nlassert(_ShaderType==CMaterial::UserColor);
00373     // setup stage 0 constant color (don't use getTexConstantColor() because of assert).
00374     return _TexEnvs[0].ConstantColor;
00375 }
00376 
00377 // ***************************************************************************
00378 inline void                 CMaterial::enableUserTexMat(uint stage, bool enabled /*= true*/)
00379 {
00380     nlassert(stage < IDRV_MAT_MAXTEXTURES);
00381     if (enabled)
00382     {
00383         if (!(_Flags & IDRV_MAT_USER_TEX_MAT_ALL)) // not usr tex mat setupped before?
00384         {
00385             nlassert(_TexUserMat.get() == NULL);
00386             _TexUserMat.reset(new CUserTexMat);
00387         }
00388         _Flags |= (IDRV_MAT_USER_TEX_0_MAT << stage);
00389         _TexUserMat->TexMat[stage].identity();
00390     }
00391     else
00392     {
00393         if (!(_Flags & IDRV_MAT_USER_TEX_MAT_ALL)) return; // nothing to do
00394         _Flags &= ~(IDRV_MAT_USER_TEX_0_MAT << stage);     // clear the stage flag
00395         if (!(_Flags & IDRV_MAT_USER_TEX_MAT_ALL))         // no more user textures used ?
00396         {
00397             _TexUserMat.reset();
00398         }
00399     }
00400 }
00401 
00402 // ***************************************************************************
00403 inline bool               CMaterial::isUserTexMatEnabled(uint stage) const
00404 {
00405     nlassert(stage < IDRV_MAT_MAXTEXTURES);
00406     return (_Flags & (IDRV_MAT_USER_TEX_0_MAT << stage)) != 0;
00407 }
00408 
00409 // ***************************************************************************
00410 inline void               CMaterial::setUserTexMat(uint stage, const NLMISC::CMatrix &m)
00411 {
00412     nlassert(isUserTexMatEnabled(stage));
00413     nlassert(_TexUserMat.get() != NULL);
00414     _TexUserMat->TexMat[stage] = m;
00415 }
00416 
00417 // ***************************************************************************
00418 inline const NLMISC::CMatrix  &CMaterial::getUserTexMat(uint stage) const
00419 {
00420     nlassert(isUserTexMatEnabled(stage));
00421     nlassert(_TexUserMat.get() != NULL);
00422     return _TexUserMat->TexMat[stage];
00423 }
00424 
00425 // ***************************************************************************
00426 inline void CMaterial::setTexCoordGenMode(uint stage, TTexCoordGenMode mode)
00427 {
00428     if(stage>=IDRV_MAT_MAXTEXTURES)
00429         return;
00430     _TexCoordGenMode&= ~ (IDRV_MAT_TEX_GEN_MASK << (stage*IDRV_MAT_TEX_GEN_SHIFT));
00431     _TexCoordGenMode|=   ((mode&IDRV_MAT_TEX_GEN_MASK) << (stage*IDRV_MAT_TEX_GEN_SHIFT));
00432     _Touched|=IDRV_TOUCHED_TEXGEN;
00433 }
00434 
00435 }
00436 
00437 #endif
00438 

Generated on Thu Jan 7 08:26:18 2010 for NeL by  doxygen 1.6.1