From 9b4e70dc9626f32bd70295378f619a2169e43e68 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 14 Mar 2021 07:17:21 +0100 Subject: [PATCH] #5532: Start refactoring expression handling in the shader layer. Instead of keeping track of multiple indices, introduce an ExpressionSlot structure which will hold the necessary information. Alphatest has already been migrated. --- include/ishaderexpression.h | 3 +- include/ishaderlayer.h | 30 ++++-- include/ishaders.h | 4 +- radiant/ui/materials/ExpressionBinding.h | 4 +- radiant/ui/materials/MaterialEditor.cpp | 2 +- radiant/ui/materials/MaterialEditor.h | 2 +- radiantcore/shaders/CShader.cpp | 2 +- radiantcore/shaders/CShader.h | 2 +- radiantcore/shaders/Doom3ShaderLayer.cpp | 112 +++++++++++---------- radiantcore/shaders/Doom3ShaderLayer.h | 114 +++++++++++++++++----- radiantcore/shaders/Doom3ShaderSystem.cpp | 4 +- radiantcore/shaders/Doom3ShaderSystem.h | 2 +- radiantcore/shaders/ShaderExpression.cpp | 6 +- radiantcore/shaders/ShaderExpression.h | 72 +++++++------- radiantcore/shaders/ShaderTemplate.cpp | 44 ++++----- radiantcore/shaders/ShaderTemplate.h | 8 +- 16 files changed, 247 insertions(+), 164 deletions(-) diff --git a/include/ishaderexpression.h b/include/ishaderexpression.h index 2643bda5da..96305cb707 100644 --- a/include/ishaderexpression.h +++ b/include/ishaderexpression.h @@ -38,6 +38,8 @@ enum ReservedRegisters class IShaderExpression { public: + using Ptr = std::shared_ptr; + /** * Retrieve the floating point value of this expression. DEPRECATED */ @@ -81,7 +83,6 @@ class IShaderExpression // Returns the string this expression has been parsed from virtual std::string getExpressionString() = 0; }; -typedef std::shared_ptr IShaderExpressionPtr; // Interface of a material expression used to specify a map image // It can either represent a texture path to a file on disk or diff --git a/include/ishaderlayer.h b/include/ishaderlayer.h index cd5aacf205..936548f5d0 100644 --- a/include/ishaderlayer.h +++ b/include/ishaderlayer.h @@ -99,6 +99,16 @@ class IShaderLayer PF_HasColoredKeyword = 1 << 3, // colored has been specified }; + // Expression slot selector + struct Expression + { + enum Slot + { + AlphaTest = 0, + NumExpressionSlots + }; + }; + /** * \brief * Destructor @@ -148,7 +158,7 @@ class IShaderLayer virtual float getTexGenParam(std::size_t index) const = 0; // The expressions used to calculate the tex gen params. Index in [0..2] - virtual shaders::IShaderExpressionPtr getTexGenExpression(std::size_t index) const = 0; + virtual shaders::IShaderExpression::Ptr getTexGenExpression(std::size_t index) const = 0; /** * \brief @@ -180,7 +190,7 @@ class IShaderLayer }; // Returns the expression to calculate the RGBA vertex colour values - virtual const shaders::IShaderExpressionPtr& getColourExpression(ColourComponentSelector component) const = 0; + virtual const shaders::IShaderExpression::Ptr& getColourExpression(ColourComponentSelector component) const = 0; /** * \brief @@ -242,14 +252,14 @@ class IShaderLayer virtual Vector2 getScale() const = 0; // Returns the expression of the given scale component (0 == x, 1 == y) - virtual const shaders::IShaderExpressionPtr& getScaleExpression(std::size_t index) const = 0; + virtual const shaders::IShaderExpression::Ptr& getScaleExpression(std::size_t index) const = 0; // Workaround: the shader layer is storing the centerscale expression in the same location as scale expressions, // making them mutually exclusive - which is not the way the idTech4 materials work. // These stage transforms need to be redesigned to support an arbitrary number of transforms respecting their order. // Texture Matrix calculation needs to be performed by the stage itself, not in OpenGLShaderPass // I need to go ahead with the material editor, so I'm not changing it immediately - virtual const shaders::IShaderExpressionPtr& getCenterScaleExpression(std::size_t index) const = 0; + virtual const shaders::IShaderExpression::Ptr& getCenterScaleExpression(std::size_t index) const = 0; /** * Returns the value of the translate expressions of this stage. @@ -257,7 +267,7 @@ class IShaderLayer virtual Vector2 getTranslation() const = 0; // Returns the expression of the given translation component (0 == x, 1 == y) - virtual const shaders::IShaderExpressionPtr& getTranslationExpression(std::size_t index) const = 0; + virtual const shaders::IShaderExpression::Ptr& getTranslationExpression(std::size_t index) const = 0; /** * Returns the value of the rotate expression of this stage. @@ -265,7 +275,7 @@ class IShaderLayer virtual float getRotation() const = 0; // Returns the expression used to calculate the rotation value - virtual const shaders::IShaderExpressionPtr& getRotationExpression() const = 0; + virtual const shaders::IShaderExpression::Ptr& getRotationExpression() const = 0; /** * Returns the value of the 'shear' expressions of this stage. @@ -273,7 +283,7 @@ class IShaderLayer virtual Vector2 getShear() const = 0; // Returns the expression of the given shear component (0 == x, 1 == y) - virtual const shaders::IShaderExpressionPtr& getShearExpression(std::size_t index) const = 0; + virtual const shaders::IShaderExpression::Ptr& getShearExpression(std::size_t index) const = 0; // Returns true if this layer has an alphatest expression defined virtual bool hasAlphaTest() const = 0; @@ -289,7 +299,7 @@ class IShaderLayer virtual float getAlphaTest() const = 0; // Returns the expression used to calculate the alpha test value - virtual const shaders::IShaderExpressionPtr& getAlphaTestExpression() const = 0; + virtual const shaders::IShaderExpression::Ptr& getAlphaTestExpression() const = 0; /** * Whether this stage is active. Unconditional stages always return true, @@ -298,7 +308,7 @@ class IShaderLayer virtual bool isVisible() const = 0; // Returns the if-expression used to evaluate this stage's visibility, or null if none defined - virtual const shaders::IShaderExpressionPtr& getConditionExpression() const = 0; + virtual const shaders::IShaderExpression::Ptr& getConditionExpression() const = 0; /** * Returns the name of this stage's fragment program. @@ -326,7 +336,7 @@ class IShaderLayer {} int index; - shaders::IShaderExpressionPtr expressions[4]; + shaders::IShaderExpression::Ptr expressions[4]; }; // Returns the vertex parameter with the given index [0..3] diff --git a/include/ishaders.h b/include/ishaders.h index 503d892e90..7d4624aa0e 100644 --- a/include/ishaders.h +++ b/include/ishaders.h @@ -243,7 +243,7 @@ class Material virtual DeformType getDeformType() const = 0; // Returns the shader expression used to define the deform parameters (valid indices in [0..2]) - virtual shaders::IShaderExpressionPtr getDeformExpression(std::size_t index) = 0; + virtual shaders::IShaderExpression::Ptr getDeformExpression(std::size_t index) = 0; // Used for Deform_Particle/Particle2 defines the name of the particle def virtual std::string getDeformDeclName() = 0; @@ -489,7 +489,7 @@ class MaterialManager * Creates a new shader expression for the given string. This can be used to create standalone * expression objects for unit testing purposes. */ - virtual shaders::IShaderExpressionPtr createShaderExpressionFromString(const std::string& exprStr) = 0; + virtual shaders::IShaderExpression::Ptr createShaderExpressionFromString(const std::string& exprStr) = 0; // Creates a named, internal material for debug/testing etc. // Used by shaders without corresponding material declaration, like entity wireframe shaders diff --git a/radiant/ui/materials/ExpressionBinding.h b/radiant/ui/materials/ExpressionBinding.h index 18323b6654..14602be2de 100644 --- a/radiant/ui/materials/ExpressionBinding.h +++ b/radiant/ui/materials/ExpressionBinding.h @@ -12,13 +12,13 @@ class ExpressionBinding : { private: wxTextCtrl* _textCtrl; - std::function _getExpression; + std::function _getExpression; std::function _updateExpression; std::function _postChangeNotify; public: ExpressionBinding(wxTextCtrl* textCtrl, - const std::function& loadFunc, + const std::function& loadFunc, const std::function& acquireSaveTarget, const std::function& saveFunc, const std::function& postChangeNotify = std::function()) : diff --git a/radiant/ui/materials/MaterialEditor.cpp b/radiant/ui/materials/MaterialEditor.cpp index 32e3713001..b856811a01 100644 --- a/radiant/ui/materials/MaterialEditor.cpp +++ b/radiant/ui/materials/MaterialEditor.cpp @@ -364,7 +364,7 @@ void MaterialEditor::setupStageFlag(const std::string& controlName, int flags) } void MaterialEditor::createExpressionBinding(const std::string& textCtrlName, - const std::function& loadFunc, + const std::function& loadFunc, const std::function& saveFunc) { _stageBindings.emplace(std::make_shared( diff --git a/radiant/ui/materials/MaterialEditor.h b/radiant/ui/materials/MaterialEditor.h index 718d6719f2..797c02173a 100644 --- a/radiant/ui/materials/MaterialEditor.h +++ b/radiant/ui/materials/MaterialEditor.h @@ -80,7 +80,7 @@ class MaterialEditor : void setupStageFlag(const std::string& controlName, int flags); void createExpressionBinding(const std::string& textCtrlName, - const std::function& loadFunc, + const std::function& loadFunc, const std::function& saveFunc = std::function()); void updateControlsFromMaterial(); diff --git a/radiantcore/shaders/CShader.cpp b/radiantcore/shaders/CShader.cpp index 07076a66af..5056e77b87 100644 --- a/radiantcore/shaders/CShader.cpp +++ b/radiantcore/shaders/CShader.cpp @@ -196,7 +196,7 @@ Material::DeformType CShader::getDeformType() const return _template->getDeformType(); } -IShaderExpressionPtr CShader::getDeformExpression(std::size_t index) +IShaderExpression::Ptr CShader::getDeformExpression(std::size_t index) { return _template->getDeformExpression(index); } diff --git a/radiantcore/shaders/CShader.h b/radiantcore/shaders/CShader.h index 9c8c52f2f3..b6d94bea88 100644 --- a/radiantcore/shaders/CShader.h +++ b/radiantcore/shaders/CShader.h @@ -74,7 +74,7 @@ class CShader final : SurfaceType getSurfaceType() const override; void setSurfaceType(SurfaceType type) override; DeformType getDeformType() const override; - IShaderExpressionPtr getDeformExpression(std::size_t index) override; + IShaderExpression::Ptr getDeformExpression(std::size_t index) override; std::string getDeformDeclName() override; int getSpectrum() const override; DecalInfo getDecalInfo() const override; diff --git a/radiantcore/shaders/Doom3ShaderLayer.cpp b/radiantcore/shaders/Doom3ShaderLayer.cpp index 2a3caf831d..2a993b824b 100644 --- a/radiantcore/shaders/Doom3ShaderLayer.cpp +++ b/radiantcore/shaders/Doom3ShaderLayer.cpp @@ -76,11 +76,61 @@ BlendFunc blendFuncFromStrings(const StringPair& blendFunc) // IShaderLayer implementation -const IShaderExpressionPtr Doom3ShaderLayer::NULL_EXPRESSION; +const IShaderExpression::Ptr Doom3ShaderLayer::NULL_EXPRESSION; + +void ExpressionSlots::assign(IShaderLayer::Expression::Slot slot, const IShaderExpression::Ptr& newExpression, std::size_t defaultRegisterIndex) +{ + auto& expressionSlot = at(slot); + + if (!newExpression) + { + expressionSlot.expression.reset(); + expressionSlot.expressionIndex = ExpressionSlot::Unused; + expressionSlot.registerIndex = defaultRegisterIndex; + return; + } + + // Non-empty expression, overwrite if we have an existing expression in the slot + if (expressionSlot.expression) + { + // We assume that if there was an expression in the slot, it shouldn't point to the default registers + assert(expressionSlot.registerIndex != defaultRegisterIndex); + + // Re-use the register index + expressionSlot.expression = newExpression; + expressionSlot.expression->linkToSpecificRegister(_registers, expressionSlot.registerIndex); + } + else + { + expressionSlot.expression = newExpression; + expressionSlot.registerIndex = expressionSlot.expression->linkToRegister(_registers); + } +} + +void ExpressionSlots::assignFromString(IShaderLayer::Expression::Slot slot, const std::string& expressionString, std::size_t defaultRegisterIndex) +{ + // An empty string will clear the expression + if (expressionString.empty()) + { + assign(slot, IShaderExpression::Ptr(), defaultRegisterIndex); + return; + } + + // Attempt to parse the string + auto expression = ShaderExpression::createFromString(expressionString); + + if (!expression) + { + return; // parsing failures will not overwrite the expression slot + } + + assign(slot, expression, defaultRegisterIndex); +} Doom3ShaderLayer::Doom3ShaderLayer(ShaderTemplate& material, IShaderLayer::Type type, const NamedBindablePtr& btex) : _material(material), _registers(NUM_RESERVED_REGISTERS), + _expressionSlots(_registers), _condition(REG_ONE), _conditionExpression(NOT_DEFINED), _bindableTex(btex), @@ -91,8 +141,6 @@ Doom3ShaderLayer::Doom3ShaderLayer(ShaderTemplate& material, IShaderLayer::Type _cubeMapMode(CUBE_MAP_NONE), _stageFlags(0), _clampType(CLAMP_REPEAT), - _alphaTest(REG_ZERO), - _alphaTestExpression(NOT_DEFINED), _texGenType(TEXGEN_NORMAL), _privatePolygonOffset(0), _parseFlags(0) @@ -100,6 +148,8 @@ Doom3ShaderLayer::Doom3ShaderLayer(ShaderTemplate& material, IShaderLayer::Type _registers[REG_ZERO] = 0; _registers[REG_ONE] = 1; + _expressionSlots[Expression::AlphaTest].registerIndex = REG_ZERO; + // Init the colour to 1,1,1,1 _colIdx[0] = _colIdx[1] = _colIdx[2] = _colIdx[3] = REG_ONE; _colExpression[0] = _colExpression[1] = _colExpression[2] = _colExpression[3] = NOT_DEFINED; @@ -128,6 +178,7 @@ Doom3ShaderLayer::Doom3ShaderLayer(const Doom3ShaderLayer& other, ShaderTemplate _material(material), _registers(other._registers), _expressions(other._expressions), + _expressionSlots(other._expressionSlots, _registers), _condition(other._condition), _conditionExpression(other._conditionExpression), _bindableTex(other._bindableTex), @@ -139,8 +190,6 @@ Doom3ShaderLayer::Doom3ShaderLayer(const Doom3ShaderLayer& other, ShaderTemplate _cubeMapMode(other._cubeMapMode), _stageFlags(other._stageFlags), _clampType(other._clampType), - _alphaTest(other._alphaTest), - _alphaTestExpression(other._alphaTestExpression), _texGenType(other._texGenType), _rotation(other._rotation), _rotationExpression(other._rotationExpression), @@ -215,7 +264,7 @@ Colour4 Doom3ShaderLayer::getColour() const return colour; } -const IShaderExpressionPtr& Doom3ShaderLayer::getColourExpression(ColourComponentSelector component) const +const IShaderExpression::Ptr& Doom3ShaderLayer::getColourExpression(ColourComponentSelector component) const { std::size_t expressionIndex = NOT_DEFINED; @@ -254,7 +303,7 @@ const IShaderExpressionPtr& Doom3ShaderLayer::getColourExpression(ColourComponen return expressionIndex != NOT_DEFINED ? _expressions[expressionIndex] : NULL_EXPRESSION; } -void Doom3ShaderLayer::setColourExpression(ColourComponentSelector comp, const IShaderExpressionPtr& expr) +void Doom3ShaderLayer::setColourExpression(ColourComponentSelector comp, const IShaderExpression::Ptr& expr) { // Store the expression and link it to our registers auto expressionIndex = _expressions.size(); @@ -353,17 +402,17 @@ void Doom3ShaderLayer::setRenderMapSize(const Vector2& size) bool Doom3ShaderLayer::hasAlphaTest() const { - return _alphaTestExpression != NOT_DEFINED; + return _expressionSlots[Expression::AlphaTest].expression != nullptr; } float Doom3ShaderLayer::getAlphaTest() const { - return _registers[_alphaTest]; + return _registers[_expressionSlots[Expression::AlphaTest].registerIndex]; } -const shaders::IShaderExpressionPtr& Doom3ShaderLayer::getAlphaTestExpression() const +const IShaderExpression::Ptr& Doom3ShaderLayer::getAlphaTestExpression() const { - return _alphaTestExpression != NOT_DEFINED ? _expressions[_alphaTestExpression] : NULL_EXPRESSION; + return _expressionSlots[Expression::AlphaTest].expression; } TexturePtr Doom3ShaderLayer::getFragmentMapTexture(int index) const @@ -514,7 +563,7 @@ void Doom3ShaderLayer::addVertexParm(const VertexParm& parm) assert(_vertexParms.size() % 4 == 0); } -void Doom3ShaderLayer::assignExpression(const IShaderExpressionPtr& expression, +void Doom3ShaderLayer::assignExpression(const IShaderExpression::Ptr& expression, std::size_t& expressionIndex, std::size_t& registerIndex, std::size_t defaultRegisterIndex) { if (!expression) @@ -566,19 +615,7 @@ void Doom3ShaderLayer::assignExpressionFromString(const std::string& expressionS // An empty string will clear the expression if (expressionString.empty()) { - assignExpression(IShaderExpressionPtr(), expressionIndex, registerIndex, defaultRegisterIndex); -#if 0 - if (expressionIndex != NOT_DEFINED) - { - assert(_expressions[expressionIndex]); - - _expressions[expressionIndex]->unlinkFromRegisters(); - _expressions[expressionIndex].reset(); - } - - registerIndex = defaultRegisterIndex; - expressionIndex = NOT_DEFINED; -#endif + assignExpression(IShaderExpression::Ptr(), expressionIndex, registerIndex, defaultRegisterIndex); return; } @@ -591,31 +628,6 @@ void Doom3ShaderLayer::assignExpressionFromString(const std::string& expressionS } assignExpression(expression, expressionIndex, registerIndex, defaultRegisterIndex); -#if 0 - if (expressionIndex != NOT_DEFINED) - { - // Try to re-use the previous register position - auto previousExpression = _expressions[expressionIndex]; - _expressions[expressionIndex] = expression; - - if (previousExpression->isLinked()) - { - registerIndex = previousExpression->unlinkFromRegisters(); - expression->linkToSpecificRegister(_registers, registerIndex); - } - else - { - registerIndex = expression->linkToRegister(_registers); - } - } - else - { - expressionIndex = _expressions.size(); - _expressions.emplace_back(expression); - - registerIndex = expression->linkToRegister(_registers); - } -#endif } } diff --git a/radiantcore/shaders/Doom3ShaderLayer.h b/radiantcore/shaders/Doom3ShaderLayer.h index af827e06d0..dc5a08b558 100644 --- a/radiantcore/shaders/Doom3ShaderLayer.h +++ b/radiantcore/shaders/Doom3ShaderLayer.h @@ -15,6 +15,51 @@ typedef std::pair StringPair; class ShaderTemplate; + +struct ExpressionSlot +{ + // The register holding the evaluated float + std::size_t registerIndex; + + // The index of this expression in the slots array + std::size_t expressionIndex; + + // The expression itself + IShaderExpression::Ptr expression; + + static const std::size_t Unused = std::numeric_limits::max(); + + ExpressionSlot() : + registerIndex(REG_ZERO), + expressionIndex(Unused) + {} +}; + +class ExpressionSlots : + public std::vector +{ +private: + Registers& _registers; + + static const IShaderExpression::Ptr NullExpression; + +public: + ExpressionSlots(Registers& registers) : + _registers(registers) + { + resize(IShaderLayer::Expression::NumExpressionSlots); + } + + ExpressionSlots(const ExpressionSlots& other, Registers& registers) : + std::vector(other), // copy all expression slots + _registers(registers) + {} + + void assign(IShaderLayer::Expression::Slot slot, const IShaderExpression::Ptr& expression, std::size_t defaultRegisterIndex); + + void assignFromString(IShaderLayer::Expression::Slot slot, const std::string& expression, std::size_t defaultRegisterIndex); +}; + /** * \brief * Implementation of IShaderLayer for Doom 3 shaders. @@ -30,10 +75,13 @@ class Doom3ShaderLayer : Registers _registers; // The expressions used in this stage - typedef std::vector Expressions; + typedef std::vector Expressions; + // deprecated Expressions _expressions; - static const IShaderExpressionPtr NULL_EXPRESSION; + ExpressionSlots _expressionSlots; + + static const IShaderExpression::Ptr NULL_EXPRESSION; static const std::size_t NOT_DEFINED = std::numeric_limits::max(); // The condition register for this stage. Points to a register to be interpreted as bool. @@ -72,14 +120,10 @@ class Doom3ShaderLayer : // Per-stage clamping ClampType _clampType; - // Alpha test value, pointing into the register array. 0 means no test, otherwise must be within (0 - 1] - std::size_t _alphaTest; - std::size_t _alphaTestExpression; - // texgen normal, reflect, skybox, wobblesky TexGenType _texGenType; std::size_t _texGenParams[3]; // 3 registers for wobblesky texgen - IShaderExpressionPtr _texGenExpressions[3]; // the 3 expressions + IShaderExpression::Ptr _texGenExpressions[3]; // the 3 expressions // The register indices of this stage's scale expressions std::size_t _scale[2]; @@ -141,11 +185,11 @@ class Doom3ShaderLayer : bool hasAlphaTest() const override; float getAlphaTest() const override; - const shaders::IShaderExpressionPtr& getAlphaTestExpression() const override; + const shaders::IShaderExpression::Ptr& getAlphaTestExpression() const override; void setAlphaTestExpressionFromString(const std::string& expression) override { - assignExpressionFromString(expression, _alphaTestExpression, _alphaTest, REG_ZERO); + _expressionSlots.assignFromString(Expression::AlphaTest, expression, REG_ZERO); } // True if the condition for this stage is fulfilled @@ -155,12 +199,12 @@ class Doom3ShaderLayer : return _registers[_condition] != 0; } - const shaders::IShaderExpressionPtr& getConditionExpression() const override + const shaders::IShaderExpression::Ptr& getConditionExpression() const override { return _conditionExpression != NOT_DEFINED ? _expressions[_conditionExpression] : NULL_EXPRESSION; } - void setCondition(const IShaderExpressionPtr& conditionExpr) + void setCondition(const IShaderExpression::Ptr& conditionExpr) { // Store the expression in our list _conditionExpression = _expressions.size(); @@ -179,6 +223,14 @@ class Doom3ShaderLayer : expression->evaluate(time); } } + + for (const auto& slot : _expressionSlots) + { + if (slot.expression) + { + slot.expression->evaluate(time); + } + } } void evaluateExpressions(std::size_t time, const IRenderEntity& entity) @@ -190,6 +242,14 @@ class Doom3ShaderLayer : expression->evaluate(time, entity); } } + + for (const auto& slot : _expressionSlots) + { + if (slot.expression) + { + slot.expression->evaluate(time, entity); + } + } } /** @@ -274,13 +334,13 @@ class Doom3ShaderLayer : return _registers[_texGenParams[index]]; } - IShaderExpressionPtr getTexGenExpression(std::size_t index) const override + IShaderExpression::Ptr getTexGenExpression(std::size_t index) const override { assert(index < 3); return _texGenExpressions[index]; } - void setTexGenExpression(std::size_t index, const IShaderExpressionPtr& expression) + void setTexGenExpression(std::size_t index, const IShaderExpression::Ptr& expression) { assert(index < 3); @@ -321,13 +381,13 @@ class Doom3ShaderLayer : */ void setColour(const Vector4& col); - const IShaderExpressionPtr& getColourExpression(ColourComponentSelector component) const override; + const IShaderExpression::Ptr& getColourExpression(ColourComponentSelector component) const override; /** * Set the given colour component to use the given expression. This can be a single * component out of the 4 available ones (R, G, B, A) or one of the two combos RGB and RGBA. */ - void setColourExpression(ColourComponentSelector comp, const IShaderExpressionPtr& expr); + void setColourExpression(ColourComponentSelector comp, const IShaderExpression::Ptr& expr); /** * \brief @@ -344,7 +404,7 @@ class Doom3ShaderLayer : return Vector2(_registers[_scale[0]], _registers[_scale[1]]); } - const shaders::IShaderExpressionPtr& getScaleExpression(std::size_t index) const override + const shaders::IShaderExpression::Ptr& getScaleExpression(std::size_t index) const override { assert(index < 2); @@ -357,7 +417,7 @@ class Doom3ShaderLayer : return expressionIndex != NOT_DEFINED ? _expressions[expressionIndex] : NULL_EXPRESSION; } - const shaders::IShaderExpressionPtr& getCenterScaleExpression(std::size_t index) const override + const shaders::IShaderExpression::Ptr& getCenterScaleExpression(std::size_t index) const override { assert(index < 2); @@ -373,7 +433,7 @@ class Doom3ShaderLayer : /** * Set the scale expressions of this stage, overwriting any previous scales. */ - void setScale(const IShaderExpressionPtr& xExpr, const IShaderExpressionPtr& yExpr) + void setScale(const IShaderExpression::Ptr& xExpr, const IShaderExpression::Ptr& yExpr) { _scaleExpression[0] = _expressions.size(); _expressions.emplace_back(xExpr); @@ -389,7 +449,7 @@ class Doom3ShaderLayer : return Vector2(_registers[_translation[0]], _registers[_translation[1]]); } - const shaders::IShaderExpressionPtr& getTranslationExpression(std::size_t index) const override + const shaders::IShaderExpression::Ptr& getTranslationExpression(std::size_t index) const override { assert(index < 2); auto expressionIndex = _translationExpression[index]; @@ -406,7 +466,7 @@ class Doom3ShaderLayer : /** * Set the "translate" expressions of this stage, overwriting any previous expressions. */ - void setTranslation(const IShaderExpressionPtr& xExpr, const IShaderExpressionPtr& yExpr) + void setTranslation(const IShaderExpression::Ptr& xExpr, const IShaderExpression::Ptr& yExpr) { _translationExpression[0] = _expressions.size(); _expressions.emplace_back(xExpr); @@ -422,7 +482,7 @@ class Doom3ShaderLayer : return _registers[_rotation]; } - const shaders::IShaderExpressionPtr& getRotationExpression() const override + const shaders::IShaderExpression::Ptr& getRotationExpression() const override { return _rotationExpression != NOT_DEFINED ? _expressions[_rotationExpression] : NULL_EXPRESSION; } @@ -430,7 +490,7 @@ class Doom3ShaderLayer : /** * Set the "rotate" expression of this stage, overwriting any previous one. */ - void setRotation(const IShaderExpressionPtr& expr) + void setRotation(const IShaderExpression::Ptr& expr) { _rotationExpression = _expressions.size(); _expressions.emplace_back(expr); @@ -443,7 +503,7 @@ class Doom3ShaderLayer : return Vector2(_registers[_shear[0]], _registers[_shear[1]]); } - const shaders::IShaderExpressionPtr& getShearExpression(std::size_t index) const override + const shaders::IShaderExpression::Ptr& getShearExpression(std::size_t index) const override { assert(index < 2); auto expressionIndex = _shearExpression[index]; @@ -453,7 +513,7 @@ class Doom3ShaderLayer : /** * Set the shear expressions of this stage, overwriting any previous ones. */ - void setShear(const IShaderExpressionPtr& xExpr, const IShaderExpressionPtr& yExpr) + void setShear(const IShaderExpression::Ptr& xExpr, const IShaderExpression::Ptr& yExpr) { _shearExpression[0] = _expressions.size(); _expressions.emplace_back(xExpr); @@ -477,9 +537,9 @@ class Doom3ShaderLayer : * \brief * Set alphatest expression */ - void setAlphaTest(const IShaderExpressionPtr& expression) + void setAlphaTest(const IShaderExpression::Ptr& expression) { - assignExpression(expression, _alphaTestExpression, _alphaTest, REG_ZERO); + _expressionSlots.assign(Expression::AlphaTest, expression, REG_ZERO); } // Returns the value of the given register @@ -561,7 +621,7 @@ class Doom3ShaderLayer : void setParseFlag(ParseFlags flag); private: - void assignExpression(const IShaderExpressionPtr& expression, + void assignExpression(const IShaderExpression::Ptr& expression, std::size_t& expressionIndex, std::size_t& registerIndex, std::size_t defaultRegisterIndex); void assignExpressionFromString(const std::string& expressionString, diff --git a/radiantcore/shaders/Doom3ShaderSystem.cpp b/radiantcore/shaders/Doom3ShaderSystem.cpp index 654540b957..1561453f48 100644 --- a/radiantcore/shaders/Doom3ShaderSystem.cpp +++ b/radiantcore/shaders/Doom3ShaderSystem.cpp @@ -296,7 +296,7 @@ TexturePtr Doom3ShaderSystem::loadTextureFromFile(const std::string& filename) return _textureManager->getBinding(filename); } -IShaderExpressionPtr Doom3ShaderSystem::createShaderExpressionFromString(const std::string& exprStr) +IShaderExpression::Ptr Doom3ShaderSystem::createShaderExpressionFromString(const std::string& exprStr) { return ShaderExpression::createFromString(exprStr); } @@ -353,7 +353,7 @@ void Doom3ShaderSystem::testShaderExpressionParsing() { // Test a few things std::string exprStr = "3"; - IShaderExpressionPtr expr; + IShaderExpression::Ptr expr; GET_EXPR_OR_RETURN; rMessage() << "Expression " << exprStr << ": " << expr->getValue(0) << std::endl; diff --git a/radiantcore/shaders/Doom3ShaderSystem.h b/radiantcore/shaders/Doom3ShaderSystem.h index 2700114e0e..a47ca9520f 100644 --- a/radiantcore/shaders/Doom3ShaderSystem.h +++ b/radiantcore/shaders/Doom3ShaderSystem.h @@ -106,7 +106,7 @@ class Doom3ShaderSystem : // Get default textures for D,B,S layers TexturePtr getDefaultInteractionTexture(IShaderLayer::Type t) override; - IShaderExpressionPtr createShaderExpressionFromString(const std::string& exprStr) override; + IShaderExpression::Ptr createShaderExpressionFromString(const std::string& exprStr) override; MaterialPtr createDefaultMaterial(const std::string& name) override; diff --git a/radiantcore/shaders/ShaderExpression.cpp b/radiantcore/shaders/ShaderExpression.cpp index 6c7362cfbd..8ecb6b3893 100644 --- a/radiantcore/shaders/ShaderExpression.cpp +++ b/radiantcore/shaders/ShaderExpression.cpp @@ -416,7 +416,7 @@ class ShaderExpressionParser } // namespace expressions -IShaderExpressionPtr ShaderExpression::createFromTokens(parser::DefTokeniser& tokeniser) +IShaderExpression::Ptr ShaderExpression::createFromTokens(parser::DefTokeniser& tokeniser) { // Create an adapter which takes care of splitting the tokens into finer grains // The incoming DefTokeniser is not splitting up expressions like "3*4" without any whitespace in them @@ -430,11 +430,11 @@ IShaderExpressionPtr ShaderExpression::createFromTokens(parser::DefTokeniser& to catch (parser::ParseException& ex) { rWarning() << "[shaders] " << ex.what() << std::endl; - return IShaderExpressionPtr(); + return IShaderExpression::Ptr(); } } -IShaderExpressionPtr ShaderExpression::createFromString(const std::string& exprStr) +IShaderExpression::Ptr ShaderExpression::createFromString(const std::string& exprStr) { parser::BasicDefTokeniser tokeniser(exprStr, parser::WHITESPACE, "{}(),"); return createFromTokens(tokeniser); diff --git a/radiantcore/shaders/ShaderExpression.h b/radiantcore/shaders/ShaderExpression.h index 099c79c1fb..431e9bf5ab 100644 --- a/radiantcore/shaders/ShaderExpression.h +++ b/radiantcore/shaders/ShaderExpression.h @@ -90,9 +90,9 @@ class ShaderExpression : return static_cast(oldIndex); } - static IShaderExpressionPtr createFromString(const std::string& exprStr); + static IShaderExpression::Ptr createFromString(const std::string& exprStr); - static IShaderExpressionPtr createFromTokens(parser::DefTokeniser& tokeniser); + static IShaderExpression::Ptr createFromTokens(parser::DefTokeniser& tokeniser); virtual std::string getExpressionString() override { @@ -232,12 +232,12 @@ class TableLookupExpression : { private: TableDefinitionPtr _tableDef; - IShaderExpressionPtr _lookupExpr; + IShaderExpression::Ptr _lookupExpr; public: // Pass the table and the expression used to perform the lookup TableLookupExpression(const TableDefinitionPtr& tableDef, - const IShaderExpressionPtr& lookupExpr) : + const IShaderExpression::Ptr& lookupExpr) : ShaderExpression(), _tableDef(tableDef), _lookupExpr(lookupExpr) @@ -285,14 +285,14 @@ class BinaryExpression : }; protected: - IShaderExpressionPtr _a; - IShaderExpressionPtr _b; + IShaderExpression::Ptr _a; + IShaderExpression::Ptr _b; Precedence _precedence; public: BinaryExpression(Precedence precedence, - const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : ShaderExpression(), _a(a), _b(b), @@ -304,12 +304,12 @@ class BinaryExpression : return _precedence; } - void setA(const IShaderExpressionPtr& a) + void setA(const IShaderExpression::Ptr& a) { _a = a; } - void setB(const IShaderExpressionPtr& b) + void setB(const IShaderExpression::Ptr& b) { _b = b; } @@ -321,8 +321,8 @@ class AddExpression : public BinaryExpression { public: - AddExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + AddExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(ADDITION, a, b) {} @@ -347,8 +347,8 @@ class SubtractExpression : public BinaryExpression { public: - SubtractExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + SubtractExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(SUBTRACTION, a, b) {} @@ -373,8 +373,8 @@ class MultiplyExpression : public BinaryExpression { public: - MultiplyExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + MultiplyExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(MULTIPLICATION, a, b) {} @@ -399,8 +399,8 @@ class DivideExpression : public BinaryExpression { public: - DivideExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + DivideExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(DIVISION, a, b) {} @@ -425,8 +425,8 @@ class ModuloExpression : public BinaryExpression { public: - ModuloExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + ModuloExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(MODULO, a, b) {} @@ -451,8 +451,8 @@ class LesserThanExpression : public BinaryExpression { public: - LesserThanExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + LesserThanExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(RELATIONAL_COMPARISON, a, b) {} @@ -477,8 +477,8 @@ class LesserThanOrEqualExpression : public BinaryExpression { public: - LesserThanOrEqualExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + LesserThanOrEqualExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(RELATIONAL_COMPARISON, a, b) {} @@ -503,8 +503,8 @@ class GreaterThanExpression : public BinaryExpression { public: - GreaterThanExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + GreaterThanExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(RELATIONAL_COMPARISON, a, b) {} @@ -529,8 +529,8 @@ class GreaterThanOrEqualExpression : public BinaryExpression { public: - GreaterThanOrEqualExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + GreaterThanOrEqualExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(RELATIONAL_COMPARISON, a, b) {} @@ -555,8 +555,8 @@ class EqualityExpression : public BinaryExpression { public: - EqualityExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + EqualityExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(EQUALITY_COMPARISON, a, b) {} @@ -581,8 +581,8 @@ class InequalityExpression : public BinaryExpression { public: - InequalityExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + InequalityExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(EQUALITY_COMPARISON, a, b) {} @@ -607,8 +607,8 @@ class LogicalAndExpression : public BinaryExpression { public: - LogicalAndExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + LogicalAndExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(LOGICAL_AND, a, b) {} @@ -633,8 +633,8 @@ class LogicalOrExpression : public BinaryExpression { public: - LogicalOrExpression(const IShaderExpressionPtr& a = IShaderExpressionPtr(), - const IShaderExpressionPtr& b = IShaderExpressionPtr()) : + LogicalOrExpression(const IShaderExpression::Ptr& a = IShaderExpression::Ptr(), + const IShaderExpression::Ptr& b = IShaderExpression::Ptr()) : BinaryExpression(LOGICAL_OR, a, b) {} diff --git a/radiantcore/shaders/ShaderTemplate.cpp b/radiantcore/shaders/ShaderTemplate.cpp index a0bec83dc5..12b23a50ec 100644 --- a/radiantcore/shaders/ShaderTemplate.cpp +++ b/radiantcore/shaders/ShaderTemplate.cpp @@ -71,7 +71,7 @@ NamedBindablePtr ShaderTemplate::getEditorTexture() return _editorTex; } -IShaderExpressionPtr ShaderTemplate::parseSingleExpressionTerm(parser::DefTokeniser& tokeniser) +IShaderExpression::Ptr ShaderTemplate::parseSingleExpressionTerm(parser::DefTokeniser& tokeniser) { std::string token = tokeniser.nextToken(); @@ -707,7 +707,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "red") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -720,7 +720,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "green") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -733,7 +733,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "blue") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -746,7 +746,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "alpha") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -760,13 +760,13 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, else if (token == "color") { // color , , , - IShaderExpressionPtr red = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr red = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr green = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr green = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr blue = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr blue = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr alpha = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr alpha = ShaderExpression::createFromTokens(tokeniser); if (red && green && blue && alpha) { @@ -783,7 +783,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, else if (token == "rgb") { // Get the colour value - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -796,7 +796,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "rgba") { - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -879,7 +879,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, else if (token == "alphatest") { // Get the alphatest expression - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); if (expr) { @@ -894,9 +894,9 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "scale") { - IShaderExpressionPtr xScaleExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr xScaleExpr = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr yScaleExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr yScaleExpr = ShaderExpression::createFromTokens(tokeniser); if (xScaleExpr && yScaleExpr) { @@ -909,9 +909,9 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "centerscale") { - IShaderExpressionPtr xScaleExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr xScaleExpr = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr yScaleExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr yScaleExpr = ShaderExpression::createFromTokens(tokeniser); if (xScaleExpr && yScaleExpr) { @@ -925,9 +925,9 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "translate" || token == "scroll") { - IShaderExpressionPtr xTranslateExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr xTranslateExpr = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr yTranslateExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr yTranslateExpr = ShaderExpression::createFromTokens(tokeniser); if (xTranslateExpr && yTranslateExpr) { @@ -940,9 +940,9 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "shear") { - IShaderExpressionPtr xShearExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr xShearExpr = ShaderExpression::createFromTokens(tokeniser); tokeniser.assertNextToken(","); - IShaderExpressionPtr yShearExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr yShearExpr = ShaderExpression::createFromTokens(tokeniser); if (xShearExpr && yShearExpr) { @@ -955,7 +955,7 @@ bool ShaderTemplate::parseStageModifiers(parser::DefTokeniser& tokeniser, } else if (token == "rotate") { - IShaderExpressionPtr rotExpr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr rotExpr = ShaderExpression::createFromTokens(tokeniser); if (rotExpr) { @@ -1203,7 +1203,7 @@ bool ShaderTemplate::parseCondition(parser::DefTokeniser& tokeniser, const std:: if (token == "if") { // Parse condition - IShaderExpressionPtr expr = ShaderExpression::createFromTokens(tokeniser); + IShaderExpression::Ptr expr = ShaderExpression::createFromTokens(tokeniser); _currentLayer->setCondition(expr); diff --git a/radiantcore/shaders/ShaderTemplate.h b/radiantcore/shaders/ShaderTemplate.h index adb0a9d664..b39f486183 100644 --- a/radiantcore/shaders/ShaderTemplate.h +++ b/radiantcore/shaders/ShaderTemplate.h @@ -67,7 +67,7 @@ class ShaderTemplate final Material::SurfaceType _surfaceType; Material::DeformType _deformType; - std::vector _deformExpressions; + std::vector _deformExpressions; std::string _deformDeclName; // The spectrum this shader is responding to (or emitting in the case of light materials) @@ -219,12 +219,12 @@ class ShaderTemplate final return _deformType; } - IShaderExpressionPtr getDeformExpression(std::size_t index) + IShaderExpression::Ptr getDeformExpression(std::size_t index) { if (!_parsed) parseDefinition(); assert(index >= 0 && index < 3); - return index < _deformExpressions.size() ? _deformExpressions[index] : IShaderExpressionPtr(); + return index < _deformExpressions.size() ? _deformExpressions[index] : IShaderExpression::Ptr(); } std::string getDeformDeclName() @@ -368,7 +368,7 @@ class ShaderTemplate final bool parseSurfaceFlags(parser::DefTokeniser&, const std::string&); bool parseMaterialType(parser::DefTokeniser&, const std::string&); bool parseCondition(parser::DefTokeniser&, const std::string&); - IShaderExpressionPtr parseSingleExpressionTerm(parser::DefTokeniser& tokeniser); + IShaderExpression::Ptr parseSingleExpressionTerm(parser::DefTokeniser& tokeniser); bool saveLayer();