/
redgpu
/
ezEngine
Обзор
Документация
Войти
/
redgpu
/
ezEngine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
Code/Engine/Foundation/CodeUtils/Implementation/MathExpression.cpp
75 строк
2 KB
C-Core
Array usage cleanup (#1864)
11 мар 2026, 23:44
Не верифицирован
11 мар 2026, 23:44
f7cb730
Код
Авторство
О чём код?
#include <Foundation/FoundationPCH.h> #include <Foundation/CodeUtils/Expression/ExpressionCompiler.h> #include <Foundation/CodeUtils/Expression/ExpressionParser.h> #include <Foundation/CodeUtils/MathExpression.h> static ezHashedString s_sOutput = ezMakeHashedString("output"); ezMathExpression::ezMathExpression() = default; ezMathExpression::ezMathExpression(ezStringView sExpressionString) { Reset(sExpressionString); } void ezMathExpression::Reset(ezStringView sExpressionString) { m_sOriginalExpression.Assign(sExpressionString); m_ByteCode.Clear(); m_bIsValid = false; if (sExpressionString.IsEmpty()) return; ezStringBuilder tmp = s_sOutput.GetView(); tmp.Append(" = ", sExpressionString); ezExpression::StreamDesc outputs[] = { {s_sOutput, ezProcessingStream::DataType::Float}, }; ezExpressionParser parser; ezExpressionParser::Options parserOptions; parserOptions.m_bTreatUnknownVariablesAsInputs = true; ezExpressionAST ast; if (parser.Parse(tmp, ezArrayPtr<ezExpression::StreamDesc>(), outputs, parserOptions, ast).Failed()) return; ezExpressionCompiler compiler; if (compiler.Compile(ast, m_ByteCode).Failed()) return; m_bIsValid = true; } float ezMathExpression::Evaluate(ezArrayPtr<Input> inputs) { float fOutput = ezMath::NaN<float>(); if (!IsValid() || m_ByteCode.IsEmpty()) { ezLog::Error("Can't evaluate invalid math expression '{0}'", m_sOriginalExpression); return fOutput; } ezTempHybridArray<ezProcessingStream, 8> inputStreams; for (auto& input : inputs) { if (input.m_sName.IsEmpty()) continue; inputStreams.PushBack(ezProcessingStream(input.m_sName, ezMakeArrayPtr(&input.m_fValue, 1).ToByteArray(), ezProcessingStream::DataType::Float)); } ezProcessingStream outputStream(s_sOutput, ezMakeArrayPtr(&fOutput, 1).ToByteArray(), ezProcessingStream::DataType::Float); ezArrayPtr<ezProcessingStream> outputStreams = ezMakeArrayPtr(&outputStream, 1); if (m_VM.Execute(m_ByteCode, inputStreams, outputStreams, 1).Failed()) { ezLog::Error("Failed to execute expression VM"); } return fOutput; }