33#ifndef DVD_MATERIAL_H_
34#define DVD_MATERIAL_H_
56 class MaterialRenderBin;
60class RenderingComponent;
62struct NodeMaterialData;
63struct RenderStateBlock;
220 void saveToXML(
const std::string& entryName, boost::property_tree::ptree& pt)
const;
221 void loadFromXML(
const std::string& entryName,
const boost::property_tree::ptree& pt);
244 [[nodiscard]]
bool unload()
override;
261 bool useInGeometryPasses =
false);
267 bool useInGeometryPasses =
false );
307 void saveToXML( const
std::
string& entryName, boost::property_tree::ptree& pt) const;
308 void loadFromXML( const
std::
string& entryName, const boost::property_tree::ptree& pt);
351 bool useInGeometryPasses);
357 bool useInGeometryPasses);
391 material->
getSortKeys(renderStagePass, shaderKey, textureKey, hasTransparency);
static void getSortKeys(Material *material, const RenderStagePass renderStagePass, I64 &shaderKey, I64 &textureKey, bool &hasTransparency)
Rough around the edges Adapter pattern abstracting the actual rendering API and access to the GPU.
U32 update(U64 deltaTimeUS)
Returns a bit mask composed of UpdateResult flags.
void setRenderStateBlock(const RenderStateBlock &renderStateBlock, RenderStage stage, RenderPassType pass, RenderStagePass::VariantType variant=RenderStagePass::VariantType::COUNT)
DELEGATE_STD< ShaderProgramDescriptor, Material *, RenderStagePass > ComputeShaderCBK
void loadRenderStatesFromXML(const std::string &entryName, const boost::property_tree::ptree &pt)
bool setTextureLocked(TextureSlot textureUsageSlot, Handle< Texture > texture, SamplerDescriptor sampler, TextureOperation op, bool useInGeometryPasses)
eastl::array< T, to_base(RenderStagePass::VariantType::COUNT)> StatesPerVariant
FColour4 getBaseColour(bool &hasTextureOverride, Handle< Texture > &textureOut) const noexcept
Handle< ShaderProgram > computeAndGetProgramHandle(RenderStagePass renderStagePass)
bool canDraw(RenderStagePass renderStagePass, bool &shaderJustFinishedLoading)
Handle< Texture > getTexture(TextureSlot textureUsage) const
void unlockInstancesForWrite() const noexcept
static constexpr F32 MAX_SHININESS
F32 getRoughness(bool &hasTextureOverride, Handle< Texture > &textureOut) const noexcept
static void RecomputeShaders()
bool hasTransparency() const noexcept
void getData(U32 bestProbeID, NodeMaterialData &dataOut)
const TextureInfo & getTextureInfo(TextureSlot usage) const
DELEGATE_STD< void > RecomputeShadersCBK
void loadFromXML(const std::string &entryName, const boost::property_tree::ptree &pt)
F32 getMetallic(bool &hasTextureOverride, Handle< Texture > &textureOut) const noexcept
FColour3 getEmissive(bool &hasTextureOverride, Handle< Texture > &textureOut) const noexcept
void addShaderDefine(ShaderType type, const string &define, bool addPrefix)
void setShaderProgramInternal(ShaderProgramDescriptor shaderDescriptor, RenderStagePass stagePass)
FColour3 getAmbient(bool &hasTextureOverride, Handle< Texture > &textureOut) const noexcept
eastl::array< StateVariantsPerPass< T >, to_base(RenderStage::COUNT)> StatePassesPerStage
Handle< Material > clone(const std::string_view nameSuffix)
Return a new instance of this material with the name composed of the base material's name and the giv...
void lockInstancesForRead() const noexcept
static void Update(U64 deltaTimeUS)
std::array< TextureInfo, to_base(TextureSlot::COUNT)> _textures
bool usesTextureInShader(TextureSlot slot, bool isPrePass, bool isShadowPass) const noexcept
DescriptorSet & getDescriptorSet(const RenderStagePass &renderStagePass)
void addShaderDefineInternal(ShaderType type, const string &define, bool addPrefix)
void setTextureOperation(TextureSlot textureUsageSlot, TextureOperation op)
void saveTextureDataToXML(const std::string &entryName, boost::property_tree::ptree &pt) const
vector< Handle< Material > > _instances
bool isReflective() const noexcept
SharedMutex _instanceLock
StatePassesPerStage< RenderStateBlockEntry > _defaultRenderStates
std::array< ModuleDefines, to_base(ShaderType::COUNT)> _extraShaderDefines
const RenderStateBlock & getOrCreateRenderStateBlock(RenderStagePass renderStagePass)
static bool s_shadersDirty
ShaderProgramInfo & shaderInfo(RenderStagePass renderStagePass)
bool isRefractive() const noexcept
FColour3 getSpecular(bool &hasTextureOverride, Handle< Texture > &textureOut) const noexcept
void updateTransparency()
bool setSampler(TextureSlot textureUsageSlot, SamplerDescriptor sampler)
DELEGATE_STD< void, Material *, RenderStagePass, RenderStateBlock & > ComputeRenderStateCBK
StatePassesPerStage< ShaderProgramInfo > _shaderInfo
const ModuleDefines & shaderDefines(ShaderType type) const
const vector< Handle< Material > > & getInstancesLocked() const noexcept
void getSortKeys(RenderStagePass renderStagePass, I64 &shaderKey, I64 &textureKey, bool &transparencyFlag) const
void setPipelineLayout(PrimitiveTopology topology, const AttributeMap &shaderAttributes)
bool setTexture(TextureSlot textureUsageSlot, Handle< Texture > texture, SamplerDescriptor sampler, TextureOperation op, bool useInGeometryPasses=false)
F32 getOcclusion(bool &hasTextureOverride, Handle< Texture > &textureOut) const noexcept
void computeAndAppendShaderDefines(ShaderProgramDescriptor &shaderDescriptor, RenderStagePass renderStagePass) const
size_t _shaderAttributesHash
eastl::array< StatesPerVariant< T >, to_base(RenderPassType::COUNT)> StateVariantsPerPass
const vector< Handle< Material > > & getInstances() const
void saveRenderStatesToXML(const std::string &entryName, boost::property_tree::ptree &pt) const
Handle< ShaderProgram > getProgramHandle(RenderStagePass renderStagePass) const
void loadTextureDataFromXML(const std::string &entryName, const boost::property_tree::ptree &pt)
void saveToXML(const std::string &entryName, boost::property_tree::ptree &pt) const
void lockInstancesForWrite() const noexcept
void unlockInstancesForRead() const noexcept
This class contains a list of "RenderBinItem"'s and stores them sorted depending on designation.
An API-independent representation of a texture.
FColour4 WHITE
Random stuff added for convenience.
static constexpr const char * textureSlot[]
TextureSlot StringToTextureSlot(std::string_view name)
BumpMethod StringToBumpMethod(std::string_view name)
const char * BumpMethodToString(BumpMethod bumpMethod) noexcept
const char * ShadingModeToString(ShadingMode shadingMode) noexcept
const char * TextureSlotToString(TextureSlot texUsage) noexcept
const char * MaterialDebugFlagToString(const MaterialDebugFlag unitType) noexcept
TextureOperation StringToTextureOperation(std::string_view operation)
const char * TextureOperationToString(TextureOperation textureOp) noexcept
ShadingMode StringToShadingMode(std::string_view name)
MaterialDebugFlag StringToMaterialDebugFlag(std::string_view name)
Handle console commands that start with a forward slash.
std::function< Ret(Args...) > DELEGATE_STD
constexpr F32 Specular_Quarts
constexpr F32 Specular_Milk
vector< ModuleDefine > ModuleDefines
std::shared_mutex SharedMutex
constexpr F32 Specular_Skin
BlendProperty
Specifies how the red, green, blue, and alpha source blending factors are computed.
TextureOperation
How should each texture be added.
eastl::vector< Type > vector
constexpr F32 Specular_Glass
constexpr F32 Specular_Plastic
constexpr F32 Specular_Water
ShaderType
Available shader stages.
constexpr F32 Specular_Ice
constexpr auto to_base(const Type value) -> Type
PROPERTY_R_IW(bool, ignoreTexDiffuseAlpha, false)
PROPERTY_R_IW(bool, useAlphaDiscard, true)
PROPERTY_R_IW(bool, transparencyEnabled, true)
void receivesShadows(bool state) noexcept
void doubleSided(bool state) noexcept
PROPERTY_RW(FColour3, specular, DefaultColours::BLACK)
PROPERTY_R(bool, receivesShadows, true)
void texturesInFragmentStageOnly(bool state) noexcept
void isInstanced(bool state) noexcept
PROPERTY_R(bool, isInstanced, false)
void bumpMethod(BumpMethod newBumpMethod) noexcept
PROPERTY_R_IW(bool, transparencyUpdated, false)
PROPERTY_R_IW(bool, needsNewShader, true)
PROPERTY_RW(Overrides, overrides)
PROPERTY_R(bool, isStatic, false)
void ignoreTexDiffuseAlpha(bool state) noexcept
PROPERTY_RW(F32, occlusion, 1.0f)
PROPERTY_RW(F32, shininess, 0.f)
void hardwareSkinning(bool state) noexcept
void baseColour(const FColour4 &colour) noexcept
void saveToXML(const std::string &entryName, boost::property_tree::ptree &pt) const
PROPERTY_RW(F32, parallaxFactor, 1.0f)
PROPERTY_RW(SpecularGlossiness, specGloss)
PROPERTY_R(bool, hardwareSkinning, false)
PROPERTY_RW(FColour3, emissive, DefaultColours::BLACK)
PROPERTY_R(ShadingMode, shadingMode, ShadingMode::COUNT)
void isStatic(bool state) noexcept
PROPERTY_R(bool, texturesInFragmentStageOnly, true)
PROPERTY_RW(F32, metallic, 0.f)
PROPERTY_RW(FColour3, ambient, DefaultColours::BLACK)
PROPERTY_R(FColour4, baseColour, DefaultColours::WHITE)
PROPERTY_R_IW(bool, cullUpdated, false)
void loadFromXML(const std::string &entryName, const boost::property_tree::ptree &pt)
void toggleTransparency(bool state) noexcept
PROPERTY_RW(F32, roughness, 0.5f)
void shadingMode(ShadingMode mode) noexcept
PROPERTY_R(bool, usePackedOMR, false)
If the metalness textures has 3 (or 4) channels, those channels are interpreted automatically as R: O...
void useAlphaDiscard(bool state) noexcept
PROPERTY_R(bool, isRefractive, false)
PROPERTY_R(BumpMethod, bumpMethod, BumpMethod::NONE)
PROPERTY_R(TranslucencySource, translucencySource, TranslucencySource::COUNT)
PROPERTY_R(bool, doubleSided, false)
Str< 32 > _shadowShaderVertVariant
Str< 64 > _depthShaderFragSource
Str< 64 > _colourShaderFragSource
Str< 32 > _colourShaderVertVariant
Str< 32 > _depthShaderVertVariant
Str< 64 > _colourShaderVertSource
Str< 32 > _depthShaderFragVariant
Str< 32 > _colourShaderFragVariant
Str< 64 > _depthShaderVertSource
bool _useInGeometryPasses
Setting this to false will fallback to auto-usage selection (e.g. opacity tex will be used for alpha ...
SamplerDescriptor _sampler
TextureOperation _operation