angular-three-soba 2.14.0 → 3.1.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.
- package/abstractions/lib/catmull-rom-line.d.ts +117 -117
- package/abstractions/lib/edges.d.ts +126 -126
- package/abstractions/lib/grid.d.ts +15 -15
- package/abstractions/lib/line.d.ts +1 -1
- package/abstractions/lib/prism-geometry.d.ts +4 -4
- package/abstractions/lib/rounded-box.d.ts +1 -1
- package/abstractions/lib/text-3d.d.ts +22 -22
- package/abstractions/lib/text.d.ts +1 -1
- package/cameras/lib/cube-camera.d.ts +1 -1
- package/cameras/lib/orthographic-camera.d.ts +1 -1
- package/cameras/lib/perspective-camera.d.ts +1 -1
- package/controls/index.d.ts +0 -9
- package/controls/lib/camera-controls.d.ts +1 -1
- package/controls/lib/orbit-controls.d.ts +1 -1
- package/fesm2022/angular-three-soba-abstractions.mjs +41 -52
- package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
- package/fesm2022/angular-three-soba-cameras.mjs +12 -15
- package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
- package/fesm2022/angular-three-soba-controls.mjs +16 -24
- package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
- package/fesm2022/angular-three-soba-gizmos.mjs +59 -60
- package/fesm2022/angular-three-soba-gizmos.mjs.map +1 -1
- package/fesm2022/angular-three-soba-loaders.mjs +3 -3
- package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-materials.mjs +27 -35
- package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
- package/fesm2022/angular-three-soba-misc.mjs +27 -29
- package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
- package/fesm2022/angular-three-soba-performances.mjs +31 -34
- package/fesm2022/angular-three-soba-performances.mjs.map +1 -1
- package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
- package/fesm2022/angular-three-soba-staging.mjs +91 -105
- package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
- package/fesm2022/angular-three-soba-stats.mjs +3 -3
- package/fesm2022/angular-three-soba-stats.mjs.map +1 -1
- package/gizmos/lib/gizmo-helper/gizmo-viewport.d.ts +1 -1
- package/gizmos/lib/pivot-controls/axis-arrow.d.ts +1 -1
- package/gizmos/lib/pivot-controls/axis-rotator.d.ts +1 -1
- package/gizmos/lib/pivot-controls/pivot-controls.d.ts +1 -1
- package/gizmos/lib/pivot-controls/plane-slider.d.ts +1 -1
- package/gizmos/lib/pivot-controls/scaling-sphere.d.ts +1 -1
- package/gizmos/lib/transform-controls.d.ts +2 -2
- package/materials/lib/custom-shader-material.d.ts +2 -2
- package/materials/lib/mesh-portal-material.d.ts +9 -9
- package/materials/lib/mesh-refraction-material.d.ts +2 -2
- package/materials/lib/mesh-transmission-material.d.ts +1 -1
- package/misc/lib/computed-attribute.d.ts +6 -6
- package/misc/lib/decal.d.ts +1 -1
- package/misc/lib/html/html.d.ts +2 -2
- package/misc/lib/sampler.d.ts +1 -1
- package/package.json +11 -37
- package/performances/lib/instances/instances.d.ts +5 -5
- package/performances/lib/points/points.d.ts +10 -10
- package/performances/lib/segments/segments.d.ts +4 -4
- package/shaders/lib/mesh-refraction-material.d.ts +2 -2
- package/staging/lib/caustics.d.ts +1 -1
- package/staging/lib/center.d.ts +2 -2
- package/staging/lib/contact-shadows.d.ts +1 -1
- package/staging/lib/lightformer.d.ts +1 -1
- package/staging/lib/mask.d.ts +1 -1
- package/staging/lib/render-texture.d.ts +1 -1
- package/staging/lib/spot-light.d.ts +2 -2
- package/esm2022/abstractions/angular-three-soba-abstractions.mjs +0 -5
- package/esm2022/abstractions/index.mjs +0 -14
- package/esm2022/abstractions/lib/billboard.mjs +0 -69
- package/esm2022/abstractions/lib/catmull-rom-line.mjs +0 -76
- package/esm2022/abstractions/lib/cubic-bezier-line.mjs +0 -51
- package/esm2022/abstractions/lib/edges.mjs +0 -66
- package/esm2022/abstractions/lib/gradient-texture.mjs +0 -91
- package/esm2022/abstractions/lib/grid.mjs +0 -103
- package/esm2022/abstractions/lib/helper.mjs +0 -74
- package/esm2022/abstractions/lib/line.mjs +0 -123
- package/esm2022/abstractions/lib/prism-geometry.mjs +0 -46
- package/esm2022/abstractions/lib/quadratic-bezier-line.mjs +0 -73
- package/esm2022/abstractions/lib/rounded-box.mjs +0 -131
- package/esm2022/abstractions/lib/text-3d.mjs +0 -100
- package/esm2022/abstractions/lib/text.mjs +0 -86
- package/esm2022/angular-three-soba.mjs +0 -5
- package/esm2022/cameras/angular-three-soba-cameras.mjs +0 -5
- package/esm2022/cameras/index.mjs +0 -5
- package/esm2022/cameras/lib/camera-content.mjs +0 -14
- package/esm2022/cameras/lib/cube-camera.mjs +0 -102
- package/esm2022/cameras/lib/orthographic-camera.mjs +0 -131
- package/esm2022/cameras/lib/perspective-camera.mjs +0 -105
- package/esm2022/controls/angular-three-soba-controls.mjs +0 -5
- package/esm2022/controls/index.mjs +0 -9
- package/esm2022/controls/lib/camera-controls.mjs +0 -126
- package/esm2022/controls/lib/orbit-controls.mjs +0 -114
- package/esm2022/controls/lib/scroll-controls.mjs +0 -261
- package/esm2022/gizmos/angular-three-soba-gizmos.mjs +0 -5
- package/esm2022/gizmos/index.mjs +0 -6
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-helper.mjs +0 -191
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewcube.mjs +0 -304
- package/esm2022/gizmos/lib/gizmo-helper/gizmo-viewport.mjs +0 -348
- package/esm2022/gizmos/lib/pivot-controls/axis-arrow.mjs +0 -265
- package/esm2022/gizmos/lib/pivot-controls/axis-rotator.mjs +0 -264
- package/esm2022/gizmos/lib/pivot-controls/pivot-controls.mjs +0 -349
- package/esm2022/gizmos/lib/pivot-controls/plane-slider.mjs +0 -266
- package/esm2022/gizmos/lib/pivot-controls/scaling-sphere.mjs +0 -232
- package/esm2022/gizmos/lib/transform-controls.mjs +0 -177
- package/esm2022/index.mjs +0 -2
- package/esm2022/loaders/angular-three-soba-loaders.mjs +0 -5
- package/esm2022/loaders/index.mjs +0 -7
- package/esm2022/loaders/lib/fbx-loader.mjs +0 -13
- package/esm2022/loaders/lib/font-loader.mjs +0 -49
- package/esm2022/loaders/lib/gltf-loader.mjs +0 -51
- package/esm2022/loaders/lib/loader.mjs +0 -103
- package/esm2022/loaders/lib/progress.mjs +0 -51
- package/esm2022/loaders/lib/texture-loader.mjs +0 -32
- package/esm2022/materials/angular-three-soba-materials.mjs +0 -5
- package/esm2022/materials/index.mjs +0 -9
- package/esm2022/materials/lib/custom-shader-material.mjs +0 -67
- package/esm2022/materials/lib/mesh-distort-material.mjs +0 -43
- package/esm2022/materials/lib/mesh-portal-material.mjs +0 -294
- package/esm2022/materials/lib/mesh-reflector-material.mjs +0 -274
- package/esm2022/materials/lib/mesh-refraction-material.mjs +0 -140
- package/esm2022/materials/lib/mesh-transmission-material.mjs +0 -188
- package/esm2022/materials/lib/mesh-wobble-material.mjs +0 -43
- package/esm2022/materials/lib/point-material.mjs +0 -34
- package/esm2022/misc/angular-three-soba-misc.mjs +0 -5
- package/esm2022/misc/index.mjs +0 -15
- package/esm2022/misc/lib/animations.mjs +0 -71
- package/esm2022/misc/lib/bake-shadows.mjs +0 -24
- package/esm2022/misc/lib/computed-attribute.mjs +0 -51
- package/esm2022/misc/lib/constants.mjs +0 -5
- package/esm2022/misc/lib/decal.mjs +0 -142
- package/esm2022/misc/lib/deprecated.mjs +0 -15
- package/esm2022/misc/lib/depth-buffer.mjs +0 -35
- package/esm2022/misc/lib/fbo.mjs +0 -86
- package/esm2022/misc/lib/html/html-content.mjs +0 -322
- package/esm2022/misc/lib/html/html.mjs +0 -129
- package/esm2022/misc/lib/html/utils.mjs +0 -74
- package/esm2022/misc/lib/intersect.mjs +0 -49
- package/esm2022/misc/lib/preload.mjs +0 -58
- package/esm2022/misc/lib/sampler.mjs +0 -122
- package/esm2022/misc/lib/scale-factor.mjs +0 -29
- package/esm2022/performances/angular-three-soba-performances.mjs +0 -5
- package/esm2022/performances/index.mjs +0 -7
- package/esm2022/performances/lib/adaptive-dpr.mjs +0 -46
- package/esm2022/performances/lib/adaptive-events.mjs +0 -24
- package/esm2022/performances/lib/detailed.mjs +0 -53
- package/esm2022/performances/lib/instances/instances.mjs +0 -177
- package/esm2022/performances/lib/instances/position-mesh.mjs +0 -51
- package/esm2022/performances/lib/points/points.mjs +0 -272
- package/esm2022/performances/lib/points/position-point.mjs +0 -53
- package/esm2022/performances/lib/segments/segment-object.mjs +0 -9
- package/esm2022/performances/lib/segments/segments.mjs +0 -126
- package/esm2022/shaders/angular-three-soba-shaders.mjs +0 -5
- package/esm2022/shaders/index.mjs +0 -4
- package/esm2022/shaders/lib/grid-material.mjs +0 -81
- package/esm2022/shaders/lib/mesh-refraction-material.mjs +0 -163
- package/esm2022/shaders/lib/point-material.mjs +0 -24
- package/esm2022/staging/angular-three-soba-staging.mjs +0 -5
- package/esm2022/staging/index.mjs +0 -21
- package/esm2022/staging/lib/accumulative-shadows.mjs +0 -180
- package/esm2022/staging/lib/backdrop.mjs +0 -69
- package/esm2022/staging/lib/bb-anchor.mjs +0 -58
- package/esm2022/staging/lib/bounds.mjs +0 -282
- package/esm2022/staging/lib/camera-shake.mjs +0 -65
- package/esm2022/staging/lib/caustics.mjs +0 -184
- package/esm2022/staging/lib/center.mjs +0 -114
- package/esm2022/staging/lib/contact-shadows.mjs +0 -214
- package/esm2022/staging/lib/environment/environment.mjs +0 -344
- package/esm2022/staging/lib/environment/inject-environment.mjs +0 -184
- package/esm2022/staging/lib/float.mjs +0 -70
- package/esm2022/staging/lib/lightformer.mjs +0 -103
- package/esm2022/staging/lib/mask.mjs +0 -74
- package/esm2022/staging/lib/matcap-texture.mjs +0 -79
- package/esm2022/staging/lib/normal-texture.mjs +0 -79
- package/esm2022/staging/lib/randomized-lights.mjs +0 -100
- package/esm2022/staging/lib/render-texture.mjs +0 -202
- package/esm2022/staging/lib/sky.mjs +0 -86
- package/esm2022/staging/lib/spot-light.mjs +0 -445
- package/esm2022/staging/lib/stage.mjs +0 -232
- package/esm2022/stats/angular-three-soba-stats.mjs +0 -5
- package/esm2022/stats/index.mjs +0 -2
- package/esm2022/stats/lib/stats.mjs +0 -57
- package/esm2022/vanilla-exports/angular-three-soba-vanilla-exports.mjs +0 -5
- package/esm2022/vanilla-exports/index.mjs +0 -3
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, effect, inject, input, viewChild, } from '@angular/core';
|
|
2
|
-
import { extend, injectBeforeRender, NgtArgs, omit, pick, resolveRef, vector3 } from 'angular-three';
|
|
3
|
-
import { mergeInputs } from 'ngxtension/inject-inputs';
|
|
4
|
-
import { Vector2 } from 'three';
|
|
5
|
-
import { Line2, LineMaterial, LineSegmentsGeometry } from 'three-stdlib';
|
|
6
|
-
import { SegmentObject } from './segment-object';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
export class NgtsSegment {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.start = input.required();
|
|
11
|
-
this.end = input.required();
|
|
12
|
-
this.color = input();
|
|
13
|
-
this.normalizedStart = vector3(this.start);
|
|
14
|
-
this.normalizedEnd = vector3(this.end);
|
|
15
|
-
this.segmentRef = viewChild.required('segment');
|
|
16
|
-
this.segments = inject(NgtsSegments);
|
|
17
|
-
extend({ SegmentObject });
|
|
18
|
-
effect((onCleanup) => {
|
|
19
|
-
const cleanUp = this.segments.subscribe(this.segmentRef());
|
|
20
|
-
onCleanup(() => cleanUp());
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsSegment, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.11", type: NgtsSegment, isStandalone: true, selector: "ngts-segment", inputs: { start: { classPropertyName: "start", publicName: "start", isSignal: true, isRequired: true, transformFunction: null }, end: { classPropertyName: "end", publicName: "end", isSignal: true, isRequired: true, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "segmentRef", first: true, predicate: ["segment"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
25
|
-
<ngt-segment-object #segment [color]="color()" [start]="normalizedStart()" [end]="normalizedEnd()" />
|
|
26
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
27
|
-
}
|
|
28
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsSegment, decorators: [{
|
|
29
|
-
type: Component,
|
|
30
|
-
args: [{
|
|
31
|
-
selector: 'ngts-segment',
|
|
32
|
-
standalone: true,
|
|
33
|
-
template: `
|
|
34
|
-
<ngt-segment-object #segment [color]="color()" [start]="normalizedStart()" [end]="normalizedEnd()" />
|
|
35
|
-
`,
|
|
36
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
37
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
38
|
-
}]
|
|
39
|
-
}], ctorParameters: () => [] });
|
|
40
|
-
const defaultSegmentsOptions = {
|
|
41
|
-
limit: 1000,
|
|
42
|
-
lineWidth: 1.0,
|
|
43
|
-
};
|
|
44
|
-
export class NgtsSegments {
|
|
45
|
-
constructor() {
|
|
46
|
-
this.options = input(defaultSegmentsOptions, { transform: mergeInputs(defaultSegmentsOptions) });
|
|
47
|
-
this.parameters = omit(this.options, ['limit', 'lineWidth']);
|
|
48
|
-
this.lineWidth = pick(this.options, 'lineWidth');
|
|
49
|
-
this.limit = pick(this.options, 'limit');
|
|
50
|
-
this.lineRef = viewChild('line');
|
|
51
|
-
this.segments = [];
|
|
52
|
-
this.line = new Line2();
|
|
53
|
-
this.material = new LineMaterial();
|
|
54
|
-
this.geometry = new LineSegmentsGeometry();
|
|
55
|
-
this.resolution = new Vector2(512, 512);
|
|
56
|
-
this.materialParameters = computed(() => ({
|
|
57
|
-
vertexColors: true,
|
|
58
|
-
resolution: this.resolution,
|
|
59
|
-
linewidth: this.lineWidth(),
|
|
60
|
-
...this.parameters(),
|
|
61
|
-
}));
|
|
62
|
-
this.positions = computed(() => {
|
|
63
|
-
const limit = this.limit();
|
|
64
|
-
return Array.from({ length: limit * 6 }, () => 0);
|
|
65
|
-
});
|
|
66
|
-
this.colors = computed(() => {
|
|
67
|
-
const limit = this.limit();
|
|
68
|
-
return Array.from({ length: limit * 6 }, () => 0);
|
|
69
|
-
});
|
|
70
|
-
injectBeforeRender(() => {
|
|
71
|
-
const [limit, positions, colors] = [this.limit(), this.positions(), this.colors()];
|
|
72
|
-
for (let i = 0; i < limit; i++) {
|
|
73
|
-
const segment = resolveRef(this.segments[i]);
|
|
74
|
-
if (segment) {
|
|
75
|
-
positions[i * 6 + 0] = segment.start.x;
|
|
76
|
-
positions[i * 6 + 1] = segment.start.y;
|
|
77
|
-
positions[i * 6 + 2] = segment.start.z;
|
|
78
|
-
positions[i * 6 + 3] = segment.end.x;
|
|
79
|
-
positions[i * 6 + 4] = segment.end.y;
|
|
80
|
-
positions[i * 6 + 5] = segment.end.z;
|
|
81
|
-
colors[i * 6 + 0] = segment.color.r;
|
|
82
|
-
colors[i * 6 + 1] = segment.color.g;
|
|
83
|
-
colors[i * 6 + 2] = segment.color.b;
|
|
84
|
-
colors[i * 6 + 3] = segment.color.r;
|
|
85
|
-
colors[i * 6 + 4] = segment.color.g;
|
|
86
|
-
colors[i * 6 + 5] = segment.color.b;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
this.geometry.setColors(colors);
|
|
90
|
-
this.geometry.setPositions(positions);
|
|
91
|
-
this.line.computeLineDistances();
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
subscribe(ref) {
|
|
95
|
-
this.segments.push(ref);
|
|
96
|
-
return () => {
|
|
97
|
-
this.segments = this.segments.filter((i) => i !== ref);
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsSegments, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
101
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.11", type: NgtsSegments, isStandalone: true, selector: "ngts-segments", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "lineRef", first: true, predicate: ["line"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
102
|
-
<ngt-primitive #line *args="[line]">
|
|
103
|
-
<ngt-primitive *args="[geometry]" attach="geometry" />
|
|
104
|
-
<ngt-primitive *args="[material]" attach="material" [parameters]="materialParameters()" />
|
|
105
|
-
<ng-content />
|
|
106
|
-
</ngt-primitive>
|
|
107
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgtArgs, selector: "ng-template[args]", inputs: ["args"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
108
|
-
}
|
|
109
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: NgtsSegments, decorators: [{
|
|
110
|
-
type: Component,
|
|
111
|
-
args: [{
|
|
112
|
-
selector: 'ngts-segments',
|
|
113
|
-
standalone: true,
|
|
114
|
-
template: `
|
|
115
|
-
<ngt-primitive #line *args="[line]">
|
|
116
|
-
<ngt-primitive *args="[geometry]" attach="geometry" />
|
|
117
|
-
<ngt-primitive *args="[material]" attach="material" [parameters]="materialParameters()" />
|
|
118
|
-
<ng-content />
|
|
119
|
-
</ngt-primitive>
|
|
120
|
-
`,
|
|
121
|
-
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
122
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
123
|
-
imports: [NgtArgs],
|
|
124
|
-
}]
|
|
125
|
-
}], ctorParameters: () => [] });
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvcGVyZm9ybWFuY2VzL3NyYy9saWIvc2VnbWVudHMvc2VnbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLHNCQUFzQixFQUN0QixNQUFNLEVBRU4sTUFBTSxFQUNOLEtBQUssRUFDTCxTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQWMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQXVCLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBMEIsb0JBQW9CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQVdqRCxNQUFNLE9BQU8sV0FBVztJQVl2QjtRQVhBLFVBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFjLENBQUM7UUFDckMsUUFBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQWMsQ0FBQztRQUNuQyxVQUFLLEdBQUcsS0FBSyxFQUF1QixDQUFDO1FBRXJDLG9CQUFlLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxrQkFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFbEMsZUFBVSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQTRCLFNBQVMsQ0FBQyxDQUFDO1FBRXRFLGFBQVEsR0FBRyxNQUFNLENBQUMsWUFBWSxD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LENBQUM7b0JBQ2pDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cdENvbXBvbmVudCxcblx0Y29tcHV0ZWQsXG5cdENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG5cdGVmZmVjdCxcblx0RWxlbWVudFJlZixcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0dmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGV4dGVuZCwgaW5qZWN0QmVmb3JlUmVuZGVyLCBOZ3RBcmdzLCBOZ3RWZWN0b3IzLCBvbWl0LCBwaWNrLCByZXNvbHZlUmVmLCB2ZWN0b3IzIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBtZXJnZUlucHV0cyB9IGZyb20gJ25neHRlbnNpb24vaW5qZWN0LWlucHV0cyc7XG5pbXBvcnQgeyBDb2xvclJlcHJlc2VudGF0aW9uLCBWZWN0b3IyIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTGluZTIsIExpbmVNYXRlcmlhbCwgTGluZU1hdGVyaWFsUGFyYW1ldGVycywgTGluZVNlZ21lbnRzR2VvbWV0cnkgfSBmcm9tICd0aHJlZS1zdGRsaWInO1xuaW1wb3J0IHsgU2VnbWVudE9iamVjdCB9IGZyb20gJy4vc2VnbWVudC1vYmplY3QnO1xuXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6ICduZ3RzLXNlZ21lbnQnLFxuXHRzdGFuZGFsb25lOiB0cnVlLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxuZ3Qtc2VnbWVudC1vYmplY3QgI3NlZ21lbnQgW2NvbG9yXT1cImNvbG9yKClcIiBbc3RhcnRdPVwibm9ybWFsaXplZFN0YXJ0KClcIiBbZW5kXT1cIm5vcm1hbGl6ZWRFbmQoKVwiIC8+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNTZWdtZW50IHtcblx0c3RhcnQgPSBpbnB1dC5yZXF1aXJlZDxOZ3RWZWN0b3IzPigpO1xuXHRlbmQgPSBpbnB1dC5yZXF1aXJlZDxOZ3RWZWN0b3IzPigpO1xuXHRjb2xvciA9IGlucHV0PENvbG9yUmVwcmVzZW50YXRpb24+KCk7XG5cblx0bm9ybWFsaXplZFN0YXJ0ID0gdmVjdG9yMyh0aGlzLnN0YXJ0KTtcblx0bm9ybWFsaXplZEVuZCA9IHZlY3RvcjModGhpcy5lbmQpO1xuXG5cdHNlZ21lbnRSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxTZWdtZW50T2JqZWN0Pj4oJ3NlZ21lbnQnKTtcblxuXHRzZWdtZW50cyA9IGluamVjdChOZ3RzU2VnbWVudHMpO1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGV4dGVuZCh7IFNlZ21lbnRPYmplY3QgfSk7XG5cblx0XHRlZmZlY3QoKG9uQ2xlYW51cCkgPT4ge1xuXHRcdFx0Y29uc3QgY2xlYW5VcCA9IHRoaXMuc2VnbWVudHMuc3Vic2NyaWJlKHRoaXMuc2VnbWVudFJlZigpKTtcblx0XHRcdG9uQ2xlYW51cCgoKSA9PiBjbGVhblVwKCkpO1xuXHRcdH0pO1xuXHR9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0c1NlZ21lbnRzT3B0aW9ucyBleHRlbmRzIExpbmVNYXRlcmlhbFBhcmFtZXRlcnMge1xuXHRsaW1pdDogbnVtYmVyO1xuXHRsaW5lV2lkdGg6IG51bWJlcjtcbn1cblxuY29uc3QgZGVmYXVsdFNlZ21lbnRzT3B0aW9uczogTmd0c1NlZ21lbnRzT3B0aW9ucyA9IHtcblx0bGltaXQ6IDEwMDAsXG5cdGxpbmVXaWR0aDogMS4wLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0cy1zZWdtZW50cycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PG5ndC1wcmltaXRpdmUgI2xpbmUgKmFyZ3M9XCJbbGluZV1cIj5cblx0XHRcdDxuZ3QtcHJpbWl0aXZlICphcmdzPVwiW2dlb21ldHJ5XVwiIGF0dGFjaD1cImdlb21ldHJ5XCIgLz5cblx0XHRcdDxuZ3QtcHJpbWl0aXZlICphcmdzPVwiW21hdGVyaWFsXVwiIGF0dGFjaD1cIm1hdGVyaWFsXCIgW3BhcmFtZXRlcnNdPVwibWF0ZXJpYWxQYXJhbWV0ZXJzKClcIiAvPlxuXHRcdFx0PG5nLWNvbnRlbnQgLz5cblx0XHQ8L25ndC1wcmltaXRpdmU+XG5cdGAsXG5cdHNjaGVtYXM6IFtDVVNUT01fRUxFTUVOVFNfU0NIRU1BXSxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG5cdGltcG9ydHM6IFtOZ3RBcmdzXSxcbn0pXG5leHBvcnQgY2xhc3MgTmd0c1NlZ21lbnRzIHtcblx0b3B0aW9ucyA9IGlucHV0KGRlZmF1bHRTZWdtZW50c09wdGlvbnMsIHsgdHJhbnNmb3JtOiBtZXJnZUlucHV0cyhkZWZhdWx0U2VnbWVudHNPcHRpb25zKSB9KTtcblx0cGFyYW1ldGVycyA9IG9taXQodGhpcy5vcHRpb25zLCBbJ2xpbWl0JywgJ2xpbmVXaWR0aCddKTtcblxuXHRwcml2YXRlIGxpbmVXaWR0aCA9IHBpY2sodGhpcy5vcHRpb25zLCAnbGluZVdpZHRoJyk7XG5cdHByaXZhdGUgbGltaXQgPSBwaWNrKHRoaXMub3B0aW9ucywgJ2xpbWl0Jyk7XG5cblx0bGluZVJlZiA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPExpbmUyPj4oJ2xpbmUnKTtcblxuXHRzZWdtZW50czogQXJyYXk8RWxlbWVudFJlZjxTZWdtZW50T2JqZWN0PiB8IFNlZ21lbnRPYmplY3Q+ID0gW107XG5cblx0bGluZSA9IG5ldyBMaW5lMigpO1xuXHRtYXRlcmlhbCA9IG5ldyBMaW5lTWF0ZXJpYWwoKTtcblx0Z2VvbWV0cnkgPSBuZXcgTGluZVNlZ21lbnRzR2VvbWV0cnkoKTtcblx0cmVzb2x1dGlvbiA9IG5ldyBWZWN0b3IyKDUxMiwgNTEyKTtcblxuXHRtYXRlcmlhbFBhcmFtZXRlcnMgPSBjb21wdXRlZCgoKSA9PiAoe1xuXHRcdHZlcnRleENvbG9yczogdHJ1ZSxcblx0XHRyZXNvbHV0aW9uOiB0aGlzLnJlc29sdXRpb24sXG5cdFx0bGluZXdpZHRoOiB0aGlzLmxpbmVXaWR0aCgpLFxuXHRcdC4uLnRoaXMucGFyYW1ldGVycygpLFxuXHR9KSk7XG5cblx0cG9zaXRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuXHRcdGNvbnN0IGxpbWl0ID0gdGhpcy5saW1pdCgpO1xuXHRcdHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBsaW1pdCAqIDYgfSwgKCkgPT4gMCk7XG5cdH0pO1xuXHRjb2xvcnMgPSBjb21wdXRlZCgoKSA9PiB7XG5cdFx0Y29uc3QgbGltaXQgPSB0aGlzLmxpbWl0KCk7XG5cdFx0cmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGxpbWl0ICogNiB9LCAoKSA9PiAwKTtcblx0fSk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKCgpID0+IHtcblx0XHRcdGNvbnN0IFtsaW1pdCwgcG9zaXRpb25zLCBjb2xvcnNdID0gW3RoaXMubGltaXQoKSwgdGhpcy5wb3NpdGlvbnMoKSwgdGhpcy5jb2xvcnMoKV07XG5cblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykge1xuXHRcdFx0XHRjb25zdCBzZWdtZW50ID0gcmVzb2x2ZVJlZih0aGlzLnNlZ21lbnRzW2ldKTtcblx0XHRcdFx0aWYgKHNlZ21lbnQpIHtcblx0XHRcdFx0XHRwb3NpdGlvbnNbaSAqIDYgKyAwXSA9IHNlZ21lbnQuc3RhcnQueDtcblx0XHRcdFx0XHRwb3NpdGlvbnNbaSAqIDYgKyAxXSA9IHNlZ21lbnQuc3RhcnQueTtcblx0XHRcdFx0XHRwb3NpdGlvbnNbaSAqIDYgKyAyXSA9IHNlZ21lbnQuc3RhcnQuejtcblxuXHRcdFx0XHRcdHBvc2l0aW9uc1tpICogNiArIDNdID0gc2VnbWVudC5lbmQueDtcblx0XHRcdFx0XHRwb3NpdGlvbnNbaSAqIDYgKyA0XSA9IHNlZ21lbnQuZW5kLnk7XG5cdFx0XHRcdFx0cG9zaXRpb25zW2kgKiA2ICsgNV0gPSBzZWdtZW50LmVuZC56O1xuXG5cdFx0XHRcdFx0Y29sb3JzW2kgKiA2ICsgMF0gPSBzZWdtZW50LmNvbG9yLnI7XG5cdFx0XHRcdFx0Y29sb3JzW2kgKiA2ICsgMV0gPSBzZWdtZW50LmNvbG9yLmc7XG5cdFx0XHRcdFx0Y29sb3JzW2kgKiA2ICsgMl0gPSBzZWdtZW50LmNvbG9yLmI7XG5cblx0XHRcdFx0XHRjb2xvcnNbaSAqIDYgKyAzXSA9IHNlZ21lbnQuY29sb3Iucjtcblx0XHRcdFx0XHRjb2xvcnNbaSAqIDYgKyA0XSA9IHNlZ21lbnQuY29sb3IuZztcblx0XHRcdFx0XHRjb2xvcnNbaSAqIDYgKyA1XSA9IHNlZ21lbnQuY29sb3IuYjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmdlb21ldHJ5LnNldENvbG9ycyhjb2xvcnMpO1xuXHRcdFx0dGhpcy5nZW9tZXRyeS5zZXRQb3NpdGlvbnMocG9zaXRpb25zKTtcblx0XHRcdHRoaXMubGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpO1xuXHRcdH0pO1xuXHR9XG5cblx0c3Vic2NyaWJlKHJlZjogRWxlbWVudFJlZjxTZWdtZW50T2JqZWN0PiB8IFNlZ21lbnRPYmplY3QpIHtcblx0XHR0aGlzLnNlZ21lbnRzLnB1c2gocmVmKTtcblx0XHRyZXR1cm4gKCkgPT4ge1xuXHRcdFx0dGhpcy5zZWdtZW50cyA9IHRoaXMuc2VnbWVudHMuZmlsdGVyKChpKSA9PiBpICE9PSByZWYpO1xuXHRcdH07XG5cdH1cbn1cbiJdfQ==
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1zb2JhLXNoYWRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc2hhZGVycy9zcmMvYW5ndWxhci10aHJlZS1zb2JhLXNoYWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export * from './lib/grid-material';
|
|
2
|
-
export * from './lib/mesh-refraction-material';
|
|
3
|
-
export * from './lib/point-material';
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc2hhZGVycy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYi9ncmlkLW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL21lc2gtcmVmcmFjdGlvbi1tYXRlcmlhbCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9wb2ludC1tYXRlcmlhbCc7XG4iXX0=
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import { getVersion } from 'angular-three-soba/misc';
|
|
2
|
-
import { shaderMaterial } from 'angular-three-soba/vanilla-exports';
|
|
3
|
-
import { Color, Vector3 } from 'three';
|
|
4
|
-
export const GridMaterial = shaderMaterial({
|
|
5
|
-
cellSize: 0.5,
|
|
6
|
-
sectionSize: 1,
|
|
7
|
-
fadeDistance: 100,
|
|
8
|
-
fadeStrength: 1,
|
|
9
|
-
fadeFrom: 1,
|
|
10
|
-
cellThickness: 0.5,
|
|
11
|
-
sectionThickness: 1,
|
|
12
|
-
cellColor: new Color(),
|
|
13
|
-
sectionColor: new Color(),
|
|
14
|
-
infiniteGrid: false,
|
|
15
|
-
followCamera: false,
|
|
16
|
-
worldCamProjPosition: new Vector3(),
|
|
17
|
-
worldPlanePosition: new Vector3(),
|
|
18
|
-
},
|
|
19
|
-
/* language=glsl glsl */ `
|
|
20
|
-
varying vec3 localPosition;
|
|
21
|
-
varying vec4 worldPosition;
|
|
22
|
-
|
|
23
|
-
uniform vec3 worldCamProjPosition;
|
|
24
|
-
uniform vec3 worldPlanePosition;
|
|
25
|
-
uniform float fadeDistance;
|
|
26
|
-
uniform bool infiniteGrid;
|
|
27
|
-
uniform bool followCamera;
|
|
28
|
-
|
|
29
|
-
void main() {
|
|
30
|
-
localPosition = position.xzy;
|
|
31
|
-
if (infiniteGrid) localPosition *= 1.0 + fadeDistance;
|
|
32
|
-
|
|
33
|
-
worldPosition = modelMatrix * vec4(localPosition, 1.0);
|
|
34
|
-
if (followCamera) {
|
|
35
|
-
worldPosition.xyz += (worldCamProjPosition - worldPlanePosition);
|
|
36
|
-
localPosition = (inverse(modelMatrix) * worldPosition).xyz;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
gl_Position = projectionMatrix * viewMatrix * worldPosition;
|
|
40
|
-
}
|
|
41
|
-
`,
|
|
42
|
-
/* language=glsl glsl */ `
|
|
43
|
-
varying vec3 localPosition;
|
|
44
|
-
varying vec4 worldPosition;
|
|
45
|
-
|
|
46
|
-
uniform vec3 worldCamProjPosition;
|
|
47
|
-
uniform float cellSize;
|
|
48
|
-
uniform float sectionSize;
|
|
49
|
-
uniform vec3 cellColor;
|
|
50
|
-
uniform vec3 sectionColor;
|
|
51
|
-
uniform float fadeDistance;
|
|
52
|
-
uniform float fadeStrength;
|
|
53
|
-
uniform float fadeFrom;
|
|
54
|
-
uniform float cellThickness;
|
|
55
|
-
uniform float sectionThickness;
|
|
56
|
-
|
|
57
|
-
float getGrid(float size, float thickness) {
|
|
58
|
-
vec2 r = localPosition.xz / size;
|
|
59
|
-
vec2 grid = abs(fract(r - 0.5) - 0.5) / fwidth(r);
|
|
60
|
-
float line = min(grid.x, grid.y) + 1.0 - thickness;
|
|
61
|
-
return 1.0 - min(line, 1.0);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
void main() {
|
|
65
|
-
float g1 = getGrid(cellSize, cellThickness);
|
|
66
|
-
float g2 = getGrid(sectionSize, sectionThickness);
|
|
67
|
-
|
|
68
|
-
vec3 from = worldCamProjPosition*vec3(fadeFrom);
|
|
69
|
-
float dist = distance(from, worldPosition.xyz);
|
|
70
|
-
float d = 1.0 - min(dist / fadeDistance, 1.0);
|
|
71
|
-
vec3 color = mix(cellColor, sectionColor, min(1.0, sectionThickness * g2));
|
|
72
|
-
|
|
73
|
-
gl_FragColor = vec4(color, (g1 + g2) * pow(d, fadeStrength));
|
|
74
|
-
gl_FragColor.a = mix(0.75 * gl_FragColor.a, gl_FragColor.a, g2);
|
|
75
|
-
if (gl_FragColor.a <= 0.0) discard;
|
|
76
|
-
|
|
77
|
-
#include <tonemapping_fragment>
|
|
78
|
-
#include <${getVersion() >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>
|
|
79
|
-
}
|
|
80
|
-
`);
|
|
81
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1tYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc29iYS9zaGFkZXJzL3NyYy9saWIvZ3JpZC1tYXRlcmlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxLQUFLLEVBQTZCLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQTZCbEUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FDekM7SUFDQyxRQUFRLEVBQUUsR0FBRztJQUNiLFdBQVcsRUFBRSxDQUFDO0lBQ2QsWUFBWSxFQUFFLEdBQUc7SUFDakIsWUFBWSxFQUFFLENBQUM7SUFDZixRQUFRLEVBQUUsQ0FBQztJQUNYLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLGdCQUFnQixFQUFFLENBQUM7SUFDbkIsU0FBUyxFQUFFLElBQUksS0FBSyxFQUFFO0lBQ3RCLFlBQVksRUFBRSxJQUFJLEtBQUssRUFBRTtJQUN6QixZQUFZLEVBQUUsS0FBSztJQUNuQixZQUFZLEVBQUUsS0FBSztJQUNuQixvQkFBb0IsRUFBRSxJQUFJLE9BQU8sRUFBRTtJQUNuQyxrQkFBa0IsRUFBRSxJQUFJLE9BQU8sRUFBRTtDQUNqQztBQUNELHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0J2QjtBQUNGLHdCQUF3QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBb0NSLFVBQVUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjs7R0FFakYsQ0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmd0TWF0ZXJpYWwgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGdldFZlcnNpb24gfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvbWlzYyc7XG5pbXBvcnQgeyBzaGFkZXJNYXRlcmlhbCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS92YW5pbGxhLWV4cG9ydHMnO1xuaW1wb3J0IHsgQ29sb3IsIENvbG9yUmVwcmVzZW50YXRpb24sIFNpZGUsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZE1hdGVyaWFsT3B0aW9ucyB7XG5cdC8qKiBDZWxsIHNpemUsIGRlZmF1bHQ6IDAuNSAqL1xuXHRjZWxsU2l6ZTogbnVtYmVyO1xuXHQvKiogQ2VsbCB0aGlja25lc3MsIGRlZmF1bHQ6IDAuNSAqL1xuXHRjZWxsVGhpY2tuZXNzOiBudW1iZXI7XG5cdC8qKiBDZWxsIGNvbG9yLCBkZWZhdWx0OiBibGFjayAqL1xuXHRjZWxsQ29sb3I6IENvbG9yUmVwcmVzZW50YXRpb247XG5cdC8qKiBTZWN0aW9uIHNpemUsIGRlZmF1bHQ6IDEgKi9cblx0c2VjdGlvblNpemU6IG51bWJlcjtcblx0LyoqIFNlY3Rpb24gdGhpY2tuZXNzLCBkZWZhdWx0OiAxICovXG5cdHNlY3Rpb25UaGlja25lc3M6IG51bWJlcjtcblx0LyoqIFNlY3Rpb24gY29sb3IsIGRlZmF1bHQ6ICMyMDgwZmYgKi9cblx0c2VjdGlvbkNvbG9yOiBDb2xvclJlcHJlc2VudGF0aW9uO1xuXHQvKiogRm9sbG93IGNhbWVyYSwgZGVmYXVsdDogZmFsc2UgKi9cblx0Zm9sbG93Q2FtZXJhOiBib29sZWFuO1xuXHQvKiogRGlzcGxheSB0aGUgZ3JpZCBpbmZpbml0ZWx5LCBkZWZhdWx0OiBmYWxzZSAqL1xuXHRpbmZpbml0ZUdyaWQ6IGJvb2xlYW47XG5cdC8qKiBGYWRlIGRpc3RhbmNlLCBkZWZhdWx0OiAxMDAgKi9cblx0ZmFkZURpc3RhbmNlOiBudW1iZXI7XG5cdC8qKiBGYWRlIHN0cmVuZ3RoLCBkZWZhdWx0OiAxICovXG5cdGZhZGVTdHJlbmd0aDogbnVtYmVyO1xuXHQvKiogRmFkZSBmcm9tIGNhbWVyYSAoMSkgb3Igb3JpZ2luICgwKSwgb3Igc29tZXdoZXJlIGluIGJldHdlZW4sIGRlZmF1bHQ6IGNhbWVyYSAqL1xuXHRmYWRlRnJvbTogbnVtYmVyO1xuXHQvKiogTWF0ZXJpYWwgc2lkZSwgZGVmYXVsdDogVEhSRUUuQmFja1NpZGUgKi9cblx0c2lkZTogU2lkZTtcbn1cblxuZXhwb3J0IGNvbnN0IEdyaWRNYXRlcmlhbCA9IHNoYWRlck1hdGVyaWFsKFxuXHR7XG5cdFx0Y2VsbFNpemU6IDAuNSxcblx0XHRzZWN0aW9uU2l6ZTogMSxcblx0XHRmYWRlRGlzdGFuY2U6IDEwMCxcblx0XHRmYWRlU3RyZW5ndGg6IDEsXG5cdFx0ZmFkZUZyb206IDEsXG5cdFx0Y2VsbFRoaWNrbmVzczogMC41LFxuXHRcdHNlY3Rpb25UaGlja25lc3M6IDEsXG5cdFx0Y2VsbENvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRzZWN0aW9uQ29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdGluZmluaXRlR3JpZDogZmFsc2UsXG5cdFx0Zm9sbG93Q2FtZXJhOiBmYWxzZSxcblx0XHR3b3JsZENhbVByb2pQb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHR3b3JsZFBsYW5lUG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdH0sXG5cdC8qIGxhbmd1YWdlPWdsc2wgZ2xzbCAqLyBgXG4gICAgdmFyeWluZyB2ZWMzIGxvY2FsUG9zaXRpb247XG4gICAgdmFyeWluZyB2ZWM0IHdvcmxkUG9zaXRpb247XG5cbiAgICB1bmlmb3JtIHZlYzMgd29ybGRDYW1Qcm9qUG9zaXRpb247XG4gICAgdW5pZm9ybSB2ZWMzIHdvcmxkUGxhbmVQb3NpdGlvbjtcbiAgICB1bmlmb3JtIGZsb2F0IGZhZGVEaXN0YW5jZTtcbiAgICB1bmlmb3JtIGJvb2wgaW5maW5pdGVHcmlkO1xuICAgIHVuaWZvcm0gYm9vbCBmb2xsb3dDYW1lcmE7XG5cbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBsb2NhbFBvc2l0aW9uID0gcG9zaXRpb24ueHp5O1xuICAgICAgaWYgKGluZmluaXRlR3JpZCkgbG9jYWxQb3NpdGlvbiAqPSAxLjAgKyBmYWRlRGlzdGFuY2U7XG5cbiAgICAgIHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHZlYzQobG9jYWxQb3NpdGlvbiwgMS4wKTtcbiAgICAgIGlmIChmb2xsb3dDYW1lcmEpIHtcbiAgICAgICAgd29ybGRQb3NpdGlvbi54eXogKz0gKHdvcmxkQ2FtUHJvalBvc2l0aW9uIC0gd29ybGRQbGFuZVBvc2l0aW9uKTtcbiAgICAgICAgbG9jYWxQb3NpdGlvbiA9IChpbnZlcnNlKG1vZGVsTWF0cml4KSAqIHdvcmxkUG9zaXRpb24pLnh5ejtcbiAgICAgIH1cblxuICAgICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIHdvcmxkUG9zaXRpb247XG4gICAgfVxuICBgLFxuXHQvKiBsYW5ndWFnZT1nbHNsIGdsc2wgKi8gYFxuICAgIHZhcnlpbmcgdmVjMyBsb2NhbFBvc2l0aW9uO1xuICAgIHZhcnlpbmcgdmVjNCB3b3JsZFBvc2l0aW9uO1xuXG4gICAgdW5pZm9ybSB2ZWMzIHdvcmxkQ2FtUHJvalBvc2l0aW9uO1xuICAgIHVuaWZvcm0gZmxvYXQgY2VsbFNpemU7XG4gICAgdW5pZm9ybSBmbG9hdCBzZWN0aW9uU2l6ZTtcbiAgICB1bmlmb3JtIHZlYzMgY2VsbENvbG9yO1xuICAgIHVuaWZvcm0gdmVjMyBzZWN0aW9uQ29sb3I7XG4gICAgdW5pZm9ybSBmbG9hdCBmYWRlRGlzdGFuY2U7XG4gICAgdW5pZm9ybSBmbG9hdCBmYWRlU3RyZW5ndGg7XG4gICAgdW5pZm9ybSBmbG9hdCBmYWRlRnJvbTtcbiAgICB1bmlmb3JtIGZsb2F0IGNlbGxUaGlja25lc3M7XG4gICAgdW5pZm9ybSBmbG9hdCBzZWN0aW9uVGhpY2tuZXNzO1xuXG4gICAgZmxvYXQgZ2V0R3JpZChmbG9hdCBzaXplLCBmbG9hdCB0aGlja25lc3MpIHtcbiAgICAgIHZlYzIgciA9IGxvY2FsUG9zaXRpb24ueHogLyBzaXplO1xuICAgICAgdmVjMiBncmlkID0gYWJzKGZyYWN0KHIgLSAwLjUpIC0gMC41KSAvIGZ3aWR0aChyKTtcbiAgICAgIGZsb2F0IGxpbmUgPSBtaW4oZ3JpZC54LCBncmlkLnkpICsgMS4wIC0gdGhpY2tuZXNzO1xuICAgICAgcmV0dXJuIDEuMCAtIG1pbihsaW5lLCAxLjApO1xuICAgIH1cblxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgIGZsb2F0IGcxID0gZ2V0R3JpZChjZWxsU2l6ZSwgY2VsbFRoaWNrbmVzcyk7XG4gICAgICBmbG9hdCBnMiA9IGdldEdyaWQoc2VjdGlvblNpemUsIHNlY3Rpb25UaGlja25lc3MpO1xuXG4gICAgICB2ZWMzIGZyb20gPSB3b3JsZENhbVByb2pQb3NpdGlvbip2ZWMzKGZhZGVGcm9tKTtcbiAgICAgIGZsb2F0IGRpc3QgPSBkaXN0YW5jZShmcm9tLCB3b3JsZFBvc2l0aW9uLnh5eik7XG4gICAgICBmbG9hdCBkID0gMS4wIC0gbWluKGRpc3QgLyBmYWRlRGlzdGFuY2UsIDEuMCk7XG4gICAgICB2ZWMzIGNvbG9yID0gbWl4KGNlbGxDb2xvciwgc2VjdGlvbkNvbG9yLCBtaW4oMS4wLCBzZWN0aW9uVGhpY2tuZXNzICogZzIpKTtcblxuICAgICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvciwgKGcxICsgZzIpICogcG93KGQsIGZhZGVTdHJlbmd0aCkpO1xuICAgICAgZ2xfRnJhZ0NvbG9yLmEgPSBtaXgoMC43NSAqIGdsX0ZyYWdDb2xvci5hLCBnbF9GcmFnQ29sb3IuYSwgZzIpO1xuICAgICAgaWYgKGdsX0ZyYWdDb2xvci5hIDw9IDAuMCkgZGlzY2FyZDtcblxuICAgICAgI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuICAgICAgI2luY2x1ZGUgPCR7Z2V0VmVyc2lvbigpID49IDE1NCA/ICdjb2xvcnNwYWNlX2ZyYWdtZW50JyA6ICdlbmNvZGluZ3NfZnJhZ21lbnQnfT5cbiAgICB9XG4gIGAsXG4pO1xuXG5leHBvcnQgdHlwZSBOZ3RHcmlkTWF0ZXJpYWwgPSBOZ3RNYXRlcmlhbDxJbnN0YW5jZVR5cGU8dHlwZW9mIEdyaWRNYXRlcmlhbD4sIFtHcmlkTWF0ZXJpYWxPcHRpb25zXT47XG5cbmRlY2xhcmUgZ2xvYmFsIHtcblx0aW50ZXJmYWNlIEhUTUxFbGVtZW50VGFnTmFtZU1hcCB7XG5cdFx0LyoqXG5cdFx0ICogQGV4dGVuZHMgbmd0LXNoYWRlci1tYXRlcmlhbFxuXHRcdCAqIEBvcHRpb25zIEdyaWRNYXRlcmlhbE9wdGlvbnNcblx0XHQgKi9cblx0XHQnbmd0LWdyaWQtbWF0ZXJpYWwnOiBOZ3RHcmlkTWF0ZXJpYWw7XG5cdH1cbn1cbiJdfQ==
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
import { getVersion } from 'angular-three-soba/misc';
|
|
2
|
-
import { shaderMaterial } from 'angular-three-soba/vanilla-exports';
|
|
3
|
-
import * as THREE from 'three';
|
|
4
|
-
import { MeshBVHUniformStruct, shaderIntersectFunction, shaderStructs } from 'three-mesh-bvh';
|
|
5
|
-
export const MeshRefractionMaterial = shaderMaterial({
|
|
6
|
-
envMap: null,
|
|
7
|
-
bounces: 3,
|
|
8
|
-
ior: 2.4,
|
|
9
|
-
correctMips: true,
|
|
10
|
-
aberrationStrength: 0.01,
|
|
11
|
-
fresnel: 0,
|
|
12
|
-
// @ts-expect-error - UniformValue from pmndrs/vanilla does not include MeshBVHUniformStruct
|
|
13
|
-
bvh: new MeshBVHUniformStruct(),
|
|
14
|
-
color: new THREE.Color('white'),
|
|
15
|
-
opacity: 1,
|
|
16
|
-
resolution: new THREE.Vector2(),
|
|
17
|
-
viewMatrixInverse: new THREE.Matrix4(),
|
|
18
|
-
projectionMatrixInverse: new THREE.Matrix4(),
|
|
19
|
-
},
|
|
20
|
-
/* language=glsl glsl */ `
|
|
21
|
-
uniform mat4 viewMatrixInverse;
|
|
22
|
-
|
|
23
|
-
varying vec3 vWorldPosition;
|
|
24
|
-
varying vec3 vNormal;
|
|
25
|
-
varying mat4 vModelMatrixInverse;
|
|
26
|
-
|
|
27
|
-
#include <color_pars_vertex>
|
|
28
|
-
|
|
29
|
-
void main() {
|
|
30
|
-
#include <color_vertex>
|
|
31
|
-
|
|
32
|
-
vec4 transformedNormal = vec4(normal, 0.0);
|
|
33
|
-
vec4 transformedPosition = vec4(position, 1.0);
|
|
34
|
-
#ifdef USE_INSTANCING
|
|
35
|
-
transformedNormal = instanceMatrix * transformedNormal;
|
|
36
|
-
transformedPosition = instanceMatrix * transformedPosition;
|
|
37
|
-
#endif
|
|
38
|
-
|
|
39
|
-
#ifdef USE_INSTANCING
|
|
40
|
-
vModelMatrixInverse = inverse(modelMatrix * instanceMatrix);
|
|
41
|
-
#else
|
|
42
|
-
vModelMatrixInverse = inverse(modelMatrix);
|
|
43
|
-
#endif
|
|
44
|
-
|
|
45
|
-
vWorldPosition = (modelMatrix * transformedPosition).xyz;
|
|
46
|
-
vNormal = normalize((viewMatrixInverse * vec4(normalMatrix * transformedNormal.xyz, 0.0)).xyz);
|
|
47
|
-
gl_Position = projectionMatrix * viewMatrix * modelMatrix * transformedPosition;
|
|
48
|
-
}`,
|
|
49
|
-
/* language=glsl glsl */ `
|
|
50
|
-
#define ENVMAP_TYPE_CUBE_UV
|
|
51
|
-
precision highp isampler2D;
|
|
52
|
-
precision highp usampler2D;
|
|
53
|
-
varying vec3 vWorldPosition;
|
|
54
|
-
varying vec3 vNormal;
|
|
55
|
-
varying mat4 vModelMatrixInverse;
|
|
56
|
-
|
|
57
|
-
#include <color_pars_fragment>
|
|
58
|
-
|
|
59
|
-
#ifdef ENVMAP_TYPE_CUBEM
|
|
60
|
-
uniform samplerCube envMap;
|
|
61
|
-
#else
|
|
62
|
-
uniform sampler2D envMap;
|
|
63
|
-
#endif
|
|
64
|
-
|
|
65
|
-
uniform float bounces;
|
|
66
|
-
${shaderStructs}
|
|
67
|
-
${shaderIntersectFunction}
|
|
68
|
-
uniform BVH bvh;
|
|
69
|
-
uniform float ior;
|
|
70
|
-
uniform bool correctMips;
|
|
71
|
-
uniform vec2 resolution;
|
|
72
|
-
uniform float fresnel;
|
|
73
|
-
uniform mat4 modelMatrix;
|
|
74
|
-
uniform mat4 projectionMatrixInverse;
|
|
75
|
-
uniform mat4 viewMatrixInverse;
|
|
76
|
-
uniform float aberrationStrength;
|
|
77
|
-
uniform vec3 color;
|
|
78
|
-
uniform float opacity;
|
|
79
|
-
|
|
80
|
-
float fresnelFunc(vec3 viewDirection, vec3 worldNormal) {
|
|
81
|
-
return pow( 1.0 + dot( viewDirection, worldNormal), 10.0 );
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
vec3 totalInternalReflection(vec3 ro, vec3 rd, vec3 normal, float ior, mat4 modelMatrixInverse) {
|
|
85
|
-
vec3 rayOrigin = ro;
|
|
86
|
-
vec3 rayDirection = rd;
|
|
87
|
-
rayDirection = refract(rayDirection, normal, 1.0 / ior);
|
|
88
|
-
rayOrigin = vWorldPosition + rayDirection * 0.001;
|
|
89
|
-
rayOrigin = (modelMatrixInverse * vec4(rayOrigin, 1.0)).xyz;
|
|
90
|
-
rayDirection = normalize((modelMatrixInverse * vec4(rayDirection, 0.0)).xyz);
|
|
91
|
-
for(float i = 0.0; i < bounces; i++) {
|
|
92
|
-
uvec4 faceIndices = uvec4( 0u );
|
|
93
|
-
vec3 faceNormal = vec3( 0.0, 0.0, 1.0 );
|
|
94
|
-
vec3 barycoord = vec3( 0.0 );
|
|
95
|
-
float side = 1.0;
|
|
96
|
-
float dist = 0.0;
|
|
97
|
-
bvhIntersectFirstHit( bvh, rayOrigin, rayDirection, faceIndices, faceNormal, barycoord, side, dist );
|
|
98
|
-
vec3 hitPos = rayOrigin + rayDirection * max(dist - 0.001, 0.0);
|
|
99
|
-
vec3 tempDir = refract(rayDirection, faceNormal, ior);
|
|
100
|
-
if (length(tempDir) != 0.0) {
|
|
101
|
-
rayDirection = tempDir;
|
|
102
|
-
break;
|
|
103
|
-
}
|
|
104
|
-
rayDirection = reflect(rayDirection, faceNormal);
|
|
105
|
-
rayOrigin = hitPos + rayDirection * 0.01;
|
|
106
|
-
}
|
|
107
|
-
rayDirection = normalize((modelMatrix * vec4(rayDirection, 0.0)).xyz);
|
|
108
|
-
return rayDirection;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
#include <common>
|
|
112
|
-
#include <cube_uv_reflection_fragment>
|
|
113
|
-
|
|
114
|
-
#ifdef ENVMAP_TYPE_CUBEM
|
|
115
|
-
vec4 textureGradient(samplerCube envMap, vec3 rayDirection, vec3 directionCamPerfect) {
|
|
116
|
-
return textureGrad(envMap, rayDirection, dFdx(correctMips ? directionCamPerfect: rayDirection), dFdy(correctMips ? directionCamPerfect: rayDirection));
|
|
117
|
-
}
|
|
118
|
-
#else
|
|
119
|
-
vec4 textureGradient(sampler2D envMap, vec3 rayDirection, vec3 directionCamPerfect) {
|
|
120
|
-
vec2 uvv = equirectUv( rayDirection );
|
|
121
|
-
vec2 smoothUv = equirectUv( directionCamPerfect );
|
|
122
|
-
return textureGrad(envMap, uvv, dFdx(correctMips ? smoothUv : uvv), dFdy(correctMips ? smoothUv : uvv));
|
|
123
|
-
}
|
|
124
|
-
#endif
|
|
125
|
-
|
|
126
|
-
void main() {
|
|
127
|
-
vec2 uv = gl_FragCoord.xy / resolution;
|
|
128
|
-
vec3 directionCamPerfect = (projectionMatrixInverse * vec4(uv * 2.0 - 1.0, 0.0, 1.0)).xyz;
|
|
129
|
-
directionCamPerfect = (viewMatrixInverse * vec4(directionCamPerfect, 0.0)).xyz;
|
|
130
|
-
directionCamPerfect = normalize(directionCamPerfect);
|
|
131
|
-
vec3 normal = vNormal;
|
|
132
|
-
vec3 rayOrigin = cameraPosition;
|
|
133
|
-
vec3 rayDirection = normalize(vWorldPosition - cameraPosition);
|
|
134
|
-
|
|
135
|
-
vec4 diffuseColor = vec4(color, opacity);
|
|
136
|
-
#include <color_fragment>
|
|
137
|
-
|
|
138
|
-
#ifdef CHROMATIC_ABERRATIONS
|
|
139
|
-
vec3 rayDirectionG = totalInternalReflection(rayOrigin, rayDirection, normal, max(ior, 1.0), vModelMatrixInverse);
|
|
140
|
-
#ifdef FAST_CHROMA
|
|
141
|
-
vec3 rayDirectionR = normalize(rayDirectionG + 1.0 * vec3(aberrationStrength / 2.0));
|
|
142
|
-
vec3 rayDirectionB = normalize(rayDirectionG - 1.0 * vec3(aberrationStrength / 2.0));
|
|
143
|
-
#else
|
|
144
|
-
vec3 rayDirectionR = totalInternalReflection(rayOrigin, rayDirection, normal, max(ior * (1.0 - aberrationStrength), 1.0), vModelMatrixInverse);
|
|
145
|
-
vec3 rayDirectionB = totalInternalReflection(rayOrigin, rayDirection, normal, max(ior * (1.0 + aberrationStrength), 1.0), vModelMatrixInverse);
|
|
146
|
-
#endif
|
|
147
|
-
float finalColorR = textureGradient(envMap, rayDirectionR, directionCamPerfect).r;
|
|
148
|
-
float finalColorG = textureGradient(envMap, rayDirectionG, directionCamPerfect).g;
|
|
149
|
-
float finalColorB = textureGradient(envMap, rayDirectionB, directionCamPerfect).b;
|
|
150
|
-
diffuseColor.rgb *= vec3(finalColorR, finalColorG, finalColorB);
|
|
151
|
-
#else
|
|
152
|
-
rayDirection = totalInternalReflection(rayOrigin, rayDirection, normal, max(ior, 1.0), vModelMatrixInverse);
|
|
153
|
-
diffuseColor.rgb *= textureGradient(envMap, rayDirection, directionCamPerfect).rgb;
|
|
154
|
-
#endif
|
|
155
|
-
|
|
156
|
-
vec3 viewDirection = normalize(vWorldPosition - cameraPosition);
|
|
157
|
-
float nFresnel = fresnelFunc(viewDirection, normal) * fresnel;
|
|
158
|
-
gl_FragColor = vec4(mix(diffuseColor.rgb, vec3(1.0), nFresnel), diffuseColor.a);
|
|
159
|
-
|
|
160
|
-
#include <tonemapping_fragment>
|
|
161
|
-
#include <${getVersion() >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>
|
|
162
|
-
}`);
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaC1yZWZyYWN0aW9uLW1hdGVyaWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zb2JhL3NoYWRlcnMvc3JjL2xpYi9tZXNoLXJlZnJhY3Rpb24tbWF0ZXJpYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUYsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsY0FBYyxDQUNuRDtJQUNDLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLENBQUM7SUFDVixHQUFHLEVBQUUsR0FBRztJQUNSLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsT0FBTyxFQUFFLENBQUM7SUFDViw0RkFBNEY7SUFDNUYsR0FBRyxFQUFFLElBQUksb0JBQW9CLEVBQUU7SUFDL0IsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7SUFDL0IsT0FBTyxFQUFFLENBQUM7SUFDVixVQUFVLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO0lBQy9CLGlCQUFpQixFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtJQUN0Qyx1QkFBdUIsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7Q0FDNUM7QUFDRCx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQTRCdEI7QUFDSCx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFpQnRCLGFBQWE7SUFDYix1QkFBdUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0JBOEZYLFVBQVUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtJQUM5RSxDQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRWZXJzaW9uIH0gZnJvbSAnYW5ndWxhci10aHJlZS1zb2JhL21pc2MnO1xuaW1wb3J0IHsgc2hhZGVyTWF0ZXJpYWwgfSBmcm9tICdhbmd1bGFyLXRocmVlLXNvYmEvdmFuaWxsYS1leHBvcnRzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IE1lc2hCVkhVbmlmb3JtU3RydWN0LCBzaGFkZXJJbnRlcnNlY3RGdW5jdGlvbiwgc2hhZGVyU3RydWN0cyB9IGZyb20gJ3RocmVlLW1lc2gtYnZoJztcblxuZXhwb3J0IGNvbnN0IE1lc2hSZWZyYWN0aW9uTWF0ZXJpYWwgPSBzaGFkZXJNYXRlcmlhbChcblx0e1xuXHRcdGVudk1hcDogbnVsbCxcblx0XHRib3VuY2VzOiAzLFxuXHRcdGlvcjogMi40LFxuXHRcdGNvcnJlY3RNaXBzOiB0cnVlLFxuXHRcdGFiZXJyYXRpb25TdHJlbmd0aDogMC4wMSxcblx0XHRmcmVzbmVsOiAwLFxuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSBVbmlmb3JtVmFsdWUgZnJvbSBwbW5kcnMvdmFuaWxsYSBkb2VzIG5vdCBpbmNsdWRlIE1lc2hCVkhVbmlmb3JtU3RydWN0XG5cdFx0YnZoOiBuZXcgTWVzaEJWSFVuaWZvcm1TdHJ1Y3QoKSxcblx0XHRjb2xvcjogbmV3IFRIUkVFLkNvbG9yKCd3aGl0ZScpLFxuXHRcdG9wYWNpdHk6IDEsXG5cdFx0cmVzb2x1dGlvbjogbmV3IFRIUkVFLlZlY3RvcjIoKSxcblx0XHR2aWV3TWF0cml4SW52ZXJzZTogbmV3IFRIUkVFLk1hdHJpeDQoKSxcblx0XHRwcm9qZWN0aW9uTWF0cml4SW52ZXJzZTogbmV3IFRIUkVFLk1hdHJpeDQoKSxcblx0fSxcblx0LyogbGFuZ3VhZ2U9Z2xzbCBnbHNsICovIGBcbiAgdW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXhJbnZlcnNlO1xuXG4gIHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiAgdmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4gIHZhcnlpbmcgbWF0NCB2TW9kZWxNYXRyaXhJbnZlcnNlO1xuXG4gICNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cblxuICB2b2lkIG1haW4oKSB7XG4gICAgI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblxuICAgIHZlYzQgdHJhbnNmb3JtZWROb3JtYWwgPSB2ZWM0KG5vcm1hbCwgMC4wKTtcbiAgICB2ZWM0IHRyYW5zZm9ybWVkUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICAgICNpZmRlZiBVU0VfSU5TVEFOQ0lOR1xuICAgICAgdHJhbnNmb3JtZWROb3JtYWwgPSBpbnN0YW5jZU1hdHJpeCAqIHRyYW5zZm9ybWVkTm9ybWFsO1xuICAgICAgdHJhbnNmb3JtZWRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogdHJhbnNmb3JtZWRQb3NpdGlvbjtcbiAgICAjZW5kaWZcblxuICAgICNpZmRlZiBVU0VfSU5TVEFOQ0lOR1xuICAgICAgdk1vZGVsTWF0cml4SW52ZXJzZSA9IGludmVyc2UobW9kZWxNYXRyaXggKiBpbnN0YW5jZU1hdHJpeCk7XG4gICAgI2Vsc2VcbiAgICAgIHZNb2RlbE1hdHJpeEludmVyc2UgPSBpbnZlcnNlKG1vZGVsTWF0cml4KTtcbiAgICAjZW5kaWZcblxuICAgIHZXb3JsZFBvc2l0aW9uID0gKG1vZGVsTWF0cml4ICogdHJhbnNmb3JtZWRQb3NpdGlvbikueHl6O1xuICAgIHZOb3JtYWwgPSBub3JtYWxpemUoKHZpZXdNYXRyaXhJbnZlcnNlICogdmVjNChub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbC54eXosIDAuMCkpLnh5eik7XG4gICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogdmlld01hdHJpeCAqIG1vZGVsTWF0cml4ICogdHJhbnNmb3JtZWRQb3NpdGlvbjtcbiAgfWAsXG5cdC8qIGxhbmd1YWdlPWdsc2wgZ2xzbCAqLyBgXG4gICNkZWZpbmUgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuICBwcmVjaXNpb24gaGlnaHAgaXNhbXBsZXIyRDtcbiAgcHJlY2lzaW9uIGhpZ2hwIHVzYW1wbGVyMkQ7XG4gIHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiAgdmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4gIHZhcnlpbmcgbWF0NCB2TW9kZWxNYXRyaXhJbnZlcnNlO1xuXG4gICNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuXG4gICNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFTVxuICAgIHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuICAjZWxzZVxuICAgIHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcbiAgI2VuZGlmXG5cbiAgdW5pZm9ybSBmbG9hdCBib3VuY2VzO1xuICAke3NoYWRlclN0cnVjdHN9XG4gICR7c2hhZGVySW50ZXJzZWN0RnVuY3Rpb259XG4gIHVuaWZvcm0gQlZIIGJ2aDtcbiAgdW5pZm9ybSBmbG9hdCBpb3I7XG4gIHVuaWZvcm0gYm9vbCBjb3JyZWN0TWlwcztcbiAgdW5pZm9ybSB2ZWMyIHJlc29sdXRpb247XG4gIHVuaWZvcm0gZmxvYXQgZnJlc25lbDtcbiAgdW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4O1xuICB1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeEludmVyc2U7XG4gIHVuaWZvcm0gbWF0NCB2aWV3TWF0cml4SW52ZXJzZTtcbiAgdW5pZm9ybSBmbG9hdCBhYmVycmF0aW9uU3RyZW5ndGg7XG4gIHVuaWZvcm0gdmVjMyBjb2xvcjtcbiAgdW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuXG4gIGZsb2F0IGZyZXNuZWxGdW5jKHZlYzMgdmlld0RpcmVjdGlvbiwgdmVjMyB3b3JsZE5vcm1hbCkge1xuICAgIHJldHVybiBwb3coIDEuMCArIGRvdCggdmlld0RpcmVjdGlvbiwgd29ybGROb3JtYWwpLCAxMC4wICk7XG4gIH1cblxuICB2ZWMzIHRvdGFsSW50ZXJuYWxSZWZsZWN0aW9uKHZlYzMgcm8sIHZlYzMgcmQsIHZlYzMgbm9ybWFsLCBmbG9hdCBpb3IsIG1hdDQgbW9kZWxNYXRyaXhJbnZlcnNlKSB7XG4gICAgdmVjMyByYXlPcmlnaW4gPSBybztcbiAgICB2ZWMzIHJheURpcmVjdGlvbiA9IHJkO1xuICAgIHJheURpcmVjdGlvbiA9IHJlZnJhY3QocmF5RGlyZWN0aW9uLCBub3JtYWwsIDEuMCAvIGlvcik7XG4gICAgcmF5T3JpZ2luID0gdldvcmxkUG9zaXRpb24gKyByYXlEaXJlY3Rpb24gKiAwLjAwMTtcbiAgICByYXlPcmlnaW4gPSAobW9kZWxNYXRyaXhJbnZlcnNlICogdmVjNChyYXlPcmlnaW4sIDEuMCkpLnh5ejtcbiAgICByYXlEaXJlY3Rpb24gPSBub3JtYWxpemUoKG1vZGVsTWF0cml4SW52ZXJzZSAqIHZlYzQocmF5RGlyZWN0aW9uLCAwLjApKS54eXopO1xuICAgIGZvcihmbG9hdCBpID0gMC4wOyBpIDwgYm91bmNlczsgaSsrKSB7XG4gICAgICB1dmVjNCBmYWNlSW5kaWNlcyA9IHV2ZWM0KCAwdSApO1xuICAgICAgdmVjMyBmYWNlTm9ybWFsID0gdmVjMyggMC4wLCAwLjAsIDEuMCApO1xuICAgICAgdmVjMyBiYXJ5Y29vcmQgPSB2ZWMzKCAwLjAgKTtcbiAgICAgIGZsb2F0IHNpZGUgPSAxLjA7XG4gICAgICBmbG9hdCBkaXN0ID0gMC4wO1xuICAgICAgYnZoSW50ZXJzZWN0Rmlyc3RIaXQoIGJ2aCwgcmF5T3JpZ2luLCByYXlEaXJlY3Rpb24sIGZhY2VJbmRpY2VzLCBmYWNlTm9ybWFsLCBiYXJ5Y29vcmQsIHNpZGUsIGRpc3QgKTtcbiAgICAgIHZlYzMgaGl0UG9zID0gcmF5T3JpZ2luICsgcmF5RGlyZWN0aW9uICogbWF4KGRpc3QgLSAwLjAwMSwgMC4wKTtcbiAgICAgIHZlYzMgdGVtcERpciA9IHJlZnJhY3QocmF5RGlyZWN0aW9uLCBmYWNlTm9ybWFsLCBpb3IpO1xuICAgICAgaWYgKGxlbmd0aCh0ZW1wRGlyKSAhPSAwLjApIHtcbiAgICAgICAgcmF5RGlyZWN0aW9uID0gdGVtcERpcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByYXlEaXJlY3Rpb24gPSByZWZsZWN0KHJheURpcmVjdGlvbiwgZmFjZU5vcm1hbCk7XG4gICAgICByYXlPcmlnaW4gPSBoaXRQb3MgKyByYXlEaXJlY3Rpb24gKiAwLjAxO1xuICAgIH1cbiAgICByYXlEaXJlY3Rpb24gPSBub3JtYWxpemUoKG1vZGVsTWF0cml4ICogdmVjNChyYXlEaXJlY3Rpb24sIDAuMCkpLnh5eik7XG4gICAgcmV0dXJuIHJheURpcmVjdGlvbjtcbiAgfVxuXG4gICNpbmNsdWRlIDxjb21tb24+XG4gICNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG5cbiAgI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVNXG4gICAgdmVjNCB0ZXh0dXJlR3JhZGllbnQoc2FtcGxlckN1YmUgZW52TWFwLCB2ZWMzIHJheURpcmVjdGlvbiwgdmVjMyBkaXJlY3Rpb25DYW1QZXJmZWN0KSB7XG4gICAgICByZXR1cm4gdGV4dHVyZUdyYWQoZW52TWFwLCByYXlEaXJlY3Rpb24sIGRGZHgoY29ycmVjdE1pcHMgPyBkaXJlY3Rpb25DYW1QZXJmZWN0OiByYXlEaXJlY3Rpb24pLCBkRmR5KGNvcnJlY3RNaXBzID8gZGlyZWN0aW9uQ2FtUGVyZmVjdDogcmF5RGlyZWN0aW9uKSk7XG4gICAgfVxuICAjZWxzZVxuICAgIHZlYzQgdGV4dHVyZUdyYWRpZW50KHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgcmF5RGlyZWN0aW9uLCB2ZWMzIGRpcmVjdGlvbkNhbVBlcmZlY3QpIHtcbiAgICAgIHZlYzIgdXZ2ID0gZXF1aXJlY3RVdiggcmF5RGlyZWN0aW9uICk7XG4gICAgICB2ZWMyIHNtb290aFV2ID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uQ2FtUGVyZmVjdCApO1xuICAgICAgcmV0dXJuIHRleHR1cmVHcmFkKGVudk1hcCwgdXZ2LCBkRmR4KGNvcnJlY3RNaXBzID8gc21vb3RoVXYgOiB1dnYpLCBkRmR5KGNvcnJlY3RNaXBzID8gc21vb3RoVXYgOiB1dnYpKTtcbiAgICB9XG4gICNlbmRpZlxuXG4gIHZvaWQgbWFpbigpIHtcbiAgICB2ZWMyIHV2ID0gZ2xfRnJhZ0Nvb3JkLnh5IC8gcmVzb2x1dGlvbjtcbiAgICB2ZWMzIGRpcmVjdGlvbkNhbVBlcmZlY3QgPSAocHJvamVjdGlvbk1hdHJpeEludmVyc2UgKiB2ZWM0KHV2ICogMi4wIC0gMS4wLCAwLjAsIDEuMCkpLnh5ejtcbiAgICBkaXJlY3Rpb25DYW1QZXJmZWN0ID0gKHZpZXdNYXRyaXhJbnZlcnNlICogdmVjNChkaXJlY3Rpb25DYW1QZXJmZWN0LCAwLjApKS54eXo7XG4gICAgZGlyZWN0aW9uQ2FtUGVyZmVjdCA9IG5vcm1hbGl6ZShkaXJlY3Rpb25DYW1QZXJmZWN0KTtcbiAgICB2ZWMzIG5vcm1hbCA9IHZOb3JtYWw7XG4gICAgdmVjMyByYXlPcmlnaW4gPSBjYW1lcmFQb3NpdGlvbjtcbiAgICB2ZWMzIHJheURpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uKTtcblxuICAgIHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNChjb2xvciwgb3BhY2l0eSk7XG4gICAgI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXG4gICAgI2lmZGVmIENIUk9NQVRJQ19BQkVSUkFUSU9OU1xuICAgICAgdmVjMyByYXlEaXJlY3Rpb25HID0gdG90YWxJbnRlcm5hbFJlZmxlY3Rpb24ocmF5T3JpZ2luLCByYXlEaXJlY3Rpb24sIG5vcm1hbCwgbWF4KGlvciwgMS4wKSwgdk1vZGVsTWF0cml4SW52ZXJzZSk7XG4gICAgICAjaWZkZWYgRkFTVF9DSFJPTUFcbiAgICAgICAgdmVjMyByYXlEaXJlY3Rpb25SID0gbm9ybWFsaXplKHJheURpcmVjdGlvbkcgKyAxLjAgKiB2ZWMzKGFiZXJyYXRpb25TdHJlbmd0aCAvIDIuMCkpO1xuICAgICAgICB2ZWMzIHJheURpcmVjdGlvbkIgPSBub3JtYWxpemUocmF5RGlyZWN0aW9uRyAtIDEuMCAqIHZlYzMoYWJlcnJhdGlvblN0cmVuZ3RoIC8gMi4wKSk7XG4gICAgICAjZWxzZVxuICAgICAgICB2ZWMzIHJheURpcmVjdGlvblIgPSB0b3RhbEludGVybmFsUmVmbGVjdGlvbihyYXlPcmlnaW4sIHJheURpcmVjdGlvbiwgbm9ybWFsLCBtYXgoaW9yICogKDEuMCAtIGFiZXJyYXRpb25TdHJlbmd0aCksIDEuMCksIHZNb2RlbE1hdHJpeEludmVyc2UpO1xuICAgICAgICB2ZWMzIHJheURpcmVjdGlvbkIgPSB0b3RhbEludGVybmFsUmVmbGVjdGlvbihyYXlPcmlnaW4sIHJheURpcmVjdGlvbiwgbm9ybWFsLCBtYXgoaW9yICogKDEuMCArIGFiZXJyYXRpb25TdHJlbmd0aCksIDEuMCksIHZNb2RlbE1hdHJpeEludmVyc2UpO1xuICAgICAgI2VuZGlmXG4gICAgICBmbG9hdCBmaW5hbENvbG9yUiA9IHRleHR1cmVHcmFkaWVudChlbnZNYXAsIHJheURpcmVjdGlvblIsIGRpcmVjdGlvbkNhbVBlcmZlY3QpLnI7XG4gICAgICBmbG9hdCBmaW5hbENvbG9yRyA9IHRleHR1cmVHcmFkaWVudChlbnZNYXAsIHJheURpcmVjdGlvbkcsIGRpcmVjdGlvbkNhbVBlcmZlY3QpLmc7XG4gICAgICBmbG9hdCBmaW5hbENvbG9yQiA9IHRleHR1cmVHcmFkaWVudChlbnZNYXAsIHJheURpcmVjdGlvbkIsIGRpcmVjdGlvbkNhbVBlcmZlY3QpLmI7XG4gICAgICBkaWZmdXNlQ29sb3IucmdiICo9IHZlYzMoZmluYWxDb2xvclIsIGZpbmFsQ29sb3JHLCBmaW5hbENvbG9yQik7XG4gICAgI2Vsc2VcbiAgICAgIHJheURpcmVjdGlvbiA9IHRvdGFsSW50ZXJuYWxSZWZsZWN0aW9uKHJheU9yaWdpbiwgcmF5RGlyZWN0aW9uLCBub3JtYWwsIG1heChpb3IsIDEuMCksIHZNb2RlbE1hdHJpeEludmVyc2UpO1xuICAgICAgZGlmZnVzZUNvbG9yLnJnYiAqPSB0ZXh0dXJlR3JhZGllbnQoZW52TWFwLCByYXlEaXJlY3Rpb24sIGRpcmVjdGlvbkNhbVBlcmZlY3QpLnJnYjtcbiAgICAjZW5kaWZcblxuICAgIHZlYzMgdmlld0RpcmVjdGlvbiA9IG5vcm1hbGl6ZSh2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uKTtcbiAgICBmbG9hdCBuRnJlc25lbCA9IGZyZXNuZWxGdW5jKHZpZXdEaXJlY3Rpb24sIG5vcm1hbCkgKiBmcmVzbmVsO1xuICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQobWl4KGRpZmZ1c2VDb2xvci5yZ2IsIHZlYzMoMS4wKSwgbkZyZXNuZWwpLCBkaWZmdXNlQ29sb3IuYSk7XG5cbiAgICAjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG4gICAgI2luY2x1ZGUgPCR7Z2V0VmVyc2lvbigpID49IDE1NCA/ICdjb2xvcnNwYWNlX2ZyYWdtZW50JyA6ICdlbmNvZGluZ3NfZnJhZ21lbnQnfT5cbiAgfWAsXG4pO1xuIl19
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { getVersion } from 'angular-three-soba/misc';
|
|
2
|
-
import { PointsMaterial } from 'three';
|
|
3
|
-
const opaque_fragment = getVersion() >= 154 ? 'opaque_fragment' : 'output_fragment';
|
|
4
|
-
export class PointMaterial extends PointsMaterial {
|
|
5
|
-
constructor(props) {
|
|
6
|
-
super(props);
|
|
7
|
-
this.onBeforeCompile = (shader, renderer) => {
|
|
8
|
-
const { isWebGL2 } = renderer.capabilities;
|
|
9
|
-
shader.fragmentShader = shader.fragmentShader.replace(`#include <${opaque_fragment}>`, `
|
|
10
|
-
${!isWebGL2
|
|
11
|
-
? `#extension GL_OES_standard_derivatives : enable\n#include <${opaque_fragment}>`
|
|
12
|
-
: `#include <${opaque_fragment}>`}
|
|
13
|
-
vec2 cxy = 2.0 * gl_PointCoord - 1.0;
|
|
14
|
-
float r = dot(cxy, cxy);
|
|
15
|
-
float delta = fwidth(r);
|
|
16
|
-
float mask = 1.0 - smoothstep(1.0 - delta, 1.0 + delta, r);
|
|
17
|
-
gl_FragColor = vec4(gl_FragColor.rgb, mask * gl_FragColor.a );
|
|
18
|
-
#include <tonemapping_fragment>
|
|
19
|
-
#include <${getVersion() >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>
|
|
20
|
-
`);
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQtbWF0ZXJpYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc2hhZGVycy9zcmMvbGliL3BvaW50LW1hdGVyaWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUE0QixNQUFNLE9BQU8sQ0FBQztBQUVqRSxNQUFNLGVBQWUsR0FBRyxVQUFVLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQztBQUVwRixNQUFNLE9BQU8sYUFBYyxTQUFRLGNBQWM7SUFDaEQsWUFBWSxLQUErQjtRQUMxQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDYixJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQzNDLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQ3BELGFBQWEsZUFBZSxHQUFHLEVBQy9CO1VBRUMsQ0FBQyxRQUFRO2dCQUNSLENBQUMsQ0FBQyw4REFBOEQsZUFBZSxHQUFHO2dCQUNsRixDQUFDLENBQUMsYUFBYSxlQUFlLEdBQ2hDOzs7Ozs7O2tCQU9jLFVBQVUsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtPQUM3RSxDQUNILENBQUM7UUFDSCxDQUFDLENBQUM7SUFDSCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ3RNYXRlcmlhbCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvbiB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtc29iYS9taXNjJztcbmltcG9ydCB7IFBvaW50c01hdGVyaWFsLCBQb2ludHNNYXRlcmlhbFBhcmFtZXRlcnMgfSBmcm9tICd0aHJlZSc7XG5cbmNvbnN0IG9wYXF1ZV9mcmFnbWVudCA9IGdldFZlcnNpb24oKSA+PSAxNTQgPyAnb3BhcXVlX2ZyYWdtZW50JyA6ICdvdXRwdXRfZnJhZ21lbnQnO1xuXG5leHBvcnQgY2xhc3MgUG9pbnRNYXRlcmlhbCBleHRlbmRzIFBvaW50c01hdGVyaWFsIHtcblx0Y29uc3RydWN0b3IocHJvcHM6IFBvaW50c01hdGVyaWFsUGFyYW1ldGVycykge1xuXHRcdHN1cGVyKHByb3BzKTtcblx0XHR0aGlzLm9uQmVmb3JlQ29tcGlsZSA9IChzaGFkZXIsIHJlbmRlcmVyKSA9PiB7XG5cdFx0XHRjb25zdCB7IGlzV2ViR0wyIH0gPSByZW5kZXJlci5jYXBhYmlsaXRpZXM7XG5cdFx0XHRzaGFkZXIuZnJhZ21lbnRTaGFkZXIgPSBzaGFkZXIuZnJhZ21lbnRTaGFkZXIucmVwbGFjZShcblx0XHRcdFx0YCNpbmNsdWRlIDwke29wYXF1ZV9mcmFnbWVudH0+YCxcblx0XHRcdFx0YFxuICAgICAgICAke1xuXHRcdFx0XHRcdCFpc1dlYkdMMlxuXHRcdFx0XHRcdFx0PyBgI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGVcXG4jaW5jbHVkZSA8JHtvcGFxdWVfZnJhZ21lbnR9PmBcblx0XHRcdFx0XHRcdDogYCNpbmNsdWRlIDwke29wYXF1ZV9mcmFnbWVudH0+YFxuXHRcdFx0XHR9XG4gICAgICB2ZWMyIGN4eSA9IDIuMCAqIGdsX1BvaW50Q29vcmQgLSAxLjA7XG4gICAgICBmbG9hdCByID0gZG90KGN4eSwgY3h5KTtcbiAgICAgIGZsb2F0IGRlbHRhID0gZndpZHRoKHIpO1xuICAgICAgZmxvYXQgbWFzayA9IDEuMCAtIHNtb290aHN0ZXAoMS4wIC0gZGVsdGEsIDEuMCArIGRlbHRhLCByKTtcbiAgICAgIGdsX0ZyYWdDb2xvciA9IHZlYzQoZ2xfRnJhZ0NvbG9yLnJnYiwgbWFzayAqIGdsX0ZyYWdDb2xvci5hICk7XG4gICAgICAjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG4gICAgICAjaW5jbHVkZSA8JHtnZXRWZXJzaW9uKCkgPj0gMTU0ID8gJ2NvbG9yc3BhY2VfZnJhZ21lbnQnIDogJ2VuY29kaW5nc19mcmFnbWVudCd9PlxuICAgICAgYCxcblx0XHRcdCk7XG5cdFx0fTtcblx0fVxufVxuXG5leHBvcnQgdHlwZSBOZ3RQb2ludE1hdGVyaWFsID0gTmd0TWF0ZXJpYWw8UG9pbnRNYXRlcmlhbCwgW1BvaW50c01hdGVyaWFsUGFyYW1ldGVyc10+O1xuXG5kZWNsYXJlIGdsb2JhbCB7XG5cdGludGVyZmFjZSBIVE1MRWxlbWVudFRhZ05hbWVNYXAge1xuXHRcdC8qKlxuXHRcdCAqIEBleHRlbmRzIG5ndC1wb2ludHMtbWF0ZXJpYWxcblx0XHQgKi9cblx0XHQnbmd0LXBvaW50LW1hdGVyaWFsJzogTmd0UG9pbnRNYXRlcmlhbDtcblx0fVxufVxuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1zb2JhLXN0YWdpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc3RhZ2luZy9zcmMvYW5ndWxhci10aHJlZS1zb2JhLXN0YWdpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
export * from './lib/accumulative-shadows';
|
|
2
|
-
export * from './lib/backdrop';
|
|
3
|
-
export * from './lib/bb-anchor';
|
|
4
|
-
export * from './lib/bounds';
|
|
5
|
-
export * from './lib/camera-shake';
|
|
6
|
-
export * from './lib/caustics';
|
|
7
|
-
export * from './lib/center';
|
|
8
|
-
export * from './lib/contact-shadows';
|
|
9
|
-
export * from './lib/environment/environment';
|
|
10
|
-
export * from './lib/environment/inject-environment';
|
|
11
|
-
export * from './lib/float';
|
|
12
|
-
export * from './lib/lightformer';
|
|
13
|
-
export * from './lib/mask';
|
|
14
|
-
export * from './lib/matcap-texture';
|
|
15
|
-
export * from './lib/normal-texture';
|
|
16
|
-
export * from './lib/randomized-lights';
|
|
17
|
-
export * from './lib/render-texture';
|
|
18
|
-
export * from './lib/sky';
|
|
19
|
-
export { NgtsSpotLight, NgtsSpotLightShadow } from './lib/spot-light';
|
|
20
|
-
export * from './lib/stage';
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3NvYmEvc3RhZ2luZy9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsY0FBYyxDQUFDO0FBQzdCLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLFdBQVcsQ0FBQztBQUMxQixPQUFPLEVBQUUsYUFBYSxFQUF3QixtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVGLGNBQWMsYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYmFja2Ryb3AnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYmItYW5jaG9yJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2JvdW5kcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jYW1lcmEtc2hha2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2F1c3RpY3MnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2VudGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRhY3Qtc2hhZG93cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9lbnZpcm9ubWVudC9lbnZpcm9ubWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9lbnZpcm9ubWVudC9pbmplY3QtZW52aXJvbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZmxvYXQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbGlnaHRmb3JtZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvbWFzayc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9tYXRjYXAtdGV4dHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ub3JtYWwtdGV4dHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yYW5kb21pemVkLWxpZ2h0cyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZW5kZXItdGV4dHVyZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9za3knO1xuZXhwb3J0IHsgTmd0c1Nwb3RMaWdodCwgTmd0c1Nwb3RMaWdodE9wdGlvbnMsIE5ndHNTcG90TGlnaHRTaGFkb3cgfSBmcm9tICcuL2xpYi9zcG90LWxpZ2h0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3N0YWdlJztcbiJdfQ==
|