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