|
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 |
}
|