LCOV - code coverage report
Current view: top level - usr/include/irrlicht - SMaterial.h (source / functions) Hit Total Coverage
Test: report Lines: 95 118 80.5 %
Date: 2015-07-11 18:23:49 Functions: 8 9 88.9 %

          Line data    Source code
       1             : // Copyright (C) 2002-2012 Nikolaus Gebhardt
       2             : // This file is part of the "Irrlicht Engine".
       3             : // For conditions of distribution and use, see copyright notice in irrlicht.h
       4             : 
       5             : #ifndef __S_MATERIAL_H_INCLUDED__
       6             : #define __S_MATERIAL_H_INCLUDED__
       7             : 
       8             : #include "SColor.h"
       9             : #include "matrix4.h"
      10             : #include "irrArray.h"
      11             : #include "irrMath.h"
      12             : #include "EMaterialTypes.h"
      13             : #include "EMaterialFlags.h"
      14             : #include "SMaterialLayer.h"
      15             : 
      16             : namespace irr
      17             : {
      18             : namespace video
      19             : {
      20             :         class ITexture;
      21             : 
      22             :         //! Flag for EMT_ONETEXTURE_BLEND, ( BlendFactor ) BlendFunc = source * sourceFactor + dest * destFactor
      23             :         enum E_BLEND_FACTOR
      24             :         {
      25             :                 EBF_ZERO        = 0,                    //!< src & dest  (0, 0, 0, 0)
      26             :                 EBF_ONE,                                        //!< src & dest  (1, 1, 1, 1)
      27             :                 EBF_DST_COLOR,                          //!< src     (destR, destG, destB, destA)
      28             :                 EBF_ONE_MINUS_DST_COLOR,        //!< src     (1-destR, 1-destG, 1-destB, 1-destA)
      29             :                 EBF_SRC_COLOR,                          //!< dest    (srcR, srcG, srcB, srcA)
      30             :                 EBF_ONE_MINUS_SRC_COLOR,        //!< dest    (1-srcR, 1-srcG, 1-srcB, 1-srcA)
      31             :                 EBF_SRC_ALPHA,                          //!< src & dest  (srcA, srcA, srcA, srcA)
      32             :                 EBF_ONE_MINUS_SRC_ALPHA,        //!< src & dest  (1-srcA, 1-srcA, 1-srcA, 1-srcA)
      33             :                 EBF_DST_ALPHA,                          //!< src & dest  (destA, destA, destA, destA)
      34             :                 EBF_ONE_MINUS_DST_ALPHA,        //!< src & dest  (1-destA, 1-destA, 1-destA, 1-destA)
      35             :                 EBF_SRC_ALPHA_SATURATE          //!< src     (min(srcA, 1-destA), idem, ...)
      36             :         };
      37             : 
      38             :         //! Values defining the blend operation used when blend is enabled
      39             :         enum E_BLEND_OPERATION
      40             :         {
      41             :                 EBO_NONE = 0,   //!< No blending happens
      42             :                 EBO_ADD,                //!< Default blending adds the color values
      43             :                 EBO_SUBTRACT,   //!< This mode subtracts the color values
      44             :                 EBO_REVSUBTRACT,//!< This modes subtracts destination from source
      45             :                 EBO_MIN,                //!< Choose minimum value of each color channel
      46             :                 EBO_MAX,                //!< Choose maximum value of each color channel
      47             :                 EBO_MIN_FACTOR, //!< Choose minimum value of each color channel after applying blend factors, not widely supported
      48             :                 EBO_MAX_FACTOR, //!< Choose maximum value of each color channel after applying blend factors, not widely supported
      49             :                 EBO_MIN_ALPHA,  //!< Choose minimum value of each color channel based on alpha value, not widely supported
      50             :                 EBO_MAX_ALPHA   //!< Choose maximum value of each color channel based on alpha value, not widely supported
      51             :         };
      52             : 
      53             :         //! MaterialTypeParam: e.g. DirectX: D3DTOP_MODULATE, D3DTOP_MODULATE2X, D3DTOP_MODULATE4X
      54             :         enum E_MODULATE_FUNC
      55             :         {
      56             :                 EMFN_MODULATE_1X        = 1,
      57             :                 EMFN_MODULATE_2X        = 2,
      58             :                 EMFN_MODULATE_4X        = 4
      59             :         };
      60             : 
      61             :         //! Comparison function, e.g. for depth buffer test
      62             :         enum E_COMPARISON_FUNC
      63             :         {
      64             :                 //! Test never succeeds, this equals disable
      65             :                 ECFN_NEVER=0,
      66             :                 //! <= test, default for e.g. depth test
      67             :                 ECFN_LESSEQUAL=1,
      68             :                 //! Exact equality
      69             :                 ECFN_EQUAL=2,
      70             :                 //! exclusive less comparison, i.e. <
      71             :                 ECFN_LESS,
      72             :                 //! Succeeds almost always, except for exact equality
      73             :                 ECFN_NOTEQUAL,
      74             :                 //! >= test
      75             :                 ECFN_GREATEREQUAL,
      76             :                 //! inverse of <=
      77             :                 ECFN_GREATER,
      78             :                 //! test succeeds always
      79             :                 ECFN_ALWAYS
      80             :         };
      81             : 
      82             :         //! Enum values for enabling/disabling color planes for rendering
      83             :         enum E_COLOR_PLANE
      84             :         {
      85             :                 //! No color enabled
      86             :                 ECP_NONE=0,
      87             :                 //! Alpha enabled
      88             :                 ECP_ALPHA=1,
      89             :                 //! Red enabled
      90             :                 ECP_RED=2,
      91             :                 //! Green enabled
      92             :                 ECP_GREEN=4,
      93             :                 //! Blue enabled
      94             :                 ECP_BLUE=8,
      95             :                 //! All colors, no alpha
      96             :                 ECP_RGB=14,
      97             :                 //! All planes enabled
      98             :                 ECP_ALL=15
      99             :         };
     100             : 
     101             :         //! Source of the alpha value to take
     102             :         /** This is currently only supported in EMT_ONETEXTURE_BLEND. You can use an
     103             :         or'ed combination of values. Alpha values are modulated (multiplicated). */
     104             :         enum E_ALPHA_SOURCE
     105             :         {
     106             :                 //! Use no alpha, somewhat redundant with other settings
     107             :                 EAS_NONE=0,
     108             :                 //! Use vertex color alpha
     109             :                 EAS_VERTEX_COLOR,
     110             :                 //! Use texture alpha channel
     111             :                 EAS_TEXTURE
     112             :         };
     113             : 
     114             :         //! EMT_ONETEXTURE_BLEND: pack srcFact, dstFact, Modulate and alpha source to MaterialTypeParam
     115             :         /** alpha source can be an OR'ed combination of E_ALPHA_SOURCE values. */
     116             :         inline f32 pack_textureBlendFunc ( const E_BLEND_FACTOR srcFact, const E_BLEND_FACTOR dstFact, const E_MODULATE_FUNC modulate=EMFN_MODULATE_1X, const u32 alphaSource=EAS_TEXTURE )
     117             :         {
     118             :                 const u32 tmp = (alphaSource << 12) | (modulate << 8) | (srcFact << 4) | dstFact;
     119             :                 return FR(tmp);
     120             :         }
     121             : 
     122             :         //! EMT_ONETEXTURE_BLEND: unpack srcFact & dstFact and Modulo to MaterialTypeParam
     123             :         /** The fields don't use the full byte range, so we could pack even more... */
     124             :         inline void unpack_textureBlendFunc ( E_BLEND_FACTOR &srcFact, E_BLEND_FACTOR &dstFact,
     125             :                         E_MODULATE_FUNC &modulo, u32& alphaSource, const f32 param )
     126             :         {
     127             :                 const u32 state = IR(param);
     128             :                 alphaSource = (state & 0x0000F000) >> 12;
     129             :                 modulo  = E_MODULATE_FUNC( ( state & 0x00000F00 ) >> 8 );
     130             :                 srcFact = E_BLEND_FACTOR ( ( state & 0x000000F0 ) >> 4 );
     131             :                 dstFact = E_BLEND_FACTOR ( ( state & 0x0000000F ) );
     132             :         }
     133             : 
     134             :         //! EMT_ONETEXTURE_BLEND: has BlendFactor Alphablending
     135             :         inline bool textureBlendFunc_hasAlpha ( const E_BLEND_FACTOR factor )
     136             :         {
     137             :                 switch ( factor )
     138             :                 {
     139             :                         case EBF_SRC_ALPHA:
     140             :                         case EBF_ONE_MINUS_SRC_ALPHA:
     141             :                         case EBF_DST_ALPHA:
     142             :                         case EBF_ONE_MINUS_DST_ALPHA:
     143             :                         case EBF_SRC_ALPHA_SATURATE:
     144             :                                 return true;
     145             :                         default:
     146             :                                 return false;
     147             :                 }
     148             :         }
     149             : 
     150             : 
     151             :         //! These flags are used to specify the anti-aliasing and smoothing modes
     152             :         /** Techniques supported are multisampling, geometry smoothing, and alpha
     153             :         to coverage.
     154             :         Some drivers don't support a per-material setting of the anti-aliasing
     155             :         modes. In those cases, FSAA/multisampling is defined by the device mode
     156             :         chosen upon creation via irr::SIrrCreationParameters.
     157             :         */
     158             :         enum E_ANTI_ALIASING_MODE
     159             :         {
     160             :                 //! Use to turn off anti-aliasing for this material
     161             :                 EAAM_OFF=0,
     162             :                 //! Default anti-aliasing mode
     163             :                 EAAM_SIMPLE=1,
     164             :                 //! High-quality anti-aliasing, not always supported, automatically enables SIMPLE mode
     165             :                 EAAM_QUALITY=3,
     166             :                 //! Line smoothing
     167             :                 EAAM_LINE_SMOOTH=4,
     168             :                 //! point smoothing, often in software and slow, only with OpenGL
     169             :                 EAAM_POINT_SMOOTH=8,
     170             :                 //! All typical anti-alias and smooth modes
     171             :                 EAAM_FULL_BASIC=15,
     172             :                 //! Enhanced anti-aliasing for transparent materials
     173             :                 /** Usually used with EMT_TRANSPARENT_ALPHA_REF and multisampling. */
     174             :                 EAAM_ALPHA_TO_COVERAGE=16
     175             :         };
     176             : 
     177             :         //! These flags allow to define the interpretation of vertex color when lighting is enabled
     178             :         /** Without lighting being enabled the vertex color is the only value defining the fragment color.
     179             :         Once lighting is enabled, the four values for diffuse, ambient, emissive, and specular take over.
     180             :         With these flags it is possible to define which lighting factor shall be defined by the vertex color
     181             :         instead of the lighting factor which is the same for all faces of that material.
     182             :         The default is to use vertex color for the diffuse value, another pretty common value is to use
     183             :         vertex color for both diffuse and ambient factor. */
     184             :         enum E_COLOR_MATERIAL
     185             :         {
     186             :                 //! Don't use vertex color for lighting
     187             :                 ECM_NONE=0,
     188             :                 //! Use vertex color for diffuse light, this is default
     189             :                 ECM_DIFFUSE,
     190             :                 //! Use vertex color for ambient light
     191             :                 ECM_AMBIENT,
     192             :                 //! Use vertex color for emissive light
     193             :                 ECM_EMISSIVE,
     194             :                 //! Use vertex color for specular light
     195             :                 ECM_SPECULAR,
     196             :                 //! Use vertex color for both diffuse and ambient light
     197             :                 ECM_DIFFUSE_AND_AMBIENT
     198             :         };
     199             : 
     200             :         //! Flags for the definition of the polygon offset feature
     201             :         /** These flags define whether the offset should be into the screen, or towards the eye. */
     202             :         enum E_POLYGON_OFFSET
     203             :         {
     204             :                 //! Push pixel towards the far plane, away from the eye
     205             :                 /** This is typically used for rendering inner areas. */
     206             :                 EPO_BACK=0,
     207             :                 //! Pull pixels towards the camera.
     208             :                 /** This is typically used for polygons which should appear on top
     209             :                 of other elements, such as decals. */
     210             :                 EPO_FRONT=1
     211             :         };
     212             : 
     213             :         //! Names for polygon offset direction
     214             :         const c8* const PolygonOffsetDirectionNames[] =
     215             :         {
     216             :                 "Back",
     217             :                 "Front",
     218             :                 0
     219             :         };
     220             : 
     221             : 
     222             :         //! Maximum number of texture an SMaterial can have.
     223             :         const u32 MATERIAL_MAX_TEXTURES = _IRR_MATERIAL_MAX_TEXTURES_;
     224             : 
     225             :         //! Struct for holding parameters for a material renderer
     226     1447419 :         class SMaterial
     227             :         {
     228             :         public:
     229             :                 //! Default constructor. Creates a solid, lit material with white colors
     230      809158 :                 SMaterial()
     231             :                 : MaterialType(EMT_SOLID), AmbientColor(255,255,255,255), DiffuseColor(255,255,255,255),
     232             :                         EmissiveColor(0,0,0,0), SpecularColor(255,255,255,255),
     233             :                         Shininess(0.0f), MaterialTypeParam(0.0f), MaterialTypeParam2(0.0f), Thickness(1.0f),
     234             :                         ZBuffer(ECFN_LESSEQUAL), AntiAliasing(EAAM_SIMPLE), ColorMask(ECP_ALL),
     235             :                         ColorMaterial(ECM_DIFFUSE), BlendOperation(EBO_NONE),
     236             :                         PolygonOffsetFactor(0), PolygonOffsetDirection(EPO_FRONT),
     237             :                         Wireframe(false), PointCloud(false), GouraudShading(true),
     238             :                         Lighting(true), ZWriteEnable(true), BackfaceCulling(true), FrontfaceCulling(false),
     239      809158 :                         FogEnable(false), NormalizeNormals(false), UseMipMaps(true)
     240      809121 :                 { }
     241             : 
     242             :                 //! Copy constructor
     243             :                 /** \param other Material to copy from. */
     244      634095 :                 SMaterial(const SMaterial& other)
     245      634095 :                 {
     246             :                         // These pointers are checked during assignment
     247     3170475 :                         for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
     248     2536380 :                                 TextureLayer[i].TextureMatrix = 0;
     249      634095 :                         *this = other;
     250      634095 :                 }
     251             : 
     252             :                 //! Assignment operator
     253             :                 /** \param other Material to copy from. */
     254      930141 :                 SMaterial& operator=(const SMaterial& other)
     255             :                 {
     256             :                         // Check for self-assignment!
     257      930141 :                         if (this == &other)
     258           0 :                                 return *this;
     259             : 
     260      930141 :                         MaterialType = other.MaterialType;
     261             : 
     262      930141 :                         AmbientColor = other.AmbientColor;
     263      930141 :                         DiffuseColor = other.DiffuseColor;
     264      930141 :                         EmissiveColor = other.EmissiveColor;
     265      930141 :                         SpecularColor = other.SpecularColor;
     266      930141 :                         Shininess = other.Shininess;
     267      930141 :                         MaterialTypeParam = other.MaterialTypeParam;
     268      930141 :                         MaterialTypeParam2 = other.MaterialTypeParam2;
     269      930141 :                         Thickness = other.Thickness;
     270     4650420 :                         for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
     271             :                         {
     272     3720321 :                                 TextureLayer[i] = other.TextureLayer[i];
     273             :                         }
     274             : 
     275      930099 :                         Wireframe = other.Wireframe;
     276      930099 :                         PointCloud = other.PointCloud;
     277      930099 :                         GouraudShading = other.GouraudShading;
     278      930099 :                         Lighting = other.Lighting;
     279      930099 :                         ZWriteEnable = other.ZWriteEnable;
     280      930099 :                         BackfaceCulling = other.BackfaceCulling;
     281      930099 :                         FrontfaceCulling = other.FrontfaceCulling;
     282      930099 :                         FogEnable = other.FogEnable;
     283      930099 :                         NormalizeNormals = other.NormalizeNormals;
     284      930099 :                         ZBuffer = other.ZBuffer;
     285      930099 :                         AntiAliasing = other.AntiAliasing;
     286      930099 :                         ColorMask = other.ColorMask;
     287      930099 :                         ColorMaterial = other.ColorMaterial;
     288      930099 :                         BlendOperation = other.BlendOperation;
     289      930099 :                         PolygonOffsetFactor = other.PolygonOffsetFactor;
     290      930099 :                         PolygonOffsetDirection = other.PolygonOffsetDirection;
     291      930099 :                         UseMipMaps = other.UseMipMaps;
     292             : 
     293      930099 :                         return *this;
     294             :                 }
     295             : 
     296             :                 //! Texture layer array.
     297             :                 SMaterialLayer TextureLayer[MATERIAL_MAX_TEXTURES];
     298             : 
     299             :                 //! Type of the material. Specifies how everything is blended together
     300             :                 E_MATERIAL_TYPE MaterialType;
     301             : 
     302             :                 //! How much ambient light (a global light) is reflected by this material.
     303             :                 /** The default is full white, meaning objects are completely
     304             :                 globally illuminated. Reduce this if you want to see diffuse
     305             :                 or specular light effects. */
     306             :                 SColor AmbientColor;
     307             : 
     308             :                 //! How much diffuse light coming from a light source is reflected by this material.
     309             :                 /** The default is full white. */
     310             :                 SColor DiffuseColor;
     311             : 
     312             :                 //! Light emitted by this material. Default is to emit no light.
     313             :                 SColor EmissiveColor;
     314             : 
     315             :                 //! How much specular light (highlights from a light) is reflected.
     316             :                 /** The default is to reflect white specular light. See
     317             :                 SMaterial::Shininess on how to enable specular lights. */
     318             :                 SColor SpecularColor;
     319             : 
     320             :                 //! Value affecting the size of specular highlights.
     321             :                 /** A value of 20 is common. If set to 0, no specular
     322             :                 highlights are being used. To activate, simply set the
     323             :                 shininess of a material to a value in the range [0.5;128]:
     324             :                 \code
     325             :                 sceneNode->getMaterial(0).Shininess = 20.0f;
     326             :                 \endcode
     327             : 
     328             :                 You can change the color of the highlights using
     329             :                 \code
     330             :                 sceneNode->getMaterial(0).SpecularColor.set(255,255,255,255);
     331             :                 \endcode
     332             : 
     333             :                 The specular color of the dynamic lights
     334             :                 (SLight::SpecularColor) will influence the the highlight color
     335             :                 too, but they are set to a useful value by default when
     336             :                 creating the light scene node. Here is a simple example on how
     337             :                 to use specular highlights:
     338             :                 \code
     339             :                 // load and display mesh
     340             :                 scene::IAnimatedMeshSceneNode* node = smgr->addAnimatedMeshSceneNode(
     341             :                 smgr->getMesh("data/faerie.md2"));
     342             :                 node->setMaterialTexture(0, driver->getTexture("data/Faerie2.pcx")); // set diffuse texture
     343             :                 node->setMaterialFlag(video::EMF_LIGHTING, true); // enable dynamic lighting
     344             :                 node->getMaterial(0).Shininess = 20.0f; // set size of specular highlights
     345             : 
     346             :                 // add white light
     347             :                 scene::ILightSceneNode* light = smgr->addLightSceneNode(0,
     348             :                         core::vector3df(5,5,5), video::SColorf(1.0f, 1.0f, 1.0f));
     349             :                 \endcode */
     350             :                 f32 Shininess;
     351             : 
     352             :                 //! Free parameter, dependent on the material type.
     353             :                 /** Mostly ignored, used for example in EMT_PARALLAX_MAP_SOLID
     354             :                 and EMT_TRANSPARENT_ALPHA_CHANNEL. */
     355             :                 f32 MaterialTypeParam;
     356             : 
     357             :                 //! Second free parameter, dependent on the material type.
     358             :                 /** Mostly ignored. */
     359             :                 f32 MaterialTypeParam2;
     360             : 
     361             :                 //! Thickness of non-3dimensional elements such as lines and points.
     362             :                 f32 Thickness;
     363             : 
     364             :                 //! Is the ZBuffer enabled? Default: ECFN_LESSEQUAL
     365             :                 /** Values are from E_COMPARISON_FUNC. */
     366             :                 u8 ZBuffer;
     367             : 
     368             :                 //! Sets the antialiasing mode
     369             :                 /** Values are chosen from E_ANTI_ALIASING_MODE. Default is 
     370             :                 EAAM_SIMPLE|EAAM_LINE_SMOOTH, i.e. simple multi-sample
     371             :                 anti-aliasing and lime smoothing is enabled. */
     372             :                 u8 AntiAliasing;
     373             : 
     374             :                 //! Defines the enabled color planes
     375             :                 /** Values are defined as or'ed values of the E_COLOR_PLANE enum.
     376             :                 Only enabled color planes will be rendered to the current render
     377             :                 target. Typical use is to disable all colors when rendering only to
     378             :                 depth or stencil buffer, or using Red and Green for Stereo rendering. */
     379             :                 u8 ColorMask:4;
     380             : 
     381             :                 //! Defines the interpretation of vertex color in the lighting equation
     382             :                 /** Values should be chosen from E_COLOR_MATERIAL.
     383             :                 When lighting is enabled, vertex color can be used instead of the 
     384             :                 material values for light modulation. This allows to easily change e.g. the
     385             :                 diffuse light behavior of each face. The default, ECM_DIFFUSE, will result in
     386             :                 a very similar rendering as with lighting turned off, just with light shading. */
     387             :                 u8 ColorMaterial:3;
     388             : 
     389             :                 //! Store the blend operation of choice
     390             :                 /** Values to be chosen from E_BLEND_OPERATION. The actual way to use this value
     391             :                 is not yet determined, so ignore it for now. */
     392             :                 E_BLEND_OPERATION BlendOperation:4;
     393             : 
     394             :                 //! Factor specifying how far the polygon offset should be made
     395             :                 /** Specifying 0 disables the polygon offset. The direction is specified spearately.
     396             :                 The factor can be from 0 to 7.*/
     397             :                 u8 PolygonOffsetFactor:3;
     398             : 
     399             :                 //! Flag defining the direction the polygon offset is applied to.
     400             :                 /** Can be to front or to back, specififed by values from E_POLYGON_OFFSET. */
     401             :                 E_POLYGON_OFFSET PolygonOffsetDirection:1;
     402             : 
     403             :                 //! Draw as wireframe or filled triangles? Default: false
     404             :                 /** The user can access a material flag using
     405             :                 \code material.Wireframe=true \endcode
     406             :                 or \code material.setFlag(EMF_WIREFRAME, true); \endcode */
     407             :                 bool Wireframe:1;
     408             : 
     409             :                 //! Draw as point cloud or filled triangles? Default: false
     410             :                 bool PointCloud:1;
     411             : 
     412             :                 //! Flat or Gouraud shading? Default: true
     413             :                 bool GouraudShading:1;
     414             : 
     415             :                 //! Will this material be lighted? Default: true
     416             :                 bool Lighting:1;
     417             : 
     418             :                 //! Is the zbuffer writeable or is it read-only. Default: true.
     419             :                 /** This flag is forced to false if the MaterialType is a
     420             :                 transparent type and the scene parameter
     421             :                 ALLOW_ZWRITE_ON_TRANSPARENT is not set. */
     422             :                 bool ZWriteEnable:1;
     423             : 
     424             :                 //! Is backface culling enabled? Default: true
     425             :                 bool BackfaceCulling:1;
     426             : 
     427             :                 //! Is frontface culling enabled? Default: false
     428             :                 bool FrontfaceCulling:1;
     429             : 
     430             :                 //! Is fog enabled? Default: false
     431             :                 bool FogEnable:1;
     432             : 
     433             :                 //! Should normals be normalized?
     434             :                 /** Always use this if the mesh lit and scaled. Default: false */
     435             :                 bool NormalizeNormals:1;
     436             : 
     437             :                 //! Shall mipmaps be used if available
     438             :                 /** Sometimes, disabling mipmap usage can be useful. Default: true */
     439             :                 bool UseMipMaps:1;
     440             : 
     441             :                 //! Gets the texture transformation matrix for level i
     442             :                 /** \param i The desired level. Must not be larger than MATERIAL_MAX_TEXTURES.
     443             :                 \return Texture matrix for texture level i. */
     444           0 :                 core::matrix4& getTextureMatrix(u32 i)
     445             :                 {
     446           0 :                         return TextureLayer[i].getTextureMatrix();
     447             :                 }
     448             : 
     449             :                 //! Gets the immutable texture transformation matrix for level i
     450             :                 /** \param i The desired level.
     451             :                 \return Texture matrix for texture level i, or identity matrix for levels larger than MATERIAL_MAX_TEXTURES. */
     452             :                 const core::matrix4& getTextureMatrix(u32 i) const
     453             :                 {
     454             :                         if (i<MATERIAL_MAX_TEXTURES)
     455             :                                 return TextureLayer[i].getTextureMatrix();
     456             :                         else
     457             :                                 return core::IdentityMatrix;
     458             :                 }
     459             : 
     460             :                 //! Sets the i-th texture transformation matrix
     461             :                 /** \param i The desired level.
     462             :                 \param mat Texture matrix for texture level i. */
     463             :                 void setTextureMatrix(u32 i, const core::matrix4& mat)
     464             :                 {
     465             :                         if (i>=MATERIAL_MAX_TEXTURES)
     466             :                                 return;
     467             :                         TextureLayer[i].setTextureMatrix(mat);
     468             :                 }
     469             : 
     470             :                 //! Gets the i-th texture
     471             :                 /** \param i The desired level.
     472             :                 \return Texture for texture level i, if defined, else 0. */
     473             :                 ITexture* getTexture(u32 i) const
     474             :                 {
     475             :                         return i < MATERIAL_MAX_TEXTURES ? TextureLayer[i].Texture : 0;
     476             :                 }
     477             : 
     478             :                 //! Sets the i-th texture
     479             :                 /** If i>=MATERIAL_MAX_TEXTURES this setting will be ignored.
     480             :                 \param i The desired level.
     481             :                 \param tex Texture for texture level i. */
     482       88937 :                 void setTexture(u32 i, ITexture* tex)
     483             :                 {
     484       88937 :                         if (i>=MATERIAL_MAX_TEXTURES)
     485           0 :                                 return;
     486       88937 :                         TextureLayer[i].Texture = tex;
     487             :                 }
     488             : 
     489             :                 //! Sets the Material flag to the given value
     490             :                 /** \param flag The flag to be set.
     491             :                 \param value The new value for the flag. */
     492     8725689 :                 void setFlag(E_MATERIAL_FLAG flag, bool value)
     493             :                 {
     494     8725689 :                         switch (flag)
     495             :                         {
     496             :                                 case EMF_WIREFRAME:
     497           0 :                                         Wireframe = value; break;
     498             :                                 case EMF_POINTCLOUD:
     499           0 :                                         PointCloud = value; break;
     500             :                                 case EMF_GOURAUD_SHADING:
     501           0 :                                         GouraudShading = value; break;
     502             :                                 case EMF_LIGHTING:
     503       51130 :                                         Lighting = value; break;
     504             :                                 case EMF_ZBUFFER:
     505           0 :                                         ZBuffer = value; break;
     506             :                                 case EMF_ZWRITE_ENABLE:
     507           0 :                                         ZWriteEnable = value; break;
     508             :                                 case EMF_BACK_FACE_CULLING:
     509       32842 :                                         BackfaceCulling = value; break;
     510             :                                 case EMF_FRONT_FACE_CULLING:
     511           0 :                                         FrontfaceCulling = value; break;
     512             :                                 case EMF_BILINEAR_FILTER:
     513             :                                 {
     514    14520023 :                                         for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
     515    11616012 :                                                 TextureLayer[i].BilinearFilter = value;
     516             :                                 }
     517     2904011 :                                 break;
     518             :                                 case EMF_TRILINEAR_FILTER:
     519             :                                 {
     520    14265370 :                                         for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
     521    11412296 :                                                 TextureLayer[i].TrilinearFilter = value;
     522             :                                 }
     523     2853074 :                                 break;
     524             :                                 case EMF_ANISOTROPIC_FILTER:
     525             :                                 {
     526     2852917 :                                         if (value)
     527           0 :                                                 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
     528           0 :                                                         TextureLayer[i].AnisotropicFilter = 0xFF;
     529             :                                         else
     530    14264585 :                                                 for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
     531    11411668 :                                                         TextureLayer[i].AnisotropicFilter = 0;
     532             :                                 }
     533     2852917 :                                 break;
     534             :                                 case EMF_FOG_ENABLE:
     535       31526 :                                         FogEnable = value; break;
     536             :                                 case EMF_NORMALIZE_NORMALS:
     537         171 :                                         NormalizeNormals = value; break;
     538             :                                 case EMF_TEXTURE_WRAP:
     539             :                                 {
     540           0 :                                         for (u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
     541             :                                         {
     542           0 :                                                 TextureLayer[i].TextureWrapU = (E_TEXTURE_CLAMP)value;
     543           0 :                                                 TextureLayer[i].TextureWrapV = (E_TEXTURE_CLAMP)value;
     544             :                                         }
     545             :                                 }
     546           0 :                                 break;
     547             :                                 case EMF_ANTI_ALIASING:
     548           4 :                                         AntiAliasing = value?EAAM_SIMPLE:EAAM_OFF; break;
     549             :                                 case EMF_COLOR_MASK:
     550           0 :                                         ColorMask = value?ECP_ALL:ECP_NONE; break;
     551             :                                 case EMF_COLOR_MATERIAL:
     552           0 :                                         ColorMaterial = value?ECM_DIFFUSE:ECM_NONE; break;
     553             :                                 case EMF_USE_MIP_MAPS:
     554          14 :                                         UseMipMaps = value; break;
     555             :                                 case EMF_BLEND_OPERATION:
     556           0 :                                         BlendOperation = value?EBO_ADD:EBO_NONE; break;
     557             :                                 case EMF_POLYGON_OFFSET:
     558           0 :                                         PolygonOffsetFactor = value?1:0;
     559           0 :                                         PolygonOffsetDirection = EPO_BACK;
     560           0 :                                         break;
     561             :                                 default:
     562           0 :                                         break;
     563             :                         }
     564     8725689 :                 }
     565             : 
     566             :                 //! Gets the Material flag
     567             :                 /** \param flag The flag to query.
     568             :                 \return The current value of the flag. */
     569             :                 bool getFlag(E_MATERIAL_FLAG flag) const
     570             :                 {
     571             :                         switch (flag)
     572             :                         {
     573             :                                 case EMF_WIREFRAME:
     574             :                                         return Wireframe;
     575             :                                 case EMF_POINTCLOUD:
     576             :                                         return PointCloud;
     577             :                                 case EMF_GOURAUD_SHADING:
     578             :                                         return GouraudShading;
     579             :                                 case EMF_LIGHTING:
     580             :                                         return Lighting;
     581             :                                 case EMF_ZBUFFER:
     582             :                                         return ZBuffer!=ECFN_NEVER;
     583             :                                 case EMF_ZWRITE_ENABLE:
     584             :                                         return ZWriteEnable;
     585             :                                 case EMF_BACK_FACE_CULLING:
     586             :                                         return BackfaceCulling;
     587             :                                 case EMF_FRONT_FACE_CULLING:
     588             :                                         return FrontfaceCulling;
     589             :                                 case EMF_BILINEAR_FILTER:
     590             :                                         return TextureLayer[0].BilinearFilter;
     591             :                                 case EMF_TRILINEAR_FILTER:
     592             :                                         return TextureLayer[0].TrilinearFilter;
     593             :                                 case EMF_ANISOTROPIC_FILTER:
     594             :                                         return TextureLayer[0].AnisotropicFilter!=0;
     595             :                                 case EMF_FOG_ENABLE:
     596             :                                         return FogEnable;
     597             :                                 case EMF_NORMALIZE_NORMALS:
     598             :                                         return NormalizeNormals;
     599             :                                 case EMF_TEXTURE_WRAP:
     600             :                                         return !(TextureLayer[0].TextureWrapU ||
     601             :                                                         TextureLayer[0].TextureWrapV ||
     602             :                                                         TextureLayer[1].TextureWrapU ||
     603             :                                                         TextureLayer[1].TextureWrapV ||
     604             :                                                         TextureLayer[2].TextureWrapU ||
     605             :                                                         TextureLayer[2].TextureWrapV ||
     606             :                                                         TextureLayer[3].TextureWrapU ||
     607             :                                                         TextureLayer[3].TextureWrapV);
     608             :                                 case EMF_ANTI_ALIASING:
     609             :                                         return (AntiAliasing==1);
     610             :                                 case EMF_COLOR_MASK:
     611             :                                         return (ColorMask!=ECP_NONE);
     612             :                                 case EMF_COLOR_MATERIAL:
     613             :                                         return (ColorMaterial != ECM_NONE);
     614             :                                 case EMF_USE_MIP_MAPS:
     615             :                                         return UseMipMaps;
     616             :                                 case EMF_BLEND_OPERATION:
     617             :                                         return BlendOperation != EBO_NONE;
     618             :                                 case EMF_POLYGON_OFFSET:
     619             :                                         return PolygonOffsetFactor != 0;
     620             :                         }
     621             : 
     622             :                         return false;
     623             :                 }
     624             : 
     625             :                 //! Inequality operator
     626             :                 /** \param b Material to compare to.
     627             :                 \return True if the materials differ, else false. */
     628     1194722 :                 inline bool operator!=(const SMaterial& b) const
     629             :                 {
     630             :                         bool different =
     631     2357652 :                                 MaterialType != b.MaterialType ||
     632     2325860 :                                 AmbientColor != b.AmbientColor ||
     633     2325860 :                                 DiffuseColor != b.DiffuseColor ||
     634     2325860 :                                 EmissiveColor != b.EmissiveColor ||
     635     2325860 :                                 SpecularColor != b.SpecularColor ||
     636     2325860 :                                 Shininess != b.Shininess ||
     637     2325860 :                                 MaterialTypeParam != b.MaterialTypeParam ||
     638     2325860 :                                 MaterialTypeParam2 != b.MaterialTypeParam2 ||
     639     2325860 :                                 Thickness != b.Thickness ||
     640     2325860 :                                 Wireframe != b.Wireframe ||
     641     2325860 :                                 PointCloud != b.PointCloud ||
     642     2325860 :                                 GouraudShading != b.GouraudShading ||
     643     2325860 :                                 Lighting != b.Lighting ||
     644     2325860 :                                 ZBuffer != b.ZBuffer ||
     645     2325860 :                                 ZWriteEnable != b.ZWriteEnable ||
     646     2324595 :                                 BackfaceCulling != b.BackfaceCulling ||
     647     2323330 :                                 FrontfaceCulling != b.FrontfaceCulling ||
     648     2323330 :                                 FogEnable != b.FogEnable ||
     649     2323330 :                                 NormalizeNormals != b.NormalizeNormals ||
     650     2323330 :                                 AntiAliasing != b.AntiAliasing ||
     651     2323330 :                                 ColorMask != b.ColorMask ||
     652     2323330 :                                 ColorMaterial != b.ColorMaterial ||
     653     2323330 :                                 BlendOperation != b.BlendOperation ||
     654     2323330 :                                 PolygonOffsetFactor != b.PolygonOffsetFactor ||
     655     3518052 :                                 PolygonOffsetDirection != b.PolygonOffsetDirection ||
     656     2356387 :                                 UseMipMaps != b.UseMipMaps;
     657     5841382 :                         for (u32 i=0; (i<MATERIAL_MAX_TEXTURES) && !different; ++i)
     658             :                         {
     659     4646660 :                                 different |= (TextureLayer[i] != b.TextureLayer[i]);
     660             :                         }
     661     1194722 :                         return different;
     662             :                 }
     663             : 
     664             :                 //! Equality operator
     665             :                 /** \param b Material to compare to.
     666             :                 \return True if the materials are equal, else false. */
     667     1194722 :                 inline bool operator==(const SMaterial& b) const
     668     1194722 :                 { return !(b!=*this); }
     669             : 
     670             :                 bool isTransparent() const
     671             :                 {
     672             :                         return MaterialType==EMT_TRANSPARENT_ADD_COLOR ||
     673             :                                 MaterialType==EMT_TRANSPARENT_ALPHA_CHANNEL ||
     674             :                                 MaterialType==EMT_TRANSPARENT_VERTEX_ALPHA ||
     675             :                                 MaterialType==EMT_TRANSPARENT_REFLECTION_2_LAYER;
     676             :                 }
     677             :         };
     678             : 
     679             :         //! global const identity Material
     680             :         IRRLICHT_API extern SMaterial IdentityMaterial;
     681             : 
     682             : } // end namespace video
     683             : } // end namespace irr
     684             : 
     685             : #endif

Generated by: LCOV version 1.11