DiamondGradientFx() : m_size(100.0) {
   TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White),
                                   TSpectrum::ColorKey(0.2, TPixel32::Yellow),
                                   TSpectrum::ColorKey(0.4, TPixel32::Blue),
                                   TSpectrum::ColorKey(0.6, TPixel32::Green),
                                   TSpectrum::ColorKey(0.8, TPixel32::Magenta),
                                   TSpectrum::ColorKey(1, TPixel32::Red)};
   m_colors = TSpectrumParamP(tArrayCount(colors), colors);
   m_size->setMeasureName("fxLength");
   bindParam(this, "colors", m_colors);
   bindParam(this, "size", m_size);
 }
Esempio n. 2
0
Iwa_TiledParticlesFx::Iwa_TiledParticlesFx()
	: m_source("Texture"), m_control("Control"), source_ctrl_val(0), bright_thres_val(25), center_val(TPointD(0.0, 0.0)), length_val(5.0), height_val(4.0), maxnum_val(10.0), lifetime_val(DoublePair(100., 100.)), lifetime_ctrl_val(0), column_lifetime_val(false), startpos_val(1), randseed_val(1), gravity_val(0.0), g_angle_val(0.0), gravity_ctrl_val(0), friction_val(0.0), friction_ctrl_val(0), windint_val(0.0), windangle_val(0.0), swingmode_val(new TIntEnumParam(SWING_RANDOM, "Random")), randomx_val(DoublePair(0., 0.)), randomy_val(DoublePair(0., 0.)), randomx_ctrl_val(0), randomy_ctrl_val(0), swing_val(DoublePair(0., 0.)), speed_val(DoublePair(0., 10.)), speed_ctrl_val(0), speeda_val(DoublePair(0., 0.)), speeda_ctrl_val(0), speeda_use_gradient_val(false), speedscale_val(false), toplayer_val(new TIntEnumParam(TOP_YOUNGER, "Younger")), mass_val(DoublePair(1., 1.)), scale_val(DoublePair(100., 100.)), scale_ctrl_val(0), scale_ctrl_all_val(false), rot_val(DoublePair(0., 0.)), rot_ctrl_val(0), trail_val(DoublePair(0., 0.)), trailstep_val(0.0), rotswingmode_val(new TIntEnumParam(SWING_RANDOM, "Random")), rotspeed_val(0.0), rotsca_val(DoublePair(0., 0.)), rotswing_val(DoublePair(0., 0.)), pathaim_val(false), opacity_val(DoublePair(0., 100.)), opacity_ctrl_val(0), trailopacity_val(DoublePair(0., 100.)), scalestep_val(DoublePair(0., 0.)), scalestep_ctrl_val(0), fadein_val(0.0), fadeout_val(0.0), animation_val(new TIntEnumParam(ANIM_HOLD, "Hold Frame")), step_val(1), gencol_ctrl_val(0), gencol_spread_val(0.0), genfadecol_val(0.0), fincol_ctrl_val(0), fincol_spread_val(0.0), finrangecol_val(0.0), finfadecol_val(0.0), foutcol_ctrl_val(0), foutcol_spread_val(0.0), foutrangecol_val(0.0), foutfadecol_val(0.0)

	  ,
	  source_gradation_val(false), pick_color_for_every_frame_val(false)
	  /*- 計算モード (背景+粒子/粒子/背景/照明された粒子 -*/
	  ,
	  iw_rendermode_val(new TIntEnumParam(REND_ALL, "All"))
	  /*- 粒子に貼られる絵の素材 -*/
	  ,
	  base_ctrl_val(0)
	  /*- カールノイズ的な動きを与える -*/
	  ,
	  curl_val(0.0)
	  /*- 手前奥でコントロールを立体化してみる -*/
	  ,
	  curl_ctrl_1_val(0), curl_ctrl_2_val(0)
	  /*- 粒子敷き詰め作戦。粒子を正三角形で敷き詰めたときの、 
		正三角形の一辺の長さをインチで指定する -*/
	  ,
	  iw_triangleSize(15.0)
	  /*- ひらひら回転 -*/
	  ,
	  flap_ctrl_val(0), iw_flap_velocity_val(0.0) /*- 回転角速度 -*/
	  ,
	  iw_flap_dir_sensitivity_val(1.0) /*- 回転軸感度 -*/
	  /*- ひらひら粒子に照明を当てる -*/
	  ,
	  iw_light_theta_val(60.0) /*- 光源の方向(Degree)-*/
	  ,
	  iw_light_phi_val(45.0) /*- 光源の傾き(Degree)-*/
	  /*- 読み込みマージン -*/
	  ,
	  margin_val(0.0)
	  /*- 重力を徐々に与えるためのフレーム長 -*/
	  ,
	  iw_gravityBufferFrame_val(0)
{
	addInputPort("Texture1", new TRasterFxPort, 0);
	addInputPort("Control1", new TRasterFxPort, 1);

	length_val->setMeasureName("fxLength");
	height_val->setMeasureName("fxLength");
	center_val->getX()->setMeasureName("fxLength");
	center_val->getY()->setMeasureName("fxLength");

	bindParam(this, "source_ctrl", source_ctrl_val);
	bindParam(this, "bright_thres", bright_thres_val);
	bright_thres_val->setValueRange(0, 255);
	bindParam(this, "center", center_val);
	bindParam(this, "length", length_val);
	length_val->setValueRange(1.0, (std::numeric_limits<double>::max)());
	bindParam(this, "height", height_val);
	height_val->setValueRange(1.0, (std::numeric_limits<double>::max)());
	bindParam(this, "birth_rate", maxnum_val);
	maxnum_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "lifetime", lifetime_val);
	lifetime_val->getMin()->setValueRange(0., +3000.);
	lifetime_val->getMax()->setValueRange(0., +3000.);
	bindParam(this, "lifetime_ctrl", lifetime_ctrl_val);
	bindParam(this, "column_lifetime", column_lifetime_val);
	bindParam(this, "starting_frame", startpos_val);
	bindParam(this, "random_seed", randseed_val);
	bindParam(this, "gravity", gravity_val);
	gravity_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "gravity_angle", g_angle_val);
	g_angle_val->setMeasureName("angle");
	bindParam(this, "gravity_ctrl", gravity_ctrl_val);
	bindParam(this, "friction", friction_val);
	bindParam(this, "friction_ctrl", friction_ctrl_val);
	bindParam(this, "wind", windint_val);
	bindParam(this, "wind_angle", windangle_val);
	windangle_val->setMeasureName("angle");
	bindParam(this, "swing_mode", swingmode_val);
	swingmode_val->addItem(SWING_SMOOTH, "Smooth");
	bindParam(this, "scattering_x", randomx_val);
	randomx_val->getMin()->setMeasureName("fxLength");
	randomx_val->getMax()->setMeasureName("fxLength");
	randomx_val->getMin()->setValueRange(-1000., +1000.);
	randomx_val->getMax()->setValueRange(-1000., +1000.);
	bindParam(this, "scattering_y", randomy_val);
	randomy_val->getMin()->setMeasureName("fxLength");
	randomy_val->getMax()->setMeasureName("fxLength");
	randomy_val->getMin()->setValueRange(-1000., +1000.);
	randomy_val->getMax()->setValueRange(-1000., +1000.);
	bindParam(this, "scattering_x_ctrl", randomx_ctrl_val);
	bindParam(this, "scattering_y_ctrl", randomy_ctrl_val);
	bindParam(this, "swing", swing_val);
	swing_val->getMin()->setValueRange(-1000., +1000.);
	swing_val->getMax()->setValueRange(-1000., +1000.);
	speed_val->getMin()->setMeasureName("fxLength");
	speed_val->getMax()->setMeasureName("fxLength");
	bindParam(this, "speed", speed_val);
	speed_val->getMin()->setValueRange(-1000., +1000.);
	speed_val->getMax()->setValueRange(-1000., +1000.);
	bindParam(this, "speed_ctrl", speed_ctrl_val);
	bindParam(this, "speed_angle", speeda_val);
	speeda_val->getMin()->setValueRange(-1000., +1000.);
	speeda_val->getMax()->setValueRange(-1000., +1000.);
	speeda_val->getMin()->setMeasureName("angle");
	speeda_val->getMax()->setMeasureName("angle");

	bindParam(this, "speeda_ctrl", speeda_ctrl_val);
	bindParam(this, "speeda_use_gradient", speeda_use_gradient_val);

	bindParam(this, "speed_size", speedscale_val);
	bindParam(this, "top_layer", toplayer_val);
	toplayer_val->addItem(TOP_OLDER, "Older");
	toplayer_val->addItem(TOP_SMALLER, "Smaller");
	toplayer_val->addItem(TOP_BIGGER, "Bigger");
	toplayer_val->addItem(TOP_RANDOM, "Random");
	bindParam(this, "mass", mass_val);
	mass_val->getMin()->setValueRange(0., +1000.);
	mass_val->getMax()->setValueRange(0., +1000.);
	bindParam(this, "scale", scale_val);
	scale_val->getMin()->setValueRange(0., +1000.);
	scale_val->getMax()->setValueRange(0., +1000.);
	bindParam(this, "scale_ctrl", scale_ctrl_val);
	bindParam(this, "scale_ctrl_all", scale_ctrl_all_val);
	bindParam(this, "rot", rot_val);
	rot_val->getMin()->setValueRange(-1000., +1000.);
	rot_val->getMax()->setValueRange(-1000., +1000.);
	rot_val->getMin()->setMeasureName("angle");
	rot_val->getMax()->setMeasureName("angle");
	bindParam(this, "rot_ctrl", rot_ctrl_val);
	bindParam(this, "trail", trail_val);
	trail_val->getMin()->setValueRange(0., +1000.);
	trail_val->getMax()->setValueRange(0., +1000.);
	bindParam(this, "trail_step", trailstep_val);
	trailstep_val->setValueRange(1.0, (std::numeric_limits<double>::max)());
	bindParam(this, "spin_swing_mode", rotswingmode_val);
	rotswingmode_val->addItem(SWING_SMOOTH, "Smooth");
	bindParam(this, "spin_speed", rotspeed_val);
	rotspeed_val->setMeasureName("angle");
	bindParam(this, "spin_random", rotsca_val);
	rotsca_val->getMin()->setValueRange(-1000., +1000.);
	rotsca_val->getMax()->setValueRange(-1000., +1000.);
	rotsca_val->getMin()->setMeasureName("angle");
	rotsca_val->getMax()->setMeasureName("angle");
	bindParam(this, "spin_swing", rotswing_val);
	rotswing_val->getMin()->setValueRange(-1000., +1000.);
	rotswing_val->getMax()->setValueRange(-1000., +1000.);
	rotswing_val->getMin()->setMeasureName("angle");
	rotswing_val->getMax()->setMeasureName("angle");
	bindParam(this, "path_aim", pathaim_val);
	bindParam(this, "opacity", opacity_val);
	opacity_val->getMin()->setValueRange(0., +100.);
	opacity_val->getMax()->setValueRange(0., +100.);
	bindParam(this, "opacity_ctrl", opacity_ctrl_val);
	bindParam(this, "trail_opacity", trailopacity_val);
	trailopacity_val->getMin()->setValueRange(0., +100.);
	trailopacity_val->getMax()->setValueRange(0., +100.);
	bindParam(this, "scale_step", scalestep_val);
	bindParam(this, "scale_step_ctrl", scalestep_ctrl_val);
	scalestep_val->getMin()->setValueRange(-100., +100.);
	scalestep_val->getMax()->setValueRange(-100., +100.);
	bindParam(this, "fade_in", fadein_val);
	bindParam(this, "fade_out", fadeout_val);
	bindParam(this, "animation", animation_val);
	animation_val->addItem(ANIM_RANDOM, "Random Frame");
	animation_val->addItem(ANIM_CYCLE, "Column");
	animation_val->addItem(ANIM_R_CYCLE, "Column - Random Start");
	animation_val->addItem(ANIM_SR_CYCLE, "Column Swing - Random Start");
	bindParam(this, "step", step_val);
	step_val->setValueRange(1, (std::numeric_limits<int>::max)());
	TSpectrum::ColorKey colors[] = {
		TSpectrum::ColorKey(0, TPixel32::Red),
		TSpectrum::ColorKey(1, TPixel32::Red)};
	gencol_val = TSpectrumParamP(tArrayCount(colors), colors);
	bindParam(this, "birth_color", gencol_val);
	bindParam(this, "birth_color_ctrl", gencol_ctrl_val);
	bindParam(this, "birth_color_spread", gencol_spread_val);
	gencol_spread_val->setValueRange(0.0, (std::numeric_limits<int>::max)());
	bindParam(this, "birth_color_fade", genfadecol_val);
	genfadecol_val->setValueRange(0.0, 100.0);
	TSpectrum::ColorKey colors1[] = {
		TSpectrum::ColorKey(0, TPixel32::Green),
		TSpectrum::ColorKey(1, TPixel32::Green)};
	fincol_val = TSpectrumParamP(tArrayCount(colors1), colors1);
	bindParam(this, "fadein_color", fincol_val);
	bindParam(this, "fadein_color_ctrl", fincol_ctrl_val);
	bindParam(this, "fadein_color_spread", fincol_spread_val);
	fincol_spread_val->setValueRange(0.0, (std::numeric_limits<int>::max)());
	bindParam(this, "fadein_color_range", finrangecol_val);
	finrangecol_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "fadein_color_fade", finfadecol_val);
	finfadecol_val->setValueRange(0.0, 100.0);
	TSpectrum::ColorKey colors2[] = {
		TSpectrum::ColorKey(0, TPixel32::Blue),
		TSpectrum::ColorKey(1, TPixel32::Blue)};
	foutcol_val = TSpectrumParamP(tArrayCount(colors2), colors2);
	bindParam(this, "fadeout_color", foutcol_val);
	bindParam(this, "fadeout_color_ctrl", foutcol_ctrl_val);
	bindParam(this, "fadeout_color_spread", foutcol_spread_val);
	foutcol_spread_val->setValueRange(0.0, (std::numeric_limits<int>::max)());
	bindParam(this, "fadeout_color_range", foutrangecol_val);
	foutrangecol_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "fadeout_color_fade", foutfadecol_val);
	foutfadecol_val->setValueRange(0.0, 100.0);

	bindParam(this, "source_gradation", source_gradation_val);
	bindParam(this, "pick_color_for_every_frame", pick_color_for_every_frame_val);

	/*- 計算モード (背景+粒子/粒子/背景/照明された粒子) -*/
	bindParam(this, "rendermode", iw_rendermode_val);
	iw_rendermode_val->addItem(REND_PARTICLES, "Particles");
	iw_rendermode_val->addItem(REND_BG, "Background");
	iw_rendermode_val->addItem(REND_ILLUMINATED, "Illuminated");

	/*- 粒子に貼られる絵の素材 -*/
	bindParam(this, "base_ctrl", base_ctrl_val);
	bindParam(this, "curl", curl_val);
	curl_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "curl_ctrl", curl_ctrl_1_val);
	bindParam(this, "curl_ctrl_2", curl_ctrl_2_val);

	/*- 粒子敷き詰め作戦。粒子を正三角形で敷き詰めたときの、
		正三角形の一辺の長さをインチで指定する -*/
	bindParam(this, "triangleSize", iw_triangleSize);
	iw_triangleSize->setValueRange(0.1, 100);
	iw_triangleSize->setMeasureName("fxLength");

	/*- ひらひら回転 -*/
	bindParam(this, "flap_ctrl", flap_ctrl_val);
	bindParam(this, "flap_velocity", iw_flap_velocity_val);
	iw_flap_velocity_val->setValueRange(0.0, (std::numeric_limits<double>::max)());
	bindParam(this, "flap_dir_sensitivity", iw_flap_dir_sensitivity_val);
	iw_flap_dir_sensitivity_val->setValueRange(0.0, 1.0);
	/*- ひらひら粒子に照明を当てる -*/
	bindParam(this, "light_theta", iw_light_theta_val);
	iw_light_theta_val->setValueRange(-1000.0, 1000.0);
	bindParam(this, "light_phi", iw_light_phi_val);
	iw_light_phi_val->setValueRange(-1000.0, 1000.0);

	/*- 読み込みマージン -*/
	margin_val->setMeasureName("fxLength");
	bindParam(this, "margin", margin_val);
	margin_val->setValueRange(0, (std::numeric_limits<double>::max)());

	/*- 重力を徐々に与えるためのフレーム長 -*/
	bindParam(this, "gravityBufferFrame", iw_gravityBufferFrame_val);
}
Esempio n. 3
0
  void doCompute(TTile &tile, double frame,
                 const TRenderSettings &info) override {
    bool isWarped = m_warped.isConnected();

    if (!isWarped) return;

    if (fabs(m_intensity->getValue(frame)) < 0.01) {
      m_warped->compute(tile, frame, info);
      return;
    }

    int shrink      = (info.m_shrinkX + info.m_shrinkY) / 2;
    double scale    = sqrt(fabs(info.m_affine.det()));
    double gridStep = 1.5 * m_gridStep->getValue(frame);

    WarpParams params;
    params.m_intensity   = m_intensity->getValue(frame) / gridStep;
    params.m_warperScale = scale * gridStep;
    params.m_sharpen     = m_sharpen->getValue();
    params.m_shrink      = shrink;
    double period        = m_period->getValue(frame) / info.m_shrinkX;
    double count         = m_count->getValue(frame);
    double cycle         = m_cycle->getValue(frame) / info.m_shrinkX;
    double scaleX        = m_scaleX->getValue(frame) / 100.0;
    double scaleY        = m_scaleY->getValue(frame) / 100.0;
    double angle         = -m_angle->getValue(frame);
    TPointD center       = m_center->getValue(frame) * (1.0 / info.m_shrinkX);

    // The warper is calculated on a standard reference, with fixed dpi. This
    // makes sure
    // that the lattice created for the warp does not depend on camera
    // transforms and resolution.
    TRenderSettings warperInfo(info);
    double warperScaleFactor = 1.0 / params.m_warperScale;
    warperInfo.m_affine      = TScale(warperScaleFactor) * info.m_affine;

    // Retrieve tile's geometry
    TRectD tileRect;
    {
      TRasterP tileRas = tile.getRaster();
      tileRect =
          TRectD(tile.m_pos, TDimensionD(tileRas->getLx(), tileRas->getLy()));
    }

    // Build the compute rect
    TRectD warpedBox, warpedComputeRect, tileComputeRect;
    m_warped->getBBox(frame, warpedBox, info);

    getWarpComputeRects(tileComputeRect, warpedComputeRect, warpedBox, tileRect,
                        params);

    if (tileComputeRect.getLx() <= 0 || tileComputeRect.getLy() <= 0) return;
    if (warpedComputeRect.getLx() <= 0 || warpedComputeRect.getLy() <= 0)
      return;

    TRectD warperComputeRect(TScale(warperScaleFactor) * tileComputeRect);
    double warperEnlargement = getWarperEnlargement(params);
    warperComputeRect        = warperComputeRect.enlarge(warperEnlargement);
    warperComputeRect.x0     = tfloor(warperComputeRect.x0);
    warperComputeRect.y0     = tfloor(warperComputeRect.y0);
    warperComputeRect.x1     = tceil(warperComputeRect.x1);
    warperComputeRect.y1     = tceil(warperComputeRect.y1);

    // Compute the warped tile
    TTile tileIn;
    m_warped->allocateAndCompute(
        tileIn, warpedComputeRect.getP00(),
        TDimension(warpedComputeRect.getLx(), warpedComputeRect.getLy()),
        tile.getRaster(), frame, info);
    TRasterP rasIn = tileIn.getRaster();

    // Compute the warper tile
    TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White),
                                    TSpectrum::ColorKey(0.5, TPixel32::Black),
                                    TSpectrum::ColorKey(1, TPixel32::White)};

    TSpectrumParamP ripplecolors = TSpectrumParamP(tArrayCount(colors), colors);

    // Build the multiradial
    warperInfo.m_affine = warperInfo.m_affine * TTranslation(center) *
                          TRotation(angle) * TScale(scaleX, scaleY);
    TAffine aff      = warperInfo.m_affine.inv();
    TPointD posTrasf = aff * (warperComputeRect.getP00());
    TRasterP rasWarper =
        rasIn->create(warperComputeRect.getLx(), warperComputeRect.getLy());
    multiRadial(rasWarper, posTrasf, ripplecolors, period, count, cycle, aff,
                frame);
    // TImageWriter::save(TFilePath("C:\\ripple.tif"), rasWarper);

    // Warp
    TPointD db;
    TRect rasComputeRectI(convert(tileComputeRect - tileRect.getP00(), db));
    TRasterP tileRas = tile.getRaster()->extract(rasComputeRectI);

    TPointD rasInPos(warpedComputeRect.getP00() - tileComputeRect.getP00());
    TPointD warperPos(
        (TScale(params.m_warperScale) * warperComputeRect.getP00()) -
        tileComputeRect.getP00());
    warp(tileRas, rasIn, rasWarper, rasInPos, warperPos, params);
  }
Esempio n. 4
0
	void doCompute(TTile &tile, double frame, const TRenderSettings &info)
	{
		bool isWarped = m_warped.isConnected();

		if (!isWarped)
			return;

		if (fabs(m_intensity->getValue(frame)) < 0.01) {
			m_warped->compute(tile, frame, info);
			return;
		}

		int shrink = (info.m_shrinkX + info.m_shrinkY) / 2;
		double scale = sqrt(fabs(info.m_affine.det()));
		double gridStep = 1.5 * m_gridStep->getValue(frame);

		WarpParams params;
		params.m_intensity = m_intensity->getValue(frame) / gridStep;
		params.m_warperScale = scale * gridStep;
		params.m_sharpen = m_sharpen->getValue();
		params.m_shrink = shrink;
		double evolution = m_evol->getValue(frame);
		double size = 100.0 / info.m_shrinkX;
		TPointD pos(m_posx->getValue(frame), m_posy->getValue(frame));

		//The warper is calculated on a standard reference, with fixed dpi. This makes sure
		//that the lattice created for the warp does not depend on camera transforms and resolution.
		TRenderSettings warperInfo(info);
		double warperScaleFactor = 1.0 / params.m_warperScale;
		warperInfo.m_affine = TScale(warperScaleFactor) * info.m_affine;

		//Retrieve tile's geometry
		TRectD tileRect;
		{
			TRasterP tileRas = tile.getRaster();
			tileRect = TRectD(tile.m_pos, TDimensionD(tileRas->getLx(), tileRas->getLy()));
		}

		//Build the compute rect
		TRectD warpedBox, warpedComputeRect, tileComputeRect;
		m_warped->getBBox(frame, warpedBox, info);

		getWarpComputeRects(tileComputeRect, warpedComputeRect, warpedBox, tileRect, params);

		if (tileComputeRect.getLx() <= 0 || tileComputeRect.getLy() <= 0)
			return;
		if (warpedComputeRect.getLx() <= 0 || warpedComputeRect.getLy() <= 0)
			return;

		TRectD warperComputeRect(TScale(warperScaleFactor) * tileComputeRect);
		double warperEnlargement = getWarperEnlargement(params);
		warperComputeRect = warperComputeRect.enlarge(warperEnlargement);
		warperComputeRect.x0 = tfloor(warperComputeRect.x0);
		warperComputeRect.y0 = tfloor(warperComputeRect.y0);
		warperComputeRect.x1 = tceil(warperComputeRect.x1);
		warperComputeRect.y1 = tceil(warperComputeRect.y1);

		//Compute the warped tile
		TTile tileIn;
		m_warped->allocateAndCompute(tileIn, warpedComputeRect.getP00(),
									 TDimension(warpedComputeRect.getLx(), warpedComputeRect.getLy()),
									 tile.getRaster(), frame, info);
		TRasterP rasIn = tileIn.getRaster();

		//Compute the warper tile
		TSpectrum::ColorKey colors[] = {
			TSpectrum::ColorKey(0, TPixel32::White),
			TSpectrum::ColorKey(1, TPixel32::Black)};

		TSpectrumParamP cloudscolors = TSpectrumParamP(tArrayCount(colors), colors);

		//Build the warper
		warperInfo.m_affine = warperInfo.m_affine;
		TAffine aff = warperInfo.m_affine.inv();

		TTile warperTile;
		TRasterP rasWarper = rasIn->create(warperComputeRect.getLx(), warperComputeRect.getLy());
		warperTile.m_pos = warperComputeRect.getP00();
		warperTile.setRaster(rasWarper);

		{
			TRenderSettings info2(warperInfo);

			//Now, separate the part of the affine the Fx can handle from the rest.
			TAffine fxHandledAffine = handledAffine(warperInfo, frame);
			info2.m_affine = fxHandledAffine;

			TAffine aff = warperInfo.m_affine * fxHandledAffine.inv();
			aff.a13 /= warperInfo.m_shrinkX;
			aff.a23 /= warperInfo.m_shrinkY;

			TRectD rectIn = aff.inv() * warperComputeRect;

			//rectIn = rectIn.enlarge(getResampleFilterRadius(info));  //Needed to counter the resample filter

			TRect rectInI(tfloor(rectIn.x0), tfloor(rectIn.y0), tceil(rectIn.x1) - 1, tceil(rectIn.y1) - 1);

			// rasIn e' un raster dello stesso tipo di tile.getRaster()

			TTile auxtile(warperTile.getRaster()->create(rectInI.getLx(), rectInI.getLy()), convert(rectInI.getP00()));

			TPointD mypos(auxtile.m_pos - pos);

			double scale2 = sqrt(fabs(info2.m_affine.det()));
			doClouds(auxtile.getRaster(), cloudscolors, mypos, evolution, size, 0.0, 1.0, PNOISE_CLOUDS, scale2, frame);

			info2.m_affine = aff;
			TRasterFx::applyAffine(warperTile, auxtile, info2);
		}

		//Warp
		TPointD db;
		TRect rasComputeRectI(convert(tileComputeRect - tileRect.getP00(), db));
		TRasterP tileRas = tile.getRaster()->extract(rasComputeRectI);

		TPointD rasInPos(warpedComputeRect.getP00() - tileComputeRect.getP00());
		TPointD warperPos((TScale(params.m_warperScale) * warperComputeRect.getP00()) - tileComputeRect.getP00());
		warp(tileRas, rasIn, rasWarper, rasInPos, warperPos, params);
	}