diff --git a/include/Nazara/Shader/ShaderLangTokenList.hpp b/include/Nazara/Shader/ShaderLangTokenList.hpp index 8943f7e1f..05d60d111 100644 --- a/include/Nazara/Shader/ShaderLangTokenList.hpp +++ b/include/Nazara/Shader/ShaderLangTokenList.hpp @@ -42,6 +42,7 @@ NAZARA_SHADERLANG_TOKEN(LogicalAnd) NAZARA_SHADERLANG_TOKEN(LogicalOr) NAZARA_SHADERLANG_TOKEN(Multiply) NAZARA_SHADERLANG_TOKEN(Minus) +NAZARA_SHADERLANG_TOKEN(Not) NAZARA_SHADERLANG_TOKEN(NotEqual) NAZARA_SHADERLANG_TOKEN(Plus) NAZARA_SHADERLANG_TOKEN(OpenCurlyBracket) diff --git a/src/Nazara/Shader/ShaderLangLexer.cpp b/src/Nazara/Shader/ShaderLangLexer.cpp index 07b5b6989..875a0e946 100644 --- a/src/Nazara/Shader/ShaderLangLexer.cpp +++ b/src/Nazara/Shader/ShaderLangLexer.cpp @@ -303,6 +303,21 @@ namespace Nz::ShaderLang break; } + case '!': + { + char next = Peek(); + if (next == '=') + { + currentPos++; + tokenType = TokenType::NotEqual; + } + else + tokenType = TokenType::Not; + + break; + } + + case '+': tokenType = TokenType::Plus; break; case '*': tokenType = TokenType::Multiply; break; case ':': tokenType = TokenType::Colon; break; diff --git a/src/Nazara/Shader/ShaderLangParser.cpp b/src/Nazara/Shader/ShaderLangParser.cpp index 327153b22..3d7fc4a74 100644 --- a/src/Nazara/Shader/ShaderLangParser.cpp +++ b/src/Nazara/Shader/ShaderLangParser.cpp @@ -1117,6 +1117,14 @@ namespace Nz::ShaderLang return ShaderBuilder::Unary(ShaderAst::UnaryType::Plus, std::move(expr)); } + case TokenType::Not: + { + Consume(); + ShaderAst::ExpressionPtr expr = ParsePrimaryExpression(); + + return ShaderBuilder::Unary(ShaderAst::UnaryType::LogicalNot, std::move(expr)); + } + case TokenType::OpenParenthesis: return ParseParenthesisExpression();