|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "trop.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tfxparam.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "stdfx.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tpluginmanager.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tpixelutils.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tspectrumparam.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "ttzpimagefx.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "gradients.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tunit.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tparamuiconcept.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <qcoreapplication></qcoreapplication>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
#pragma warning(disable : 4996)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
#undef max
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool isAlmostIsotropic(const TAffine &aff) { return aff.isIsotropic(0.001); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class FadeFx final : public TStandardRasterFx {
|
|
Shinya Kitaoka |
120a6e |
FX_PLUGIN_DECLARATION(FadeFx)
|
|
Shinya Kitaoka |
120a6e |
TRasterFxPort m_input;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_value;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
FadeFx() : m_value(50) {
|
|
Shinya Kitaoka |
120a6e |
m_value->setValueRange(0, 100);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "value", m_value);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
addInputPort("Source", m_input);
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
~FadeFx(){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
38fd86 |
bool doGetBBox(double frame, TRectD &bBox,
|
|
Shinya Kitaoka |
38fd86 |
const TRenderSettings &info) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_input.isConnected()) {
|
|
Shinya Kitaoka |
120a6e |
bool ret = m_input->doGetBBox(frame, bBox, info);
|
|
Shinya Kitaoka |
120a6e |
// devo scurire bgColor
|
|
Shinya Kitaoka |
120a6e |
return ret;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
bBox = TRectD();
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
38fd86 |
void doCompute(TTile &tile, double frame,
|
|
Shinya Kitaoka |
38fd86 |
const TRenderSettings &ri) override {
|
|
Shinya Kitaoka |
120a6e |
if (!m_input.isConnected()) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_input->compute(tile, frame, ri);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double v = 1 - m_value->getValue(frame) / 100;
|
|
Shinya Kitaoka |
120a6e |
TRop::rgbmScale(tile.getRaster(), tile.getRaster(), 1, 1, 1, v);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
38fd86 |
bool canHandle(const TRenderSettings &info, double frame) override {
|
|
Shinya Kitaoka |
38fd86 |
return true;
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class SpiralFx final : public TStandardZeraryFx {
|
|
Shinya Kitaoka |
120a6e |
FX_PLUGIN_DECLARATION(SpiralFx)
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_freq;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_phase;
|
|
Shinya Kitaoka |
120a6e |
TSpectrumParamP m_spectrum;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
SpiralFx()
|
|
Shinya Kitaoka |
120a6e |
: m_freq(0.1) // args, "Freq")
|
|
Shinya Kitaoka |
120a6e |
, m_phase(0.0) // args, "Phase")
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
// m_freq->setDefaultValue(0.1);
|
|
Shinya Kitaoka |
120a6e |
// m_phase->setDefaultValue(0.0);
|
|
Shinya Kitaoka |
120a6e |
const TPixel32 transparent(0, 0, 0, 0);
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
TPixel32 colors[] = {
|
|
Shinya Kitaoka |
120a6e |
TPixel32::Magenta,
|
|
Shinya Kitaoka |
120a6e |
TPixel32::Black,
|
|
Shinya Kitaoka |
120a6e |
TPixel32::Red,
|
|
Shinya Kitaoka |
120a6e |
TPixel32::Yellow,
|
|
Shinya Kitaoka |
120a6e |
transparent};
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::Magenta),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0.25, TPixel32::Black),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0.5, TPixel32::Red),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0.75, TPixel32::Yellow),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(1, transparent)};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_spectrum = TSpectrumParamP(tArrayCount(colors), colors);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "colors", m_spectrum);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "freq", m_freq);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "phase", m_phase);
|
|
Shinya Kitaoka |
120a6e |
m_freq->setValueRange(0, 1);
|
|
Shinya Kitaoka |
120a6e |
// m_spectrum->setDefaultValue(tArrayCount(colors), colors);
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
~SpiralFx(){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
bool doGetBBox(double, TRectD &bBox, const TRenderSettings &info) override {
|
|
Shinya Kitaoka |
120a6e |
bBox = TConsts::infiniteRectD;
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
38fd86 |
bool canHandle(const TRenderSettings &info, double frame) override {
|
|
Shinya Kitaoka |
38fd86 |
return true;
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
template <class t=""></class>
|
|
Toshihiro Shimizu |
890ddd |
void doComputeT(TRasterPT<t> raster, TPointD posTrasf, const TAffine &aff,</t>
|
|
Shinya Kitaoka |
120a6e |
const TSpectrumT<t> &spectrum, double freq, double phase) {</t>
|
|
Shinya Kitaoka |
120a6e |
raster->lock();
|
|
Shinya Kitaoka |
120a6e |
for (int y = 0; y < raster->getLy(); y++) {
|
|
Shinya Kitaoka |
120a6e |
TPointD posAux = posTrasf;
|
|
Shinya Kitaoka |
120a6e |
T *pix = raster->pixels(y);
|
|
Shinya Kitaoka |
120a6e |
for (int x = 0; x < raster->getLx(); x++) {
|
|
Shinya Kitaoka |
120a6e |
double ang = 0.0;
|
|
Shinya Kitaoka |
120a6e |
if (posAux.x != 0 || posAux.y != 0) ang = atan2(posAux.y, posAux.x);
|
|
Shinya Kitaoka |
120a6e |
double r = sqrt(posAux.x * posAux.x + posAux.y * posAux.y);
|
|
Shinya Kitaoka |
120a6e |
double v = 0.5 * (1 + sin(r * freq + ang + phase));
|
|
Shinya Kitaoka |
120a6e |
*pix++ = spectrum.getPremultipliedValue(v);
|
|
Shinya Kitaoka |
120a6e |
posAux.x += aff.a11;
|
|
Shinya Kitaoka |
120a6e |
posAux.y += aff.a21;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
posTrasf.x += aff.a12;
|
|
Shinya Kitaoka |
120a6e |
posTrasf.y += aff.a22;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
raster->unlock();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void SpiralFx::doCompute(TTile &tile, double frame, const TRenderSettings &ri) {
|
|
Shinya Kitaoka |
120a6e |
double phase = m_phase->getValue(frame);
|
|
Shinya Kitaoka |
120a6e |
double freq = m_freq->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TAffine aff = ri.m_affine.inv();
|
|
Shinya Kitaoka |
120a6e |
TPointD posTrasf = aff * tile.m_pos;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TRaster32P ras32 = tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
doComputeT<tpixel32>(ras32, posTrasf, aff, m_spectrum->getValue(frame),</tpixel32>
|
|
Shinya Kitaoka |
120a6e |
freq, phase);
|
|
Shinya Kitaoka |
120a6e |
else if (TRaster64P ras64 = tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
doComputeT<tpixel64>(ras64, posTrasf, aff, m_spectrum->getValue64(frame),</tpixel64>
|
|
Shinya Kitaoka |
120a6e |
freq, phase);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
throw TException("SpiralFx: unsupported Pixel Type");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class MultiLinearGradientFx final : public TStandardZeraryFx {
|
|
Shinya Kitaoka |
120a6e |
FX_PLUGIN_DECLARATION(MultiLinearGradientFx)
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_period;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_count;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_cycle;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_wave_amplitude;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_wave_freq;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_wave_phase;
|
|
Shinya Kitaoka |
120a6e |
TSpectrumParamP m_colors;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
MultiLinearGradientFx()
|
|
Shinya Kitaoka |
120a6e |
: m_period(100) // args, "Period")
|
|
Shinya Kitaoka |
120a6e |
, m_count(2) // args, "Count")
|
|
Shinya Kitaoka |
120a6e |
, m_cycle(0.0) // args, "Cycle")
|
|
Shinya Kitaoka |
120a6e |
, m_wave_amplitude(0.0) // args, "Cycle")
|
|
Shinya Kitaoka |
120a6e |
, m_wave_freq(0.0) // args, "Cycle")
|
|
Shinya Kitaoka |
120a6e |
, m_wave_phase(0.0) // args, "Cycle")
|
|
Shinya Kitaoka |
120a6e |
// , m_colors (0) //args, "Colors")
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0.33, TPixel32::Yellow),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0.66, TPixel32::Red),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(1, TPixel32::White)};
|
|
Shinya Kitaoka |
120a6e |
m_colors = TSpectrumParamP(tArrayCount(colors), colors);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "period", m_period);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "count", m_count);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "cycle", m_cycle);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "wave_amplitude", m_wave_amplitude);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "wave_frequency", m_wave_freq);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "wave_phase", m_wave_phase);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "colors", m_colors);
|
|
Shinya Kitaoka |
120a6e |
m_period->setValueRange(0, (std::numeric_limits<double>::max)());</double>
|
|
Shinya Kitaoka |
120a6e |
m_cycle->setValueRange(0, (std::numeric_limits<double>::max)());</double>
|
|
Shinya Kitaoka |
120a6e |
m_wave_amplitude->setValueRange(0, (std::numeric_limits<double>::max)());</double>
|
|
Shinya Kitaoka |
120a6e |
m_count->setValueRange(0, (std::numeric_limits<double>::max)());</double>
|
|
Shinya Kitaoka |
120a6e |
m_period->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
m_wave_amplitude->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
~MultiLinearGradientFx(){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
bool doGetBBox(double, TRectD &bBox, const TRenderSettings &info) override {
|
|
Shinya Kitaoka |
120a6e |
bBox = TConsts::infiniteRectD;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
// si potrebbe/dovrebbe fare meglio
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override;
|
|
Shinya Kitaoka |
38fd86 |
bool canHandle(const TRenderSettings &info, double frame) override {
|
|
Shinya Kitaoka |
38fd86 |
return true;
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void getParamUIs(TParamUIConcept *&concepts, int &length) override {
|
|
Shinya Kitaoka |
120a6e |
concepts = new TParamUIConcept[length = 1];
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_type = TParamUIConcept::WIDTH;
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_label = "Size";
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_params.push_back(m_period);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class LinearGradientFx final : public TStandardZeraryFx {
|
|
Shinya Kitaoka |
120a6e |
FX_PLUGIN_DECLARATION(LinearGradientFx)
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_period;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_wave_amplitude;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_wave_freq;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_wave_phase;
|
|
Shinya Kitaoka |
120a6e |
TPixelParamP m_color1;
|
|
Shinya Kitaoka |
120a6e |
TPixelParamP m_color2;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
LinearGradientFx()
|
|
Shinya Kitaoka |
120a6e |
: m_period(100) // args, "Period")
|
|
Shinya Kitaoka |
120a6e |
, m_wave_amplitude(0.0) // args, "Cycle")
|
|
Shinya Kitaoka |
120a6e |
, m_wave_freq(0.0) // args, "Cycle")
|
|
Shinya Kitaoka |
120a6e |
, m_wave_phase(0.0) // args, "Cycle")
|
|
Shinya Kitaoka |
120a6e |
, m_color1(TPixel32::Black)
|
|
Shinya Kitaoka |
120a6e |
, m_color2(TPixel32::White)
|
|
Shinya Kitaoka |
120a6e |
// , m_colors (0) //args, "Colors")
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "period", m_period);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "wave_amplitude", m_wave_amplitude);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "wave_frequency", m_wave_freq);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "wave_phase", m_wave_phase);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "color1", m_color1);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "color2", m_color2);
|
|
Shinya Kitaoka |
120a6e |
m_period->setValueRange(0, std::numeric_limits<double>::max());</double>
|
|
Shinya Kitaoka |
120a6e |
m_wave_amplitude->setValueRange(0, std::numeric_limits<double>::max());</double>
|
|
Shinya Kitaoka |
120a6e |
m_period->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
m_wave_amplitude->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
~LinearGradientFx(){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
bool doGetBBox(double, TRectD &bBox, const TRenderSettings &info) override {
|
|
Shinya Kitaoka |
120a6e |
bBox = TConsts::infiniteRectD;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
// si potrebbe/dovrebbe fare meglio
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override;
|
|
Shinya Kitaoka |
38fd86 |
bool canHandle(const TRenderSettings &info, double frame) override {
|
|
Shinya Kitaoka |
38fd86 |
return true;
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void getParamUIs(TParamUIConcept *&concepts, int &length) override {
|
|
Shinya Kitaoka |
120a6e |
concepts = new TParamUIConcept[length = 1];
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_type = TParamUIConcept::WIDTH;
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_label = "Size";
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_params.push_back(m_period);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
template <class t=""></class>
|
|
Shinya Kitaoka |
120a6e |
void doComputeT(TRasterPT<t> ras, TPointD posTrasf,</t>
|
|
Shinya Kitaoka |
120a6e |
const TSpectrumT<t> &spectrum, double period, double count,</t>
|
|
Shinya Kitaoka |
120a6e |
double w_amplitude, double w_freq, double w_phase, double cycle,
|
|
Shinya Kitaoka |
120a6e |
const TAffine &aff) {
|
|
Shinya Kitaoka |
120a6e |
double shift = 0;
|
|
Shinya Kitaoka |
120a6e |
double maxRadius = period * count / 2.;
|
|
Shinya Kitaoka |
120a6e |
double freq = 1.0 / period;
|
|
Shinya Kitaoka |
120a6e |
int j;
|
|
Shinya Kitaoka |
120a6e |
ras->lock();
|
|
Shinya Kitaoka |
120a6e |
for (j = 0; j < ras->getLy(); j++) {
|
|
Shinya Kitaoka |
120a6e |
TPointD posAux = posTrasf;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// TPointD pos = tile.m_pos;
|
|
Shinya Kitaoka |
120a6e |
// pos.y += j;
|
|
Shinya Kitaoka |
120a6e |
T *pix = ras->pixels(j);
|
|
Shinya Kitaoka |
120a6e |
T *endPix = pix + ras->getLx();
|
|
Shinya Kitaoka |
120a6e |
while (pix < endPix) {
|
|
Shinya Kitaoka |
120a6e |
if (w_amplitude) shift = w_amplitude * sin(w_freq * posAux.y + w_phase);
|
|
Shinya Kitaoka |
120a6e |
double radius = posAux.x + shift;
|
|
Shinya Kitaoka |
120a6e |
double t = 1;
|
|
Shinya Kitaoka |
120a6e |
if (fabs(radius) < maxRadius) {
|
|
Shinya Kitaoka |
120a6e |
t = (radius + maxRadius + cycle) * freq;
|
|
Shinya Kitaoka |
120a6e |
t -= floor(t);
|
|
Shinya Kitaoka |
120a6e |
} else if (radius < 0)
|
|
Shinya Kitaoka |
120a6e |
t = 0;
|
|
Shinya Kitaoka |
120a6e |
double polinomfactor = (-2 * t + 3) * (t * t);
|
|
Shinya Kitaoka |
120a6e |
// pos.x += 1.0;
|
|
Shinya Kitaoka |
120a6e |
*pix++ = spectrum.getPremultipliedValue(polinomfactor);
|
|
Shinya Kitaoka |
120a6e |
posAux.x += aff.a11;
|
|
Shinya Kitaoka |
120a6e |
posAux.y += aff.a21;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
posTrasf.x += aff.a12;
|
|
Shinya Kitaoka |
120a6e |
posTrasf.y += aff.a22;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
ras->unlock();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void LinearGradientFx::doCompute(TTile &tile, double frame,
|
|
Shinya Kitaoka |
120a6e |
const TRenderSettings &ri) {
|
|
Shinya Kitaoka |
120a6e |
assert((TRaster32P)tile.getRaster() || (TRaster64P)tile.getRaster());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double period = m_period->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double count = 1.0;
|
|
Shinya Kitaoka |
120a6e |
double cycle = 0;
|
|
Shinya Kitaoka |
120a6e |
double w_amplitude = m_wave_amplitude->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double w_freq = m_wave_freq->getValue(frame) * ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double w_phase = m_wave_phase->getValue(frame);
|
|
Shinya Kitaoka |
120a6e |
w_freq *= 0.01 * M_PI_180;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey colors[] = {
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0, m_color1->getValue(frame)),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(1, m_color2->getValue(frame))};
|
|
Shinya Kitaoka |
120a6e |
TSpectrumParamP m_colors = TSpectrumParamP(tArrayCount(colors), colors);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TAffine aff = ri.m_affine.inv();
|
|
Shinya Kitaoka |
120a6e |
TPointD posTrasf = aff * tile.m_pos;
|
|
Shinya Kitaoka |
120a6e |
multiLinear(tile.getRaster(), posTrasf, m_colors, period, count, w_amplitude,
|
|
Shinya Kitaoka |
120a6e |
w_freq, w_phase, cycle, aff, frame);
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
if (TRaster32P ras32 = tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
doComputeT<tpixel32>(</tpixel32>
|
|
Shinya Kitaoka |
120a6e |
ras32, posTrasf,
|
|
Shinya Kitaoka |
120a6e |
m_colors->getValue(frame),
|
|
Shinya Kitaoka |
120a6e |
period, count, w_amplitude, w_freq, w_phase, cycle, aff);
|
|
Shinya Kitaoka |
120a6e |
else if (TRaster64P ras64 = tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
doComputeT<tpixel64>(</tpixel64>
|
|
Shinya Kitaoka |
120a6e |
ras64, posTrasf,
|
|
Shinya Kitaoka |
120a6e |
m_colors->getValue64(frame),
|
|
Shinya Kitaoka |
120a6e |
period, count, w_amplitude, w_freq, w_phase, cycle, aff);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
throw TException("MultiLinearGradientFx: unsupported Pixel Type");
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void MultiLinearGradientFx::doCompute(TTile &tile, double frame,
|
|
Shinya Kitaoka |
120a6e |
const TRenderSettings &ri) {
|
|
Shinya Kitaoka |
120a6e |
assert((TRaster32P)tile.getRaster() || (TRaster64P)tile.getRaster());
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double period = m_period->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double count = m_count->getValue(frame);
|
|
Shinya Kitaoka |
120a6e |
double cycle = m_cycle->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double w_amplitude = m_wave_amplitude->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double w_freq = m_wave_freq->getValue(frame) * ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double w_phase = m_wave_phase->getValue(frame);
|
|
Shinya Kitaoka |
120a6e |
w_freq *= 0.01 * M_PI_180;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TAffine aff = ri.m_affine.inv();
|
|
Shinya Kitaoka |
120a6e |
TPointD posTrasf = aff * tile.m_pos;
|
|
Shinya Kitaoka |
120a6e |
multiLinear(tile.getRaster(), posTrasf, m_colors, period, count, w_amplitude,
|
|
Shinya Kitaoka |
120a6e |
w_freq, w_phase, cycle, aff, frame);
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
if (TRaster32P ras32 = tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
doComputeT<tpixel32>(</tpixel32>
|
|
Shinya Kitaoka |
120a6e |
ras32, posTrasf,
|
|
Shinya Kitaoka |
120a6e |
m_colors->getValue(frame),
|
|
Shinya Kitaoka |
120a6e |
period, count, w_amplitude, w_freq, w_phase, cycle, aff);
|
|
Shinya Kitaoka |
120a6e |
else if (TRaster64P ras64 = tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
doComputeT<tpixel64>(</tpixel64>
|
|
Shinya Kitaoka |
120a6e |
ras64, posTrasf,
|
|
Shinya Kitaoka |
120a6e |
m_colors->getValue64(frame),
|
|
Shinya Kitaoka |
120a6e |
period, count, w_amplitude, w_freq, w_phase, cycle, aff);
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
throw TException("MultiLinearGradientFx: unsupported Pixel Type");
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class RadialGradientFx final : public TStandardZeraryFx {
|
|
Shinya Kitaoka |
120a6e |
FX_PLUGIN_DECLARATION(RadialGradientFx)
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_period;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_innerperiod;
|
|
Shinya Kitaoka |
120a6e |
TPixelParamP m_color1;
|
|
Shinya Kitaoka |
120a6e |
TPixelParamP m_color2;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
RadialGradientFx()
|
|
Shinya Kitaoka |
120a6e |
: m_period(100.0)
|
|
Shinya Kitaoka |
120a6e |
, m_innerperiod(0.0) // args, "Period")
|
|
Shinya Kitaoka |
120a6e |
, m_color1(TPixel32::White)
|
|
Shinya Kitaoka |
120a6e |
, m_color2(TPixel32::Transparent)
|
|
Shinya Kitaoka |
120a6e |
// , m_colors (0) //args, "Colors")
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
m_period->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
m_innerperiod->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "period", m_period);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "innerperiod", m_innerperiod);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "color1", m_color1);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "color2", m_color2);
|
|
Shinya Kitaoka |
120a6e |
m_period->setValueRange(0.0, std::numeric_limits<double>::max());</double>
|
|
Shinya Kitaoka |
120a6e |
m_innerperiod->setValueRange(0.0, std::numeric_limits<double>::max());</double>
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
~RadialGradientFx(){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
bool doGetBBox(double, TRectD &bBox, const TRenderSettings &info) override {
|
|
Shinya Kitaoka |
120a6e |
bBox = TConsts::infiniteRectD;
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
// si potrebbe/dovrebbe fare meglio
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override;
|
|
Shinya Kitaoka |
38fd86 |
bool canHandle(const TRenderSettings &info, double frame) override {
|
|
Shinya Kitaoka |
38fd86 |
return true;
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void getParamUIs(TParamUIConcept *&concepts, int &length) override {
|
|
Shinya Kitaoka |
120a6e |
concepts = new TParamUIConcept[length = 2];
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_type = TParamUIConcept::RADIUS;
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_label = "Inner Size";
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_params.push_back(m_innerperiod);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
concepts[1].m_type = TParamUIConcept::RADIUS;
|
|
Shinya Kitaoka |
120a6e |
concepts[1].m_label = "Outer Size";
|
|
Shinya Kitaoka |
120a6e |
concepts[1].m_params.push_back(m_period);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class MultiRadialGradientFx final : public TStandardZeraryFx {
|
|
Shinya Kitaoka |
120a6e |
FX_PLUGIN_DECLARATION(MultiRadialGradientFx)
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_period;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_count;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_cycle;
|
|
Shinya Kitaoka |
120a6e |
TSpectrumParamP m_colors;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
MultiRadialGradientFx()
|
|
Shinya Kitaoka |
120a6e |
: m_period(100) // args, "Period")
|
|
Shinya Kitaoka |
120a6e |
, m_count(2) // args, "Count")
|
|
Shinya Kitaoka |
120a6e |
, m_cycle(0.0) // args, "Count")
|
|
Shinya Kitaoka |
120a6e |
// , m_colors (0) //args, "Colors")
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
m_period->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey colors[] = {TSpectrum::ColorKey(0, TPixel32::White),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0.33, TPixel32::Yellow),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0.66, TPixel32::Red),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(1, TPixel32::White)};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_colors = TSpectrumParamP(tArrayCount(colors), colors);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "period", m_period);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "count", m_count);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "cycle", m_cycle);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "colors", m_colors);
|
|
Shinya Kitaoka |
120a6e |
m_period->setValueRange(0, (std::numeric_limits<double>::max)());</double>
|
|
Shinya Kitaoka |
120a6e |
m_cycle->setValueRange(0, (std::numeric_limits<double>::max)());</double>
|
|
Shinya Kitaoka |
120a6e |
m_count->setValueRange(0, (std::numeric_limits<double>::max)());</double>
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
~MultiRadialGradientFx(){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
bool doGetBBox(double, TRectD &bBox, const TRenderSettings &info) override {
|
|
Shinya Kitaoka |
120a6e |
bBox = TConsts::infiniteRectD;
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
// si potrebbe/dovrebbe fare meglio
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override;
|
|
Shinya Kitaoka |
38fd86 |
bool canHandle(const TRenderSettings &info, double frame) override {
|
|
Shinya Kitaoka |
38fd86 |
return true;
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void getParamUIs(TParamUIConcept *&concepts, int &length) override {
|
|
Shinya Kitaoka |
120a6e |
concepts = new TParamUIConcept[length = 1];
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_type = TParamUIConcept::RADIUS;
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_label = "Period";
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_params.push_back(m_period);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void MultiRadialGradientFx::doCompute(TTile &tile, double frame,
|
|
Shinya Kitaoka |
120a6e |
const TRenderSettings &ri) {
|
|
Shinya Kitaoka |
120a6e |
assert((TRaster32P)tile.getRaster() || (TRaster64P)tile.getRaster());
|
|
Shinya Kitaoka |
120a6e |
double period = m_period->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double count = m_count->getValue(frame);
|
|
Shinya Kitaoka |
120a6e |
double cycle = m_cycle->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TAffine aff = ri.m_affine.inv();
|
|
Shinya Kitaoka |
120a6e |
TPointD posTrasf = aff * tile.m_pos;
|
|
Shinya Kitaoka |
120a6e |
multiRadial(tile.getRaster(), posTrasf, m_colors, period, count, cycle, aff,
|
|
Shinya Kitaoka |
120a6e |
frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void RadialGradientFx::doCompute(TTile &tile, double frame,
|
|
Shinya Kitaoka |
120a6e |
const TRenderSettings &ri) {
|
|
Shinya Kitaoka |
120a6e |
assert((TRaster32P)tile.getRaster() || (TRaster64P)tile.getRaster());
|
|
Shinya Kitaoka |
120a6e |
double period = m_period->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double innerperiod = m_innerperiod->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double count = 1.0;
|
|
Shinya Kitaoka |
120a6e |
double cycle = 0.0;
|
|
Shinya Kitaoka |
120a6e |
double inner = 0.0;
|
|
Shinya Kitaoka |
120a6e |
if (innerperiod < period)
|
|
Shinya Kitaoka |
120a6e |
inner = innerperiod / period;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
inner = 1 - TConsts::epsilon;
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey colors[] = {
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(0, m_color1->getValue(frame)),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(inner, m_color1->getValue(frame)),
|
|
Shinya Kitaoka |
120a6e |
TSpectrum::ColorKey(1, m_color2->getValue(frame))};
|
|
Shinya Kitaoka |
120a6e |
TSpectrumParamP m_colors = TSpectrumParamP(tArrayCount(colors), colors);
|
|
Shinya Kitaoka |
120a6e |
TAffine aff = ri.m_affine.inv();
|
|
Shinya Kitaoka |
120a6e |
TPointD posTrasf = aff * tile.m_pos;
|
|
Shinya Kitaoka |
120a6e |
multiRadial(tile.getRaster(), posTrasf, m_colors, period, count, cycle, aff,
|
|
Shinya Kitaoka |
120a6e |
frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class LightSpotFx final : public TStandardZeraryFx {
|
|
Shinya Kitaoka |
120a6e |
FX_PLUGIN_DECLARATION(LightSpotFx)
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_softness;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_a;
|
|
Shinya Kitaoka |
120a6e |
TDoubleParamP m_b;
|
|
Shinya Kitaoka |
120a6e |
TPixelParamP m_color;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
LightSpotFx()
|
|
Shinya Kitaoka |
120a6e |
: m_softness(0.2) // args, "Softness")
|
|
Shinya Kitaoka |
120a6e |
, m_a(200) // args, "A")
|
|
Shinya Kitaoka |
120a6e |
, m_b(100) // args, "B")
|
|
Shinya Kitaoka |
120a6e |
, m_color(TPixel::Magenta) // args, "Color")
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
m_a->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
m_b->setMeasureName("fxLength");
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "softness", m_softness);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "a", m_a);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "b", m_b);
|
|
Shinya Kitaoka |
120a6e |
bindParam(this, "color", m_color);
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
m_a->setDefaultValue(200);
|
|
Shinya Kitaoka |
120a6e |
m_b->setDefaultValue(100);
|
|
Shinya Kitaoka |
120a6e |
m_color->setDefaultValue(TPixel::Magenta);
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
~LightSpotFx(){};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
bool doGetBBox(double, TRectD &bBox, const TRenderSettings &info) override {
|
|
Shinya Kitaoka |
120a6e |
bBox = TConsts::infiniteRectD;
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
// si potrebbe/dovrebbe fare meglio
|
|
Shinya Kitaoka |
120a6e |
};
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void doCompute(TTile &tile, double frame, const TRenderSettings &ri) override;
|
|
Shinya Kitaoka |
38fd86 |
bool canHandle(const TRenderSettings &info, double frame) override {
|
|
Shinya Kitaoka |
38fd86 |
return true;
|
|
Shinya Kitaoka |
38fd86 |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void getParamUIs(TParamUIConcept *&concepts, int &length) override {
|
|
Shinya Kitaoka |
120a6e |
concepts = new TParamUIConcept[length = 1];
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_type = TParamUIConcept::RECT;
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_params.push_back(m_a);
|
|
Shinya Kitaoka |
120a6e |
concepts[0].m_params.push_back(m_b);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
template <class t=""></class>
|
|
Shinya Kitaoka |
120a6e |
void doComputeT(TRasterPT<t> raster, TPointD posTrasf, const TAffine &aff,</t>
|
|
Shinya Kitaoka |
120a6e |
const T &pixelColor, double softness, double a, double b) {
|
|
Shinya Kitaoka |
120a6e |
double aa = a * a;
|
|
Shinya Kitaoka |
120a6e |
double bb = b * b;
|
|
Shinya Kitaoka |
120a6e |
double invaa = 1 / aa;
|
|
Shinya Kitaoka |
120a6e |
double invbb = 1 / bb;
|
|
Shinya Kitaoka |
120a6e |
double num = 2 * (aa + bb);
|
|
Shinya Kitaoka |
120a6e |
double normax = num / (5 * aa + bb);
|
|
Shinya Kitaoka |
120a6e |
int j;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
raster->lock();
|
|
Shinya Kitaoka |
120a6e |
for (j = 0; j < raster->getLy(); j++) {
|
|
Shinya Kitaoka |
120a6e |
TPointD posAux = posTrasf;
|
|
Shinya Kitaoka |
120a6e |
T *pix = raster->pixels(j);
|
|
Shinya Kitaoka |
120a6e |
T *endPix = pix + raster->getLx();
|
|
Shinya Kitaoka |
120a6e |
while (pix < endPix) {
|
|
Shinya Kitaoka |
120a6e |
double yyrot = (posAux.y) * (posAux.y);
|
|
Shinya Kitaoka |
120a6e |
double yvar = (yyrot)*invbb + 1;
|
|
Shinya Kitaoka |
120a6e |
double result;
|
|
Shinya Kitaoka |
120a6e |
double fact, xrot, tempvar, normtmp, outsideslope;
|
|
Shinya Kitaoka |
120a6e |
// pos.x += 1.0;
|
|
Shinya Kitaoka |
120a6e |
xrot = (posAux.x);
|
|
Shinya Kitaoka |
120a6e |
tempvar = xrot * xrot * invaa + yvar;
|
|
Shinya Kitaoka |
120a6e |
fact = tempvar * 0.5;
|
|
Shinya Kitaoka |
120a6e |
if (fact < 1) {
|
|
Shinya Kitaoka |
120a6e |
normtmp = num / (aa + bb + (xrot - a) * (xrot - a) + yyrot);
|
|
Shinya Kitaoka |
120a6e |
result = normtmp;
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
outsideslope = 1 / (1 + (fact - 1) * softness);
|
|
Shinya Kitaoka |
120a6e |
result = normax * outsideslope;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (result > 1) result = 1;
|
|
Shinya Kitaoka |
120a6e |
if (result < 0) result = 0;
|
|
Shinya Kitaoka |
120a6e |
*pix++ = blend(T::Black, pixelColor, result);
|
|
Shinya Kitaoka |
120a6e |
posAux.x += aff.a11;
|
|
Shinya Kitaoka |
120a6e |
posAux.y += aff.a21;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
posTrasf.x += aff.a12;
|
|
Shinya Kitaoka |
120a6e |
posTrasf.y += aff.a22;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
raster->unlock();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//==================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void LightSpotFx::doCompute(TTile &tile, double frame,
|
|
Shinya Kitaoka |
120a6e |
const TRenderSettings &ri) {
|
|
Shinya Kitaoka |
120a6e |
double a = m_a->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
double b = m_b->getValue(frame) / ri.m_shrinkX;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (a == 0.0 || b == 0.0) {
|
|
Shinya Kitaoka |
120a6e |
if ((TRaster32P)tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
((TRaster32P)tile.getRaster())->fill(TPixel32::Black);
|
|
Shinya Kitaoka |
120a6e |
else if ((TRaster64P)tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
((TRaster64P)tile.getRaster())->fill(TPixel64::Black);
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TAffine aff = ri.m_affine.inv();
|
|
Shinya Kitaoka |
120a6e |
TPointD posTrasf = aff * tile.m_pos;
|
|
Shinya Kitaoka |
120a6e |
const TPixel32 pixelColor = m_color->getValue(frame);
|
|
Shinya Kitaoka |
120a6e |
double softness = m_softness->getValue(frame);
|
|
Shinya Kitaoka |
120a6e |
if ((TRaster32P)tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
doComputeT<tpixel32>(tile.getRaster(), posTrasf, aff, pixelColor, softness,</tpixel32>
|
|
Shinya Kitaoka |
120a6e |
a, b);
|
|
Shinya Kitaoka |
120a6e |
else if ((TRaster64P)tile.getRaster())
|
|
Shinya Kitaoka |
120a6e |
doComputeT<tpixel64>(tile.getRaster(), posTrasf, aff, toPixel64(pixelColor),</tpixel64>
|
|
Shinya Kitaoka |
120a6e |
softness, a, b);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
FX_PLUGIN_IDENTIFIER(SpiralFx, "spiralFx")
|
|
Toshihiro Shimizu |
890ddd |
FX_PLUGIN_IDENTIFIER(FadeFx, "fadeFx")
|
|
Toshihiro Shimizu |
890ddd |
FX_PLUGIN_IDENTIFIER(RadialGradientFx, "radialGradientFx")
|
|
Toshihiro Shimizu |
890ddd |
FX_PLUGIN_IDENTIFIER(MultiRadialGradientFx, "multiRadialGradientFx")
|
|
Toshihiro Shimizu |
890ddd |
FX_PLUGIN_IDENTIFIER(LinearGradientFx, "linearGradientFx")
|
|
Toshihiro Shimizu |
890ddd |
FX_PLUGIN_IDENTIFIER(MultiLinearGradientFx, "multiLinearGradientFx")
|
|
Toshihiro Shimizu |
890ddd |
FX_PLUGIN_IDENTIFIER(LightSpotFx, "lightSpotFx")
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Toshihiro Shimizu |
890ddd |
TLIBMAIN {
|
|
Toshihiro Shimizu |
890ddd |
static TPluginInfo info("stdfx");
|
|
Toshihiro Shimizu |
890ddd |
return &info;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
DV_EXPORT_API void initStdFx() {}
|