@deck.gl/extensions 8.10.0-alpha.4 → 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.
- package/dist/dist.dev.js +38 -660
- package/dist/es5/brushing/brushing-extension.js +48 -54
- package/dist/es5/brushing/brushing-extension.js.map +1 -1
- package/dist/es5/clip/clip-extension.js +32 -37
- package/dist/es5/clip/clip-extension.js.map +1 -1
- package/dist/es5/collision-filter/collision-filter-effect.js +217 -225
- package/dist/es5/collision-filter/collision-filter-effect.js.map +1 -1
- package/dist/es5/collision-filter/collision-filter-extension.js +49 -56
- package/dist/es5/collision-filter/collision-filter-extension.js.map +1 -1
- package/dist/es5/collision-filter/collision-filter-pass.js +31 -34
- package/dist/es5/collision-filter/collision-filter-pass.js.map +1 -1
- package/dist/es5/data-filter/data-filter-extension.js +126 -132
- package/dist/es5/data-filter/data-filter-extension.js.map +1 -1
- package/dist/es5/fill-style/fill-style-extension.js +101 -109
- package/dist/es5/fill-style/fill-style-extension.js.map +1 -1
- package/dist/es5/fp64/fp64-extension.js +12 -16
- package/dist/es5/fp64/fp64-extension.js.map +1 -1
- package/dist/es5/mask/mask-effect.js +208 -216
- package/dist/es5/mask/mask-effect.js.map +1 -1
- package/dist/es5/mask/mask-extension.js +57 -63
- package/dist/es5/mask/mask-extension.js.map +1 -1
- package/dist/es5/mask/mask-pass.js +36 -42
- package/dist/es5/mask/mask-pass.js.map +1 -1
- package/dist/es5/path-style/path-style-extension.js +81 -89
- package/dist/es5/path-style/path-style-extension.js.map +1 -1
- package/dist/es5/terrain/height-map-builder.js +73 -80
- package/dist/es5/terrain/height-map-builder.js.map +1 -1
- package/dist/es5/terrain/terrain-cover.js +155 -162
- package/dist/es5/terrain/terrain-cover.js.map +1 -1
- package/dist/es5/terrain/terrain-effect.js +233 -242
- package/dist/es5/terrain/terrain-effect.js.map +1 -1
- package/dist/es5/terrain/terrain-extension.js +44 -51
- package/dist/es5/terrain/terrain-extension.js.map +1 -1
- package/dist/es5/terrain/terrain-pass.js +61 -65
- package/dist/es5/terrain/terrain-pass.js.map +1 -1
- package/dist/es5/terrain/terrain-picking-pass.js +56 -62
- package/dist/es5/terrain/terrain-picking-pass.js.map +1 -1
- package/dist/esm/brushing/brushing-extension.js +2 -5
- package/dist/esm/brushing/brushing-extension.js.map +1 -1
- package/dist/esm/brushing/shader-module.js +67 -4
- package/dist/esm/brushing/shader-module.js.map +1 -1
- package/dist/esm/clip/clip-extension.js +33 -14
- package/dist/esm/clip/clip-extension.js.map +1 -1
- package/dist/esm/collision-filter/collision-filter-effect.js +10 -19
- package/dist/esm/collision-filter/collision-filter-effect.js.map +1 -1
- package/dist/esm/collision-filter/collision-filter-extension.js +2 -5
- package/dist/esm/collision-filter/collision-filter-extension.js.map +1 -1
- package/dist/esm/collision-filter/shader-module.js +76 -4
- package/dist/esm/collision-filter/shader-module.js.map +1 -1
- package/dist/esm/data-filter/aggregator.js +45 -2
- package/dist/esm/data-filter/aggregator.js.map +1 -1
- package/dist/esm/data-filter/data-filter-extension.js +2 -5
- package/dist/esm/data-filter/data-filter-extension.js.map +1 -1
- package/dist/esm/data-filter/shader-module.js +86 -6
- package/dist/esm/data-filter/shader-module.js.map +1 -1
- package/dist/esm/fill-style/fill-style-extension.js +2 -5
- package/dist/esm/fill-style/fill-style-extension.js.map +1 -1
- package/dist/esm/fill-style/shaders.glsl.js +60 -5
- package/dist/esm/fill-style/shaders.glsl.js.map +1 -1
- package/dist/esm/fp64/fp64-extension.js +1 -3
- package/dist/esm/fp64/fp64-extension.js.map +1 -1
- package/dist/esm/fp64/project64.glsl.js +81 -1
- package/dist/esm/fp64/project64.glsl.js.map +1 -1
- package/dist/esm/mask/mask-effect.js +10 -20
- package/dist/esm/mask/mask-effect.js.map +1 -1
- package/dist/esm/mask/mask-extension.js +3 -6
- package/dist/esm/mask/mask-extension.js.map +1 -1
- package/dist/esm/mask/mask-pass.js +2 -6
- package/dist/esm/mask/mask-pass.js.map +1 -1
- package/dist/esm/mask/shader-module.js +61 -6
- package/dist/esm/mask/shader-module.js.map +1 -1
- package/dist/esm/path-style/path-style-extension.js +2 -5
- package/dist/esm/path-style/path-style-extension.js.map +1 -1
- package/dist/esm/path-style/shaders.glsl.js +79 -8
- package/dist/esm/path-style/shaders.glsl.js.map +1 -1
- package/dist/esm/terrain/height-map-builder.js +8 -17
- package/dist/esm/terrain/height-map-builder.js.map +1 -1
- package/dist/esm/terrain/shader-module.js +59 -7
- package/dist/esm/terrain/shader-module.js.map +1 -1
- package/dist/esm/terrain/terrain-cover.js +11 -22
- package/dist/esm/terrain/terrain-cover.js.map +1 -1
- package/dist/esm/terrain/terrain-effect.js +11 -21
- package/dist/esm/terrain/terrain-effect.js.map +1 -1
- package/dist/esm/terrain/terrain-extension.js +2 -5
- package/dist/esm/terrain/terrain-extension.js.map +1 -1
- package/dist/esm/terrain/terrain-pass.js +1 -1
- package/dist/esm/terrain/terrain-pass.js.map +1 -1
- package/dist/esm/terrain/terrain-picking-pass.js +2 -4
- package/dist/esm/terrain/terrain-picking-pass.js.map +1 -1
- package/dist.min.js +36 -35
- package/package.json +2 -2
|
@@ -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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
71
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
87
|
-
this.collisionFilterPass = new _collisionFilterPass.default(gl, {
|
|
88
|
-
id: 'default-collision-filter'
|
|
89
|
-
});
|
|
90
|
-
}
|
|
95
|
+
var channels = this._groupByCollisionGroup(gl, collisionLayers);
|
|
91
96
|
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
203
|
-
|
|
204
|
-
}
|
|
182
|
+
channelInfo.layers.push(layer);
|
|
183
|
+
channelInfo.layerBounds.push(layer.getBounds());
|
|
205
184
|
|
|
206
|
-
if (!
|
|
207
|
-
|
|
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
|
-
|
|
212
|
-
|
|
195
|
+
for (var _i = 0, _Object$keys = Object.keys(channelMap); _i < _Object$keys.length; _i++) {
|
|
196
|
+
var collisionGroup = _Object$keys[_i];
|
|
213
197
|
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
198
|
+
if (!this.collisionFBOs[collisionGroup]) {
|
|
199
|
+
this.createFBO(gl, collisionGroup);
|
|
217
200
|
}
|
|
218
201
|
|
|
219
|
-
|
|
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
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
this.destroyFBO(collisionGroup);
|
|
210
|
+
if (!channelMap[_collisionGroup]) {
|
|
211
|
+
this.destroyFBO(_collisionGroup);
|
|
245
212
|
}
|
|
213
|
+
}
|
|
246
214
|
|
|
247
|
-
|
|
248
|
-
|
|
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
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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
|
-
|
|
286
|
-
|
|
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"}
|