1 
2 
3 #include "texception.h"
4 #include "tfxparam.h"
5 #include "trop.h"
6 #include "stdfx.h"
7 #include "trasterfx.h"
8 #include "tparamset.h"
9 #include "tparamuiconcept.h"
10 
11 //-------------------------------------------------------------------
12 
13 class BaseRaylitFx : public TStandardRasterFx {
14 protected:
15   TRasterFxPort m_input;
16   TPointParamP m_p;
17   TDoubleParamP m_z;
18   TDoubleParamP m_intensity;
19   TDoubleParamP m_decay;
20   TDoubleParamP m_smoothness;
21   TBoolParamP m_includeInput;
22 
23 public:
BaseRaylitFx()24   BaseRaylitFx()
25       : m_p(TPointD(0, 0))
26       , m_z(300.0)
27       , m_intensity(60)
28       , m_decay(1.0)
29       , m_smoothness(100)
30       , m_includeInput(false) {
31     m_p->getX()->setMeasureName("fxLength");
32     m_p->getY()->setMeasureName("fxLength");
33 
34     bindParam(this, "p", m_p);
35     bindParam(this, "z", m_z);
36     bindParam(this, "intensity", m_intensity);
37     bindParam(this, "decay", m_decay);
38     bindParam(this, "smoothness", m_smoothness);
39     bindParam(this, "includeInput", m_includeInput);
40 
41     addInputPort("Source", m_input);
42   }
43 
~BaseRaylitFx()44   ~BaseRaylitFx() {}
45 
46   bool doGetBBox(double frame, TRectD &bBox,
47                  const TRenderSettings &info) override;
48 
canHandle(const TRenderSettings & info,double frame)49   bool canHandle(const TRenderSettings &info, double frame) override {
50     return false;
51   }
52   int getMemoryRequirement(const TRectD &rect, double frame,
53                            const TRenderSettings &info) override;
54 
55   void doDryCompute(TRectD &rect, double frame,
56                     const TRenderSettings &info) override;
57 
getParamUIs(TParamUIConcept * & concepts,int & length)58   void getParamUIs(TParamUIConcept *&concepts, int &length) override {
59     concepts = new TParamUIConcept[length = 1];
60 
61     concepts[0].m_type  = TParamUIConcept::POINT;
62     concepts[0].m_label = "Center";
63     concepts[0].m_params.push_back(m_p);
64   }
65 };
66 
67 //-------------------------------------------------------------------
68 
doGetBBox(double frame,TRectD & bBox,const TRenderSettings & info)69 bool BaseRaylitFx::doGetBBox(double frame, TRectD &bBox,
70                              const TRenderSettings &info) {
71   if (m_input.isConnected()) {
72     bool ret      = m_input->doGetBBox(frame, bBox, info);
73     if (ret) bBox = TConsts::infiniteRectD;
74     return ret;
75   } else {
76     bBox = TRectD();
77     return false;
78   }
79 };
80 
81 //-------------------------------------------------------------------
82 
doDryCompute(TRectD & rect,double frame,const TRenderSettings & ri)83 void BaseRaylitFx::doDryCompute(TRectD &rect, double frame,
84                                 const TRenderSettings &ri) {
85   if (!m_input.isConnected()) return;
86 
87   TRectD bboxIn;
88   m_input->getBBox(frame, bboxIn, ri);
89   if (bboxIn == TConsts::infiniteRectD) bboxIn = rect;
90 
91   TDimension sizeIn(std::max(tceil(bboxIn.getLx()), 1),
92                     std::max(tceil(bboxIn.getLy()), 1));
93   bboxIn = TRectD(bboxIn.getP00(), TDimensionD(sizeIn.lx, sizeIn.ly));
94   m_input->dryCompute(bboxIn, frame, ri);
95 }
96 
97 //---------------------------------------------------------------------------
98 
getMemoryRequirement(const TRectD & rect,double frame,const TRenderSettings & info)99 int BaseRaylitFx::getMemoryRequirement(const TRectD &rect, double frame,
100                                        const TRenderSettings &info) {
101   TRectD bboxIn;
102   m_input->getBBox(frame, bboxIn, info);
103   if (bboxIn == TConsts::infiniteRectD) return -1;
104 
105   if (bboxIn.isEmpty()) return 0;
106 
107   return TRasterFx::memorySize(bboxIn, info.m_bpp);
108 }
109 
110 //========================================================================================
111 
112 class RaylitFx final : public BaseRaylitFx {
113   FX_PLUGIN_DECLARATION(RaylitFx)
114 
115 protected:
116   TPixelParamP m_color;
117   TBoolParamP m_invert;
118 
119 public:
RaylitFx()120   RaylitFx() : m_color(TPixel(255, 80, 0)), m_invert(false) {
121     bindParam(this, "color", m_color);
122     bindParam(this, "invert", m_invert);
123   }
124 
125   void doCompute(TTile &tile, double frame, const TRenderSettings &) override;
126 };
127 
128 FX_PLUGIN_IDENTIFIER(RaylitFx, "raylitFx")
129 
130 //-------------------------------------------------------------------
131 
doCompute(TTile & tileOut,double frame,const TRenderSettings & ri)132 void RaylitFx::doCompute(TTile &tileOut, double frame,
133                          const TRenderSettings &ri) {
134   if (!m_input.isConnected()) return;
135 
136   double scale = sqrt(fabs(ri.m_affine.det()));
137   int shrink   = (ri.m_shrinkX + ri.m_shrinkY) / 2;
138 
139   TPointD p(ri.m_affine * m_p->getValue(frame));
140 
141   TRectD rectIn(tileOut.m_pos, TDimensionD(tileOut.getRaster()->getLx(),
142                                            tileOut.getRaster()->getLy()));
143   TRectD bboxIn;
144   m_input->getBBox(frame, bboxIn, ri);
145   if (bboxIn == TConsts::infiniteRectD) bboxIn = rectIn;
146 
147   if (!bboxIn.isEmpty()) {
148     TPoint posIn, posOut;
149 
150     TTile tileIn;
151     TDimension sizeIn(std::max(tceil(bboxIn.getLx()), 1),
152                       std::max(tceil(bboxIn.getLy()), 1));
153     m_input->allocateAndCompute(tileIn, bboxIn.getP00(), sizeIn,
154                                 tileOut.getRaster(), frame, ri);
155 
156     TRop::RaylitParams params;
157 
158     params.m_scale = scale;
159 
160     params.m_lightOriginSrc.x = params.m_lightOriginDst.x = p.x;
161     params.m_lightOriginSrc.y = params.m_lightOriginDst.y = p.y;
162     params.m_lightOriginSrc.z = params.m_lightOriginDst.z =
163         (int)m_z->getValue(frame);
164     params.m_color        = m_color->getValue(frame);
165     params.m_intensity    = m_intensity->getValue(frame);
166     params.m_decay        = m_decay->getValue(frame);
167     params.m_smoothness   = m_smoothness->getValue(frame);
168     params.m_invert       = m_invert->getValue();
169     params.m_includeInput = m_includeInput->getValue();
170     params.m_lightOriginSrc.x -= (int)tileIn.m_pos.x;
171     params.m_lightOriginSrc.y -= (int)tileIn.m_pos.y;
172     params.m_lightOriginDst.x -= (int)tileOut.m_pos.x;
173     params.m_lightOriginDst.y -= (int)tileOut.m_pos.y;
174 
175     TRop::raylit(tileOut.getRaster(), tileIn.getRaster(), params);
176   }
177 }
178 
179 //========================================================================================
180 
181 class ColorRaylitFx final : public BaseRaylitFx {
182   FX_PLUGIN_DECLARATION(ColorRaylitFx)
183 
184 public:
ColorRaylitFx()185   ColorRaylitFx() : BaseRaylitFx() {}
186 
187   void doCompute(TTile &tile, double frame, const TRenderSettings &) override;
188 };
189 
190 //-------------------------------------------------------------------
191 
doCompute(TTile & tileOut,double frame,const TRenderSettings & ri)192 void ColorRaylitFx::doCompute(TTile &tileOut, double frame,
193                               const TRenderSettings &ri) {
194   if (!m_input.isConnected()) return;
195 
196   double scale = sqrt(fabs(ri.m_affine.det()));
197   int shrink   = (ri.m_shrinkX + ri.m_shrinkY) / 2;
198 
199   TPointD p(ri.m_affine * m_p->getValue(frame));
200 
201   TRectD rectIn(tileOut.m_pos, TDimensionD(tileOut.getRaster()->getLx(),
202                                            tileOut.getRaster()->getLy()));
203   TRectD bboxIn;
204   m_input->getBBox(frame, bboxIn, ri);
205   if (bboxIn == TConsts::infiniteRectD) bboxIn = rectIn;
206 
207   if (!bboxIn.isEmpty()) {
208     TPoint posIn, posOut;
209 
210     TTile tileIn;
211     TDimension sizeIn(std::max(tceil(bboxIn.getLx()), 1),
212                       std::max(tceil(bboxIn.getLy()), 1));
213     m_input->allocateAndCompute(tileIn, bboxIn.getP00(), sizeIn,
214                                 tileOut.getRaster(), frame, ri);
215 
216     TRop::RaylitParams params;
217 
218     params.m_scale = scale;
219 
220     params.m_lightOriginSrc.x = params.m_lightOriginDst.x = p.x;
221     params.m_lightOriginSrc.y = params.m_lightOriginDst.y = p.y;
222     params.m_lightOriginSrc.z = params.m_lightOriginDst.z =
223         (int)m_z->getValue(frame);
224     params.m_intensity    = m_intensity->getValue(frame);
225     params.m_decay        = m_decay->getValue(frame);
226     params.m_smoothness   = m_smoothness->getValue(frame);
227     params.m_includeInput = m_includeInput->getValue();
228     params.m_lightOriginSrc.x -= (int)tileIn.m_pos.x;
229     params.m_lightOriginSrc.y -= (int)tileIn.m_pos.y;
230     params.m_lightOriginDst.x -= (int)tileOut.m_pos.x;
231     params.m_lightOriginDst.y -= (int)tileOut.m_pos.y;
232 
233     TRop::glassRaylit(tileOut.getRaster(), tileIn.getRaster(), params);
234   }
235 }
236 
237 FX_PLUGIN_IDENTIFIER(ColorRaylitFx, "colorRaylitFx")
238