From 4734f86618d2e60498bad696419edaccb7ee17b3 Mon Sep 17 00:00:00 2001 From: shun-iwasawa Date: Mar 26 2018 06:30:24 +0000 Subject: fix barrel distort fx (#1881) --- diff --git a/toonz/sources/stdfx/iwa_barreldistortfx.cpp b/toonz/sources/stdfx/iwa_barreldistortfx.cpp index dc1b53b..ed80d1e 100644 --- a/toonz/sources/stdfx/iwa_barreldistortfx.cpp +++ b/toonz/sources/stdfx/iwa_barreldistortfx.cpp @@ -163,18 +163,18 @@ public: void doCompute_CPU(TPointD &point, TPointD &sourcePoint, float dist, float distAspect, float4 *source_host, float4 *result_host, - TDimensionI &outDim, TDimensionI &sourceDim, - TPointD &offset, float precision, double vignetteAmount, - double vignetteGamma, double vignetteMidpoint, - float scale); + TRectD &rectOut, TDimensionI &sourceDim, TPointD &offset, + float precision, double vignetteAmount, + double vignetteGamma, double vignetteMidpoint, float scale, + const TRenderSettings &ri); void doCompute_chroma_CPU(TPointD &point, TPointD &sourcePoint, float dist, float distAspect, float chroma, float4 *source_host, - float4 *result_host, TDimensionI &outDim, + float4 *result_host, TRectD &rectOut, TDimensionI &sourceDim, TPointD &offset, float precision, double vignetteAmount, double vignetteGamma, double vignetteMidpoint, - float scale); + float scale, const TRenderSettings &ri); bool canHandle(const TRenderSettings &info, double frame) override { return false; @@ -198,7 +198,7 @@ void Iwa_BarrelDistortFx::doCompute(TTile &tile, double frame, TPointD point = m_point->getValue(frame); TAffine aff = ri.m_affine; // convert the coordinate to with origin at bottom-left corner of the camera - point = aff * point - (tile.m_pos + tile.getRaster()->getCenterD()) + + point = aff * point + TPointD(ri.m_cameraBox.getLx() / 2.0, ri.m_cameraBox.getLy() / 2.0); double dist = m_distortion->getValue(frame); double distAspect = m_distortionAspect->getValue(frame); @@ -213,8 +213,7 @@ void Iwa_BarrelDistortFx::doCompute(TTile &tile, double frame, TPointD sourcePoint(point); if (precision > 1.0) { source_ri.m_affine *= TScale(precision, precision); - sourcePoint = source_ri.m_affine * m_point->getValue(frame) - - (tile.m_pos + tile.getRaster()->getCenterD()) + + sourcePoint = source_ri.m_affine * m_point->getValue(frame) + TPointD(source_ri.m_cameraBox.getLx() / 2.0, source_ri.m_cameraBox.getLy() / 2.0); } @@ -255,7 +254,8 @@ void Iwa_BarrelDistortFx::doCompute(TTile &tile, double frame, result_host_ras->lock(); result_host = (float4 *)result_host_ras->getRawData(); - TPointD offset = sourceTile.m_pos - tile.m_pos; + TPointD offset = sourceTile.m_pos + TPointD(ri.m_cameraBox.getLx() / 2.0, + ri.m_cameraBox.getLy() / 2.0); double vignetteAmount = m_vignetteAmount->getValue(frame); double vignetteGamma = m_vignetteGamma->getValue(frame); @@ -264,13 +264,13 @@ void Iwa_BarrelDistortFx::doCompute(TTile &tile, double frame, double chroma = m_chromaticAberration->getValue(frame); if (areAlmostEqual(chroma, 0.0)) doCompute_CPU(point, sourcePoint, dist, distAspect, source_host, - result_host, outDim, sourceDim, offset, precision, - vignetteAmount, vignetteGamma, vignetteMidpoint, scale); + result_host, rectOut, sourceDim, offset, precision, + vignetteAmount, vignetteGamma, vignetteMidpoint, scale, ri); else doCompute_chroma_CPU(point, sourcePoint, dist, distAspect, chroma, - source_host, result_host, outDim, sourceDim, offset, + source_host, result_host, rectOut, sourceDim, offset, precision, vignetteAmount, vignetteGamma, - vignetteMidpoint, scale); + vignetteMidpoint, scale, ri); source_host_ras->unlock(); @@ -288,12 +288,14 @@ void Iwa_BarrelDistortFx::doCompute(TTile &tile, double frame, void Iwa_BarrelDistortFx::doCompute_CPU( TPointD &point, TPointD &sourcePoint, float dist, float distAspect, - float4 *source_host, float4 *result_host, TDimensionI &outDim, + float4 *source_host, float4 *result_host, TRectD &rectOut, TDimensionI &sourceDim, TPointD &offset, float precision, double vignetteAmount, double vignetteGamma, double vignetteMidpoint, - float scale) { - float4 *result_p = result_host; - float squaredSize = (float)(outDim.lx * outDim.lx) * 0.25f; + float scale, const TRenderSettings &ri) { + float4 *result_p = result_host; + float squaredSize = + (float)(ri.m_cameraBox.getLx() * ri.m_cameraBox.getLy()) * 0.25f; + QPointF offsetCenter(sourcePoint.x - offset.x, sourcePoint.y - offset.y); bool doVignette = !areAlmostEqual(vignetteAmount, 0.0); @@ -313,9 +315,15 @@ void Iwa_BarrelDistortFx::doCompute_CPU( distAspectVec = QVector2D(aspectSqrt, 1.0 / aspectSqrt); } - for (int j = 0; j < outDim.ly; j++) { - for (int i = 0; i < outDim.lx; i++, result_p++) { - QVector2D ru(QPointF((float)i, (float)j) - QPointF(point.x, point.y)); + TPointD outImgOrigin = + rectOut.getP00() + + TPointD(ri.m_cameraBox.getLx() / 2.0, ri.m_cameraBox.getLy() / 2.0); + + for (int j = 0; j < (int)rectOut.getLy(); j++) { + for (int i = 0; i < (int)rectOut.getLx(); i++, result_p++) { + QVector2D ru(QPointF((float)i, (float)j) + + QPointF(outImgOrigin.x, outImgOrigin.y) - + QPointF(point.x, point.y)); // apply global scaling ru /= scale; float val = (ru * distAspectVec).lengthSquared() / squaredSize; @@ -361,12 +369,13 @@ void Iwa_BarrelDistortFx::doCompute_CPU( void Iwa_BarrelDistortFx::doCompute_chroma_CPU( TPointD &point, TPointD &sourcePoint, float dist, float distAspect, - float chroma, float4 *source_host, float4 *result_host, TDimensionI &outDim, + float chroma, float4 *source_host, float4 *result_host, TRectD &rectOut, TDimensionI &sourceDim, TPointD &offset, float precision, double vignetteAmount, double vignetteGamma, double vignetteMidpoint, - float scale) { - float4 *result_p = result_host; - float squaredSize = (float)(outDim.lx * outDim.lx) * 0.25f; + float scale, const TRenderSettings &ri) { + float4 *result_p = result_host; + float squaredSize = + (float)(ri.m_cameraBox.getLx() * ri.m_cameraBox.getLy()) * 0.25f; QPointF offsetCenter(sourcePoint.x - offset.x, sourcePoint.y - offset.y); float dist_ch[3] = {dist + chroma, dist, dist - chroma}; @@ -387,10 +396,16 @@ void Iwa_BarrelDistortFx::doCompute_chroma_CPU( distAspectVec = QVector2D(aspectSqrt, 1.0 / aspectSqrt); } - for (int j = 0; j < outDim.ly; j++) { - for (int i = 0; i < outDim.lx; i++, result_p++) { + TPointD outImgOrigin = + rectOut.getP00() + + TPointD(ri.m_cameraBox.getLx() / 2.0, ri.m_cameraBox.getLy() / 2.0); + + for (int j = 0; j < (int)rectOut.getLy(); j++) { + for (int i = 0; i < (int)rectOut.getLx(); i++, result_p++) { for (int c = 0; c < 3; c++) { - QVector2D ru(QPointF((float)i, (float)j) - QPointF(point.x, point.y)); + QVector2D ru(QPointF((float)i, (float)j) + + QPointF(outImgOrigin.x, outImgOrigin.y) - + QPointF(point.x, point.y)); // apply global scaling ru /= scale; float val = (ru * distAspectVec).lengthSquared() / squaredSize;