@@ -355,8 +355,11 @@ p5.prototype._copyHelper = (
355
355
* POSTERIZE, BLUR, ERODE, DILATE or BLUR.
356
356
* See Filters.js for docs on
357
357
* each available filter
358
- * @param {Number } [ filterParam] an optional parameter unique
358
+ * @param {Number } filterParam an optional parameter unique
359
359
* to each filter, see above
360
+ * @param {Boolean } [useWebGL] a flag to control whether to use fast
361
+ * WebGL filters (GPU) or original image
362
+ * filters (CPU); defaults to true
360
363
*
361
364
* @example
362
365
* <div>
@@ -514,27 +517,75 @@ p5.prototype._copyHelper = (
514
517
* gray square
515
518
*/
516
519
520
+ /**
521
+ * @method filter
522
+ * @param {Constant } filterType
523
+ * @param {Boolean } [useWebGL]
524
+ */
517
525
/**
518
526
* @method filter
519
527
* @param {p5.Shader } shaderFilter A shader that's been loaded, with the
520
528
* frag shader using a `tex0` uniform
521
529
*/
522
- p5 . prototype . filter = function ( operation , value ) {
530
+ p5 . prototype . filter = function ( ... args ) {
523
531
p5 . _validateParameters ( 'filter' , arguments ) ;
524
532
525
- // TODO: use shader filters always, and provide an opt out
526
- if ( this . _renderer . isP3D ) {
527
- p5 . RendererGL . prototype . filter . call ( this . _renderer , arguments ) ;
533
+ let { shader, operation, value, useWebGL } = parseFilterArgs ( ...args ) ;
534
+
535
+ // when passed a shader, use it directly
536
+ if ( shader ) {
537
+ p5 . RendererGL . prototype . filter . call ( this . _renderer , shader ) ;
528
538
return ;
529
539
}
530
540
531
- if ( this . canvas !== undefined ) {
532
- Filters . apply ( this . canvas , Filters [ operation ] , value ) ;
533
- } else {
534
- Filters . apply ( this . elt , Filters [ operation ] , value ) ;
541
+ // when opting out of webgl, use old pixels method
542
+ if ( ! useWebGL ) {
543
+ if ( this . canvas !== undefined ) {
544
+ Filters . apply ( this . canvas , Filters [ operation ] , value ) ;
545
+ } else {
546
+ Filters . apply ( this . elt , Filters [ operation ] , value ) ;
547
+ }
548
+ return ;
549
+ }
550
+
551
+ // when this is a webgl renderer, apply constant shader filter
552
+ if ( this . _renderer . isP3D ) {
553
+ p5 . RendererGL . prototype . filter . call ( this . _renderer , operation , value ) ;
554
+ }
555
+
556
+ // when this is P2D renderer, create/use hidden webgl renderer
557
+ else {
558
+ // TODO: create/use hidden webgl renderer and transfer contents to this p2d
559
+ p5 . _friendlyError ( 'webgl filter implementation in progress' ) ;
535
560
}
536
561
} ;
537
562
563
+ function parseFilterArgs ( ...args ) {
564
+ let result = {
565
+ shader : undefined ,
566
+ operation : undefined ,
567
+ value : undefined ,
568
+ useWebGL : true
569
+ } ;
570
+
571
+ if ( args [ 0 ] instanceof p5 . Shader ) {
572
+ result . shader = args [ 0 ] ;
573
+ return result ;
574
+ }
575
+ else {
576
+ result . operation = args [ 0 ] ;
577
+ }
578
+
579
+ if ( args . length > 1 && typeof args [ 1 ] === 'number' ) {
580
+ result . value = args [ 1 ] ;
581
+ }
582
+
583
+ if ( args [ args . length - 1 ] === false ) {
584
+ result . useWebGL = false ;
585
+ }
586
+ return result ;
587
+ }
588
+
538
589
/**
539
590
* Get a region of pixels, or a single pixel, from the canvas.
540
591
*
0 commit comments