100 lines
2.8 KiB
C++
100 lines
2.8 KiB
C++
|
|
||
|
|
||
|
#include "texception.h"
|
||
|
#include "tfxparam.h"
|
||
|
#include "stdfx.h"
|
||
|
#include "tpixelutils.h"
|
||
|
#include "tparamset.h"
|
||
|
|
||
|
//===================================================================
|
||
|
|
||
|
class RGBMFadeFx : public TStandardRasterFx
|
||
|
{
|
||
|
FX_PLUGIN_DECLARATION(RGBMFadeFx)
|
||
|
TRasterFxPort m_input;
|
||
|
TPixelParamP m_color;
|
||
|
TDoubleParamP m_intensity;
|
||
|
|
||
|
public:
|
||
|
RGBMFadeFx()
|
||
|
: m_intensity(50.0), m_color(TPixel32::Black)
|
||
|
{
|
||
|
bindParam(this, "color", m_color);
|
||
|
bindParam(this, "intensity", m_intensity);
|
||
|
m_intensity->setValueRange(0, 100);
|
||
|
addInputPort("Source", m_input);
|
||
|
m_color->enableMatte(false);
|
||
|
}
|
||
|
~RGBMFadeFx(){};
|
||
|
|
||
|
bool doGetBBox(double frame, TRectD &bBox, const TRenderSettings &info)
|
||
|
{
|
||
|
if (m_input.isConnected())
|
||
|
return m_input->doGetBBox(frame, bBox, info);
|
||
|
else {
|
||
|
bBox = TRectD();
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void doCompute(TTile &tile, double frame, const TRenderSettings &ri);
|
||
|
bool canHandle(const TRenderSettings &info, double frame) { return true; }
|
||
|
};
|
||
|
|
||
|
template <typename PIXEL>
|
||
|
void doRGBMFade(TRasterPT<PIXEL> &ras, const PIXEL &col, double intensity)
|
||
|
{
|
||
|
int j;
|
||
|
ras->lock();
|
||
|
for (j = 0; j < ras->getLy(); j++) {
|
||
|
PIXEL *pix = ras->pixels(j);
|
||
|
PIXEL *endPix = pix + ras->getLx();
|
||
|
while (pix < endPix) {
|
||
|
pix->m = pix->m;
|
||
|
double factor = pix->m / (double)PIXEL::maxChannelValue;
|
||
|
int val;
|
||
|
val = troundp(pix->r + intensity * (col.r * factor - pix->r));
|
||
|
pix->r = (val > PIXEL::maxChannelValue) ? PIXEL::maxChannelValue : val;
|
||
|
val = troundp(pix->g + intensity * (col.g * factor - pix->g));
|
||
|
pix->g = (val > PIXEL::maxChannelValue) ? PIXEL::maxChannelValue : val;
|
||
|
val = troundp(pix->b + intensity * (col.b * factor - pix->b));
|
||
|
pix->b = (val > PIXEL::maxChannelValue) ? PIXEL::maxChannelValue : val;
|
||
|
/* qui si faceva il fade anche del matte
|
||
|
pix->r=(UCHAR)(pix->r+intensity*(col.r-pix->r));
|
||
|
pix->g=(UCHAR)(pix->g+intensity*(col.g-pix->g));
|
||
|
pix->b=(UCHAR)(pix->b+intensity*(col.b-pix->b));
|
||
|
pix->m=(UCHAR)(pix->m+intensity*(col.m-pix->m));*/
|
||
|
++pix;
|
||
|
}
|
||
|
}
|
||
|
ras->unlock();
|
||
|
}
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
void RGBMFadeFx::doCompute(TTile &tile, double frame,
|
||
|
const TRenderSettings &ri)
|
||
|
{
|
||
|
if (!m_input.isConnected())
|
||
|
return;
|
||
|
m_input->compute(tile, frame, ri);
|
||
|
|
||
|
TPixel32 col = m_color->getValue(frame);
|
||
|
double min, max, step;
|
||
|
m_intensity->getValueRange(min, max, step);
|
||
|
double intensity = tcrop(m_intensity->getValue(frame), min, max) / 100;
|
||
|
|
||
|
TRaster32P raster32 = tile.getRaster();
|
||
|
|
||
|
if (raster32)
|
||
|
doRGBMFade<TPixel32>(raster32, col, intensity);
|
||
|
else {
|
||
|
TRaster64P raster64 = tile.getRaster();
|
||
|
if (raster64)
|
||
|
doRGBMFade<TPixel64>(raster64, toPixel64(col), intensity);
|
||
|
else
|
||
|
throw TException("RGBMFadeFx: unsupported Pixel Type");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
FX_PLUGIN_IDENTIFIER(RGBMFadeFx, "rgbmFadeFx");
|