38 using namespace HDK_Sample;
49 : mySamplesPerPixelX(1)
50 , mySamplesPerPixelY(1)
51 , myUseColourGradient(true)
52 , myUseZGradient(true)
54 , myColourGradientThreshold(0.1
f)
55 , myZGradientThreshold(0.005
f)
56 , myColourGradientWidth(3.0
f)
57 , myZGradientWidth(3.0
f)
89 myColourGradientThreshold = args.
fargp(
'c');
90 myUseColourGradient = (myColourGradientThreshold >= 0);
91 if (myUseColourGradient && args.
found(
'w'))
93 myColourGradientWidth = args.
fargp(
'w');
94 if (myColourGradientWidth < 0)
95 myUseColourGradient =
false;
99 myColourGradientWidth =
SYSclamp(myColourGradientWidth, 1.0
f, 1024.0
f);
104 myOpIDWidth = args.
fargp(
'o');
105 myUseOpID = (myOpIDWidth >= 0);
106 myOpIDWidth =
SYSclamp(myOpIDWidth, 1.0
f, 1024.0
f);
110 myZGradientThreshold = args.
fargp(
'z');
111 myUseZGradient = (myZGradientThreshold >= 0);
112 if (myUseZGradient && args.
found(
's'))
114 myZGradientWidth = args.
fargp(
's');
115 if (myZGradientWidth < 0)
116 myUseZGradient =
false;
120 myZGradientWidth =
SYSclamp(myZGradientWidth, 1.0
f, 1024.0
f);
130 float filterwidth =
SYSmax(myUseColourGradient ? myColourGradientWidth : 1,
131 myUseZGradient ? myZGradientWidth : 1,
132 myUseOpID ? myOpIDWidth : 1);
147 float RAYcomputeSumX2(
int samplesperpixel,
float width,
int &halfsamplewidth)
150 if (samplesperpixel & 1)
157 for (
int i = -halfsamplewidth; i <= halfsamplewidth; ++i)
165 halfsamplewidth = (
int)
SYSfloor(
float(samplesperpixel)*0.5f*width + 0.5f);
169 for (
int i = -halfsamplewidth; i < halfsamplewidth; ++i)
171 float x = (
float(i)+0.5f)/
float(samplesperpixel);
182 mySamplesPerPixelX = samplesperpixelx;
183 mySamplesPerPixelY = samplesperpixely;
186 myColourSumX2 = RAYcomputeSumX2(mySamplesPerPixelX, myColourGradientWidth, myColourSamplesHalfX);
187 myColourSumY2 = RAYcomputeSumX2(mySamplesPerPixelY, myColourGradientWidth, myColourSamplesHalfY);
188 myZSumX2 = RAYcomputeSumX2(mySamplesPerPixelX, myZGradientWidth, myZSamplesHalfX);
189 myZSumY2 = RAYcomputeSumX2(mySamplesPerPixelY, myZGradientWidth, myZSamplesHalfY);
190 myOpIDSamplesHalfX = (
int)
SYSfloor(
float(mySamplesPerPixelX)*0.5f*myOpIDWidth + ((mySamplesPerPixelX & 1) ? 0.0
f : 0.5
f));
191 myOpIDSamplesHalfY = (
int)
SYSfloor(
float(mySamplesPerPixelY)*0.5f*myOpIDWidth + ((mySamplesPerPixelY & 1) ? 0.0f : 0.5f));
198 const RAY_SampleBuffer &
source,
204 int destxoffsetinsource,
205 int destyoffsetinsource,
206 const RAY_Imager &imager)
const
208 const float *
const colourdata = myUseColourGradient
211 const float *
const zdata = myUseZGradient
214 const float *
const opiddata = myUseOpID
218 UT_ASSERT(myUseColourGradient == (colourdata != NULL));
219 UT_ASSERT(myUseZGradient == (zdata != NULL));
220 UT_ASSERT(myUseOpID == (opiddata != NULL));
226 for (
int desty = 0; desty < destheight; ++desty)
228 for (
int destx = 0; destx < destwidth; ++destx)
233 const int sourcefirstx = destxoffsetinsource + destx*mySamplesPerPixelX;
234 const int sourcefirsty = destyoffsetinsource + desty*mySamplesPerPixelY;
235 const int sourcelastx = sourcefirstx + mySamplesPerPixelX-1;
236 const int sourcelasty = sourcefirsty + mySamplesPerPixelY-1;
238 const int sourcefirstcx = sourcefirstx + (mySamplesPerPixelX>>1) - myColourSamplesHalfX;
239 const int sourcefirstcy = sourcefirsty + (mySamplesPerPixelY>>1) - myColourSamplesHalfY;
240 const int sourcefirstzx = sourcefirstx + (mySamplesPerPixelX>>1) - myZSamplesHalfX;
241 const int sourcefirstzy = sourcefirsty + (mySamplesPerPixelY>>1) - myZSamplesHalfY;
242 const int sourcefirstox = sourcefirstx + (mySamplesPerPixelX>>1) - myOpIDSamplesHalfX;
243 const int sourcefirstoy = sourcefirsty + (mySamplesPerPixelY>>1) - myOpIDSamplesHalfY;
245 const int sourcelastcx = sourcefirstx + ((mySamplesPerPixelX-1)>>1) + myColourSamplesHalfX;
246 const int sourcelastcy = sourcefirsty + ((mySamplesPerPixelY-1)>>1) + myColourSamplesHalfY;
247 const int sourcelastzx = sourcefirstx + ((mySamplesPerPixelX-1)>>1) + myZSamplesHalfX;
248 const int sourcelastzy = sourcefirsty + ((mySamplesPerPixelY-1)>>1) + myZSamplesHalfY;
249 const int sourcelastox = sourcefirstx + ((mySamplesPerPixelX-1)>>1) + myOpIDSamplesHalfX;
250 const int sourcelastoy = sourcefirsty + ((mySamplesPerPixelY-1)>>1) + myOpIDSamplesHalfY;
252 int sourcefirstrx = sourcefirstx;
253 int sourcefirstry = sourcefirsty;
254 int sourcelastrx = sourcelastx;
255 int sourcelastry = sourcelasty;
256 if (myUseColourGradient)
258 sourcefirstrx =
SYSmin(sourcefirstrx, sourcefirstcx);
259 sourcefirstry =
SYSmin(sourcefirstry, sourcefirstcy);
260 sourcelastrx =
SYSmax(sourcelastrx, sourcelastcx);
261 sourcelastry =
SYSmax(sourcelastry, sourcelastcy);
265 sourcefirstrx =
SYSmin(sourcefirstrx, sourcefirstzx);
266 sourcefirstry =
SYSmin(sourcefirstry, sourcefirstzy);
267 sourcelastrx =
SYSmax(sourcelastrx, sourcelastzx);
268 sourcelastry =
SYSmax(sourcelastry, sourcelastzy);
272 sourcefirstrx =
SYSmin(sourcefirstrx, sourcefirstox);
273 sourcefirstry =
SYSmin(sourcefirstry, sourcefirstoy);
274 sourcelastrx =
SYSmax(sourcelastrx, sourcelastox);
275 sourcelastry =
SYSmax(sourcelastry, sourcelastoy);
279 bool opidset =
false;
284 if (myUseColourGradient)
286 for (
int i = 0; i < vectorsize; ++i)
287 colourgradientx[i] = 0;
288 for (
int i = 0; i < vectorsize; ++i)
289 colourgradienty[i] = 0;
293 float zgradientx = 0;
294 float zgradienty = 0;
296 bool hasfarz =
false;
297 bool hasnonfarz =
false;
299 for (
int sourcey = sourcefirstry; sourcey <= sourcelastry && !isedge; ++sourcey)
301 for (
int sourcex = sourcefirstrx; sourcex <= sourcelastrx; ++sourcex)
303 int sourcei = sourcex + sourcewidth*sourcey;
305 if (myUseOpID && sourcex >= sourcefirstox && sourcex <= sourcelastox && sourcey >= sourcefirstoy && sourcey <= sourcelastoy)
310 opid = opiddata[sourcei];
313 else if (opid != opiddata[sourcei])
320 if (myUseColourGradient || myUseZGradient)
323 float x = (
float(sourcex) - 0.5f*
float(sourcelastx + sourcefirstx))/
float(mySamplesPerPixelX);
324 float y = (
float(sourcey) - 0.5f*
float(sourcelasty + sourcefirsty))/
float(mySamplesPerPixelY);
326 if (myUseColourGradient && sourcex >= sourcefirstcx && sourcex <= sourcelastcx && sourcey >= sourcefirstcy && sourcey <= sourcelastcy)
328 for (
int i = 0; i < vectorsize; ++i)
329 colourgradientx[i] += x*colourdata[vectorsize*sourcei + i];
330 for (
int i = 0; i < vectorsize; ++i)
331 colourgradienty[i] += y*colourdata[vectorsize*sourcei + i];
333 if (myUseZGradient && sourcex >= sourcefirstzx && sourcex <= sourcelastzx && sourcey >= sourcefirstzy && sourcey <= sourcelastzy)
337 bool farz = (zdata[sourcei] >= 1.0e37);
340 if (hasfarz && hasnonfarz)
347 zgradientx += x*zdata[sourcei];
348 zgradienty += y*zdata[sourcei];
349 zaverage += zdata[sourcei];
358 if (myUseColourGradient)
360 int nx = sourcelastcx-sourcefirstcx+1;
361 int ny = sourcelastcy-sourcefirstcy+1;
362 for (
int i = 0; i < vectorsize; ++i)
363 colourgradientx[i] /= (ny*myColourSumX2);
365 for (
int i = 0; i < vectorsize; ++i)
366 mag2x += colourgradientx[i]*colourgradientx[i];
368 for (
int i = 0; i < vectorsize; ++i)
369 colourgradienty[i] /= (nx*myColourSumY2);
371 for (
int i = 0; i < vectorsize; ++i)
372 mag2y += colourgradienty[i]*colourgradienty[i];
374 if ((mag2x + mag2y) >= myColourGradientThreshold*myColourGradientThreshold)
377 if (!isedge && myUseZGradient && hasnonfarz)
379 int nx = sourcelastzx-sourcefirstzx+1;
380 int ny = sourcelastzy-sourcefirstzy+1;
382 zgradientx /= (ny*myZSumX2*zaverage);
383 zgradienty /= (nx*myZSumY2*zaverage);
384 float mag2x = zgradientx*zgradientx;
385 float mag2y = zgradienty*zgradienty;
387 if ((mag2x + mag2y) >= myZGradientThreshold*myZGradientThreshold)
392 float value = isedge ? 1.0f : 0.0f;
393 for (
int i = 0; i < vectorsize; ++i, ++destination)
394 *destination = value;
typedef int(APIENTRYP RE_PFNGLXSWAPINTERVALSGIPROC)(int)
RAY_PixelFilter * clone() const override
void stripOptions(const char *options)
void prepFilter(int samplesperpixelx, int samplesperpixely) override
RAY_DemoEdgeDetectFilter()
static int getSpecialChannelIdx(const RAY_Imager &imager, RAY_SpecialChannel channel)
Get the channel index of the specified special channel.
fpreal fargp(int opt, int which=0) const
IMATH_NAMESPACE::V2f float
UT_Vector3T< T > SYSclamp(const UT_Vector3T< T > &v, const UT_Vector3T< T > &min, const UT_Vector3T< T > &max)
GLsizei GLsizei GLchar * source
~RAY_DemoEdgeDetectFilter() override
RAY_PixelFilter * allocPixelFilter(const char *name)
SYS_API fpreal32 SYSfloor(fpreal32 val)
GLuint const GLchar * name
void filter(float *destination, int vectorsize, const RAY_SampleBuffer &source, int channel, int sourcewidth, int sourceheight, int destwidth, int destheight, int destxoffsetinsource, int destyoffsetinsource, const RAY_Imager &imager) const override
void getFilterWidth(float &x, float &y) const override
static void addSpecialChannel(RAY_Imager &imager, RAY_SpecialChannel channel)
Indicate that the specified special channel must be added for this filter.
**If you just want to fire and args
void initialize(int argc, const char *const argv[])
void addNeededSpecialChannels(RAY_Imager &imager) override
static const float * getSampleData(const RAY_SampleBuffer &source, int channel)
Get the data for the channel with the specified index.
void setArgs(int argc, const char *const argv[]) override