123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- // Copyright (C) 2017 Michael Zeilfelder
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #ifndef S_OVERRIDE_MATERIAL_H_INCLUDED
- #define S_OVERRIDE_MATERIAL_H_INCLUDED
- #include "SMaterial.h"
- namespace irr
- {
- namespace video
- {
- struct SOverrideMaterial
- {
- //! The Material values
- SMaterial Material;
- //! Which values are overridden
- /** OR'ed values from E_MATERIAL_FLAGS. */
- u32 EnableFlags;
- //! For those flags in EnableFlags which affect layers, set which of the layers are affected
- bool EnableLayerFlags[MATERIAL_MAX_TEXTURES];
- //! Which textures are overridden
- bool EnableTextures[MATERIAL_MAX_TEXTURES];
- //! Overwrite complete layers (settings of EnableLayerFlags and EnableTextures don't matter then for layer data)
- bool EnableLayers[MATERIAL_MAX_TEXTURES];
- //! Set in which render passes the material override is active.
- /** OR'ed values from E_SCENE_NODE_RENDER_PASS. */
- u16 EnablePasses;
- //! Global enable flag, overwritten by the SceneManager in each pass
- /** NOTE: This is generally _not_ set by users of the engine, but the
- Scenemanager uses the EnablePass array and sets Enabled to true if the
- Override material is enabled in the current pass.
- As user you generally _only_ set EnablePasses.
- The exception is when rendering without SceneManager but using draw calls in the VideoDriver. */
- bool Enabled;
- struct SMaterialTypeReplacement
- {
- SMaterialTypeReplacement(s32 original, u32 replacement) : Original(original), Replacement(replacement) {}
- SMaterialTypeReplacement(u32 replacement) : Original(-1), Replacement(replacement) {}
- //! SMaterial.MaterialType to replace.
- //! -1 for all types or a specific value to only replace that one (which is either one of E_MATERIAL_TYPE or a shader material id)
- s32 Original;
- //! MaterialType to used to override Original (either one of E_MATERIAL_TYPE or a shader material id)
- u32 Replacement;
- };
- //! To overwrite SMaterial::MaterialType
- core::array<SMaterialTypeReplacement> MaterialTypes;
- //! Default constructor
- SOverrideMaterial() : EnableFlags(0), EnablePasses(0), Enabled(false)
- {
- }
- //! disable overrides and reset all flags
- void reset()
- {
- EnableFlags = 0;
- EnablePasses = 0;
- Enabled = false;
- for (u32 i = 0; i < MATERIAL_MAX_TEXTURES; ++i)
- {
- EnableLayerFlags[i] = true; // doesn't do anything unless EnableFlags is set, just saying by default all texture layers are affected by flags
- EnableTextures[i] = false;
- EnableLayers[i] = false;
- }
- MaterialTypes.clear();
- }
- //! Apply the enabled overrides
- void apply(SMaterial& material)
- {
- if (Enabled)
- {
- for (u32 i = 0; i < MaterialTypes.size(); ++i)
- {
- const SMaterialTypeReplacement& mtr = MaterialTypes[i];
- if (mtr.Original < 0 || (s32)mtr.Original == material.MaterialType)
- material.MaterialType = (E_MATERIAL_TYPE)mtr.Replacement;
- }
- for (u32 f=0; f<32; ++f)
- {
- const u32 num=(1<<f);
- if (EnableFlags & num)
- {
- switch (num)
- {
- case EMF_WIREFRAME: material.Wireframe = Material.Wireframe; break;
- case EMF_POINTCLOUD: material.PointCloud = Material.PointCloud; break;
- case EMF_GOURAUD_SHADING: material.GouraudShading = Material.GouraudShading; break;
- case EMF_LIGHTING: material.Lighting = Material.Lighting; break;
- case EMF_ZBUFFER: material.ZBuffer = Material.ZBuffer; break;
- case EMF_ZWRITE_ENABLE: material.ZWriteEnable = Material.ZWriteEnable; break;
- case EMF_BACK_FACE_CULLING: material.BackfaceCulling = Material.BackfaceCulling; break;
- case EMF_FRONT_FACE_CULLING: material.FrontfaceCulling = Material.FrontfaceCulling; break;
- case EMF_BILINEAR_FILTER:
- for ( u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
- {
- if ( EnableLayerFlags[i] )
- {
- material.TextureLayer[i].BilinearFilter = Material.TextureLayer[i].BilinearFilter;
- }
- }
- break;
- case EMF_TRILINEAR_FILTER:
- for ( u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
- {
- if ( EnableLayerFlags[i] )
- {
- material.TextureLayer[i].TrilinearFilter = Material.TextureLayer[i].TrilinearFilter;
- }
- }
- break;
- case EMF_ANISOTROPIC_FILTER:
- for ( u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
- {
- if ( EnableLayerFlags[i] )
- {
- material.TextureLayer[i].AnisotropicFilter = Material.TextureLayer[i].AnisotropicFilter;
- }
- }
- break;
- case EMF_FOG_ENABLE: material.FogEnable = Material.FogEnable; break;
- case EMF_NORMALIZE_NORMALS: material.NormalizeNormals = Material.NormalizeNormals; break;
- case EMF_TEXTURE_WRAP:
- for ( u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i)
- {
- if ( EnableLayerFlags[i] )
- {
- material.TextureLayer[i].TextureWrapU = Material.TextureLayer[i].TextureWrapU;
- material.TextureLayer[i].TextureWrapV = Material.TextureLayer[i].TextureWrapV;
- material.TextureLayer[i].TextureWrapW = Material.TextureLayer[i].TextureWrapW;
- }
- }
- break;
- case EMF_ANTI_ALIASING: material.AntiAliasing = Material.AntiAliasing; break;
- case EMF_COLOR_MASK: material.ColorMask = Material.ColorMask; break;
- case EMF_COLOR_MATERIAL: material.ColorMaterial = Material.ColorMaterial; break;
- case EMF_USE_MIP_MAPS: material.UseMipMaps = Material.UseMipMaps; break;
- case EMF_BLEND_OPERATION: material.BlendOperation = Material.BlendOperation; break;
- case EMF_BLEND_FACTOR: material.BlendFactor = Material.BlendFactor; break;
- case EMF_POLYGON_OFFSET:
- material.PolygonOffsetDirection = Material.PolygonOffsetDirection;
- material.PolygonOffsetFactor = Material.PolygonOffsetFactor;
- material.PolygonOffsetDepthBias = Material.PolygonOffsetDepthBias;
- material.PolygonOffsetSlopeScale = Material.PolygonOffsetSlopeScale;
- break;
- }
- }
- }
- for(u32 i=0; i<MATERIAL_MAX_TEXTURES; ++i )
- {
- if ( EnableLayers[i] )
- {
- material.TextureLayer[i] = Material.TextureLayer[i];
- }
- else if ( EnableTextures[i] )
- {
- material.TextureLayer[i].Texture = Material.TextureLayer[i].Texture;
- }
- }
- }
- }
- };
- } // end namespace video
- } // end namespace irr
- #endif // S_OVERRIDE_MATERIAL_H_INCLUDED
|