Toshihiro Shimizu 890ddd
/*------------------------------------------------------------
Toshihiro Shimizu 890ddd
Iwa_PNPerspectiveFx
Toshihiro Shimizu 890ddd
PerlinNoise/SimplexNoiseパターンを生成、透視投影する
Toshihiro Shimizu 890ddd
------------------------------------------------------------*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "iwa_pnperspectivefx.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "tparamuiconcept.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "iwa_fresnel.h"
Toshihiro Shimizu 890ddd
#include "iwa_simplexnoise.h"
Toshihiro Shimizu 890ddd
#include "iwa_noise1234.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <vector></vector>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifndef M_PI
Toshihiro Shimizu 890ddd
const double M_PI = 3.1415926535897932384626433832795;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* 内積を返す */
Toshihiro Shimizu 890ddd
inline float dot(float3 a, float3 b)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return a.x * b.x + a.y * b.y + a.z * b.z;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* 外積を返す */
Toshihiro Shimizu 890ddd
inline float3 cross(float3 a, float3 b)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	float3 ret = {a.y * b.z - a.z * b.y,
Toshihiro Shimizu 890ddd
				  a.z * b.x - a.x * b.z,
Toshihiro Shimizu 890ddd
				  a.x * b.y - a.y * b.x};
Toshihiro Shimizu 890ddd
	return ret;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/* 正規化する */
Toshihiro Shimizu 890ddd
inline float3 normalize(float3 v)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	float length = sqrtf(v.x * v.x + v.y * v.y + v.z * v.z);
Toshihiro Shimizu 890ddd
	float3 ret = {v.x / length,
Toshihiro Shimizu 890ddd
				  v.y / length,
Toshihiro Shimizu 890ddd
				  v.z / length};
Toshihiro Shimizu 890ddd
	return ret;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*------------------------------------------------------------
Toshihiro Shimizu 890ddd
 出力結果をChannel値に変換して格納
Toshihiro Shimizu 890ddd
------------------------------------------------------------*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename pixel="" raster,="" typename=""></typename>
Toshihiro Shimizu 890ddd
void Iwa_PNPerspectiveFx::setOutputRaster(float4 *srcMem,
Toshihiro Shimizu 890ddd
										  const RASTER dstRas,
Toshihiro Shimizu 890ddd
										  TDimensionI dim,
Toshihiro Shimizu 890ddd
										  int drawLevel,
Toshihiro Shimizu 890ddd
										  const bool alp_rend_sw)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	typename PIXEL::Channel halfChan = (typename PIXEL::Channel)(PIXEL::maxChannelValue / 2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (alp_rend_sw)
Toshihiro Shimizu 890ddd
		dstRas->fill(PIXEL(halfChan, halfChan, halfChan, halfChan));
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		dstRas->fill(PIXEL(halfChan, halfChan, halfChan));
Toshihiro Shimizu 890ddd
	float4 *chan_p = srcMem;
Toshihiro Shimizu 890ddd
	for (int j = 0; j < drawLevel; j++) {
Toshihiro Shimizu 890ddd
		PIXEL *pix = dstRas->pixels(j);
Toshihiro Shimizu 890ddd
		for (int i = 0; i < dstRas->getLx(); i++, chan_p++, pix++) {
Toshihiro Shimizu 890ddd
			float val;
Toshihiro Shimizu 890ddd
			val = (*chan_p).x * (float)PIXEL::maxChannelValue + 0.5f;
Toshihiro Shimizu 890ddd
			pix->r = (typename PIXEL::Channel)((val > (float)PIXEL::maxChannelValue) ? (float)PIXEL::maxChannelValue : val);
Toshihiro Shimizu 890ddd
			val = (*chan_p).y * (float)PIXEL::maxChannelValue + 0.5f;
Toshihiro Shimizu 890ddd
			pix->g = (typename PIXEL::Channel)((val > (float)PIXEL::maxChannelValue) ? (float)PIXEL::maxChannelValue : val);
Toshihiro Shimizu 890ddd
			val = (*chan_p).z * (float)PIXEL::maxChannelValue + 0.5f;
Toshihiro Shimizu 890ddd
			pix->b = (typename PIXEL::Channel)((val > (float)PIXEL::maxChannelValue) ? (float)PIXEL::maxChannelValue : val);
Toshihiro Shimizu 890ddd
			val = (*chan_p).w * (float)PIXEL::maxChannelValue + 0.5f;
Toshihiro Shimizu 890ddd
			pix->m = (typename PIXEL::Channel)((val > (float)PIXEL::maxChannelValue) ? (float)PIXEL::maxChannelValue : val);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*------------------------------------------------------------
Toshihiro Shimizu 890ddd
 PerlinNoiseのパラメータを取得
Toshihiro Shimizu 890ddd
------------------------------------------------------------*/
Toshihiro Shimizu 890ddd
void Iwa_PNPerspectiveFx::getPNParameters(TTile &tile, double frame,
Toshihiro Shimizu 890ddd
										  const TRenderSettings &settings,
Toshihiro Shimizu 890ddd
										  PN_Params ¶ms,
Toshihiro Shimizu 890ddd
										  TDimensionI &dimOut)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/*  動作パラメータを得る */
Toshihiro Shimizu 890ddd
	params.renderMode = m_renderMode->getValue();
Toshihiro Shimizu 890ddd
	params.noiseType = m_noiseType->getValue();
Toshihiro Shimizu 890ddd
	params.size = (float)m_size->getValue(frame);
Toshihiro Shimizu 890ddd
	/* SimplexNoiseの密度感をそろえるための係数をかける */
Toshihiro Shimizu 890ddd
	if (params.noiseType == 1)
Toshihiro Shimizu 890ddd
		params.size *= 1.41421356f;
Toshihiro Shimizu 890ddd
	params.octaves = m_octaves->getValue() + 1;
Toshihiro Shimizu 890ddd
	params.offset = float2{(float)m_offset->getValue(frame).x,
Toshihiro Shimizu 890ddd
						   (float)m_offset->getValue(frame).y};
Toshihiro Shimizu 890ddd
	params.p_intensity = (float)m_persistance_intensity->getValue(frame);
Toshihiro Shimizu 890ddd
	params.p_size = (float)m_persistance_size->getValue(frame);
Toshihiro Shimizu 890ddd
	params.p_offset = (float)m_persistance_offset->getValue(frame);
Toshihiro Shimizu 890ddd
	TPointD _eyeLevel = m_eyeLevel->getValue(frame);
Toshihiro Shimizu 890ddd
	params.eyeLevel = float2{(float)_eyeLevel.x, (float)_eyeLevel.y};
Toshihiro Shimizu 890ddd
	params.alp_rend_sw = m_alpha_rendering->getValue();
Toshihiro Shimizu 890ddd
	params.waveHeight = (float)m_waveHeight->getValue(frame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const float fov = (float)m_fov->getValue(frame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TAffine aff = settings.m_affine;
Toshihiro Shimizu 890ddd
	const double scale = 1.0 / sqrt(fabs(aff.det()));
Toshihiro Shimizu 890ddd
	TAffine aff_pn = TScale(scale) * TTranslation(tile.m_pos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	params.a11 = aff_pn.a11;
Toshihiro Shimizu 890ddd
	params.a12 = aff_pn.a12;
Toshihiro Shimizu 890ddd
	params.a13 = aff_pn.a13;
Toshihiro Shimizu 890ddd
	params.a21 = aff_pn.a21;
Toshihiro Shimizu 890ddd
	params.a22 = aff_pn.a22;
Toshihiro Shimizu 890ddd
	params.a23 = aff_pn.a23;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	params.time = (float)m_evolution->getValue(frame) * 0.05;
Toshihiro Shimizu 890ddd
	params.p_evolution = (float)m_persistance_evolution->getValue(frame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD eyePoint = aff * _eyeLevel - (tile.m_pos + tile.getRaster()->getCenterD());
Toshihiro Shimizu 890ddd
	const float eyeHeight = (float)eyePoint.y;
Toshihiro Shimizu 890ddd
	/* 描画範囲の下からの距離 */
Toshihiro Shimizu 890ddd
	params.drawLevel = (int)((float)dimOut.ly / 2.0f + eyeHeight);
Toshihiro Shimizu 890ddd
	if (params.drawLevel > dimOut.ly)
Toshihiro Shimizu 890ddd
		params.drawLevel = dimOut.ly;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* カメラたて方向のmmサイズの半分の寸法 */
Toshihiro Shimizu 890ddd
	int camHeight = settings.m_cameraBox.getLy();
Toshihiro Shimizu 890ddd
	TPointD vec_p0p1((double)camHeight * aff_pn.a12,
Toshihiro Shimizu 890ddd
					 (double)camHeight * aff_pn.a22);
Toshihiro Shimizu 890ddd
	params.fy_2 = sqrtf(vec_p0p1.x * vec_p0p1.x + vec_p0p1.y * vec_p0p1.y) / 2.0f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	float fov_radian_2 = (fov / 2.0f) * M_PI / 180.0f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* カメラから投影面への距離 */
Toshihiro Shimizu 890ddd
	float D = params.fy_2 / tanf(fov_radian_2);
Toshihiro Shimizu 890ddd
	/* カメラから、投影面上の水平線への距離 */
Toshihiro Shimizu 890ddd
	params.A = sqrtf(params.eyeLevel.y * params.eyeLevel.y + D * D);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* カメラ位置から下枠へのベクトルと、水平線のなす角度 */
Toshihiro Shimizu 890ddd
	float theta = fov_radian_2 + asinf(params.eyeLevel.y / params.A);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	float M = params.fy_2 / sinf(fov_radian_2);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	params.cam_pos = float3{0.0f, -M * cosf(theta), M * sinf(theta)};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*ベースとなるフレネル反射率を求める*/
Toshihiro Shimizu 890ddd
	params.base_fresnel_ref = 0.0f;
Toshihiro Shimizu 890ddd
	float phi = 90.0f - theta * 180.0f / M_PI;
Toshihiro Shimizu 890ddd
	if (phi >= 0.0f && phi < 90.0f) {
Toshihiro Shimizu 890ddd
		int index = (int)phi;
Toshihiro Shimizu 890ddd
		float ratio = phi - (float)index;
Toshihiro Shimizu 890ddd
		params.base_fresnel_ref = fresnel[index] * (1.0f - ratio) +
Toshihiro Shimizu 890ddd
								  fresnel[index + 1] * ratio;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*強度の正規化のため、合計値を算出*/
Toshihiro Shimizu 890ddd
	float intensity = 2.0f; /* -1 ~ 1 */
Toshihiro Shimizu 890ddd
	params.int_sum = 0.0f;
Toshihiro Shimizu 890ddd
	for (int o = 0; o < params.octaves; o++) {
Toshihiro Shimizu 890ddd
		params.int_sum += intensity;
Toshihiro Shimizu 890ddd
		intensity *= params.p_intensity;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Iwa_PNPerspectiveFx::Iwa_PNPerspectiveFx()
Toshihiro Shimizu 890ddd
	: m_renderMode(new TIntEnumParam(0, "Noise")), m_noiseType(new TIntEnumParam(0, "Perlin Noise")), m_size(10.0), m_evolution(0.0), m_octaves(new TIntEnumParam(0, "1")), m_offset(TPointD(0, 0)), m_persistance_intensity(0.5), m_persistance_size(0.5), m_persistance_evolution(0.5), m_persistance_offset(0.5), m_fov(30), m_eyeLevel(TPointD(0, 0)), m_alpha_rendering(true), m_waveHeight(10.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bindParam(this, "renderMode", m_renderMode);
Toshihiro Shimizu 890ddd
	bindParam(this, "noiseType", m_noiseType);
Toshihiro Shimizu 890ddd
	bindParam(this, "size", m_size);
Toshihiro Shimizu 890ddd
	bindParam(this, "evolution", m_evolution);
Toshihiro Shimizu 890ddd
	bindParam(this, "octaves", m_octaves);
Toshihiro Shimizu 890ddd
	bindParam(this, "offset", m_offset);
Toshihiro Shimizu 890ddd
	bindParam(this, "persistance_intensity", m_persistance_intensity);
Toshihiro Shimizu 890ddd
	bindParam(this, "persistance_size", m_persistance_size);
Toshihiro Shimizu 890ddd
	bindParam(this, "persistance_evolution", m_persistance_evolution);
Toshihiro Shimizu 890ddd
	bindParam(this, "persistance_offset", m_persistance_offset);
Toshihiro Shimizu 890ddd
	bindParam(this, "fov", m_fov);
Toshihiro Shimizu 890ddd
	bindParam(this, "eyeLevel", m_eyeLevel);
Toshihiro Shimizu 890ddd
	bindParam(this, "alpha_rendering", m_alpha_rendering);
Toshihiro Shimizu 890ddd
	bindParam(this, "waveHeight", m_waveHeight);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_noiseType->addItem(1, "Simplex Noise");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_renderMode->addItem(1, "Noise (no resampled)");
Toshihiro Shimizu 890ddd
	m_renderMode->addItem(2, "Warp HV offset");
Toshihiro Shimizu 890ddd
	m_renderMode->addItem(4, "Warp HV offset 2");
Toshihiro Shimizu 890ddd
	m_renderMode->addItem(3, "Fresnel reflectivity");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_size->setMeasureName("fxLength");
Toshihiro Shimizu 890ddd
	m_size->setValueRange(0.0, 1000.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_octaves->addItem(1, "2");
Toshihiro Shimizu 890ddd
	m_octaves->addItem(2, "3");
Toshihiro Shimizu 890ddd
	m_octaves->addItem(3, "4");
Toshihiro Shimizu 890ddd
	m_octaves->addItem(4, "5");
Toshihiro Shimizu 890ddd
	m_octaves->addItem(5, "6");
Toshihiro Shimizu 890ddd
	m_octaves->addItem(6, "7");
Toshihiro Shimizu 890ddd
	m_octaves->addItem(7, "8");
Toshihiro Shimizu 890ddd
	m_octaves->addItem(8, "9");
Toshihiro Shimizu 890ddd
	m_octaves->addItem(9, "10");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_persistance_intensity->setValueRange(0.1, 2.0);
Toshihiro Shimizu 890ddd
	m_persistance_size->setValueRange(0.1, 2.0);
Toshihiro Shimizu 890ddd
	m_persistance_evolution->setValueRange(0.1, 2.0);
Toshihiro Shimizu 890ddd
	m_persistance_offset->setValueRange(0.1, 2.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_fov->setValueRange(10, 90);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_eyeLevel->getX()->setMeasureName("fxLength");
Toshihiro Shimizu 890ddd
	m_eyeLevel->getY()->setMeasureName("fxLength");
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_waveHeight->setMeasureName("fxLength");
Toshihiro Shimizu 890ddd
	m_waveHeight->setValueRange(1.0, 100.0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool Iwa_PNPerspectiveFx::doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	bBox = TConsts::infiniteRectD;
Toshihiro Shimizu 890ddd
	return true;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool Iwa_PNPerspectiveFx::canHandle(const TRenderSettings &info, double frame)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Iwa_PNPerspectiveFx::doCompute(TTile &tile, double frame, const TRenderSettings &settings)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/* サポートしていないPixelタイプはエラーを投げる */
Toshihiro Shimizu 890ddd
	if (!((TRaster32P)tile.getRaster()) &&
Toshihiro Shimizu 890ddd
		!((TRaster64P)tile.getRaster())) {
Toshihiro Shimizu 890ddd
		throw TRopException("unsupported input pixel type");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDimensionI dimOut(tile.getRaster()->getLx(), tile.getRaster()->getLy());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* PerinNoiseのパラメータ */
Toshihiro Shimizu 890ddd
	PN_Params pnParams;
Toshihiro Shimizu 890ddd
	getPNParameters(tile, frame, settings, pnParams, dimOut);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* 水平線が画面より下のときreturn */
Toshihiro Shimizu 890ddd
	if (pnParams.drawLevel < 0) {
Toshihiro Shimizu 890ddd
		tile.getRaster()->clear();
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const float evolution = (float)m_evolution->getValue(frame);
Toshihiro Shimizu 890ddd
	const float p_evolution = (float)m_persistance_evolution->getValue(frame);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	float4 *out_host;
Toshihiro Shimizu 890ddd
	/* ホストのメモリ確保 */
Toshihiro Shimizu 890ddd
	TRasterGR8P out_host_ras(sizeof(float4) * dimOut.lx, pnParams.drawLevel);
Toshihiro Shimizu 890ddd
	out_host_ras->lock();
Toshihiro Shimizu 890ddd
	out_host = (float4 *)out_host_ras->getRawData();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	doCompute_CPU(tile, frame, settings,
Toshihiro Shimizu 890ddd
				  out_host,
Toshihiro Shimizu 890ddd
				  dimOut,
Toshihiro Shimizu 890ddd
				  pnParams);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/* 出力結果をChannel値に変換して格納 */
Toshihiro Shimizu 890ddd
	tile.getRaster()->clear();
Toshihiro Shimizu 890ddd
	TRaster32P outRas32 = (TRaster32P)tile.getRaster();
Toshihiro Shimizu 890ddd
	TRaster64P outRas64 = (TRaster64P)tile.getRaster();
Toshihiro Shimizu 890ddd
	if (outRas32)
Toshihiro Shimizu 890ddd
		setOutputRaster<traster32p, tpixel32="">(out_host, outRas32, dimOut, pnParams.drawLevel, pnParams.alp_rend_sw);</traster32p,>
Toshihiro Shimizu 890ddd
	else if (outRas64)
Toshihiro Shimizu 890ddd
		setOutputRaster<traster64p, tpixel64="">(out_host, outRas64, dimOut, pnParams.drawLevel, pnParams.alp_rend_sw);</traster64p,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	out_host_ras->unlock();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
void Iwa_PNPerspectiveFx::doCompute_CPU(TTile &tile,
Toshihiro Shimizu 890ddd
										double frame,
Toshihiro Shimizu 890ddd
										const TRenderSettings &settings,
Toshihiro Shimizu 890ddd
										float4 *out_host,
Toshihiro Shimizu 890ddd
										TDimensionI &dimOut,
Toshihiro Shimizu 890ddd
										PN_Params &pnParams)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/* モードで分ける */
Toshihiro Shimizu 890ddd
	if (pnParams.renderMode == 0 || pnParams.renderMode == 1) {
Toshihiro Shimizu 890ddd
		calcPerinNoise_CPU(
Toshihiro Shimizu 890ddd
			out_host,
Toshihiro Shimizu 890ddd
			dimOut,
Toshihiro Shimizu 890ddd
			pnParams,
Toshihiro Shimizu 890ddd
			(bool)(pnParams.renderMode == 0));
Toshihiro Shimizu 890ddd
	} else if (pnParams.renderMode == 2 || pnParams.renderMode == 3 || pnParams.renderMode == 4) {
Toshihiro Shimizu 890ddd
		calcPNNormal_CPU(
Toshihiro Shimizu 890ddd
			out_host,
Toshihiro Shimizu 890ddd
			dimOut,
Toshihiro Shimizu 890ddd
			pnParams);
Toshihiro Shimizu 890ddd
		if (pnParams.renderMode == 4) {
Toshihiro Shimizu 890ddd
			calcPNNormal_CPU(
Toshihiro Shimizu 890ddd
				out_host,
Toshihiro Shimizu 890ddd
				dimOut,
Toshihiro Shimizu 890ddd
				pnParams,
Toshihiro Shimizu 890ddd
				true);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*------------------------------------------------------------
Toshihiro Shimizu 890ddd
 通常のノイズのCPU計算
Toshihiro Shimizu 890ddd
------------------------------------------------------------*/
Toshihiro Shimizu 890ddd
void Iwa_PNPerspectiveFx::calcPerinNoise_CPU(float4 *out_host,
Toshihiro Shimizu 890ddd
											 TDimensionI &dimOut,
Toshihiro Shimizu 890ddd
											 PN_Params &p,
Toshihiro Shimizu 890ddd
											 bool doResample)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int reso = (doResample) ? 10 : 1;
Toshihiro Shimizu 890ddd
	/* 結果を収めるイテレータ */
Toshihiro Shimizu 890ddd
	float4 *out_p = out_host;
Toshihiro Shimizu 890ddd
	/* 各ピクセルについて */
Toshihiro Shimizu 890ddd
	for (int yy = 0; yy < p.drawLevel; yy++) {
Toshihiro Shimizu 890ddd
		for (int xx = 0; xx < dimOut.lx; xx++, out_p++) {
Toshihiro Shimizu 890ddd
			float val_sum = 0.0f;
Toshihiro Shimizu 890ddd
			int count = 0;
Toshihiro Shimizu 890ddd
			/* 各リサンプル点について */
Toshihiro Shimizu 890ddd
			for (int tt = 0; tt < reso; tt++) {
Toshihiro Shimizu 890ddd
				for (int ss = 0; ss < reso; ss++) {
Toshihiro Shimizu 890ddd
					float2 tmpPixPos = {(float)xx - 0.5f + ((float)ss + 0.5f) / (float)reso,
Toshihiro Shimizu 890ddd
										(float)yy - 0.5f + ((float)tt + 0.5f) / (float)reso};
Toshihiro Shimizu 890ddd
					float2 screenPos = {tmpPixPos.x * p.a11 + tmpPixPos.y * p.a12 + p.a13,
Toshihiro Shimizu 890ddd
										tmpPixPos.x * p.a21 + tmpPixPos.y * p.a22 + p.a23};
Toshihiro Shimizu 890ddd
					/* ② Perlin Noise 平面上の座標を計算する */
Toshihiro Shimizu 890ddd
					float2 noisePos;
Toshihiro Shimizu 890ddd
					noisePos.x = -(p.eyeLevel.y + p.fy_2) *
Toshihiro Shimizu 890ddd
									 (screenPos.x - p.eyeLevel.x) / (screenPos.y - p.eyeLevel.y) +
Toshihiro Shimizu 890ddd
								 p.eyeLevel.x;
Toshihiro Shimizu 890ddd
					noisePos.y = (p.fy_2 + screenPos.y) * p.A / (p.eyeLevel.y - screenPos.y);
Toshihiro Shimizu 890ddd
					float tmpVal = 0.5f;
Toshihiro Shimizu 890ddd
					float currentSize = p.size;
Toshihiro Shimizu 890ddd
					float2 currentOffset = p.offset;
Toshihiro Shimizu 890ddd
					float currentIntensity = 1.0f;
Toshihiro Shimizu 890ddd
					//float2* basis_p = basis;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					float currentEvolution = p.time;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					/* ノイズを各世代足しこむ */
Toshihiro Shimizu 890ddd
					for (int o = 0; o < p.octaves; o++) {
Toshihiro Shimizu 890ddd
						float2 currentNoisePos = {(noisePos.x - currentOffset.x) / currentSize,
Toshihiro Shimizu 890ddd
												  (noisePos.y - currentOffset.y) / currentSize};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
						if (p.noiseType == 0) {
Toshihiro Shimizu 890ddd
							tmpVal += currentIntensity * Noise1234::noise(currentNoisePos.x,
Toshihiro Shimizu 890ddd
																		  currentNoisePos.y,
Toshihiro Shimizu 890ddd
																		  currentEvolution) /
Toshihiro Shimizu 890ddd
									  p.int_sum;
Toshihiro Shimizu 890ddd
						} else {
Toshihiro Shimizu 890ddd
							tmpVal += currentIntensity * SimplexNoise::noise(currentNoisePos.x,
Toshihiro Shimizu 890ddd
																			 currentNoisePos.y,
Toshihiro Shimizu 890ddd
																			 currentEvolution) /
Toshihiro Shimizu 890ddd
									  p.int_sum;
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
						currentSize *= p.p_size;
Toshihiro Shimizu 890ddd
						currentOffset.x *= p.p_offset;
Toshihiro Shimizu 890ddd
						currentOffset.y *= p.p_offset;
Toshihiro Shimizu 890ddd
						currentIntensity *= p.p_intensity;
Toshihiro Shimizu 890ddd
						currentEvolution *= p.p_evolution;
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
					val_sum += tmpVal;
Toshihiro Shimizu 890ddd
					count += 1;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			float val = val_sum / (float)count;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/* クランプ */
Toshihiro Shimizu 890ddd
			val = (val < 0.0f) ? 0.0f : ((val > 1.0f) ? 1.0f : val);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			(*out_p).x = val;
Toshihiro Shimizu 890ddd
			(*out_p).y = val;
Toshihiro Shimizu 890ddd
			(*out_p).z = val;
Toshihiro Shimizu 890ddd
			(*out_p).w = (p.alp_rend_sw) ? val : 1.0f;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*------------------------------------------------------------
Toshihiro Shimizu 890ddd
 WarpHVモード、Fresnel反射モード
Toshihiro Shimizu 890ddd
------------------------------------------------------------*/
Toshihiro Shimizu 890ddd
void Iwa_PNPerspectiveFx::calcPNNormal_CPU(float4 *out_host,
Toshihiro Shimizu 890ddd
										   TDimensionI &dimOut,
Toshihiro Shimizu 890ddd
										   PN_Params &p,
Toshihiro Shimizu 890ddd
										   bool isSubWave)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/* 結果を収めるイテレータ */
Toshihiro Shimizu 890ddd
	float4 *out_p = out_host;
Toshihiro Shimizu 890ddd
	/* 各ピクセルについて */
Toshihiro Shimizu 890ddd
	for (int yy = 0; yy < p.drawLevel; yy++) {
Toshihiro Shimizu 890ddd
		for (int xx = 0; xx < dimOut.lx; xx++, out_p++) {
Toshihiro Shimizu 890ddd
			float2 screenPos = {(float)xx * p.a11 + (float)yy * p.a12 + p.a13,
Toshihiro Shimizu 890ddd
								(float)xx * p.a21 + (float)yy * p.a22 + p.a23};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/*  ② Perlin Noise 平面上の座標を計算する */
Toshihiro Shimizu 890ddd
			float2 noisePos;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			noisePos.x = -(p.eyeLevel.y + p.fy_2) *
Toshihiro Shimizu 890ddd
							 (screenPos.x - p.eyeLevel.x) / (screenPos.y - p.eyeLevel.y) +
Toshihiro Shimizu 890ddd
						 p.eyeLevel.x;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			noisePos.y = (p.fy_2 + screenPos.y) * p.A / (p.eyeLevel.y - screenPos.y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			float gradient[2]; /* 0 : よこ差分、1 : たて差分 */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			float delta = 0.001f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/* 横、縦差分それぞれについて */
Toshihiro Shimizu 890ddd
			for (int yokoTate = 0; yokoTate < 2; yokoTate++) {
Toshihiro Shimizu 890ddd
				/* 勾配の初期化 */
Toshihiro Shimizu 890ddd
				gradient[yokoTate] = 0.0f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				/* サンプリング位置のオフセットを求める */
Toshihiro Shimizu 890ddd
				float2 kinbouNoisePos[2] = {float2{noisePos.x - ((yokoTate == 0) ? delta : 0.0f),
Toshihiro Shimizu 890ddd
												   noisePos.y - ((yokoTate == 0) ? 0.0f : delta)},
Toshihiro Shimizu 890ddd
											float2{noisePos.x + ((yokoTate == 0) ? delta : 0.0f),
Toshihiro Shimizu 890ddd
												   noisePos.y + ((yokoTate == 0) ? 0.0f : delta)}};
Toshihiro Shimizu 890ddd
				float currentSize = p.size;
Toshihiro Shimizu 890ddd
				float2 currentOffset = p.offset;
Toshihiro Shimizu 890ddd
				float currentIntensity = 1.0f;
Toshihiro Shimizu 890ddd
				//float2* basis_p = basis;
Toshihiro Shimizu 890ddd
				float currentEvolution = (isSubWave) ? p.time + 100.0f : p.time;
Toshihiro Shimizu 890ddd
				/* 各世代について */
Toshihiro Shimizu 890ddd
				for (int o = 0; o < p.octaves;
Toshihiro Shimizu 890ddd
					 o++,
Toshihiro Shimizu 890ddd
						 currentSize *= p.p_size,
Toshihiro Shimizu 890ddd
						 currentOffset.x *= p.p_offset,
Toshihiro Shimizu 890ddd
						 currentOffset.y *= p.p_offset,
Toshihiro Shimizu 890ddd
						 currentIntensity *= p.p_intensity) {
Toshihiro Shimizu 890ddd
					/* プラス方向、マイナス方向それぞれオフセットしたノイズ座標を求める */
Toshihiro Shimizu 890ddd
					float2 currentOffsetNoisePos[2];
Toshihiro Shimizu 890ddd
					for (int mp = 0; mp < 2; mp++)
Toshihiro Shimizu 890ddd
						currentOffsetNoisePos[mp] = float2{(kinbouNoisePos[mp].x - currentOffset.x) / currentSize,
Toshihiro Shimizu 890ddd
														   (kinbouNoisePos[mp].y - currentOffset.y) / currentSize};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					/* ノイズの差分を積算していく */
Toshihiro Shimizu 890ddd
					float noiseDiff;
Toshihiro Shimizu 890ddd
					//Perlin Noise
Toshihiro Shimizu 890ddd
					if (p.noiseType == 0) {
Toshihiro Shimizu 890ddd
						noiseDiff = Noise1234::noise(currentOffsetNoisePos[1].x,
Toshihiro Shimizu 890ddd
													 currentOffsetNoisePos[1].y,
Toshihiro Shimizu 890ddd
													 currentEvolution) -
Toshihiro Shimizu 890ddd
									Noise1234::noise(currentOffsetNoisePos[0].x,
Toshihiro Shimizu 890ddd
													 currentOffsetNoisePos[0].y,
Toshihiro Shimizu 890ddd
													 currentEvolution);
Toshihiro Shimizu 890ddd
					} else {
Toshihiro Shimizu 890ddd
						/* インデックスをチェック */
Toshihiro Shimizu 890ddd
						/* まず、前後 */
Toshihiro Shimizu 890ddd
						CellIds kinbouIds[2] = {SimplexNoise::getCellIds(currentOffsetNoisePos[0].x,
Toshihiro Shimizu 890ddd
																		 currentOffsetNoisePos[0].y,
Toshihiro Shimizu 890ddd
																		 currentEvolution),
Toshihiro Shimizu 890ddd
												SimplexNoise::getCellIds(currentOffsetNoisePos[1].x,
Toshihiro Shimizu 890ddd
																		 currentOffsetNoisePos[1].y,
Toshihiro Shimizu 890ddd
																		 currentEvolution)};
Toshihiro Shimizu 890ddd
						/* 同じセルに入っていたら、普通に差分を計算 */
Toshihiro Shimizu 890ddd
						if (kinbouIds[0] == kinbouIds[1]) {
Toshihiro Shimizu 890ddd
							noiseDiff = SimplexNoise::noise(currentOffsetNoisePos[1].x,
Toshihiro Shimizu 890ddd
															currentOffsetNoisePos[1].y,
Toshihiro Shimizu 890ddd
															currentEvolution) -
Toshihiro Shimizu 890ddd
										SimplexNoise::noise(currentOffsetNoisePos[0].x,
Toshihiro Shimizu 890ddd
															currentOffsetNoisePos[0].y,
Toshihiro Shimizu 890ddd
															currentEvolution);
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
						/* 違うセルの場合、中心位置を用いる */
Toshihiro Shimizu 890ddd
						else {
Toshihiro Shimizu 890ddd
							float2 currentCenterNoisePos = {(noisePos.x - currentOffset.x) / currentSize,
Toshihiro Shimizu 890ddd
															(noisePos.y - currentOffset.y) / currentSize};
Toshihiro Shimizu 890ddd
							CellIds centerIds = SimplexNoise::getCellIds(currentCenterNoisePos.x,
Toshihiro Shimizu 890ddd
																		 currentCenterNoisePos.y,
Toshihiro Shimizu 890ddd
																		 currentEvolution);
Toshihiro Shimizu 890ddd
							if (kinbouIds[0] == centerIds) {
Toshihiro Shimizu 890ddd
								noiseDiff = SimplexNoise::noise(currentCenterNoisePos.x,
Toshihiro Shimizu 890ddd
																currentCenterNoisePos.y,
Toshihiro Shimizu 890ddd
																currentEvolution) -
Toshihiro Shimizu 890ddd
											SimplexNoise::noise(currentOffsetNoisePos[0].x,
Toshihiro Shimizu 890ddd
																currentOffsetNoisePos[0].y,
Toshihiro Shimizu 890ddd
																currentEvolution);
Toshihiro Shimizu 890ddd
							} else // if(kinbouIds[1] == centerIds)
Toshihiro Shimizu 890ddd
							{
Toshihiro Shimizu 890ddd
								noiseDiff = SimplexNoise::noise(currentOffsetNoisePos[1].x,
Toshihiro Shimizu 890ddd
																currentOffsetNoisePos[1].y,
Toshihiro Shimizu 890ddd
																currentEvolution) -
Toshihiro Shimizu 890ddd
											SimplexNoise::noise(currentCenterNoisePos.x,
Toshihiro Shimizu 890ddd
																currentCenterNoisePos.y,
Toshihiro Shimizu 890ddd
																currentEvolution);
Toshihiro Shimizu 890ddd
							}
Toshihiro Shimizu 890ddd
							/* 片端→中心の変位を使っているので、片端→片端に合わせて変位を2倍する */
Toshihiro Shimizu 890ddd
							noiseDiff *= 2.0f;
Toshihiro Shimizu 890ddd
						}
Toshihiro Shimizu 890ddd
					}
Toshihiro Shimizu 890ddd
					/* 差分に強度を乗算して足しこむ */
Toshihiro Shimizu 890ddd
					gradient[yokoTate] += currentIntensity * noiseDiff / p.int_sum;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
					currentEvolution *= p.p_evolution;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/* X方向、Y方向の近傍ベクトルを計算する */
Toshihiro Shimizu 890ddd
			float3 vec_x = {delta * 2, 0.0f, gradient[0] * p.waveHeight};
Toshihiro Shimizu 890ddd
			float3 vec_y = {0.0f, delta * 2, gradient[1] * p.waveHeight};
Toshihiro Shimizu 890ddd
			float3 normal = normalize(cross(vec_x, vec_y));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
			/* カメラから平面へのベクトル */
Toshihiro Shimizu 890ddd
			float3 cam_vec = {noisePos.x - p.cam_pos.x,
Toshihiro Shimizu 890ddd
							  noisePos.y - p.cam_pos.y,
Toshihiro Shimizu 890ddd
							  -p.cam_pos.z};
Toshihiro Shimizu 890ddd
			cam_vec = normalize(cam_vec);
Toshihiro Shimizu 890ddd
			/* WarpHVの参照画像モード */
Toshihiro Shimizu 890ddd
			if (p.renderMode == 2 || p.renderMode == 4) {
Toshihiro Shimizu 890ddd
				/* 平面からの反射ベクトル */
Toshihiro Shimizu 890ddd
				float alpha = dot(normal, cam_vec);
Toshihiro Shimizu 890ddd
				float3 reflect_cam = {2.0f * alpha * normal.x - cam_vec.x,
Toshihiro Shimizu 890ddd
									  2.0f * alpha * normal.y - cam_vec.y,
Toshihiro Shimizu 890ddd
									  2.0f * alpha * normal.z - cam_vec.z}; /* これの長さは1 */
Toshihiro Shimizu 890ddd
				/* 完全に水平な面で反射した場合の反射ベクトル */
Toshihiro Shimizu 890ddd
				float3 reflect_cam_mirror = {cam_vec.x,
Toshihiro Shimizu 890ddd
											 cam_vec.y,
Toshihiro Shimizu 890ddd
											 -cam_vec.z};
Toshihiro Shimizu 890ddd
				/* 角度のずれを格納する */
Toshihiro Shimizu 890ddd
				/*  -PI/2 ~ PI/2 */
Toshihiro Shimizu 890ddd
				float angle_h = atanf(reflect_cam.x / reflect_cam.y) -
Toshihiro Shimizu 890ddd
								atanf(reflect_cam_mirror.x / reflect_cam_mirror.y);
Toshihiro Shimizu 890ddd
				float angle_v = atanf(reflect_cam.z / reflect_cam.y) -
Toshihiro Shimizu 890ddd
								atanf(reflect_cam_mirror.z / reflect_cam_mirror.y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				/* 30°を最大とする */
Toshihiro Shimizu 890ddd
				angle_h = 0.5f + angle_h / 0.5236f;
Toshihiro Shimizu 890ddd
				angle_v = 0.5f - angle_v / 0.5236f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				/* クランプ */
Toshihiro Shimizu 890ddd
				angle_h = (angle_h < 0.0f) ? 0.0f : ((angle_h > 1.0f) ? 1.0f : angle_h);
Toshihiro Shimizu 890ddd
				angle_v = (angle_v < 0.0f) ? 0.0f : ((angle_v > 1.0f) ? 1.0f : angle_v);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				if (p.renderMode == 2) {
Toshihiro Shimizu 890ddd
					(*out_p).x = angle_h;
Toshihiro Shimizu 890ddd
					(*out_p).y = angle_v;
Toshihiro Shimizu 890ddd
					(*out_p).z = 0.0f;
Toshihiro Shimizu 890ddd
					(*out_p).w = 1.0f;
Toshihiro Shimizu 890ddd
				} else //  p.renderMode == 4
Toshihiro Shimizu 890ddd
				{
Toshihiro Shimizu 890ddd
					if (!isSubWave) {
Toshihiro Shimizu 890ddd
						(*out_p).y = angle_v;
Toshihiro Shimizu 890ddd
						(*out_p).z = 0.0f;
Toshihiro Shimizu 890ddd
						(*out_p).w = 1.0f;
Toshihiro Shimizu 890ddd
					} else
Toshihiro Shimizu 890ddd
						(*out_p).x = angle_v;
Toshihiro Shimizu 890ddd
				}
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
			/* フレネル反射モード */
Toshihiro Shimizu 890ddd
			else if (p.renderMode == 3) {
Toshihiro Shimizu 890ddd
				cam_vec.x *= -1;
Toshihiro Shimizu 890ddd
				cam_vec.y *= -1;
Toshihiro Shimizu 890ddd
				cam_vec.z *= -1;
Toshihiro Shimizu 890ddd
				float diffuse_angle = acosf(dot(normal, cam_vec)) * 180.0f / 3.14159f;
Toshihiro Shimizu 890ddd
				float ref = 0.0f;
Toshihiro Shimizu 890ddd
				if (diffuse_angle >= 0.0f && diffuse_angle < 90.0f) {
Toshihiro Shimizu 890ddd
					int index = (int)diffuse_angle;
Toshihiro Shimizu 890ddd
					float ratio = diffuse_angle - (float)index;
Toshihiro Shimizu 890ddd
					float fresnel_ref = fresnel[index] * (1.0f - ratio) +
Toshihiro Shimizu 890ddd
										fresnel[index + 1] * ratio;
Toshihiro Shimizu 890ddd
					ref = (fresnel_ref - p.base_fresnel_ref) /
Toshihiro Shimizu 890ddd
						  (1.0f - p.base_fresnel_ref);
Toshihiro Shimizu 890ddd
				} else if (diffuse_angle >= 90.0f)
Toshihiro Shimizu 890ddd
					ref = 1.0f;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
				/* クランプ */
Toshihiro Shimizu 890ddd
				ref = (ref < 0.0f) ? 0.0f : ((ref > 1.0f) ? 1.0f : ref);
Toshihiro Shimizu 890ddd
				(*out_p).x = ref;
Toshihiro Shimizu 890ddd
				(*out_p).y = ref;
Toshihiro Shimizu 890ddd
				(*out_p).z = ref;
Toshihiro Shimizu 890ddd
				(*out_p).w = (p.alp_rend_sw) ? ref : 1.0f;
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void Iwa_PNPerspectiveFx::getParamUIs(TParamUIConcept *&concepts, int &length)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	concepts = new TParamUIConcept[length = 1];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	concepts[0].m_type = TParamUIConcept::POINT;
Toshihiro Shimizu 890ddd
	concepts[0].m_label = "Eye Level";
Toshihiro Shimizu 890ddd
	concepts[0].m_params.push_back(m_eyeLevel);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FX_PLUGIN_IDENTIFIER(Iwa_PNPerspectiveFx, "iwa_PNPerspectiveFx");