@soonspacejs/plugin-gs3d-loader 2.13.7 → 2.13.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/types.d.ts CHANGED
@@ -10,14 +10,16 @@ export declare enum LoaderStatus {
10
10
  'Processing' = 1,
11
11
  'Done' = 2
12
12
  }
13
- export interface option {
13
+ export interface SceneOption {
14
14
  splatAlphaRemovalThreshold?: number;
15
15
  position?: Array<number>;
16
16
  rotation?: Array<number>;
17
17
  scale?: Array<number>;
18
+ showLoadingUI?: boolean;
19
+ headers?: Headers;
18
20
  onProgress?: () => void;
19
21
  }
20
- export interface sceneOption {
22
+ export interface ScenesOption {
21
23
  path: string;
22
24
  splatAlphaRemovalThreshold?: number;
23
25
  position?: Array<number>;
@@ -29,8 +31,8 @@ export interface sceneOption {
29
31
  export interface DropInViewer extends Group {
30
32
  viewer: any;
31
33
  updateSplatMesh: () => void;
32
- addSplatScene: (path: string, options?: option) => Promise<void>;
33
- addSplatScenes: (sceneOptions: sceneOption[], showLoadingUI: boolean) => Promise<void>;
34
+ addSplatScene: (path: string, options?: SceneOption) => Promise<void>;
35
+ addSplatScenes: (sceneOptions: ScenesOption[], showLoadingUI: boolean) => Promise<void>;
34
36
  getSplatScene: (sceneIndex: number) => SplatScene;
35
37
  removeSplatScene: (index: number) => Promise<void>;
36
38
  removeSplatScenes: (indexes: number[]) => Promise<void>;
package/env.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- declare module '@mkkellogg/gaussian-splats-3d' {
2
- export const DropInViewer: any
1
+ declare module '@mkkellogg/gaussian-splats-3d' {
2
+ export const DropInViewer: any
3
3
  }
Binary file
Binary file
@@ -1,87 +1,82 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Document</title>
7
- </head>
8
- <body>
9
- <div id="view" style="width: 100vw; height: 100vh"></div>
10
- <script type="importmap">
11
- {
12
- "imports": {
13
- "soonspacejs": "../../../soonspacejs/dist/index.esm.js",
14
- "three/": "/node_modules/three/",
15
- "three": "/node_modules/three/build/three.module.js",
16
- "three-mesh-bvh": "/node_modules/three-mesh-bvh/build/index.module.js",
17
- "postprocessing": "/node_modules/postprocessing/build/index.js"
18
- }
19
- }
20
- </script>
21
- <script type="module">
22
- import SoonSpace from '../../../soonspacejs/dist/index.esm.js';
23
- import GS3DLoaderPlugin from '../dist/index.esm.js';
24
- import * as THREE from 'three'
25
-
26
- const ssp = (window.ssp = new SoonSpace({
27
- el: '#view',
28
- options: {
29
- showInfo: true,
30
- showGrid: true,
31
- },
32
- events: {
33
- selectPosition(position) {
34
- // console.log(position);
35
- },
36
- modelClick(p) {
37
- console.log(p);
38
- },
39
- },
40
- }));
41
-
42
- const gs3dLoaderPlugin = ssp.registerPlugin(GS3DLoaderPlugin, 'GS3DLoader');
43
-
44
- async function loadGS3D() {
45
- debugger
46
- const list = ['../assets/gs/dog.splat', '../assets/gs/scene.ply']
47
-
48
- const [dogIndex, sceneIndex] = await Promise.allSettled([
49
- gs3dLoaderPlugin.load('../assets/gs/dog.splat'),
50
- gs3dLoaderPlugin.load('../assets/gs/scene.ply')
51
- ])
52
- debugger
53
- // const dogIndex = await gs3dLoaderPlugin.load('../assets/gs/dog.splat')
54
- // const sceneIndex = await gs3dLoaderPlugin.load('../assets/gs/scene.ply')
55
-
56
- const dogObject = gs3dLoaderPlugin.getSplatScene(dogIndex.value)
57
- const sceneObject = gs3dLoaderPlugin.getSplatScene(sceneIndex.value)
58
-
59
- ssp.addObject(gs3dLoaderPlugin.dropInViewer)
60
-
61
- const _quat = new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 0, 1), Math.PI);
62
-
63
- // sceneObject.quaternion.copy(_quat);
64
- sceneObject.rotation.set(0, 0, Math.PI)
65
-
66
- dogObject.position.setY(0.2); // 机器狗底盘高度
67
- _quat
68
- .setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI)
69
- .multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), -Math.PI / 5));
70
- dogObject.quaternion.copy(_quat); // 旋转校正
71
- dogObject.scale.setScalar(0.5); // 机器狗缩放
72
-
73
- // const dog = await ssp.loadModel({
74
- // id: 'dog',
75
- // url: '../assets/glb/dog.glb',
76
- // });
77
- // console.log('scene', ssp)
78
- console.log('sceneObject', sceneObject)
79
- console.log('dogObject', dogObject)
80
-
81
- }
82
-
83
- loadGS3D()
84
-
85
- </script>
86
- </body>
87
- </html>
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Document</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ }
11
+ </style>
12
+ </head>
13
+ <body>
14
+ <div id="view" style="width: 100vw; height: 100vh"></div>
15
+ <script type="importmap">
16
+ {
17
+ "imports": {
18
+ "soonspacejs": "../../../soonspacejs/dist/index.esm.js",
19
+ "three/": "/node_modules/three/",
20
+ "three": "/node_modules/three/build/three.module.js",
21
+ "three-mesh-bvh": "/node_modules/three-mesh-bvh/build/index.module.js",
22
+ "postprocessing": "/node_modules/postprocessing/build/index.js"
23
+ }
24
+ }
25
+ </script>
26
+ <script type="module">
27
+ import SoonSpace from '../../../soonspacejs/dist/index.esm.js';
28
+ import GS3DLoaderPlugin from '../dist/index.esm.js';
29
+ import * as THREE from 'three';
30
+
31
+ const ssp = (window.ssp = new SoonSpace({
32
+ el: '#view',
33
+ options: {
34
+ showInfo: true,
35
+ showGrid: true,
36
+ },
37
+ events: {
38
+ selectPosition(position) {
39
+ // console.log(position);
40
+ },
41
+ modelClick(p) {
42
+ console.log(p);
43
+ },
44
+ },
45
+ }));
46
+
47
+ const gs3dLoaderPlugin = ssp.registerPlugin(GS3DLoaderPlugin, 'GS3DLoader');
48
+
49
+ async function loadGS3D() {
50
+
51
+ // debugger
52
+ const dogViewer = await gs3dLoaderPlugin.load('./gs/dog.splat');
53
+ const sceneViewer = await gs3dLoaderPlugin.load('./gs/scene.ply');
54
+
55
+ const dogObject = dogViewer.getSplatScene(0);
56
+ const sceneObject = sceneViewer.getSplatScene(0);
57
+
58
+ ssp.addObject(dogViewer);
59
+ // ssp.addObject(sceneViewer);
60
+
61
+ const _quat = new THREE.Quaternion();
62
+
63
+ dogObject.position.setY(0.2); // 机器狗底盘高度
64
+ _quat
65
+ .setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI)
66
+ .multiply(new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), -Math.PI / 5));
67
+ dogObject.quaternion.copy(_quat); // 旋转校正
68
+ dogObject.scale.setScalar(0.5); // 机器狗缩放
69
+
70
+ // const dog = await ssp.loadModel({
71
+ // id: 'dog',
72
+ // url: '../assets/glb/dog.glb',
73
+ // });
74
+ // console.log('scene', ssp)
75
+ console.log('sceneObject', sceneObject);
76
+ console.log('dogObject', dogObject);
77
+ }
78
+
79
+ loadGS3D();
80
+ </script>
81
+ </body>
82
+ </html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soonspacejs/plugin-gs3d-loader",
3
- "version": "2.13.7",
3
+ "version": "2.13.9",
4
4
  "description": "GS3D plugin for SoonSpace.js",
5
5
  "main": "dist/index.esm.js",
6
6
  "module": "dist/index.esm.js",
@@ -12,8 +12,8 @@
12
12
  ],
13
13
  "author": "xunwei",
14
14
  "license": "UNLICENSED",
15
- "gitHead": "550040550bf20ec0015982ff1159d0cfe9b35ed3",
15
+ "gitHead": "a5596909f48bd136905b85f239e13690f9f2c66e",
16
16
  "peerDependencies": {
17
- "soonspacejs": "2.13.7"
17
+ "soonspacejs": "2.13.9"
18
18
  }
19
19
  }
package/src/index.ts CHANGED
@@ -1,96 +1,77 @@
1
- import * as GaussianSplats3D from '@mkkellogg/gaussian-splats-3d'
2
- // import SoonSpace from 'soonspacejs'
3
- import { sceneOption, DropInViewer, SplatScene, } from './types'
4
-
5
- let index = 0
6
-
7
- const loadingPromiseList: Promise<void>[] = []
8
-
9
- class GS3DLoaderPlugin {
10
-
11
- dropInViewer: DropInViewer
12
-
13
- constructor () {
14
-
15
- this.dropInViewer = this.createViewer()
16
-
17
- }
18
-
19
- async load ( path: string ) {
20
-
21
- const indexes = await this.loads( [ { path, } ] )
22
-
23
- return indexes[ 0 ]
24
-
25
- }
26
-
27
- async loads (
28
- options: sceneOption[],
29
- showLoadingUI?: boolean
30
- // onProgress?: ( totalPercent: number, percentLabel: string, loaderStatus: LoaderStatus ) => void
31
- ) {
32
-
33
- if ( loadingPromiseList.length ) {
34
-
35
- await Promise.allSettled( loadingPromiseList )
36
-
37
- }
38
-
39
- const loadingPromise = this.dropInViewer.addSplatScenes( options, showLoadingUI ?? false )
40
-
41
- loadingPromiseList.push( loadingPromise )
42
-
43
- await Promise.allSettled( loadingPromiseList )
44
-
45
- const indexes: number[] = []
46
-
47
- options.forEach( () => indexes.push( index++ ) )
48
-
49
- return indexes
50
-
51
- }
52
-
53
- createViewer ( option?: Record<string, any> ) {
54
-
55
- const dropInViewer = new GaussianSplats3D.DropInViewer(
56
- {
57
- // ignoreDevicePixelRatio: false,
58
- sharedMemoryForWorkers: false,
59
- gpuAcceleratedSort: false,
60
- halfPrecisionCovariancesOnGPU: true,
61
- // integerBasedSort: true,
62
- dynamicScene: true,
63
- ...option,
64
-
65
- }
66
- ) as DropInViewer
67
-
68
- return dropInViewer
69
-
70
- }
71
-
72
- getSplatScene ( sceneIndex: number ) {
73
-
74
- return this.dropInViewer.getSplatScene( sceneIndex )
75
-
76
- }
77
-
78
- getSceneCount () {
79
-
80
- return this.dropInViewer.getSceneCount()
81
-
82
- }
83
-
84
- async dispose () {
85
-
86
- if ( this.dropInViewer ) {
87
-
88
- await this.dropInViewer.dispose()
89
-
90
- }
91
-
92
- }
93
-
94
- }
95
-
1
+ import * as GaussianSplats3D from '@mkkellogg/gaussian-splats-3d'
2
+ import { ScenesOption, DropInViewer, SceneOption, } from './types'
3
+ import { Quaternion, Vector3, } from 'three'
4
+
5
+ const _quat = new Quaternion().setFromAxisAngle( new Vector3( 0, 0, 1 ), Math.PI )
6
+
7
+ class GS3DLoaderPlugin {
8
+
9
+ constructor () {}
10
+
11
+ async load (
12
+ path: string,
13
+ option: SceneOption = {},
14
+ viewer?: DropInViewer
15
+ ) {
16
+
17
+ if ( !viewer ) viewer = this.createViewer()
18
+
19
+ await viewer.addSplatScene( path, {
20
+ showLoadingUI: false,
21
+ ...option,
22
+ } )
23
+
24
+ const scene = viewer.getSplatScene( 0 )
25
+
26
+ if ( scene ) scene.quaternion.copy( _quat )
27
+
28
+ return viewer
29
+
30
+ }
31
+
32
+ async loads (
33
+ options: ScenesOption[],
34
+ viewer?: DropInViewer,
35
+ showLoadingUI = false
36
+ // onProgress?: ( totalPercent: number, percentLabel: string, loaderStatus: LoaderStatus ) => void
37
+ ) {
38
+
39
+ if ( !viewer ) viewer = this.createViewer()
40
+
41
+ await viewer.addSplatScenes( options, showLoadingUI )
42
+
43
+ const count = viewer.getSceneCount()
44
+
45
+ for ( let i = 0; i < count; i++ ) {
46
+
47
+ const scene = ( viewer as DropInViewer ).getSplatScene( i )
48
+
49
+ if ( scene ) scene.quaternion.copy( _quat )
50
+
51
+ }
52
+
53
+ return viewer
54
+
55
+ }
56
+
57
+ createViewer ( option?: Record<string, any> ) {
58
+
59
+ const dropInViewer = new GaussianSplats3D.DropInViewer(
60
+ {
61
+ // ignoreDevicePixelRatio: false,
62
+ sharedMemoryForWorkers: false,
63
+ gpuAcceleratedSort: false,
64
+ halfPrecisionCovariancesOnGPU: true,
65
+ // integerBasedSort: true,
66
+ dynamicScene: true,
67
+ ...option,
68
+ }
69
+ ) as DropInViewer
70
+
71
+ return dropInViewer
72
+
73
+ }
74
+
75
+ }
76
+
96
77
  export default GS3DLoaderPlugin
package/src/types.ts CHANGED
@@ -1,54 +1,55 @@
1
- import { Group, Matrix4, Object3D, } from 'three'
2
-
3
- export enum SceneFormat {
4
- 'Splat' = 0,
5
- 'KSplat' = 1,
6
- 'Ply' = 2,
7
- 'Spz' = 3
8
- }
9
-
10
- export enum LoaderStatus {
11
- 'Downloading' = 0,
12
- 'Processing' = 1,
13
- 'Done' = 2
14
- }
15
-
16
- export interface option {
17
- splatAlphaRemovalThreshold?: number; // 0-255
18
- position?: Array<number>;
19
- rotation?: Array<number>;
20
- scale?: Array<number>;
21
- onProgress?: () => void;
22
- }
23
-
24
- export interface sceneOption {
25
- path: string;
26
- splatAlphaRemovalThreshold?: number; // 0-255
27
- position?: Array<number>;
28
- rotation?: Array<number>;
29
- scale?: Array<number>;
30
- headers?: Headers;
31
- format?: SceneFormat;
32
-
33
- }
34
-
35
- export interface DropInViewer extends Group {
36
- viewer: any;
37
- updateSplatMesh: () => void;
38
- addSplatScene: ( path: string, options?: option ) => Promise<void>;
39
- addSplatScenes: ( sceneOptions: sceneOption[], showLoadingUI: boolean ) => Promise<void>;
40
- getSplatScene: ( sceneIndex: number ) => SplatScene;
41
- removeSplatScene: ( index: number ) => Promise<void>;
42
- removeSplatScenes: ( indexes: number[] ) => Promise<void>;
43
- getSceneCount: () => number;
44
- dispose: () => Promise<any>;
45
- }
46
-
47
- export interface SplatScene extends Object3D {
48
- splatBuffer: Matrix4;
49
- transform: Matrix4;
50
- opacity: number;
51
-
52
- copyTransformData: ( otherScene: SplatScene ) => void;
53
- updateTransform: ( dynamicMode: boolean ) => void;
1
+ import { Group, Matrix4, Object3D, } from 'three'
2
+
3
+ export enum SceneFormat {
4
+ 'Splat' = 0,
5
+ 'KSplat' = 1,
6
+ 'Ply' = 2,
7
+ 'Spz' = 3
8
+ }
9
+
10
+ export enum LoaderStatus {
11
+ 'Downloading' = 0,
12
+ 'Processing' = 1,
13
+ 'Done' = 2
14
+ }
15
+
16
+ export interface SceneOption {
17
+ splatAlphaRemovalThreshold?: number; // 0-255
18
+ position?: Array<number>;
19
+ rotation?: Array<number>;
20
+ scale?: Array<number>;
21
+ showLoadingUI?: boolean;
22
+ headers?: Headers;
23
+ onProgress?: () => void;
24
+ }
25
+
26
+ export interface ScenesOption {
27
+ path: string;
28
+ splatAlphaRemovalThreshold?: number; // 0-255
29
+ position?: Array<number>;
30
+ rotation?: Array<number>;
31
+ scale?: Array<number>;
32
+ headers?: Headers;
33
+ format?: SceneFormat;
34
+ }
35
+
36
+ export interface DropInViewer extends Group {
37
+ viewer: any;
38
+ updateSplatMesh: () => void;
39
+ addSplatScene: ( path: string, options?: SceneOption ) => Promise<void>;
40
+ addSplatScenes: ( sceneOptions: ScenesOption[], showLoadingUI: boolean ) => Promise<void>;
41
+ getSplatScene: ( sceneIndex: number ) => SplatScene;
42
+ removeSplatScene: ( index: number ) => Promise<void>;
43
+ removeSplatScenes: ( indexes: number[] ) => Promise<void>;
44
+ getSceneCount: () => number;
45
+ dispose: () => Promise<any>;
46
+ }
47
+
48
+ export interface SplatScene extends Object3D {
49
+ splatBuffer: Matrix4;
50
+ transform: Matrix4;
51
+ opacity: number;
52
+
53
+ copyTransformData: ( otherScene: SplatScene ) => void;
54
+ updateTransform: ( dynamicMode: boolean ) => void;
54
55
  }