| |
| |
| #include "texception.h" |
| #include "tfxparam.h" |
| #include "trop.h" |
| #include "stdfx.h" |
| #include "trasterfx.h" |
| #include "tparamset.h" |
| #include "tparamuiconcept.h" |
| |
| |
| |
| class BaseRaylitFx : public TStandardRasterFx { |
| protected: |
| TRasterFxPort m_input; |
| TPointParamP m_p; |
| TDoubleParamP m_z; |
| TDoubleParamP m_intensity; |
| TDoubleParamP m_decay; |
| TDoubleParamP m_smoothness; |
| TBoolParamP m_includeInput; |
| |
| public: |
| BaseRaylitFx() |
| : m_p(TPointD(0, 0)) |
| , m_z(300.0) |
| , m_intensity(60) |
| , m_decay(1.0) |
| , m_smoothness(100) |
| , m_includeInput(false) { |
| m_p->getX()->setMeasureName("fxLength"); |
| m_p->getY()->setMeasureName("fxLength"); |
| |
| bindParam(this, "p", m_p); |
| bindParam(this, "z", m_z); |
| bindParam(this, "intensity", m_intensity); |
| bindParam(this, "decay", m_decay); |
| bindParam(this, "smoothness", m_smoothness); |
| bindParam(this, "includeInput", m_includeInput); |
| |
| addInputPort("Source", m_input); |
| } |
| |
| ~BaseRaylitFx() {} |
| |
| bool doGetBBox(double frame, TRectD &bBox, |
| const TRenderSettings &info) override; |
| |
| bool canHandle(const TRenderSettings &info, double frame) override { |
| return false; |
| } |
| int getMemoryRequirement(const TRectD &rect, double frame, |
| const TRenderSettings &info) override; |
| |
| void doDryCompute(TRectD &rect, double frame, |
| const TRenderSettings &info) override; |
| |
| void getParamUIs(TParamUIConcept *&concepts, int &length) override { |
| concepts = new TParamUIConcept[length = 1]; |
| |
| concepts[0].m_type = TParamUIConcept::POINT; |
| concepts[0].m_label = "Center"; |
| concepts[0].m_params.push_back(m_p); |
| } |
| }; |
| |
| |
| |
| bool BaseRaylitFx::doGetBBox(double frame, TRectD &bBox, |
| const TRenderSettings &info) { |
| if (m_input.isConnected()) { |
| bool ret = m_input->doGetBBox(frame, bBox, info); |
| if (ret) bBox = TConsts::infiniteRectD; |
| return ret; |
| } else { |
| bBox = TRectD(); |
| return false; |
| } |
| }; |
| |
| |
| |
| void BaseRaylitFx::doDryCompute(TRectD &rect, double frame, |
| const TRenderSettings &ri) { |
| if (!m_input.isConnected()) return; |
| |
| TRectD bboxIn; |
| m_input->getBBox(frame, bboxIn, ri); |
| if (bboxIn == TConsts::infiniteRectD) bboxIn = rect; |
| |
| TDimension sizeIn(std::max(tceil(bboxIn.getLx()), 1), |
| std::max(tceil(bboxIn.getLy()), 1)); |
| bboxIn = TRectD(bboxIn.getP00(), TDimensionD(sizeIn.lx, sizeIn.ly)); |
| m_input->dryCompute(bboxIn, frame, ri); |
| } |
| |
| |
| |
| int BaseRaylitFx::getMemoryRequirement(const TRectD &rect, double frame, |
| const TRenderSettings &info) { |
| TRectD bboxIn; |
| m_input->getBBox(frame, bboxIn, info); |
| if (bboxIn == TConsts::infiniteRectD) return -1; |
| |
| if (bboxIn.isEmpty()) return 0; |
| |
| return TRasterFx::memorySize(bboxIn, info.m_bpp); |
| } |
| |
| |
| |
| class RaylitFx final : public BaseRaylitFx { |
| FX_PLUGIN_DECLARATION(RaylitFx) |
| |
| protected: |
| TPixelParamP m_color; |
| TBoolParamP m_invert; |
| |
| public: |
| RaylitFx() : m_color(TPixel(255, 80, 0)), m_invert(false) { |
| bindParam(this, "color", m_color); |
| bindParam(this, "invert", m_invert); |
| } |
| |
| void doCompute(TTile &tile, double frame, const TRenderSettings &) override; |
| }; |
| |
| FX_PLUGIN_IDENTIFIER(RaylitFx, "raylitFx") |
| |
| |
| |
| void RaylitFx::doCompute(TTile &tileOut, double frame, |
| const TRenderSettings &ri) { |
| if (!m_input.isConnected()) return; |
| |
| double scale = sqrt(fabs(ri.m_affine.det())); |
| int shrink = (ri.m_shrinkX + ri.m_shrinkY) / 2; |
| |
| TPointD p(ri.m_affine * m_p->getValue(frame)); |
| |
| TRectD rectIn(tileOut.m_pos, TDimensionD(tileOut.getRaster()->getLx(), |
| tileOut.getRaster()->getLy())); |
| TRectD bboxIn; |
| m_input->getBBox(frame, bboxIn, ri); |
| if (bboxIn == TConsts::infiniteRectD) bboxIn = rectIn; |
| |
| if (!bboxIn.isEmpty()) { |
| TPoint posIn, posOut; |
| |
| TTile tileIn; |
| TDimension sizeIn(std::max(tceil(bboxIn.getLx()), 1), |
| std::max(tceil(bboxIn.getLy()), 1)); |
| m_input->allocateAndCompute(tileIn, bboxIn.getP00(), sizeIn, |
| tileOut.getRaster(), frame, ri); |
| |
| TRop::RaylitParams params; |
| |
| params.m_scale = scale; |
| |
| params.m_lightOriginSrc.x = params.m_lightOriginDst.x = p.x; |
| params.m_lightOriginSrc.y = params.m_lightOriginDst.y = p.y; |
| params.m_lightOriginSrc.z = params.m_lightOriginDst.z = |
| (int)m_z->getValue(frame); |
| params.m_color = m_color->getValue(frame); |
| params.m_intensity = m_intensity->getValue(frame); |
| params.m_decay = m_decay->getValue(frame); |
| params.m_smoothness = m_smoothness->getValue(frame); |
| params.m_invert = m_invert->getValue(); |
| params.m_includeInput = m_includeInput->getValue(); |
| params.m_lightOriginSrc.x -= (int)tileIn.m_pos.x; |
| params.m_lightOriginSrc.y -= (int)tileIn.m_pos.y; |
| params.m_lightOriginDst.x -= (int)tileOut.m_pos.x; |
| params.m_lightOriginDst.y -= (int)tileOut.m_pos.y; |
| |
| TRop::raylit(tileOut.getRaster(), tileIn.getRaster(), params); |
| } |
| } |
| |
| |
| |
| class ColorRaylitFx final : public BaseRaylitFx { |
| FX_PLUGIN_DECLARATION(ColorRaylitFx) |
| |
| public: |
| ColorRaylitFx() : BaseRaylitFx() {} |
| |
| void doCompute(TTile &tile, double frame, const TRenderSettings &) override; |
| }; |
| |
| |
| |
| void ColorRaylitFx::doCompute(TTile &tileOut, double frame, |
| const TRenderSettings &ri) { |
| if (!m_input.isConnected()) return; |
| |
| double scale = sqrt(fabs(ri.m_affine.det())); |
| int shrink = (ri.m_shrinkX + ri.m_shrinkY) / 2; |
| |
| TPointD p(ri.m_affine * m_p->getValue(frame)); |
| |
| TRectD rectIn(tileOut.m_pos, TDimensionD(tileOut.getRaster()->getLx(), |
| tileOut.getRaster()->getLy())); |
| TRectD bboxIn; |
| m_input->getBBox(frame, bboxIn, ri); |
| if (bboxIn == TConsts::infiniteRectD) bboxIn = rectIn; |
| |
| if (!bboxIn.isEmpty()) { |
| TPoint posIn, posOut; |
| |
| TTile tileIn; |
| TDimension sizeIn(std::max(tceil(bboxIn.getLx()), 1), |
| std::max(tceil(bboxIn.getLy()), 1)); |
| m_input->allocateAndCompute(tileIn, bboxIn.getP00(), sizeIn, |
| tileOut.getRaster(), frame, ri); |
| |
| TRop::RaylitParams params; |
| |
| params.m_scale = scale; |
| |
| params.m_lightOriginSrc.x = params.m_lightOriginDst.x = p.x; |
| params.m_lightOriginSrc.y = params.m_lightOriginDst.y = p.y; |
| params.m_lightOriginSrc.z = params.m_lightOriginDst.z = |
| (int)m_z->getValue(frame); |
| params.m_intensity = m_intensity->getValue(frame); |
| params.m_decay = m_decay->getValue(frame); |
| params.m_smoothness = m_smoothness->getValue(frame); |
| params.m_includeInput = m_includeInput->getValue(); |
| params.m_lightOriginSrc.x -= (int)tileIn.m_pos.x; |
| params.m_lightOriginSrc.y -= (int)tileIn.m_pos.y; |
| params.m_lightOriginDst.x -= (int)tileOut.m_pos.x; |
| params.m_lightOriginDst.y -= (int)tileOut.m_pos.y; |
| |
| TRop::glassRaylit(tileOut.getRaster(), tileIn.getRaster(), params); |
| } |
| } |
| |
| FX_PLUGIN_IDENTIFIER(ColorRaylitFx, "colorRaylitFx") |
| |