Skip to content

Commit

Permalink
Motion Blur initial implementation.
Browse files Browse the repository at this point in the history
  • Loading branch information
MaurycyLiebner committed Mar 11, 2020
1 parent c8a99cf commit f2b37f0
Show file tree
Hide file tree
Showing 30 changed files with 405 additions and 161 deletions.
4 changes: 3 additions & 1 deletion examples/rasterEffects/dabTest/dabtest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,9 @@ DabTest000::DabTest000() :
}

stdsptr<RasterEffectCaller> DabTest000::getEffectCaller(
const qreal relFrame, const qreal resolution, const qreal influence) const {
const qreal relFrame, const qreal resolution,
const qreal influence, BoxRenderData * const data) const {
Q_UNUSED(data)
const qreal radius = mRadius->getEffectiveValue(relFrame)*resolution*influence;
const qreal hardness = mHardness->getEffectiveValue(relFrame);

Expand Down
2 changes: 1 addition & 1 deletion examples/rasterEffects/dabTest/dabtest.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ class DabTest000 : public CustomRasterEffect {

stdsptr<RasterEffectCaller> getEffectCaller(
const qreal relFrame, const qreal resolution,
const qreal influence) const;
const qreal influence, BoxRenderData * const data) const;

CustomIdentifier getIdentifier() const;
private:
Expand Down
10 changes: 5 additions & 5 deletions examples/rasterEffects/eBlur/eblur.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,9 @@ eBlur::eBlur() : CustomRasterEffect(eName().toLower(),
}

stdsptr<RasterEffectCaller> eBlur::getEffectCaller(
const qreal relFrame, const qreal resolution, const qreal influence) const {
const qreal relFrame, const qreal resolution,
const qreal influence, BoxRenderData * const data) const {
Q_UNUSED(data)
const qreal radius = mRadius->getEffectiveValue(relFrame)*resolution*influence;
if(isZero4Dec(radius)) return nullptr;
return enve::make_shared<eBlurCaller>(instanceHwSupport(), radius);
Expand Down Expand Up @@ -116,12 +118,12 @@ void eBlurCaller::processCpu(CpuRenderTools &renderTools,
paint.setImageFilter(filter);

SkBitmap tile;
renderTools.requestBackupBitmap().extractSubset(&tile, data.fTexTile);
renderTools.fDstBtmp.extractSubset(&tile, data.fTexTile);
SkCanvas canvas(tile);
canvas.clear(SK_ColorTRANSPARENT);

const int radCeil = static_cast<int>(ceil(mRadius));
const auto& srcBtmp = renderTools.fSrcDst;
const auto& srcBtmp = renderTools.fSrcBtmp;
const auto& texTile = data.fTexTile;
auto srcRect = texTile.makeOutset(radCeil, radCeil);
if(srcRect.intersect(srcRect, srcBtmp.bounds())) {
Expand All @@ -131,6 +133,4 @@ void eBlurCaller::processCpu(CpuRenderTools &renderTools,
srcRect.left() - texTile.left(),
srcRect.top() - texTile.top(), &paint);
}

renderTools.swap();
}
6 changes: 3 additions & 3 deletions examples/rasterEffects/eBlur/eblur.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ class eBlur : public CustomRasterEffect {
public:
eBlur();

stdsptr<RasterEffectCaller> getEffectCaller(const qreal relFrame,
const qreal resolution,
const qreal influence) const;
stdsptr<RasterEffectCaller> getEffectCaller(
const qreal relFrame, const qreal resolution,
const qreal influence, BoxRenderData * const data) const;
QMargins getMargin() const;
bool forceMargin() const { return true; }

Expand Down
9 changes: 4 additions & 5 deletions examples/rasterEffects/eShadow/eshadow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ eShadow::eShadow() :

stdsptr<RasterEffectCaller>
eShadow::getEffectCaller(const qreal relFrame, const qreal resolution,
const qreal influence) const {
const qreal influence, BoxRenderData * const data) const {
Q_UNUSED(data)
const qreal blur = mBlurRadius->getEffectiveValue(relFrame)*resolution;
const QColor color = mColor->getColor(relFrame);
const QPointF trans = mTranslation->getEffectiveValue(relFrame)*resolution;
Expand Down Expand Up @@ -141,12 +142,12 @@ void eShadowCaller::processCpu(CpuRenderTools &renderTools,
Q_UNUSED(data)

SkBitmap tile;
renderTools.requestBackupBitmap().extractSubset(&tile, data.fTexTile);
renderTools.fDstBtmp.extractSubset(&tile, data.fTexTile);
SkCanvas canvas(tile);
canvas.clear(SK_ColorTRANSPARENT);

const int radCeil = static_cast<int>(ceil(mRadius));
const auto& srcBtmp = renderTools.fSrcDst;
const auto& srcBtmp = renderTools.fSrcBtmp;
const auto& texTile = data.fTexTile;
auto srcRect = texTile.makeOutset(radCeil, radCeil);
if(srcRect.intersect(srcRect, srcBtmp.bounds())) {
Expand All @@ -160,6 +161,4 @@ void eShadowCaller::processCpu(CpuRenderTools &renderTools,
setupPaint(paint);
canvas.drawBitmap(tileSrc, drawX, drawY, &paint);
}

renderTools.swap();
}
2 changes: 1 addition & 1 deletion examples/rasterEffects/eShadow/eshadow.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ class eShadow : public CustomRasterEffect {

stdsptr<RasterEffectCaller> getEffectCaller(
const qreal relFrame, const qreal resolution,
const qreal influence) const;
const qreal influence, BoxRenderData* const data) const;
bool forceMargin() const { return true; }

CustomIdentifier getIdentifier() const;
Expand Down
68 changes: 43 additions & 25 deletions src/core/Boxes/boundingbox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -468,13 +468,23 @@ void BoundingBox::planUpdate(const UpdateReason reason) {
}
}


stdsptr<BoxRenderData> BoundingBox::queExternalRender(const qreal relFrame) {
const auto renderData = createRenderData(relFrame);
if(!renderData) return nullptr;
renderData->fParentIsTarget = false;
setupRenderData(relFrame, renderData.get(), getParentScene());
renderData->queTask();
return renderData;
}

stdsptr<BoxRenderData> BoundingBox::queRender(const qreal relFrame) {
const auto currentRenderData = updateCurrentRenderData(relFrame);
if(!currentRenderData) return nullptr;
setupRenderData(relFrame, currentRenderData, getParentScene());
const auto currentSPtr = enve::shared(currentRenderData);
currentSPtr->queTask();
return currentSPtr;
const auto renderData = updateCurrentRenderData(relFrame);
if(!renderData) return nullptr;
setupRenderData(relFrame, renderData, getParentScene());
const auto renderDataSPtr = enve::shared(renderData);
renderDataSPtr->queTask();
return renderDataSPtr;
}

void BoundingBox::queTasks() {
Expand All @@ -486,10 +496,15 @@ void BoundingBox::queTasks() {
queRender(relFrame);
}

BoxRenderData *BoundingBox::updateCurrentRenderData(const qreal relFrame) {
stdsptr<BoxRenderData> BoundingBox::createRenderData(const qreal relFrame) {
const auto renderData = createRenderData();
if(!renderData) return nullptr;
renderData->fRelFrame = relFrame;
return renderData;
}

BoxRenderData *BoundingBox::updateCurrentRenderData(const qreal relFrame) {
const auto renderData = createRenderData(relFrame);
mRenderDataHandler.addItemAtRelFrame(renderData);
return renderData.get();
}
Expand Down Expand Up @@ -835,13 +850,6 @@ void BoundingBox::requestGlobalPivotUpdateIfSelected() {
if(isSelected()) emit globalPivotInfluenced();
}

void BoundingBox::getMotionBlurProperties(QList<Property*> &list) const {
list.append(mTransformAnimator->getScaleAnimator());
list.append(mTransformAnimator->getPosAnimator());
list.append(mTransformAnimator->getPivotAnimator());
list.append(mTransformAnimator->getRotAnimator());
}

void BoundingBox::applyParentTransform() {
if(!mParentTransform) return;
const auto parentTransform = mParentTransform->getRelativeTransform();
Expand Down Expand Up @@ -1000,15 +1008,23 @@ void BoundingBox::prp_setupTreeViewMenu(PropertyMenu * const menu) {
setupCanvasMenu(menu->addMenu("Actions"));
}

FrameRange BoundingBox::getFirstAndLastIdenticalForMotionBlur(
const int relFrame, const bool takeAncestorsIntoAccount) {
FrameRange range{FrameRange::EMIN, FrameRange::EMAX};
void BoundingBox::getMotionBlurProperties(QList<Property*> &list) const {
list.append(mTransformAnimator->getScaleAnimator());
list.append(mTransformAnimator->getPosAnimator());
list.append(mTransformAnimator->getPivotAnimator());
list.append(mTransformAnimator->getRotAnimator());
list.append(mTransformAnimator->getShearAnimator());
}

FrameRange BoundingBox::getMotionBlurIdenticalRange(
const qreal relFrame, const bool inheritedTransform) {
FrameRange range(FrameRange::EMINMAX);
if(isVisible()) {
const auto durRect = getDurationRectangle();
if(isFrameInDurationRect(relFrame)) {
QList<Property*> propertiesT;
getMotionBlurProperties(propertiesT);
for(const auto& child : propertiesT) {
if(isFrameFInDurationRect(relFrame)) {
QList<Property*> props;
getMotionBlurProperties(props);
for(const auto& child : props) {
if(range.isUnary()) break;
auto childRange = child->prp_getIdenticalRelRange(relFrame);
range *= childRange;
Expand All @@ -1023,13 +1039,15 @@ FrameRange BoundingBox::getFirstAndLastIdenticalForMotionBlur(
}
}
} else {
return {FrameRange::EMIN, FrameRange::EMAX};
return FrameRange::EMINMAX;
}
const auto parent = getParentGroup();
if(!parent || takeAncestorsIntoAccount) return range;
if(!parent || !inheritedTransform) return range;
if(range.isUnary()) return range;
const int parentRel = parent->prp_absFrameToRelFrame(prp_relFrameToAbsFrame(relFrame));
auto parentRange = parent->BoundingBox::getFirstAndLastIdenticalForMotionBlur(parentRel);
const qreal absFrame = prp_relFrameToAbsFrameF(relFrame);
const qreal parentRel = parent->prp_absFrameToRelFrameF(absFrame);
auto parentRange = parent->BoundingBox::getMotionBlurIdenticalRange(
parentRel, inheritedTransform);

return range*parentRange;
}
Expand Down
6 changes: 4 additions & 2 deletions src/core/Boxes/boundingbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,8 @@ class BoundingBox : public eBoxOrSound {
virtual void updateCurrentPreviewDataFromRenderData(
BoxRenderData* renderData);

virtual FrameRange getFirstAndLastIdenticalForMotionBlur(
const int relFrame, const bool takeAncestorsIntoAccount = true);
virtual FrameRange getMotionBlurIdenticalRange(
const qreal relFrame, const bool inheritedTransform);

virtual HardwareSupport hardwareSupport() const {
return HardwareSupport::cpuPreffered;
Expand Down Expand Up @@ -250,7 +250,9 @@ class BoundingBox : public eBoxOrSound {

BasicTransformAnimator *getTransformAnimator() const;

stdsptr<BoxRenderData> createRenderData(const qreal relFrame);
stdsptr<BoxRenderData> queRender(const qreal relFrame);
stdsptr<BoxRenderData> queExternalRender(const qreal relFrame);

void setupWithoutRasterEffects(const qreal relFrame,
BoxRenderData * const data,
Expand Down
6 changes: 6 additions & 0 deletions src/core/Boxes/boxrenderdata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ void BoxRenderData::processGpu(QGL33 * const gl,
fGlobalRect.width(), fGlobalRect.height(),
kRGBA_8888_SkColorType, GrMipMapped::kNo,
GrRenderable::kYes);
if(!grTex.isValid()) return;
const auto surf = SkSurface::MakeFromBackendTexture(
grContext, grTex, kTopLeft_GrSurfaceOrigin, 0,
kRGBA_8888_SkColorType, nullptr, nullptr);
Expand All @@ -121,6 +122,11 @@ void BoxRenderData::processGpu(QGL33 * const gl,
mEffectsRenderer.nextHardwareSupport() == HardwareSupport::cpuOnly)
fRenderedImage = fRenderedImage->makeRasterImage();
else mEffectsRenderer.processGpu(gl, context, this);
// if(mEffectsRenderer.isEmpty()) return;
// const auto nextEffectHw = mEffectsRenderer.nextHardwareSupport();
// if(nextEffectHw != HardwareSupport::cpuOnly) {
// mEffectsRenderer.processGpu(gl, context, this);
// }
}
#include "textboxrenderdata.h"
void BoxRenderData::process() {
Expand Down
47 changes: 12 additions & 35 deletions src/core/Boxes/containerbox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -481,43 +481,20 @@ FrameRange ContainerBox::prp_getIdenticalRelRange(const int relFrame) const {
return range;
}

FrameRange ContainerBox::getFirstAndLastIdenticalForMotionBlur(
const int relFrame, const bool takeAncestorsIntoAccount) {
FrameRange range{FrameRange::EMIN, FrameRange::EMAX};
if(isVisible()) {
const auto durRect = getDurationRectangle();
if(isFrameInDurationRect(relFrame)) {
QList<Property*> propertiesT;
getMotionBlurProperties(propertiesT);
for(const auto& child : propertiesT) {
if(range.isUnary()) return range;
auto childRange = child->prp_getIdenticalRelRange(relFrame);
range *= childRange;
}

for(const auto &child : mContainedBoxes) {
if(range.isUnary()) return range;
auto childRange = child->getFirstAndLastIdenticalForMotionBlur(
relFrame, false);
range *= childRange;
}

if(durRect) range *= durRect->getRelFrameRange();
} else {
if(relFrame > durRect->getMaxRelFrame()) {
range = durRect->getRelFrameRangeToTheRight();
} else if(relFrame < durRect->getMinRelFrame()) {
range = durRect->getRelFrameRangeToTheLeft();
}
FrameRange ContainerBox::getMotionBlurIdenticalRange(
const qreal relFrame, const bool inheritedTransform) {
FrameRange range = BoundingBox::getMotionBlurIdenticalRange(
relFrame, inheritedTransform);
if(isVisible() && isFrameInDurationRect(relFrame)) {
const qreal absFrame = prp_relFrameToAbsFrameF(relFrame);
for(const auto &child : mContainedBoxes) {
if(range.isUnary()) return range;
const qreal childRel = child->prp_absFrameToRelFrameF(absFrame);
auto childRange = child->getMotionBlurIdenticalRange(childRel, false);
range *= childRange;
}
}
const auto parent = getParentGroup();
if(!parent || takeAncestorsIntoAccount) return range;
if(range.isUnary()) return range;
int parentRel = parent->prp_absFrameToRelFrame(
prp_relFrameToAbsFrame(relFrame));
auto parentRange = parent->BoundingBox::getFirstAndLastIdenticalForMotionBlur(parentRel);
return range*parentRange;
return range;
}


Expand Down
4 changes: 2 additions & 2 deletions src/core/Boxes/containerbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ class ContainerBox : public BoxWithPathEffects {
void setupCanvasMenu(PropertyMenu * const menu);

FrameRange prp_getIdenticalRelRange(const int relFrame) const;
FrameRange getFirstAndLastIdenticalForMotionBlur(
const int relFrame, const bool takeAncestorsIntoAccount = true);
FrameRange getMotionBlurIdenticalRange(
const qreal relFrame, const bool inheritedTransform);

void prp_afterFrameShiftChanged(const FrameRange& oldAbsRange,
const FrameRange& newAbsRange);
Expand Down
3 changes: 1 addition & 2 deletions src/core/Boxes/effectsrenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,10 @@ void EffectsRenderer::processGpu(QGL33 * const gl,

#include "effectsubtaskspawner.h"
void EffectsRenderer::processCpu(BoxRenderData * const boxData) {
const auto& effect = mEffects.at(mCurrentId);
const auto& effect = mEffects.at(mCurrentId++);

Q_ASSERT(effect->hardwareSupport() != HardwareSupport::gpuOnly);
EffectSubTaskSpawner::sSpawn(effect, boxData->ref<BoxRenderData>());
mCurrentId++;
}

void EffectsRenderer::setBaseGlobalRect(SkIRect &currRect,
Expand Down
Loading

0 comments on commit f2b37f0

Please sign in to comment.