Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// System-core includes
Shinya Kitaoka 120a6e
#include "tsystem.h"  //Processors count
Toshihiro Shimizu 890ddd
#include "timagecache.h"
Toshihiro Shimizu 890ddd
#include "tw/stringtable.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Toonz scene-stage structures
Toshihiro Shimizu 890ddd
#include "toonz/toonzscene.h"
Toshihiro Shimizu 890ddd
#include "toonz/tscenehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/sceneproperties.h"
Toshihiro Shimizu 890ddd
#include "toonz/tframehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tfxhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tpalettehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevelhandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tobjecthandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tstageobjecttree.h"
Toshihiro Shimizu 890ddd
#include "toonz/tcamera.h"
Toshihiro Shimizu 890ddd
#include "toonz/palettecontroller.h"
Shinya Kitaoka 120a6e
#include "tapp.h"  //Toonz current objects
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Images stuff
Toshihiro Shimizu 890ddd
#include "trasterimage.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Fxs stuff
Toshihiro Shimizu 890ddd
#include "toutputproperties.h"
Toshihiro Shimizu 890ddd
#include "trasterfx.h"
Shinya Kitaoka 120a6e
#include "toonz/scenefx.h"  //Fxs tree build-up
Toshihiro Shimizu 890ddd
#include "toonz/tcolumnfx.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Cache management
Toshihiro Shimizu 890ddd
#include "tpassivecachemanager.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Flipbook
Toshihiro Shimizu 890ddd
#include "flipbook.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/flipconsole.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Qt stuff
Toshihiro Shimizu 890ddd
#include <qmetatype></qmetatype>
Toshihiro Shimizu 890ddd
#include <qregion></qregion>
luz paz 6454c4
#include "toonzqt/gutil.h"  //For conversions between TRects and QRects
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Preferences
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "previewfxmanager.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=======================================================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Resume: The 'Preview Fx' command shows a flipbook associated with given fx,
Shinya Kitaoka 120a6e
// containing the appearance
Shinya Kitaoka 120a6e
//         of the fx under current rendering status (including current camera,
Shinya Kitaoka 120a6e
//         preview settings, schematic tree).
Toshihiro Shimizu 890ddd
//
Toshihiro Shimizu 890ddd
// There are some considerations to be aware of:
Shinya Kitaoka 120a6e
//   1. A Preview Fx flipbook must hold the render of the whole Preview settings
Shinya Kitaoka 120a6e
//   range. Plus, many Preview Fx
Shinya Kitaoka 120a6e
//      could live altogether. It could be that more than one Preview Fx window
Shinya Kitaoka 120a6e
//      is active for the same fx.
Shinya Kitaoka 120a6e
//   2. The flipbook associated with a 'Preview Fx' command should react to
Shinya Kitaoka 120a6e
//   updates of the rendering status.
Shinya Kitaoka 120a6e
//      This should happen as long as the fx actually has a meaning in the
Shinya Kitaoka 120a6e
//      rendering context - that is, if
Shinya Kitaoka 120a6e
//      the user enters sub- or super-xsheets, the flipbook should continue
Shinya Kitaoka 120a6e
//      rendering with
Shinya Kitaoka 120a6e
//      the old data. Possibly, if modifying a sub-xsheet, an 'upper' Preview Fx
Shinya Kitaoka 120a6e
//      should react accordingly.
Shinya Kitaoka 120a6e
//   3. Fx Subtree aliases retrieved through TRasterFx::getAlias() may be used
Shinya Kitaoka 120a6e
//   to decide if some frame has to
Toshihiro Shimizu 890ddd
//      be rebuilt.
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=======================================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//  Forward declarations
Toshihiro Shimizu 890ddd
class PreviewFxInstance;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=======================================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================
Toshihiro Shimizu 890ddd
//    Preliminary functions
Toshihiro Shimizu 890ddd
//------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace {
Shinya Kitaoka 120a6e
bool suspendedRendering             = false;
Toshihiro Shimizu 890ddd
PreviewFxManager *previewerInstance = 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Timer used to deliver scene changes notifications in an 'overridden' fashion.
Shinya Kitaoka 120a6e
// In practice, only the last (up to a fixed time granularity) of these
Shinya Kitaoka 120a6e
// notifications
Shinya Kitaoka 120a6e
// is actually received by the manager's associated slots.
Shinya Kitaoka 120a6e
QTimer levelChangedTimer, fxChangedTimer, xsheetChangedTimer,
Shinya Kitaoka 120a6e
    objectChangedTimer;
Toshihiro Shimizu 890ddd
const int notificationDelay = 300;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
inline std::string getCacheId(const TFxP &fx, int frame) {
Shinya Kitaoka 120a6e
  return std::to_string(fx->getIdentifier()) + ".noext" + std::to_string(frame);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// NOTE: This method will not currently trespass xsheet level boundaries. It
Shinya Kitaoka 120a6e
// will not
Shinya Kitaoka 120a6e
// recognize descendants in sub-xsheets....
Shinya Kitaoka 120a6e
bool areAncestorAndDescendant(const TFxP &ancestor, const TFxP &descendant) {
Shinya Kitaoka 120a6e
  if (ancestor.getPointer() == descendant.getPointer()) return true;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < ancestor->getInputPortCount(); ++i)
Shinya Kitaoka 120a6e
    if (areAncestorAndDescendant(ancestor->getInputPort(i)->getFx(),
Shinya Kitaoka 120a6e
                                 descendant))
Shinya Kitaoka 120a6e
      return true;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Qt's contains actually returns QRegion::intersected... I wonder why...
Shinya Kitaoka 120a6e
inline bool contains(const QRegion ®ion, const TRect &rect) {
Shinya Kitaoka 120a6e
  return QRegion(toQRect(rect)).subtracted(region).isEmpty();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
inline void adaptView(FlipBook *flipbook, TDimension cameraSize) {
Shinya Kitaoka 120a6e
  TRect imgRect(cameraSize);
Shinya Kitaoka 120a6e
  flipbook->getImageViewer()->adaptView(imgRect, imgRect);
Toshihiro Shimizu 890ddd
}
shun-iwasawa c7dccf
};  // namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=======================================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==================================
Toshihiro Shimizu 890ddd
//    PreviewFxRenderPort class
Toshihiro Shimizu 890ddd
//----------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! This class receives and handles notifications from a TRenderer executing the
Shinya Kitaoka 120a6e
//! preview fx
Toshihiro Shimizu 890ddd
//! rendering job.
Shinya Kitaoka d1f6c4
class PreviewFxRenderPort final : public QObject, public TRenderPort {
Shinya Kitaoka 120a6e
  PreviewFxInstance *m_owner;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  PreviewFxRenderPort(PreviewFxInstance *owner);
Shinya Kitaoka 120a6e
  ~PreviewFxRenderPort();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 38fd86
  void onRenderRasterStarted(
Shinya Kitaoka 38fd86
      const TRenderPort::RenderData &renderData) override;
Shinya Kitaoka 473e70
  void onRenderRasterCompleted(const RenderData &renderData) override;
Shinya Kitaoka 473e70
  void onRenderFailure(const RenderData &renderData, TException &e) override;
Shinya Kitaoka 473e70
  void onRenderFinished(bool inCanceled = false) override;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PreviewFxRenderPort::PreviewFxRenderPort(PreviewFxInstance *owner)
Shinya Kitaoka 120a6e
    : m_owner(owner) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
PreviewFxRenderPort::~PreviewFxRenderPort() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=======================================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==========================
Toshihiro Shimizu 890ddd
//    PreviewFxInstance
Toshihiro Shimizu 890ddd
//--------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
class PreviewFxInstance {
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  struct FrameInfo {
Shinya Kitaoka 120a6e
    std::string m_alias;
Shinya Kitaoka 120a6e
    QRegion m_renderedRegion;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    FrameInfo(const std::string &alias) : m_alias(alias) {}
Shinya Kitaoka 120a6e
  };
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  TXsheetP m_xsheet;
Shinya Kitaoka 120a6e
  TRasterFxP m_fx;
Shinya Kitaoka 120a6e
  TRenderer m_renderer;
Shinya Kitaoka 120a6e
  PreviewFxRenderPort m_renderPort;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::set<flipbook *=""> m_flipbooks;</flipbook>
Shinya Kitaoka 120a6e
  std::set<flipbook *=""> m_frozenFlips;  // Used externally by PreviewFxManager</flipbook>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int m_start, m_end, m_step, m_initFrame;
Shinya Kitaoka 120a6e
  std::map<int, frameinfo=""> m_frameInfos;  // Used to resume fx tree structures</int,>
Shinya Kitaoka 120a6e
  std::vector<uchar> m_pbStatus;</uchar>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TRenderSettings m_renderSettings;
Shinya Kitaoka 120a6e
  TDimension m_cameraRes;
Shinya Kitaoka 120a6e
  TRectD m_renderArea;
Shinya Kitaoka 120a6e
  TPointD m_cameraPos;
Shinya Kitaoka 120a6e
  TPointD m_subcameraDisplacement;
Shinya Kitaoka 120a6e
  bool m_subcamera;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QRegion m_overallRenderedRegion;
Shinya Kitaoka 120a6e
  TRect m_rectUnderRender;
Shinya Kitaoka 120a6e
  bool m_renderFailed;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  TLevelP m_level;
Shinya Kitaoka 120a6e
  TSoundTrackP m_snd;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  PreviewFxInstance(TFxP fx, TXsheet *xsh);
Shinya Kitaoka 120a6e
  ~PreviewFxInstance();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  void addFlipbook(FlipBook *&flipbook);
Shinya Kitaoka 120a6e
  void detachFlipbook(FlipBook *flipbook);
Shinya Kitaoka 120a6e
  void updateFlipbooks();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void refreshViewRects(bool rebuild = false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void reset();
Shinya Kitaoka 120a6e
  void reset(int frame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Updater methods. These refresh the manager's status, but do not launch new
Shinya Kitaoka 120a6e
  // renders
Shinya Kitaoka 120a6e
  // on their own. The refreshViewRects method must be invoked to trigger it.
Shinya Kitaoka 120a6e
  // Observe that there may exist dependencies among them - invoking in the
Shinya Kitaoka 120a6e
  // following
Shinya Kitaoka 120a6e
  // declaration order is safe.
Shinya Kitaoka 120a6e
  void updateFrameRange();
Shinya Kitaoka 120a6e
  void updateInitialFrame();
Shinya Kitaoka 120a6e
  void updateRenderSettings();
Shinya Kitaoka 120a6e
  void updateCamera();
Shinya Kitaoka 120a6e
  void updateFlipbookTitles();
Shinya Kitaoka 120a6e
  void updatePreviewRect();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void updateAliases();
Shinya Kitaoka 120a6e
  void updateAliasKeyword(const std::string &keyword);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void updateProgressBarStatus();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void onRenderRasterStarted(const TRenderPort::RenderData &renderData);
Shinya Kitaoka 120a6e
  void onRenderRasterCompleted(const TRenderPort::RenderData &renderData);
Shinya Kitaoka 120a6e
  void onRenderFailure(const TRenderPort::RenderData &renderData,
Shinya Kitaoka 120a6e
                       TException &e);
Shinya Kitaoka 120a6e
  void onRenderFinished(bool isCanceled = false);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void doOnRenderRasterCompleted(const TRenderPort::RenderData &renderData);
Shinya Kitaoka 120a6e
  void doOnRenderRasterStarted(const TRenderPort::RenderData &renderData);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool isSubCameraActive() { return m_subcamera; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  void cropAndStep(int &frame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool isFullPreview();
Shinya Kitaoka 120a6e
  TFxP buildSceneFx(int frame);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void addRenderData(std::vector<trenderer::renderdata> &datas,</trenderer::renderdata>
Shinya Kitaoka 120a6e
                     ToonzScene *scene, int frame, bool rebuild);
Shinya Kitaoka 120a6e
  void startRender(bool rebuild = false);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
inline bool PreviewFxInstance::isFullPreview() {
Shinya Kitaoka 120a6e
  return dynamic_cast<toutputfx *="">((TFx *)m_fx.getPointer());</toutputfx>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
inline void PreviewFxInstance::cropAndStep(int &frame) {
Shinya Kitaoka 120a6e
  frame = frame < m_start ? m_start : frame;
Shinya Kitaoka 120a6e
  frame = (frame > m_end && m_end > -1) ? m_end : frame;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // If a step was specified, ensure that frame is on step multiples.
Shinya Kitaoka 120a6e
  int framePos = (frame - m_start) / m_step;
Shinya Kitaoka 120a6e
  frame        = m_start + (framePos * m_step);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
inline TFxP PreviewFxInstance::buildSceneFx(int frame) {
Shinya Kitaoka 120a6e
  TApp *app         = TApp::instance();
Shinya Kitaoka 120a6e
  ToonzScene *scene = app->getCurrentScene()->getScene();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (isFullPreview())
Shinya Kitaoka 120a6e
    return ::buildSceneFx(scene, m_xsheet.getPointer(), frame,
Shinya Kitaoka 120a6e
                          m_renderSettings.m_shrinkX, true);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return ::buildPartialSceneFx(scene, m_xsheet.getPointer(), frame, m_fx,
Shinya Kitaoka 120a6e
                                 m_renderSettings.m_shrinkX, true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::addRenderData(std::vector<trenderer::renderdata> &datas,</trenderer::renderdata>
Shinya Kitaoka 120a6e
                                      ToonzScene *scene, int frame,
Shinya Kitaoka 120a6e
                                      bool rebuild) {
Shinya Kitaoka 120a6e
  // Seek the image associated to the render data in the cache.
Shinya Kitaoka 120a6e
  std::map<int, frameinfo="">::iterator it;</int,>
Shinya Kitaoka 120a6e
  it = m_frameInfos.find(frame);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TRasterFxP builtFx =
Shinya Kitaoka 120a6e
      buildSceneFx(frame);  // when stereoscopic, i use this only for the alias
Shinya Kitaoka 120a6e
  TRasterFxP builtFxA, builtFxB;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_renderSettings.m_stereoscopic) {
Shinya Kitaoka 120a6e
    ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Shinya Kitaoka 120a6e
    scene->shiftCameraX(-m_renderSettings.m_stereoscopicShift / 2);
Shinya Kitaoka 120a6e
    builtFxA = buildSceneFx(frame);
Shinya Kitaoka 120a6e
    scene->shiftCameraX(m_renderSettings.m_stereoscopicShift);
Shinya Kitaoka 120a6e
    builtFxB = buildSceneFx(frame);
Shinya Kitaoka 120a6e
    scene->shiftCameraX(-m_renderSettings.m_stereoscopicShift / 2);
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    builtFxA = builtFx;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (it == m_frameInfos.end()) {
Shinya Kitaoka 120a6e
    // Should not be - however, in this case build an associated Frame info
Shinya Kitaoka 120a6e
    it = m_frameInfos.insert(std::make_pair(frame, FrameInfo(std::string())))
Shinya Kitaoka 120a6e
             .first;
Shinya Kitaoka 120a6e
    it->second.m_alias =
Shinya Kitaoka 120a6e
        builtFx ? builtFx->getAlias(frame, m_renderSettings) : "";
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool isCalculated =
Shinya Kitaoka 120a6e
      (!builtFx) || ((!rebuild) && ::contains(it->second.m_renderedRegion,
Shinya Kitaoka 120a6e
                                              m_rectUnderRender));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_pbStatus[(frame - m_start) / m_step] = isCalculated
Shinya Kitaoka 120a6e
                                               ? FlipSlider::PBFrameFinished
Shinya Kitaoka 120a6e
                                               : FlipSlider::PBFrameNotStarted;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // If it is already present, return
Shinya Kitaoka 120a6e
  if (isCalculated) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  datas.push_back(TRenderer::RenderData(frame, m_renderSettings,
Shinya Kitaoka 120a6e
                                        TFxPair(builtFxA, builtFxB)));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
PreviewFxInstance::PreviewFxInstance(TFxP fx, TXsheet *xsh)
Shinya Kitaoka 120a6e
    : m_renderer(TSystem::getProcessorCount())
Shinya Kitaoka 120a6e
    , m_renderPort(this)
Shinya Kitaoka 120a6e
    , m_fx(fx)
Shinya Kitaoka 120a6e
    , m_cameraRes(0, 0)
Shinya Kitaoka 120a6e
    , m_start(0)
Shinya Kitaoka 120a6e
    , m_end(-1)
Shinya Kitaoka 120a6e
    , m_initFrame(0)
Shinya Kitaoka 120a6e
    , m_xsheet(xsh) {
Shinya Kitaoka 120a6e
  // Install the render port on the instance renderer
Shinya Kitaoka 120a6e
  m_renderer.addPort(&m_renderPort);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  updateRenderSettings();
Shinya Kitaoka 120a6e
  updateCamera();
Shinya Kitaoka 120a6e
  updateFrameRange();
Shinya Kitaoka 120a6e
  updateAliases();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
PreviewFxInstance::~PreviewFxInstance() {
Shinya Kitaoka 120a6e
  // Stop the render - there is no need to wait for a complete (and blocking)
Shinya Kitaoka 120a6e
  // render stop.
Shinya Kitaoka 120a6e
  m_renderer.removePort(
Shinya Kitaoka 120a6e
      &m_renderPort);  // No more images to be stored in the cache!
Shinya Kitaoka 120a6e
  m_renderer.stopRendering();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Release the user cache about this instance
Shinya Kitaoka 120a6e
  std::string contextName("PFX");
Shinya Kitaoka 120a6e
  contextName += std::to_string(m_fx->getIdentifier());
Shinya Kitaoka 120a6e
  TPassiveCacheManager::instance()->releaseContextNamesWithPrefix(contextName);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Clear the cached images
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = m_start; i <= m_end; i += m_step)
Shinya Kitaoka 120a6e
    TImageCache::instance()->remove(getCacheId(m_fx, i));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
luz paz 6454c4
//! Clears the preview instance information about passed frame, including any
Shinya Kitaoka 120a6e
//! cached image.
luz paz 6454c4
//! Information needed to preview again are NOT rebuilt.
Shinya Kitaoka 120a6e
void PreviewFxInstance::reset(int frame) {
Shinya Kitaoka 120a6e
  TImageCache::instance()->remove(getCacheId(m_fx, frame));
Shinya Kitaoka 120a6e
  std::map<int, frameinfo="">::iterator it = m_frameInfos.find(frame);</int,>
Shinya Kitaoka 120a6e
  if (it != m_frameInfos.end()) {
Shinya Kitaoka 120a6e
    TRasterFxP builtFx = buildSceneFx(frame);
Shinya Kitaoka 120a6e
    it->second.m_alias =
Shinya Kitaoka 120a6e
        builtFx ? builtFx->getAlias(frame, m_renderSettings) : "";
Shinya Kitaoka 120a6e
    it->second.m_renderedRegion = QRegion();
Shinya Kitaoka 120a6e
    m_overallRenderedRegion     = QRegion();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
luz paz 6454c4
//! Clears the preview instance information, including cached images.
luz paz 6454c4
//! Information needed
Toshihiro Shimizu 890ddd
//! to preview again are rebuilt.
Shinya Kitaoka 120a6e
void PreviewFxInstance::reset() {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = m_start; i <= m_end; i += m_step)
Shinya Kitaoka 120a6e
    TImageCache::instance()->remove(getCacheId(m_fx, i));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_frameInfos.clear();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  updateFrameRange();
Shinya Kitaoka 120a6e
  updateRenderSettings();
Shinya Kitaoka 120a6e
  updateCamera();
Shinya Kitaoka 120a6e
  updateFlipbookTitles();
Shinya Kitaoka 120a6e
  updateAliases();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::addFlipbook(FlipBook *&flipbook) {
Shinya Kitaoka 120a6e
  TApp *app         = TApp::instance();
Shinya Kitaoka 120a6e
  ToonzScene *scene = app->getCurrentScene()->getScene();
Shinya Kitaoka 120a6e
  TOutputProperties *properties =
Shinya Kitaoka 120a6e
      scene->getProperties()->getPreviewProperties();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int currFrame = flipbook ? flipbook->getCurrentFrame() - 1
Shinya Kitaoka 120a6e
                           : app->getCurrentFrame()->getFrame();
Shinya Kitaoka 120a6e
  cropAndStep(currFrame);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!flipbook) {
Shinya Kitaoka 120a6e
    /*-- 使用可能なFlipbookを取り出す。Poolに無い場合は新たに作る --*/
Shinya Kitaoka 120a6e
    flipbook = FlipBookPool::instance()->pop();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // In case this is a subcamera preview, fit the flipbook's view. This is
Shinya Kitaoka 120a6e
    // done *before* associating
Shinya Kitaoka 120a6e
    // m_fx to the flipbook (using Flipbook::setLevel) - so there is no
Shinya Kitaoka 120a6e
    // duplicate view refresh.
Shinya Kitaoka 120a6e
    /*-- Preview Settingsで"Use Sub Camera"
Shinya Kitaoka 120a6e
     * がONのとき、サブカメラ枠の外は計算しないようになる --*/
Shinya Kitaoka 120a6e
    if (m_subcamera) {
Shinya Kitaoka 120a6e
      // result->adaptGeometry(TRect(previewInstance->m_cameraRes));   //This
Shinya Kitaoka 120a6e
      // one fits the panel, too.
Shinya Kitaoka 120a6e
      adaptView(flipbook, m_cameraRes);  // This one adapts the view. If has
Shinya Kitaoka 120a6e
                                         // associated fx, calls refresh...
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      // Retrieve the eventual sub-camera
Shinya Kitaoka 120a6e
      TCamera *currCamera = TApp::instance()
Shinya Kitaoka 120a6e
                                ->getCurrentScene()
Shinya Kitaoka 120a6e
                                ->getScene()
Shinya Kitaoka 120a6e
                                ->getCurrentPreviewCamera();
Shinya Kitaoka 120a6e
      TRect subcameraRect(currCamera->getInterestRect());
Shinya Kitaoka 120a6e
      /*-- Viewer上でサブカメラが指定されている状態でFxPreviewをした場合 --*/
Shinya Kitaoka 120a6e
      if (subcameraRect.getLx() > 0 && subcameraRect.getLy() > 0) {
Shinya Kitaoka 120a6e
        /*-- サブカメラ枠のShrink --*/
Shinya Kitaoka 120a6e
        if (m_renderSettings.m_shrinkX > 1 || m_renderSettings.m_shrinkY > 1) {
Shinya Kitaoka 120a6e
          subcameraRect.x0 /= m_renderSettings.m_shrinkX;
Shinya Kitaoka 120a6e
          subcameraRect.y0 /= m_renderSettings.m_shrinkY;
Shinya Kitaoka 120a6e
          subcameraRect.x1 =
Shinya Kitaoka 120a6e
              (subcameraRect.x1 + 1) / m_renderSettings.m_shrinkX - 1;
Shinya Kitaoka 120a6e
          subcameraRect.y1 =
Shinya Kitaoka 120a6e
              (subcameraRect.y1 + 1) / m_renderSettings.m_shrinkY - 1;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // Fit & pan the panel to cover the sub-camera
Shinya Kitaoka 120a6e
        flipbook->adaptGeometry(subcameraRect, TRect(TPoint(), m_cameraRes));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    /*-- フリーズボタンの表示 --*/
Shinya Kitaoka 120a6e
    flipbook->addFreezeButtonToTitleBar();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_flipbooks.insert(flipbook);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- タイトルの設定。Previewコマンドから呼ばれた場合はisFullPreviewがON --*/
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Build the fx string description - Should really be moved in a better
Shinya Kitaoka 120a6e
  // function...
Shinya Kitaoka 120a6e
  std::wstring fxId;
Shinya Kitaoka 120a6e
  TLevelColumnFx *columnFx = dynamic_cast<tlevelcolumnfx *="">(m_fx.getPointer());</tlevelcolumnfx>
Shinya Kitaoka 120a6e
  TZeraryColumnFx *sfx     = dynamic_cast<tzerarycolumnfx *="">(m_fx.getPointer());</tzerarycolumnfx>
Shinya Kitaoka 120a6e
  if (columnFx)
Shinya Kitaoka 120a6e
    fxId =
Shinya Kitaoka 120a6e
        L"Col" + QString::number(columnFx->getColumnIndex() + 1).toStdWString();
Shinya Kitaoka 120a6e
  else if (sfx)
Shinya Kitaoka 120a6e
    fxId = sfx->getZeraryFx()->getFxId();
Shinya Kitaoka 120a6e
  else {
shun-iwasawa c7dccf
    fxId = m_fx->getFxId();
Shinya Kitaoka 120a6e
    if (fxId.empty()) fxId = m_fx->getName();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Adjust the flipbook appropriately
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Decorate the description for the flipbook
Shinya Kitaoka 120a6e
  if (isFullPreview()) {
Shinya Kitaoka 120a6e
    flipbook->setTitle(
Shinya Kitaoka 120a6e
        /*"Rendered Frames  ::  From " + QString::number(m_start+1) +
Shinya Kitaoka 120a6e
            " To " + QString::number(m_end+1) +
Shinya Kitaoka 120a6e
     "  ::  Step " + QString::number(m_step)*/
Shinya Kitaoka 120a6e
        QObject::tr("Rendered Frames  ::  From %1 To %2  ::  Step %3")
Shinya Kitaoka 120a6e
            .arg(QString::number(m_start + 1))
Shinya Kitaoka 120a6e
            .arg(QString::number(m_end + 1))
Shinya Kitaoka 120a6e
            .arg(QString::number(m_step)));
Shinya Kitaoka 120a6e
    TXsheet::SoundProperties *prop = new TXsheet::SoundProperties();
Shinya Kitaoka 120a6e
    prop->m_frameRate              = properties->getFrameRate();
Shinya Kitaoka 120a6e
    m_snd                          = m_xsheet->makeSound(prop);
Shinya Kitaoka 120a6e
    if (Preferences::instance()->fitToFlipbookEnabled())
Shinya Kitaoka 120a6e
      flipbook->getImageViewer()->adaptView(TRect(m_cameraRes),
Shinya Kitaoka 120a6e
                                            TRect(m_cameraRes));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    flipbook->setTitle(
Shinya Kitaoka 120a6e
        QObject::tr("Preview FX :: %1 ").arg(QString::fromStdWString(fxId)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // In case the render is a full preview, add the soundtrack
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Associate the rendered level to flipbook
Shinya Kitaoka 120a6e
  flipbook->setLevel(m_fx.getPointer(), m_xsheet.getPointer(),
Shinya Kitaoka 120a6e
                     m_level.getPointer(), 0, m_start + 1, m_end + 1, m_step,
Shinya Kitaoka 120a6e
                     currFrame + 1, m_snd.getPointer());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Add the progress bar status pointer
Shinya Kitaoka 120a6e
  flipbook->setProgressBarStatus(&m_pbStatus);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::detachFlipbook(FlipBook *flipbook) {
Shinya Kitaoka 120a6e
  // Just remove the flipbook from the flipbooks container
Shinya Kitaoka 120a6e
  std::set<flipbook *="">::iterator it = m_flipbooks.find(flipbook);</flipbook>
Shinya Kitaoka 120a6e
  if (it == m_flipbooks.end()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_flipbooks.erase(it);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // If the flipbook set associated with the render is now empty, stop the
Shinya Kitaoka 120a6e
  // render
Shinya Kitaoka 120a6e
  if (m_flipbooks.empty()) m_renderer.stopRendering();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateFlipbooks() {
Shinya Kitaoka 120a6e
  std::set<flipbook *="">::iterator it;</flipbook>
Shinya Kitaoka 120a6e
  for (it = m_flipbooks.begin(); it != m_flipbooks.end(); ++it) (*it)->update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateFrameRange() {
Shinya Kitaoka 120a6e
  TApp *app         = TApp::instance();
Shinya Kitaoka 120a6e
  ToonzScene *scene = app->getCurrentScene()->getScene();
Shinya Kitaoka 120a6e
  TOutputProperties *properties =
Shinya Kitaoka 120a6e
      scene->getProperties()->getPreviewProperties();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int frameCount = m_xsheet->getFrameCount();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Initialize the render starting from current frame. If not in the preview
Shinya Kitaoka 120a6e
  // range,
Shinya Kitaoka 120a6e
  // start from the closest range extreme.
Shinya Kitaoka 120a6e
  properties->getRange(m_start, m_end, m_step);
Shinya Kitaoka 120a6e
  if (m_end < 0) m_end = frameCount - 1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Intersect with the fx active frame range
Shinya Kitaoka 120a6e
  TRasterFxP rasterFx(m_fx);
Shinya Kitaoka 120a6e
  TFxTimeRegion timeRegion(rasterFx->getTimeRegion());
Shinya Kitaoka 120a6e
  m_start = std::max(timeRegion.getFirstFrame(), m_start);
Shinya Kitaoka 120a6e
  m_end   = std::min(timeRegion.getLastFrame(), m_end);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Release all images not in the new frame range
Shinya Kitaoka 120a6e
  std::map<int, frameinfo="">::iterator it, jt;</int,>
Shinya Kitaoka 120a6e
  for (it = m_frameInfos.begin(); it != m_frameInfos.end();) {
Shinya Kitaoka 120a6e
    if (it->first < m_start || it->first > m_end ||
Shinya Kitaoka 120a6e
        ((it->first - m_start) % m_step)) {
Shinya Kitaoka 120a6e
      TImageCache::instance()->remove(getCacheId(m_fx, it->first));
Shinya Kitaoka 120a6e
      jt = it++;
Shinya Kitaoka 120a6e
      m_frameInfos.erase(jt);
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      ++it;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Build a level to associate the flipbook with the rendered output
Shinya Kitaoka 120a6e
  m_level->setName(std::to_string(m_fx->getIdentifier()) + ".noext");
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = 0; i < frameCount; i++) m_level->setFrame(TFrameId(i), 0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Resize and update internal containers
Shinya Kitaoka 120a6e
  if (m_start > m_end) {
Shinya Kitaoka 120a6e
    m_frameInfos.clear();
Shinya Kitaoka 120a6e
    m_pbStatus.clear();
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    // Build the new frame-alias range
Shinya Kitaoka 120a6e
    for (i = m_start; i <= m_end; i += m_step)
Shinya Kitaoka 120a6e
      if (m_frameInfos.find(i) == m_frameInfos.end()) {
Shinya Kitaoka 120a6e
        // Clear the overall rendered region and build the frame info
Shinya Kitaoka 120a6e
        m_overallRenderedRegion = QRegion();
Shinya Kitaoka 120a6e
        m_frameInfos.insert(std::make_pair(i, std::string()));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Resize the progress bar
Shinya Kitaoka 120a6e
    m_pbStatus.resize((m_end - m_start) / m_step + 1);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Reset the flipbooks' frame range
Shinya Kitaoka 120a6e
  std::set<flipbook *="">::iterator kt;</flipbook>
Shinya Kitaoka 120a6e
  int currFrame;
Shinya Kitaoka 120a6e
  bool fullPreview = isFullPreview();
Shinya Kitaoka 120a6e
  for (kt = m_flipbooks.begin(); kt != m_flipbooks.end(); ++kt) {
Shinya Kitaoka 120a6e
    currFrame = (*kt)->getCurrentFrame() - 1;
Shinya Kitaoka 120a6e
    cropAndStep(currFrame);
Shinya Kitaoka 120a6e
    (*kt)->setLevel(m_fx.getPointer(), m_xsheet.getPointer(),
Shinya Kitaoka 120a6e
                    m_level.getPointer(), 0, m_start + 1, m_end + 1, m_step,
Shinya Kitaoka 120a6e
                    currFrame + 1, m_snd.getPointer());
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateInitialFrame() {
Shinya Kitaoka 120a6e
  // Search all flipbooks and take the minimum of each's current
Shinya Kitaoka 120a6e
  std::set<flipbook *="">::iterator kt;</flipbook>
Shinya Kitaoka 120a6e
  m_initFrame = (std::numeric_limits<int>::max)();</int>
Shinya Kitaoka 120a6e
  for (kt = m_flipbooks.begin(); kt != m_flipbooks.end(); ++kt)
Shinya Kitaoka 120a6e
    m_initFrame = std::min(m_initFrame, (*kt)->getCurrentFrame() - 1);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  cropAndStep(m_initFrame);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateFlipbookTitles() {
Shinya Kitaoka 120a6e
  if (isFullPreview() && m_start <= m_end) {
Shinya Kitaoka 120a6e
    int start = m_start + 1;
Shinya Kitaoka 120a6e
    int end   = m_end + 1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    std::set<flipbook *="">::iterator kt;</flipbook>
Shinya Kitaoka 120a6e
    for (kt = m_flipbooks.begin(); kt != m_flipbooks.end(); ++kt) {
Shinya Kitaoka 120a6e
      // In the full preview case, the title must display the frame range
luz paz 6454c4
      // information
Shinya Kitaoka 120a6e
      (*kt)->setTitle(
Shinya Kitaoka 120a6e
          /*"Rendered Frames  ::  From " + QString::number(start) +
Shinya Kitaoka 120a6e
        " To " + QString::number(end) +
Shinya Kitaoka 120a6e
 "  ::  Step " + QString::number(m_step)*/
Shinya Kitaoka 120a6e
          QObject::tr("Rendered Frames  ::  From %1 To %2  ::  Step %3")
Shinya Kitaoka 120a6e
              .arg(QString::number(start))
Shinya Kitaoka 120a6e
              .arg(QString::number(end))
Shinya Kitaoka 120a6e
              .arg(QString::number(m_step)));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateAliases() {
Shinya Kitaoka 120a6e
  if (m_start > m_end) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::string newAlias;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Build and compare the new aliases with the stored ones
Shinya Kitaoka 120a6e
  std::map<int, frameinfo="">::iterator it;</int,>
Shinya Kitaoka 120a6e
  for (it = m_frameInfos.begin(); it != m_frameInfos.end(); ++it) {
Shinya Kitaoka 120a6e
    TRasterFxP builtFx = buildSceneFx(it->first);
Shinya Kitaoka 120a6e
    newAlias = builtFx ? builtFx->getAlias(it->first, m_renderSettings) : "";
Shinya Kitaoka 120a6e
    if (newAlias != it->second.m_alias) {
Shinya Kitaoka 120a6e
      // Clear the overall and frame-specific rendered regions
Shinya Kitaoka 120a6e
      m_overallRenderedRegion     = QRegion();
Shinya Kitaoka 120a6e
      it->second.m_renderedRegion = QRegion();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      it->second.m_alias = newAlias;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateAliasKeyword(const std::string &keyword) {
Shinya Kitaoka 120a6e
  if (m_start > m_end) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Remove the rendered image whose alias contains keyword
Shinya Kitaoka 120a6e
  std::map<int, frameinfo="">::iterator it;</int,>
Shinya Kitaoka 120a6e
  for (it = m_frameInfos.begin(); it != m_frameInfos.end(); ++it) {
Shinya Kitaoka 120a6e
    if (it->second.m_alias.find(keyword) != std::string::npos) {
Shinya Kitaoka 120a6e
      // Clear the overall and frame-specific rendered regions
Shinya Kitaoka 120a6e
      m_overallRenderedRegion     = QRegion();
Shinya Kitaoka 120a6e
      it->second.m_renderedRegion = QRegion();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // Clear the cached image
Shinya Kitaoka 120a6e
      TRasterImageP ri =
Shinya Kitaoka 120a6e
          TImageCache::instance()->get(getCacheId(m_fx, it->first), true);
Shinya Kitaoka 120a6e
      if (ri) ri->getRaster()->clear();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateProgressBarStatus() {
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  unsigned int j;
Shinya Kitaoka 120a6e
  std::map<int, frameinfo="">::iterator it;</int,>
Shinya Kitaoka 120a6e
  for (i = m_start, j = 0; i <= m_end; i += m_step, ++j) {
Shinya Kitaoka 120a6e
    it            = m_frameInfos.find(i);
Shinya Kitaoka 120a6e
    m_pbStatus[j] = ::contains(it->second.m_renderedRegion, m_rectUnderRender)
Shinya Kitaoka 120a6e
                        ? FlipSlider::PBFrameFinished
Shinya Kitaoka 120a6e
                        : FlipSlider::PBFrameNotStarted;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateRenderSettings() {
Shinya Kitaoka 120a6e
  TApp *app         = TApp::instance();
Shinya Kitaoka 120a6e
  ToonzScene *scene = app->getCurrentScene()->getScene();
Shinya Kitaoka 120a6e
  TOutputProperties *properties =
Shinya Kitaoka 120a6e
      scene->getProperties()->getPreviewProperties();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_subcamera = properties->isSubcameraPreview();
Toshihiro Shimizu 890ddd
shun-iwasawa 481b59
  TRenderSettings renderSettings = properties->getRenderSettings();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_renderSettings != renderSettings) {
Shinya Kitaoka 120a6e
    m_renderSettings = renderSettings;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Erase all previuosly previewed images
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = m_start; i <= m_end; i += m_step)
Shinya Kitaoka 120a6e
      TImageCache::instance()->remove(getCacheId(m_fx, i));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Clear all frame-specific rendered regions
Shinya Kitaoka 120a6e
    std::map<int, frameinfo="">::iterator it;</int,>
Shinya Kitaoka 120a6e
    for (it = m_frameInfos.begin(); it != m_frameInfos.end(); ++it)
Shinya Kitaoka 120a6e
      it->second.m_renderedRegion = QRegion();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updateCamera() {
Shinya Kitaoka 120a6e
  // Clear the overall rendered region
Shinya Kitaoka 120a6e
  m_overallRenderedRegion = QRegion();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Retrieve the preview camera
Shinya Kitaoka 120a6e
  TCamera *currCamera = TApp::instance()
Shinya Kitaoka 120a6e
                            ->getCurrentScene()
Shinya Kitaoka 120a6e
                            ->getScene()
Shinya Kitaoka 120a6e
                            ->getCurrentPreviewCamera();
Shinya Kitaoka 120a6e
  TRect subCameraRect = currCamera->getInterestRect();
Shinya Kitaoka 120a6e
  TPointD cameraPos(-0.5 * currCamera->getRes().lx,
Shinya Kitaoka 120a6e
                    -0.5 * currCamera->getRes().ly);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Update the camera region and camera stage area
Shinya Kitaoka 120a6e
  TDimension cameraRes(0, 0);
Shinya Kitaoka 120a6e
  TRectD renderArea;
Shinya Kitaoka 120a6e
  if (m_subcamera && subCameraRect.getLx() > 0 && subCameraRect.getLy() > 0) {
Shinya Kitaoka 120a6e
    cameraRes  = TDimension(subCameraRect.getLx(), subCameraRect.getLy());
Shinya Kitaoka 120a6e
    renderArea = TRectD(subCameraRect.x0, subCameraRect.y0,
Shinya Kitaoka 120a6e
                        subCameraRect.x1 + 1, subCameraRect.y1 + 1) +
Shinya Kitaoka 120a6e
                 cameraPos;
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    cameraRes  = currCamera->getRes();
Shinya Kitaoka 120a6e
    renderArea = TRectD(cameraPos, TDimensionD(cameraRes.lx, cameraRes.ly));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  cameraRes.lx /= m_renderSettings.m_shrinkX;
Shinya Kitaoka 120a6e
  cameraRes.ly /= m_renderSettings.m_shrinkY;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_cameraRes != cameraRes || m_renderArea != renderArea) {
Shinya Kitaoka 120a6e
    m_cameraRes  = cameraRes;
Shinya Kitaoka 120a6e
    m_renderArea = renderArea;
Shinya Kitaoka 120a6e
    m_cameraPos  = cameraPos;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Build the displacement needed when extracting the flipbooks' views
Shinya Kitaoka 120a6e
    m_subcameraDisplacement =
Shinya Kitaoka 120a6e
        TPointD(0.5 * (m_renderArea.x0 + m_renderArea.x1),
Shinya Kitaoka 120a6e
                0.5 * (m_renderArea.y0 + m_renderArea.y1));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Erase all previuosly previewed images
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = m_start; i <= m_end; i += m_step)
Shinya Kitaoka 120a6e
      TImageCache::instance()->remove(getCacheId(m_fx, i));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Clear all frame-specific rendered regions
Shinya Kitaoka 120a6e
    std::map<int, frameinfo="">::iterator it;</int,>
Shinya Kitaoka 120a6e
    for (it = m_frameInfos.begin(); it != m_frameInfos.end(); ++it)
Shinya Kitaoka 120a6e
      it->second.m_renderedRegion = QRegion();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::updatePreviewRect() {
Shinya Kitaoka 120a6e
  bool isFullRender = false;
Shinya Kitaoka 120a6e
  if (!m_subcamera) {
Shinya Kitaoka 120a6e
    // Retrieve the eventual sub-camera
Shinya Kitaoka 120a6e
    TCamera *currCamera = TApp::instance()
Shinya Kitaoka 120a6e
                              ->getCurrentScene()
Shinya Kitaoka 120a6e
                              ->getScene()
Shinya Kitaoka 120a6e
                              ->getCurrentPreviewCamera();
Shinya Kitaoka 120a6e
    TRect subcameraRect(currCamera->getInterestRect());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    /*-- Viewer上でサブカメラが指定されていない状態でFxPreviewをした場合 --*/
Shinya Kitaoka 120a6e
    if (subcameraRect.getLx() == 0 || subcameraRect.getLy() == 0)
Shinya Kitaoka 120a6e
      isFullRender = true;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Build all the viewRects to be calculated. They will be computed on
Shinya Kitaoka 120a6e
  // consecutive
Shinya Kitaoka 120a6e
  // render operations.
Shinya Kitaoka 120a6e
  // NOTE: For now, we'll perform a simplicistic solution - coalesce all the
Shinya Kitaoka 120a6e
  // flipbooks'
Shinya Kitaoka 120a6e
  // viewrects and launch just one render.
Shinya Kitaoka 120a6e
  TRectD previewRectD;
Shinya Kitaoka 120a6e
  m_rectUnderRender = TRect();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  int shrinkX = m_renderSettings.m_shrinkX;
Shinya Kitaoka 120a6e
  int shrinkY = m_renderSettings.m_shrinkY;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!isFullRender) {
Shinya Kitaoka 120a6e
    // For each opened flipbook
Shinya Kitaoka 120a6e
    /*-- 開いているFlipbookの表示範囲を足しこんでいく --*/
Shinya Kitaoka 120a6e
    std::set<flipbook *="">::iterator it;</flipbook>
Shinya Kitaoka 120a6e
    for (it = m_flipbooks.begin(); it != m_flipbooks.end(); ++it) {
Shinya Kitaoka 120a6e
      // Only visible flipbooks are considered
Shinya Kitaoka 120a6e
      if ((*it)->isVisible())
Shinya Kitaoka 120a6e
        // Retrieve the flipbook's viewRect. Observe that this image geometry
Shinya Kitaoka 120a6e
        // is intended in shrinked image reference, and assumes that the camera
Shinya Kitaoka 120a6e
        // center
Shinya Kitaoka 120a6e
        // lies at coords (0.0, 0.0).
Shinya Kitaoka 120a6e
        previewRectD += (*it)->getPreviewedImageGeometry();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Pass from shrinked to standard image geometry
Shinya Kitaoka 120a6e
    /*-- いったんShrinkを元に戻す --*/
Shinya Kitaoka 120a6e
    previewRectD.x0 *= shrinkX;
Shinya Kitaoka 120a6e
    previewRectD.y0 *= shrinkY;
Shinya Kitaoka 120a6e
    previewRectD.x1 *= shrinkX;
Shinya Kitaoka 120a6e
    previewRectD.y1 *= shrinkY;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Now, the viewer will center the subcamera's raster instead than camera's.
Shinya Kitaoka 120a6e
    // So, we have
Shinya Kitaoka 120a6e
    // to correct the previewRectD by the stored displacement.
Shinya Kitaoka 120a6e
    previewRectD += m_subcameraDisplacement;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    /*-- 表示範囲と計算範囲の共通部分を得る --*/
Shinya Kitaoka 120a6e
    previewRectD *= m_renderArea;
Shinya Kitaoka 120a6e
  } else
Shinya Kitaoka 120a6e
    previewRectD = m_renderArea;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Ensure that rect has the same pixel geometry as the preview camera
Shinya Kitaoka 120a6e
  /*-- 再度Shrink --*/
Shinya Kitaoka 120a6e
  previewRectD -= m_cameraPos;
Shinya Kitaoka 120a6e
  previewRectD.x0 = previewRectD.x0 / shrinkX;
Shinya Kitaoka 120a6e
  previewRectD.y0 = previewRectD.y0 / shrinkY;
Shinya Kitaoka 120a6e
  previewRectD.x1 = previewRectD.x1 / shrinkX;
Shinya Kitaoka 120a6e
  previewRectD.y1 = previewRectD.y1 / shrinkY;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Now, pass to m_cameraRes-relative coordinates
Shinya Kitaoka 120a6e
  /*-- 計算エリア基準の座標 → カメラ基準の座標 --*/
Shinya Kitaoka 120a6e
  TPointD shrinkedRelPos((m_renderArea.x0 - m_cameraPos.x) / shrinkX,
Shinya Kitaoka 120a6e
                         (m_renderArea.y0 - m_cameraPos.y) / shrinkY);
Shinya Kitaoka 120a6e
  previewRectD -= shrinkedRelPos;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  previewRectD.x0 = tfloor(previewRectD.x0);
Shinya Kitaoka 120a6e
  previewRectD.y0 = tfloor(previewRectD.y0);
Shinya Kitaoka 120a6e
  previewRectD.x1 = tceil(previewRectD.x1);
Shinya Kitaoka 120a6e
  previewRectD.y1 = tceil(previewRectD.y1);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- 表示しなくてはいけないRect --*/
Shinya Kitaoka 120a6e
  QRect qViewRect(previewRectD.x0, previewRectD.y0, previewRectD.getLx(),
Shinya Kitaoka 120a6e
                  previewRectD.getLy());
Shinya Kitaoka 120a6e
  /*-- 表示しなくてはいけないRectから、既に計算済みの範囲を引く =
Shinya Kitaoka 120a6e
   * 新たに計算が必要な領域 --*/
Shinya Kitaoka 120a6e
  QRegion viewRectRegionToRender(
Shinya Kitaoka 120a6e
      QRegion(qViewRect).subtracted(m_overallRenderedRegion));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // If the rect to render has already been calculated, continue.
Shinya Kitaoka 120a6e
  /*-- 新たに計算が必要な領域が無ければReturn --*/
Shinya Kitaoka 120a6e
  if (viewRectRegionToRender.isEmpty()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Retrieve the minimal box containing the region yet to be rendered
Shinya Kitaoka 120a6e
  /*-- 新たに計算が必要な領域を含む最小のRectを得る --*/
Shinya Kitaoka 120a6e
  QRect boxRectToRender(viewRectRegionToRender.boundingRect());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- 計算中のRectに登録する --*/
Shinya Kitaoka 120a6e
  m_rectUnderRender = toTRect(boxRectToRender);
Shinya Kitaoka 120a6e
  /*-- カメラ基準の座標 → 計算エリア基準の座標 --*/
Shinya Kitaoka 120a6e
  previewRectD = toTRectD(boxRectToRender) + m_cameraPos + shrinkedRelPos;
Shinya Kitaoka 120a6e
  /*-- RenderAreaをセット --*/
Shinya Kitaoka 120a6e
  m_renderPort.setRenderArea(previewRectD);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::refreshViewRects(bool rebuild) {
Shinya Kitaoka 120a6e
  if (suspendedRendering) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_flipbooks.empty()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Stop any currently running render process. It *should not* be necessary to
Shinya Kitaoka 120a6e
  // wait for complete stop.
Shinya Kitaoka 120a6e
  // WARNING: This requires that different rendering instances are
Shinya Kitaoka 120a6e
  // simultaneously
Shinya Kitaoka 120a6e
  // supported in a single TRenderer...!! We're not currently supporting this...
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    // NOTE: stopRendering(true) LOOPS and may trigger events which delete this
Shinya Kitaoka 120a6e
    // very
Shinya Kitaoka 120a6e
    // render instance. So we have to watch inside the manager to see if this is
Shinya Kitaoka 120a6e
    // still
Shinya Kitaoka 120a6e
    // alive... The following should be removed using stopRendering(false)...
Shinya Kitaoka 120a6e
    // NOTE: The same problem imposes that refreshViewRects() is not invoked
Shinya Kitaoka 120a6e
    // directly
Shinya Kitaoka 120a6e
    // when iterating the previewInstances map - we've used a signal-slot
Shinya Kitaoka 120a6e
    // connection for this.
Shinya Kitaoka 120a6e
    unsigned long fxId = m_fx->getIdentifier();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    m_renderer.stopRendering(true);  // Wait until we've finished
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QMap<unsigned *="" long,="" previewfxinstance=""> &previewInstances =</unsigned>
Shinya Kitaoka 120a6e
        PreviewFxManager::instance()->m_previewInstances;
Shinya Kitaoka 120a6e
    if (previewInstances.find(fxId) == previewInstances.end()) return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (suspendedRendering) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  updatePreviewRect();
Shinya Kitaoka 120a6e
  updateProgressBarStatus();
Shinya Kitaoka 120a6e
  updateFlipbooks();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  startRender(rebuild);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::startRender(bool rebuild) {
Shinya Kitaoka 120a6e
  if (m_start > m_end) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Build the rendering initial frame
Shinya Kitaoka 120a6e
  /*-- m_initialFrameに最初に計算するフレーム番号を格納 --*/
Shinya Kitaoka 120a6e
  updateInitialFrame();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_renderFailed = false;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Fill the production-specific infos (threads count and tile size)
Shinya Kitaoka 120a6e
  TOutputProperties *properties =
Shinya Kitaoka 120a6e
      scene->getProperties()->getPreviewProperties();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Update the threads number
Shinya Kitaoka 120a6e
  const int procCount       = TSystem::getProcessorCount();
Shinya Kitaoka 120a6e
  const int threadCounts[3] = {1, procCount / 2, procCount};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int index = properties->getThreadIndex();
Shinya Kitaoka 120a6e
  m_renderer.setThreadsCount(threadCounts[index]);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Build raster granularity size
Shinya Kitaoka 120a6e
  index = properties->getMaxTileSizeIndex();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  const int maxTileSizes[4] = {
Shinya Kitaoka 120a6e
      (std::numeric_limits<int>::max)(), TOutputProperties::LargeVal,</int>
Shinya Kitaoka 120a6e
      TOutputProperties::MediumVal, TOutputProperties::SmallVal};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int oldMaxTileSize             = m_renderSettings.m_maxTileSize;
Shinya Kitaoka 120a6e
  m_renderSettings.m_maxTileSize = maxTileSizes[index];
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Initialize the vector of TRenderer::RenderData to be rendered. The 'frame'
Shinya Kitaoka 120a6e
  // data
Shinya Kitaoka 120a6e
  // should be inserted first.
Shinya Kitaoka 120a6e
  RenderDataVector *renderDatas = new RenderDataVector;
Shinya Kitaoka 120a6e
  int i;
Shinya Kitaoka 120a6e
  for (i = m_initFrame; i <= m_end; i += m_step)
Shinya Kitaoka 120a6e
    addRenderData(*renderDatas, scene, i, rebuild);
Shinya Kitaoka 120a6e
  for (i = m_start; i < m_initFrame; i += m_step)
Shinya Kitaoka 120a6e
    addRenderData(*renderDatas, scene, i, rebuild);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Restore the original max tile size
Shinya Kitaoka 120a6e
  m_renderSettings.m_maxTileSize = oldMaxTileSize;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Retrieve the renderId
Shinya Kitaoka 120a6e
  unsigned long renderId = m_renderer.nextRenderId();
Shinya Kitaoka 120a6e
  std::string contextName("PFX");
Shinya Kitaoka 120a6e
  contextName += std::to_string(m_fx->getIdentifier());
Shinya Kitaoka 120a6e
  TPassiveCacheManager::instance()->setContextName(renderId, contextName);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Finally, start rendering all frames which were not found in cache
Shinya Kitaoka 120a6e
  m_renderer.startRendering(renderDatas);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxRenderPort::onRenderRasterStarted(
Shinya Kitaoka 120a6e
    const TRenderPort::RenderData &renderData) {
Shinya Kitaoka 120a6e
  m_owner->onRenderRasterStarted(renderData);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxRenderPort::onRenderRasterCompleted(
Shinya Kitaoka 120a6e
    const RenderData &renderData) {
shun-iwasawa 827f34
  /*-- Do not show the result if canceled while rendering --*/
shun-iwasawa 827f34
  if (renderData.m_info.m_isCanceled && *renderData.m_info.m_isCanceled) {
shun-iwasawa 827f34
    // set m_renderFailed to true in order to prevent updating
shun-iwasawa 827f34
    // m_overallRenderedRegion at PreviewFxInstance::onRenderFinished().
shun-iwasawa 827f34
    m_owner->m_renderFailed = true;
shun-iwasawa 827f34
    return;
shun-iwasawa 827f34
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_owner->onRenderRasterCompleted(renderData);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxRenderPort::onRenderFailure(const RenderData &renderData,
Shinya Kitaoka 120a6e
                                          TException &e) {
Shinya Kitaoka 120a6e
  m_owner->onRenderFailure(renderData, e);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxRenderPort::onRenderFinished(bool isCanceled) {
Shinya Kitaoka 120a6e
  m_owner->onRenderFinished(isCanceled);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::onRenderRasterStarted(
Shinya Kitaoka 120a6e
    const TRenderPort::RenderData &renderData) {
Shinya Kitaoka 120a6e
  PreviewFxManager::instance()->emitStartedFrame(m_fx->getIdentifier(),
Shinya Kitaoka 120a6e
                                                 renderData);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::onRenderRasterCompleted(
Shinya Kitaoka 120a6e
    const TRenderPort::RenderData &renderData) {
Shinya Kitaoka 120a6e
  PreviewFxManager::instance()->emitRenderedFrame(m_fx->getIdentifier(),
Shinya Kitaoka 120a6e
                                                  renderData);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Update the progress bar status to show the frame has started
Shinya Kitaoka 120a6e
void PreviewFxInstance::doOnRenderRasterStarted(
Shinya Kitaoka 120a6e
    const TRenderPort::RenderData &renderData) {
Shinya Kitaoka 120a6e
  unsigned int i, size = renderData.m_frames.size();
Shinya Kitaoka 120a6e
  for (i = 0; i < size; ++i)
Shinya Kitaoka 120a6e
    // Update the pb status for each cluster's frame
Shinya Kitaoka 120a6e
    m_pbStatus[(renderData.m_frames[i] - m_start) / m_step] =
Shinya Kitaoka 120a6e
        FlipSlider::PBFrameStarted;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- 計算中の赤枠を表示する --*/
Shinya Kitaoka 120a6e
  std::set<flipbook *="">::iterator it;</flipbook>
Shinya Kitaoka 120a6e
  for (it = m_flipbooks.begin(); it != m_flipbooks.end(); ++it)
Shinya Kitaoka 120a6e
    (*it)->setIsRemakingPreviewFx(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  updateFlipbooks();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
// Show the rendered frame if it is some flipbook's current
Shinya Kitaoka 120a6e
void PreviewFxInstance::doOnRenderRasterCompleted(
Shinya Kitaoka 120a6e
    const TRenderPort::RenderData &renderData) {
Shinya Kitaoka 120a6e
  std::string cacheId(getCacheId(m_fx, renderData.m_frames[0]));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TRasterImageP ri(TImageCache::instance()->get(cacheId, true));
Shinya Kitaoka 120a6e
  TRasterP ras;
Shinya Kitaoka 120a6e
  if (ri)
Shinya Kitaoka 120a6e
    ras = ri->getRaster();
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    ras = 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TRasterP rasA = renderData.m_rasA;
Shinya Kitaoka 120a6e
  TRasterP rasB = renderData.m_rasB;
shun-iwasawa 481b59
shun-iwasawa 481b59
  // Linear Color Space -> sRGB
shun-iwasawa 481b59
  if (rasA->isLinear()) {
shun-iwasawa 481b59
    TRop::tosRGB(rasA, m_renderSettings.m_colorSpaceGamma);
shun-iwasawa 481b59
    if (m_renderSettings.m_stereoscopic)
shun-iwasawa 481b59
      TRop::tosRGB(rasB, m_renderSettings.m_colorSpaceGamma);
shun-iwasawa 481b59
  }
shun-iwasawa 481b59
shun-iwasawa 481b59
  /*-- 16bpcで計算された場合、結果をDitheringする --*/
luz paz 67b4e9
  // dither the 16bpc image IF the "30bit display" preference option is OFF
shun-iwasawa 481b59
  if ((rasA->getPixelSize() == 8 || rasA->getPixelSize() == 16) &&
shun-iwasawa 215a5b
      !Preferences::instance()->is30bitDisplayEnabled())  // render in 64 bits
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    TRaster32P auxA(rasA->getLx(), rasA->getLy());
Shinya Kitaoka 120a6e
    TRop::convert(auxA, rasA);  // dithering
Shinya Kitaoka 120a6e
    rasA = auxA;
Shinya Kitaoka 120a6e
    if (m_renderSettings.m_stereoscopic) {
Shinya Kitaoka 120a6e
      assert(rasB);
Shinya Kitaoka 120a6e
      TRaster32P auxB(rasB->getLx(), rasB->getLy());
Shinya Kitaoka 120a6e
      TRop::convert(auxB, rasB);  // dithering
Shinya Kitaoka 120a6e
      rasB = auxB;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!ras || (ras->getSize() != m_cameraRes)) {
Shinya Kitaoka 120a6e
    TImageCache::instance()->remove(cacheId);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Create the raster at camera resolution
Shinya Kitaoka 120a6e
    ras = rasA->create(m_cameraRes.lx, m_cameraRes.ly);
Shinya Kitaoka 120a6e
    ras->clear();
Shinya Kitaoka 120a6e
    ri = TRasterImageP(ras);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Finally, copy the rendered raster over the cached one
Shinya Kitaoka 120a6e
  TRect rectUnderRender(
Shinya Kitaoka 120a6e
      m_rectUnderRender);  // Extract may MODIFY IT! E.g. with shrinks..!
Shinya Kitaoka 120a6e
  ras = ras->extract(rectUnderRender);
Shinya Kitaoka 120a6e
  if (ras) {
Shinya Kitaoka 120a6e
    if (m_renderSettings.m_stereoscopic) {
Shinya Kitaoka 120a6e
      assert(rasB);
Shinya Kitaoka 120a6e
      TRop::makeStereoRaster(rasA, rasB);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    ras->copy(rasA);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  // Submit the image to the cache, for all cluster's frames
Shinya Kitaoka 120a6e
  unsigned int i, size = renderData.m_frames.size();
Shinya Kitaoka 120a6e
  for (i = 0; i < size; ++i) {
Shinya Kitaoka 120a6e
    int frame = renderData.m_frames[i];
Shinya Kitaoka 120a6e
    TImageCache::instance()->add(getCacheId(m_fx, frame), ri);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Update the pb status
Shinya Kitaoka 120a6e
    int pbIndex = (frame - m_start) / m_step;
Shinya Kitaoka 120a6e
    if (pbIndex >= 0 && pbIndex < (int)m_pbStatus.size())
Shinya Kitaoka 120a6e
      m_pbStatus[pbIndex] = FlipSlider::PBFrameFinished;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Update the frame-specific rendered region
Shinya Kitaoka 120a6e
    std::map<int, frameinfo="">::iterator jt = m_frameInfos.find(frame);</int,>
Shinya Kitaoka 120a6e
    assert(jt != m_frameInfos.end());
Shinya Kitaoka 120a6e
    jt->second.m_renderedRegion += toQRect(m_rectUnderRender);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    std::set<flipbook *="">::iterator it;</flipbook>
Shinya Kitaoka 120a6e
    int renderedFrame = frame + 1;
Shinya Kitaoka 120a6e
    for (it = m_flipbooks.begin(); it != m_flipbooks.end(); ++it)
Shinya Kitaoka 120a6e
      if ((*it)->getCurrentFrame() == renderedFrame)
Shinya Kitaoka 120a6e
        (*it)->showFrame(renderedFrame);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  updateFlipbooks();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::onRenderFailure(
Shinya Kitaoka 120a6e
    const TRenderPort::RenderData &renderData, TException &e) {
Shinya Kitaoka 120a6e
  m_renderFailed = true;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Update each frame status
Shinya Kitaoka 120a6e
  unsigned int i, size = renderData.m_frames.size();
Shinya Kitaoka 120a6e
  for (i = 0; i < size; ++i) {
Shinya Kitaoka 120a6e
    int frame = renderData.m_frames[i];
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Update the pb status
Shinya Kitaoka 120a6e
    int pbIndex = (frame - m_start) / m_step;
Shinya Kitaoka 120a6e
    if (pbIndex >= 0 && pbIndex < (int)m_pbStatus.size())
Shinya Kitaoka 120a6e
      m_pbStatus[pbIndex] = FlipSlider::PBFrameNotStarted;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxInstance::onRenderFinished(bool isCanceled) {
Shinya Kitaoka 120a6e
  // Update the rendered region
Shinya Kitaoka 120a6e
  if (!m_renderFailed && !isCanceled)
Shinya Kitaoka 120a6e
    m_overallRenderedRegion += toQRect(m_rectUnderRender);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  /*-- 計算中の赤枠の表示を消す --*/
Shinya Kitaoka 120a6e
  std::set<flipbook *="">::iterator it;</flipbook>
Shinya Kitaoka 120a6e
  for (it = m_flipbooks.begin(); it != m_flipbooks.end(); ++it)
Shinya Kitaoka 120a6e
    (*it)->setIsRemakingPreviewFx(false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=======================================================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=========================
Toshihiro Shimizu 890ddd
//    PreviewFxManager
Toshihiro Shimizu 890ddd
//-------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
PreviewFxManager::PreviewFxManager() : QObject() {
Shinya Kitaoka 120a6e
  TApp *app = TApp::instance();
Shinya Kitaoka 120a6e
  qRegisterMetaType<unsigned long="">("unsigned long");</unsigned>
Shinya Kitaoka 120a6e
  qRegisterMetaType<trenderport::renderdata>("TRenderPort::RenderData");</trenderport::renderdata>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- Rendering終了時、各RenderPortからEmit → Flipbookの更新を行う --*/
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(renderedFrame(unsigned long, TRenderPort::RenderData)),
Shinya Kitaoka 120a6e
          this, SLOT(onRenderedFrame(unsigned long, TRenderPort::RenderData)));
Shinya Kitaoka 120a6e
  /*-- Rendering開始時、各RenderPortからEmit →
Shinya Kitaoka 120a6e
   * Flipbookのプログレスバーのステータスを「計算中」にする --*/
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(startedFrame(unsigned long, TRenderPort::RenderData)),
Shinya Kitaoka 120a6e
          this, SLOT(onStartedFrame(unsigned long, TRenderPort::RenderData)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // connect(app->getPaletteController()->getCurrentPalette(),
Shinya Kitaoka 120a6e
  // SIGNAL(colorStyleChangedOnMouseRelease()),SLOT(onLevelChanged()));
Shinya Kitaoka 120a6e
  // connect(app->getPaletteController()->getCurrentPalette(),
Shinya Kitaoka 120a6e
  // SIGNAL(paletteChanged()),   SLOT(onLevelChanged()));
Shinya Kitaoka 120a6e
  connect(app->getPaletteController()->getCurrentLevelPalette(),
Shinya Kitaoka 120a6e
          SIGNAL(colorStyleChangedOnMouseRelease()), SLOT(onLevelChanged()));
Shinya Kitaoka 120a6e
  connect(app->getPaletteController()->getCurrentLevelPalette(),
Shinya Kitaoka 120a6e
          SIGNAL(paletteChanged()), SLOT(onLevelChanged()));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  connect(app->getCurrentLevel(), SIGNAL(xshLevelChanged()), this,
Shinya Kitaoka 120a6e
          SLOT(onLevelChanged()));
Shinya Kitaoka 120a6e
  connect(app->getCurrentFx(), SIGNAL(fxChanged()), this, SLOT(onFxChanged()));
Shinya Kitaoka 120a6e
  connect(app->getCurrentXsheet(), SIGNAL(xsheetChanged()), this,
Shinya Kitaoka 120a6e
          SLOT(onXsheetChanged()));
Shinya Kitaoka 120a6e
  connect(app->getCurrentObject(), SIGNAL(objectChanged(bool)), this,
Shinya Kitaoka 120a6e
          SLOT(onObjectChanged(bool)));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- 上記の on○○Changed() は、全て refreshViewRects をEmitしている。
Shinya Kitaoka 120a6e
          → これまでの計算を止め、新たにstartRenderをする。
Shinya Kitaoka 120a6e
          (Qt::QueuedConnection
Shinya Kitaoka 120a6e
  は、イベントループの手が空いた時に初めてSLOTを呼ぶ、ということ)
Shinya Kitaoka 120a6e
  --*/
Shinya Kitaoka 120a6e
  // Due to current implementation of PreviewFxInstance::refreshViewRects().
Shinya Kitaoka 120a6e
  connect(this, SIGNAL(refreshViewRects(unsigned long)), this,
Shinya Kitaoka 120a6e
          SLOT(onRefreshViewRects(unsigned long)), Qt::QueuedConnection);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  previewerInstance = this;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
PreviewFxManager::~PreviewFxManager() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
PreviewFxManager *PreviewFxManager::instance() {
Shinya Kitaoka 120a6e
  static PreviewFxManager _instance;
Shinya Kitaoka 120a6e
  return &_instance;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
FlipBook *PreviewFxManager::showNewPreview(TFxP fx, bool forceFlipbook) {
Shinya Kitaoka 120a6e
  if (!fx) return 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- fxIdは、Fxの作成ごとに1つずつインクリメントして割り振られる数字 --*/
Shinya Kitaoka 120a6e
  unsigned long fxId                 = fx->getIdentifier();
Shinya Kitaoka 120a6e
  PreviewFxInstance *previewInstance = 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- PreviewFxInstanceをFxごとに作成する --*/
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it == m_previewInstances.end()) {
Shinya Kitaoka 120a6e
    TXsheet *xsh    = TApp::instance()->getCurrentXsheet()->getXsheet();
Shinya Kitaoka 120a6e
    previewInstance = new PreviewFxInstance(fx, xsh);
Shinya Kitaoka 120a6e
    m_previewInstances.insert(fxId, previewInstance);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    previewInstance = it.value();
Shinya Kitaoka 120a6e
    /*-- 以前PreviewしたことのあるFxを、再度Previewしたとき --*/
Shinya Kitaoka 120a6e
    if (!forceFlipbook &&
Shinya Kitaoka 120a6e
        !Preferences::instance()->previewAlwaysOpenNewFlipEnabled()) {
Shinya Kitaoka 120a6e
      // Search the first visible flipbook to be raised. If not found, add a new
Shinya Kitaoka 120a6e
      // one.
Shinya Kitaoka 120a6e
      /*--
Shinya Kitaoka 120a6e
       * そのFxに関連付けられたFlipbookがあり、かつVisibleな場合は、reset()で再計算
Shinya Kitaoka 120a6e
       * --*/
Shinya Kitaoka 120a6e
      std::set<flipbook *=""> &flipbooks = previewInstance->m_flipbooks;</flipbook>
Shinya Kitaoka 120a6e
      std::set<flipbook *="">::iterator jt;</flipbook>
Shinya Kitaoka 120a6e
      for (jt = flipbooks.begin(); jt != flipbooks.end(); ++jt)
Shinya Kitaoka 120a6e
        if ((*jt)->isVisible()) {
Shinya Kitaoka 120a6e
          reset(fx);  // Also recalculate the preview
Shinya Kitaoka 120a6e
          (*jt)->parentWidget()->raise();
Shinya Kitaoka 120a6e
          return 0;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  FlipBook *result = 0;
Shinya Kitaoka 120a6e
  /*-- resultに必要なFlipbookを格納し、setLevelをする --*/
Shinya Kitaoka 120a6e
  previewInstance->addFlipbook(result);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  /*-- Flipbookのクローン時以外は forceFlipbookがfalse --*/
Shinya Kitaoka 120a6e
  if (!forceFlipbook) /*-- startRenderを実行 --*/
Shinya Kitaoka 120a6e
    previewInstance->refreshViewRects();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  return result;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*! return true if the preview fx instance for specified fx is with sub-camera
Shinya Kitaoka 120a6e
 * activated
shun-iwasawa c7dccf
 */
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
bool PreviewFxManager::isSubCameraActive(TFxP fx) {
Shinya Kitaoka 120a6e
  if (!fx) return false;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  unsigned long fxId = fx->getIdentifier();
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it == m_previewInstances.end()) return false;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  return it.value()->isSubCameraActive();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::refreshView(TFxP fx) {
Shinya Kitaoka 120a6e
  if (!fx) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  unsigned long fxId = fx->getIdentifier();
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it == m_previewInstances.end()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  it.value()->refreshViewRects();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! This slot is necessary to prevent problems with current implementation of
Shinya Kitaoka 120a6e
//! the
Toshihiro Shimizu 890ddd
//! event-looping PreviewFxInstance::refreshViewRects function.
Shinya Kitaoka 120a6e
void PreviewFxManager::onRefreshViewRects(unsigned long id) {
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(id);
Shinya Kitaoka 120a6e
  if (it != m_previewInstances.end()) it.value()->refreshViewRects();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::unfreeze(FlipBook *flipbook) {
Shinya Kitaoka 120a6e
  TFxP fx(flipbook->getPreviewedFx());
Shinya Kitaoka 120a6e
  if (!fx) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fx->getIdentifier());
Shinya Kitaoka 120a6e
  if (it == m_previewInstances.end()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  PreviewFxInstance *previewInstance = it.value();
Shinya Kitaoka 120a6e
  std::set<flipbook *=""> &frozenFlips  = previewInstance->m_frozenFlips;</flipbook>
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::set<flipbook *="">::iterator jt = frozenFlips.find(flipbook);</flipbook>
Shinya Kitaoka 120a6e
  if (jt == frozenFlips.end()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Re-attach to the preview instance
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    frozenFlips.erase(jt);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Before attaching, remove any old flipbook level from the cache
Shinya Kitaoka 120a6e
    flipbook->clearCache();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    // Also any associated pb status
Shinya Kitaoka 120a6e
    delete flipbook->getProgressBarStatus();
shun_iwasawa b503b4
    flipbook->setProgressBarStatus(NULL);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
    previewInstance->addFlipbook(flipbook);
shun-iwasawa c7dccf
shun-iwasawa c7dccf
    // recompute frames, if necessary (call the same process as
shun-iwasawa c7dccf
    // PreviewFxManager::onXsheetChanged())
shun-iwasawa c7dccf
    previewInstance->updateRenderSettings();
shun-iwasawa c7dccf
    previewInstance->updateCamera();
shun-iwasawa c7dccf
    previewInstance->updateFrameRange();
shun-iwasawa c7dccf
    previewInstance->updateFlipbookTitles();
shun-iwasawa c7dccf
    previewInstance->updateAliases();
shun-iwasawa c7dccf
Shinya Kitaoka 120a6e
    previewInstance->refreshViewRects();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! Observe that detached flipbooks which maintain the previewed images also
Shinya Kitaoka 120a6e
//! maintain the internal reference
Shinya Kitaoka 120a6e
//! to the previewed fx returned by the FlipBook::getPreviewedFx() method, so
Shinya Kitaoka 120a6e
//! the flipbook may be re-attached
Toshihiro Shimizu 890ddd
//! (ie un-freezed) to the same preview fx.
Shinya Kitaoka 120a6e
void PreviewFxManager::freeze(FlipBook *flipbook) {
Shinya Kitaoka 120a6e
  // Retrieve its previewed fx
Shinya Kitaoka 120a6e
  TFxP fx(flipbook->getPreviewedFx());
Shinya Kitaoka 120a6e
  if (!fx) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fx->getIdentifier());
Shinya Kitaoka 120a6e
  if (it == m_previewInstances.end()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  PreviewFxInstance *previewInstance = it.value();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // First off, detach the flipbook from the preview instance and
Shinya Kitaoka 120a6e
  // insert it among the instance's frozen ones
Shinya Kitaoka 120a6e
  previewInstance->detachFlipbook(flipbook);
Shinya Kitaoka 120a6e
  previewInstance->m_frozenFlips.insert(flipbook);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Then, perform the level copy
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    std::string levelName("freezed" + std::to_string(flipbook->getPoolIndex()) +
Shinya Kitaoka 120a6e
                          ".noext");
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Clone the preview images
Shinya Kitaoka 120a6e
    for (i = previewInstance->m_start; i <= previewInstance->m_end;
Shinya Kitaoka 120a6e
         i += previewInstance->m_step) {
Shinya Kitaoka 120a6e
      TImageP cachedImage =
Shinya Kitaoka 120a6e
          TImageCache::instance()->get(getCacheId(fx, i), false);
Shinya Kitaoka 120a6e
      if (cachedImage)
Shinya Kitaoka 120a6e
        TImageCache::instance()->add(levelName + std::to_string(i),
Shinya Kitaoka 120a6e
                                     cachedImage->cloneImage());
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Associate a level with the cached images
Shinya Kitaoka 120a6e
    TLevelP freezedLevel;
Shinya Kitaoka 120a6e
    freezedLevel->setName(levelName);
Shinya Kitaoka 120a6e
    for (i = 0; i < previewInstance->m_level->getFrameCount(); ++i)
Shinya Kitaoka 120a6e
      freezedLevel->setFrame(TFrameId(i), 0);
Shinya Kitaoka 120a6e
    flipbook->setLevel(fx.getPointer(), previewInstance->m_xsheet.getPointer(),
Shinya Kitaoka 120a6e
                       freezedLevel.getPointer(), 0,
Shinya Kitaoka 120a6e
                       previewInstance->m_start + 1, previewInstance->m_end + 1,
Shinya Kitaoka 120a6e
                       previewInstance->m_step, flipbook->getCurrentFrame(),
Shinya Kitaoka 120a6e
                       previewInstance->m_snd.getPointer());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Also, the associated PB must be cloned
Shinya Kitaoka 120a6e
    std::vector<uchar> *newPBStatuses = new std::vector<uchar>;</uchar></uchar>
Shinya Kitaoka 120a6e
    *newPBStatuses                    = previewInstance->m_pbStatus;
Shinya Kitaoka 120a6e
    flipbook->setProgressBarStatus(newPBStatuses);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // Traverse the PB: frames under rendering must be signed as uncompleted
Shinya Kitaoka 120a6e
    std::vector<uchar>::iterator it;</uchar>
Shinya Kitaoka 120a6e
    for (it = newPBStatuses->begin(); it != newPBStatuses->end(); ++it)
Shinya Kitaoka 120a6e
      if (*it == FlipSlider::PBFrameStarted)
Shinya Kitaoka 120a6e
        *it = FlipSlider::PBFrameNotStarted;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::detach(FlipBook *flipbook) {
Shinya Kitaoka 120a6e
  // Retrieve its previewed fx
Shinya Kitaoka 120a6e
  TFxP fx(flipbook->getPreviewedFx());
Shinya Kitaoka 120a6e
  if (!fx) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Search the flip among attached ones
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fx->getIdentifier());
Shinya Kitaoka 120a6e
  if (it == m_previewInstances.end()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  PreviewFxInstance *previewInstance = it.value();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Detach the flipbook (does nothing if flipbook is frozen)
Shinya Kitaoka 120a6e
  previewInstance->detachFlipbook(flipbook);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Eventually, it could be in frozens; detach it from there too
Shinya Kitaoka 120a6e
  std::set<flipbook *=""> &frozenFlips = previewInstance->m_frozenFlips;</flipbook>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  std::set<flipbook *="">::iterator jt = frozenFlips.find(flipbook);</flipbook>
Shinya Kitaoka 120a6e
  if (jt != frozenFlips.end()) {
Shinya Kitaoka 120a6e
    flipbook->clearCache();
Shinya Kitaoka 120a6e
    delete flipbook->getProgressBarStatus();
Shinya Kitaoka 120a6e
    frozenFlips.erase(jt);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Finally, delete the preview instance if no flipbook (active or frozen)
Shinya Kitaoka 120a6e
  // remain
Shinya Kitaoka 120a6e
  if (previewInstance->m_flipbooks.empty() &&
Shinya Kitaoka 120a6e
      previewInstance->m_frozenFlips.empty()) {
Shinya Kitaoka 120a6e
    delete it.value();
Shinya Kitaoka 120a6e
    m_previewInstances.erase(it);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::onLevelChanged() {
Shinya Kitaoka 120a6e
  if (m_previewInstances.size()) {
Shinya Kitaoka 120a6e
    // Build the level name as an alias keyword. All cache images associated
Shinya Kitaoka 120a6e
    // with an alias containing the level name will be updated.
Shinya Kitaoka 120a6e
    TXshLevel *xl = TApp::instance()->getCurrentLevel()->getLevel();
shun-iwasawa 08548b
    if (!xl) return;
Shinya Kitaoka 120a6e
    std::string aliasKeyword;
Shinya Kitaoka 120a6e
    TFilePath fp = xl->getPath();
Shinya Kitaoka 120a6e
    aliasKeyword = ::to_string(fp.withType(""));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QMap<unsigned *="" long,="" previewfxinstance="">::iterator it;</unsigned>
Shinya Kitaoka 120a6e
    for (it = m_previewInstances.begin(); it != m_previewInstances.end();
Shinya Kitaoka 120a6e
         ++it) {
Shinya Kitaoka 120a6e
      it.value()->updateAliasKeyword(aliasKeyword);
Shinya Kitaoka 120a6e
      emit refreshViewRects(it.key());
Shinya Kitaoka 120a6e
      // it.value()->refreshViewRects();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::onFxChanged() {
Shinya Kitaoka 120a6e
  // Examinate all RenderInstances for ancestors of current fx
Shinya Kitaoka 120a6e
  if (m_previewInstances.size()) {
Shinya Kitaoka 120a6e
    TFxP fx = TApp::instance()->getCurrentFx()->getFx();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QMap<unsigned *="" long,="" previewfxinstance="">::iterator it;</unsigned>
Shinya Kitaoka 120a6e
    for (it = m_previewInstances.begin(); it != m_previewInstances.end(); ++it)
Shinya Kitaoka 120a6e
    // if(areAncestorAndDescendant(it.value()->m_fx, fx))  //Currently not
Shinya Kitaoka 120a6e
    // trespassing sub-xsheet boundaries
Shinya Kitaoka 120a6e
    {
shun-iwasawa c7dccf
      // in case the flipbook is frozen
shun-iwasawa c7dccf
      if (it.value()->m_flipbooks.empty()) continue;
Shinya Kitaoka 120a6e
      it.value()->updateAliases();
Shinya Kitaoka 120a6e
      emit refreshViewRects(it.key());
Shinya Kitaoka 120a6e
      // it.value()->refreshViewRects();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::onXsheetChanged() {
Shinya Kitaoka 120a6e
  // Update all rendered frames, if necessary
Shinya Kitaoka 120a6e
  if (m_previewInstances.size()) {
Shinya Kitaoka 120a6e
    QMap<unsigned *="" long,="" previewfxinstance="">::iterator it;</unsigned>
Shinya Kitaoka 120a6e
    for (it = m_previewInstances.begin(); it != m_previewInstances.end();
Shinya Kitaoka 120a6e
         ++it) {
shun-iwasawa c7dccf
      // in case the flipbook is frozen
shun-iwasawa c7dccf
      if (it.value()->m_flipbooks.empty()) continue;
Shinya Kitaoka 120a6e
      it.value()->updateRenderSettings();
Shinya Kitaoka 120a6e
      it.value()->updateCamera();
Shinya Kitaoka 120a6e
      it.value()->updateFrameRange();
Shinya Kitaoka 120a6e
      it.value()->updateFlipbookTitles();
Shinya Kitaoka 120a6e
      it.value()->updateAliases();
Shinya Kitaoka 120a6e
      emit refreshViewRects(it.key());
Shinya Kitaoka 120a6e
      // it.value()->refreshViewRects();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::onObjectChanged(bool isDragging) {
Shinya Kitaoka 120a6e
  if (isDragging) return;
Shinya Kitaoka 120a6e
  // Update all rendered frames, if necessary
Shinya Kitaoka 120a6e
  if (m_previewInstances.size()) {
Shinya Kitaoka 120a6e
    QMap<unsigned *="" long,="" previewfxinstance="">::iterator it;</unsigned>
Shinya Kitaoka 120a6e
    for (it = m_previewInstances.begin(); it != m_previewInstances.end();
Shinya Kitaoka 120a6e
         ++it) {
shun-iwasawa c7dccf
      // in case the flipbook is frozen
shun-iwasawa c7dccf
      if (it.value()->m_flipbooks.empty()) continue;
Shinya Kitaoka 120a6e
      it.value()->updateFrameRange();
Shinya Kitaoka 120a6e
      it.value()->updateFlipbookTitles();
Shinya Kitaoka 120a6e
      it.value()->updateAliases();
Shinya Kitaoka 120a6e
      emit refreshViewRects(it.key());
Shinya Kitaoka 120a6e
      // it.value()->refreshViewRects();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*--
Shinya Kitaoka 120a6e
 * 既にPreviewしたことがあり、Flipbookが開いているFxを再度Previewしたときに実行される
Shinya Kitaoka 120a6e
 * --*/
Shinya Kitaoka 120a6e
void PreviewFxManager::reset(TFxP fx) {
Shinya Kitaoka 120a6e
  if (!fx) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  unsigned long fxId = fx->getIdentifier();
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it == m_previewInstances.end()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  it.value()->m_renderer.stopRendering(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // stopRendering(true) LOOPS and may destroy the preview instance. Recheck for
Shinya Kitaoka 120a6e
  // its presence
Shinya Kitaoka 120a6e
  it = m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it != m_previewInstances.end()) {
Shinya Kitaoka 120a6e
    it.value()->reset();
Shinya Kitaoka 120a6e
    it.value()->refreshViewRects();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::reset(TFxP fx, int frame) {
Shinya Kitaoka 120a6e
  if (!fx) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  unsigned long fxId = fx->getIdentifier();
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it == m_previewInstances.end()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (it.value()->m_start > it.value()->m_end) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  it.value()->m_renderer.stopRendering(true);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // stopRendering(true) LOOPS and may destroy the preview instance. Recheck for
Shinya Kitaoka 120a6e
  // its presence
Shinya Kitaoka 120a6e
  it = m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it != m_previewInstances.end()) {
Shinya Kitaoka 120a6e
    it.value()->reset(frame);
Shinya Kitaoka 120a6e
    it.value()->refreshViewRects();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::reset(bool detachFlipbooks) {
Shinya Kitaoka 120a6e
  // Hard copy the instances pointers
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance=""> previewInstances =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it;</unsigned>
Shinya Kitaoka 120a6e
  for (it = previewInstances.begin(); it != previewInstances.end(); ++it) {
Shinya Kitaoka 120a6e
    // Just like the above, stopRendering(true) event-LOOPS...
Shinya Kitaoka 120a6e
    it.value()->m_renderer.stopRendering(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (m_previewInstances.find(it.key()) == m_previewInstances.end()) continue;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (detachFlipbooks) {
Shinya Kitaoka 120a6e
      // Reset all associated flipbooks
Shinya Kitaoka 120a6e
      PreviewFxInstance *previewInstance = it.value();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // Hard copy, since detach manipulates the original
Shinya Kitaoka 120a6e
      std::set<flipbook *=""> flipbooks = previewInstance->m_flipbooks;</flipbook>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      std::set<flipbook *="">::iterator jt;</flipbook>
Shinya Kitaoka 120a6e
      for (jt = flipbooks.begin(); jt != flipbooks.end(); ++jt) {
Shinya Kitaoka 120a6e
        // Detach and reset the flipbook
Shinya Kitaoka 120a6e
        (*jt)->reset();  // The detachment happens in here
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      /*- Frozen
Shinya Kitaoka 120a6e
       * Flipがひとつも無い場合には、この時点でpreviewInstanceが除外されている
Shinya Kitaoka 120a6e
       * -*/
Shinya Kitaoka 120a6e
      if (m_previewInstances.find(it.key()) == m_previewInstances.end())
Shinya Kitaoka 120a6e
        continue;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // Same for frozen ones
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (!previewInstance->m_frozenFlips.empty() &&
Shinya Kitaoka 120a6e
          previewInstance->m_frozenFlips.size() < 20) {
Shinya Kitaoka 120a6e
        std::set<flipbook *=""> frozenFlips = previewInstance->m_frozenFlips;</flipbook>
Shinya Kitaoka 120a6e
        for (jt = frozenFlips.begin(); jt != frozenFlips.end(); ++jt) {
Shinya Kitaoka 120a6e
          // Detach and reset the flipbook
Shinya Kitaoka 120a6e
          (*jt)->reset();  // The detachment happens in here
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // The Preview instance should have been deleted at this point (due to
Shinya Kitaoka 120a6e
      // flipbook detachments)
Shinya Kitaoka 120a6e
      assert(m_previewInstances.find(it.key()) == m_previewInstances.end());
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      it.value()->reset();
Shinya Kitaoka 120a6e
      it.value()->refreshViewRects();
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::emitStartedFrame(
Shinya Kitaoka 120a6e
    unsigned long fxId, const TRenderPort::RenderData &renderData) {
Shinya Kitaoka 120a6e
  emit startedFrame(fxId, renderData);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::emitRenderedFrame(
Shinya Kitaoka 120a6e
    unsigned long fxId, const TRenderPort::RenderData &renderData) {
Shinya Kitaoka 120a6e
  emit renderedFrame(fxId, renderData);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::onStartedFrame(unsigned long fxId,
Shinya Kitaoka 120a6e
                                      TRenderPort::RenderData renderData) {
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it != m_previewInstances.end()) {
Shinya Kitaoka 120a6e
    // Invoke the corresponding function. This happens in the MAIN THREAD
Shinya Kitaoka 120a6e
    it.value()->doOnRenderRasterStarted(renderData);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PreviewFxManager::onRenderedFrame(unsigned long fxId,
Shinya Kitaoka 120a6e
                                       TRenderPort::RenderData renderData) {
Shinya Kitaoka 120a6e
  QMap<unsigned *="" long,="" previewfxinstance="">::iterator it =</unsigned>
Shinya Kitaoka 120a6e
      m_previewInstances.find(fxId);
Shinya Kitaoka 120a6e
  if (it != m_previewInstances.end()) {
Shinya Kitaoka 120a6e
    // Invoke the corresponding function. This happens in the MAIN THREAD
Shinya Kitaoka 120a6e
    it.value()->doOnRenderRasterCompleted(renderData);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
//! The suspendRendering method allows suspension of the previewer's rendering
Shinya Kitaoka 120a6e
//! activity for safety purposes, typically related to the fact that no
Shinya Kitaoka 120a6e
//! rendering
Shinya Kitaoka 120a6e
//! process should actually be performed as the underlying scene is about to
Shinya Kitaoka 120a6e
//! change
Shinya Kitaoka 120a6e
//! or being destroyed. Upon suspension, further rendering requests are silently
Shinya Kitaoka 120a6e
//! rejected - and currently active ones are canceled and waited until they are
Shinya Kitaoka 120a6e
//! no
Shinya Kitaoka 120a6e
//! longer active.
Shinya Kitaoka 120a6e
void PreviewFxManager::suspendRendering(bool suspend) {
Shinya Kitaoka 120a6e
  suspendedRendering = suspend;
Shinya Kitaoka 120a6e
  if (suspend && previewerInstance) {
Shinya Kitaoka 120a6e
    QMap<unsigned *="" long,="" previewfxinstance="">::iterator it;</unsigned>
Shinya Kitaoka 120a6e
    for (it = previewerInstance->m_previewInstances.begin();
Shinya Kitaoka 120a6e
         it != previewerInstance->m_previewInstances.end(); ++it) {
Shinya Kitaoka 120a6e
      it.value()->m_renderer.stopRendering(true);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}