forked from pmndrs/postprocessing
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPixelationEffect.js
More file actions
125 lines (89 loc) · 1.99 KB
/
PixelationEffect.js
File metadata and controls
125 lines (89 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import { Uniform, Vector2, Vector4 } from "three";
import { Effect } from "./Effect.js";
import fragmentShader from "./glsl/pixelation.frag";
/**
* A pixelation effect.
*
* Warning: This effect cannot be merged with convolution effects.
*/
export class PixelationEffect extends Effect {
/**
* Constructs a new pixelation effect.
*
* @param {Object} [granularity=30.0] - The pixel granularity.
*/
constructor(granularity = 30.0) {
super("PixelationEffect", fragmentShader, {
uniforms: new Map([
["active", new Uniform(false)],
["d", new Uniform(new Vector4())]
])
});
/**
* The original resolution.
*
* @type {Vector2}
* @private
*/
this.resolution = new Vector2();
/**
* Backing data for {@link granularity}.
*
* @type {Number}
* @private
*/
this._granularity = 0;
this.granularity = granularity;
}
/**
* The pixel granularity.
*
* A higher value yields coarser visuals.
*
* @type {Number}
*/
get granularity() {
return this._granularity;
}
set granularity(value) {
let d = Math.floor(value);
if(d % 2 > 0) {
d += 1;
}
this._granularity = d;
this.uniforms.get("active").value = (d > 0);
this.setSize(this.resolution.width, this.resolution.height);
}
/**
* Returns the pixel granularity.
*
* @deprecated Use granularity instead.
* @return {Number} The granularity.
*/
getGranularity() {
return this.granularity;
}
/**
* Sets the pixel granularity.
*
* @deprecated Use granularity instead.
* @param {Number} value - The new granularity.
*/
setGranularity(value) {
this.granularity = value;
}
/**
* Updates the granularity.
*
* @param {Number} width - The width.
* @param {Number} height - The height.
*/
setSize(width, height) {
const resolution = this.resolution;
resolution.set(width, height);
const d = this.granularity;
const x = d / resolution.x;
const y = d / resolution.y;
this.uniforms.get("d").value.set(x, y, 1.0 / x, 1.0 / y);
}
}