// 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 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<