|
IrrlichtEngine
|
00001 // Copyright (C) 2002-2011 Nikolaus Gebhardt 00002 // This file is part of the "Irrlicht Engine". 00003 // For conditions of distribution and use, see copyright notice in irrlicht.h 00004 00005 #ifndef __S_MATERIAL_H_INCLUDED__ 00006 #define __S_MATERIAL_H_INCLUDED__ 00007 00008 #include "SColor.h" 00009 #include "matrix4.h" 00010 #include "irrArray.h" 00011 #include "irrMath.h" 00012 #include "EMaterialTypes.h" 00013 #include "EMaterialFlags.h" 00014 #include "SMaterialLayer.h" 00015 00016 namespace irr 00017 { 00018 namespace video 00019 { 00020 class ITexture; 00021 00023 enum E_BLEND_FACTOR 00024 { 00025 EBF_ZERO = 0, 00026 EBF_ONE, 00027 EBF_DST_COLOR, 00028 EBF_ONE_MINUS_DST_COLOR, 00029 EBF_SRC_COLOR, 00030 EBF_ONE_MINUS_SRC_COLOR, 00031 EBF_SRC_ALPHA, 00032 EBF_ONE_MINUS_SRC_ALPHA, 00033 EBF_DST_ALPHA, 00034 EBF_ONE_MINUS_DST_ALPHA, 00035 EBF_SRC_ALPHA_SATURATE 00036 }; 00037 00039 enum E_BLEND_OPERATION 00040 { 00041 EBO_NONE = 0, 00042 EBO_ADD, 00043 EBO_SUBTRACT, 00044 EBO_REVSUBTRACT, 00045 EBO_MIN, 00046 EBO_MAX, 00047 EBO_MIN_FACTOR, 00048 EBO_MAX_FACTOR, 00049 EBO_MIN_ALPHA, 00050 EBO_MAX_ALPHA 00051 }; 00052 00054 enum E_MODULATE_FUNC 00055 { 00056 EMFN_MODULATE_1X = 1, 00057 EMFN_MODULATE_2X = 2, 00058 EMFN_MODULATE_4X = 4 00059 }; 00060 00062 enum E_COMPARISON_FUNC 00063 { 00065 ECFN_NEVER=0, 00067 ECFN_LESSEQUAL=1, 00069 ECFN_EQUAL=2, 00071 ECFN_LESS, 00073 ECFN_NOTEQUAL, 00075 ECFN_GREATEREQUAL, 00077 ECFN_GREATER, 00079 ECFN_ALWAYS 00080 }; 00081 00083 enum E_COLOR_PLANE 00084 { 00086 ECP_NONE=0, 00088 ECP_ALPHA=1, 00090 ECP_RED=2, 00092 ECP_GREEN=4, 00094 ECP_BLUE=8, 00096 ECP_RGB=14, 00098 ECP_ALL=15 00099 }; 00100 00102 00104 enum E_ALPHA_SOURCE 00105 { 00107 EAS_NONE=0, 00109 EAS_VERTEX_COLOR, 00111 EAS_TEXTURE 00112 }; 00113 00115 00116 inline f32 pack_texureBlendFunc ( const E_BLEND_FACTOR srcFact, const E_BLEND_FACTOR dstFact, const E_MODULATE_FUNC modulate=EMFN_MODULATE_1X, const u32 alphaSource=EAS_TEXTURE ) 00117 { 00118 const u32 tmp = (alphaSource << 12) | (modulate << 8) | (srcFact << 4) | dstFact; 00119 return FR(tmp); 00120 } 00121 00123 00124 inline void unpack_texureBlendFunc ( E_BLEND_FACTOR &srcFact, E_BLEND_FACTOR &dstFact, 00125 E_MODULATE_FUNC &modulo, u32& alphaSource, const f32 param ) 00126 { 00127 const u32 state = IR(param); 00128 alphaSource = (state & 0x0000F000) >> 12; 00129 modulo = E_MODULATE_FUNC( ( state & 0x00000F00 ) >> 8 ); 00130 srcFact = E_BLEND_FACTOR ( ( state & 0x000000F0 ) >> 4 ); 00131 dstFact = E_BLEND_FACTOR ( ( state & 0x0000000F ) ); 00132 } 00133 00135 inline bool textureBlendFunc_hasAlpha ( const E_BLEND_FACTOR factor ) 00136 { 00137 switch ( factor ) 00138 { 00139 case EBF_SRC_ALPHA: 00140 case EBF_ONE_MINUS_SRC_ALPHA: 00141 case EBF_DST_ALPHA: 00142 case EBF_ONE_MINUS_DST_ALPHA: 00143 case EBF_SRC_ALPHA_SATURATE: 00144 return true; 00145 default: 00146 return false; 00147 } 00148 } 00149 00150 00152 00158 enum E_ANTI_ALIASING_MODE 00159 { 00161 EAAM_OFF=0, 00163 EAAM_SIMPLE=1, 00165 EAAM_QUALITY=3, 00167 EAAM_LINE_SMOOTH=4, 00169 EAAM_POINT_SMOOTH=8, 00171 EAAM_FULL_BASIC=15, 00173 00174 EAAM_ALPHA_TO_COVERAGE=16 00175 }; 00176 00178 00184 enum E_COLOR_MATERIAL 00185 { 00187 ECM_NONE=0, 00189 ECM_DIFFUSE, 00191 ECM_AMBIENT, 00193 ECM_EMISSIVE, 00195 ECM_SPECULAR, 00197 ECM_DIFFUSE_AND_AMBIENT 00198 }; 00199 00201 00202 enum E_POLYGON_OFFSET 00203 { 00205 00206 EPO_BACK=0, 00208 00210 EPO_FRONT=1 00211 }; 00212 00214 const u32 MATERIAL_MAX_TEXTURES = _IRR_MATERIAL_MAX_TEXTURES_; 00215 00217 class SMaterial 00218 { 00219 public: 00221 SMaterial() 00222 : MaterialType(EMT_SOLID), AmbientColor(255,255,255,255), DiffuseColor(255,255,255,255), 00223 EmissiveColor(0,0,0,0), SpecularColor(255,255,255,255), 00224 Shininess(0.0f), MaterialTypeParam(0.0f), MaterialTypeParam2(0.0f), Thickness(1.0f), 00225 ZBuffer(ECFN_LESSEQUAL), AntiAliasing(EAAM_SIMPLE), ColorMask(ECP_ALL), 00226 ColorMaterial(ECM_DIFFUSE), BlendOperation(EBO_NONE), 00227 PolygonOffsetFactor(0), PolygonOffsetDirection(EPO_FRONT), 00228 Wireframe(false), PointCloud(false), GouraudShading(true), 00229 Lighting(true), ZWriteEnable(true), BackfaceCulling(true), FrontfaceCulling(false), 00230 FogEnable(false), NormalizeNormals(false), UseMipMaps(true) 00231 { } 00232 00234 00235 SMaterial(const SMaterial& other) 00236 { 00237 // These pointers are checked during assignment 00238 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i) 00239 TextureLayer[i].TextureMatrix = 0; 00240 *this = other; 00241 } 00242 00244 00245 SMaterial& operator=(const SMaterial& other) 00246 { 00247 // Check for self-assignment! 00248 if (this == &other) 00249 return *this; 00250 00251 MaterialType = other.MaterialType; 00252 00253 AmbientColor = other.AmbientColor; 00254 DiffuseColor = other.DiffuseColor; 00255 EmissiveColor = other.EmissiveColor; 00256 SpecularColor = other.SpecularColor; 00257 Shininess = other.Shininess; 00258 MaterialTypeParam = other.MaterialTypeParam; 00259 MaterialTypeParam2 = other.MaterialTypeParam2; 00260 Thickness = other.Thickness; 00261 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i) 00262 { 00263 TextureLayer[i] = other.TextureLayer[i]; 00264 } 00265 00266 Wireframe = other.Wireframe; 00267 PointCloud = other.PointCloud; 00268 GouraudShading = other.GouraudShading; 00269 Lighting = other.Lighting; 00270 ZWriteEnable = other.ZWriteEnable; 00271 BackfaceCulling = other.BackfaceCulling; 00272 FrontfaceCulling = other.FrontfaceCulling; 00273 FogEnable = other.FogEnable; 00274 NormalizeNormals = other.NormalizeNormals; 00275 ZBuffer = other.ZBuffer; 00276 AntiAliasing = other.AntiAliasing; 00277 ColorMask = other.ColorMask; 00278 ColorMaterial = other.ColorMaterial; 00279 BlendOperation = other.BlendOperation; 00280 PolygonOffsetFactor = other.PolygonOffsetFactor; 00281 PolygonOffsetDirection = other.PolygonOffsetDirection; 00282 UseMipMaps = other.UseMipMaps; 00283 00284 return *this; 00285 } 00286 00288 SMaterialLayer TextureLayer[MATERIAL_MAX_TEXTURES]; 00289 00291 E_MATERIAL_TYPE MaterialType; 00292 00294 00297 SColor AmbientColor; 00298 00300 00301 SColor DiffuseColor; 00302 00304 SColor EmissiveColor; 00305 00307 00309 SColor SpecularColor; 00310 00312 00341 f32 Shininess; 00342 00344 00346 f32 MaterialTypeParam; 00347 00349 00350 f32 MaterialTypeParam2; 00351 00353 f32 Thickness; 00354 00356 00357 u8 ZBuffer; 00358 00360 00363 u8 AntiAliasing; 00364 00366 00370 u8 ColorMask:4; 00371 00373 00378 u8 ColorMaterial:3; 00379 00381 00383 E_BLEND_OPERATION BlendOperation:4; 00384 00386 00388 u8 PolygonOffsetFactor:3; 00389 00391 00392 E_POLYGON_OFFSET PolygonOffsetDirection:1; 00393 00395 00398 bool Wireframe:1; 00399 00401 bool PointCloud:1; 00402 00404 bool GouraudShading:1; 00405 00407 bool Lighting:1; 00408 00410 00413 bool ZWriteEnable:1; 00414 00416 bool BackfaceCulling:1; 00417 00419 bool FrontfaceCulling:1; 00420 00422 bool FogEnable:1; 00423 00425 00426 bool NormalizeNormals:1; 00427 00429 00430 bool UseMipMaps:1; 00431 00433 00435 core::matrix4& getTextureMatrix(u32 i) 00436 { 00437 return TextureLayer[i].getTextureMatrix(); 00438 } 00439 00441 00443 const core::matrix4& getTextureMatrix(u32 i) const 00444 { 00445 if (i<MATERIAL_MAX_TEXTURES) 00446 return TextureLayer[i].getTextureMatrix(); 00447 else 00448 return core::IdentityMatrix; 00449 } 00450 00452 00454 void setTextureMatrix(u32 i, const core::matrix4& mat) 00455 { 00456 if (i>=MATERIAL_MAX_TEXTURES) 00457 return; 00458 TextureLayer[i].setTextureMatrix(mat); 00459 } 00460 00462 00464 ITexture* getTexture(u32 i) const 00465 { 00466 return i < MATERIAL_MAX_TEXTURES ? TextureLayer[i].Texture : 0; 00467 } 00468 00470 00473 void setTexture(u32 i, ITexture* tex) 00474 { 00475 if (i>=MATERIAL_MAX_TEXTURES) 00476 return; 00477 TextureLayer[i].Texture = tex; 00478 } 00479 00481 00483 void setFlag(E_MATERIAL_FLAG flag, bool value) 00484 { 00485 switch (flag) 00486 { 00487 case EMF_WIREFRAME: 00488 Wireframe = value; break; 00489 case EMF_POINTCLOUD: 00490 PointCloud = value; break; 00491 case EMF_GOURAUD_SHADING: 00492 GouraudShading = value; break; 00493 case EMF_LIGHTING: 00494 Lighting = value; break; 00495 case EMF_ZBUFFER: 00496 ZBuffer = value; break; 00497 case EMF_ZWRITE_ENABLE: 00498 ZWriteEnable = value; break; 00499 case EMF_BACK_FACE_CULLING: 00500 BackfaceCulling = value; break; 00501 case EMF_FRONT_FACE_CULLING: 00502 FrontfaceCulling = value; break; 00503 case EMF_BILINEAR_FILTER: 00504 { 00505 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i) 00506 TextureLayer[i].BilinearFilter = value; 00507 } 00508 break; 00509 case EMF_TRILINEAR_FILTER: 00510 { 00511 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i) 00512 TextureLayer[i].TrilinearFilter = value; 00513 } 00514 break; 00515 case EMF_ANISOTROPIC_FILTER: 00516 { 00517 if (value) 00518 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i) 00519 TextureLayer[i].AnisotropicFilter = 0xFF; 00520 else 00521 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i) 00522 TextureLayer[i].AnisotropicFilter = 0; 00523 } 00524 break; 00525 case EMF_FOG_ENABLE: 00526 FogEnable = value; break; 00527 case EMF_NORMALIZE_NORMALS: 00528 NormalizeNormals = value; break; 00529 case EMF_TEXTURE_WRAP: 00530 { 00531 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i) 00532 { 00533 TextureLayer[i].TextureWrapU = (E_TEXTURE_CLAMP)value; 00534 TextureLayer[i].TextureWrapV = (E_TEXTURE_CLAMP)value; 00535 } 00536 } 00537 break; 00538 case EMF_ANTI_ALIASING: 00539 AntiAliasing = value?EAAM_SIMPLE:EAAM_OFF; break; 00540 case EMF_COLOR_MASK: 00541 ColorMask = value?ECP_ALL:ECP_NONE; break; 00542 case EMF_COLOR_MATERIAL: 00543 ColorMaterial = value?ECM_DIFFUSE:ECM_NONE; break; 00544 case EMF_USE_MIP_MAPS: 00545 UseMipMaps = value; break; 00546 case EMF_BLEND_OPERATION: 00547 BlendOperation = value?EBO_ADD:EBO_NONE; break; 00548 case EMF_POLYGON_OFFSET: 00549 PolygonOffsetFactor = value?1:0; 00550 PolygonOffsetDirection = EPO_BACK; 00551 break; 00552 default: 00553 break; 00554 } 00555 } 00556 00558 00560 bool getFlag(E_MATERIAL_FLAG flag) const 00561 { 00562 switch (flag) 00563 { 00564 case EMF_WIREFRAME: 00565 return Wireframe; 00566 case EMF_POINTCLOUD: 00567 return PointCloud; 00568 case EMF_GOURAUD_SHADING: 00569 return GouraudShading; 00570 case EMF_LIGHTING: 00571 return Lighting; 00572 case EMF_ZBUFFER: 00573 return ZBuffer!=ECFN_NEVER; 00574 case EMF_ZWRITE_ENABLE: 00575 return ZWriteEnable; 00576 case EMF_BACK_FACE_CULLING: 00577 return BackfaceCulling; 00578 case EMF_FRONT_FACE_CULLING: 00579 return FrontfaceCulling; 00580 case EMF_BILINEAR_FILTER: 00581 return TextureLayer[0].BilinearFilter; 00582 case EMF_TRILINEAR_FILTER: 00583 return TextureLayer[0].TrilinearFilter; 00584 case EMF_ANISOTROPIC_FILTER: 00585 return TextureLayer[0].AnisotropicFilter!=0; 00586 case EMF_FOG_ENABLE: 00587 return FogEnable; 00588 case EMF_NORMALIZE_NORMALS: 00589 return NormalizeNormals; 00590 case EMF_TEXTURE_WRAP: 00591 return !(TextureLayer[0].TextureWrapU || 00592 TextureLayer[0].TextureWrapV || 00593 TextureLayer[1].TextureWrapU || 00594 TextureLayer[1].TextureWrapV || 00595 TextureLayer[2].TextureWrapU || 00596 TextureLayer[2].TextureWrapV || 00597 TextureLayer[3].TextureWrapU || 00598 TextureLayer[3].TextureWrapV); 00599 case EMF_ANTI_ALIASING: 00600 return (AntiAliasing==1); 00601 case EMF_COLOR_MASK: 00602 return (ColorMask!=ECP_NONE); 00603 case EMF_COLOR_MATERIAL: 00604 return (ColorMaterial != ECM_NONE); 00605 case EMF_USE_MIP_MAPS: 00606 return UseMipMaps; 00607 case EMF_BLEND_OPERATION: 00608 return BlendOperation != EBO_NONE; 00609 case EMF_POLYGON_OFFSET: 00610 return PolygonOffsetFactor != 0; 00611 } 00612 00613 return false; 00614 } 00615 00617 00619 inline bool operator!=(const SMaterial& b) const 00620 { 00621 bool different = 00622 MaterialType != b.MaterialType || 00623 AmbientColor != b.AmbientColor || 00624 DiffuseColor != b.DiffuseColor || 00625 EmissiveColor != b.EmissiveColor || 00626 SpecularColor != b.SpecularColor || 00627 Shininess != b.Shininess || 00628 MaterialTypeParam != b.MaterialTypeParam || 00629 MaterialTypeParam2 != b.MaterialTypeParam2 || 00630 Thickness != b.Thickness || 00631 Wireframe != b.Wireframe || 00632 PointCloud != b.PointCloud || 00633 GouraudShading != b.GouraudShading || 00634 Lighting != b.Lighting || 00635 ZBuffer != b.ZBuffer || 00636 ZWriteEnable != b.ZWriteEnable || 00637 BackfaceCulling != b.BackfaceCulling || 00638 FrontfaceCulling != b.FrontfaceCulling || 00639 FogEnable != b.FogEnable || 00640 NormalizeNormals != b.NormalizeNormals || 00641 AntiAliasing != b.AntiAliasing || 00642 ColorMask != b.ColorMask || 00643 ColorMaterial != b.ColorMaterial || 00644 BlendOperation != b.BlendOperation || 00645 PolygonOffsetFactor != b.PolygonOffsetFactor || 00646 PolygonOffsetDirection != b.PolygonOffsetDirection || 00647 UseMipMaps != b.UseMipMaps; 00648 for (u32 i=0; (i<MATERIAL_MAX_TEXTURES) && !different; ++i) 00649 { 00650 different |= (TextureLayer[i] != b.TextureLayer[i]); 00651 } 00652 return different; 00653 } 00654 00656 00658 inline bool operator==(const SMaterial& b) const 00659 { return !(b!=*this); } 00660 00661 bool isTransparent() const 00662 { 00663 return MaterialType==EMT_TRANSPARENT_ADD_COLOR || 00664 MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL || 00665 MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA || 00666 MaterialType==EMT_TRANSPARENT_REFLECTION_2_LAYER; 00667 } 00668 }; 00669 00671 IRRLICHT_API extern SMaterial IdentityMaterial; 00672 00673 } // end namespace video 00674 } // end namespace irr 00675 00676 #endif