// 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 /** The Scenemanager uses the EnablePass array and sets Enabled to true if the Override material is enabled in the current pass. */ 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 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<