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