| 2544 | } |
| 2545 | |
| 2546 | void |
| 2547 | DefaultScheduler::aboutToStartRender() |
| 2548 | { |
| 2549 | boost::shared_ptr<OutputSchedulerThreadStartArgs> args = getCurrentRunArgs(); |
| 2550 | boost::shared_ptr<OutputEffectInstance> effect = _effect.lock(); |
| 2551 | |
| 2552 | { |
| 2553 | QMutexLocker k(&_currentTimeMutex); |
| 2554 | if (args->pushTimelineDirection == eRenderDirectionForward) { |
| 2555 | _currentTime = args->firstFrame; |
| 2556 | } else { |
| 2557 | _currentTime = args->lastFrame; |
| 2558 | } |
| 2559 | } |
| 2560 | bool isBackGround = appPTR->isBackground(); |
| 2561 | |
| 2562 | if (!isBackGround) { |
| 2563 | effect->setKnobsFrozen(true); |
| 2564 | } else { |
| 2565 | QString longText = QString::fromUtf8( effect->getScriptName_mt_safe().c_str() ) + tr(" ==> Rendering started"); |
| 2566 | appPTR->writeToOutputPipe(longText, QString::fromUtf8(kRenderingStartedShort), true); |
| 2567 | } |
| 2568 | |
| 2569 | // Activate the internal writer node for a write node |
| 2570 | WriteNode* isWriter = dynamic_cast<WriteNode*>( effect.get() ); |
| 2571 | if (isWriter) { |
| 2572 | isWriter->onSequenceRenderStarted(); |
| 2573 | } |
| 2574 | |
| 2575 | std::string cb = effect->getNode()->getBeforeRenderCallback(); |
| 2576 | if ( !cb.empty() ) { |
| 2577 | std::vector<std::string> args; |
| 2578 | std::string error; |
| 2579 | try { |
| 2580 | NATRON_PYTHON_NAMESPACE::getFunctionArguments(cb, &error, &args); |
| 2581 | } catch (const std::exception& e) { |
| 2582 | effect->getApp()->appendToScriptEditor( std::string("Failed to run beforeRender callback: ") |
| 2583 | + e.what() ); |
| 2584 | |
| 2585 | return; |
| 2586 | } |
| 2587 | |
| 2588 | if ( !error.empty() ) { |
| 2589 | effect->getApp()->appendToScriptEditor("Failed to run beforeRender callback: " + error); |
| 2590 | |
| 2591 | return; |
| 2592 | } |
| 2593 | |
| 2594 | std::string signatureError; |
| 2595 | signatureError.append("The beforeRender callback supports the following signature(s):\n"); |
| 2596 | signatureError.append("- callback(thisNode, app)"); |
| 2597 | if (args.size() != 2) { |
| 2598 | effect->getApp()->appendToScriptEditor("Failed to run beforeRender callback: " + signatureError); |
| 2599 | |
| 2600 | return; |
| 2601 | } |
| 2602 | |
| 2603 | if ( (args[0] != "thisNode") || (args[1] != "app") ) { |
nothing calls this directly
no test coverage detected