| 1866 | } // EffectInstance::getImageFromCacheAndConvertIfNeeded |
| 1867 | |
| 1868 | void |
| 1869 | EffectInstance::tryConcatenateTransforms(double time, |
| 1870 | bool draftRender, |
| 1871 | ViewIdx view, |
| 1872 | const RenderScale & scale, |
| 1873 | InputMatrixMap* inputTransforms) |
| 1874 | { |
| 1875 | bool canTransform = getNode()->getCurrentCanTransform(); |
| 1876 | |
| 1877 | //An effect might not be able to concatenate transforms but can still apply a transform (e.g CornerPinMasked) |
| 1878 | std::list<int> inputHoldingTransforms; |
| 1879 | bool canApplyTransform = getInputsHoldingTransform(&inputHoldingTransforms); |
| 1880 | |
| 1881 | assert(inputHoldingTransforms.empty() || canApplyTransform); |
| 1882 | |
| 1883 | Transform::Matrix3x3 thisNodeTransform; |
| 1884 | EffectInstancePtr inputToTransform; |
| 1885 | bool getTransformSucceeded = false; |
| 1886 | |
| 1887 | if (canTransform) { |
| 1888 | /* |
| 1889 | * If getting the transform does not succeed, then this effect is treated as any other ones. |
| 1890 | */ |
| 1891 | StatusEnum stat = getTransform_public(time, scale, draftRender, view, &inputToTransform, &thisNodeTransform); |
| 1892 | if (stat == eStatusOK) { |
| 1893 | getTransformSucceeded = true; |
| 1894 | } |
| 1895 | } |
| 1896 | |
| 1897 | |
| 1898 | if ( (canTransform && getTransformSucceeded) || ( !canTransform && canApplyTransform && !inputHoldingTransforms.empty() ) ) { |
| 1899 | for (std::list<int>::iterator it = inputHoldingTransforms.begin(); it != inputHoldingTransforms.end(); ++it) { |
| 1900 | EffectInstancePtr input = getInput(*it); |
| 1901 | if (!input) { |
| 1902 | continue; |
| 1903 | } |
| 1904 | std::list<Transform::Matrix3x3> matricesByOrder; // from downstream to upstream |
| 1905 | InputMatrix im; |
| 1906 | im.newInputEffect = input; |
| 1907 | im.newInputNbToFetchFrom = *it; |
| 1908 | |
| 1909 | |
| 1910 | // recursion upstream |
| 1911 | bool inputCanTransform = false; |
| 1912 | bool inputIsDisabled = input->getNode()->isNodeDisabled(); |
| 1913 | |
| 1914 | if (!inputIsDisabled) { |
| 1915 | inputCanTransform = input->getNode()->getCurrentCanTransform(); |
| 1916 | } |
| 1917 | |
| 1918 | |
| 1919 | while ( input && (inputCanTransform || inputIsDisabled) ) { |
| 1920 | //input is either disabled, or identity or can concatenate a transform too |
| 1921 | if (inputIsDisabled) { |
| 1922 | int prefInput; |
| 1923 | input = input->getNearestNonDisabled(); |
| 1924 | prefInput = input ? input->getNode()->getPreferredInput() : -1; |
| 1925 | if (prefInput == -1) { |
no test coverage detected