Skip to content

Commit

Permalink
ShaderEffects wip
Browse files Browse the repository at this point in the history
  • Loading branch information
rodlie committed Jun 8, 2024
1 parent 70f9a5b commit c2cc049
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 47 deletions.
32 changes: 7 additions & 25 deletions src/core/ShaderEffects/shadereffect.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,34 +48,16 @@ void ShaderEffect::writeIdentifierXEV(QDomElement& ele) const {
mCreator->writeIdentifierXEV(ele);
}

stdsptr<RasterEffectCaller> ShaderEffect::getEffectCaller(
const qreal relFrame, const qreal resolution,
const qreal influence, BoxRenderData * const data) const {
stdsptr<RasterEffectCaller> ShaderEffect::getEffectCaller(const qreal relFrame,
const qreal resolution,
const qreal influence,
BoxRenderData * const data) const
{
Q_UNUSED(data)
std::unique_ptr<ShaderEffectJS> engineUPtr;
takeJSEngine(engineUPtr);
ShaderEffectJS& engine = *engineUPtr;
const auto effect = enve::make_shared<ShaderEffectCaller>(
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<ShaderEffectCaller>(std::move(engineUPtr), *mProgram);
effect->calc(this, relFrame, resolution, influence);
return effect;
}

Expand Down
49 changes: 27 additions & 22 deletions src/core/ShaderEffects/shadereffectcaller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
6 changes: 6 additions & 0 deletions src/core/ShaderEffects/shadereffectcaller.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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; }

Expand Down
25 changes: 25 additions & 0 deletions src/core/ShaderEffects/shadereffectjs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include <QPointF>
#include <QColor>
#include <QRegularExpression>
#include <QtMath>

#include "exceptions.h"
#include "threadsafeqjsengine.h"
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/core/ShaderEffects/shadereffectjs.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@

#include <memory>
#include <QJSEngine>
#include <QMargins>

class CORE_EXPORT ShaderEffectJS {
public:
Expand Down Expand Up @@ -66,6 +67,7 @@ class CORE_EXPORT ShaderEffectJS {

const bool fMargin;
QJSValue getMarginValue();
const QMargins getMargins();

void setSceneRect(const SkIRect& rect);

Expand Down

0 comments on commit c2cc049

Please sign in to comment.