@found-in-space/skykit 0.2.0-alpha.1 → 0.2.0-dev.20260527.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/README.md +143 -6
- package/examples/custom-object-layer/custom-object-layer.js +1 -24
- package/examples/xr-free-roam/index.html +62 -4
- package/examples/xr-free-roam/xr-free-roam.css +249 -18
- package/examples/xr-free-roam/xr-free-roam.js +644 -217
- package/package.json +31 -5
- package/src/__tests__/skykit-anchored-images.test.js +32 -4
- package/src/__tests__/skykit-browser.test.js +217 -0
- package/src/__tests__/skykit-data.test.js +131 -0
- package/src/__tests__/skykit-parallax.test.js +4 -4
- package/src/__tests__/skykit-touch-os.test.js +71 -0
- package/src/__tests__/skykit-xr.test.js +123 -2
- package/src/__tests__/skykit.test.js +138 -1
- package/src/anchored-images.js +14 -15
- package/src/browser-addons.d.ts +16 -0
- package/src/browser-addons.js +155 -0
- package/src/browser-constellations.d.ts +13 -0
- package/src/browser-constellations.js +387 -0
- package/src/browser-journey.d.ts +8 -0
- package/src/browser-journey.js +240 -0
- package/src/browser.d.ts +98 -0
- package/src/browser.js +215 -13
- package/src/data.d.ts +133 -0
- package/src/data.js +447 -0
- package/src/embed.d.ts +5 -0
- package/src/embed.js +52 -2
- package/src/hr-diagram.js +23 -5
- package/src/index.d.ts +32 -7
- package/src/plugins.js +87 -43
- package/src/story.d.ts +57 -0
- package/src/story.js +396 -0
- package/src/three-shim.d.ts +32 -0
- package/src/touch-os.d.ts +70 -0
- package/src/touch-os.js +275 -0
- package/src/utils.js +96 -6
- package/src/viewer-entry.d.ts +10 -0
- package/src/viewer-entry.js +4 -0
- package/src/viewer.js +110 -12
- package/src/xr/plugins.js +224 -13
- package/src/xr/session.js +60 -14
- package/src/xr.d.ts +22 -0
- package/src/xr.js +1 -0
package/src/browser.d.ts
CHANGED
|
@@ -7,13 +7,18 @@ import type { ThreeStarField } from '@found-in-space/three-star-field';
|
|
|
7
7
|
import type * as THREE from 'three';
|
|
8
8
|
|
|
9
9
|
import type {
|
|
10
|
+
Object3dLayerOptions,
|
|
10
11
|
SkykitAnimationLoop,
|
|
11
12
|
SkykitAnimationLoopOptions,
|
|
12
13
|
SkykitDragLookOptions,
|
|
14
|
+
SkykitLookAtInput,
|
|
13
15
|
SkykitKeyboardNavigationOptions,
|
|
14
16
|
SkykitPluginInput,
|
|
17
|
+
SkykitPluginTeardown,
|
|
18
|
+
SkykitThreePart,
|
|
15
19
|
SkykitViewState,
|
|
16
20
|
SkykitViewer,
|
|
21
|
+
Vector3Like,
|
|
17
22
|
} from './index.js';
|
|
18
23
|
|
|
19
24
|
export type SkykitBrowserHost = string | {
|
|
@@ -25,6 +30,78 @@ export type SkykitBrowserHost = string | {
|
|
|
25
30
|
};
|
|
26
31
|
|
|
27
32
|
export type SkykitBrowserStatusTarget = string | { textContent?: string | null };
|
|
33
|
+
export type SkykitBrowserMouseMode = 'grab' | 'look' | 'strafe' | 'none';
|
|
34
|
+
export type SkykitConstellationArtMode = 'off' | 'lazy' | 'preload';
|
|
35
|
+
|
|
36
|
+
export interface SkykitBrowserAddonContext {
|
|
37
|
+
id?: string;
|
|
38
|
+
host: SkykitBrowserHost | Element;
|
|
39
|
+
browser: SkykitBrowser;
|
|
40
|
+
viewer: SkykitViewer;
|
|
41
|
+
THREE: typeof THREE;
|
|
42
|
+
skykit: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface SkykitBrowserAddon {
|
|
46
|
+
id?: string;
|
|
47
|
+
install(
|
|
48
|
+
context: SkykitBrowserAddonContext
|
|
49
|
+
): void | Promise<void> | SkykitPluginTeardown | Promise<SkykitPluginTeardown | void>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type SkykitBrowserInstallInput = SkykitPluginInput | SkykitBrowserAddon;
|
|
53
|
+
|
|
54
|
+
export interface SkykitBrowserGlobal {
|
|
55
|
+
browserAddons: SkykitBrowserAddon[];
|
|
56
|
+
registerBrowserAddon(addon: SkykitBrowserAddon): SkykitPluginTeardown;
|
|
57
|
+
whenReady(target?: string | Element): Promise<SkykitBrowser>;
|
|
58
|
+
getBrowsers(): SkykitBrowser[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface SkykitBrowserJourneyFacade {
|
|
62
|
+
transitionTo(viewOrScene: unknown, options?: Record<string, unknown>): Promise<PromiseSettledResult<unknown>[]>;
|
|
63
|
+
applyScene(sceneSpec: unknown): Promise<unknown>;
|
|
64
|
+
load(input: string | Record<string, unknown>, options?: Record<string, unknown>): Promise<SkykitBrowserJourneyInstance>;
|
|
65
|
+
getSnapshot(): unknown | Promise<unknown>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface SkykitBrowserJourneyInstance {
|
|
69
|
+
goTo(sceneId: string): Promise<unknown>;
|
|
70
|
+
next(): Promise<unknown>;
|
|
71
|
+
previous(): Promise<unknown>;
|
|
72
|
+
play(payload?: unknown): number;
|
|
73
|
+
pause(): number;
|
|
74
|
+
seek(timeSecs: number): number;
|
|
75
|
+
getSnapshot(): unknown;
|
|
76
|
+
dispose(): void;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface SkykitBrowserConstellationsOptions {
|
|
80
|
+
skyculture?: string;
|
|
81
|
+
manifest?: Record<string, unknown>;
|
|
82
|
+
manifestUrl?: string;
|
|
83
|
+
assetBaseUrl?: string;
|
|
84
|
+
art?: SkykitConstellationArtMode | string;
|
|
85
|
+
visible?: boolean;
|
|
86
|
+
priority?: number;
|
|
87
|
+
boundaryRadius?: number;
|
|
88
|
+
boundaryColor?: THREE.ColorRepresentation;
|
|
89
|
+
boundaryOpacity?: number;
|
|
90
|
+
renderOrder?: number;
|
|
91
|
+
artOpacity?: number;
|
|
92
|
+
artMaxAngleDeg?: number;
|
|
93
|
+
skipTextureErrors?: boolean;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface SkykitBrowserConstellationsFacade {
|
|
97
|
+
load(options?: SkykitBrowserConstellationsOptions): Promise<SkykitBrowserConstellationsFacade>;
|
|
98
|
+
show(): boolean | Promise<boolean>;
|
|
99
|
+
hide(): boolean | Promise<boolean>;
|
|
100
|
+
toggle(force?: boolean): boolean | Promise<boolean>;
|
|
101
|
+
setArt(mode: SkykitConstellationArtMode | string): SkykitConstellationArtMode | Promise<SkykitConstellationArtMode>;
|
|
102
|
+
getSnapshot(): unknown | Promise<unknown>;
|
|
103
|
+
dispose?(): void;
|
|
104
|
+
}
|
|
28
105
|
|
|
29
106
|
export interface SkykitBrowserOptions {
|
|
30
107
|
host?: SkykitBrowserHost;
|
|
@@ -38,8 +115,10 @@ export interface SkykitBrowserOptions {
|
|
|
38
115
|
session?: StarOctreeSessionOptions;
|
|
39
116
|
keyboard?: false | SkykitKeyboardNavigationOptions;
|
|
40
117
|
grab?: false | SkykitDragLookOptions;
|
|
118
|
+
mouseMode?: SkykitBrowserMouseMode;
|
|
41
119
|
plugins?: Iterable<SkykitPluginInput>;
|
|
42
120
|
view?: Partial<SkykitViewState>;
|
|
121
|
+
lookAt?: SkykitLookAtInput;
|
|
43
122
|
loop?: SkykitAnimationLoopOptions;
|
|
44
123
|
limitingMagnitude?: number;
|
|
45
124
|
exposure?: number;
|
|
@@ -64,9 +143,28 @@ export interface SkykitBrowser {
|
|
|
64
143
|
provider: StarOctreeProviderService;
|
|
65
144
|
starField: ThreeStarField;
|
|
66
145
|
loop: SkykitAnimationLoop;
|
|
146
|
+
capabilities: Set<string>;
|
|
147
|
+
journey: SkykitBrowserJourneyFacade;
|
|
148
|
+
constellations: SkykitBrowserConstellationsFacade;
|
|
149
|
+
install(input: SkykitBrowserInstallInput): Promise<SkykitPluginTeardown>;
|
|
150
|
+
addObject(
|
|
151
|
+
object3d: THREE.Object3D,
|
|
152
|
+
options?: SkykitBrowserObjectOptions
|
|
153
|
+
): SkykitBrowserObjectHandle;
|
|
67
154
|
resize(): void;
|
|
68
155
|
dispose(): Promise<void>;
|
|
69
156
|
}
|
|
70
157
|
|
|
158
|
+
export interface SkykitBrowserObjectOptions extends Omit<Object3dLayerOptions, 'object3d'> {
|
|
159
|
+
positionPc?: Vector3Like;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export interface SkykitBrowserObjectHandle {
|
|
163
|
+
object3d: THREE.Object3D;
|
|
164
|
+
part: SkykitThreePart;
|
|
165
|
+
remove: SkykitPluginTeardown;
|
|
166
|
+
dispose: SkykitPluginTeardown;
|
|
167
|
+
}
|
|
168
|
+
|
|
71
169
|
export declare function createSkykitBrowser(host: SkykitBrowserHost): Promise<SkykitBrowser>;
|
|
72
170
|
export declare function createSkykitBrowser(options?: SkykitBrowserOptions): Promise<SkykitBrowser>;
|
package/src/browser.js
CHANGED
|
@@ -8,12 +8,18 @@ import { createObserverShellStrategy } from '@found-in-space/star-trees';
|
|
|
8
8
|
import { createThreeStarField } from '@found-in-space/three-star-field';
|
|
9
9
|
|
|
10
10
|
import { createSkykitAnimationLoop } from './animation-loop.js';
|
|
11
|
+
import { SKYKIT_ACTIONS, SKYKIT_CONTROLS } from './actions.js';
|
|
11
12
|
import {
|
|
12
13
|
createKeyboardNavigationPlugin,
|
|
14
|
+
createObject3dPlugin,
|
|
15
|
+
createMouseLookPlugin,
|
|
16
|
+
createSkykitJourneyPlugin,
|
|
17
|
+
createSkykitNavigationPlugin,
|
|
13
18
|
createSkyGrabPlugin,
|
|
14
19
|
createSkykitStatusPlugin,
|
|
15
20
|
createStreamingStarsPlugin,
|
|
16
21
|
} from './plugins.js';
|
|
22
|
+
import { createObject3dLayer } from './layers.js';
|
|
17
23
|
import { createSkykitViewer } from './viewer.js';
|
|
18
24
|
|
|
19
25
|
const DEFAULT_LIMITING_MAGNITUDE = 6.5;
|
|
@@ -63,6 +69,7 @@ export async function createSkykitBrowser(input = {}) {
|
|
|
63
69
|
observerPc: { x: 0, y: 0, z: 0 },
|
|
64
70
|
coordinateUnitsPerParsec: positive(options.coordinateUnitsPerParsec, DEFAULT_UNITS_PER_PARSEC),
|
|
65
71
|
limitingMagnitude,
|
|
72
|
+
...(options.lookAt ? { lookAt: options.lookAt } : {}),
|
|
66
73
|
...(options.view ?? {}),
|
|
67
74
|
},
|
|
68
75
|
plugins: [
|
|
@@ -81,41 +88,57 @@ export async function createSkykitBrowser(input = {}) {
|
|
|
81
88
|
...(options.keyboard ?? {}),
|
|
82
89
|
}),
|
|
83
90
|
]),
|
|
84
|
-
...(options
|
|
85
|
-
createSkyGrabPlugin({
|
|
86
|
-
target: host,
|
|
87
|
-
sensitivityRadiansPerPixel: 0.00075,
|
|
88
|
-
...(options.grab ?? {}),
|
|
89
|
-
}),
|
|
90
|
-
]),
|
|
91
|
+
...createPointerPlugins(options, host),
|
|
91
92
|
...(statusTarget ? [createStatusPlugin(statusTarget)] : []),
|
|
92
93
|
...(options.plugins ?? []),
|
|
93
94
|
],
|
|
94
95
|
});
|
|
95
96
|
|
|
96
97
|
const loop = createSkykitAnimationLoop(viewer, options.loop);
|
|
98
|
+
const capabilities = new Set();
|
|
99
|
+
/** @type {Array<() => void | Promise<void>>} */
|
|
100
|
+
const browserDisposables = [];
|
|
97
101
|
let disposed = false;
|
|
102
|
+
/** @type {import('./browser.d.ts').SkykitBrowser} */
|
|
103
|
+
const browser = {
|
|
104
|
+
viewer,
|
|
105
|
+
renderer,
|
|
106
|
+
camera,
|
|
107
|
+
provider,
|
|
108
|
+
starField,
|
|
109
|
+
loop,
|
|
110
|
+
capabilities,
|
|
111
|
+
install,
|
|
112
|
+
addObject,
|
|
113
|
+
resize,
|
|
114
|
+
dispose,
|
|
115
|
+
};
|
|
116
|
+
browser.journey = createLazyJourneyFacade(browser);
|
|
117
|
+
browser.constellations = createLazyConstellationsFacade(browser, host);
|
|
98
118
|
|
|
99
|
-
|
|
119
|
+
function resize() {
|
|
100
120
|
viewer.resize({
|
|
101
121
|
devicePixelRatio: Math.min(
|
|
102
122
|
window.devicePixelRatio || 1,
|
|
103
123
|
positive(options.maxDevicePixelRatio, DEFAULT_MAX_DEVICE_PIXEL_RATIO),
|
|
104
124
|
),
|
|
105
125
|
});
|
|
106
|
-
}
|
|
107
|
-
|
|
126
|
+
}
|
|
127
|
+
async function dispose() {
|
|
108
128
|
if (disposed) return;
|
|
109
129
|
disposed = true;
|
|
110
130
|
window.removeEventListener('resize', resize);
|
|
111
131
|
window.removeEventListener('pagehide', disposeSoon);
|
|
112
132
|
window.removeEventListener('beforeunload', disposeSoon);
|
|
133
|
+
for (const disposable of browserDisposables.splice(0).reverse()) {
|
|
134
|
+
await disposable();
|
|
135
|
+
}
|
|
113
136
|
loop.dispose();
|
|
114
137
|
await viewer.dispose();
|
|
115
138
|
if (!options.provider) await provider.dispose?.();
|
|
116
139
|
if (!options.renderer) renderer.dispose?.();
|
|
117
|
-
}
|
|
118
|
-
|
|
140
|
+
}
|
|
141
|
+
function disposeSoon() { void dispose(); }
|
|
119
142
|
|
|
120
143
|
if (options.autoResize !== false) window.addEventListener('resize', resize);
|
|
121
144
|
if (options.autoDispose !== false) {
|
|
@@ -125,7 +148,173 @@ export async function createSkykitBrowser(input = {}) {
|
|
|
125
148
|
resize();
|
|
126
149
|
if (options.autoStart !== false) loop.start();
|
|
127
150
|
|
|
128
|
-
return
|
|
151
|
+
return browser;
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* @param {import('./browser.d.ts').SkykitBrowserInstallInput} input
|
|
155
|
+
* @returns {Promise<import('./index.d.ts').SkykitPluginTeardown>}
|
|
156
|
+
*/
|
|
157
|
+
async function install(input) {
|
|
158
|
+
if (!input) return () => {};
|
|
159
|
+
const teardown = isBrowserAddon(input)
|
|
160
|
+
? await input.install(createBrowserAddonContext(input))
|
|
161
|
+
: await viewer.addPlugin(/** @type {import('./index.d.ts').SkykitPluginInput} */ (input));
|
|
162
|
+
if (typeof teardown !== 'function') return () => {};
|
|
163
|
+
browserDisposables.push(teardown);
|
|
164
|
+
return () => {
|
|
165
|
+
const index = browserDisposables.indexOf(teardown);
|
|
166
|
+
if (index >= 0) browserDisposables.splice(index, 1);
|
|
167
|
+
void teardown();
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* @param {import('./browser.d.ts').SkykitBrowserAddon} addon
|
|
173
|
+
* @returns {import('./browser.d.ts').SkykitBrowserAddonContext}
|
|
174
|
+
*/
|
|
175
|
+
function createBrowserAddonContext(addon) {
|
|
176
|
+
return {
|
|
177
|
+
id: addon.id,
|
|
178
|
+
host,
|
|
179
|
+
browser,
|
|
180
|
+
viewer,
|
|
181
|
+
THREE,
|
|
182
|
+
skykit: {
|
|
183
|
+
SKYKIT_ACTIONS,
|
|
184
|
+
SKYKIT_CONTROLS,
|
|
185
|
+
createObject3dPlugin,
|
|
186
|
+
createSkykitJourneyPlugin,
|
|
187
|
+
createSkykitNavigationPlugin,
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @param {THREE.Object3D} object3d
|
|
194
|
+
* @param {import('./browser.d.ts').SkykitBrowserObjectOptions} [objectOptions]
|
|
195
|
+
* @returns {import('./browser.d.ts').SkykitBrowserObjectHandle}
|
|
196
|
+
*/
|
|
197
|
+
function addObject(object3d, objectOptions = {}) {
|
|
198
|
+
if (!object3d) {
|
|
199
|
+
throw new TypeError('SkykitBrowser.addObject() requires a THREE.Object3D.');
|
|
200
|
+
}
|
|
201
|
+
const { positionPc, ...layerOptions } = objectOptions;
|
|
202
|
+
if (positionPc) {
|
|
203
|
+
setObjectPositionPc(
|
|
204
|
+
object3d,
|
|
205
|
+
positionPc,
|
|
206
|
+
viewer.getViewState().coordinateUnitsPerParsec,
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
const part = createObject3dLayer({
|
|
210
|
+
...layerOptions,
|
|
211
|
+
object3d,
|
|
212
|
+
anchorMode: layerOptions.anchorMode ?? 'world-space',
|
|
213
|
+
});
|
|
214
|
+
const remove = viewer.addPart(part);
|
|
215
|
+
return {
|
|
216
|
+
object3d,
|
|
217
|
+
part,
|
|
218
|
+
remove,
|
|
219
|
+
dispose: remove,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/** @param {unknown} input */
|
|
225
|
+
function isBrowserAddon(input) {
|
|
226
|
+
return Boolean(input && typeof input === 'object' && typeof /** @type {{ install?: unknown }} */ (input).install === 'function');
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* @param {import('./browser.d.ts').SkykitBrowser} browser
|
|
231
|
+
* @returns {import('./browser.d.ts').SkykitBrowserJourneyFacade}
|
|
232
|
+
*/
|
|
233
|
+
function createLazyJourneyFacade(browser) {
|
|
234
|
+
/** @type {Promise<import('./browser.d.ts').SkykitBrowserJourneyFacade> | null} */
|
|
235
|
+
let loaded = null;
|
|
236
|
+
const loadCapability = () => {
|
|
237
|
+
loaded ??= import('./browser-journey.js')
|
|
238
|
+
.then((module) => module.installSkykitJourneyBrowserCapability({ browser }));
|
|
239
|
+
return loaded;
|
|
240
|
+
};
|
|
241
|
+
return {
|
|
242
|
+
async transitionTo(viewOrScene, options) {
|
|
243
|
+
return (await loadCapability()).transitionTo(viewOrScene, options);
|
|
244
|
+
},
|
|
245
|
+
async applyScene(sceneSpec) {
|
|
246
|
+
return (await loadCapability()).applyScene(sceneSpec);
|
|
247
|
+
},
|
|
248
|
+
async load(input, options) {
|
|
249
|
+
return (await loadCapability()).load(input, options);
|
|
250
|
+
},
|
|
251
|
+
async getSnapshot() {
|
|
252
|
+
return (await loadCapability()).getSnapshot();
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* @param {import('./browser.d.ts').SkykitBrowser} browser
|
|
259
|
+
* @param {Element | import('./browser.d.ts').SkykitBrowserHost} host
|
|
260
|
+
* @returns {import('./browser.d.ts').SkykitBrowserConstellationsFacade}
|
|
261
|
+
*/
|
|
262
|
+
function createLazyConstellationsFacade(browser, host) {
|
|
263
|
+
/** @type {Promise<import('./browser.d.ts').SkykitBrowserConstellationsFacade> | null} */
|
|
264
|
+
let loaded = null;
|
|
265
|
+
const loadCapability = (options = {}) => {
|
|
266
|
+
loaded ??= import('./browser-constellations.js')
|
|
267
|
+
.then((module) => module.installSkykitConstellationsBrowserCapability({
|
|
268
|
+
browser,
|
|
269
|
+
host,
|
|
270
|
+
options,
|
|
271
|
+
}));
|
|
272
|
+
return loaded;
|
|
273
|
+
};
|
|
274
|
+
return {
|
|
275
|
+
async load(options) {
|
|
276
|
+
return loadCapability(options);
|
|
277
|
+
},
|
|
278
|
+
async show() {
|
|
279
|
+
return (await loadCapability()).show();
|
|
280
|
+
},
|
|
281
|
+
async hide() {
|
|
282
|
+
return (await loadCapability()).hide();
|
|
283
|
+
},
|
|
284
|
+
async toggle(force) {
|
|
285
|
+
return (await loadCapability()).toggle(force);
|
|
286
|
+
},
|
|
287
|
+
async setArt(mode) {
|
|
288
|
+
return (await loadCapability()).setArt(mode);
|
|
289
|
+
},
|
|
290
|
+
async getSnapshot() {
|
|
291
|
+
return (await loadCapability()).getSnapshot();
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
function createPointerPlugins(options, host) {
|
|
297
|
+
const mouseMode = normalizeMouseMode(options.mouseMode);
|
|
298
|
+
if (options.grab === false || mouseMode === 'none') return [];
|
|
299
|
+
const pointerOptions = {
|
|
300
|
+
target: host,
|
|
301
|
+
sensitivityRadiansPerPixel: 0.00075,
|
|
302
|
+
...(options.grab ?? {}),
|
|
303
|
+
};
|
|
304
|
+
return [
|
|
305
|
+
mouseMode === 'look' || mouseMode === 'strafe'
|
|
306
|
+
? createMouseLookPlugin(pointerOptions)
|
|
307
|
+
: createSkyGrabPlugin(pointerOptions),
|
|
308
|
+
];
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function normalizeMouseMode(value) {
|
|
312
|
+
const mode = String(value ?? 'grab').trim().toLowerCase();
|
|
313
|
+
if (mode === 'look' || mode === 'mouse-look' || mode === 'mouselook' || mode === 'game' || mode === 'strafe') {
|
|
314
|
+
return mode === 'strafe' ? 'strafe' : 'look';
|
|
315
|
+
}
|
|
316
|
+
if (mode === 'none' || mode === 'off' || mode === 'false') return 'none';
|
|
317
|
+
return 'grab';
|
|
129
318
|
}
|
|
130
319
|
|
|
131
320
|
function createStatusPlugin(target) {
|
|
@@ -165,3 +354,16 @@ function positive(value, fallback) {
|
|
|
165
354
|
const number = Number(value);
|
|
166
355
|
return Number.isFinite(number) && number > 0 ? number : fallback;
|
|
167
356
|
}
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* @param {THREE.Object3D} object3d
|
|
360
|
+
* @param {{ x: number; y: number; z: number }} positionPc
|
|
361
|
+
* @param {number} unitsPerParsec
|
|
362
|
+
*/
|
|
363
|
+
function setObjectPositionPc(object3d, positionPc, unitsPerParsec) {
|
|
364
|
+
object3d.position?.set?.(
|
|
365
|
+
positionPc.x * unitsPerParsec,
|
|
366
|
+
positionPc.y * unitsPerParsec,
|
|
367
|
+
positionPc.z * unitsPerParsec,
|
|
368
|
+
);
|
|
369
|
+
}
|
package/src/data.d.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import type { MetaSidecarEntry, MetaSidecarProviderService } from '@found-in-space/meta-sidecar-provider';
|
|
2
|
+
import type {
|
|
3
|
+
StarOctreeCellStreamOptions,
|
|
4
|
+
StarOctreeProviderService,
|
|
5
|
+
StarOctreeProviderServiceOptions,
|
|
6
|
+
} from '@found-in-space/star-octree-provider';
|
|
7
|
+
import type {
|
|
8
|
+
StarObjectRef,
|
|
9
|
+
StarTreePointPc,
|
|
10
|
+
} from '@found-in-space/star-trees';
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
OCTREE_DEFAULT,
|
|
14
|
+
createStarOctreeProviderService,
|
|
15
|
+
} from '@found-in-space/star-octree-provider';
|
|
16
|
+
export {
|
|
17
|
+
createObserverShellStrategy,
|
|
18
|
+
createSphereVolumeStrategy,
|
|
19
|
+
createStarCellKey,
|
|
20
|
+
decodeTemperatureK,
|
|
21
|
+
temperatureToRgb,
|
|
22
|
+
} from '@found-in-space/star-trees';
|
|
23
|
+
export {
|
|
24
|
+
createMetaSidecarProviderService,
|
|
25
|
+
deriveMetaSidecarUrlFromRenderUrl,
|
|
26
|
+
metaSidecarEntryDisplayFields,
|
|
27
|
+
} from '@found-in-space/meta-sidecar-provider';
|
|
28
|
+
|
|
29
|
+
export interface SkykitStarRow {
|
|
30
|
+
ref: StarObjectRef | null;
|
|
31
|
+
cellKey: string;
|
|
32
|
+
level: number;
|
|
33
|
+
mortonCode: string;
|
|
34
|
+
ordinal: number;
|
|
35
|
+
positionPc: StarTreePointPc;
|
|
36
|
+
xPc: number;
|
|
37
|
+
yPc: number;
|
|
38
|
+
zPc: number;
|
|
39
|
+
distancePc: number;
|
|
40
|
+
magAbs: number | null;
|
|
41
|
+
absoluteMagnitude: number | null;
|
|
42
|
+
apparentMagnitude: number | null;
|
|
43
|
+
teffLog8: number | null;
|
|
44
|
+
temperatureK: number | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface SkykitRowsFromCellsOptions {
|
|
48
|
+
observerPc?: StarTreePointPc;
|
|
49
|
+
limitingMagnitude?: number;
|
|
50
|
+
filterVisible?: boolean;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface SkykitStarDataOptions extends Omit<StarOctreeCellStreamOptions, 'view' | 'strategy'> {
|
|
54
|
+
provider?: StarOctreeProviderService;
|
|
55
|
+
providerId?: string;
|
|
56
|
+
octreeUrl?: string;
|
|
57
|
+
persistentCache?: StarOctreeProviderServiceOptions['persistentCache'];
|
|
58
|
+
limits?: StarOctreeProviderServiceOptions['limits'];
|
|
59
|
+
observerPc?: StarTreePointPc;
|
|
60
|
+
centerPc?: StarTreePointPc;
|
|
61
|
+
radiusPc?: number;
|
|
62
|
+
limitingMagnitude?: number;
|
|
63
|
+
maxStars?: number;
|
|
64
|
+
filterVisible?: boolean;
|
|
65
|
+
sortBy?:
|
|
66
|
+
| 'apparentMagnitude'
|
|
67
|
+
| 'distancePc'
|
|
68
|
+
| 'magAbs'
|
|
69
|
+
| 'absoluteMagnitude'
|
|
70
|
+
| null
|
|
71
|
+
| false
|
|
72
|
+
| ((left: SkykitStarRow, right: SkykitStarRow) => number);
|
|
73
|
+
view?: StarOctreeCellStreamOptions['view'];
|
|
74
|
+
strategy?: StarOctreeCellStreamOptions['strategy'];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export type SkykitStarLabelInput = SkykitStarRow | StarObjectRef;
|
|
78
|
+
|
|
79
|
+
export interface SkykitStarLabelOptions {
|
|
80
|
+
metaProvider?: MetaSidecarProviderService;
|
|
81
|
+
metaProviderId?: string;
|
|
82
|
+
metaUrl?: string;
|
|
83
|
+
parentDatasetId?: string;
|
|
84
|
+
datasetId?: string;
|
|
85
|
+
persistentCache?: 'on' | 'off';
|
|
86
|
+
metaLimits?: {
|
|
87
|
+
shardPrefetchBytes?: number;
|
|
88
|
+
};
|
|
89
|
+
provider?: StarOctreeProviderService;
|
|
90
|
+
octreeUrl?: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface SkykitStarLabel {
|
|
94
|
+
star: SkykitStarLabelInput;
|
|
95
|
+
ref: StarObjectRef | null;
|
|
96
|
+
entry: MetaSidecarEntry | null;
|
|
97
|
+
fields: {
|
|
98
|
+
properName: string;
|
|
99
|
+
bayer: string;
|
|
100
|
+
hd: string;
|
|
101
|
+
hip: string;
|
|
102
|
+
gaia: string;
|
|
103
|
+
primaryLabel: string;
|
|
104
|
+
};
|
|
105
|
+
label: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export declare function createStarStream(
|
|
109
|
+
options?: SkykitStarDataOptions
|
|
110
|
+
): AsyncIterable<SkykitStarRow[]>;
|
|
111
|
+
|
|
112
|
+
export declare function loadStarRows(
|
|
113
|
+
options?: SkykitStarDataOptions
|
|
114
|
+
): Promise<SkykitStarRow[]>;
|
|
115
|
+
|
|
116
|
+
export declare function streamStarRows(
|
|
117
|
+
options?: SkykitStarDataOptions
|
|
118
|
+
): AsyncIterable<SkykitStarRow[]>;
|
|
119
|
+
|
|
120
|
+
export declare function rowsFromStarCells(
|
|
121
|
+
cells: Iterable<import('@found-in-space/star-trees').StarCellData>,
|
|
122
|
+
options?: SkykitRowsFromCellsOptions
|
|
123
|
+
): SkykitStarRow[];
|
|
124
|
+
|
|
125
|
+
export declare function loadStarLabels(
|
|
126
|
+
input: Iterable<SkykitStarLabelInput> | SkykitStarDataOptions,
|
|
127
|
+
options?: SkykitStarLabelOptions
|
|
128
|
+
): Promise<SkykitStarLabel[]>;
|
|
129
|
+
|
|
130
|
+
export declare function formatStarLabel(
|
|
131
|
+
entry?: MetaSidecarEntry | null,
|
|
132
|
+
fallback?: string
|
|
133
|
+
): string;
|