driver_material_inline.h
Go to the documentation of this file.00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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
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
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
00374 return _TexEnvs[0].ConstantColor;
00375 }
00376
00377
00378 inline void CMaterial::enableUserTexMat(uint stage, bool enabled )
00379 {
00380 nlassert(stage < IDRV_MAT_MAXTEXTURES);
00381 if (enabled)
00382 {
00383 if (!(_Flags & IDRV_MAT_USER_TEX_MAT_ALL))
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;
00394 _Flags &= ~(IDRV_MAT_USER_TEX_0_MAT << stage);
00395 if (!(_Flags & IDRV_MAT_USER_TEX_MAT_ALL))
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