Blender  V2.93
COM_VectorBlurOperation.cc
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * Copyright 2011, Blender Foundation.
17  */
18 
19 #include <cstring>
20 
21 #include "MEM_guardedalloc.h"
22 
23 #include "BLI_jitter_2d.h"
24 #include "BLI_math.h"
25 
27 
28 namespace blender::compositor {
29 
30 /* Defined */
31 #define PASS_VECTOR_MAX 10000.0f
32 
33 /* Forward declarations */
34 struct DrawBufPixel;
35 struct ZSpan;
37  int xsize,
38  int ysize,
39  float *newrect,
40  const float *imgrect,
41  float *vecbufrect,
42  const float *zbufrect);
43 void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty, float clipcrop);
44 void zbuf_free_span(ZSpan *zspan);
45 void antialias_tagbuf(int xsize, int ysize, char *rectmove);
46 
47 /* VectorBlurOperation */
49 {
51  this->addInputSocket(DataType::Value); // ZBUF
52  this->addInputSocket(DataType::Color); // SPEED
54  this->m_settings = nullptr;
55  this->m_cachedInstance = nullptr;
56  this->m_inputImageProgram = nullptr;
57  this->m_inputSpeedProgram = nullptr;
58  this->m_inputZProgram = nullptr;
59  flags.complex = true;
60 }
62 {
63  initMutex();
64  this->m_inputImageProgram = getInputSocketReader(0);
65  this->m_inputZProgram = getInputSocketReader(1);
66  this->m_inputSpeedProgram = getInputSocketReader(2);
67  this->m_cachedInstance = nullptr;
69 }
70 
71 void VectorBlurOperation::executePixel(float output[4], int x, int y, void *data)
72 {
73  float *buffer = (float *)data;
74  int index = (y * this->getWidth() + x) * COM_DATA_TYPE_COLOR_CHANNELS;
75  copy_v4_v4(output, &buffer[index]);
76 }
77 
79 {
80  deinitMutex();
81  this->m_inputImageProgram = nullptr;
82  this->m_inputSpeedProgram = nullptr;
83  this->m_inputZProgram = nullptr;
84  if (this->m_cachedInstance) {
85  MEM_freeN(this->m_cachedInstance);
86  this->m_cachedInstance = nullptr;
87  }
88 }
90 {
91  if (this->m_cachedInstance) {
92  return this->m_cachedInstance;
93  }
94 
95  lockMutex();
96  if (this->m_cachedInstance == nullptr) {
97  MemoryBuffer *tile = (MemoryBuffer *)this->m_inputImageProgram->initializeTileData(rect);
98  MemoryBuffer *speed = (MemoryBuffer *)this->m_inputSpeedProgram->initializeTileData(rect);
99  MemoryBuffer *z = (MemoryBuffer *)this->m_inputZProgram->initializeTileData(rect);
100  float *data = (float *)MEM_dupallocN(tile->getBuffer());
101  this->generateVectorBlur(data, tile, speed, z);
102  this->m_cachedInstance = data;
103  }
104  unlockMutex();
105  return this->m_cachedInstance;
106 }
107 
109  ReadBufferOperation *readOperation,
110  rcti *output)
111 {
112  if (this->m_cachedInstance == nullptr) {
113  rcti newInput;
114  newInput.xmax = this->getWidth();
115  newInput.xmin = 0;
116  newInput.ymax = this->getHeight();
117  newInput.ymin = 0;
118  return NodeOperation::determineDependingAreaOfInterest(&newInput, readOperation, output);
119  }
120 
121  return false;
122 }
123 
125  MemoryBuffer *inputImage,
126  MemoryBuffer *inputSpeed,
127  MemoryBuffer *inputZ)
128 {
129  NodeBlurData blurdata;
130  blurdata.samples = this->m_settings->samples / QualityStepHelper::getStep();
131  blurdata.maxspeed = this->m_settings->maxspeed;
132  blurdata.minspeed = this->m_settings->minspeed;
133  blurdata.curved = this->m_settings->curved;
134  blurdata.fac = this->m_settings->fac;
135  zbuf_accumulate_vecblur(&blurdata,
136  this->getWidth(),
137  this->getHeight(),
138  data,
139  inputImage->getBuffer(),
140  inputSpeed->getBuffer(),
141  inputZ->getBuffer());
142 }
143 
144 /* ****************** Spans ******************************* */
145 /* span fill in method, is also used to localize data for zbuffering */
146 struct ZSpan {
147  /* range for clipping */
148  int rectx, recty;
149 
150  /* actual filled in range */
152  /* vertex pointers detect min/max range in */
153  const float *minp1, *maxp1, *minp2, *maxp2;
154  float *span1, *span2;
155 
156  /* transform from hoco to zbuf co */
157  float zmulx, zmuly, zofsx, zofsy;
158 
159  int *rectz;
161  float clipcrop;
162 };
163 
164 /* each zbuffer has coordinates transformed to local rect coordinates, so we can simply clip */
165 void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty, float clipcrop)
166 {
167  memset(zspan, 0, sizeof(ZSpan));
168 
169  zspan->rectx = rectx;
170  zspan->recty = recty;
171 
172  zspan->span1 = (float *)MEM_mallocN(recty * sizeof(float), "zspan");
173  zspan->span2 = (float *)MEM_mallocN(recty * sizeof(float), "zspan");
174 
175  zspan->clipcrop = clipcrop;
176 }
177 
178 void zbuf_free_span(ZSpan *zspan)
179 {
180  if (zspan) {
181  if (zspan->span1) {
182  MEM_freeN(zspan->span1);
183  }
184  if (zspan->span2) {
185  MEM_freeN(zspan->span2);
186  }
187  zspan->span1 = zspan->span2 = nullptr;
188  }
189 }
190 
191 /* reset range for clipping */
192 static void zbuf_init_span(ZSpan *zspan)
193 {
194  zspan->miny1 = zspan->miny2 = zspan->recty + 1;
195  zspan->maxy1 = zspan->maxy2 = -1;
196  zspan->minp1 = zspan->maxp1 = zspan->minp2 = zspan->maxp2 = nullptr;
197 }
198 
199 static void zbuf_add_to_span(ZSpan *zspan, const float v1[2], const float v2[2])
200 {
201  const float *minv, *maxv;
202  float *span;
203  float xx1, dx0, xs0;
204  int y, my0, my2;
205 
206  if (v1[1] < v2[1]) {
207  minv = v1;
208  maxv = v2;
209  }
210  else {
211  minv = v2;
212  maxv = v1;
213  }
214 
215  my0 = ceil(minv[1]);
216  my2 = floor(maxv[1]);
217 
218  if (my2 < 0 || my0 >= zspan->recty) {
219  return;
220  }
221 
222  /* clip top */
223  if (my2 >= zspan->recty) {
224  my2 = zspan->recty - 1;
225  }
226  /* clip bottom */
227  if (my0 < 0) {
228  my0 = 0;
229  }
230 
231  if (my0 > my2) {
232  return;
233  }
234  /* if (my0>my2) should still fill in, that way we get spans that skip nicely */
235 
236  xx1 = maxv[1] - minv[1];
237  if (xx1 > FLT_EPSILON) {
238  dx0 = (minv[0] - maxv[0]) / xx1;
239  xs0 = dx0 * (minv[1] - my2) + minv[0];
240  }
241  else {
242  dx0 = 0.0f;
243  xs0 = min_ff(minv[0], maxv[0]);
244  }
245 
246  /* empty span */
247  if (zspan->maxp1 == nullptr) {
248  span = zspan->span1;
249  }
250  else { /* does it complete left span? */
251  if (maxv == zspan->minp1 || minv == zspan->maxp1) {
252  span = zspan->span1;
253  }
254  else {
255  span = zspan->span2;
256  }
257  }
258 
259  if (span == zspan->span1) {
260  // printf("left span my0 %d my2 %d\n", my0, my2);
261  if (zspan->minp1 == nullptr || zspan->minp1[1] > minv[1]) {
262  zspan->minp1 = minv;
263  }
264  if (zspan->maxp1 == nullptr || zspan->maxp1[1] < maxv[1]) {
265  zspan->maxp1 = maxv;
266  }
267  if (my0 < zspan->miny1) {
268  zspan->miny1 = my0;
269  }
270  if (my2 > zspan->maxy1) {
271  zspan->maxy1 = my2;
272  }
273  }
274  else {
275  // printf("right span my0 %d my2 %d\n", my0, my2);
276  if (zspan->minp2 == nullptr || zspan->minp2[1] > minv[1]) {
277  zspan->minp2 = minv;
278  }
279  if (zspan->maxp2 == nullptr || zspan->maxp2[1] < maxv[1]) {
280  zspan->maxp2 = maxv;
281  }
282  if (my0 < zspan->miny2) {
283  zspan->miny2 = my0;
284  }
285  if (my2 > zspan->maxy2) {
286  zspan->maxy2 = my2;
287  }
288  }
289 
290  for (y = my2; y >= my0; y--, xs0 += dx0) {
291  /* xs0 is the xcoord! */
292  span[y] = xs0;
293  }
294 }
295 
296 /* ******************** VECBLUR ACCUM BUF ************************* */
297 
298 struct DrawBufPixel {
299  const float *colpoin;
300  float alpha;
301 };
302 
303 static void zbuf_fill_in_rgba(
304  ZSpan *zspan, DrawBufPixel *col, float *v1, float *v2, float *v3, float *v4)
305 {
306  DrawBufPixel *rectpofs, *rp;
307  double zxd, zyd, zy0, zverg;
308  float x0, y0, z0;
309  float x1, y1, z1, x2, y2, z2, xx1;
310  const float *span1, *span2;
311  float *rectzofs, *rz;
312  int x, y;
313  int sn1, sn2, rectx, my0, my2;
314 
315  /* init */
316  zbuf_init_span(zspan);
317 
318  /* set spans */
319  zbuf_add_to_span(zspan, v1, v2);
320  zbuf_add_to_span(zspan, v2, v3);
321  zbuf_add_to_span(zspan, v3, v4);
322  zbuf_add_to_span(zspan, v4, v1);
323 
324  /* clipped */
325  if (zspan->minp2 == nullptr || zspan->maxp2 == nullptr) {
326  return;
327  }
328 
329  my0 = max_ii(zspan->miny1, zspan->miny2);
330  my2 = min_ii(zspan->maxy1, zspan->maxy2);
331 
332  // printf("my %d %d\n", my0, my2);
333  if (my2 < my0) {
334  return;
335  }
336 
337  /* ZBUF DX DY, in floats still */
338  x1 = v1[0] - v2[0];
339  x2 = v2[0] - v3[0];
340  y1 = v1[1] - v2[1];
341  y2 = v2[1] - v3[1];
342  z1 = v1[2] - v2[2];
343  z2 = v2[2] - v3[2];
344  x0 = y1 * z2 - z1 * y2;
345  y0 = z1 * x2 - x1 * z2;
346  z0 = x1 * y2 - y1 * x2;
347 
348  if (z0 == 0.0f) {
349  return;
350  }
351 
352  xx1 = (x0 * v1[0] + y0 * v1[1]) / z0 + v1[2];
353 
354  zxd = -(double)x0 / (double)z0;
355  zyd = -(double)y0 / (double)z0;
356  zy0 = ((double)my2) * zyd + (double)xx1;
357 
358  /* start-offset in rect */
359  rectx = zspan->rectx;
360  rectzofs = (float *)(zspan->rectz + rectx * my2);
361  rectpofs = ((DrawBufPixel *)zspan->rectdraw) + rectx * my2;
362 
363  /* correct span */
364  sn1 = (my0 + my2) / 2;
365  if (zspan->span1[sn1] < zspan->span2[sn1]) {
366  span1 = zspan->span1 + my2;
367  span2 = zspan->span2 + my2;
368  }
369  else {
370  span1 = zspan->span2 + my2;
371  span2 = zspan->span1 + my2;
372  }
373 
374  for (y = my2; y >= my0; y--, span1--, span2--) {
375 
376  sn1 = floor(*span1);
377  sn2 = floor(*span2);
378  sn1++;
379 
380  if (sn2 >= rectx) {
381  sn2 = rectx - 1;
382  }
383  if (sn1 < 0) {
384  sn1 = 0;
385  }
386 
387  if (sn2 >= sn1) {
388  zverg = (double)sn1 * zxd + zy0;
389  rz = rectzofs + sn1;
390  rp = rectpofs + sn1;
391  x = sn2 - sn1;
392 
393  while (x >= 0) {
394  if (zverg < (double)*rz) {
395  *rz = zverg;
396  *rp = *col;
397  }
398  zverg += zxd;
399  rz++;
400  rp++;
401  x--;
402  }
403  }
404 
405  zy0 -= zyd;
406  rectzofs -= rectx;
407  rectpofs -= rectx;
408  }
409 }
410 
411 /* char value==255 is filled in, rest should be zero */
412 /* returns alpha values,
413  * but sets alpha to 1 for zero alpha pixels that have an alpha value as neighbor. */
414 void antialias_tagbuf(int xsize, int ysize, char *rectmove)
415 {
416  char *row1, *row2, *row3;
417  char prev, next;
418  int a, x, y, step;
419 
420  /* 1: tag pixels to be candidate for AA */
421  for (y = 2; y < ysize; y++) {
422  /* setup rows */
423  row1 = rectmove + (y - 2) * xsize;
424  row2 = row1 + xsize;
425  row3 = row2 + xsize;
426  for (x = 2; x < xsize; x++, row1++, row2++, row3++) {
427  if (row2[1]) {
428  if (row2[0] == 0 || row2[2] == 0 || row1[1] == 0 || row3[1] == 0) {
429  row2[1] = 128;
430  }
431  }
432  }
433  }
434 
435  /* 2: evaluate horizontal scanlines and calculate alphas */
436  row1 = rectmove;
437  for (y = 0; y < ysize; y++) {
438  row1++;
439  for (x = 1; x < xsize; x++, row1++) {
440  if (row1[0] == 128 && row1[1] == 128) {
441  /* find previous color and next color and amount of steps to blend */
442  prev = row1[-1];
443  step = 1;
444  while (x + step < xsize && row1[step] == 128) {
445  step++;
446  }
447 
448  if (x + step != xsize) {
449  /* now we can blend values */
450  next = row1[step];
451 
452  /* note, prev value can be next value, but we do this loop to clear 128 then */
453  for (a = 0; a < step; a++) {
454  int fac, mfac;
455 
456  fac = ((a + 1) << 8) / (step + 1);
457  mfac = 255 - fac;
458 
459  row1[a] = (prev * mfac + next * fac) >> 8;
460  }
461  }
462  }
463  }
464  }
465 
466  /* 3: evaluate vertical scanlines and calculate alphas */
467  /* use for reading a copy of the original tagged buffer */
468  for (x = 0; x < xsize; x++) {
469  row1 = rectmove + x + xsize;
470 
471  for (y = 1; y < ysize; y++, row1 += xsize) {
472  if (row1[0] == 128 && row1[xsize] == 128) {
473  /* find previous color and next color and amount of steps to blend */
474  prev = row1[-xsize];
475  step = 1;
476  while (y + step < ysize && row1[step * xsize] == 128) {
477  step++;
478  }
479 
480  if (y + step != ysize) {
481  /* now we can blend values */
482  next = row1[step * xsize];
483  /* note, prev value can be next value, but we do this loop to clear 128 then */
484  for (a = 0; a < step; a++) {
485  int fac, mfac;
486 
487  fac = ((a + 1) << 8) / (step + 1);
488  mfac = 255 - fac;
489 
490  row1[a * xsize] = (prev * mfac + next * fac) >> 8;
491  }
492  }
493  }
494  }
495  }
496 
497  /* last: pixels with 0 we fill in zbuffer, with 1 we skip for mask */
498  for (y = 2; y < ysize; y++) {
499  /* setup rows */
500  row1 = rectmove + (y - 2) * xsize;
501  row2 = row1 + xsize;
502  row3 = row2 + xsize;
503  for (x = 2; x < xsize; x++, row1++, row2++, row3++) {
504  if (row2[1] == 0) {
505  if (row2[0] > 1 || row2[2] > 1 || row1[1] > 1 || row3[1] > 1) {
506  row2[1] = 1;
507  }
508  }
509  }
510  }
511 }
512 
513 /* in: two vectors, first vector points from origin back in time, 2nd vector points to future */
514 /* we make this into 3 points, center point is (0, 0) */
515 /* and offset the center point just enough to make curve go through midpoint */
516 
517 static void quad_bezier_2d(float *result, const float *v1, const float *v2, const float *ipodata)
518 {
519  float p1[2], p2[2], p3[2];
520 
521  p3[0] = -v2[0];
522  p3[1] = -v2[1];
523 
524  p1[0] = v1[0];
525  p1[1] = v1[1];
526 
527  /* official formula 2*p2 - 0.5*p1 - 0.5*p3 */
528  p2[0] = -0.5f * p1[0] - 0.5f * p3[0];
529  p2[1] = -0.5f * p1[1] - 0.5f * p3[1];
530 
531  result[0] = ipodata[0] * p1[0] + ipodata[1] * p2[0] + ipodata[2] * p3[0];
532  result[1] = ipodata[0] * p1[1] + ipodata[1] * p2[1] + ipodata[2] * p3[1];
533 }
534 
535 static void set_quad_bezier_ipo(float fac, float *data)
536 {
537  float mfac = (1.0f - fac);
538 
539  data[0] = mfac * mfac;
540  data[1] = 2.0f * mfac * fac;
541  data[2] = fac * fac;
542 }
543 
545  int xsize,
546  int ysize,
547  float *newrect,
548  const float *imgrect,
549  float *vecbufrect,
550  const float *zbufrect)
551 {
552  ZSpan zspan;
553  DrawBufPixel *rectdraw, *dr;
554  static float jit[256][2];
555  float v1[3], v2[3], v3[3], v4[3], fx, fy;
556  const float *dimg, *dz, *ro;
557  float *rectvz, *dvz, *dvec1, *dvec2, *dz1, *dz2, *rectz;
558  float *minvecbufrect = nullptr, *rectweight, *rw, *rectmax, *rm;
559  float maxspeedsq = (float)nbd->maxspeed * nbd->maxspeed;
560  int y, x, step, maxspeed = nbd->maxspeed, samples = nbd->samples;
561  int tsktsk = 0;
562  static int firsttime = 1;
563  char *rectmove, *dm;
564 
565  zbuf_alloc_span(&zspan, xsize, ysize, 1.0f);
566  zspan.zmulx = ((float)xsize) / 2.0f;
567  zspan.zmuly = ((float)ysize) / 2.0f;
568  zspan.zofsx = 0.0f;
569  zspan.zofsy = 0.0f;
570 
571  /* the buffers */
572  rectz = (float *)MEM_callocN(sizeof(float) * xsize * ysize, "zbuf accum");
573  zspan.rectz = (int *)rectz;
574 
575  rectmove = (char *)MEM_callocN(xsize * ysize, "rectmove");
576  rectdraw = (DrawBufPixel *)MEM_callocN(sizeof(DrawBufPixel) * xsize * ysize, "rect draw");
577  zspan.rectdraw = rectdraw;
578 
579  rectweight = (float *)MEM_callocN(sizeof(float) * xsize * ysize, "rect weight");
580  rectmax = (float *)MEM_callocN(sizeof(float) * xsize * ysize, "rect max");
581 
582  /* debug... check if PASS_VECTOR_MAX still is in buffers */
583  dvec1 = vecbufrect;
584  for (x = 4 * xsize * ysize; x > 0; x--, dvec1++) {
585  if (dvec1[0] == PASS_VECTOR_MAX) {
586  dvec1[0] = 0.0f;
587  tsktsk = 1;
588  }
589  }
590  if (tsktsk) {
591  printf("Found uninitialized speed in vector buffer... fixed.\n");
592  }
593 
594  /* Min speed? then copy speed-buffer to recalculate speed vectors. */
595  if (nbd->minspeed) {
596  float minspeed = (float)nbd->minspeed;
597  float minspeedsq = minspeed * minspeed;
598 
599  minvecbufrect = (float *)MEM_callocN(sizeof(float[4]) * xsize * ysize, "minspeed buf");
600 
601  dvec1 = vecbufrect;
602  dvec2 = minvecbufrect;
603  for (x = 2 * xsize * ysize; x > 0; x--, dvec1 += 2, dvec2 += 2) {
604  if (dvec1[0] == 0.0f && dvec1[1] == 0.0f) {
605  dvec2[0] = dvec1[0];
606  dvec2[1] = dvec1[1];
607  }
608  else {
609  float speedsq = dvec1[0] * dvec1[0] + dvec1[1] * dvec1[1];
610  if (speedsq <= minspeedsq) {
611  dvec2[0] = 0.0f;
612  dvec2[1] = 0.0f;
613  }
614  else {
615  speedsq = 1.0f - minspeed / sqrtf(speedsq);
616  dvec2[0] = speedsq * dvec1[0];
617  dvec2[1] = speedsq * dvec1[1];
618  }
619  }
620  }
621  SWAP(float *, minvecbufrect, vecbufrect);
622  }
623 
624  /* Make vertex buffer with averaged speed and Z-values. */
625  rectvz = (float *)MEM_callocN(sizeof(float[4]) * (xsize + 1) * (ysize + 1), "vertices");
626  dvz = rectvz;
627  for (y = 0; y <= ysize; y++) {
628 
629  if (y == 0) {
630  dvec1 = vecbufrect + 4 * y * xsize;
631  }
632  else {
633  dvec1 = vecbufrect + 4 * (y - 1) * xsize;
634  }
635 
636  if (y == ysize) {
637  dvec2 = vecbufrect + 4 * (y - 1) * xsize;
638  }
639  else {
640  dvec2 = vecbufrect + 4 * y * xsize;
641  }
642 
643  for (x = 0; x <= xsize; x++) {
644 
645  /* two vectors, so a step loop */
646  for (step = 0; step < 2; step++, dvec1 += 2, dvec2 += 2, dvz += 2) {
647  /* average on minimal speed */
648  int div = 0;
649 
650  if (x != 0) {
651  if (dvec1[-4] != 0.0f || dvec1[-3] != 0.0f) {
652  dvz[0] = dvec1[-4];
653  dvz[1] = dvec1[-3];
654  div++;
655  }
656  if (dvec2[-4] != 0.0f || dvec2[-3] != 0.0f) {
657  if (div == 0) {
658  dvz[0] = dvec2[-4];
659  dvz[1] = dvec2[-3];
660  div++;
661  }
662  else if ((fabsf(dvec2[-4]) + fabsf(dvec2[-3])) < (fabsf(dvz[0]) + fabsf(dvz[1]))) {
663  dvz[0] = dvec2[-4];
664  dvz[1] = dvec2[-3];
665  }
666  }
667  }
668 
669  if (x != xsize) {
670  if (dvec1[0] != 0.0f || dvec1[1] != 0.0f) {
671  if (div == 0) {
672  dvz[0] = dvec1[0];
673  dvz[1] = dvec1[1];
674  div++;
675  }
676  else if ((fabsf(dvec1[0]) + fabsf(dvec1[1])) < (fabsf(dvz[0]) + fabsf(dvz[1]))) {
677  dvz[0] = dvec1[0];
678  dvz[1] = dvec1[1];
679  }
680  }
681  if (dvec2[0] != 0.0f || dvec2[1] != 0.0f) {
682  if (div == 0) {
683  dvz[0] = dvec2[0];
684  dvz[1] = dvec2[1];
685  }
686  else if ((fabsf(dvec2[0]) + fabsf(dvec2[1])) < (fabsf(dvz[0]) + fabsf(dvz[1]))) {
687  dvz[0] = dvec2[0];
688  dvz[1] = dvec2[1];
689  }
690  }
691  }
692  if (maxspeed) {
693  float speedsq = dvz[0] * dvz[0] + dvz[1] * dvz[1];
694  if (speedsq > maxspeedsq) {
695  speedsq = (float)maxspeed / sqrtf(speedsq);
696  dvz[0] *= speedsq;
697  dvz[1] *= speedsq;
698  }
699  }
700  }
701  }
702  }
703 
704  /* set border speeds to keep border speeds on border */
705  dz1 = rectvz;
706  dz2 = rectvz + 4 * (ysize) * (xsize + 1);
707  for (x = 0; x <= xsize; x++, dz1 += 4, dz2 += 4) {
708  dz1[1] = 0.0f;
709  dz2[1] = 0.0f;
710  dz1[3] = 0.0f;
711  dz2[3] = 0.0f;
712  }
713  dz1 = rectvz;
714  dz2 = rectvz + 4 * (xsize);
715  for (y = 0; y <= ysize; y++, dz1 += 4 * (xsize + 1), dz2 += 4 * (xsize + 1)) {
716  dz1[0] = 0.0f;
717  dz2[0] = 0.0f;
718  dz1[2] = 0.0f;
719  dz2[2] = 0.0f;
720  }
721 
722  /* tag moving pixels, only these faces we draw */
723  dm = rectmove;
724  dvec1 = vecbufrect;
725  for (x = xsize * ysize; x > 0; x--, dm++, dvec1 += 4) {
726  if ((dvec1[0] != 0.0f || dvec1[1] != 0.0f || dvec1[2] != 0.0f || dvec1[3] != 0.0f)) {
727  *dm = 255;
728  }
729  }
730 
731  antialias_tagbuf(xsize, ysize, rectmove);
732 
733  /* Has to become static, the jitter initialization calls a random-seed,
734  * screwing up texture noise node. */
735  if (firsttime) {
736  firsttime = 0;
737  BLI_jitter_init(jit, 256);
738  }
739 
740  memset(newrect, 0, sizeof(float) * xsize * ysize * 4);
741 
742  /* accumulate */
743  samples /= 2;
744  for (step = 1; step <= samples; step++) {
745  float speedfac = 0.5f * nbd->fac * (float)step / (float)(samples + 1);
746  int side;
747 
748  for (side = 0; side < 2; side++) {
749  float blendfac, ipodata[4];
750 
751  /* clear zbuf, if we draw future we fill in not moving pixels */
752  if (false) {
753  for (x = xsize * ysize - 1; x >= 0; x--) {
754  rectz[x] = 10e16;
755  }
756  }
757  else {
758  for (x = xsize * ysize - 1; x >= 0; x--) {
759  if (rectmove[x] == 0) {
760  rectz[x] = zbufrect[x];
761  }
762  else {
763  rectz[x] = 10e16;
764  }
765  }
766  }
767 
768  /* clear drawing buffer */
769  for (x = xsize * ysize - 1; x >= 0; x--) {
770  rectdraw[x].colpoin = nullptr;
771  }
772 
773  dimg = imgrect;
774  dm = rectmove;
775  dz = zbufrect;
776  dz1 = rectvz;
777  dz2 = rectvz + 4 * (xsize + 1);
778 
779  if (side) {
780  if (nbd->curved == 0) {
781  dz1 += 2;
782  dz2 += 2;
783  }
784  speedfac = -speedfac;
785  }
786 
787  set_quad_bezier_ipo(0.5f + 0.5f * speedfac, ipodata);
788 
789  for (fy = -0.5f + jit[step & 255][0], y = 0; y < ysize; y++, fy += 1.0f) {
790  for (fx = -0.5f + jit[step & 255][1], x = 0; x < xsize;
791  x++, fx += 1.0f, dimg += 4, dz1 += 4, dz2 += 4, dm++, dz++) {
792  if (*dm > 1) {
793  float jfx = fx + 0.5f;
794  float jfy = fy + 0.5f;
796 
797  /* make vertices */
798  if (nbd->curved) { /* curved */
799  quad_bezier_2d(v1, dz1, dz1 + 2, ipodata);
800  v1[0] += jfx;
801  v1[1] += jfy;
802  v1[2] = *dz;
803 
804  quad_bezier_2d(v2, dz1 + 4, dz1 + 4 + 2, ipodata);
805  v2[0] += jfx + 1.0f;
806  v2[1] += jfy;
807  v2[2] = *dz;
808 
809  quad_bezier_2d(v3, dz2 + 4, dz2 + 4 + 2, ipodata);
810  v3[0] += jfx + 1.0f;
811  v3[1] += jfy + 1.0f;
812  v3[2] = *dz;
813 
814  quad_bezier_2d(v4, dz2, dz2 + 2, ipodata);
815  v4[0] += jfx;
816  v4[1] += jfy + 1.0f;
817  v4[2] = *dz;
818  }
819  else {
820  ARRAY_SET_ITEMS(v1, speedfac * dz1[0] + jfx, speedfac * dz1[1] + jfy, *dz);
821  ARRAY_SET_ITEMS(v2, speedfac * dz1[4] + jfx + 1.0f, speedfac * dz1[5] + jfy, *dz);
823  v3, speedfac * dz2[4] + jfx + 1.0f, speedfac * dz2[5] + jfy + 1.0f, *dz);
824  ARRAY_SET_ITEMS(v4, speedfac * dz2[0] + jfx, speedfac * dz2[1] + jfy + 1.0f, *dz);
825  }
826  if (*dm == 255) {
827  col.alpha = 1.0f;
828  }
829  else if (*dm < 2) {
830  col.alpha = 0.0f;
831  }
832  else {
833  col.alpha = ((float)*dm) / 255.0f;
834  }
835  col.colpoin = dimg;
836 
837  zbuf_fill_in_rgba(&zspan, &col, v1, v2, v3, v4);
838  }
839  }
840  dz1 += 4;
841  dz2 += 4;
842  }
843 
844  /* blend with a falloff. this fixes the ugly effect you get with
845  * a fast moving object. then it looks like a solid object overlaid
846  * over a very transparent moving version of itself. in reality, the
847  * whole object should become transparent if it is moving fast, be
848  * we don't know what is behind it so we don't do that. this hack
849  * overestimates the contribution of foreground pixels but looks a
850  * bit better without a sudden cutoff. */
851  blendfac = ((samples - step) / (float)samples);
852  /* Smooth-step to make it look a bit nicer as well. */
853  blendfac = 3.0f * pow(blendfac, 2.0f) - 2.0f * pow(blendfac, 3.0f);
854 
855  /* accum */
856  rw = rectweight;
857  rm = rectmax;
858  for (dr = rectdraw, dz2 = newrect, x = xsize * ysize - 1; x >= 0;
859  x--, dr++, dz2 += 4, rw++, rm++) {
860  if (dr->colpoin) {
861  float bfac = dr->alpha * blendfac;
862 
863  dz2[0] += bfac * dr->colpoin[0];
864  dz2[1] += bfac * dr->colpoin[1];
865  dz2[2] += bfac * dr->colpoin[2];
866  dz2[3] += bfac * dr->colpoin[3];
867 
868  *rw += bfac;
869  *rm = MAX2(*rm, bfac);
870  }
871  }
872  }
873  }
874 
875  /* blend between original images and accumulated image */
876  rw = rectweight;
877  rm = rectmax;
878  ro = imgrect;
879  dm = rectmove;
880  for (dz2 = newrect, x = xsize * ysize - 1; x >= 0; x--, dz2 += 4, ro += 4, rw++, rm++, dm++) {
881  float mfac = *rm;
882  float fac = (*rw == 0.0f) ? 0.0f : mfac / (*rw);
883  float nfac = 1.0f - mfac;
884 
885  dz2[0] = fac * dz2[0] + nfac * ro[0];
886  dz2[1] = fac * dz2[1] + nfac * ro[1];
887  dz2[2] = fac * dz2[2] + nfac * ro[2];
888  dz2[3] = fac * dz2[3] + nfac * ro[3];
889  }
890 
891  MEM_freeN(rectz);
892  MEM_freeN(rectmove);
893  MEM_freeN(rectdraw);
894  MEM_freeN(rectvz);
895  MEM_freeN(rectweight);
896  MEM_freeN(rectmax);
897  if (minvecbufrect) {
898  MEM_freeN(vecbufrect); /* rects were swapped! */
899  }
900  zbuf_free_span(&zspan);
901 }
902 
903 } // namespace blender::compositor
typedef float(TangentPoint)[2]
void BLI_jitter_init(float(*jitarr)[2], int num)
Definition: jitter_2d.c:142
MINLINE int min_ii(int a, int b)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
MINLINE void copy_v4_v4(float r[4], const float a[4])
#define ARRAY_SET_ITEMS(...)
#define SWAP(type, a, b)
#define MAX2(a, b)
typedef double(DMatrix)[4][4]
#define PASS_VECTOR_MAX
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble y1
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble x2
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT const BMVert * v2
#define output
a MemoryBuffer contains access to the data of a chunk
float * getBuffer()
get the data of this MemoryBuffer
virtual void * initializeTileData(rcti *)
void addInputSocket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
void addOutputSocket(DataType datatype)
SocketReader * getInputSocketReader(unsigned int inputSocketindex)
virtual bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
bool determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output) override
void generateVectorBlur(float *data, MemoryBuffer *inputImage, MemoryBuffer *inputSpeed, MemoryBuffer *inputZ)
void executePixel(float output[4], int x, int y, void *data) override
uint col
#define jit
#define fabsf(x)
#define sqrtf(x)
__kernel void ccl_constant KernelData ccl_global void ccl_global char ccl_global int ccl_global char ccl_global unsigned int ccl_global float * buffer
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:42
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
static ulong * next
static unsigned a[3]
Definition: RandGen.cpp:92
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
Definition: rall1d.h:359
static void zbuf_add_to_span(ZSpan *zspan, const float v1[2], const float v2[2])
void zbuf_accumulate_vecblur(NodeBlurData *nbd, int xsize, int ysize, float *newrect, const float *imgrect, float *vecbufrect, const float *zbufrect)
constexpr int COM_DATA_TYPE_COLOR_CHANNELS
Definition: COM_defines.h:53
static void zbuf_fill_in_rgba(ZSpan *zspan, DrawBufPixel *col, float *v1, float *v2, float *v3, float *v4)
static void quad_bezier_2d(float *result, const float *v1, const float *v2, const float *ipodata)
static void zbuf_init_span(ZSpan *zspan)
void zbuf_alloc_span(ZSpan *zspan, int rectx, int recty, float clipcrop)
void antialias_tagbuf(int xsize, int ysize, char *rectmove)
static void set_quad_bezier_ipo(float fac, float *data)
void zbuf_free_span(ZSpan *zspan)
Definition: zbuf.h:28
int recty
Definition: zbuf.h:29
int rectx
Definition: zbuf.h:29
int ymin
Definition: DNA_vec_types.h:80
int ymax
Definition: DNA_vec_types.h:80
int xmin
Definition: DNA_vec_types.h:79
int xmax
Definition: DNA_vec_types.h:79
ccl_device_inline float2 floor(const float2 &a)
ccl_device_inline float3 ceil(const float3 &a)