@deck.gl/extensions 8.10.0-alpha.2 → 8.10.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/LICENSE +1 -1
  2. package/dist/dist.dev.js +38 -660
  3. package/dist/es5/brushing/brushing-extension.js +48 -54
  4. package/dist/es5/brushing/brushing-extension.js.map +1 -1
  5. package/dist/es5/clip/clip-extension.js +32 -37
  6. package/dist/es5/clip/clip-extension.js.map +1 -1
  7. package/dist/es5/collision-filter/collision-filter-effect.js +217 -225
  8. package/dist/es5/collision-filter/collision-filter-effect.js.map +1 -1
  9. package/dist/es5/collision-filter/collision-filter-extension.js +49 -56
  10. package/dist/es5/collision-filter/collision-filter-extension.js.map +1 -1
  11. package/dist/es5/collision-filter/collision-filter-pass.js +31 -34
  12. package/dist/es5/collision-filter/collision-filter-pass.js.map +1 -1
  13. package/dist/es5/data-filter/data-filter-extension.js +126 -132
  14. package/dist/es5/data-filter/data-filter-extension.js.map +1 -1
  15. package/dist/es5/fill-style/fill-style-extension.js +101 -109
  16. package/dist/es5/fill-style/fill-style-extension.js.map +1 -1
  17. package/dist/es5/fp64/fp64-extension.js +12 -16
  18. package/dist/es5/fp64/fp64-extension.js.map +1 -1
  19. package/dist/es5/mask/mask-effect.js +208 -216
  20. package/dist/es5/mask/mask-effect.js.map +1 -1
  21. package/dist/es5/mask/mask-extension.js +57 -63
  22. package/dist/es5/mask/mask-extension.js.map +1 -1
  23. package/dist/es5/mask/mask-pass.js +36 -42
  24. package/dist/es5/mask/mask-pass.js.map +1 -1
  25. package/dist/es5/path-style/path-style-extension.js +81 -89
  26. package/dist/es5/path-style/path-style-extension.js.map +1 -1
  27. package/dist/es5/terrain/height-map-builder.js +73 -80
  28. package/dist/es5/terrain/height-map-builder.js.map +1 -1
  29. package/dist/es5/terrain/terrain-cover.js +155 -162
  30. package/dist/es5/terrain/terrain-cover.js.map +1 -1
  31. package/dist/es5/terrain/terrain-effect.js +233 -242
  32. package/dist/es5/terrain/terrain-effect.js.map +1 -1
  33. package/dist/es5/terrain/terrain-extension.js +44 -51
  34. package/dist/es5/terrain/terrain-extension.js.map +1 -1
  35. package/dist/es5/terrain/terrain-pass.js +61 -65
  36. package/dist/es5/terrain/terrain-pass.js.map +1 -1
  37. package/dist/es5/terrain/terrain-picking-pass.js +56 -62
  38. package/dist/es5/terrain/terrain-picking-pass.js.map +1 -1
  39. package/dist/esm/brushing/brushing-extension.js +2 -5
  40. package/dist/esm/brushing/brushing-extension.js.map +1 -1
  41. package/dist/esm/brushing/shader-module.js +67 -4
  42. package/dist/esm/brushing/shader-module.js.map +1 -1
  43. package/dist/esm/clip/clip-extension.js +33 -14
  44. package/dist/esm/clip/clip-extension.js.map +1 -1
  45. package/dist/esm/collision-filter/collision-filter-effect.js +10 -19
  46. package/dist/esm/collision-filter/collision-filter-effect.js.map +1 -1
  47. package/dist/esm/collision-filter/collision-filter-extension.js +2 -5
  48. package/dist/esm/collision-filter/collision-filter-extension.js.map +1 -1
  49. package/dist/esm/collision-filter/shader-module.js +76 -4
  50. package/dist/esm/collision-filter/shader-module.js.map +1 -1
  51. package/dist/esm/data-filter/aggregator.js +45 -2
  52. package/dist/esm/data-filter/aggregator.js.map +1 -1
  53. package/dist/esm/data-filter/data-filter-extension.js +2 -5
  54. package/dist/esm/data-filter/data-filter-extension.js.map +1 -1
  55. package/dist/esm/data-filter/shader-module.js +86 -6
  56. package/dist/esm/data-filter/shader-module.js.map +1 -1
  57. package/dist/esm/fill-style/fill-style-extension.js +2 -5
  58. package/dist/esm/fill-style/fill-style-extension.js.map +1 -1
  59. package/dist/esm/fill-style/shaders.glsl.js +60 -5
  60. package/dist/esm/fill-style/shaders.glsl.js.map +1 -1
  61. package/dist/esm/fp64/fp64-extension.js +1 -3
  62. package/dist/esm/fp64/fp64-extension.js.map +1 -1
  63. package/dist/esm/fp64/project64.glsl.js +81 -1
  64. package/dist/esm/fp64/project64.glsl.js.map +1 -1
  65. package/dist/esm/mask/mask-effect.js +10 -20
  66. package/dist/esm/mask/mask-effect.js.map +1 -1
  67. package/dist/esm/mask/mask-extension.js +3 -6
  68. package/dist/esm/mask/mask-extension.js.map +1 -1
  69. package/dist/esm/mask/mask-pass.js +2 -6
  70. package/dist/esm/mask/mask-pass.js.map +1 -1
  71. package/dist/esm/mask/shader-module.js +61 -6
  72. package/dist/esm/mask/shader-module.js.map +1 -1
  73. package/dist/esm/path-style/path-style-extension.js +2 -5
  74. package/dist/esm/path-style/path-style-extension.js.map +1 -1
  75. package/dist/esm/path-style/shaders.glsl.js +79 -8
  76. package/dist/esm/path-style/shaders.glsl.js.map +1 -1
  77. package/dist/esm/terrain/height-map-builder.js +8 -17
  78. package/dist/esm/terrain/height-map-builder.js.map +1 -1
  79. package/dist/esm/terrain/shader-module.js +59 -7
  80. package/dist/esm/terrain/shader-module.js.map +1 -1
  81. package/dist/esm/terrain/terrain-cover.js +11 -22
  82. package/dist/esm/terrain/terrain-cover.js.map +1 -1
  83. package/dist/esm/terrain/terrain-effect.js +11 -21
  84. package/dist/esm/terrain/terrain-effect.js.map +1 -1
  85. package/dist/esm/terrain/terrain-extension.js +2 -5
  86. package/dist/esm/terrain/terrain-extension.js.map +1 -1
  87. package/dist/esm/terrain/terrain-pass.js +1 -1
  88. package/dist/esm/terrain/terrain-pass.js.map +1 -1
  89. package/dist/esm/terrain/terrain-picking-pass.js +2 -4
  90. package/dist/esm/terrain/terrain-picking-pass.js.map +1 -1
  91. package/dist.min.js +36 -35
  92. package/package.json +2 -2
  93. package/typed/brushing/brushing.d.ts +0 -39
  94. package/typed/brushing/brushing.d.ts.map +0 -1
  95. package/typed/brushing/brushing.js +0 -83
  96. package/typed/brushing/shader-module.js +0 -116
  97. package/typed/clip/clip.d.ts +0 -32
  98. package/typed/clip/clip.d.ts.map +0 -1
  99. package/typed/clip/clip.js +0 -114
  100. package/typed/collide/collide-effect.d.ts +0 -28
  101. package/typed/collide/collide-effect.d.ts.map +0 -1
  102. package/typed/collide/collide-pass.d.ts +0 -14
  103. package/typed/collide/collide-pass.d.ts.map +0 -1
  104. package/typed/collide/collide.d.ts +0 -41
  105. package/typed/collide/collide.d.ts.map +0 -1
  106. package/typed/collide/shader-module.d.ts +0 -4
  107. package/typed/collide/shader-module.d.ts.map +0 -1
  108. package/typed/collision-filter/collision-filter.d.ts +0 -41
  109. package/typed/collision-filter/collision-filter.d.ts.map +0 -1
  110. package/typed/common/projection-utils.d.ts +0 -27
  111. package/typed/common/projection-utils.d.ts.map +0 -1
  112. package/typed/data-filter/aggregator.js +0 -98
  113. package/typed/data-filter/data-filter.d.ts +0 -90
  114. package/typed/data-filter/data-filter.d.ts.map +0 -1
  115. package/typed/data-filter/data-filter.js +0 -159
  116. package/typed/data-filter/shader-module.js +0 -152
  117. package/typed/fill-style/fill-style.d.ts +0 -86
  118. package/typed/fill-style/fill-style.d.ts.map +0 -1
  119. package/typed/fill-style/fill-style.js +0 -152
  120. package/typed/fill-style/shaders.glsl.js +0 -95
  121. package/typed/fp64/fp64.d.ts +0 -8
  122. package/typed/fp64/fp64.d.ts.map +0 -1
  123. package/typed/fp64/fp64.js +0 -34
  124. package/typed/fp64/project64.glsl.js +0 -100
  125. package/typed/fp64/project64.js +0 -50
  126. package/typed/index.js +0 -9
  127. package/typed/mask/mask.d.ts +0 -30
  128. package/typed/mask/mask.d.ts.map +0 -1
  129. package/typed/mask/mask.js +0 -48
  130. package/typed/mask/shader-module.js +0 -73
  131. package/typed/mask/utils.d.ts +0 -13
  132. package/typed/mask/utils.d.ts.map +0 -1
  133. package/typed/path-style/path-style.d.ts +0 -66
  134. package/typed/path-style/path-style.d.ts.map +0 -1
  135. package/typed/path-style/path-style.js +0 -107
  136. package/typed/path-style/shaders.glsl.js +0 -93
  137. package/typed/terrain/height-map.d.ts +0 -27
  138. package/typed/terrain/height-map.d.ts.map +0 -1
  139. package/typed/terrain/shader-module-offset.d.ts +0 -4
  140. package/typed/terrain/shader-module-offset.d.ts.map +0 -1
  141. package/typed/terrain/shader-module-source.d.ts +0 -4
  142. package/typed/terrain/shader-module-source.d.ts.map +0 -1
  143. package/typed/terrain/terrain.d.ts +0 -21
  144. package/typed/terrain/terrain.d.ts.map +0 -1
@@ -7,12 +7,10 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
 
10
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
-
12
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
-
14
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
11
 
12
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
+
16
14
  var _core = require("@luma.gl/core");
17
15
 
18
16
  var _core2 = require("@math.gl/core");
@@ -34,258 +32,252 @@ var DOWNSCALE = 2;
34
32
  var CollisionFilterEffect = function () {
35
33
  function CollisionFilterEffect() {
36
34
  (0, _classCallCheck2.default)(this, CollisionFilterEffect);
37
- (0, _defineProperty2.default)(this, "id", 'collision-filter-effect');
38
- (0, _defineProperty2.default)(this, "props", null);
39
- (0, _defineProperty2.default)(this, "useInPicking", true);
40
- (0, _defineProperty2.default)(this, "order", 1);
41
- (0, _defineProperty2.default)(this, "channels", {});
42
- (0, _defineProperty2.default)(this, "collisionFilterPass", void 0);
43
- (0, _defineProperty2.default)(this, "collisionFBOs", {});
44
- (0, _defineProperty2.default)(this, "dummyCollisionMap", void 0);
45
- (0, _defineProperty2.default)(this, "lastViewport", void 0);
35
+ this.id = 'collision-filter-effect';
36
+ this.props = null;
37
+ this.useInPicking = true;
38
+ this.order = 1;
39
+ this.channels = {};
40
+ this.collisionFilterPass = void 0;
41
+ this.collisionFBOs = {};
42
+ this.dummyCollisionMap = void 0;
43
+ this.lastViewport = void 0;
46
44
  }
47
45
 
48
- (0, _createClass2.default)(CollisionFilterEffect, [{
49
- key: "preRender",
50
- value: function preRender(gl, _ref) {
51
- var _preRenderStats$mask;
52
-
53
- var allEffects = _ref.effects,
54
- layers = _ref.layers,
55
- layerFilter = _ref.layerFilter,
56
- viewports = _ref.viewports,
57
- onViewportActive = _ref.onViewportActive,
58
- views = _ref.views,
59
- isPicking = _ref.isPicking,
60
- _ref$preRenderStats = _ref.preRenderStats,
61
- preRenderStats = _ref$preRenderStats === void 0 ? {} : _ref$preRenderStats;
62
-
63
- if (!this.dummyCollisionMap) {
64
- this.dummyCollisionMap = new _core.Texture2D(gl, {
65
- width: 1,
66
- height: 1
67
- });
68
- }
46
+ var _proto = CollisionFilterEffect.prototype;
47
+
48
+ _proto.preRender = function preRender(gl, _ref) {
49
+ var _preRenderStats$mask;
50
+
51
+ var allEffects = _ref.effects,
52
+ layers = _ref.layers,
53
+ layerFilter = _ref.layerFilter,
54
+ viewports = _ref.viewports,
55
+ onViewportActive = _ref.onViewportActive,
56
+ views = _ref.views,
57
+ isPicking = _ref.isPicking,
58
+ _ref$preRenderStats = _ref.preRenderStats,
59
+ preRenderStats = _ref$preRenderStats === void 0 ? {} : _ref$preRenderStats;
60
+
61
+ if (!this.dummyCollisionMap) {
62
+ this.dummyCollisionMap = new _core.Texture2D(gl, {
63
+ width: 1,
64
+ height: 1
65
+ });
66
+ }
69
67
 
70
- if (isPicking) {
71
- return;
72
- }
68
+ if (isPicking) {
69
+ return;
70
+ }
71
+
72
+ var collisionLayers = layers.filter(function (_ref2) {
73
+ var _ref2$props = _ref2.props,
74
+ visible = _ref2$props.visible,
75
+ collisionEnabled = _ref2$props.collisionEnabled;
76
+ return visible && collisionEnabled;
77
+ });
73
78
 
74
- var collisionLayers = layers.filter(function (_ref2) {
75
- var _ref2$props = _ref2.props,
76
- visible = _ref2$props.visible,
77
- collisionEnabled = _ref2$props.collisionEnabled;
78
- return visible && collisionEnabled;
79
+ if (collisionLayers.length === 0) {
80
+ this.channels = {};
81
+ return;
82
+ }
83
+
84
+ if (!this.collisionFilterPass) {
85
+ this.collisionFilterPass = new _collisionFilterPass.default(gl, {
86
+ id: 'default-collision-filter'
79
87
  });
88
+ }
80
89
 
81
- if (collisionLayers.length === 0) {
82
- this.channels = {};
83
- return;
84
- }
90
+ var effects = allEffects === null || allEffects === void 0 ? void 0 : allEffects.filter(function (e) {
91
+ return e.constructor === _maskEffect.default;
92
+ });
93
+ var maskEffectRendered = (_preRenderStats$mask = preRenderStats['mask-effect']) === null || _preRenderStats$mask === void 0 ? void 0 : _preRenderStats$mask.didRender;
85
94
 
86
- if (!this.collisionFilterPass) {
87
- this.collisionFilterPass = new _collisionFilterPass.default(gl, {
88
- id: 'default-collision-filter'
89
- });
90
- }
95
+ var channels = this._groupByCollisionGroup(gl, collisionLayers);
91
96
 
92
- var effects = allEffects === null || allEffects === void 0 ? void 0 : allEffects.filter(function (e) {
93
- return e.constructor === _maskEffect.default;
97
+ var viewport = viewports[0];
98
+ var viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;
99
+
100
+ for (var collisionGroup in channels) {
101
+ var collisionFBO = this.collisionFBOs[collisionGroup];
102
+ var renderInfo = channels[collisionGroup];
103
+ collisionFBO.resize({
104
+ width: gl.canvas.width / DOWNSCALE,
105
+ height: gl.canvas.height / DOWNSCALE
106
+ });
107
+
108
+ this._render(renderInfo, {
109
+ effects: effects,
110
+ layerFilter: layerFilter,
111
+ onViewportActive: onViewportActive,
112
+ views: views,
113
+ viewport: viewport,
114
+ viewportChanged: viewportChanged
94
115
  });
95
- var maskEffectRendered = (_preRenderStats$mask = preRenderStats['mask-effect']) === null || _preRenderStats$mask === void 0 ? void 0 : _preRenderStats$mask.didRender;
96
-
97
- var channels = this._groupByCollisionGroup(gl, collisionLayers);
98
-
99
- var viewport = viewports[0];
100
- var viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;
101
-
102
- for (var collisionGroup in channels) {
103
- var collisionFBO = this.collisionFBOs[collisionGroup];
104
- var renderInfo = channels[collisionGroup];
105
- collisionFBO.resize({
106
- width: gl.canvas.width / DOWNSCALE,
107
- height: gl.canvas.height / DOWNSCALE
108
- });
109
-
110
- this._render(renderInfo, {
111
- effects: effects,
112
- layerFilter: layerFilter,
113
- onViewportActive: onViewportActive,
114
- views: views,
115
- viewport: viewport,
116
- viewportChanged: viewportChanged
117
- });
118
- }
119
116
  }
120
- }, {
121
- key: "_render",
122
- value: function _render(renderInfo, _ref3) {
123
- var effects = _ref3.effects,
124
- layerFilter = _ref3.layerFilter,
125
- onViewportActive = _ref3.onViewportActive,
126
- views = _ref3.views,
127
- viewport = _ref3.viewport,
128
- viewportChanged = _ref3.viewportChanged;
129
- var collisionGroup = renderInfo.collisionGroup;
130
- var oldRenderInfo = this.channels[collisionGroup];
131
-
132
- if (!oldRenderInfo) {
133
- return;
134
- }
117
+ };
118
+
119
+ _proto._render = function _render(renderInfo, _ref3) {
120
+ var effects = _ref3.effects,
121
+ layerFilter = _ref3.layerFilter,
122
+ onViewportActive = _ref3.onViewportActive,
123
+ views = _ref3.views,
124
+ viewport = _ref3.viewport,
125
+ viewportChanged = _ref3.viewportChanged;
126
+ var collisionGroup = renderInfo.collisionGroup;
127
+ var oldRenderInfo = this.channels[collisionGroup];
128
+
129
+ if (!oldRenderInfo) {
130
+ return;
131
+ }
135
132
 
136
- var needsRender = viewportChanged || renderInfo === oldRenderInfo || !(0, _core3._deepEqual)(oldRenderInfo.layers, renderInfo.layers, 1) || renderInfo.layerBounds.some(function (b, i) {
137
- return !(0, _core2.equals)(b, oldRenderInfo.layerBounds[i]);
138
- }) || renderInfo.allLayersLoaded !== oldRenderInfo.allLayersLoaded || renderInfo.layers.some(function (layer) {
139
- return layer.props.transitions;
133
+ var needsRender = viewportChanged || renderInfo === oldRenderInfo || !(0, _core3._deepEqual)(oldRenderInfo.layers, renderInfo.layers, 1) || renderInfo.layerBounds.some(function (b, i) {
134
+ return !(0, _core2.equals)(b, oldRenderInfo.layerBounds[i]);
135
+ }) || renderInfo.allLayersLoaded !== oldRenderInfo.allLayersLoaded || renderInfo.layers.some(function (layer) {
136
+ return layer.props.transitions;
137
+ });
138
+ this.channels[collisionGroup] = renderInfo;
139
+
140
+ if (needsRender) {
141
+ this.lastViewport = viewport;
142
+ var collisionFBO = this.collisionFBOs[collisionGroup];
143
+ this.collisionFilterPass.renderCollisionMap(collisionFBO, {
144
+ pass: 'collision-filter',
145
+ isPicking: true,
146
+ layers: renderInfo.layers,
147
+ effects: effects,
148
+ layerFilter: layerFilter,
149
+ viewports: viewport ? [viewport] : [],
150
+ onViewportActive: onViewportActive,
151
+ views: views,
152
+ moduleParameters: {
153
+ dummyCollisionMap: this.dummyCollisionMap,
154
+ devicePixelRatio: (0, _core.cssToDeviceRatio)(collisionFBO.gl) / DOWNSCALE
155
+ }
140
156
  });
141
- this.channels[collisionGroup] = renderInfo;
142
-
143
- if (needsRender) {
144
- this.lastViewport = viewport;
145
- var collisionFBO = this.collisionFBOs[collisionGroup];
146
- this.collisionFilterPass.renderCollisionMap(collisionFBO, {
147
- pass: 'collision-filter',
148
- isPicking: true,
149
- layers: renderInfo.layers,
150
- effects: effects,
151
- layerFilter: layerFilter,
152
- viewports: viewport ? [viewport] : [],
153
- onViewportActive: onViewportActive,
154
- views: views,
155
- moduleParameters: {
156
- dummyCollisionMap: this.dummyCollisionMap,
157
- devicePixelRatio: (0, _core.cssToDeviceRatio)(collisionFBO.gl) / DOWNSCALE
158
- }
159
- });
160
- }
161
157
  }
162
- }, {
163
- key: "_groupByCollisionGroup",
164
- value: function _groupByCollisionGroup(gl, collisionLayers) {
165
- var channelMap = {};
166
-
167
- var _iterator = _createForOfIteratorHelper(collisionLayers),
168
- _step;
169
-
170
- try {
171
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
172
- var layer = _step.value;
173
- var _collisionGroup2 = layer.props.collisionGroup;
174
- var channelInfo = channelMap[_collisionGroup2];
175
-
176
- if (!channelInfo) {
177
- channelInfo = {
178
- collisionGroup: _collisionGroup2,
179
- layers: [],
180
- layerBounds: [],
181
- allLayersLoaded: true
182
- };
183
- channelMap[_collisionGroup2] = channelInfo;
184
- }
185
-
186
- channelInfo.layers.push(layer);
187
- channelInfo.layerBounds.push(layer.getBounds());
188
-
189
- if (!layer.isLoaded) {
190
- channelInfo.allLayersLoaded = false;
191
- }
158
+ };
159
+
160
+ _proto._groupByCollisionGroup = function _groupByCollisionGroup(gl, collisionLayers) {
161
+ var channelMap = {};
162
+
163
+ var _iterator = _createForOfIteratorHelper(collisionLayers),
164
+ _step;
165
+
166
+ try {
167
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
168
+ var layer = _step.value;
169
+ var _collisionGroup2 = layer.props.collisionGroup;
170
+ var channelInfo = channelMap[_collisionGroup2];
171
+
172
+ if (!channelInfo) {
173
+ channelInfo = {
174
+ collisionGroup: _collisionGroup2,
175
+ layers: [],
176
+ layerBounds: [],
177
+ allLayersLoaded: true
178
+ };
179
+ channelMap[_collisionGroup2] = channelInfo;
192
180
  }
193
- } catch (err) {
194
- _iterator.e(err);
195
- } finally {
196
- _iterator.f();
197
- }
198
-
199
- for (var _i = 0, _Object$keys = Object.keys(channelMap); _i < _Object$keys.length; _i++) {
200
- var collisionGroup = _Object$keys[_i];
201
181
 
202
- if (!this.collisionFBOs[collisionGroup]) {
203
- this.createFBO(gl, collisionGroup);
204
- }
182
+ channelInfo.layers.push(layer);
183
+ channelInfo.layerBounds.push(layer.getBounds());
205
184
 
206
- if (!this.channels[collisionGroup]) {
207
- this.channels[collisionGroup] = channelMap[collisionGroup];
185
+ if (!layer.isLoaded) {
186
+ channelInfo.allLayersLoaded = false;
208
187
  }
209
188
  }
189
+ } catch (err) {
190
+ _iterator.e(err);
191
+ } finally {
192
+ _iterator.f();
193
+ }
210
194
 
211
- for (var _i2 = 0, _Object$keys2 = Object.keys(this.collisionFBOs); _i2 < _Object$keys2.length; _i2++) {
212
- var _collisionGroup = _Object$keys2[_i2];
195
+ for (var _i = 0, _Object$keys = Object.keys(channelMap); _i < _Object$keys.length; _i++) {
196
+ var collisionGroup = _Object$keys[_i];
213
197
 
214
- if (!channelMap[_collisionGroup]) {
215
- this.destroyFBO(_collisionGroup);
216
- }
198
+ if (!this.collisionFBOs[collisionGroup]) {
199
+ this.createFBO(gl, collisionGroup);
217
200
  }
218
201
 
219
- return channelMap;
220
- }
221
- }, {
222
- key: "getModuleParameters",
223
- value: function getModuleParameters(layer) {
224
- var collisionGroup = layer.props.collisionGroup;
225
- var collisionFBOs = this.collisionFBOs,
226
- dummyCollisionMap = this.dummyCollisionMap;
227
- return {
228
- collisionFBO: collisionFBOs[collisionGroup],
229
- dummyCollisionMap: dummyCollisionMap
230
- };
231
- }
232
- }, {
233
- key: "cleanup",
234
- value: function cleanup() {
235
- if (this.dummyCollisionMap) {
236
- this.dummyCollisionMap.delete();
237
- this.dummyCollisionMap = undefined;
202
+ if (!this.channels[collisionGroup]) {
203
+ this.channels[collisionGroup] = channelMap[collisionGroup];
238
204
  }
205
+ }
239
206
 
240
- this.channels = {};
207
+ for (var _i2 = 0, _Object$keys2 = Object.keys(this.collisionFBOs); _i2 < _Object$keys2.length; _i2++) {
208
+ var _collisionGroup = _Object$keys2[_i2];
241
209
 
242
- for (var _i3 = 0, _Object$keys3 = Object.keys(this.collisionFBOs); _i3 < _Object$keys3.length; _i3++) {
243
- var collisionGroup = _Object$keys3[_i3];
244
- this.destroyFBO(collisionGroup);
210
+ if (!channelMap[_collisionGroup]) {
211
+ this.destroyFBO(_collisionGroup);
245
212
  }
213
+ }
246
214
 
247
- this.collisionFBOs = {};
248
- this.lastViewport = undefined;
215
+ return channelMap;
216
+ };
217
+
218
+ _proto.getModuleParameters = function getModuleParameters(layer) {
219
+ var collisionGroup = layer.props.collisionGroup;
220
+ var collisionFBOs = this.collisionFBOs,
221
+ dummyCollisionMap = this.dummyCollisionMap;
222
+ return {
223
+ collisionFBO: collisionFBOs[collisionGroup],
224
+ dummyCollisionMap: dummyCollisionMap
225
+ };
226
+ };
227
+
228
+ _proto.cleanup = function cleanup() {
229
+ if (this.dummyCollisionMap) {
230
+ this.dummyCollisionMap.delete();
231
+ this.dummyCollisionMap = undefined;
249
232
  }
250
- }, {
251
- key: "createFBO",
252
- value: function createFBO(gl, collisionGroup) {
253
- var _parameters, _attachments;
254
-
255
- var _gl$canvas = gl.canvas,
256
- width = _gl$canvas.width,
257
- height = _gl$canvas.height;
258
- var collisionMap = new _core.Texture2D(gl, {
259
- width: width,
260
- height: height,
261
- parameters: (_parameters = {}, (0, _defineProperty2.default)(_parameters, 10241, 9728), (0, _defineProperty2.default)(_parameters, 10240, 9728), (0, _defineProperty2.default)(_parameters, 10242, 33071), (0, _defineProperty2.default)(_parameters, 10243, 33071), _parameters)
262
- });
263
- var depthBuffer = new _core.Renderbuffer(gl, {
264
- format: 33189,
265
- width: width,
266
- height: height
267
- });
268
- this.collisionFBOs[collisionGroup] = new _core.Framebuffer(gl, {
269
- id: "Collision-".concat(collisionGroup),
270
- width: width,
271
- height: height,
272
- attachments: (_attachments = {}, (0, _defineProperty2.default)(_attachments, 36064, collisionMap), (0, _defineProperty2.default)(_attachments, 36096, depthBuffer), _attachments)
273
- });
233
+
234
+ this.channels = {};
235
+
236
+ for (var _i3 = 0, _Object$keys3 = Object.keys(this.collisionFBOs); _i3 < _Object$keys3.length; _i3++) {
237
+ var collisionGroup = _Object$keys3[_i3];
238
+ this.destroyFBO(collisionGroup);
274
239
  }
275
- }, {
276
- key: "destroyFBO",
277
- value: function destroyFBO(collisionGroup) {
278
- var fbo = this.collisionFBOs[collisionGroup];
279
-
280
- for (var _i4 = 0, _Object$values = Object.values(fbo.attachments); _i4 < _Object$values.length; _i4++) {
281
- var attachment = _Object$values[_i4];
282
- attachment.delete();
283
- }
284
240
 
285
- fbo.delete();
286
- delete this.collisionFBOs[collisionGroup];
241
+ this.collisionFBOs = {};
242
+ this.lastViewport = undefined;
243
+ };
244
+
245
+ _proto.createFBO = function createFBO(gl, collisionGroup) {
246
+ var _parameters, _attachments;
247
+
248
+ var _gl$canvas = gl.canvas,
249
+ width = _gl$canvas.width,
250
+ height = _gl$canvas.height;
251
+ var collisionMap = new _core.Texture2D(gl, {
252
+ width: width,
253
+ height: height,
254
+ parameters: (_parameters = {}, (0, _defineProperty2.default)(_parameters, 10241, 9728), (0, _defineProperty2.default)(_parameters, 10240, 9728), (0, _defineProperty2.default)(_parameters, 10242, 33071), (0, _defineProperty2.default)(_parameters, 10243, 33071), _parameters)
255
+ });
256
+ var depthBuffer = new _core.Renderbuffer(gl, {
257
+ format: 33189,
258
+ width: width,
259
+ height: height
260
+ });
261
+ this.collisionFBOs[collisionGroup] = new _core.Framebuffer(gl, {
262
+ id: "Collision-".concat(collisionGroup),
263
+ width: width,
264
+ height: height,
265
+ attachments: (_attachments = {}, (0, _defineProperty2.default)(_attachments, 36064, collisionMap), (0, _defineProperty2.default)(_attachments, 36096, depthBuffer), _attachments)
266
+ });
267
+ };
268
+
269
+ _proto.destroyFBO = function destroyFBO(collisionGroup) {
270
+ var fbo = this.collisionFBOs[collisionGroup];
271
+
272
+ for (var _i4 = 0, _Object$values = Object.values(fbo.attachments); _i4 < _Object$values.length; _i4++) {
273
+ var attachment = _Object$values[_i4];
274
+ attachment.delete();
287
275
  }
288
- }]);
276
+
277
+ fbo.delete();
278
+ delete this.collisionFBOs[collisionGroup];
279
+ };
280
+
289
281
  return CollisionFilterEffect;
290
282
  }();
291
283
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collision-filter/collision-filter-effect.ts"],"names":["DOWNSCALE","CollisionFilterEffect","gl","allEffects","effects","layers","layerFilter","viewports","onViewportActive","views","isPicking","preRenderStats","dummyCollisionMap","Texture2D","width","height","collisionLayers","filter","props","visible","collisionEnabled","length","channels","collisionFilterPass","CollisionFilterPass","id","e","constructor","MaskEffect","maskEffectRendered","didRender","_groupByCollisionGroup","viewport","viewportChanged","lastViewport","equals","collisionGroup","collisionFBO","collisionFBOs","renderInfo","resize","canvas","_render","oldRenderInfo","needsRender","layerBounds","some","b","i","allLayersLoaded","layer","transitions","renderCollisionMap","pass","moduleParameters","devicePixelRatio","channelMap","channelInfo","push","getBounds","isLoaded","Object","keys","createFBO","destroyFBO","delete","undefined","collisionMap","parameters","depthBuffer","Renderbuffer","format","Framebuffer","attachments","fbo","values","attachment"],"mappings":"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","sourcesContent":["import {Framebuffer, Renderbuffer, Texture2D, cssToDeviceRatio} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport {_deepEqual as deepEqual} from '@deck.gl/core';\nimport type {Effect, Layer, PreRenderOptions, Viewport} from '@deck.gl/core';\nimport CollisionFilterPass from './collision-filter-pass';\nimport MaskEffect, {MaskPreRenderStats} from '../mask/mask-effect';\n// import {debugFBO} from '../utils/debug';\n\ntype CollisionFilterExtensionProps = {\n collisionTestProps?: {};\n collisionGroup: string;\n};\n\n// Factor by which to downscale Collision FBO relative to canvas\nconst DOWNSCALE = 2;\n\ntype RenderInfo = {\n collisionGroup: string;\n layers: Layer<CollisionFilterExtensionProps>[];\n layerBounds: ([number[], number[]] | null)[];\n allLayersLoaded: boolean;\n};\n\nexport default class CollisionFilterEffect implements Effect {\n id = 'collision-filter-effect';\n props = null;\n useInPicking = true;\n order = 1;\n\n private channels: Record<string, RenderInfo> = {};\n private collisionFilterPass?: CollisionFilterPass;\n private collisionFBOs: Record<string, Framebuffer> = {};\n private dummyCollisionMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {\n effects: allEffects,\n layers,\n layerFilter,\n viewports,\n onViewportActive,\n views,\n isPicking,\n preRenderStats = {}\n }: PreRenderOptions\n ): void {\n if (!this.dummyCollisionMap) {\n this.dummyCollisionMap = new Texture2D(gl, {width: 1, height: 1});\n }\n\n if (isPicking) {\n // Do not update on picking pass\n return;\n }\n\n const collisionLayers = layers.filter(\n // @ts-ignore\n ({props: {visible, collisionEnabled}}) => visible && collisionEnabled\n ) as Layer<CollisionFilterExtensionProps>[];\n if (collisionLayers.length === 0) {\n this.channels = {};\n return;\n }\n\n if (!this.collisionFilterPass) {\n this.collisionFilterPass = new CollisionFilterPass(gl, {id: 'default-collision-filter'});\n }\n\n // Detect if mask has rendered. TODO: better dependency system for Effects\n const effects = allEffects?.filter(e => e.constructor === MaskEffect);\n const maskEffectRendered = (preRenderStats['mask-effect'] as MaskPreRenderStats)?.didRender;\n\n // Collect layers to render\n const channels = this._groupByCollisionGroup(gl, collisionLayers);\n\n const viewport = viewports[0];\n const viewportChanged =\n !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;\n\n // Resize framebuffers to match canvas\n for (const collisionGroup in channels) {\n const collisionFBO = this.collisionFBOs[collisionGroup];\n const renderInfo = channels[collisionGroup];\n collisionFBO.resize({\n width: gl.canvas.width / DOWNSCALE,\n height: gl.canvas.height / DOWNSCALE\n });\n this._render(renderInfo, {\n effects,\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n }\n\n // debugFBO(this.collisionFBOs[Object.keys(channels)[0]], {minimap: true});\n }\n\n private _render(\n renderInfo: RenderInfo,\n {\n effects,\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n effects: PreRenderOptions['effects'];\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ) {\n const {collisionGroup} = renderInfo;\n const oldRenderInfo = this.channels[collisionGroup];\n if (!oldRenderInfo) {\n return;\n }\n\n const needsRender =\n viewportChanged ||\n // If render info is new\n renderInfo === oldRenderInfo ||\n // If sublayers have changed\n !deepEqual(oldRenderInfo.layers, renderInfo.layers, 1) ||\n // If a sublayer's bounds have been updated\n renderInfo.layerBounds.some((b, i) => !equals(b, oldRenderInfo.layerBounds[i])) ||\n // If a sublayer's isLoaded state has been updated\n renderInfo.allLayersLoaded !== oldRenderInfo.allLayersLoaded ||\n // Some prop is in transition\n renderInfo.layers.some(layer => layer.props.transitions);\n\n this.channels[collisionGroup] = renderInfo;\n\n if (needsRender) {\n this.lastViewport = viewport;\n const collisionFBO = this.collisionFBOs[collisionGroup];\n\n // Rerender collision FBO\n this.collisionFilterPass!.renderCollisionMap(collisionFBO, {\n pass: 'collision-filter',\n isPicking: true,\n layers: renderInfo.layers,\n effects,\n layerFilter,\n viewports: viewport ? [viewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n // To avoid feedback loop forming between Framebuffer and active Texture.\n dummyCollisionMap: this.dummyCollisionMap,\n devicePixelRatio: cssToDeviceRatio(collisionFBO.gl) / DOWNSCALE\n }\n });\n }\n }\n\n /**\n * Group layers by collisionGroup\n * Returns a map from collisionGroup to render info\n */\n private _groupByCollisionGroup(\n gl: WebGLRenderingContext,\n collisionLayers: Layer<CollisionFilterExtensionProps>[]\n ): Record<string, RenderInfo> {\n const channelMap = {};\n for (const layer of collisionLayers) {\n const {collisionGroup} = layer.props;\n let channelInfo = channelMap[collisionGroup];\n if (!channelInfo) {\n channelInfo = {collisionGroup, layers: [], layerBounds: [], allLayersLoaded: true};\n channelMap[collisionGroup] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n if (!layer.isLoaded) {\n channelInfo.allLayersLoaded = false;\n }\n }\n\n // Create any new passes and remove any old ones\n for (const collisionGroup of Object.keys(channelMap)) {\n if (!this.collisionFBOs[collisionGroup]) {\n this.createFBO(gl, collisionGroup);\n }\n if (!this.channels[collisionGroup]) {\n this.channels[collisionGroup] = channelMap[collisionGroup];\n }\n }\n for (const collisionGroup of Object.keys(this.collisionFBOs)) {\n if (!channelMap[collisionGroup]) {\n this.destroyFBO(collisionGroup);\n }\n }\n\n return channelMap;\n }\n\n getModuleParameters(layer: Layer): {\n collisionFBO: Framebuffer;\n dummyCollisionMap: Texture2D;\n } {\n const {collisionGroup} = (layer as Layer<CollisionFilterExtensionProps>).props;\n const {collisionFBOs, dummyCollisionMap} = this;\n return {collisionFBO: collisionFBOs[collisionGroup], dummyCollisionMap};\n }\n\n cleanup(): void {\n if (this.dummyCollisionMap) {\n this.dummyCollisionMap.delete();\n this.dummyCollisionMap = undefined;\n }\n this.channels = {};\n for (const collisionGroup of Object.keys(this.collisionFBOs)) {\n this.destroyFBO(collisionGroup);\n }\n this.collisionFBOs = {};\n this.lastViewport = undefined;\n }\n\n createFBO(gl: WebGLRenderingContext, collisionGroup: string) {\n const {width, height} = gl.canvas;\n const collisionMap = new Texture2D(gl, {\n width,\n height,\n parameters: {\n [gl.TEXTURE_MIN_FILTER]: gl.NEAREST,\n [gl.TEXTURE_MAG_FILTER]: gl.NEAREST,\n [gl.TEXTURE_WRAP_S]: gl.CLAMP_TO_EDGE,\n [gl.TEXTURE_WRAP_T]: gl.CLAMP_TO_EDGE\n }\n });\n\n const depthBuffer = new Renderbuffer(gl, {format: gl.DEPTH_COMPONENT16, width, height});\n this.collisionFBOs[collisionGroup] = new Framebuffer(gl, {\n id: `Collision-${collisionGroup}`,\n width,\n height,\n attachments: {\n [gl.COLOR_ATTACHMENT0]: collisionMap,\n [gl.DEPTH_ATTACHMENT]: depthBuffer\n }\n });\n }\n\n destroyFBO(collisionGroup: string) {\n const fbo = this.collisionFBOs[collisionGroup];\n for (const attachment of Object.values(fbo.attachments as Texture2D[])) {\n attachment.delete();\n }\n fbo.delete();\n delete this.collisionFBOs[collisionGroup];\n }\n}\n"],"file":"collision-filter-effect.js"}
1
+ {"version":3,"sources":["../../../src/collision-filter/collision-filter-effect.ts"],"names":["DOWNSCALE","CollisionFilterEffect","id","props","useInPicking","order","channels","collisionFilterPass","collisionFBOs","dummyCollisionMap","lastViewport","preRender","gl","allEffects","effects","layers","layerFilter","viewports","onViewportActive","views","isPicking","preRenderStats","Texture2D","width","height","collisionLayers","filter","visible","collisionEnabled","length","CollisionFilterPass","e","constructor","MaskEffect","maskEffectRendered","didRender","_groupByCollisionGroup","viewport","viewportChanged","equals","collisionGroup","collisionFBO","renderInfo","resize","canvas","_render","oldRenderInfo","needsRender","layerBounds","some","b","i","allLayersLoaded","layer","transitions","renderCollisionMap","pass","moduleParameters","devicePixelRatio","channelMap","channelInfo","push","getBounds","isLoaded","Object","keys","createFBO","destroyFBO","getModuleParameters","cleanup","delete","undefined","collisionMap","parameters","depthBuffer","Renderbuffer","format","Framebuffer","attachments","fbo","values","attachment"],"mappings":"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","sourcesContent":["import {Framebuffer, Renderbuffer, Texture2D, cssToDeviceRatio} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport {_deepEqual as deepEqual} from '@deck.gl/core';\nimport type {Effect, Layer, PreRenderOptions, Viewport} from '@deck.gl/core';\nimport CollisionFilterPass from './collision-filter-pass';\nimport MaskEffect, {MaskPreRenderStats} from '../mask/mask-effect';\n// import {debugFBO} from '../utils/debug';\n\ntype CollisionFilterExtensionProps = {\n collisionTestProps?: {};\n collisionGroup: string;\n};\n\n// Factor by which to downscale Collision FBO relative to canvas\nconst DOWNSCALE = 2;\n\ntype RenderInfo = {\n collisionGroup: string;\n layers: Layer<CollisionFilterExtensionProps>[];\n layerBounds: ([number[], number[]] | null)[];\n allLayersLoaded: boolean;\n};\n\nexport default class CollisionFilterEffect implements Effect {\n id = 'collision-filter-effect';\n props = null;\n useInPicking = true;\n order = 1;\n\n private channels: Record<string, RenderInfo> = {};\n private collisionFilterPass?: CollisionFilterPass;\n private collisionFBOs: Record<string, Framebuffer> = {};\n private dummyCollisionMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {\n effects: allEffects,\n layers,\n layerFilter,\n viewports,\n onViewportActive,\n views,\n isPicking,\n preRenderStats = {}\n }: PreRenderOptions\n ): void {\n if (!this.dummyCollisionMap) {\n this.dummyCollisionMap = new Texture2D(gl, {width: 1, height: 1});\n }\n\n if (isPicking) {\n // Do not update on picking pass\n return;\n }\n\n const collisionLayers = layers.filter(\n // @ts-ignore\n ({props: {visible, collisionEnabled}}) => visible && collisionEnabled\n ) as Layer<CollisionFilterExtensionProps>[];\n if (collisionLayers.length === 0) {\n this.channels = {};\n return;\n }\n\n if (!this.collisionFilterPass) {\n this.collisionFilterPass = new CollisionFilterPass(gl, {id: 'default-collision-filter'});\n }\n\n // Detect if mask has rendered. TODO: better dependency system for Effects\n const effects = allEffects?.filter(e => e.constructor === MaskEffect);\n const maskEffectRendered = (preRenderStats['mask-effect'] as MaskPreRenderStats)?.didRender;\n\n // Collect layers to render\n const channels = this._groupByCollisionGroup(gl, collisionLayers);\n\n const viewport = viewports[0];\n const viewportChanged =\n !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;\n\n // Resize framebuffers to match canvas\n for (const collisionGroup in channels) {\n const collisionFBO = this.collisionFBOs[collisionGroup];\n const renderInfo = channels[collisionGroup];\n collisionFBO.resize({\n width: gl.canvas.width / DOWNSCALE,\n height: gl.canvas.height / DOWNSCALE\n });\n this._render(renderInfo, {\n effects,\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n }\n\n // debugFBO(this.collisionFBOs[Object.keys(channels)[0]], {minimap: true});\n }\n\n private _render(\n renderInfo: RenderInfo,\n {\n effects,\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n effects: PreRenderOptions['effects'];\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ) {\n const {collisionGroup} = renderInfo;\n const oldRenderInfo = this.channels[collisionGroup];\n if (!oldRenderInfo) {\n return;\n }\n\n const needsRender =\n viewportChanged ||\n // If render info is new\n renderInfo === oldRenderInfo ||\n // If sublayers have changed\n !deepEqual(oldRenderInfo.layers, renderInfo.layers, 1) ||\n // If a sublayer's bounds have been updated\n renderInfo.layerBounds.some((b, i) => !equals(b, oldRenderInfo.layerBounds[i])) ||\n // If a sublayer's isLoaded state has been updated\n renderInfo.allLayersLoaded !== oldRenderInfo.allLayersLoaded ||\n // Some prop is in transition\n renderInfo.layers.some(layer => layer.props.transitions);\n\n this.channels[collisionGroup] = renderInfo;\n\n if (needsRender) {\n this.lastViewport = viewport;\n const collisionFBO = this.collisionFBOs[collisionGroup];\n\n // Rerender collision FBO\n this.collisionFilterPass!.renderCollisionMap(collisionFBO, {\n pass: 'collision-filter',\n isPicking: true,\n layers: renderInfo.layers,\n effects,\n layerFilter,\n viewports: viewport ? [viewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n // To avoid feedback loop forming between Framebuffer and active Texture.\n dummyCollisionMap: this.dummyCollisionMap,\n devicePixelRatio: cssToDeviceRatio(collisionFBO.gl) / DOWNSCALE\n }\n });\n }\n }\n\n /**\n * Group layers by collisionGroup\n * Returns a map from collisionGroup to render info\n */\n private _groupByCollisionGroup(\n gl: WebGLRenderingContext,\n collisionLayers: Layer<CollisionFilterExtensionProps>[]\n ): Record<string, RenderInfo> {\n const channelMap = {};\n for (const layer of collisionLayers) {\n const {collisionGroup} = layer.props;\n let channelInfo = channelMap[collisionGroup];\n if (!channelInfo) {\n channelInfo = {collisionGroup, layers: [], layerBounds: [], allLayersLoaded: true};\n channelMap[collisionGroup] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n if (!layer.isLoaded) {\n channelInfo.allLayersLoaded = false;\n }\n }\n\n // Create any new passes and remove any old ones\n for (const collisionGroup of Object.keys(channelMap)) {\n if (!this.collisionFBOs[collisionGroup]) {\n this.createFBO(gl, collisionGroup);\n }\n if (!this.channels[collisionGroup]) {\n this.channels[collisionGroup] = channelMap[collisionGroup];\n }\n }\n for (const collisionGroup of Object.keys(this.collisionFBOs)) {\n if (!channelMap[collisionGroup]) {\n this.destroyFBO(collisionGroup);\n }\n }\n\n return channelMap;\n }\n\n getModuleParameters(layer: Layer): {\n collisionFBO: Framebuffer;\n dummyCollisionMap: Texture2D;\n } {\n const {collisionGroup} = (layer as Layer<CollisionFilterExtensionProps>).props;\n const {collisionFBOs, dummyCollisionMap} = this;\n return {collisionFBO: collisionFBOs[collisionGroup], dummyCollisionMap};\n }\n\n cleanup(): void {\n if (this.dummyCollisionMap) {\n this.dummyCollisionMap.delete();\n this.dummyCollisionMap = undefined;\n }\n this.channels = {};\n for (const collisionGroup of Object.keys(this.collisionFBOs)) {\n this.destroyFBO(collisionGroup);\n }\n this.collisionFBOs = {};\n this.lastViewport = undefined;\n }\n\n createFBO(gl: WebGLRenderingContext, collisionGroup: string) {\n const {width, height} = gl.canvas;\n const collisionMap = new Texture2D(gl, {\n width,\n height,\n parameters: {\n [gl.TEXTURE_MIN_FILTER]: gl.NEAREST,\n [gl.TEXTURE_MAG_FILTER]: gl.NEAREST,\n [gl.TEXTURE_WRAP_S]: gl.CLAMP_TO_EDGE,\n [gl.TEXTURE_WRAP_T]: gl.CLAMP_TO_EDGE\n }\n });\n\n const depthBuffer = new Renderbuffer(gl, {format: gl.DEPTH_COMPONENT16, width, height});\n this.collisionFBOs[collisionGroup] = new Framebuffer(gl, {\n id: `Collision-${collisionGroup}`,\n width,\n height,\n attachments: {\n [gl.COLOR_ATTACHMENT0]: collisionMap,\n [gl.DEPTH_ATTACHMENT]: depthBuffer\n }\n });\n }\n\n destroyFBO(collisionGroup: string) {\n const fbo = this.collisionFBOs[collisionGroup];\n for (const attachment of Object.values(fbo.attachments as Texture2D[])) {\n attachment.delete();\n }\n fbo.delete();\n delete this.collisionFBOs[collisionGroup];\n }\n}\n"],"file":"collision-filter-effect.js"}