IrrlichtEngine
SMaterial.h
Go to the documentation of this file.
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