Toshihiro Shimizu 890ddd
#if !defined(TOONZ_PLUGIN_PARAM_TRAITS_H__)
Toshihiro Shimizu 890ddd
#define TOONZ_PLUGIN_PARAM_TRAITS_H__
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <toonz_params.h>
Toshihiro Shimizu 890ddd
#include <functional>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename First, typename Second>
Toshihiro Shimizu 890ddd
struct param_bind_t {
Toshihiro Shimizu 890ddd
	typedef First traittype;
Toshihiro Shimizu 890ddd
	typedef Second realtype;
Toshihiro Shimizu 890ddd
	typedef typename std::is_compound<typename First::valuetype>::value_type complextype;
Toshihiro Shimizu 890ddd
	typedef typename First::valuetype valuetype;
Toshihiro Shimizu 890ddd
	static const int RANGED = First::RANGED;
Toshihiro Shimizu 890ddd
	static const size_t valuesize = sizeof(typename First::valuetype);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_double_t, TDoubleParam> tpbind_dbl_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_range_t, TRangeParam> tpbind_rng_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_color_t, TPixelParam> tpbind_col_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_point_t, TPointParam> tpbind_pnt_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_enum_t, TIntEnumParam> tpbind_enm_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_int_t, TIntParam> tpbind_int_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_bool_t, TBoolParam> tpbind_bool_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_spectrum_t, TSpectrumParam> tpbind_spc_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_string_t, TStringParam> tpbind_str_t;
Toshihiro Shimizu 890ddd
typedef param_bind_t<toonz_param_traits_tonecurve_t, TToneCurveParam> tpbind_tcv_t;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename T>
Toshihiro Shimizu 890ddd
inline bool is_type_of(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (desc->traits_tag == T::E)
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* Complex なパラメータは直接 setRangeValue() などを持たず、集約しているサブタイプを返すものがあるので、そのサブタイプを得る関数を取得する */
Toshihiro Shimizu 890ddd
template <typename RT, typename F = TDoubleParamP>
Toshihiro Shimizu 890ddd
inline F &get_func_a(RT *t) { assert(false); }
Toshihiro Shimizu 890ddd
template <typename RT, typename F = TDoubleParamP>
Toshihiro Shimizu 890ddd
inline F &get_func_b(RT *t) { assert(false); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* TRangeParam */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TDoubleParamP &get_func_a<TRangeParam, TDoubleParamP>(TRangeParam *t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	printf("get_func_a< TRangeParam, TDoubleParamP& >(TRangeParam* t)\n");
Toshihiro Shimizu 890ddd
	return std::mem_fun(&TRangeParam::getMin)(t);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TDoubleParamP &get_func_b<TRangeParam, TDoubleParamP>(TRangeParam *t)
Toshihiro Shimizu 890ddd
//template<> std::mem_fun_ref_t< TDoubleParamP&, TRangeParam > get_func_b< TRangeParam, std::mem_fun_ref_t< TDoubleParamP&, TRangeParam > >(TRangeParam* t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	printf("get_func_b< TRangeParam, TDoubleParamP& >(TRangeParam* t)\n");
Toshihiro Shimizu 890ddd
	return std::mem_fun(&TRangeParam::getMax)(t);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* TPointParam */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TDoubleParamP &get_func_a<TPointParam, TDoubleParamP>(TPointParam *t)
Toshihiro Shimizu 890ddd
//template<> std::mem_fun_ref_t< TDoubleParamP&, TPointParam > get_func_a< TPointParam, std::mem_fun_ref_t< TDoubleParamP&, TPointParam > >(TPointParam* t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	printf("get_func_a< TPointParam, TDoubleParamP& >(TPointParam* t)\n");
Toshihiro Shimizu 890ddd
	return std::mem_fun(&TPointParam::getX)(t);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TDoubleParamP &get_func_b<TPointParam, TDoubleParamP>(TPointParam *t)
Toshihiro Shimizu 890ddd
//template<> std::mem_fun_ref_t< TDoubleParamP&, TPointParam > get_func_b< TPointParam, std::mem_fun_ref_t< TDoubleParamP&, TPointParam > >(TPointParam* t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	printf("get_func_b< TPointParam, TDoubleParamP& >(TPointParam* t)\n");
Toshihiro Shimizu 890ddd
	return std::mem_fun(&TPointParam::getY)(t);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* valuetype が集約型の場合、 スカラを取得するための関数 */
Toshihiro Shimizu 890ddd
template <typename T, typename V>
Toshihiro Shimizu 890ddd
inline V get_1st_value(const T &) {}
Toshihiro Shimizu 890ddd
template <typename T, typename V>
Toshihiro Shimizu 890ddd
inline V get_2nd_value(const T &) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline double get_1st_value(const toonz_param_traits_range_t::valuetype &r) { return r.a; }
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline double get_2nd_value(const toonz_param_traits_range_t::valuetype &r) { return r.b; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline double get_1st_value(const toonz_param_traits_point_t::valuetype &p) { return p.x; }
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline double get_2nd_value(const toonz_param_traits_point_t::valuetype &p) { return p.y; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename Bind, typename Comp = typename std::is_compound<typename Bind::valuetype>::type, int Ranged = Bind::RANGED>
Toshihiro Shimizu 890ddd
//template < int Ranged, typename Comp, typename Bind >
Toshihiro Shimizu 890ddd
struct set_param_range_t {
Toshihiro Shimizu 890ddd
	static bool set_param_range(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		/* 範囲を持たない(Ranged == std::false_type)なら何もすることはない */
Toshihiro Shimizu 890ddd
		printf("(none)set_param_range: p:%p type:%s (Comp:%s Ranged:%d)\n", param, typeid(Bind).name(), typeid(Comp).name(), Ranged);
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//static_assert(std::is_compound< const char* >(), "false");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* ranged complextype */
Toshihiro Shimizu 890ddd
template <typename Bind>
Toshihiro Shimizu 890ddd
struct set_param_range_t<Bind, std::true_type, 1> {
Toshihiro Shimizu 890ddd
	static bool set_param_range(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		typename Bind::realtype *p = reinterpret_cast<typename Bind::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const typename Bind::traittype &t = *reinterpret_cast<const typename Bind::traittype *>(&desc->traits.d);
Toshihiro Shimizu 890ddd
			auto subtype_a = get_func_a<typename Bind::realtype>(p);
Toshihiro Shimizu 890ddd
			auto subtype_b = get_func_b<typename Bind::realtype>(p);
Toshihiro Shimizu 890ddd
			auto a_minval = get_1st_value<typename Bind::valuetype, double>(t.min);
Toshihiro Shimizu 890ddd
			auto a_maxval = get_2nd_value<typename Bind::valuetype, double>(t.min);
Toshihiro Shimizu 890ddd
			auto b_minval = get_1st_value<typename Bind::valuetype, double>(t.max);
Toshihiro Shimizu 890ddd
			auto b_maxval = get_2nd_value<typename Bind::valuetype, double>(t.max);
Toshihiro Shimizu 890ddd
			printf("a->set_param_range: (%g, %g)\n", a_minval, a_maxval);
Toshihiro Shimizu 890ddd
			printf("b->set_param_range: (%g, %g)\n", b_minval, b_maxval);
Toshihiro Shimizu 890ddd
			(subtype_a)->setValueRange(a_minval, a_maxval);
Toshihiro Shimizu 890ddd
			(subtype_b)->setValueRange(b_minval, b_maxval);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* range のとき、スライダの左と右それぞれに限界が設定できるように見えるが、そうではない.
Toshihiro Shimizu 890ddd
   getMin(), getMax() の結果それぞれに range を設定できるように見えて
Toshihiro Shimizu 890ddd
   実際は getMin() には (min, max) のうち min, getMax() には (min, max) のうち max しか有効でないように見える.
Toshihiro Shimizu 890ddd
   このため range に対しても特殊版を用意するハメになった. */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct set_param_range_t<tpbind_rng_t, std::true_type, 1> {
Toshihiro Shimizu 890ddd
	static bool set_param_range(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		tpbind_rng_t::realtype *p = reinterpret_cast<tpbind_rng_t::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const tpbind_rng_t::traittype &t = desc->traits.rd;
Toshihiro Shimizu 890ddd
			auto subtype_a = get_func_a<tpbind_rng_t::realtype>(p);
Toshihiro Shimizu 890ddd
			auto subtype_b = get_func_b<tpbind_rng_t::realtype>(p);
Toshihiro Shimizu 890ddd
			auto a_minval = get_1st_value<tpbind_rng_t::valuetype, double>(t.minmax);
Toshihiro Shimizu 890ddd
			auto a_maxval = get_2nd_value<tpbind_rng_t::valuetype, double>(t.minmax);
Toshihiro Shimizu 890ddd
			(subtype_a)->setValueRange(a_minval, a_maxval);
Toshihiro Shimizu 890ddd
			(subtype_b)->setValueRange(a_minval, a_maxval);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct set_param_range_t< tpbind_pnt_t, std::true_type, 1 >  {
Toshihiro Shimizu 890ddd
	static bool set_param_range(Param* param, const toonz_param_desc_t* desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		tpbind_pnt_t::realtype* p = reinterpret_cast< tpbind_pnt_t::realtype* >(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const tpbind_pnt_t::traittype& t = *reinterpret_cast< const tpbind_pnt_t::traittype* >(&desc->traits.d);
Toshihiro Shimizu 890ddd
			auto subtype_a = get_func_a< tpbind_pnt_t::realtype >(p);
Toshihiro Shimizu 890ddd
			auto subtype_b = get_func_b< tpbind_pnt_t::realtype >(p);
Toshihiro Shimizu 890ddd
			auto a_minval = get_1st_value< tpbind_pnt_t::valuetype, double >(t.min);
Toshihiro Shimizu 890ddd
			auto a_maxval = get_2nd_value< tpbind_pnt_t::valuetype, double >(t.min);
Toshihiro Shimizu 890ddd
			auto b_minval = get_1st_value< tpbind_pnt_t::valuetype, double >(t.max);
Toshihiro Shimizu 890ddd
			auto b_maxval = get_2nd_value< tpbind_pnt_t::valuetype, double >(t.max);
Toshihiro Shimizu 890ddd
			printf("a->set_param_range: pnt(%g, %g)\n", a_minval, a_maxval);
Toshihiro Shimizu 890ddd
			printf("b->set_param_range: pnt(%g, %g)\n", b_minval, b_maxval);
Toshihiro Shimizu 890ddd
			(subtype_a)->setValueRange(a_minval, a_maxval);
Toshihiro Shimizu 890ddd
			(subtype_b)->setValueRange(b_minval, b_maxval);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* ranged primitive: */
Toshihiro Shimizu 890ddd
template <typename Bind>
Toshihiro Shimizu 890ddd
struct set_param_range_t<Bind, std::false_type, 1> {
Toshihiro Shimizu 890ddd
	static bool set_param_range(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (!is_type_of<typename Bind::traittype>(desc))
Toshihiro Shimizu 890ddd
			return false;
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		typename Bind::realtype *p = reinterpret_cast<typename Bind::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const typename Bind::traittype &t = *reinterpret_cast<const typename Bind::traittype *>(&desc->traits.d);
Toshihiro Shimizu 890ddd
			printf("p(%p)->set_param_range: typeid:%s desc:%p (%p)\n", p, typeid(typename Bind::traittype).name(), desc, &desc->traits.d);
Toshihiro Shimizu 890ddd
			p->setValueRange(t.min, t.max);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename Bind>
Toshihiro Shimizu 890ddd
bool set_param_range(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!is_type_of<typename Bind::traittype>(desc))
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	return set_param_range_t<Bind>::set_param_range(param, desc);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename Bind, typename Comp = typename std::is_compound<typename Bind::valuetype>::type>
Toshihiro Shimizu 890ddd
struct set_param_default_t {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* Default complextype */
Toshihiro Shimizu 890ddd
/* Point/Range */
Toshihiro Shimizu 890ddd
template <typename Bind>
Toshihiro Shimizu 890ddd
struct set_param_default_t<Bind, std::true_type> {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		typename Bind::realtype *p = reinterpret_cast<typename Bind::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const typename Bind::traittype &t = *reinterpret_cast<const typename Bind::traittype *>(&desc->traits.d);
Toshihiro Shimizu 890ddd
			auto subtype_a = get_func_a<typename Bind::realtype>(p);
Toshihiro Shimizu 890ddd
			auto subtype_b = get_func_b<typename Bind::realtype>(p);
Toshihiro Shimizu 890ddd
			auto a_defval = get_1st_value<typename Bind::valuetype, double>(t.def);
Toshihiro Shimizu 890ddd
			auto b_defval = get_2nd_value<typename Bind::valuetype, double>(t.def);
Toshihiro Shimizu 890ddd
			printf("a->set_param_default: double (%g, %g)\n", a_defval, b_defval);
Toshihiro Shimizu 890ddd
			(subtype_a)->setDefaultValue(a_defval);
Toshihiro Shimizu 890ddd
			(subtype_b)->setDefaultValue(b_defval);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* Default Color */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct set_param_default_t<tpbind_col_t, std::true_type> {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		tpbind_col_t::realtype *p = reinterpret_cast<tpbind_col_t::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const tpbind_col_t::traittype &t = *reinterpret_cast<const tpbind_col_t::traittype *>(&desc->traits.d);
Toshihiro Shimizu 890ddd
			p->setDefaultValue(TPixel32(t.def.c0, t.def.c1, t.def.c2, t.def.m));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* Default String */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct set_param_default_t<tpbind_str_t, std::true_type> {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		tpbind_str_t::realtype *p = reinterpret_cast<tpbind_str_t::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const tpbind_str_t::traittype &t = *reinterpret_cast<const tpbind_str_t::traittype *>(&desc->traits.d);
Toshihiro Shimizu 890ddd
			printf("a->set_param_default: str\n");
Toshihiro Shimizu 890ddd
			std::wstring wstr = QString::fromStdString(t.def).toStdWString();
Toshihiro Shimizu 890ddd
			p->setDefaultValue(wstr);
Toshihiro Shimizu 890ddd
			p->setValue(wstr, false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* Default Spectrum */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct set_param_default_t<tpbind_spc_t, std::true_type> {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		/* unfortunatly, TSpectrumParam's default values must be set within the constructor, for now.
Toshihiro Shimizu 890ddd
		 see param_factory_< TSpectrumParam >() */
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* Default ToneCurve */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct set_param_default_t<tpbind_tcv_t, std::true_type> {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		/*
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		tpbind_tcv_t::realtype* p = reinterpret_cast< tpbind_tcv_t::realtype* >(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const tpbind_tcv_t::traittype& t = *reinterpret_cast< const tpbind_tcv_t::traittype* >(&desc->traits.d);
Toshihiro Shimizu 890ddd
			printf("a->set_param_default: spec\n");
Toshihiro Shimizu 890ddd
			QList< TPointD > pt;
Toshihiro Shimizu 890ddd
			for (int i = 0; i < t.cps; i ++) {
Toshihiro Shimizu 890ddd
				pt.push_back(TPointD(t.array[i].x, t.array[i].y));
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			p->setDefaultValue(pt);
Toshihiro Shimizu 890ddd
			p->setIsLinear(!(t.intep));
Toshihiro Shimizu 890ddd
			}*/
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* primitive: TDoubleParam */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct set_param_default_t<tpbind_dbl_t, std::false_type> {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		tpbind_dbl_t::realtype *p = reinterpret_cast<tpbind_dbl_t::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const tpbind_dbl_t::traittype &t = *reinterpret_cast<const tpbind_dbl_t::traittype *>(&desc->traits.d);
Toshihiro Shimizu 890ddd
			printf("p(%p)->set_param_default: typeid:%s desc:%p (%p)\n", p, typeid(tpbind_dbl_t::traittype).name(), desc, &desc->traits.d);
Toshihiro Shimizu 890ddd
			p->setDefaultValue(t.def);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* primitive: TNotAnimatableParam */
Toshihiro Shimizu 890ddd
template <typename Bind>
Toshihiro Shimizu 890ddd
struct set_param_default_t<Bind, std::false_type> {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		typename Bind::realtype *p = reinterpret_cast<typename Bind::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const typename Bind::traittype &t = *reinterpret_cast<const typename Bind::traittype *>(&desc->traits.d);
Toshihiro Shimizu 890ddd
			printf("p(%p)->set_param_default: typeid:%s desc:%p (%p)\n", p, typeid(typename Bind::traittype).name(), desc, &desc->traits.d);
Toshihiro Shimizu 890ddd
			p->setDefaultValue(t.def);
Toshihiro Shimizu 890ddd
			p->setValue(t.def, false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* Default Enum */
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
struct set_param_default_t<tpbind_enm_t, std::false_type> {
Toshihiro Shimizu 890ddd
	static bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		auto smartptr = param->param();
Toshihiro Shimizu 890ddd
		tpbind_enm_t::realtype *p = reinterpret_cast<tpbind_enm_t::realtype *>(smartptr.getPointer());
Toshihiro Shimizu 890ddd
		if (p) {
Toshihiro Shimizu 890ddd
			const tpbind_enm_t::traittype &t = *reinterpret_cast<const tpbind_enm_t::traittype *>(&desc->traits.d);
Toshihiro Shimizu 890ddd
			for (int i = 0; i < t.enums; i++) {
Toshihiro Shimizu 890ddd
				p->addItem(i, t.array[i]);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			p->setValue(t.def, false);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename Bind>
Toshihiro Shimizu 890ddd
bool set_param_default(Param *param, const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!is_type_of<typename Bind::traittype>(desc))
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	return set_param_default_t<Bind>::set_param_default(param, desc);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename T>
Toshihiro Shimizu 890ddd
inline T *param_factory_(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new T;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TPointParam *param_factory_(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return new TPointParam(TPointD(), true /* instanciate from plugin */);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline TSpectrumParam *param_factory_(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const toonz_param_traits_spectrum_t &t = desc->traits.g;
Toshihiro Shimizu 890ddd
	if (t.points) {
Toshihiro Shimizu 890ddd
		std::vector<TSpectrum::ColorKey> keys(t.points);
Toshihiro Shimizu 890ddd
		for (int i = 0; i < t.points; i++) {
Toshihiro Shimizu 890ddd
			keys[i].first = t.array[i].w;
Toshihiro Shimizu 890ddd
			keys[i].second = toPixel32(TPixelD(t.array[i].c0, t.array[i].c1, t.array[i].c2, t.array[i].m));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		return new TSpectrumParam(t.points, keys.data());
Toshihiro Shimizu 890ddd
	} else {
Toshihiro Shimizu 890ddd
		return new TSpectrumParam(); /* use default constructor: デフォルトでは [black:white] の単純なものが設定される */
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline TParam *parameter_factory(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (desc->traits_tag) {
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_DOUBLE:
Toshihiro Shimizu 890ddd
		return param_factory_<TDoubleParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_RANGE:
Toshihiro Shimizu 890ddd
		return param_factory_<TRangeParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_PIXEL:
Toshihiro Shimizu 890ddd
		return param_factory_<TPixelParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_POINT:
Toshihiro Shimizu 890ddd
		return param_factory_<TPointParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_ENUM:
Toshihiro Shimizu 890ddd
		return param_factory_<TIntEnumParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_INT:
Toshihiro Shimizu 890ddd
		return param_factory_<TIntParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_BOOL:
Toshihiro Shimizu 890ddd
		return param_factory_<TBoolParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_SPECTRUM:
Toshihiro Shimizu 890ddd
		return param_factory_<TSpectrumParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_STRING:
Toshihiro Shimizu 890ddd
		return param_factory_<TStringParam>(desc);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_TONECURVE:
Toshihiro Shimizu 890ddd
		return param_factory_<TToneCurveParam>(desc);
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return NULL;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename T>
Toshihiro Shimizu 890ddd
inline int check_pollution_(const T &t)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (t.reserved_)
Toshihiro Shimizu 890ddd
		return TOONZ_PARAM_ERROR_POLLUTED;
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename T>
Toshihiro Shimizu 890ddd
inline int check_traits_sanity_(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	const T &t = reinterpret_cast<const T &>(desc->traits.d);
Toshihiro Shimizu 890ddd
	return check_pollution_<T>(t);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline int check_traits_sanity_<toonz_param_traits_double_t>(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int err = 0;
Toshihiro Shimizu 890ddd
	const toonz_param_traits_double_t &t = desc->traits.d;
Toshihiro Shimizu 890ddd
	err |= check_pollution_(t);
Toshihiro Shimizu 890ddd
	if (t.min > t.max)
Toshihiro Shimizu 890ddd
		err |= TOONZ_PARAM_ERROR_MIN_MAX;
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline int check_traits_sanity_<toonz_param_traits_range_t>(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int err = 0;
Toshihiro Shimizu 890ddd
	const toonz_param_traits_range_t &t = desc->traits.rd;
Toshihiro Shimizu 890ddd
	err |= check_pollution_(t);
Toshihiro Shimizu 890ddd
	if (t.minmax.a == 0 && t.minmax.b == 0)
Toshihiro Shimizu 890ddd
		return err; /* range に興味がない場合の 0,0 を許す */
Toshihiro Shimizu 890ddd
	if (t.minmax.a > t.minmax.b)
Toshihiro Shimizu 890ddd
		err |= TOONZ_PARAM_ERROR_MIN_MAX;
Toshihiro Shimizu 890ddd
	return err;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline int check_traits_sanity_<toonz_param_traits_enum_t>(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int err = 0;
Toshihiro Shimizu 890ddd
	const toonz_param_traits_enum_t &t = desc->traits.e;
Toshihiro Shimizu 890ddd
	err |= check_pollution_(t);
Toshihiro Shimizu 890ddd
	if (t.enums == 0)
Toshihiro Shimizu 890ddd
		return err;
Toshihiro Shimizu 890ddd
	if (t.enums < 0)
Toshihiro Shimizu 890ddd
		err |= TOONZ_PARAM_ERROR_ARRAY_NUM;
Toshihiro Shimizu 890ddd
	if (t.array == NULL)
Toshihiro Shimizu 890ddd
		err |= TOONZ_PARAM_ERROR_ARRAY;
Toshihiro Shimizu 890ddd
	return err;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline int check_traits_sanity_<toonz_param_traits_spectrum_t>(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int err = 0;
Toshihiro Shimizu 890ddd
	const toonz_param_traits_spectrum_t &t = desc->traits.g;
Toshihiro Shimizu 890ddd
	err |= check_pollution_(t);
Toshihiro Shimizu 890ddd
	if (t.points == 0)
Toshihiro Shimizu 890ddd
		return err;
Toshihiro Shimizu 890ddd
	if (t.points < 0)
Toshihiro Shimizu 890ddd
		err |= TOONZ_PARAM_ERROR_ARRAY_NUM;
Toshihiro Shimizu 890ddd
	if (t.array == NULL)
Toshihiro Shimizu 890ddd
		err |= TOONZ_PARAM_ERROR_ARRAY;
Toshihiro Shimizu 890ddd
	return err;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
template <> int check_traits_sanity_< toonz_param_traits_tonecurve_t >(const toonz_param_desc_t* desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int err = 0;
Toshihiro Shimizu 890ddd
	const toonz_param_traits_tonecurve_t& t = desc->traits.tcv;
Toshihiro Shimizu 890ddd
	err |= check_pollution_(t);
Toshihiro Shimizu 890ddd
	if (t.points == 0)
Toshihiro Shimizu 890ddd
		return err;
Toshihiro Shimizu 890ddd
	if (t.points < 0)
Toshihiro Shimizu 890ddd
		err |= TOONZ_PARAM_ERROR_ARRAY_NUM;
Toshihiro Shimizu 890ddd
	if (t.array == NULL) 
Toshihiro Shimizu 890ddd
		err |= TOONZ_PARAM_ERROR_ARRAY;
Toshihiro Shimizu 890ddd
	return err;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline int check_traits_sanity(const toonz_param_desc_t *desc)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int err = 0;
Toshihiro Shimizu 890ddd
	switch (desc->traits_tag) {
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_DOUBLE:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_double_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_RANGE:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_range_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_PIXEL:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_color_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_POINT:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_point_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_ENUM:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_enum_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_INT:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_int_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_BOOL:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_bool_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_SPECTRUM:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_spectrum_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_STRING:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_string_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_TONECURVE:
Toshihiro Shimizu 890ddd
		err = check_traits_sanity_<toonz_param_traits_tonecurve_t>(desc);
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		err = TOONZ_PARAM_ERROR_TRAITS;
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return err;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename T>
Toshihiro Shimizu 890ddd
inline bool param_type_check_(TParam *p, const toonz_param_desc_t *desc, size_t &vsz)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (typename T::realtype *d = dynamic_cast<typename T::realtype *>(p)) {
Toshihiro Shimizu 890ddd
		if (is_type_of<typename T::traittype>(desc)) {
Toshihiro Shimizu 890ddd
			vsz = sizeof(typename T::traittype::iovaluetype);
Toshihiro Shimizu 890ddd
			return true;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool parameter_type_check(TParam *p, const toonz_param_desc_t *desc, size_t &vsz)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	switch (desc->traits_tag) {
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_DOUBLE:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_dbl_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_RANGE:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_rng_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_PIXEL:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_col_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_POINT:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_pnt_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_ENUM:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_enm_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_INT:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_int_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_BOOL:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_bool_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_SPECTRUM:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_spc_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_STRING:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_str_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_TONECURVE:
Toshihiro Shimizu 890ddd
		return param_type_check_<tpbind_tcv_t>(p, desc, vsz);
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename T>
Toshihiro Shimizu 890ddd
inline bool param_read_value_(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/* isize は iovaluetype の size でなく count になったのでサイズチェックは無効 */
Toshihiro Shimizu 890ddd
	//if (isize == sizeof(typename T::traittype::iovaluetype)) {
Toshihiro Shimizu 890ddd
	auto r = reinterpret_cast<typename T::realtype *>(p);
Toshihiro Shimizu 890ddd
	auto v = r->getValue();
Toshihiro Shimizu 890ddd
	*reinterpret_cast<typename T::traittype::iovaluetype *>(ptr) = v;
Toshihiro Shimizu 890ddd
	osize = 1;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
	//}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline bool param_read_value_<tpbind_dbl_t>(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//if (isize == sizeof(tpbind_dbl_t::traittype::iovaluetype)) {
Toshihiro Shimizu 890ddd
	auto r = reinterpret_cast<tpbind_dbl_t::realtype *>(p);
Toshihiro Shimizu 890ddd
	auto v = r->getValue(frame);
Toshihiro Shimizu 890ddd
	*reinterpret_cast<tpbind_dbl_t::traittype::iovaluetype *>(ptr) = v;
Toshihiro Shimizu 890ddd
	osize = 1;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
	//}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline bool param_read_value_<tpbind_str_t>(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	auto r = reinterpret_cast<tpbind_str_t::realtype *>(p);
Toshihiro Shimizu 890ddd
	const std::string str = QString::fromStdWString(r->getValue()).toStdString();
Toshihiro Shimizu 890ddd
	std::size_t len = str.length() + 1;
Toshihiro Shimizu 890ddd
	/* get_type() の返す大きさも文字列長+1 を含んでいる */
Toshihiro Shimizu 890ddd
	if (isize < len)
Toshihiro Shimizu 890ddd
		len = isize; /* 要求サイズが実際の長さより短くても良いが切り詰める(ただし 1 以上であること) */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (len > 0) {
Toshihiro Shimizu 890ddd
		auto dst = reinterpret_cast<char *>(ptr);
Toshihiro Shimizu 890ddd
		strncpy(dst, str.c_str(), len - 1);
Toshihiro Shimizu 890ddd
		dst[len - 1] = '\0';
Toshihiro Shimizu 890ddd
		osize = len;
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline bool param_read_value_<tpbind_rng_t>(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//if (isize == sizeof(tpbind_rng_t::traittype::iovaluetype)) {
Toshihiro Shimizu 890ddd
	auto r = reinterpret_cast<tpbind_rng_t::realtype *>(p);
Toshihiro Shimizu 890ddd
	auto v = r->getValue(frame);
Toshihiro Shimizu 890ddd
	auto dst = reinterpret_cast<tpbind_rng_t::traittype::iovaluetype *>(ptr);
Toshihiro Shimizu 890ddd
	dst->a = v.first;
Toshihiro Shimizu 890ddd
	dst->b = v.second;
Toshihiro Shimizu 890ddd
	osize = 1;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
	//}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline bool param_read_value_<tpbind_col_t>(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//if (isize == sizeof(tpbind_col_t::traittype::iovaluetype)) {
Toshihiro Shimizu 890ddd
	auto r = reinterpret_cast<tpbind_col_t::realtype *>(p);
Toshihiro Shimizu 890ddd
	/* getValueD() だと 16bit * 4 が返る */
Toshihiro Shimizu 890ddd
	//auto v = r->getValueD(frame);
Toshihiro Shimizu 890ddd
	auto v = r->getValue(frame);
Toshihiro Shimizu 890ddd
	auto dst = reinterpret_cast<tpbind_col_t::traittype::iovaluetype *>(ptr);
Toshihiro Shimizu 890ddd
	dst->c0 = v.r;
Toshihiro Shimizu 890ddd
	dst->c1 = v.g;
Toshihiro Shimizu 890ddd
	dst->c2 = v.b;
Toshihiro Shimizu 890ddd
	dst->m = v.m;
Toshihiro Shimizu 890ddd
	osize = 1;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
	//}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline bool param_read_value_<tpbind_pnt_t>(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//if (isize == sizeof(tpbind_pnt_t::traittype::iovaluetype)) {
Toshihiro Shimizu 890ddd
	auto r = reinterpret_cast<tpbind_pnt_t::realtype *>(p);
Toshihiro Shimizu 890ddd
	auto v = r->getValue(frame);
Toshihiro Shimizu 890ddd
	auto dst = reinterpret_cast<tpbind_pnt_t::traittype::iovaluetype *>(ptr);
Toshihiro Shimizu 890ddd
	dst->x = v.x;
Toshihiro Shimizu 890ddd
	dst->y = v.y;
Toshihiro Shimizu 890ddd
	osize = 1;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
	//}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline bool param_read_value_<tpbind_spc_t>(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	//if (isize == sizeof(tpbind_spc_t::traittype::iovaluetype)) {
Toshihiro Shimizu 890ddd
	auto r = reinterpret_cast<tpbind_spc_t::realtype *>(p);
Toshihiro Shimizu 890ddd
	auto dst = reinterpret_cast<tpbind_spc_t::traittype::iovaluetype *>(ptr);
Toshihiro Shimizu 890ddd
	/* getValue64() だと 1channle 16bit が返るがデフォルト型に合わせる */
Toshihiro Shimizu 890ddd
	auto v = r->getValue(frame).getValue(dst->w);
Toshihiro Shimizu 890ddd
	dst->c0 = v.r;
Toshihiro Shimizu 890ddd
	dst->c1 = v.g;
Toshihiro Shimizu 890ddd
	dst->c2 = v.b;
Toshihiro Shimizu 890ddd
	dst->m = v.m;
Toshihiro Shimizu 890ddd
	osize = 1;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
	//}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <>
Toshihiro Shimizu 890ddd
inline bool param_read_value_<tpbind_tcv_t>(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	auto r = reinterpret_cast<tpbind_tcv_t::realtype *>(p);
Toshihiro Shimizu 890ddd
	QList<TPointD> points = r->getValue(frame);
Toshihiro Shimizu 890ddd
	size_t ps = points.size();
Toshihiro Shimizu 890ddd
	/* コントロールポイントのリストしか戻って来ない! */
Toshihiro Shimizu 890ddd
	if (isize >= ps) {
Toshihiro Shimizu 890ddd
		int channel = r->getCurrentChannel();
Toshihiro Shimizu 890ddd
		int interp = !r->isLinear();
Toshihiro Shimizu 890ddd
		int c = isize < points.size() ? isize : points.size();
Toshihiro Shimizu 890ddd
		for (int i = 0; i < c; i++) {
Toshihiro Shimizu 890ddd
			auto dst = reinterpret_cast<tpbind_tcv_t::traittype::iovaluetype *>(ptr);
Toshihiro Shimizu 890ddd
			dst[i].x = points[i].x;
Toshihiro Shimizu 890ddd
			dst[i].y = points[i].y;
Toshihiro Shimizu 890ddd
			dst[i].channel = channel;
Toshihiro Shimizu 890ddd
			dst[i].interp = interp;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		osize = c;
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline bool parameter_read_value(TParam *p, const toonz_param_desc_t *desc, void *ptr, double frame, size_t isize, size_t &osize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	size_t sz = 0;
Toshihiro Shimizu 890ddd
	if (!parameter_type_check(p, desc, sz)) { // typecheck
Toshihiro Shimizu 890ddd
		return false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	switch (desc->traits_tag) {
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_DOUBLE:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_dbl_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_RANGE:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_rng_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_PIXEL:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_col_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_POINT:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_pnt_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_ENUM:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_enm_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_INT:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_int_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_BOOL:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_bool_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_SPECTRUM:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_spc_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_STRING:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_str_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	case TOONZ_PARAM_TYPE_TONECURVE:
Toshihiro Shimizu 890ddd
		return param_read_value_<tpbind_tcv_t>(p, desc, ptr, frame, isize, osize);
Toshihiro Shimizu 890ddd
	default:
Toshihiro Shimizu 890ddd
		break;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif