From dd1976c5d8835555352268ba30f08820605f1995 Mon Sep 17 00:00:00 2001 From: Jeremy Bullock Date: Mon, 17 Aug 2020 13:38:24 -0600 Subject: [PATCH] Update with Current OpenToonz changes as of 8-12-20 (#119) * add multi arc mockup * implement mutli arc * add join and smooth option * reset multiarc and arc when deactivated * create self loop if the last point is the same as the first * make join option in multiarc consistent with tape tool * fix a bug where thickness don't affect mutliarc in vector level * remove join option in geometric tool * stop mutliarc after closing shape * double click can also end multi arc * fix a bug where multiArc will produce buggy stroke * fix a bug where geometric tools is not deactivated * add multiArc shortcut * rewrite multiArc * revert changes to tvectorimage * add undo data for multiArc * Paste as Copy Command for XSheet * Remove unneeded code * Bug fix * prevent guide lines from jumping around in MultiArc * make stroke color consistent in MultiArc * remove color in MultiArc's undo data * make color consistent in MultiArc with previous version * Fix single image raster levels * fix compilation error * fix a bug where multiArc might generate bugged stroke * Remove ICONV dep (#3304) * fix crash on saving studio palette * Move to Paste Special Menu * Don't Set Fixed Width if Docking a Floating Panel * Update how_to_build_win.md New draft of pr for requested changes to windows build instructions. * fix geometric tool multiarc smooth option * fix level saving failure * fix wrong warning after saving palette * fix a bug where moving a control point while holding alt has unintended result * fix travis-install (#3389) * Fix assert debug crash in flipconsole.cpp Fix crash when using the viewer controls in the console (debug) * Redraw Audio Waveform Fills the waveform rather than outlines it. * fix undo data when drawing arc and mutliarc * fix overwriting raster drawing palette (#3387) * mode sensitive fx settings * Create New Style Command Button (#3394) * Create New Style Command Button This PR creates a new button in the pallette editor that creates a new style. Button is large and easy access for a faster and easier workflow. Original code developed by Turtletooth for Tahoma. Given permission to develop within Openoonz. Co-Authored-By: Jeremy Bullock * Update paletteviewergui.cpp Made changes to the PR per request by Shun. * Fixed a space within the code that wasn't suppose to be there. Co-authored-by: Jeremy Bullock * tahoma license (#3396) * new style button optional * fix loading pegbars (removing updateKeyframes) * periodic random expression * add fx in linear color space this commit is based on source for the ComposeAdd plugin fx by DWANGO Co., Ltd. in dwango_opentoonz_plugins and opentoonz_plugin_utility repositories. * fractal noise iwa fx * skip unnecessary icon invalidation * fix frame range fill with tablet * stop function editor to open by dbl clicking key * Expanding the radius of the rotation handle. This just changes when the cursor transforms into the rotation tool. (cherry picked from commit 7722ae989bbdc6aa5cb48df7a4c08bae1fe6ea39) Co-authored-by: pojienie Co-authored-by: rim <11380091+rozhuk-im@users.noreply.github.com> Co-authored-by: shun-iwasawa Co-authored-by: Rodney Co-authored-by: DoctorRyan <65507211+DoctorRyan@users.noreply.github.com> Co-authored-by: shun-iwasawa Co-authored-by: Kite Co-authored-by: Jeremy Bullock Co-authored-by: DoctorRyan --- stuff/config/current.txt | 22 + .../layouts/fxs/STD_iwa_FractalNoiseFx.xml | 38 ++ stuff/profiles/layouts/fxs/fxs.lst | 1 + toonz/sources/common/expressions/tgrammar.cpp | 12 +- toonz/sources/stdfx/CMakeLists.txt | 2 + toonz/sources/stdfx/ino_blend_add.cpp | 8 +- toonz/sources/stdfx/iwa_fractalnoisefx.cpp | 474 ++++++++++++++++++ toonz/sources/stdfx/iwa_fractalnoisefx.h | 142 ++++++ toonz/sources/tnztools/filltool.cpp | 43 +- toonz/sources/tnztools/selectiontool.cpp | 4 +- toonz/sources/toonz/mainwindow.cpp | 22 +- toonz/sources/toonz/sceneviewer.cpp | 45 +- toonz/sources/toonz/xshcellviewer.cpp | 1 + toonz/sources/toonzlib/tstageobject.cpp | 26 +- toonz/sources/toonzlib/txshsimplelevel.cpp | 40 +- toonz/sources/toonzqt/fxsettings.cpp | 2 +- toonz/sources/toonzqt/paletteviewergui.cpp | 1 - 17 files changed, 781 insertions(+), 102 deletions(-) create mode 100644 stuff/profiles/layouts/fxs/STD_iwa_FractalNoiseFx.xml create mode 100644 toonz/sources/stdfx/iwa_fractalnoisefx.cpp create mode 100644 toonz/sources/stdfx/iwa_fractalnoisefx.h diff --git a/stuff/config/current.txt b/stuff/config/current.txt index b4a758b9..d9701faa 100644 --- a/stuff/config/current.txt +++ b/stuff/config/current.txt @@ -1319,6 +1319,28 @@ "STD_iwa_GlareFx.noise_evolution" "Noise Evolution" "STD_iwa_GlareFx.noise_offset" "Noise Offset" + "STD_iwa_FractalNoiseFx" "Fractal Noise Iwa" + "STD_iwa_FractalNoiseFx.fractalType" "Fractal Type" + "STD_iwa_FractalNoiseFx.noiseType" "Noise Type" + "STD_iwa_FractalNoiseFx.invert" "Invert" + "STD_iwa_FractalNoiseFx.rotation" "Rotation" + "STD_iwa_FractalNoiseFx.uniformScaling" "Uniform Scaling" + "STD_iwa_FractalNoiseFx.scale" "Scale" + "STD_iwa_FractalNoiseFx.scaleW" "Scale W" + "STD_iwa_FractalNoiseFx.scaleH" "Scale H" + "STD_iwa_FractalNoiseFx.offsetTurbulence" "Offset Turbulence" + "STD_iwa_FractalNoiseFx.perspectiveOffset" "Perspective Offset" + "STD_iwa_FractalNoiseFx.complexity" "Complexity" + "STD_iwa_FractalNoiseFx.subInfluence" "Sub Influence" + "STD_iwa_FractalNoiseFx.subScaling" "Sub Scaling" + "STD_iwa_FractalNoiseFx.subRotation" "Sub Rotation" + "STD_iwa_FractalNoiseFx.subOffset" "Sub Offset" + "STD_iwa_FractalNoiseFx.evolution" "Evolution" + "STD_iwa_FractalNoiseFx.cycleEvolution" "Cycle Evolution" + "STD_iwa_FractalNoiseFx.cycleEvolutionRange" "Cycle (in Evolution)" + "STD_iwa_FractalNoiseFx.dynamicIntensity" "Dynamic Intensity" + "STD_iwa_FractalNoiseFx.alphaRendering" "Alpha Rendering" + STD_iwa_TiledParticlesFx "Tiled Particles Iwa" diff --git a/stuff/profiles/layouts/fxs/STD_iwa_FractalNoiseFx.xml b/stuff/profiles/layouts/fxs/STD_iwa_FractalNoiseFx.xml new file mode 100644 index 00000000..6ce9310c --- /dev/null +++ b/stuff/profiles/layouts/fxs/STD_iwa_FractalNoiseFx.xml @@ -0,0 +1,38 @@ + + + fractalType + noiseType + invert + + rotation + uniformScaling + + scale + + + scaleW + scaleH + + offsetTurbulence + perspectiveOffset + + complexity + + subInfluence + subScaling + subRotation + subOffset + centerSubscale + + evolution + cycleEvolution + + cycleEvolutionRange + + + + dynamicIntensity + + alphaRendering + + diff --git a/stuff/profiles/layouts/fxs/fxs.lst b/stuff/profiles/layouts/fxs/fxs.lst index 09d40ce7..c9e686c0 100644 --- a/stuff/profiles/layouts/fxs/fxs.lst +++ b/stuff/profiles/layouts/fxs/fxs.lst @@ -143,6 +143,7 @@ STD_noiseFx STD_iwa_PNPerspectiveFx STD_saltpepperNoiseFx + STD_iwa_FractalNoiseFx STD_cloudsFx diff --git a/toonz/sources/common/expressions/tgrammar.cpp b/toonz/sources/common/expressions/tgrammar.cpp index 7ae0d36c..c1625c49 100644 --- a/toonz/sources/common/expressions/tgrammar.cpp +++ b/toonz/sources/common/expressions/tgrammar.cpp @@ -327,10 +327,10 @@ public: } double compute(double vars[3]) const override { - double s = (m_seed.get() != 0) ? m_seed->compute(vars) : 0; - double period = m_period->compute(vars); + double s = (m_seed.get() != 0) ? m_seed->compute(vars) : 0; + double period = m_period->compute(vars); if (period == 0) period = 1; - double f = m_arg->compute(vars); + double f = m_arg->compute(vars); double f0 = period * std::floor(f / period); double f1 = period * (std::floor(f / period) + 1); @@ -736,11 +736,11 @@ public: while (k > 0) nodes[--k] = popNode(stack); } else { while (k > 1) nodes[--k] = popNode(stack); - nodes[0] = new VariableNode(calc, CalculatorNode::FRAME); + nodes[0] = new VariableNode(calc, CalculatorNode::FRAME); } // add default values - for (int i = 0; i < m; i++) + for (int i = 0; i < m; i++) nodes[n - m + i] = new NumberNode(calc, m_optionalArgDefaults[i]); } }; @@ -1159,7 +1159,7 @@ public: double operator()(double x, double length, double height) const { if (length <= 0.0) return 0.0; if (height <= 0.0) height = length; - double q = x / length; + double q = x / length; return height * (q - floor(q)); } }; diff --git a/toonz/sources/stdfx/CMakeLists.txt b/toonz/sources/stdfx/CMakeLists.txt index 4e3a6a07..04ecdddb 100644 --- a/toonz/sources/stdfx/CMakeLists.txt +++ b/toonz/sources/stdfx/CMakeLists.txt @@ -80,6 +80,7 @@ set(HEADERS iwa_spingradientfx.h iwa_lineargradientfx.h iwa_glarefx.h + iwa_fractalnoisefx.h ) set(SOURCES @@ -266,6 +267,7 @@ set(SOURCES iwa_spingradientfx.cpp iwa_lineargradientfx.cpp iwa_glarefx.cpp + iwa_fractalnoisefx.cpp ) set(OBJCSOURCES diff --git a/toonz/sources/stdfx/ino_blend_add.cpp b/toonz/sources/stdfx/ino_blend_add.cpp index 506fc9a5..3ed79a8f 100644 --- a/toonz/sources/stdfx/ino_blend_add.cpp +++ b/toonz/sources/stdfx/ino_blend_add.cpp @@ -125,7 +125,7 @@ public: /* upComputesWholeTile は Screen, Min, Blendでtrueにして使用している。 */ - ); + ); }; FX_PLUGIN_IDENTIFIER(ino_blend_add, "inoAddFx"); //------------------------------------------------------------ @@ -157,7 +157,7 @@ fxをreplaceすると、 m_refernce --> m_down(=port1) となる */ - const bool up_is = (this->m_up.isConnected() && + const bool up_is = (this->m_up.isConnected() && this->m_up.getFx()->getTimeRegion().contains(frame)); const bool down_is = (this->m_down.isConnected() && this->m_down.getFx()->getTimeRegion().contains(frame)); @@ -201,7 +201,7 @@ fxをreplaceすると、 tround(upBBox.getLx()) // getLx() = "x1>=x0?x1-x0:0" , tround(upBBox.getLy()) // getLy() = "y1>=y0?y1-y0:0" - ); + ); if ((upSize.lx <= 0) || (upSize.ly <= 0)) { return; } @@ -230,7 +230,7 @@ fxをreplaceすると、 void ino_blend_add::dryComputeUpAndDown(TRectD &rect, double frame, const TRenderSettings &rs, bool upComputesWholeTile) { - const bool up_is = (this->m_up.isConnected() && + const bool up_is = (this->m_up.isConnected() && this->m_up.getFx()->getTimeRegion().contains(frame)); const bool down_is = (this->m_down.isConnected() && this->m_down.getFx()->getTimeRegion().contains(frame)); diff --git a/toonz/sources/stdfx/iwa_fractalnoisefx.cpp b/toonz/sources/stdfx/iwa_fractalnoisefx.cpp new file mode 100644 index 00000000..e3388f01 --- /dev/null +++ b/toonz/sources/stdfx/iwa_fractalnoisefx.cpp @@ -0,0 +1,474 @@ +#include "iwa_fractalnoisefx.h" +#include "iwa_noise1234.h" +#include "tparamuiconcept.h" + +namespace { +// convert sRGB color space to power space +template +inline T to_linear_color_space(T nonlinear_color, T exposure, T gamma) { + // return -std::log(T(1) - std::pow(nonlinear_color, gamma)) / exposure; + return std::pow(nonlinear_color, gamma) / exposure; +} +// convert power space to sRGB color space +template +inline T to_nonlinear_color_space(T linear_color, T exposure, T gamma) { + // return std::pow(T(1) - std::exp(-exposure * linear_color), T(1) / gamma); + return std::pow(exposure * linear_color, T(1) / gamma); +} + +inline double hardlight(const double *dn, const double *up) { + if ((*up) < 0.5) + return (*up) * (*dn) * 2.0; + else + return 1.0 - 2.0 * (1.0 - (*up)) * (1.0 - (*dn)); +} + +template +inline const T &clamp(const T &v, const T &lo, const T &hi) { + assert(!(hi < lo)); + return (v < lo) ? lo : (hi < v) ? hi : v; +} + +const double turbulentGamma = 2.2; +// magic number to offset evolution between generations +const double evolutionOffsetStep = 19.82; +} // namespace +//------------------------------------------------------------------ + +Iwa_FractalNoiseFx::Iwa_FractalNoiseFx() + : m_fractalType(new TIntEnumParam(Basic, "Basic")) + , m_noiseType(new TIntEnumParam(Block, "Block")) + , m_invert(false) + , m_rotation(0.0) + , m_uniformScaling(true) + , m_scale(100.0) + , m_scaleW(100.0) + , m_scaleH(100.0) + , m_offsetTurbulence(TPointD(0.0, 0.0)) + , m_perspectiveOffset(false) + , m_complexity(6.0) + , m_subInfluence(70.0) + , m_subScaling(56.0) + , m_subRotation(0.0) + , m_subOffset(TPointD(0.0, 0.0)) + ///, m_centerSubscale(false) + , m_evolution(0.0) + , m_cycleEvolution(false) + , m_cycleEvolutionRange(1.0) + ///, m_randomSeed(0) + , m_dynamicIntensity(1.0) + , m_alphaRendering(false) { + m_fractalType->addItem(TurbulentSmooth, "Turbulent Smooth"); + m_fractalType->addItem(TurbulentBasic, "Turbulent Basic"); + m_fractalType->addItem(TurbulentSharp, "Turbulent Sharp"); + m_fractalType->addItem(Dynamic, "Dynamic"); + m_fractalType->addItem(DynamicTwist, "Dynamic Twist"); + m_fractalType->addItem(Max, "Max"); + m_fractalType->addItem(Rocky, "Rocky"); + + m_noiseType->addItem(Smooth, "Smooth"); + m_noiseType->setValue(Smooth); + + m_rotation->setMeasureName("angle"); + m_rotation->setValueRange(-360.0, 360.0); + m_scale->setMeasureName("fxLength"); + m_scale->setValueRange(20.0, 600.0); + m_scaleW->setMeasureName("fxLength"); + m_scaleW->setValueRange(20.0, 600.0); + m_scaleH->setMeasureName("fxLength"); + m_scaleH->setValueRange(20.0, 600.0); + m_offsetTurbulence->getX()->setMeasureName("fxLength"); + m_offsetTurbulence->getY()->setMeasureName("fxLength"); + + m_complexity->setValueRange(1.0, 10.0); + m_subInfluence->setValueRange(25.0, 100.0); + m_subScaling->setValueRange(25.0, 100.0); + m_subRotation->setMeasureName("angle"); + m_subRotation->setValueRange(-360.0, 360.0); + m_subOffset->getX()->setMeasureName("fxLength"); + m_subOffset->getY()->setMeasureName("fxLength"); + + m_evolution->setValueRange(-100.0, 100.0); + m_cycleEvolutionRange->setValueRange(0.1, 30.0); + m_dynamicIntensity->setValueRange(-10.0, 10.0); + + bindParam(this, "fractalType", m_fractalType); + bindParam(this, "noiseType", m_noiseType); + bindParam(this, "invert", m_invert); + bindParam(this, "rotation", m_rotation); + bindParam(this, "uniformScaling", m_uniformScaling); + bindParam(this, "scale", m_scale); + bindParam(this, "scaleW", m_scaleW); + bindParam(this, "scaleH", m_scaleH); + bindParam(this, "offsetTurbulence", m_offsetTurbulence); + bindParam(this, "perspectiveOffset", m_perspectiveOffset); + bindParam(this, "complexity", m_complexity); + bindParam(this, "subInfluence", m_subInfluence); + bindParam(this, "subScaling", m_subScaling); + bindParam(this, "subRotation", m_subRotation); + bindParam(this, "subOffset", m_subOffset); + /// bindParam(this, "centerSubscale", m_centerSubscale); + bindParam(this, "evolution", m_evolution); + bindParam(this, "cycleEvolution", m_cycleEvolution); + bindParam(this, "cycleEvolutionRange", m_cycleEvolutionRange); + /// bindParam(this, "randomSeed", m_randomSeed); + bindParam(this, "dynamicIntensity", m_dynamicIntensity); + + bindParam(this, "alphaRendering", m_alphaRendering); +} + +//------------------------------------------------------------------ + +bool Iwa_FractalNoiseFx::doGetBBox(double frame, TRectD &bBox, + const TRenderSettings &ri) { + bBox = TConsts::infiniteRectD; + return true; +} + +//------------------------------------------------------------------ + +void Iwa_FractalNoiseFx::doCompute(TTile &tile, double frame, + const TRenderSettings &ri) { + // obtain current parameters + FNParam param; + obtainParams(param, frame, ri.m_affine); + + Noise1234 pn; + + TDimension outDim = tile.getRaster()->getSize(); + // allocate buffer for accumulating the noise patterns + TRasterGR8P out_buf_ras = TRasterGR8P(outDim.lx * sizeof(double), outDim.ly); + out_buf_ras->clear(); + out_buf_ras->lock(); + double *out_buf = (double *)out_buf_ras->getRawData(); + + // allocate buffer for storing the noise pattern of each generation + TRasterGR8P work_buf_ras = TRasterGR8P(outDim.lx * sizeof(double), outDim.ly); + work_buf_ras->lock(); + double *work_buf = (double *)work_buf_ras->getRawData(); + + // affine transformations + TAffine globalAff = TTranslation(-tile.m_pos) * ri.m_affine; + TAffine parentOffsetAff = TTranslation(param.offsetTurbulence); + TAffine parentAff = + TScale(param.scale.lx, param.scale.ly) * TRotation(-param.rotation); + TAffine subAff = TTranslation(param.subOffset) * TScale(param.subScaling) * + TRotation(-param.subRotation); + + TAffine offsetAff = + TTranslation((double)outDim.lx * 0.5, (double)outDim.ly * 0.5); + + TAffine genAff; + + // for cyclic evolution, rotate the sample position in ZW space instead of + // using the periodic noise in Z space so that it can cycle in arbitral + // period. + double evolution_z = param.evolution; + TPointD evolution_zw; + if (param.cycleEvolution) { + double theta = 2.0 * M_PI * param.evolution / param.cycleEvolutionRange; + double d = param.cycleEvolutionRange / (2.0 * M_PI); + evolution_zw.x = d * cos(theta); + evolution_zw.y = d * sin(theta); + } + + int genCount = (int)std::ceil(param.complexity); + + // accumulate base noise pattern for each generation + for (int gen = 0; gen < genCount; gen++) { + // affine transformation for the current generation + TAffine currentAff = + (globalAff * parentOffsetAff * parentAff * genAff * offsetAff).inv(); + // scale of the current pattern ( used for the Dynamic / Dynamic Twist + // offset ) + double scale = sqrt(std::abs(currentAff.det())); + + // for each pixel + double *buf_p = work_buf; + for (int y = 0; y < outDim.ly; y++) { + for (int x = 0; x < outDim.lx; x++, buf_p++) { + // obtain sampling position + // For Dynamic and Dynamic Twist patterns, the position offsets using + // gradient / rotation of the parent pattern + TPointD samplePos = + getSamplePos(x, y, outDim, out_buf, gen, scale, param); + // multiply affine transformation + samplePos = currentAff * samplePos; + // adjust postion for the block pattern + if (param.noiseType == Block) + samplePos = TPointD(std::floor(samplePos.x) + 0.5, + std::floor(samplePos.y) + 0.5); + // calculate the base noise + if (param.cycleEvolution) + *buf_p = (pn.noise(samplePos.x, samplePos.y, evolution_zw.x, + evolution_zw.y) + + 1.0) * + 0.5; + else + *buf_p = + (pn.noise(samplePos.x, samplePos.y, evolution_z) + 1.0) * 0.5; + + // convert the noise + convert(buf_p, param); + } + } + + // just copy the values for the first generation + if (gen == 0) { + memcpy(out_buf, work_buf, outDim.lx * outDim.ly * sizeof(double)); + } else { + // intensity of the last generation will take the fraction part of + // complexity + double genIntensity = std::min(1.0, param.complexity - (double)gen); + // influence of the current generation + double influence = + genIntensity * std::pow(param.subInfluence, (double)gen); + // composite the base noise pattern + buf_p = work_buf; + double *out_p = out_buf; + for (int i = 0; i < outDim.lx * outDim.ly; i++, buf_p++, out_p++) + composite(out_p, buf_p, influence, param); + } + + // update affine transformations (for the next generation loop) + genAff *= subAff; + // When the "Perspective Offset" option is ON, reduce the offset amount + // according to the sub scale + if (param.perspectiveOffset) + parentOffsetAff = TScale(param.subScaling) * + TRotation(-param.subRotation) * parentOffsetAff * + TRotation(param.subRotation) * + TScale(1 / param.subScaling); + + if (param.cycleEvolution) + evolution_zw.x += evolutionOffsetStep; + else + evolution_z += evolutionOffsetStep; + } + + work_buf_ras->unlock(); + + // finalize pattern (coverting the color space) + if (param.fractalType == TurbulentSmooth || + param.fractalType == TurbulentBasic || + param.fractalType == TurbulentSharp) { + double *out_p = out_buf; + for (int i = 0; i < outDim.lx * outDim.ly; i++, out_p++) + finalize(out_p, param); + } + + tile.getRaster()->clear(); + + // convert to RGB channel values + TRaster32P ras32 = (TRaster32P)tile.getRaster(); + TRaster64P ras64 = (TRaster64P)tile.getRaster(); + if (ras32) + outputRaster(ras32, out_buf, param); + else if (ras64) + outputRaster(ras64, out_buf, param); + + out_buf_ras->unlock(); +} + +//------------------------------------------------------------------ +// obtain current parameters +void Iwa_FractalNoiseFx::obtainParams(FNParam ¶m, const double frame, + const TAffine &aff) { + param.fractalType = (FractalType)m_fractalType->getValue(); + param.noiseType = (NoiseType)m_noiseType->getValue(); + param.invert = m_invert->getValue(); + param.rotation = m_rotation->getValue(frame); // in degree, not radian + if (m_uniformScaling->getValue()) { // uniform case + double s = m_scale->getValue(frame); + param.scale = TDimensionD(s, s); + } else { // non-uniform case + param.scale.lx = m_scaleW->getValue(frame); + param.scale.ly = m_scaleH->getValue(frame); + } + assert(param.scale.lx != 0.0 && param.scale.ly != 0.0); + if (param.scale.lx == 0.0) param.scale.lx = 1e-8; + if (param.scale.ly == 0.0) param.scale.ly = 1e-8; + + param.offsetTurbulence = m_offsetTurbulence->getValue(frame); + param.perspectiveOffset = m_perspectiveOffset->getValue(); + param.complexity = m_complexity->getValue(frame); + if (param.complexity < 1.0) + param.complexity = + 1.0; // at least the first generation is rendered in full opacity + param.subInfluence = + m_subInfluence->getValue(frame) / 100.0; // normalize to 0 - 1 + param.subScaling = + m_subScaling->getValue(frame) / 100.0; // normalize to 0 - 1 + param.subRotation = m_subRotation->getValue(frame); // in degree, not radian + param.subOffset = m_subOffset->getValue(frame); + param.evolution = m_evolution->getValue(frame); + param.cycleEvolution = m_cycleEvolution->getValue(); + param.cycleEvolutionRange = m_cycleEvolutionRange->getValue(frame); + param.dynamicIntensity = m_dynamicIntensity->getValue(frame) * 10.0; + param.alphaRendering = m_alphaRendering->getValue(); +} + +//------------------------------------------------------------------ +template +void Iwa_FractalNoiseFx::outputRaster(const RASTER outRas, double *out_buf, + const FNParam ¶m) { + TDimension dim = outRas->getSize(); + double *buf_p = out_buf; + for (int j = 0; j < dim.ly; j++) { + PIXEL *pix = outRas->pixels(j); + for (int i = 0; i < dim.lx; i++, pix++, buf_p++) { + double val = (param.invert) ? 1.0 - (*buf_p) : (*buf_p); + val = clamp(val, 0.0, 1.0); + typename PIXEL::Channel chan = static_cast( + val * (double)PIXEL::maxChannelValue); + pix->r = chan; + pix->g = chan; + pix->b = chan; + pix->m = (param.alphaRendering) ? chan : PIXEL::maxChannelValue; + } + } +} + +//------------------------------------------------------------------ + +void Iwa_FractalNoiseFx::getParamUIs(TParamUIConcept *&concepts, int &length) { + concepts = new TParamUIConcept[length = 2]; + + concepts[0].m_type = TParamUIConcept::POINT; + concepts[0].m_label = "Offset Turbulence"; + concepts[0].m_params.push_back(m_offsetTurbulence); + + concepts[1].m_type = TParamUIConcept::POINT; + concepts[1].m_label = "Sub Offset"; + concepts[1].m_params.push_back(m_subOffset); +} +//------------------------------------------------------------------ +// For Dynamic and Dynamic Twist patterns, the position offsets using gradient / +// rotation of the parent pattern +TPointD Iwa_FractalNoiseFx::getSamplePos(int x, int y, const TDimension outDim, + const double *out_buf, const int gen, + const double scale, + const FNParam ¶m) { + // the position does not offset in the first generation + if (gen == 0 || param.dynamicIntensity == 0.0 || + (param.fractalType != Dynamic && param.fractalType != DynamicTwist)) + return TPointD((double)x, (double)y); + + auto clampPos = [&](int x, int y) { + if (x < 0) + x = 0; + else if (x >= outDim.lx) + x = outDim.lx - 1; + if (y < 0) + y = 0; + else if (y >= outDim.ly) + y = outDim.ly - 1; + return TPoint(x, y); + }; + + auto val = [&](const TPoint &p) { return out_buf[p.y * outDim.lx + p.x]; }; + int range = std::max(2, (int)(0.1 / scale)); + TPoint left = clampPos(x - range, y); + TPoint right = clampPos(x + range, y); + TPoint down = clampPos(x, y - range); + TPoint up = clampPos(x, y + range); + + double dif_x = param.dynamicIntensity * (1 / scale) * + (val(left) - val(right)) / (left.x - right.x); + double dif_y = param.dynamicIntensity * (1 / scale) * (val(up) - val(down)) / + (up.y - down.y); + + if (param.fractalType == Dynamic) + return TPointD((double)x + dif_x, (double)y + dif_y); // gradient + else // Dynamic_twist + return TPointD((double)x + dif_y, (double)y - dif_x); // rotation +} + +//------------------------------------------------------------------ +// convert the noise +void Iwa_FractalNoiseFx::convert(double *buf, const FNParam ¶m) { + if (param.fractalType == Basic || param.fractalType == Dynamic || + param.fractalType == DynamicTwist) + return; + + switch (param.fractalType) { + case TurbulentSmooth: + *buf = std::pow(std::abs(*buf - 0.5), 2.0) * 3.75; + *buf = to_linear_color_space(*buf, 1.0, turbulentGamma); + break; + case TurbulentBasic: + *buf = std::pow(std::abs(*buf - 0.5), 1.62) * 4.454; + *buf = to_linear_color_space(*buf, 1.0, turbulentGamma); + break; + case TurbulentSharp: + *buf = std::pow(std::abs(*buf - 0.5), 0.725) * 1.77; + *buf = to_linear_color_space(*buf, 1.0, turbulentGamma); + break; + case Max: + *buf = std::abs(*buf - 0.5) * 1.96; + break; + case Rocky: + // convertion LUT for the range from 0.43 to 0.57, every 0.01 + static double table[15] = { + 0.25, 0.256658635, 0.275550218, 0.30569519, 0.345275591, + 0.392513494, 0.440512, 0.5, 0.555085147, 0.607486506, + 0.654724409, 0.69430481, 0.724449782, 0.743341365, 0.75}; + if (*buf <= 0.43) + *buf = 0.25; + else if (*buf >= 0.57) + *buf = 0.75; + else { + int id = (int)std::floor(*buf * 100.0) - 43; + double t = *buf * 100.0 - (double)(id + 43); + // linear interpolation the LUT values + *buf = (1 - t) * table[id] + t * table[id + 1]; + } + break; + } +} + +//------------------------------------------------------------------ +// composite the base noise pattern +void Iwa_FractalNoiseFx::composite(double *out, double *buf, + const double influence, + const FNParam ¶m) { + switch (param.fractalType) { + case Basic: + case Dynamic: + case DynamicTwist: + case Rocky: { + // hard light composition + double val = hardlight(out, buf); + *out = (1.0 - influence) * (*out) + influence * val; + break; + } + case TurbulentSmooth: + case TurbulentBasic: + case TurbulentSharp: + // add composition in the linear color space + *out += (*buf) * influence; + break; + case Max: + // max composition + *out = std::max(*out, influence * (*buf)); + break; + default: { + double val = hardlight(out, buf); + *out = (1.0 - influence) * (*out) + influence * val; + break; + } + } +} + +//------------------------------------------------------------------ +// finalize pattern (coverting the color space) +void Iwa_FractalNoiseFx::finalize(double *out, const FNParam ¶m) { + assert(param.fractalType == TurbulentSmooth || + param.fractalType == TurbulentBasic || + param.fractalType == TurbulentSharp); + + // TurbulentSmooth / TurbulentBasic / TurbulentSharp + *out = to_nonlinear_color_space(*out, 1.0, turbulentGamma); +} + +FX_PLUGIN_IDENTIFIER(Iwa_FractalNoiseFx, "iwa_FractalNoiseFx"); diff --git a/toonz/sources/stdfx/iwa_fractalnoisefx.h b/toonz/sources/stdfx/iwa_fractalnoisefx.h new file mode 100644 index 00000000..d0b2642e --- /dev/null +++ b/toonz/sources/stdfx/iwa_fractalnoisefx.h @@ -0,0 +1,142 @@ +#pragma once + +//****************************************************************** +// Iwa FractalNoise Fx +// An Fx emulating Fractal Noise effect in Adobe AfterEffect +//****************************************************************** + +#ifndef IWA_FRACTALNOISEFX_H +#define IWA_FRACTALNOISEFX_H + +#include "tfxparam.h" +#include "tparamset.h" +#include "stdfx.h" + +class Iwa_FractalNoiseFx final : public TStandardZeraryFx { + FX_PLUGIN_DECLARATION(Iwa_FractalNoiseFx) + + enum FractalType { + Basic = 0, + TurbulentSmooth, + TurbulentBasic, + TurbulentSharp, + Dynamic, + DynamicTwist, + Max, + Rocky, + FractalTypeCount + }; + + enum NoiseType { Block = 0, Smooth, NoiseTypeCount }; + + struct FNParam { + FractalType fractalType; + NoiseType noiseType; + bool invert; + double rotation; + TDimensionD scale; + TPointD offsetTurbulence; + bool perspectiveOffset; + double complexity; + double subInfluence; + double subScaling; + double subRotation; + TPointD subOffset; + double evolution; + bool cycleEvolution; + double cycleEvolutionRange; + double dynamicIntensity; + bool alphaRendering; + }; + +protected: + // Fractal Type tN^̎ + TIntEnumParamP m_fractalType; + // Noise Type mCY̎ + TIntEnumParamP m_noiseType; + // Invert ] + TBoolParamP m_invert; + /// Contrast RgXg + /// Brightness 邳 + /// Overflow I[o[t[ + + //- - - Transform gXtH[ - - - + // Rotation ] + TDoubleParamP m_rotation; + // Uniform Scaling@cŒ + TBoolParamP m_uniformScaling; + // Scale XP[ + TDoubleParamP m_scale; + // Scale Width XP[̕ + TDoubleParamP m_scaleW; + // Scale Height XP[̍ + TDoubleParamP m_scaleH; + // Offset Turbulence C̃ItZbg + TPointParamP m_offsetTurbulence; + // Perspective Offset ߃ItZbg + TBoolParamP m_perspectiveOffset; + + // Complexity Gx + TDoubleParamP m_complexity; + + //- - - Sub Settings Tuݒ - - - + // Sub Influence Tueij + TDoubleParamP m_subInfluence; + // Sub Scaling@TuXP[ + TDoubleParamP m_subScaling; + // Sub Rotation Tu] + TDoubleParamP m_subRotation; + // Sub Offset TũItZbg + TPointParamP m_subOffset; + // Center Subscale TuXP[𒆐S + /// TBoolParamP m_centerSubscale; + + // Evolution WJ + TDoubleParamP m_evolution; + + //- - - Evolution Options WJ̃IvV - - - + // Cycle Evolution TCNWJ + TBoolParamP m_cycleEvolution; + // Cycle (in Evolution) TCNij + TDoubleParamP m_cycleEvolutionRange; + /// Random Seed _V[h + /// Opacity sx + /// Blending Mode `惂[h + + // _Ci~bN̓x + TDoubleParamP m_dynamicIntensity; + + // - - - additional parameters - - - + TBoolParamP m_alphaRendering; + +public: + Iwa_FractalNoiseFx(); + bool canHandle(const TRenderSettings &info, double frame) override { + return true; + } + bool doGetBBox(double frame, TRectD &bBox, + const TRenderSettings &ri) override; + void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override; + + void obtainParams(FNParam ¶m, const double frame, const TAffine &aff); + + template + void outputRaster(const RASTER outRas, double *out_buf, const FNParam ¶m); + + void getParamUIs(TParamUIConcept *&concepts, int &length) override; + + // For Dynamic and Dynamic Twist patterns, the position offsets using gradient + // / rotation of the parent pattern + TPointD getSamplePos(int x, int y, const TDimension outDim, + const double *out_buf, const int gen, const double scale, + const FNParam ¶m); + // convert the noise + void convert(double *buf, const FNParam ¶m); + // composite the base noise pattern + void composite(double *out, double *buf, const double influence, + const FNParam ¶m); + // finalize pattern (coverting the color space) + void finalize(double *out, const FNParam ¶m); +}; + +#endif \ No newline at end of file diff --git a/toonz/sources/tnztools/filltool.cpp b/toonz/sources/tnztools/filltool.cpp index 3e79b672..00a021e2 100644 --- a/toonz/sources/tnztools/filltool.cpp +++ b/toonz/sources/tnztools/filltool.cpp @@ -237,14 +237,12 @@ public: void onAdd() override {} int getSize() const override { - int size1 = m_regionFillInformation - ? m_regionFillInformation->capacity() * - sizeof(m_regionFillInformation) - : 0; - int size2 = m_strokeFillInformation - ? m_strokeFillInformation->capacity() * - sizeof(m_strokeFillInformation) - : 0; + int size1 = m_regionFillInformation ? m_regionFillInformation->capacity() * + sizeof(m_regionFillInformation) + : 0; + int size2 = m_strokeFillInformation ? m_strokeFillInformation->capacity() * + sizeof(m_strokeFillInformation) + : 0; return sizeof(*this) + size1 + size2 + 500; } @@ -640,11 +638,10 @@ public: } int getSize() const override { - int size = - m_selectingStroke - ? m_selectingStroke->getControlPointCount() * sizeof(TThickPoint) + - 100 - : 0; + int size = m_selectingStroke ? m_selectingStroke->getControlPointCount() * + sizeof(TThickPoint) + + 100 + : 0; return sizeof(*this) + m_regionFillInformation->capacity() * sizeof(m_regionFillInformation) + @@ -870,7 +867,7 @@ void fillAreaWithUndo(const TImageP &img, const TRectD &area, TStroke *stroke, vi->findRegions(); - std::vector *regionFillInformation = 0; + std::vector *regionFillInformation = 0; std::vector> *strokeFillInformation = 0; if (colorType != LINES) { regionFillInformation = new std::vector; @@ -1648,9 +1645,9 @@ public: { double k = dy / dx; /*-- 直線の傾き --*/ /*--- roundでは負値のときにうまく繋がらない ---*/ - int start = std::min((int)floor(m_startPosition.x + 0.5), + int start = std::min((int)floor(m_startPosition.x + 0.5), (int)floor(m_mousePosition.x + 0.5)); - int end = std::max((int)floor(m_startPosition.x + 0.5), + int end = std::max((int)floor(m_startPosition.x + 0.5), (int)floor(m_mousePosition.x + 0.5)); double start_x = (m_startPosition.x < m_mousePosition.x) ? m_startPosition.x @@ -1673,9 +1670,9 @@ public: { double k = dx / dy; /*-- 直線の傾き --*/ /*--- roundでは負値のときにうまく繋がらない ---*/ - int start = std::min((int)floor(m_startPosition.y + 0.5), + int start = std::min((int)floor(m_startPosition.y + 0.5), (int)floor(m_mousePosition.y + 0.5)); - int end = std::max((int)floor(m_startPosition.y + 0.5), + int end = std::max((int)floor(m_startPosition.y + 0.5), (int)floor(m_mousePosition.y + 0.5)); double start_x = (m_startPosition.y < m_mousePosition.y) ? m_startPosition.x @@ -1773,7 +1770,7 @@ int FillTool::getCursorId() const { if (m_colorType.getValue() == LINES) ret = ToolCursor::FillCursorL; else { - ret = ToolCursor::FillCursor; + ret = ToolCursor::FillCursor; if (m_colorType.getValue() == AREAS) ret = ret | ToolCursor::Ex_Area; if (!m_autopaintLines.getValue()) ret = ret | ToolCursor::Ex_Fill_NoAutopaint; @@ -2016,7 +2013,7 @@ bool FillTool::onPropertyChanged(std::string propertyName) { // Onion Skin else if (propertyName == m_onion.getName()) { if (m_onion.getValue()) FillType = ::to_string(m_fillType.getValue()); - FillOnion = (int)(m_onion.getValue()); + FillOnion = (int)(m_onion.getValue()); } // Frame Range else if (propertyName == m_frameRange.getName()) { @@ -2036,7 +2033,7 @@ bool FillTool::onPropertyChanged(std::string propertyName) { // Segment else if (propertyName == m_segment.getName()) { if (m_segment.getValue()) FillType = ::to_string(m_fillType.getValue()); - FillSegment = (int)(m_segment.getValue()); + FillSegment = (int)(m_segment.getValue()); } // Autopaint @@ -2291,9 +2288,9 @@ void FillTool::onActivate() { bool ret = true; ret = ret && connect(TTool::m_application->getCurrentFrame(), SIGNAL(frameSwitched()), this, SLOT(onFrameSwitched())); - ret = ret && connect(TTool::m_application->getCurrentScene(), + ret = ret && connect(TTool::m_application->getCurrentScene(), SIGNAL(sceneSwitched()), this, SLOT(onFrameSwitched())); - ret = ret && + ret = ret && connect(TTool::m_application->getCurrentColumn(), SIGNAL(columnIndexSwitched()), this, SLOT(onFrameSwitched())); assert(ret); diff --git a/toonz/sources/tnztools/selectiontool.cpp b/toonz/sources/tnztools/selectiontool.cpp index a911fc5d..50f4dfd4 100644 --- a/toonz/sources/tnztools/selectiontool.cpp +++ b/toonz/sources/tnztools/selectiontool.cpp @@ -923,9 +923,9 @@ void SelectionTool::updateAction(TPointD pos, const TMouseEvent &e) { double pixelSize = getPixelSize(); if (!bbox.isEmpty()) { - double maxDist = 8 * pixelSize; + double maxDist = 17 * pixelSize; double maxDist2 = maxDist * maxDist; - double p = (12 * pixelSize) - 3 * pixelSize; + double p = (15 * pixelSize); m_selectedPoint = NONE; if (tdistance2(bbox.getP00(), pos) < maxDist2 + p) m_selectedPoint = P00; diff --git a/toonz/sources/toonz/mainwindow.cpp b/toonz/sources/toonz/mainwindow.cpp index c5d96ce4..22446e57 100644 --- a/toonz/sources/toonz/mainwindow.cpp +++ b/toonz/sources/toonz/mainwindow.cpp @@ -1240,7 +1240,7 @@ void MainWindow::onMenuCheckboxChanged() { FieldGuideToggleAction = isChecked; else if (cm->getAction(MI_RasterizePli) == action) { if (!QGLPixelBuffer::hasOpenGLPbuffers()) isChecked = 0; - RasterizePliToggleAction = isChecked; + RasterizePliToggleAction = isChecked; } else if (cm->getAction(MI_SafeArea) == action) SafeAreaToggleAction = isChecked; else if (cm->getAction(MI_ViewColorcard) == action) @@ -3304,7 +3304,7 @@ void MainWindow::clearCacheFolder() { // 1. $CACHE/[Current ProcessID] // 2. $CACHE/temp/[Current scene folder] if the current scene is untitled - TFilePath cacheRoot = ToonzFolder::getCacheRootFolder(); + TFilePath cacheRoot = ToonzFolder::getCacheRootFolder(); if (cacheRoot.isEmpty()) cacheRoot = TEnv::getStuffDir() + "cache"; TFilePathSet filesToBeRemoved; @@ -3438,9 +3438,9 @@ RecentFiles::~RecentFiles() {} void RecentFiles::addFilePath(QString path, FileType fileType, QString projectName) { QList files = - (fileType == Scene) ? m_recentScenes : (fileType == Level) - ? m_recentLevels - : m_recentFlipbookImages; + (fileType == Scene) + ? m_recentScenes + : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; int i; for (i = 0; i < files.size(); i++) if (files.at(i) == path) { @@ -3607,9 +3607,9 @@ void RecentFiles::saveRecentFiles() { QList RecentFiles::getFilesNameList(FileType fileType) { QList files = - (fileType == Scene) ? m_recentScenes : (fileType == Level) - ? m_recentLevels - : m_recentFlipbookImages; + (fileType == Scene) + ? m_recentScenes + : (fileType == Level) ? m_recentLevels : m_recentFlipbookImages; QList names; int i; for (i = 0; i < files.size(); i++) { @@ -3636,9 +3636,9 @@ void RecentFiles::refreshRecentFilesMenu(FileType fileType) { menu->setEnabled(false); else { CommandId clearActionId = - (fileType == Scene) ? MI_ClearRecentScene : (fileType == Level) - ? MI_ClearRecentLevel - : MI_ClearRecentImage; + (fileType == Scene) + ? MI_ClearRecentScene + : (fileType == Level) ? MI_ClearRecentLevel : MI_ClearRecentImage; menu->setActions(names); menu->addSeparator(); QAction *clearAction = CommandManager::instance()->getAction(clearActionId); diff --git a/toonz/sources/toonz/sceneviewer.cpp b/toonz/sources/toonz/sceneviewer.cpp index 7df22ae2..65b54df5 100644 --- a/toonz/sources/toonz/sceneviewer.cpp +++ b/toonz/sources/toonz/sceneviewer.cpp @@ -2156,7 +2156,7 @@ double SceneViewer::projectToZ(const TPointD &delta) { GLint viewport[4]; double modelview[16], projection[16]; glGetIntegerv(GL_VIEWPORT, viewport); - for (int i = 0; i < 16; i++) + for (int i = 0; i < 16; i++) projection[i] = (double)m_projectionMatrix.constData()[i]; glGetDoublev(GL_MODELVIEW_MATRIX, modelview); @@ -2318,8 +2318,9 @@ void SceneViewer::zoomQt(bool forward, bool reset) { if (reset || ((m_zoomScale3D < 500 || !forward) && (m_zoomScale3D > 0.01 || forward))) { double oldZoomScale = m_zoomScale3D; - m_zoomScale3D = reset ? 1 : ImageUtils::getQuantizedZoomFactor( - m_zoomScale3D, forward); + m_zoomScale3D = + reset ? 1 + : ImageUtils::getQuantizedZoomFactor(m_zoomScale3D, forward); m_pan3D = -(m_zoomScale3D / oldZoomScale) * -m_pan3D; } @@ -2340,17 +2341,18 @@ void SceneViewer::zoomQt(bool forward, bool reset) { int i; for (i = 0; i < 2; i++) { - TAffine &viewAff = m_viewAff[i]; + TAffine &viewAff = m_viewAff[i]; if (m_isFlippedX) viewAff = viewAff * TScale(-1, 1); if (m_isFlippedX) viewAff = viewAff * TScale(1, -1); - double scale2 = std::abs(viewAff.det()); + double scale2 = std::abs(viewAff.det()); if (m_isFlippedX) viewAff = viewAff * TScale(-1, 1); if (m_isFlippedX) viewAff = viewAff * TScale(1, -1); if (reset || ((scale2 < 100000 || !forward) && (scale2 > 0.001 * 0.05 || forward))) { double oldZoomScale = sqrt(scale2) * dpiFactor; - double zoomScale = reset ? 1 : ImageUtils::getQuantizedZoomFactor( - oldZoomScale, forward); + double zoomScale = + reset ? 1 + : ImageUtils::getQuantizedZoomFactor(oldZoomScale, forward); // threshold value -0.001 is intended to absorb the error of calculation if ((oldZoomScale - zoomScaleFittingWithScreen) * @@ -2653,9 +2655,9 @@ void SceneViewer::fitToCamera() { TPointD P11 = cameraAff * cameraRect.getP11(); TPointD p0 = TPointD(std::min({P00.x, P01.x, P10.x, P11.x}), std::min({P00.y, P01.y, P10.y, P11.y})); - TPointD p1 = TPointD(std::max({P00.x, P01.x, P10.x, P11.x}), + TPointD p1 = TPointD(std::max({P00.x, P01.x, P10.x, P11.x}), std::max({P00.y, P01.y, P10.y, P11.y})); - cameraRect = TRectD(p0.x, p0.y, p1.x, p1.y); + cameraRect = TRectD(p0.x, p0.y, p1.x, p1.y); // Pan if (!is3DView()) { @@ -2698,9 +2700,9 @@ void SceneViewer::fitToCameraOutline() { TPointD P11 = cameraAff * cameraRect.getP11(); TPointD p0 = TPointD(std::min({P00.x, P01.x, P10.x, P11.x}), std::min({P00.y, P01.y, P10.y, P11.y})); - TPointD p1 = TPointD(std::max({P00.x, P01.x, P10.x, P11.x}), + TPointD p1 = TPointD(std::max({P00.x, P01.x, P10.x, P11.x}), std::max({P00.y, P01.y, P10.y, P11.y})); - cameraRect = TRectD(p0.x, p0.y, p1.x, p1.y); + cameraRect = TRectD(p0.x, p0.y, p1.x, p1.y); // Pan if (!is3DView()) { @@ -2750,8 +2752,8 @@ void SceneViewer::resetZoom() { TPointD realCenter(m_viewAff[m_viewMode].a13, m_viewAff[m_viewMode].a23); TAffine aff = getNormalZoomScale() * TRotation(realCenter, m_rotationAngle[m_viewMode]); - aff.a13 = realCenter.x; - aff.a23 = realCenter.y; + aff.a13 = realCenter.x; + aff.a23 = realCenter.y; if (m_isFlippedX) aff = aff * TScale(-1, 1); if (m_isFlippedY) aff = aff * TScale(1, -1); setViewMatrix(aff, m_viewMode); @@ -2808,16 +2810,17 @@ void SceneViewer::setActualPixelSize() { } else dpi = sl->getDpi(fid); - const double inch = Stage::inch; - TAffine tempAff = getNormalZoomScale(); - if (m_isFlippedX) tempAff = tempAff * TScale(-1, 1); - if (m_isFlippedY) tempAff = tempAff * TScale(1, -1); - TPointD tempScale = dpi; + const double inch = Stage::inch; + TAffine tempAff = getNormalZoomScale(); + if (m_isFlippedX) tempAff = tempAff * TScale(-1, 1); + if (m_isFlippedY) tempAff = tempAff * TScale(1, -1); + TPointD tempScale = dpi; if (m_isFlippedX) tempScale.x = -tempScale.x; if (m_isFlippedY) tempScale.y = -tempScale.y; for (int i = 0; i < m_viewAff.size(); ++i) - setViewMatrix(dpi == TPointD(0, 0) ? tempAff : TScale(tempScale.x / inch, - tempScale.y / inch), + setViewMatrix(dpi == TPointD(0, 0) + ? tempAff + : TScale(tempScale.x / inch, tempScale.y / inch), i); m_pos = QPoint(0, 0); @@ -3100,7 +3103,7 @@ void drawSpline(const TAffine &viewMatrix, const TRect &clipRect, bool camera3d, TStageObject *pegbar = objId != TStageObjectId::NoneId ? xsh->getStageObject(objId) : 0; - const TStroke *stroke = 0; + const TStroke *stroke = 0; if (pegbar && pegbar->getSpline()) stroke = pegbar->getSpline()->getStroke(); if (!stroke) return; diff --git a/toonz/sources/toonz/xshcellviewer.cpp b/toonz/sources/toonz/xshcellviewer.cpp index 4089581f..08edcc9b 100644 --- a/toonz/sources/toonz/xshcellviewer.cpp +++ b/toonz/sources/toonz/xshcellviewer.cpp @@ -3009,6 +3009,7 @@ void CellArea::mouseDoubleClickEvent(QMouseEvent *event) { int k0, k1; bool isKeyframeFrame = pegbar && pegbar->getKeyframeRange(k0, k1) && k0 <= row && row <= k1 + 1; + // If you are in the keyframe area, open a function editor if (isKeyframeFrame && isKeyFrameArea(col, row, mouseInCell)) { QAction *action = diff --git a/toonz/sources/toonzlib/tstageobject.cpp b/toonz/sources/toonzlib/tstageobject.cpp index 2de30b13..dd7288fc 100644 --- a/toonz/sources/toonzlib/tstageobject.cpp +++ b/toonz/sources/toonzlib/tstageobject.cpp @@ -258,8 +258,8 @@ bool setKeyframe(const TDoubleParamP ¶m, const TDoubleKeyframe &kf, TDoubleKeyframe kfCopy = kf; - kfCopy.m_frame = frame; - if (easeIn >= 0.0) kfCopy.m_speedIn = TPointD(-easeIn, kfCopy.m_speedIn.y); + kfCopy.m_frame = frame; + if (easeIn >= 0.0) kfCopy.m_speedIn = TPointD(-easeIn, kfCopy.m_speedIn.y); if (easeOut >= 0.0) kfCopy.m_speedOut = TPointD(easeOut, kfCopy.m_speedOut.y); param->setKeyframe(kfCopy); @@ -773,7 +773,7 @@ void TStageObject::setCenterAndOffset(const TPointD ¢er, //----------------------------------------------------------------------------- void TStageObject::setHandle(const std::string &s) { - m_handle = s; + m_handle = s; if (!s.empty() && s[0] == 'H') m_offset = m_center = TPointD(); invalidate(); @@ -971,7 +971,7 @@ void TStageObject::removeKeyframeWithoutUndo(int frame) { if (m_skeletonDeformation) m_skeletonDeformation->deleteKeyframe(frame); - time = -1; + time = -1; if ((int)keyframes.size() < 2) m_cycleEnabled = false; invalidate(); @@ -1304,17 +1304,17 @@ TAffine TStageObject::computeIkRootOffset(int t) { TAffine placement = foot->getPlacement(t).inv(); int t0 = 0; const TPinnedRangeSet::Range *range = foot->getPinnedRangeSet()->getRange(t); - if (range) t0 = range->first; + if (range) t0 = range->first; while (t0 > 0) { TStageObject *oldFoot = getPinnedDescendant(t0 - 1); if (oldFoot == 0) break; // oldFoot = this; assert(oldFoot != foot); TAffine changeFootAff = oldFoot->getPlacement(t0).inv() * foot->getPlacement(t0); - placement = changeFootAff * placement; - foot = oldFoot; - range = oldFoot->getPinnedRangeSet()->getRange(t0 - 1); - t0 = 0; + placement = changeFootAff * placement; + foot = oldFoot; + range = oldFoot->getPinnedRangeSet()->getRange(t0 - 1); + t0 = 0; if (range) t0 = range->first; } m_ikflag--; @@ -1412,7 +1412,7 @@ TAffine TStageObject::getPlacement(double t) { if (m_parent) place = m_parent->getPlacement(t) * computeLocalPlacement(tt); else - place = computeLocalPlacement(tt); + place = computeLocalPlacement(tt); m_absPlacement = place; time = t; return place; @@ -1855,8 +1855,8 @@ TStageObjectParams *TStageObject::getParams() const { data->m_cycleEnabled = m_cycleEnabled; data->m_spline = m_spline; - data->m_handle = m_handle; - data->m_parentHandle = m_parentHandle; + data->m_handle = m_handle; + data->m_parentHandle = m_parentHandle; if (m_pinnedRangeSet) data->m_pinnedRangeSet = m_pinnedRangeSet->clone(); return data; @@ -1922,7 +1922,7 @@ void TStageObject::assignParams(const TStageObjectParams *src, m_handle = src->m_handle; m_parentHandle = src->m_parentHandle; - m_cycleEnabled = src->m_cycleEnabled; + m_cycleEnabled = src->m_cycleEnabled; if (m_pinnedRangeSet) *m_pinnedRangeSet = *src->m_pinnedRangeSet; updateKeyframes(); if (m_spline && isUppkEnabled()) m_spline->addParam(m_posPath.getPointer()); diff --git a/toonz/sources/toonzlib/txshsimplelevel.cpp b/toonz/sources/toonzlib/txshsimplelevel.cpp index 780956a5..9083e1cd 100644 --- a/toonz/sources/toonzlib/txshsimplelevel.cpp +++ b/toonz/sources/toonzlib/txshsimplelevel.cpp @@ -102,8 +102,8 @@ bool checkCreatorString(const QString &creator) { if (pos >= 0 && len >= 4) { QString v; if (len > 4) v = creator.mid(pos + 3, len - 4); - bool ok = true; - mask = v.toInt(&ok, 16); + bool ok = true; + mask = v.toInt(&ok, 16); } } return (mask & compatibility.neededMask) == compatibility.neededMask && @@ -169,8 +169,8 @@ void getIndexesRangefromFids(TXshSimpleLevel *level, std::set::const_iterator it; for (it = fids.begin(); it != fids.end(); ++it) { - int index = level->guessIndex(*it); - if (index > toIndex) toIndex = index; + int index = level->guessIndex(*it); + if (index > toIndex) toIndex = index; if (index < fromIndex) fromIndex = index; } } @@ -917,13 +917,13 @@ void TXshSimpleLevel::loadData(TIStream &is) { if (is.getTagParam("dpix", v)) xdpi = std::stod(v); if (is.getTagParam("dpiy", v)) ydpi = std::stod(v); if (xdpi != 0 && ydpi != 0) dpiPolicy = LevelProperties::DP_CustomDpi; - std::string dpiType = is.getTagAttribute("dpiType"); - if (dpiType == "image") dpiPolicy = LevelProperties::DP_ImageDpi; - if (is.getTagParam("type", v) && v == "s") type = TZI_XSHLEVEL; - if (is.getTagParam("subsampling", v)) subsampling = std::stoi(v); - if (is.getTagParam("premultiply", v)) doPremultiply = std::stoi(v); + std::string dpiType = is.getTagAttribute("dpiType"); + if (dpiType == "image") dpiPolicy = LevelProperties::DP_ImageDpi; + if (is.getTagParam("type", v) && v == "s") type = TZI_XSHLEVEL; + if (is.getTagParam("subsampling", v)) subsampling = std::stoi(v); + if (is.getTagParam("premultiply", v)) doPremultiply = std::stoi(v); if (is.getTagParam("antialias", v)) antialiasSoftness = std::stoi(v); - if (is.getTagParam("whiteTransp", v)) whiteTransp = std::stoi(v); + if (is.getTagParam("whiteTransp", v)) whiteTransp = std::stoi(v); if (is.getTagParam("isStopMotionLevel", v)) isStopMotionLevel = std::stoi(v); @@ -1094,9 +1094,8 @@ static TFilePath getLevelPathAndSetNameWithPsdLevelName( if (removeFileName) wLevelName = list[1].toStdWString(); TLevelSet *levelSet = xshLevel->getScene()->getLevelSet(); - if (levelSet && - levelSet->hasLevel( - wLevelName)) // levelSet should be asserted instead + if (levelSet && levelSet->hasLevel( + wLevelName)) // levelSet should be asserted instead levelSet->renameLevel(xshLevel, wLevelName); xshLevel->setName(wLevelName); @@ -1654,8 +1653,8 @@ void TXshSimpleLevel::saveSimpleLevel(const TFilePath &decodedFp, std::vector fids; getFids(fids); - bool isLevelModified = getProperties()->getDirtyFlag(); - bool isPaletteModified = false; + bool isLevelModified = getProperties()->getDirtyFlag(); + bool isPaletteModified = false; if (getPalette()) isPaletteModified = getPalette()->getDirtyFlag(); if (isLevelModified || isPaletteModified) { @@ -1902,11 +1901,11 @@ void TXshSimpleLevel::saveSimpleLevel(const TFilePath &decodedFp, std::string TXshSimpleLevel::getImageId(const TFrameId &fid, int frameStatus) const { if (frameStatus < 0) frameStatus = getFrameStatus(fid); - std::string prefix = "L"; + std::string prefix = "L"; if (frameStatus & CleanupPreview) prefix = "P"; else if ((frameStatus & (Scanned | Cleanupped)) == Scanned) - prefix = "S"; + prefix = "S"; std::string imageId = m_idBase + "_" + prefix + fid.expand(); return imageId; } @@ -2332,13 +2331,14 @@ TFilePath TXshSimpleLevel::getExistingHookFile( int f, fCount = hookFiles.size(); for (f = 0; f != fCount; ++f) { - fPattern = locals::getPattern(hookFiles[f]); + fPattern = locals::getPattern(hookFiles[f]); if (fPattern < p) p = fPattern, h = f; } assert(h >= 0); - return (h < 0) ? TFilePath() : decodedLevelPath.getParentDir() + - TFilePath(hookFiles[h].toStdWString()); + return (h < 0) ? TFilePath() + : decodedLevelPath.getParentDir() + + TFilePath(hookFiles[h].toStdWString()); } //----------------------------------------------------------------------------- diff --git a/toonz/sources/toonzqt/fxsettings.cpp b/toonz/sources/toonzqt/fxsettings.cpp index 3a33edc1..e826f008 100644 --- a/toonz/sources/toonzqt/fxsettings.cpp +++ b/toonz/sources/toonzqt/fxsettings.cpp @@ -663,7 +663,7 @@ void updateMaximumPageSize(QGridLayout *layout, int &maxLabelWidth, continue; } - QSize itemSize = getItemSize(item); + QSize itemSize = getItemSize(item); if (maxWidgetWidth < itemSize.width()) maxWidgetWidth = itemSize.width(); fieldsHeight += itemSize.height(); } diff --git a/toonz/sources/toonzqt/paletteviewergui.cpp b/toonz/sources/toonzqt/paletteviewergui.cpp index 2502a84b..a88af07b 100644 --- a/toonz/sources/toonzqt/paletteviewergui.cpp +++ b/toonz/sources/toonzqt/paletteviewergui.cpp @@ -598,7 +598,6 @@ static void drawChipName(QPainter &p, const QRect &chipRect, void PageViewer::paintEvent(QPaintEvent *e) { QPainter p(this); QColor textColor = p.pen().color(); - if (m_chipPerRow == 0) { p.drawText(QPoint(5, 25), tr("- No Styles -")); return;