|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Shinya Kitaoka |
810553 |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef TOONZ_STDFX_PLUGIN_HOST_H__
|
|
Toshihiro Shimizu |
890ddd |
#define TOONZ_STDFX_PLUGIN_HOST_H__
|
|
Toshihiro Shimizu |
890ddd |
#include <qthread></qthread>
|
|
Toshihiro Shimizu |
890ddd |
#include <string></string>
|
|
Toshihiro Shimizu |
890ddd |
#include <memory></memory>
|
|
Toshihiro Shimizu |
890ddd |
#include "tzeraryfx.h"
|
|
Toshihiro Shimizu |
890ddd |
#if defined(_WIN32) || defined(_CYGWIN_)
|
|
Toshihiro Shimizu |
890ddd |
#include <windows.h></windows.h>
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz_plugin.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz_hostif.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Toshihiro Shimizu |
890ddd |
namespace toonz {
|
|
Shinya Kitaoka |
120a6e |
struct nodal_rasterfx_handler_t;
|
|
Shinya Kitaoka |
120a6e |
struct host_interface_t;
|
|
Shinya Kitaoka |
120a6e |
struct plugin_probe_t;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/* probe で得られる静的な plugin 情報 */
|
|
Shinya Kitaoka |
120a6e |
class PluginDescription {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
std::string name_;
|
|
Shinya Kitaoka |
120a6e |
std::string vendor_;
|
|
Shinya Kitaoka |
120a6e |
std::string id_;
|
|
Shinya Kitaoka |
120a6e |
std::string note_;
|
|
Shinya Kitaoka |
120a6e |
std::string url_;
|
|
Shinya Kitaoka |
120a6e |
std::string fullname_;
|
|
Shinya Kitaoka |
120a6e |
int clss_;
|
|
Shinya Kitaoka |
120a6e |
toonz_plugin_version_t plugin_ver_;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
PluginDescription(const toonz::plugin_probe_t *const probe);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
/* 'geometric' is known as 'Zerary' on toonz. we avoid using the word because
|
|
Shinya Kitaoka |
120a6e |
* nobody did not understand a meaning of the word */
|
|
Shinya Kitaoka |
120a6e |
bool is_geometric() const {
|
|
Shinya Kitaoka |
120a6e |
return clss_ & TOONZ_PLUGIN_CLASS_MODIFIER_GEOMETRIC;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
class PluginInformation;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/* エフェクトのインスタンスを構築するためのクラス */
|
|
Toshihiro Shimizu |
890ddd |
struct PluginDeclaration : public TFxDeclaration {
|
|
Shinya Kitaoka |
120a6e |
PluginDeclaration(PluginInformation *pi);
|
|
Shinya Kitaoka |
120a6e |
TPersist *create() const final override;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
private:
|
|
Shinya Kitaoka |
120a6e |
PluginInformation *pi_;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
class UIPage;
|
|
Toshihiro Shimizu |
890ddd |
class Param;
|
|
Toshihiro Shimizu |
890ddd |
class ParamView;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
class ParamsPageSet;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
struct port_description_t {
|
|
Shinya Kitaoka |
120a6e |
bool input_;
|
|
Shinya Kitaoka |
120a6e |
std::string name_;
|
|
Shinya Kitaoka |
120a6e |
int type_;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
port_description_t(bool input, const char *nm, int type)
|
|
Shinya Kitaoka |
120a6e |
: input_(input), name_(nm), type_(type) {}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#if defined(_WIN32) || defined(_CYGWIN_)
|
|
Toshihiro Shimizu |
890ddd |
typedef std::shared_ptr<std::remove_pointer<hmodule>::type> library_t;</std::remove_pointer<hmodule>
|
|
Toshihiro Shimizu |
890ddd |
#else
|
|
Toshihiro Shimizu |
890ddd |
typedef std::shared_ptr<void> library_t;</void>
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class PluginInformation {
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
PluginDeclaration *decl_;
|
|
Shinya Kitaoka |
120a6e |
PluginDescription *desc_;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
library_t library_;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
toonz::nodal_rasterfx_handler_t *handler_;
|
|
Shinya Kitaoka |
120a6e |
toonz::host_interface_t *host_;
|
|
Shinya Kitaoka |
120a6e |
int (*ini_)(toonz::host_interface_t *);
|
|
Shinya Kitaoka |
120a6e |
void (*fin_)(void);
|
|
Shinya Kitaoka |
120a6e |
int ref_count_;
|
|
Shinya Kitaoka |
120a6e |
int param_page_num_;
|
|
Shinya Kitaoka |
120a6e |
std::unique_ptr<toonz_param_page_t[]> param_pages_;</toonz_param_page_t[]>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::vector<uipage *=""> ui_pages_;</uipage>
|
|
Shinya Kitaoka |
120a6e |
std::vector<paramview *=""> param_views_;</paramview>
|
|
Shinya Kitaoka |
120a6e |
std::map<std::string, port_description_t=""> port_mapper_;</std::string,>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::shared_ptr<void>></std::shared_ptr<void>
|
|
Shinya Kitaoka |
120a6e |
param_resources_; /* deep-copy に使う scratch area */
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::shared_ptr<std::string>></std::shared_ptr<std::string>
|
|
Shinya Kitaoka |
120a6e |
param_string_tbl_; /* shared_ptr< void > では non-virtual destructor
|
|
Shinya Kitaoka |
120a6e |
が呼ばれないので */
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
PluginInformation()
|
|
Shinya Kitaoka |
120a6e |
: desc_(NULL)
|
|
Shinya Kitaoka |
120a6e |
, library_(NULL)
|
|
Shinya Kitaoka |
120a6e |
, handler_(NULL)
|
|
Shinya Kitaoka |
120a6e |
, host_(NULL)
|
|
Shinya Kitaoka |
120a6e |
, ini_(NULL)
|
|
Shinya Kitaoka |
120a6e |
, fin_(NULL)
|
|
Shinya Kitaoka |
120a6e |
, ref_count_(1)
|
|
Shinya Kitaoka |
120a6e |
, param_page_num_(0) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~PluginInformation();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void add_ref();
|
|
Shinya Kitaoka |
120a6e |
void release();
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class Loader : public QObject {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
Loader();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
void doLoad(const QString &file);
|
|
Shinya Kitaoka |
120a6e |
void walkDirectory_(const QString &file);
|
|
Toshihiro Shimizu |
890ddd |
public slots:
|
|
Shinya Kitaoka |
120a6e |
void walkDirectory(const QString &file);
|
|
Shinya Kitaoka |
120a6e |
void walkDictionary(const QString &file);
|
|
Toshihiro Shimizu |
890ddd |
signals:
|
|
Shinya Kitaoka |
120a6e |
void load_finished(PluginInformation *pi);
|
|
Shinya Kitaoka |
120a6e |
void fixup();
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class PluginLoadController : public QObject {
|
|
Shinya Kitaoka |
120a6e |
Q_OBJECT;
|
|
Shinya Kitaoka |
120a6e |
QThread work_entity;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
PluginLoadController(const std::string &basedir, QObject *listener);
|
|
Shinya Kitaoka |
120a6e |
bool wait(int timeout_in_ms) { return work_entity.wait(timeout_in_ms); };
|
|
Toshihiro Shimizu |
890ddd |
public slots:
|
|
Shinya Kitaoka |
120a6e |
void result(PluginInformation *pi);
|
|
Shinya Kitaoka |
120a6e |
void finished();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
signals:
|
|
Shinya Kitaoka |
120a6e |
void start(const QString &filepath);
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class RasterFxPluginHost : public TZeraryFx, public TPluginInterface {
|
|
Shinya Kitaoka |
120a6e |
PluginInformation *pi_;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::shared_ptr<tfxport>> inputs_;</std::shared_ptr<tfxport>
|
|
Shinya Kitaoka |
120a6e |
std::vector<std::shared_ptr<param>> params_;</std::shared_ptr<param>
|
|
Shinya Kitaoka |
120a6e |
void *user_data_;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
static bool validateKeyName(const char *name);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
virtual RasterFxPluginHost *newInstance(PluginInformation *pi) const;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
RasterFxPluginHost(PluginInformation *pinfo);
|
|
Shinya Kitaoka |
120a6e |
~RasterFxPluginHost();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void notify();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
const TPersistDeclaration *getDeclaration() const;
|
|
Shinya Kitaoka |
120a6e |
std::string getPluginId() const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool doGetBBox(double frame, TRectD &bbox, const TRenderSettings &info);
|
|
Shinya Kitaoka |
120a6e |
void doCompute(TTile &tile, double frame, const TRenderSettings &info);
|
|
Shinya Kitaoka |
120a6e |
int getMemoryRequirement(const TRectD &rect, double frame,
|
|
Shinya Kitaoka |
120a6e |
const TRenderSettings &info);
|
|
Shinya Kitaoka |
120a6e |
bool canHandle(const TRenderSettings &info, double frame);
|
|
Shinya Kitaoka |
120a6e |
bool addInputPort(const std::string &nm, std::shared_ptr<tfxport> port);</tfxport>
|
|
Shinya Kitaoka |
120a6e |
bool addOutputPort(const std::string &nm, TRasterFxPort *port);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TFx *clone(bool recursive) const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// UIPage
|
|
Shinya Kitaoka |
120a6e |
UIPage *createUIPage(const char *name);
|
|
Shinya Kitaoka |
120a6e |
void build(ParamsPageSet *);
|
|
Shinya Kitaoka |
120a6e |
std::string getUrl() const;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// setup
|
|
Shinya Kitaoka |
120a6e |
bool setParamStructure(int n, toonz_param_page_t *descs, int &err,
|
|
Shinya Kitaoka |
120a6e |
void *&pos);
|
|
Shinya Kitaoka |
120a6e |
bool addPortDesc(port_description_t &&);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
Param *createParam(const toonz_param_desc_t *);
|
|
Shinya Kitaoka |
120a6e |
Param *createParam(const char *name, toonz_param_type_enum e);
|
|
Shinya Kitaoka |
120a6e |
Param *getParam(const char *name) const;
|
|
Shinya Kitaoka |
120a6e |
ParamView *createParamView();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool isPlugin() const { return true; }
|
|
Shinya Kitaoka |
120a6e |
bool isPluginZerary() const { return pi_->desc_->is_geometric(); }
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool isZerary() const { return isPluginZerary(); };
|
|
Shinya Kitaoka |
120a6e |
void callStartRenderHandler();
|
|
Shinya Kitaoka |
120a6e |
void callEndRenderHandler();
|
|
Shinya Kitaoka |
120a6e |
void callStartRenderFrameHandler(const TRenderSettings *rs, double frame);
|
|
Shinya Kitaoka |
120a6e |
void callEndRenderFrameHandler(const TRenderSettings *rs, double frame);
|
|
Shinya Kitaoka |
120a6e |
void *getUserData();
|
|
Shinya Kitaoka |
120a6e |
void setUserData(void *user_data);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void createParamsByDesc();
|
|
Shinya Kitaoka |
120a6e |
void createPortsByDesc();
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#endif
|