From c2cc0493f39279c5d65dad3f0d3896cd453375ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole-Andr=C3=A9=20Rodlie?= Date: Sun, 9 Jun 2024 00:54:25 +0200 Subject: [PATCH] ShaderEffects wip --- src/core/ShaderEffects/shadereffect.cpp | 32 +++--------- src/core/ShaderEffects/shadereffectcaller.cpp | 49 ++++++++++--------- src/core/ShaderEffects/shadereffectcaller.h | 6 +++ src/core/ShaderEffects/shadereffectjs.cpp | 25 ++++++++++ src/core/ShaderEffects/shadereffectjs.h | 2 + 5 files changed, 67 insertions(+), 47 deletions(-) diff --git a/src/core/ShaderEffects/shadereffect.cpp b/src/core/ShaderEffects/shadereffect.cpp index ad3f66f2d..12feea556 100644 --- a/src/core/ShaderEffects/shadereffect.cpp +++ b/src/core/ShaderEffects/shadereffect.cpp @@ -48,34 +48,16 @@ void ShaderEffect::writeIdentifierXEV(QDomElement& ele) const { mCreator->writeIdentifierXEV(ele); } -stdsptr ShaderEffect::getEffectCaller( - const qreal relFrame, const qreal resolution, - const qreal influence, BoxRenderData * const data) const { +stdsptr ShaderEffect::getEffectCaller(const qreal relFrame, + const qreal resolution, + const qreal influence, + BoxRenderData * const data) const +{ Q_UNUSED(data) std::unique_ptr engineUPtr; takeJSEngine(engineUPtr); - ShaderEffectJS& engine = *engineUPtr; - const auto effect = enve::make_shared( - std::move(engineUPtr), *mProgram); - - QJSValueList setterArgs; - UniformSpecifiers& uniSpecs = effect->mUniformSpecifiers; - const int argsCount = mProgram->fPropUniLocs.count(); - for(int i = 0; i < argsCount; i++) { - const GLint loc = mProgram->fPropUniLocs.at(i); - const auto prop = ca_getChildAt(i); - const auto& uniformC = mProgram->fPropUniCreators.at(i); - uniformC->create(engine, loc, prop, relFrame, - resolution, influence, - setterArgs, uniSpecs); - } - engine.setValues(setterArgs); - const int valsCount = mProgram->fValueHandlers.count(); - for(int i = 0; i < valsCount; i++) { - const GLint loc = mProgram->fValueLocs.at(i); - const auto& value = mProgram->fValueHandlers.at(i); - uniSpecs << value->create(loc, &engine.getGlValueGetter(i)); - } + const auto effect = enve::make_shared(std::move(engineUPtr), *mProgram); + effect->calc(this, relFrame, resolution, influence); return effect; } diff --git a/src/core/ShaderEffects/shadereffectcaller.cpp b/src/core/ShaderEffects/shadereffectcaller.cpp index bf4e0aa0d..59ebe523c 100644 --- a/src/core/ShaderEffects/shadereffectcaller.cpp +++ b/src/core/ShaderEffects/shadereffectcaller.cpp @@ -57,31 +57,36 @@ void ShaderEffectCaller::processGpu(QGL33 * const gl, renderTools.swapTextures(); } +void ShaderEffectCaller::calc(const ShaderEffect *pEff, + const qreal relFrame, + const qreal resolution, + const qreal influence) +{ + if (!pEff) { return; } + QJSValueList setterArgs; + UniformSpecifiers& uniSpecs = mUniformSpecifiers; + const int argsCount = mProgram.fPropUniLocs.count(); + for (int i = 0; i < argsCount; i++) { + const GLint loc = mProgram.fPropUniLocs.at(i); + const auto prop = pEff->ca_getChildAt(i); + const auto& uniformC = mProgram.fPropUniCreators.at(i); + uniformC->create(getJSEngine(), loc, prop, relFrame, + resolution, influence, + setterArgs, uniSpecs); + } + mEngine->setValues(setterArgs); + const int valsCount = mProgram.fValueHandlers.count(); + for (int i = 0; i < valsCount; i++) { + const GLint loc = mProgram.fValueLocs.at(i); + const auto& value = mProgram.fValueHandlers.at(i); + uniSpecs << value->create(loc, &getJSEngine().getGlValueGetter(i)); + } +} + QMargins ShaderEffectCaller::getMargin(const SkIRect &srcRect) { mEngine->setSceneRect(srcRect); mEngine->evaluate(); - const auto jsVal = mEngine->getMarginValue(); - if(jsVal.isNumber()) { - return QMargins() + qCeil(jsVal.toNumber()); - } else if(jsVal.isArray()) { - const int len = jsVal.property("length").toInt(); - if(len == 2) { - const int valX = qCeil(jsVal.property(0).toNumber()); - const int valY = qCeil(jsVal.property(1).toNumber()); - - return QMargins(valX, valY, valX, valY); - } else if(len == 4) { - const int valLeft = qCeil(jsVal.property(0).toNumber()); - const int valTop = qCeil(jsVal.property(1).toNumber()); - const int valRight = qCeil(jsVal.property(2).toNumber()); - const int valBottom = qCeil(jsVal.property(3).toNumber()); - - return QMargins(valLeft, valTop, valRight, valBottom); - } else { - RuntimeThrow("Invalid Margin script"); - } - } else RuntimeThrow("Invalid Margin script result type"); - return QMargins(); + return mEngine->getMargins(); } void ShaderEffectCaller::setupProgram(QGL33 * const gl) { diff --git a/src/core/ShaderEffects/shadereffectcaller.h b/src/core/ShaderEffects/shadereffectcaller.h index 654a5e3a6..e161c4599 100644 --- a/src/core/ShaderEffects/shadereffectcaller.h +++ b/src/core/ShaderEffects/shadereffectcaller.h @@ -26,6 +26,7 @@ #ifndef SHADEREFFECTCALLER_H #define SHADEREFFECTCALLER_H #include "RasterEffects/rastereffectcaller.h" +#include "ShaderEffects/shadereffect.h" #include "shadereffectprogram.h" #include "../gpurendertools.h" #include "shadereffectjs.h" @@ -40,6 +41,11 @@ class CORE_EXPORT ShaderEffectCaller : public RasterEffectCaller { void processGpu(QGL33 * const gl, GpuRenderTools& renderTools); + void calc(const ShaderEffect * pEff, + const qreal relFrame, + const qreal resolution, + const qreal influence); + ShaderEffectJS& getJSEngine() { return *mEngine; } diff --git a/src/core/ShaderEffects/shadereffectjs.cpp b/src/core/ShaderEffects/shadereffectjs.cpp index b13fe7fe1..05a2a36ba 100644 --- a/src/core/ShaderEffects/shadereffectjs.cpp +++ b/src/core/ShaderEffects/shadereffectjs.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include "exceptions.h" #include "threadsafeqjsengine.h" @@ -114,6 +115,30 @@ QJSValue ShaderEffectJS::getMarginValue() return ThreadSafeQJSEngine::call(&mEngine, [&]{ return mMarginGetter.call(); }); } +const QMargins ShaderEffectJS::getMargins() +{ + const auto jsVal = getMarginValue(); + if (jsVal.isNumber()) { + return QMargins() + qCeil(jsVal.toNumber()); + } else if (jsVal.isArray()) { + const int len = jsVal.property("length").toInt(); + if (len == 2) { + const int valX = qCeil(jsVal.property(0).toNumber()); + const int valY = qCeil(jsVal.property(1).toNumber()); + return QMargins(valX, valY, valX, valY); + } else if (len == 4) { + const int valLeft = qCeil(jsVal.property(0).toNumber()); + const int valTop = qCeil(jsVal.property(1).toNumber()); + const int valRight = qCeil(jsVal.property(2).toNumber()); + const int valBottom = qCeil(jsVal.property(3).toNumber()); + return QMargins(valLeft, valTop, valRight, valBottom); + } else { + RuntimeThrow("Invalid Margin script"); + } + } else { RuntimeThrow("Invalid Margin script result type"); } + return QMargins(); +} + void ShaderEffectJS::setSceneRect(const SkIRect& rect) { QJSValueList args; diff --git a/src/core/ShaderEffects/shadereffectjs.h b/src/core/ShaderEffects/shadereffectjs.h index 7eb5ba9e6..28fcf98dc 100644 --- a/src/core/ShaderEffects/shadereffectjs.h +++ b/src/core/ShaderEffects/shadereffectjs.h @@ -32,6 +32,7 @@ #include #include +#include class CORE_EXPORT ShaderEffectJS { public: @@ -66,6 +67,7 @@ class CORE_EXPORT ShaderEffectJS { const bool fMargin; QJSValue getMarginValue(); + const QMargins getMargins(); void setSceneRect(const SkIRect& rect);