angular-three-soba 2.0.0 → 2.2.0

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 (72) hide show
  1. package/abstractions/lib/catmull-rom-line.d.ts +148 -148
  2. package/abstractions/lib/edges.d.ts +166 -166
  3. package/abstractions/lib/grid.d.ts +30 -30
  4. package/abstractions/lib/line.d.ts +2 -2
  5. package/abstractions/lib/prism-geometry.d.ts +4 -4
  6. package/abstractions/lib/rounded-box.d.ts +1 -1
  7. package/abstractions/lib/text-3d.d.ts +37 -37
  8. package/abstractions/lib/text.d.ts +2 -2
  9. package/cameras/lib/cube-camera.d.ts +1 -1
  10. package/cameras/lib/orthographic-camera.d.ts +1 -1
  11. package/cameras/lib/perspective-camera.d.ts +1 -1
  12. package/controls/index.d.ts +9 -1
  13. package/controls/lib/camera-controls.d.ts +1 -1
  14. package/controls/lib/orbit-controls.d.ts +1 -1
  15. package/esm2022/controls/index.mjs +6 -2
  16. package/esm2022/gizmos/angular-three-soba-gizmos.mjs +5 -0
  17. package/esm2022/gizmos/index.mjs +6 -0
  18. package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +187 -0
  19. package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +304 -0
  20. package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +332 -0
  21. package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +263 -0
  22. package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +264 -0
  23. package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +340 -0
  24. package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +266 -0
  25. package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +232 -0
  26. package/esm2022/gizmos/lib/transform-controls.mjs +177 -0
  27. package/esm2022/staging/index.mjs +2 -1
  28. package/esm2022/staging/lib/mask.mjs +78 -0
  29. package/fesm2022/angular-three-soba-controls.mjs +14 -1337
  30. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  31. package/fesm2022/angular-three-soba-gizmos.mjs +2319 -0
  32. package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -0
  33. package/fesm2022/angular-three-soba-staging.mjs +92 -21
  34. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  35. package/gizmos/README.md +3 -0
  36. package/gizmos/index.d.ts +5 -0
  37. package/gizmos/lib/gizmo-helper/gizmo-helper.d.ts +45 -0
  38. package/gizmos/lib/gizmo-helper/gizmo-viewcube.d.ts +74 -0
  39. package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +64 -0
  40. package/{controls → gizmos}/lib/pivot-controls/pivot-controls.d.ts +1 -1
  41. package/gizmos/lib/transform-controls.d.ts +50 -0
  42. package/materials/lib/custom-shader-material.d.ts +3 -3
  43. package/materials/lib/mesh-refraction-material.d.ts +3 -3
  44. package/materials/lib/mesh-transmission-material.d.ts +1 -1
  45. package/misc/lib/computed-attribute.d.ts +5 -5
  46. package/misc/lib/decal.d.ts +1 -1
  47. package/misc/lib/html/html.d.ts +1 -1
  48. package/misc/lib/sampler.d.ts +1 -1
  49. package/package.json +18 -12
  50. package/performances/lib/instances/instances.d.ts +9 -9
  51. package/performances/lib/points/points.d.ts +20 -20
  52. package/performances/lib/segments/segments.d.ts +4 -4
  53. package/shaders/lib/mesh-refraction-material.d.ts +2 -2
  54. package/staging/index.d.ts +1 -0
  55. package/staging/lib/caustics.d.ts +1 -1
  56. package/staging/lib/center.d.ts +2 -2
  57. package/staging/lib/contact-shadows.d.ts +1 -1
  58. package/staging/lib/lightformer.d.ts +1 -1
  59. package/staging/lib/mask.d.ts +30 -0
  60. package/staging/lib/render-texture.d.ts +1 -1
  61. package/staging/lib/sky.d.ts +1 -1
  62. package/staging/lib/spot-light.d.ts +2 -2
  63. package/staging/lib/stage.d.ts +6 -6
  64. package/esm2022/controls/lib/pivot-controls/axis-arrow.mjs +0 -263
  65. package/esm2022/controls/lib/pivot-controls/axis-rotator.mjs +0 -264
  66. package/esm2022/controls/lib/pivot-controls/pivot-controls.mjs +0 -340
  67. package/esm2022/controls/lib/pivot-controls/plane-slider.mjs +0 -266
  68. package/esm2022/controls/lib/pivot-controls/scaling-sphere.mjs +0 -232
  69. /package/{controls → gizmos}/lib/pivot-controls/axis-arrow.d.ts +0 -0
  70. /package/{controls → gizmos}/lib/pivot-controls/axis-rotator.d.ts +0 -0
  71. /package/{controls → gizmos}/lib/pivot-controls/plane-slider.d.ts +0 -0
  72. /package/{controls → gizmos}/lib/pivot-controls/scaling-sphere.d.ts +0 -0
@@ -0,0 +1,177 @@
1
+ import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, effect, input, output, viewChild, } from '@angular/core';
2
+ import { extend, getLocalState, injectStore, NgtArgs, omit, pick, resolveRef, } from 'angular-three';
3
+ import { Group } from 'three';
4
+ import { TransformControls } from 'three-stdlib';
5
+ import * as i0 from "@angular/core";
6
+ export class NgtsTransformControls {
7
+ constructor() {
8
+ this.object = input(null);
9
+ this.options = input({});
10
+ this.parameters = omit(this.options, [
11
+ 'enabled',
12
+ 'axis',
13
+ 'mode',
14
+ 'translationSnap',
15
+ 'rotationSnap',
16
+ 'scaleSnap',
17
+ 'space',
18
+ 'size',
19
+ 'showX',
20
+ 'showY',
21
+ 'showZ',
22
+ 'domElement',
23
+ 'makeDefault',
24
+ 'camera',
25
+ ]);
26
+ this.controlsOptions = pick(this.options, [
27
+ 'enabled',
28
+ 'axis',
29
+ 'mode',
30
+ 'translationSnap',
31
+ 'rotationSnap',
32
+ 'scaleSnap',
33
+ 'space',
34
+ 'size',
35
+ 'showX',
36
+ 'showY',
37
+ 'showZ',
38
+ ]);
39
+ this.camera = pick(this.options, 'camera');
40
+ this.domElement = pick(this.options, 'domElement');
41
+ this.makeDefault = pick(this.options, 'makeDefault');
42
+ this.change = output();
43
+ this.mouseDown = output();
44
+ this.mouseUp = output();
45
+ this.objectChange = output();
46
+ this.groupRef = viewChild.required('group');
47
+ this.store = injectStore();
48
+ this.glDomElement = this.store.select('gl', 'domElement');
49
+ this.defaultCamera = this.store.select('camera');
50
+ this.events = this.store.select('events');
51
+ this.defaultControls = this.store.select('controls');
52
+ this.invalidate = this.store.select('invalidate');
53
+ this.controls = computed(() => {
54
+ let camera = this.camera();
55
+ if (!camera) {
56
+ camera = this.defaultCamera();
57
+ }
58
+ let domElement = this.domElement();
59
+ if (!domElement) {
60
+ domElement = this.events().connected || this.glDomElement();
61
+ }
62
+ return new TransformControls(camera, domElement);
63
+ });
64
+ extend({ Group });
65
+ effect((onCleanup) => {
66
+ const cleanup = this.attachControlsEffect();
67
+ onCleanup(() => cleanup?.());
68
+ });
69
+ effect((onCleanup) => {
70
+ const cleanup = this.disableDefaultControlsEffect();
71
+ onCleanup(() => cleanup?.());
72
+ });
73
+ effect((onCleanup) => {
74
+ const cleanup = this.setupControlsEventsEffect();
75
+ onCleanup(() => cleanup?.());
76
+ });
77
+ effect((onCleanup) => {
78
+ const cleanup = this.updateDefaultControlsEffect();
79
+ onCleanup(() => cleanup?.());
80
+ });
81
+ }
82
+ attachControlsEffect() {
83
+ const group = this.groupRef().nativeElement;
84
+ if (!group)
85
+ return;
86
+ const localState = getLocalState(group);
87
+ if (!localState)
88
+ return;
89
+ const [object, controls] = [resolveRef(this.object()), this.controls(), localState.objects()];
90
+ if (object) {
91
+ controls.attach(object);
92
+ }
93
+ else {
94
+ controls.attach(group);
95
+ }
96
+ return () => controls.detach();
97
+ }
98
+ disableDefaultControlsEffect() {
99
+ const defaultControls = this.defaultControls();
100
+ if (!defaultControls)
101
+ return;
102
+ const controls = this.controls();
103
+ const callback = (event) => {
104
+ defaultControls.enabled = !event.value;
105
+ };
106
+ // @ts-expect-error - three-stdlib types are not up-to-date
107
+ controls.addEventListener('dragging-changed', callback);
108
+ return () => {
109
+ // @ts-expect-error - three-stdlib types are not up-to-date
110
+ controls.removeEventListener('dragging-changed', callback);
111
+ };
112
+ }
113
+ setupControlsEventsEffect() {
114
+ const [controls, invalidate] = [this.controls(), this.invalidate()];
115
+ const onChange = (event) => {
116
+ invalidate();
117
+ if (!this.change['destroyed']) {
118
+ this.change.emit(event);
119
+ }
120
+ };
121
+ const onMouseDown = this.mouseDown.emit.bind(this.mouseDown);
122
+ const onMouseUp = this.mouseUp.emit.bind(this.mouseUp);
123
+ const onObjectChange = this.objectChange.emit.bind(this.objectChange);
124
+ // @ts-expect-error - three-stdlib types are not up-to-date
125
+ controls.addEventListener('change', onChange);
126
+ // @ts-expect-error - three-stdlib types are not up-to-date
127
+ controls.addEventListener('mouseDown', onMouseDown);
128
+ // @ts-expect-error - three-stdlib types are not up-to-date
129
+ controls.addEventListener('mouseUp', onMouseUp);
130
+ // @ts-expect-error - three-stdlib types are not up-to-date
131
+ controls.addEventListener('objectChange', onObjectChange);
132
+ return () => {
133
+ // @ts-expect-error - three-stdlib types are not up-to-date
134
+ controls.removeEventListener('change', onChange);
135
+ // @ts-expect-error - three-stdlib types are not up-to-date
136
+ controls.removeEventListener('mouseDown', onMouseDown);
137
+ // @ts-expect-error - three-stdlib types are not up-to-date
138
+ controls.removeEventListener('mouseUp', onMouseUp);
139
+ // @ts-expect-error - three-stdlib types are not up-to-date
140
+ controls.removeEventListener('objectChange', onObjectChange);
141
+ };
142
+ }
143
+ updateDefaultControlsEffect() {
144
+ const [controls, makeDefault] = [this.controls(), this.makeDefault()];
145
+ if (!makeDefault)
146
+ return;
147
+ const oldControls = this.store.snapshot.controls;
148
+ this.store.update({ controls });
149
+ return () => this.store.update(() => ({ controls: oldControls }));
150
+ }
151
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsTransformControls, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
152
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.0", type: NgtsTransformControls, isStandalone: true, selector: "ngts-transform-controls", inputs: { object: { classPropertyName: "object", publicName: "object", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { change: "change", mouseDown: "mouseDown", mouseUp: "mouseUp", objectChange: "objectChange" }, viewQueries: [{ propertyName: "groupRef", first: true, predicate: ["group"], descendants: true, isSignal: true }], ngImport: i0, template: `
153
+ <ngt-primitive *args="[controls()]" [parameters]="controlsOptions()" />
154
+
155
+ <ngt-group #group [parameters]="parameters()">
156
+ <ng-content />
157
+ </ngt-group>
158
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
159
+ }
160
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsTransformControls, decorators: [{
161
+ type: Component,
162
+ args: [{
163
+ selector: 'ngts-transform-controls',
164
+ standalone: true,
165
+ template: `
166
+ <ngt-primitive *args="[controls()]" [parameters]="controlsOptions()" />
167
+
168
+ <ngt-group #group [parameters]="parameters()">
169
+ <ng-content />
170
+ </ngt-group>
171
+ `,
172
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
173
+ changeDetection: ChangeDetectionStrategy.OnPush,
174
+ imports: [NgtArgs],
175
+ }]
176
+ }], ctorParameters: () => [] });
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLWNvbnRyb2xzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL2dpem1vcy9zcmMvbGliL3RyYW5zZm9ybS1jb250cm9scy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1Isc0JBQXNCLEVBQ3RCLE1BQU0sRUFFTixLQUFLLEVBQ0wsTUFBTSxFQUVOLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ04sTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUdQLElBQUksRUFDSixJQUFJLEVBQ0osVUFBVSxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBVSxLQUFLLEVBQWlDLE1BQU0sT0FBTyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUF3Q2pELE1BQU0sT0FBTyxxQkFBcUI7SUFrRWpDO1FBakVBLFdBQU0sR0FBRyxLQUFLLENBQXFELElBQUksQ0FBQyxDQUFDO1FBQ3pFLFlBQU8sR0FBRyxLQUFLLENBQUMsRUFBMkMsQ0FBQyxDQUFDO1FBQzdELGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMvQixTQUFTO1lBQ1QsTUFBTTtZQUNOLE1BQU07WUFDTixpQkFBaUI7WUFDakIsY0FBYztZQUNkLFdBQVc7WUFDWCxPQUFPO1lBQ1AsTUFBTTtZQUNOLE9BQU87WUFDUCxPQUFPO1lBQ1AsT0FBTztZQUNQLFlBQVk7WUFDWixhQUFhO1lBQ2IsUUFBUTtTQUNSLENBQUMsQ0FBQztRQUVPLG9CQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDOUMsU0FBUztZQUNULE1BQU07WUFDTixNQUFNO1lBQ04saUJBQWlCO1lBQ2pCLGNBQWM7WUFDZCxXQUFXO1lBQ1gs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Q0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdGVmZmVjdCxcblx0RWxlbWVudFJlZixcblx0aW5wdXQsXG5cdG91dHB1dCxcblx0U2lnbmFsLFxuXHR2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0ZXh0ZW5kLFxuXHRnZXRMb2NhbFN0YXRlLFxuXHRpbmplY3RTdG9yZSxcblx0Tmd0QXJncyxcblx0Tmd0R3JvdXAsXG5cdE5ndE9iamVjdDNETm9kZSxcblx0b21pdCxcblx0cGljayxcblx0cmVzb2x2ZVJlZixcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBDYW1lcmEsIEdyb3VwLCBPYmplY3QzRCwgRXZlbnQgYXMgVGhyZWVFdmVudCB9IGZyb20gJ3RocmVlJztcbmltcG9ydCB7IFRyYW5zZm9ybUNvbnRyb2xzIH0gZnJvbSAndGhyZWUtc3RkbGliJztcblxuaW50ZXJmYWNlIENvbnRyb2xzUHJvdG8ge1xuXHRlbmFibGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBOZ3RzVHJhbnNmb3JtQ29udHJvbHNPYmplY3QgPSBOZ3RPYmplY3QzRE5vZGU8VHJhbnNmb3JtQ29udHJvbHMsIHR5cGVvZiBUcmFuc2Zvcm1Db250cm9scz47XG5cbmV4cG9ydCB0eXBlIE5ndHNUcmFuc2Zvcm1Db250cm9sc09wdGlvbnMgPSBQYXJ0aWFsPE5ndHNUcmFuc2Zvcm1Db250cm9sc09iamVjdD4gJlxuXHRQYXJ0aWFsPE5ndEdyb3VwPiAmIHtcblx0XHRlbmFibGVkPzogYm9vbGVhbjtcblx0XHRheGlzPzogc3RyaW5nIHwgbnVsbDtcblx0XHRkb21FbGVtZW50PzogSFRNTEVsZW1lbnQ7XG5cdFx0bW9kZT86ICd0cmFuc2xhdGUnIHwgJ3JvdGF0ZScgfCAnc2NhbGUnO1xuXHRcdHRyYW5zbGF0aW9uU25hcD86IG51bWJlciB8IG51bGw7XG5cdFx0cm90YXRpb25TbmFwPzogbnVtYmVyIHwgbnVsbDtcblx0XHRzY2FsZVNuYXA/OiBudW1iZXIgfCBudWxsO1xuXHRcdHNwYWNlPzogJ3dvcmxkJyB8ICdsb2NhbCc7XG5cdFx0c2l6ZT86IG51bWJlcjtcblx0XHRzaG93WD86IGJvb2xlYW47XG5cdFx0c2hvd1k/OiBib29sZWFuO1xuXHRcdHNob3daPzogYm9vbGVhbjtcblx0XHRjYW1lcmE/OiBDYW1lcmE7XG5cdFx0bWFrZURlZmF1bHQ/OiBib29sZWFuO1xuXHR9O1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLXRyYW5zZm9ybS1jb250cm9scycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wcmltaXRpdmUgKmFyZ3M9XCJbY29udHJvbHMoKV1cIiBbcGFyYW1ldGVyc109XCJjb250cm9sc09wdGlvbnMoKVwiIC8+XG5cblx0XHQ8bmd0LWdyb3VwICNncm91cCBbcGFyYW1ldGVyc109XCJwYXJhbWV0ZXJzKClcIj5cblx0XHRcdDxuZy1jb250ZW50IC8+XG5cdFx0PC9uZ3QtZ3JvdXA+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c1RyYW5zZm9ybUNvbnRyb2xzIHtcblx0b2JqZWN0ID0gaW5wdXQ8T2JqZWN0M0QgfCBFbGVtZW50UmVmPE9iamVjdDNEPiB8IHVuZGVmaW5lZCB8IG51bGw+KG51bGwpO1xuXHRvcHRpb25zID0gaW5wdXQoe30gYXMgUGFydGlhbDxOZ3RzVHJhbnNmb3JtQ29udHJvbHNPcHRpb25zPik7XG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgW1xuXHRcdCdlbmFibGVkJyxcblx0XHQnYXhpcycsXG5cdFx0J21vZGUnLFxuXHRcdCd0cmFuc2xhdGlvblNuYXAnLFxuXHRcdCdyb3RhdGlvblNuYXAnLFxuXHRcdCdzY2FsZVNuYXAnLFxuXHRcdCdzcGFjZScsXG5cdFx0J3NpemUnLFxuXHRcdCdzaG93WCcsXG5cdFx0J3Nob3dZJyxcblx0XHQnc2hvd1onLFxuXHRcdCdkb21FbGVtZW50Jyxcblx0XHQnbWFrZURlZmF1bHQnLFxuXHRcdCdjYW1lcmEnLFxuXHRdKTtcblxuXHRwcm90ZWN0ZWQgY29udHJvbHNPcHRpb25zID0gcGljayh0aGlzLm9wdGlvbnMsIFtcblx0XHQnZW5hYmxlZCcsXG5cdFx0J2F4aXMnLFxuXHRcdCdtb2RlJyxcblx0XHQndHJhbnNsYXRpb25TbmFwJyxcblx0XHQncm90YXRpb25TbmFwJyxcblx0XHQnc2NhbGVTbmFwJyxcblx0XHQnc3BhY2UnLFxuXHRcdCdzaXplJyxcblx0XHQnc2hvd1gnLFxuXHRcdCdzaG93WScsXG5cdFx0J3Nob3daJyxcblx0XSk7XG5cblx0cHJpdmF0ZSBjYW1lcmEgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2NhbWVyYScpO1xuXHRwcml2YXRlIGRvbUVsZW1lbnQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2RvbUVsZW1lbnQnKTtcblx0cHJpdmF0ZSBtYWtlRGVmYXVsdCA9IHBpY2sodGhpcy5vcHRpb25zLCAnbWFrZURlZmF1bHQnKTtcblxuXHRjaGFuZ2UgPSBvdXRwdXQ8VGhyZWVFdmVudD4oKTtcblx0bW91c2VEb3duID0gb3V0cHV0PFRocmVlRXZlbnQ+KCk7XG5cdG1vdXNlVXAgPSBvdXRwdXQ8VGhyZWVFdmVudD4oKTtcblx0b2JqZWN0Q2hhbmdlID0gb3V0cHV0PFRocmVlRXZlbnQ+KCk7XG5cblx0cHJpdmF0ZSBncm91cFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEdyb3VwPj4oJ2dyb3VwJyk7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdFN0b3JlKCk7XG5cdHByaXZhdGUgZ2xEb21FbGVtZW50ID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2dsJywgJ2RvbUVsZW1lbnQnKTtcblx0cHJpdmF0ZSBkZWZhdWx0Q2FtZXJhID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2NhbWVyYScpO1xuXHRwcml2YXRlIGV2ZW50cyA9IHRoaXMuc3RvcmUuc2VsZWN0KCdldmVudHMnKTtcblx0cHJpdmF0ZSBkZWZhdWx0Q29udHJvbHMgPSB0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSBhcyB1bmtub3duIGFzIFNpZ25hbDxDb250cm9sc1Byb3RvPjtcblx0cHJpdmF0ZSBpbnZhbGlkYXRlID0gdGhpcy5zdG9yZS5zZWxlY3QoJ2ludmFsaWRhdGUnKTtcblxuXHRjb250cm9scyA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRsZXQgY2FtZXJhID0gdGhpcy5jYW1lcmEoKTtcblx0XHRpZiAoIWNhbWVyYSkge1xuXHRcdFx0Y2FtZXJhID0gdGhpcy5kZWZhdWx0Q2FtZXJhKCk7XG5cdFx0fVxuXG5cdFx0bGV0IGRvbUVsZW1lbnQgPSB0aGlzLmRvbUVsZW1lbnQoKTtcblx0XHRpZiAoIWRvbUVsZW1lbnQpIHtcblx0XHRcdGRvbUVsZW1lbnQgPSB0aGlzLmV2ZW50cygpLmNvbm5lY3RlZCB8fCB0aGlzLmdsRG9tRWxlbWVudCgpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgVHJhbnNmb3JtQ29udHJvbHMoY2FtZXJhLCBkb21FbGVtZW50KTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0ZXh0ZW5kKHsgR3JvdXAgfSk7XG5cdFx0ZWZmZWN0KChvbkNsZWFudXApID0+IHtcblx0XHRcdGNvbnN0IGNsZWFudXAgPSB0aGlzLmF0dGFjaENvbnRyb2xzRWZmZWN0KCk7XG5cdFx0XHRvbkNsZWFudXAoKCkgPT4gY2xlYW51cD8uKCkpO1xuXHRcdH0pO1xuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBjbGVhbnVwID0gdGhpcy5kaXNhYmxlRGVmYXVsdENvbnRyb2xzRWZmZWN0KCk7XG5cdFx0XHRvbkNsZWFudXAoKCkgPT4gY2xlYW51cD8uKCkpO1xuXHRcdH0pO1xuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBjbGVhbnVwID0gdGhpcy5zZXR1cENvbnRyb2xzRXZlbnRzRWZmZWN0KCk7XG5cdFx0XHRvbkNsZWFudXAoKCkgPT4gY2xlYW51cD8uKCkpO1xuXHRcdH0pO1xuXHRcdGVmZmVjdCgob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRjb25zdCBjbGVhbnVwID0gdGhpcy51cGRhdGVEZWZhdWx0Q29udHJvbHNFZmZlY3QoKTtcblx0XHRcdG9uQ2xlYW51cCgoKSA9PiBjbGVhbnVwPy4oKSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGF0dGFjaENvbnRyb2xzRWZmZWN0KCkge1xuXHRcdGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cFJlZigpLm5hdGl2ZUVsZW1lbnQ7XG5cdFx0aWYgKCFncm91cCkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgbG9jYWxTdGF0ZSA9IGdldExvY2FsU3RhdGUoZ3JvdXApO1xuXHRcdGlmICghbG9jYWxTdGF0ZSkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgW29iamVjdCwgY29udHJvbHNdID0gW3Jlc29sdmVSZWYodGhpcy5vYmplY3QoKSksIHRoaXMuY29udHJvbHMoKSwgbG9jYWxTdGF0ZS5vYmplY3RzKCldO1xuXHRcdGlmIChvYmplY3QpIHtcblx0XHRcdGNvbnRyb2xzLmF0dGFjaChvYmplY3QpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250cm9scy5hdHRhY2goZ3JvdXApO1xuXHRcdH1cblxuXHRcdHJldHVybiAoKSA9PiBjb250cm9scy5kZXRhY2goKTtcblx0fVxuXG5cdHByaXZhdGUgZGlzYWJsZURlZmF1bHRDb250cm9sc0VmZmVjdCgpIHtcblx0XHRjb25zdCBkZWZhdWx0Q29udHJvbHMgPSB0aGlzLmRlZmF1bHRDb250cm9scygpO1xuXHRcdGlmICghZGVmYXVsdENvbnRyb2xzKSByZXR1cm47XG5cblx0XHRjb25zdCBjb250cm9scyA9IHRoaXMuY29udHJvbHMoKTtcblx0XHRjb25zdCBjYWxsYmFjayA9IChldmVudDogYW55KSA9PiB7XG5cdFx0XHRkZWZhdWx0Q29udHJvbHMuZW5hYmxlZCA9ICFldmVudC52YWx1ZTtcblx0XHR9O1xuXG5cdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHRocmVlLXN0ZGxpYiB0eXBlcyBhcmUgbm90IHVwLXRvLWRhdGVcblx0XHRjb250cm9scy5hZGRFdmVudExpc3RlbmVyKCdkcmFnZ2luZy1jaGFuZ2VkJywgY2FsbGJhY2spO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gdGhyZWUtc3RkbGliIHR5cGVzIGFyZSBub3QgdXAtdG8tZGF0ZVxuXHRcdFx0Y29udHJvbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2dpbmctY2hhbmdlZCcsIGNhbGxiYWNrKTtcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBzZXR1cENvbnRyb2xzRXZlbnRzRWZmZWN0KCkge1xuXHRcdGNvbnN0IFtjb250cm9scywgaW52YWxpZGF0ZV0gPSBbdGhpcy5jb250cm9scygpLCB0aGlzLmludmFsaWRhdGUoKV07XG5cdFx0Y29uc3Qgb25DaGFuZ2UgPSAoZXZlbnQ6IFRocmVlRXZlbnQpID0+IHtcblx0XHRcdGludmFsaWRhdGUoKTtcblx0XHRcdGlmICghdGhpcy5jaGFuZ2VbJ2Rlc3Ryb3llZCddKSB7XG5cdFx0XHRcdHRoaXMuY2hhbmdlLmVtaXQoZXZlbnQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0Y29uc3Qgb25Nb3VzZURvd24gPSB0aGlzLm1vdXNlRG93bi5lbWl0LmJpbmQodGhpcy5tb3VzZURvd24pO1xuXHRcdGNvbnN0IG9uTW91c2VVcCA9IHRoaXMubW91c2VVcC5lbWl0LmJpbmQodGhpcy5tb3VzZVVwKTtcblx0XHRjb25zdCBvbk9iamVjdENoYW5nZSA9IHRoaXMub2JqZWN0Q2hhbmdlLmVtaXQuYmluZCh0aGlzLm9iamVjdENoYW5nZSk7XG5cblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gdGhyZWUtc3RkbGliIHR5cGVzIGFyZSBub3QgdXAtdG8tZGF0ZVxuXHRcdGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIG9uQ2hhbmdlKTtcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gdGhyZWUtc3RkbGliIHR5cGVzIGFyZSBub3QgdXAtdG8tZGF0ZVxuXHRcdGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlRG93bicsIG9uTW91c2VEb3duKTtcblx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gdGhyZWUtc3RkbGliIHR5cGVzIGFyZSBub3QgdXAtdG8tZGF0ZVxuXHRcdGNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlVXAnLCBvbk1vdXNlVXApO1xuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSB0aHJlZS1zdGRsaWIgdHlwZXMgYXJlIG5vdCB1cC10by1kYXRlXG5cdFx0Y29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignb2JqZWN0Q2hhbmdlJywgb25PYmplY3RDaGFuZ2UpO1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSB0aHJlZS1zdGRsaWIgdHlwZXMgYXJlIG5vdCB1cC10by1kYXRlXG5cdFx0XHRjb250cm9scy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBvbkNoYW5nZSk7XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gdGhyZWUtc3RkbGliIHR5cGVzIGFyZSBub3QgdXAtdG8tZGF0ZVxuXHRcdFx0Y29udHJvbHMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VEb3duJywgb25Nb3VzZURvd24pO1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHRocmVlLXN0ZGxpYiB0eXBlcyBhcmUgbm90IHVwLXRvLWRhdGVcblx0XHRcdGNvbnRyb2xzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlVXAnLCBvbk1vdXNlVXApO1xuXHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciAtIHRocmVlLXN0ZGxpYiB0eXBlcyBhcmUgbm90IHVwLXRvLWRhdGVcblx0XHRcdGNvbnRyb2xzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29iamVjdENoYW5nZScsIG9uT2JqZWN0Q2hhbmdlKTtcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVEZWZhdWx0Q29udHJvbHNFZmZlY3QoKSB7XG5cdFx0Y29uc3QgW2NvbnRyb2xzLCBtYWtlRGVmYXVsdF0gPSBbdGhpcy5jb250cm9scygpLCB0aGlzLm1ha2VEZWZhdWx0KCldO1xuXHRcdGlmICghbWFrZURlZmF1bHQpIHJldHVybjtcblxuXHRcdGNvbnN0IG9sZENvbnRyb2xzID0gdGhpcy5zdG9yZS5zbmFwc2hvdC5jb250cm9scztcblx0XHR0aGlzLnN0b3JlLnVwZGF0ZSh7IGNvbnRyb2xzIH0pO1xuXHRcdHJldHVybiAoKSA9PiB0aGlzLnN0b3JlLnVwZGF0ZSgoKSA9PiAoeyBjb250cm9sczogb2xkQ29udHJvbHMgfSkpO1xuXHR9XG59XG4iXX0=
@@ -9,6 +9,7 @@ export * from './lib/contact-shadows';
9
9
  export * from './lib/environment';
10
10
  export * from './lib/float';
11
11
  export * from './lib/lightformer';
12
+ export * from './lib/mask';
12
13
  export * from './lib/matcap-texture';
13
14
  export * from './lib/normal-texture';
14
15
  export * from './lib/randomized-lights';
@@ -16,4 +17,4 @@ export * from './lib/render-texture';
16
17
  export * from './lib/sky';
17
18
  export { NgtsSpotLight, NgtsSpotLightShadow } from './lib/spot-light';
18
19
  export * from './lib/stage';
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc3RhZ2luZy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxXQUFXLENBQUM7QUFDMUIsT0FBTyxFQUFFLGFBQWEsRUFBd0IsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RixjQUFjLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2FjY3VtdWxhdGl2ZS1zaGFkb3dzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2JhY2tkcm9wJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2JiLWFuY2hvcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ib3VuZHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2FtZXJhLXNoYWtlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NhdXN0aWNzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NlbnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250YWN0LXNoYWRvd3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZW52aXJvbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmxvYXQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbGlnaHRmb3JtZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbWF0Y2FwLXRleHR1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbm9ybWFsLXRleHR1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcmFuZG9taXplZC1saWdodHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcmVuZGVyLXRleHR1cmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc2t5JztcbmV4cG9ydCB7IE5ndHNTcG90TGlnaHQsIE5ndHNTcG90TGlnaHRPcHRpb25zLCBOZ3RzU3BvdExpZ2h0U2hhZG93IH0gZnJvbSAnLi9saWIvc3BvdC1saWdodCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zdGFnZSc7XG4iXX0=
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc3RhZ2luZy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxXQUFXLENBQUM7QUFDMUIsT0FBTyxFQUFFLGFBQWEsRUFBd0IsbUJBQW1CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RixjQUFjLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2FjY3VtdWxhdGl2ZS1zaGFkb3dzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2JhY2tkcm9wJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2JiLWFuY2hvcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ib3VuZHMnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2FtZXJhLXNoYWtlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NhdXN0aWNzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NlbnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250YWN0LXNoYWRvd3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZW52aXJvbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmxvYXQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbGlnaHRmb3JtZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbWFzayc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tYXRjYXAtdGV4dHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ub3JtYWwtdGV4dHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yYW5kb21pemVkLWxpZ2h0cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZW5kZXItdGV4dHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9za3knO1xuZXhwb3J0IHsgTmd0c1Nwb3RMaWdodCwgTmd0c1Nwb3RMaWdodE9wdGlvbnMsIE5ndHNTcG90TGlnaHRTaGFkb3cgfSBmcm9tICcuL2xpYi9zcG90LWxpZ2h0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3N0YWdlJztcbiJdfQ==
@@ -0,0 +1,78 @@
1
+ import { afterNextRender, ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, numberAttribute, viewChild, } from '@angular/core';
2
+ import { extend, omit, pick } from 'angular-three';
3
+ import { assertInjector } from 'ngxtension/assert-injector';
4
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
5
+ import { mergeInputs } from 'ngxtension/inject-inputs';
6
+ import { AlwaysStencilFunc, EqualStencilFunc, KeepStencilOp, Mesh, NotEqualStencilFunc, ReplaceStencilOp, } from 'three';
7
+ import * as i0 from "@angular/core";
8
+ const defaultOptions = {
9
+ colorWrite: false,
10
+ depthWrite: false,
11
+ };
12
+ export class NgtsMask {
13
+ constructor() {
14
+ this.id = input(1, { transform: numberAttribute });
15
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
16
+ this.parameters = omit(this.options, ['colorWrite', 'depthWrite']);
17
+ this.meshRef = viewChild.required('mesh');
18
+ this.colorWrite = pick(this.options, 'colorWrite');
19
+ this.depthWrite = pick(this.options, 'depthWrite');
20
+ this.spread = computed(() => {
21
+ const [id, colorWrite, depthWrite] = [this.id(), this.colorWrite(), this.depthWrite()];
22
+ return {
23
+ colorWrite,
24
+ depthWrite,
25
+ stencilWrite: true,
26
+ stencilRef: id,
27
+ stencilFunc: AlwaysStencilFunc,
28
+ stencilFail: ReplaceStencilOp,
29
+ stencilZFail: ReplaceStencilOp,
30
+ stencilZPass: ReplaceStencilOp,
31
+ };
32
+ });
33
+ extend({ Mesh });
34
+ const autoEffect = injectAutoEffect();
35
+ afterNextRender(() => {
36
+ autoEffect(() => {
37
+ const [mesh, spread] = [this.meshRef().nativeElement, this.spread()];
38
+ Object.assign(mesh.material, spread);
39
+ });
40
+ });
41
+ }
42
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsMask, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
43
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.0", type: NgtsMask, isStandalone: true, selector: "ngts-mask", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "meshRef", first: true, predicate: ["mesh"], descendants: true, isSignal: true }], ngImport: i0, template: `
44
+ <ngt-mesh #mesh [renderOrder]="-id()" [parameters]="parameters()">
45
+ <ng-content />
46
+ </ngt-mesh>
47
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
48
+ }
49
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtsMask, decorators: [{
50
+ type: Component,
51
+ args: [{
52
+ selector: 'ngts-mask',
53
+ standalone: true,
54
+ template: `
55
+ <ngt-mesh #mesh [renderOrder]="-id()" [parameters]="parameters()">
56
+ <ng-content />
57
+ </ngt-mesh>
58
+ `,
59
+ schemas: [CUSTOM_ELEMENTS_SCHEMA],
60
+ changeDetection: ChangeDetectionStrategy.OnPush,
61
+ }]
62
+ }], ctorParameters: () => [] });
63
+ export function injectMask(id, inverse = () => false, { injector } = {}) {
64
+ return assertInjector(injectMask, injector, () => {
65
+ return computed(() => {
66
+ const [_id, _inverse] = [id(), inverse()];
67
+ return {
68
+ stencilWrite: true,
69
+ stencilRef: _id,
70
+ stencilFunc: _inverse ? NotEqualStencilFunc : EqualStencilFunc,
71
+ stencilFail: KeepStencilOp,
72
+ stencilZFail: KeepStencilOp,
73
+ stencilZPass: KeepStencilOp,
74
+ };
75
+ });
76
+ });
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9zdGFnaW5nL3NyYy9saWIvbWFzay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sZUFBZSxFQUNmLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixFQUd0QixLQUFLLEVBQ0wsZUFBZSxFQUNmLFNBQVMsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFXLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQ04saUJBQWlCLEVBRWpCLGdCQUFnQixFQUNoQixhQUFhLEVBRWIsSUFBSSxFQUNKLG1CQUFtQixFQUNuQixnQkFBZ0IsR0FDaEIsTUFBTSxPQUFPLENBQUM7O0FBT2YsTUFBTSxjQUFjLEdBQW9CO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFVBQVUsRUFBRSxLQUFLO0NBQ2pCLENBQUM7QUFhRixNQUFNLE9BQU8sUUFBUTtJQXdCcEI7UUF2QkEsT0FBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUM5QyxZQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTVFLGVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBRTlELFlBQU8sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUE2QyxNQUFNLENBQUMsQ0FBQztRQUV6RSxlQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDOUMsZUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlDLFdBQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQzlCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUN2RixPQUFPO2dCQUNOLFVBQVU7Z0JBQ1YsVUFBVTtnQkFDVixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsV0FBVyxFQUFFLGlCQUFpQjtnQkFDOUIsV0FBVyxFQUFFLGdCQUFnQjtnQkFDN0IsWUFBWSxFQUFFLGdCQUFnQjtnQkFDOUIsWUFBWSxFQUFFLGdCQUFnQjthQUM5QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFHRixNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFFdEMsZUFBZSxDQUFDLEdBQUcsRUFBRTtZQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNmLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OEdBbkNXLFFBQVE7a0dBQVIsUUFBUSwrYUFSVjs7OztFQUlUOzsyRkFJVyxRQUFRO2tCQVhwQixTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSxXQUFXO29CQUNyQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFOzs7O0VBSVQ7b0JBQ0QsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQzs7QUF1Q0QsTUFBTSxVQUFVLFVBQVUsQ0FDekIsRUFBZ0IsRUFDaEIsVUFBeUIsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUNwQyxFQUFFLFFBQVEsS0FBOEIsRUFBRTtJQUUxQyxPQUFPLGNBQWMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtRQUNoRCxPQUFPLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDcEIsTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDMUMsT0FBTztnQkFDTixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLEdBQUc7Z0JBQ2YsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGdCQUFnQjtnQkFDOUQsV0FBVyxFQUFFLGFBQWE7Z0JBQzFCLFlBQVksRUFBRSxhQUFhO2dCQUMzQixZQUFZLEVBQUUsYUFBYTthQUMzQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRhZnRlck5leHRSZW5kZXIsXG5cdENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuXHRDb21wb25lbnQsXG5cdGNvbXB1dGVkLFxuXHRDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxuXHRFbGVtZW50UmVmLFxuXHRJbmplY3Rvcixcblx0aW5wdXQsXG5cdG51bWJlckF0dHJpYnV0ZSxcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgTmd0TWVzaCwgb21pdCwgcGljayB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgYXNzZXJ0SW5qZWN0b3IgfSBmcm9tICduZ3h0ZW5zaW9uL2Fzc2VydC1pbmplY3Rvcic7XG5pbXBvcnQgeyBpbmplY3RBdXRvRWZmZWN0IH0gZnJvbSAnbmd4dGVuc2lvbi9hdXRvLWVmZmVjdCc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5pbXBvcnQge1xuXHRBbHdheXNTdGVuY2lsRnVuYyxcblx0QnVmZmVyR2VvbWV0cnksXG5cdEVxdWFsU3RlbmNpbEZ1bmMsXG5cdEtlZXBTdGVuY2lsT3AsXG5cdE1hdGVyaWFsLFxuXHRNZXNoLFxuXHROb3RFcXVhbFN0ZW5jaWxGdW5jLFxuXHRSZXBsYWNlU3RlbmNpbE9wLFxufSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c01hc2tPcHRpb25zIGV4dGVuZHMgUGFydGlhbDxOZ3RNZXNoPiB7XG5cdGNvbG9yV3JpdGU6IGJvb2xlYW47XG5cdGRlcHRoV3JpdGU6IGJvb2xlYW47XG59XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zOiBOZ3RzTWFza09wdGlvbnMgPSB7XG5cdGNvbG9yV3JpdGU6IGZhbHNlLFxuXHRkZXB0aFdyaXRlOiBmYWxzZSxcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndHMtbWFzaycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1tZXNoICNtZXNoIFtyZW5kZXJPcmRlcl09XCItaWQoKVwiIFtwYXJhbWV0ZXJzXT1cInBhcmFtZXRlcnMoKVwiPlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1tZXNoPlxuXHRgLFxuXHRzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG5cdGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzTWFzayB7XG5cdGlkID0gaW5wdXQoMSwgeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KTtcblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRPcHRpb25zLCB7IHRyYW5zZm9ybTogbWVyZ2VJbnB1dHMoZGVmYXVsdE9wdGlvbnMpIH0pO1xuXG5cdHBhcmFtZXRlcnMgPSBvbWl0KHRoaXMub3B0aW9ucywgWydjb2xvcldyaXRlJywgJ2RlcHRoV3JpdGUnXSk7XG5cblx0bWVzaFJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPE1lc2g8QnVmZmVyR2VvbWV0cnksIE1hdGVyaWFsPj4+KCdtZXNoJyk7XG5cblx0cHJpdmF0ZSBjb2xvcldyaXRlID0gcGljayh0aGlzLm9wdGlvbnMsICdjb2xvcldyaXRlJyk7XG5cdHByaXZhdGUgZGVwdGhXcml0ZSA9IHBpY2sodGhpcy5vcHRpb25zLCAnZGVwdGhXcml0ZScpO1xuXHRwcml2YXRlIHNwcmVhZCA9IGNvbXB1dGVkKCgpID0+IHtcblx0XHRjb25zdCBbaWQsIGNvbG9yV3JpdGUsIGRlcHRoV3JpdGVdID0gW3RoaXMuaWQoKSwgdGhpcy5jb2xvcldyaXRlKCksIHRoaXMuZGVwdGhXcml0ZSgpXTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Y29sb3JXcml0ZSxcblx0XHRcdGRlcHRoV3JpdGUsXG5cdFx0XHRzdGVuY2lsV3JpdGU6IHRydWUsXG5cdFx0XHRzdGVuY2lsUmVmOiBpZCxcblx0XHRcdHN0ZW5jaWxGdW5jOiBBbHdheXNTdGVuY2lsRnVuYyxcblx0XHRcdHN0ZW5jaWxGYWlsOiBSZXBsYWNlU3RlbmNpbE9wLFxuXHRcdFx0c3RlbmNpbFpGYWlsOiBSZXBsYWNlU3RlbmNpbE9wLFxuXHRcdFx0c3RlbmNpbFpQYXNzOiBSZXBsYWNlU3RlbmNpbE9wLFxuXHRcdH07XG5cdH0pO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IE1lc2ggfSk7XG5cblx0XHRjb25zdCBhdXRvRWZmZWN0ID0gaW5qZWN0QXV0b0VmZmVjdCgpO1xuXG5cdFx0YWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcblx0XHRcdGF1dG9FZmZlY3QoKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBbbWVzaCwgc3ByZWFkXSA9IFt0aGlzLm1lc2hSZWYoKS5uYXRpdmVFbGVtZW50LCB0aGlzLnNwcmVhZCgpXTtcblx0XHRcdFx0T2JqZWN0LmFzc2lnbihtZXNoLm1hdGVyaWFsLCBzcHJlYWQpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdE1hc2soXG5cdGlkOiAoKSA9PiBudW1iZXIsXG5cdGludmVyc2U6ICgpID0+IGJvb2xlYW4gPSAoKSA9PiBmYWxzZSxcblx0eyBpbmplY3RvciB9OiB7IGluamVjdG9yPzogSW5qZWN0b3IgfSA9IHt9LFxuKSB7XG5cdHJldHVybiBhc3NlcnRJbmplY3RvcihpbmplY3RNYXNrLCBpbmplY3RvciwgKCkgPT4ge1xuXHRcdHJldHVybiBjb21wdXRlZCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbX2lkLCBfaW52ZXJzZV0gPSBbaWQoKSwgaW52ZXJzZSgpXTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHN0ZW5jaWxXcml0ZTogdHJ1ZSxcblx0XHRcdFx0c3RlbmNpbFJlZjogX2lkLFxuXHRcdFx0XHRzdGVuY2lsRnVuYzogX2ludmVyc2UgPyBOb3RFcXVhbFN0ZW5jaWxGdW5jIDogRXF1YWxTdGVuY2lsRnVuYyxcblx0XHRcdFx0c3RlbmNpbEZhaWw6IEtlZXBTdGVuY2lsT3AsXG5cdFx0XHRcdHN0ZW5jaWxaRmFpbDogS2VlcFN0ZW5jaWxPcCxcblx0XHRcdFx0c3RlbmNpbFpQYXNzOiBLZWVwU3RlbmNpbE9wLFxuXHRcdFx0fTtcblx0XHR9KTtcblx0fSk7XG59XG4iXX0=