u-space 0.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +21 -0
  2. package/dist/index.cjs +1 -0
  3. package/dist/index.js +1374 -0
  4. package/dist/plugins/atmosphere/Atmosphere.d.ts +9 -0
  5. package/dist/plugins/atmosphere/index.cjs +1 -0
  6. package/dist/plugins/atmosphere/index.d.ts +1 -0
  7. package/dist/plugins/atmosphere/index.js +15 -0
  8. package/dist/plugins/curve-movement/CurveMovement.d.ts +78 -0
  9. package/dist/plugins/curve-movement/CurveMovementCamera.d.ts +8 -0
  10. package/dist/plugins/curve-movement/CurveMovementObject.d.ts +14 -0
  11. package/dist/plugins/curve-movement/index.cjs +1 -0
  12. package/dist/plugins/curve-movement/index.d.ts +3 -0
  13. package/dist/plugins/curve-movement/index.js +153 -0
  14. package/dist/plugins/keyboard-controls/KeyboardControls.d.ts +31 -0
  15. package/dist/plugins/keyboard-controls/index.cjs +1 -0
  16. package/dist/plugins/keyboard-controls/index.d.ts +1 -0
  17. package/dist/plugins/keyboard-controls/index.js +67 -0
  18. package/dist/plugins/minimap/Minimap.d.ts +22 -0
  19. package/dist/plugins/minimap/index.cjs +1 -0
  20. package/dist/plugins/minimap/index.d.ts +1 -0
  21. package/dist/plugins/minimap/index.js +67 -0
  22. package/dist/plugins/tiles/ArcgisTilesRenderer.d.ts +14 -0
  23. package/dist/plugins/tiles/Globe.d.ts +22 -0
  24. package/dist/plugins/tiles/index.cjs +1 -0
  25. package/dist/plugins/tiles/index.d.ts +2 -0
  26. package/dist/plugins/tiles/index.js +179 -0
  27. package/dist/plugins/tiles/plugins/TileMaterialReplacementPlugin.d.ts +11 -0
  28. package/dist/plugins/tiles/plugins/fade/FadeMaterialManager.d.ts +17 -0
  29. package/dist/plugins/tiles/plugins/fade/TilesFadePlugin.d.ts +5 -0
  30. package/dist/plugins/tiles/plugins/fade/wrapFadeNodeMaterial.d.ts +3 -0
  31. package/dist/plugins/tracking-controls/TrackingControls.d.ts +13 -0
  32. package/dist/plugins/tracking-controls/index.cjs +1 -0
  33. package/dist/plugins/tracking-controls/index.d.ts +1 -0
  34. package/dist/plugins/tracking-controls/index.js +23 -0
  35. package/dist/plugins/u-manager/Watermarker.d.ts +12 -0
  36. package/dist/plugins/u-manager/constants.d.ts +5 -0
  37. package/dist/plugins/u-manager/index.cjs +86 -0
  38. package/dist/plugins/u-manager/index.d.ts +6 -0
  39. package/dist/plugins/u-manager/index.js +20877 -0
  40. package/dist/plugins/u-manager/license/decryptUtils.d.ts +5 -0
  41. package/dist/plugins/u-manager/loaders/AnimationsLoader.d.ts +59 -0
  42. package/dist/plugins/u-manager/loaders/BaseFileLoader.d.ts +5 -0
  43. package/dist/plugins/u-manager/loaders/PropertiesLoader.d.ts +12 -0
  44. package/dist/plugins/u-manager/loaders/SceneLoader.d.ts +15 -0
  45. package/dist/plugins/u-manager/loaders/TopologiesLoader.d.ts +10 -0
  46. package/dist/plugins/u-manager/loaders/VisionsLoader.d.ts +26 -0
  47. package/dist/plugins/u-manager/types.d.ts +84 -0
  48. package/dist/src/animations/Tween.d.ts +20 -0
  49. package/dist/src/animations/index.d.ts +1 -0
  50. package/dist/src/effects/MaterialEffects.d.ts +10 -0
  51. package/dist/src/effects/TSLEffects.d.ts +24 -0
  52. package/dist/src/effects/index.d.ts +2 -0
  53. package/dist/src/index.d.ts +9 -0
  54. package/dist/src/interactions/InteractionEvent.d.ts +39 -0
  55. package/dist/src/interactions/InteractionManager.d.ts +55 -0
  56. package/dist/src/interactions/index.d.ts +2 -0
  57. package/dist/src/interfaces/base.d.ts +11 -0
  58. package/dist/src/interfaces/index.d.ts +1 -0
  59. package/dist/src/loaders/ModelLoaderManager.d.ts +40 -0
  60. package/dist/src/loaders/SBMLoader.d.ts +6 -0
  61. package/dist/src/loaders/SBMUtils.d.ts +5 -0
  62. package/dist/src/loaders/SBMXLoader.d.ts +6 -0
  63. package/dist/src/loaders/TextureLoaderManager.d.ts +11 -0
  64. package/dist/src/loaders/index.d.ts +4 -0
  65. package/dist/src/managers/ObjectManager.d.ts +60 -0
  66. package/dist/src/managers/index.d.ts +1 -0
  67. package/dist/src/objects/BaseGroup.d.ts +8 -0
  68. package/dist/src/objects/BaseMesh.d.ts +8 -0
  69. package/dist/src/objects/BaseSprite.d.ts +8 -0
  70. package/dist/src/objects/CircleMesh.d.ts +17 -0
  71. package/dist/src/objects/ExtrudeMesh.d.ts +17 -0
  72. package/dist/src/objects/Model.d.ts +17 -0
  73. package/dist/src/objects/ObjectUtils.d.ts +4 -0
  74. package/dist/src/objects/PlaneMesh.d.ts +17 -0
  75. package/dist/src/objects/Poi.d.ts +38 -0
  76. package/dist/src/objects/ShapeMesh.d.ts +17 -0
  77. package/dist/src/objects/SphereMesh.d.ts +20 -0
  78. package/dist/src/objects/Topology.d.ts +64 -0
  79. package/dist/src/objects/TubeMesh.d.ts +18 -0
  80. package/dist/src/objects/index.d.ts +13 -0
  81. package/dist/src/types.d.ts +1 -0
  82. package/dist/src/viewers/CameraControls.d.ts +19 -0
  83. package/dist/src/viewers/Info.d.ts +18 -0
  84. package/dist/src/viewers/RenderPipeline.d.ts +17 -0
  85. package/dist/src/viewers/RoomEnvironment.d.ts +11 -0
  86. package/dist/src/viewers/Viewer.d.ts +59 -0
  87. package/dist/src/viewers/ViewerHelper.d.ts +12 -0
  88. package/dist/src/viewers/index.d.ts +3 -0
  89. package/docs/api-interactions.md +64 -0
  90. package/docs/api-managers.md +54 -0
  91. package/docs/api-objects.md +65 -0
  92. package/docs/api-plugins.md +103 -0
  93. package/docs/api-viewer.md +84 -0
  94. package/docs/examples-guide.md +48 -0
  95. package/docs/getting-started.md +126 -0
  96. package/package.json +60 -0
@@ -0,0 +1,9 @@
1
+ import type { Viewer } from 'u-space';
2
+ declare class Atmosphere {
3
+ viewer: Viewer;
4
+ constructor(viewer: Viewer);
5
+ enable(): void;
6
+ disable(): void;
7
+ dispose(): void;
8
+ }
9
+ export { Atmosphere };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class s{viewer;constructor(e){this.viewer=e}enable(){}disable(){}dispose(){}}exports.Atmosphere=s;
@@ -0,0 +1 @@
1
+ export * from './Atmosphere';
@@ -0,0 +1,15 @@
1
+ class r {
2
+ viewer;
3
+ constructor(e) {
4
+ this.viewer = e;
5
+ }
6
+ enable() {
7
+ }
8
+ disable() {
9
+ }
10
+ dispose() {
11
+ }
12
+ }
13
+ export {
14
+ r as Atmosphere
15
+ };
@@ -0,0 +1,78 @@
1
+ import { EventDispatcher, Vector3, type Curve } from 'three/webgpu';
2
+ import type { Viewer } from 'u-space';
3
+ export type CurveMovementEventMap = {
4
+ update: {
5
+ progress: number;
6
+ };
7
+ complete: {};
8
+ };
9
+ declare class CurveMovement extends EventDispatcher<CurveMovementEventMap> {
10
+ viewer: Viewer;
11
+ /** 路径曲线 */
12
+ path: Curve<Vector3> | null;
13
+ /** 当前进度 (0-1) */
14
+ progress: number;
15
+ /** 移动速度 (每秒进度) */
16
+ speed: number;
17
+ /** 循环模式 */
18
+ loop: 'once' | 'repeat' | 'pingpong';
19
+ /** 是否往返移动 */
20
+ pingPong: boolean;
21
+ /** 位置偏移 */
22
+ positionOffset: Vector3;
23
+ /** 是否自动朝向路径前方 */
24
+ autoLookAt: boolean;
25
+ /** Y轴朝向角度偏移 (弧度) */
26
+ lookAtOffset: number;
27
+ /** 当前方向 (1: 正向, -1: 反向) */
28
+ direction: 1 | -1;
29
+ /** 是否正在播放 */
30
+ protected _isPlaying: boolean;
31
+ /** 临时向量用于计算 */
32
+ protected _tempPosition: Vector3;
33
+ protected _tempTangent: Vector3;
34
+ protected _tempLookAt: Vector3;
35
+ constructor(viewer: Viewer);
36
+ /**
37
+ * 从点数组创建 CatmullRom 曲线路径
38
+ */
39
+ setFromPoints(points: Vector3[], closed?: boolean): this;
40
+ /**
41
+ * 设置路径曲线
42
+ */
43
+ setPath(path: Curve<Vector3>): this;
44
+ /**
45
+ * 设置当前进度并更新位置
46
+ */
47
+ setProgress(progress: number): this;
48
+ /**
49
+ * 获取是否正在播放
50
+ */
51
+ get isPlaying(): boolean;
52
+ /**
53
+ * 开始移动动画
54
+ */
55
+ play(): this;
56
+ resume(): this;
57
+ /**
58
+ * 暂停移动动画
59
+ */
60
+ pause(): this;
61
+ /**
62
+ * 停止并重置进度
63
+ */
64
+ stop(): this;
65
+ /**
66
+ * 反转移动方向
67
+ */
68
+ reverse(): this;
69
+ /**
70
+ * 更新动画帧
71
+ */
72
+ private _update;
73
+ /**
74
+ * 销毁插件
75
+ */
76
+ dispose(): void;
77
+ }
78
+ export { CurveMovement };
@@ -0,0 +1,8 @@
1
+ import type { Viewer } from 'u-space';
2
+ import { CurveMovement } from './CurveMovement';
3
+ declare class CurveMovementCamera extends CurveMovement {
4
+ constructor(viewer: Viewer);
5
+ private _updateCamera;
6
+ dispose(): void;
7
+ }
8
+ export { CurveMovementCamera };
@@ -0,0 +1,14 @@
1
+ import { type Object3D } from 'three';
2
+ import type { Viewer } from 'u-space';
3
+ import { CurveMovement } from './CurveMovement';
4
+ declare class CurveMovementObject extends CurveMovement {
5
+ /** 移动目标对象 */
6
+ target: Object3D | null;
7
+ constructor(viewer: Viewer);
8
+ /**
9
+ * 更新动画帧
10
+ */
11
+ private _updateObject;
12
+ dispose(): void;
13
+ }
14
+ export { CurveMovementObject };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("three/webgpu");require("three");class s extends e.EventDispatcher{viewer;path=null;progress=0;speed=.1;loop="once";pingPong=!1;positionOffset=new e.Vector3;autoLookAt=!0;lookAtOffset=0;direction=1;_isPlaying=!1;_tempPosition=new e.Vector3;_tempTangent=new e.Vector3;_tempLookAt=new e.Vector3;constructor(t){super(),this.viewer=t}setFromPoints(t,r=!1){return this.setPath(new e.CatmullRomCurve3(t,r,"catmullrom",0))}setPath(t){return this.path=t,this}setProgress(t){return this.progress=Math.max(0,Math.min(1,t)),this}get isPlaying(){return this._isPlaying}play(){return this.resume(),this.progress=0,this.direction=1,this}resume(){return this._isPlaying=!0,this.viewer.addEventListener("beforeControlsUpdate",this._update),this}pause(){return this._isPlaying=!1,this.viewer.removeEventListener("beforeControlsUpdate",this._update),this}stop(){return this.pause(),this.progress=0,this.direction=1,this}reverse(){return this.direction*=-1,this}_update=()=>{if(!this._isPlaying||!this.path)return;const t=this.viewer.timer.getDelta();if(this.progress+=this.speed*t*this.direction,this.progress>=1)switch(this.loop){case"once":this.progress=1,this.pause(),this.dispatchEvent({type:"complete"});break;case"repeat":this.progress=0;break;case"pingpong":this.progress=1,this.direction=-1;break}else if(this.progress<=0)switch(this.loop){case"once":this.progress=0,this.pause(),this.dispatchEvent({type:"complete"});break;case"repeat":this.progress=1;break;case"pingpong":this.progress=0,this.direction=1;break}this.path.getPointAt(this.progress,this._tempPosition),this._tempPosition.add(this.positionOffset),this.autoLookAt&&(this.path.getTangentAt(this.progress,this._tempTangent),this._tempLookAt.copy(this._tempPosition).add(this._tempTangent)),this.dispatchEvent({type:"update",progress:this.progress}),this.viewer.render()};dispose(){this.stop(),this.path=null}}class o extends s{constructor(t){super(t),this.addEventListener("update",this._updateCamera)}_updateCamera=()=>{this.viewer.controls.setPosition(this._tempPosition.x,this._tempPosition.y,this._tempPosition.z),this.autoLookAt&&(this.viewer.controls.setTarget(this._tempLookAt.x,this._tempLookAt.y,this._tempLookAt.z),this.lookAtOffset!==0&&this.viewer.controls.rotate(this.lookAtOffset,0))};dispose(){super.dispose(),this.removeEventListener("update",this._updateCamera)}}class h extends s{target=null;constructor(t){super(t),this.addEventListener("update",this._updateObject)}_updateObject(){this.target&&(this.target.position.copy(this._tempPosition),this.autoLookAt&&(this.target.lookAt(this._tempLookAt),this.lookAtOffset!==0&&this.target.rotateY(this.lookAtOffset)))}dispose(){super.dispose(),this.removeEventListener("update",this._updateObject),this.target=null}}exports.CurveMovement=s;exports.CurveMovementCamera=o;exports.CurveMovementObject=h;
@@ -0,0 +1,3 @@
1
+ export * from './CurveMovement';
2
+ export * from './CurveMovementCamera';
3
+ export * from './CurveMovementObject';
@@ -0,0 +1,153 @@
1
+ import { EventDispatcher as r, Vector3 as e, CatmullRomCurve3 as h } from "three/webgpu";
2
+ import "three";
3
+ class i extends r {
4
+ viewer;
5
+ /** 路径曲线 */
6
+ path = null;
7
+ /** 当前进度 (0-1) */
8
+ progress = 0;
9
+ /** 移动速度 (每秒进度) */
10
+ speed = 0.1;
11
+ /** 循环模式 */
12
+ loop = "once";
13
+ /** 是否往返移动 */
14
+ pingPong = !1;
15
+ /** 位置偏移 */
16
+ positionOffset = new e();
17
+ /** 是否自动朝向路径前方 */
18
+ autoLookAt = !0;
19
+ /** Y轴朝向角度偏移 (弧度) */
20
+ lookAtOffset = 0;
21
+ /** 当前方向 (1: 正向, -1: 反向) */
22
+ direction = 1;
23
+ /** 是否正在播放 */
24
+ _isPlaying = !1;
25
+ /** 临时向量用于计算 */
26
+ _tempPosition = new e();
27
+ _tempTangent = new e();
28
+ _tempLookAt = new e();
29
+ constructor(t) {
30
+ super(), this.viewer = t;
31
+ }
32
+ /**
33
+ * 从点数组创建 CatmullRom 曲线路径
34
+ */
35
+ setFromPoints(t, o = !1) {
36
+ return this.setPath(new h(t, o, "catmullrom", 0));
37
+ }
38
+ /**
39
+ * 设置路径曲线
40
+ */
41
+ setPath(t) {
42
+ return this.path = t, this;
43
+ }
44
+ /**
45
+ * 设置当前进度并更新位置
46
+ */
47
+ setProgress(t) {
48
+ return this.progress = Math.max(0, Math.min(1, t)), this;
49
+ }
50
+ /**
51
+ * 获取是否正在播放
52
+ */
53
+ get isPlaying() {
54
+ return this._isPlaying;
55
+ }
56
+ /**
57
+ * 开始移动动画
58
+ */
59
+ play() {
60
+ return this.resume(), this.progress = 0, this.direction = 1, this;
61
+ }
62
+ resume() {
63
+ return this._isPlaying = !0, this.viewer.addEventListener("beforeControlsUpdate", this._update), this;
64
+ }
65
+ /**
66
+ * 暂停移动动画
67
+ */
68
+ pause() {
69
+ return this._isPlaying = !1, this.viewer.removeEventListener("beforeControlsUpdate", this._update), this;
70
+ }
71
+ /**
72
+ * 停止并重置进度
73
+ */
74
+ stop() {
75
+ return this.pause(), this.progress = 0, this.direction = 1, this;
76
+ }
77
+ /**
78
+ * 反转移动方向
79
+ */
80
+ reverse() {
81
+ return this.direction *= -1, this;
82
+ }
83
+ /**
84
+ * 更新动画帧
85
+ */
86
+ _update = () => {
87
+ if (!this._isPlaying || !this.path) return;
88
+ const t = this.viewer.timer.getDelta();
89
+ if (this.progress += this.speed * t * this.direction, this.progress >= 1)
90
+ switch (this.loop) {
91
+ case "once":
92
+ this.progress = 1, this.pause(), this.dispatchEvent({ type: "complete" });
93
+ break;
94
+ case "repeat":
95
+ this.progress = 0;
96
+ break;
97
+ case "pingpong":
98
+ this.progress = 1, this.direction = -1;
99
+ break;
100
+ }
101
+ else if (this.progress <= 0)
102
+ switch (this.loop) {
103
+ case "once":
104
+ this.progress = 0, this.pause(), this.dispatchEvent({ type: "complete" });
105
+ break;
106
+ case "repeat":
107
+ this.progress = 1;
108
+ break;
109
+ case "pingpong":
110
+ this.progress = 0, this.direction = 1;
111
+ break;
112
+ }
113
+ this.path.getPointAt(this.progress, this._tempPosition), this._tempPosition.add(this.positionOffset), this.autoLookAt && (this.path.getTangentAt(this.progress, this._tempTangent), this._tempLookAt.copy(this._tempPosition).add(this._tempTangent)), this.dispatchEvent({ type: "update", progress: this.progress }), this.viewer.render();
114
+ };
115
+ /**
116
+ * 销毁插件
117
+ */
118
+ dispose() {
119
+ this.stop(), this.path = null;
120
+ }
121
+ }
122
+ class n extends i {
123
+ constructor(t) {
124
+ super(t), this.addEventListener("update", this._updateCamera);
125
+ }
126
+ _updateCamera = () => {
127
+ this.viewer.controls.setPosition(this._tempPosition.x, this._tempPosition.y, this._tempPosition.z), this.autoLookAt && (this.viewer.controls.setTarget(this._tempLookAt.x, this._tempLookAt.y, this._tempLookAt.z), this.lookAtOffset !== 0 && this.viewer.controls.rotate(this.lookAtOffset, 0));
128
+ };
129
+ dispose() {
130
+ super.dispose(), this.removeEventListener("update", this._updateCamera);
131
+ }
132
+ }
133
+ class u extends i {
134
+ /** 移动目标对象 */
135
+ target = null;
136
+ constructor(t) {
137
+ super(t), this.addEventListener("update", this._updateObject);
138
+ }
139
+ /**
140
+ * 更新动画帧
141
+ */
142
+ _updateObject() {
143
+ this.target && (this.target.position.copy(this._tempPosition), this.autoLookAt && (this.target.lookAt(this._tempLookAt), this.lookAtOffset !== 0 && this.target.rotateY(this.lookAtOffset)));
144
+ }
145
+ dispose() {
146
+ super.dispose(), this.removeEventListener("update", this._updateObject), this.target = null;
147
+ }
148
+ }
149
+ export {
150
+ i as CurveMovement,
151
+ n as CurveMovementCamera,
152
+ u as CurveMovementObject
153
+ };
@@ -0,0 +1,31 @@
1
+ import type { Viewer } from 'u-space';
2
+ export declare const ACTION: Readonly<{
3
+ MOVE_FORWARD: "move-forward";
4
+ MOVE_BACKWARD: "move-backward";
5
+ MOVE_LEFT: "move-left";
6
+ MOVE_RIGHT: "move-right";
7
+ MOVE_UP: "move-up";
8
+ MOVE_DOWN: "move-down";
9
+ ROTATE_LEFT: "rotate-left";
10
+ ROTATE_RIGHT: "rotate-right";
11
+ ROTATE_UP: "rotate-up";
12
+ ROTATE_DOWN: "rotate-down";
13
+ }>;
14
+ type ActionValue = (typeof ACTION)[keyof typeof ACTION];
15
+ declare class KeyboardControls {
16
+ viewer: Viewer;
17
+ moveDistanceDelta: number;
18
+ rotateAngleDelta: number;
19
+ keys: Record<string, ActionValue>;
20
+ _state: Record<ActionValue, {
21
+ fn: () => void;
22
+ pressed: boolean;
23
+ }>;
24
+ constructor(viewer: Viewer);
25
+ _onKeyDown: (event: KeyboardEvent) => void;
26
+ _onKeyUp: (event: KeyboardEvent) => void;
27
+ _update: () => void;
28
+ enable(): this;
29
+ disable(): this;
30
+ }
31
+ export { KeyboardControls };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=Object.freeze({MOVE_FORWARD:"move-forward",MOVE_BACKWARD:"move-backward",MOVE_LEFT:"move-left",MOVE_RIGHT:"move-right",MOVE_UP:"move-up",MOVE_DOWN:"move-down",ROTATE_LEFT:"rotate-left",ROTATE_RIGHT:"rotate-right",ROTATE_UP:"rotate-up",ROTATE_DOWN:"rotate-down"});class r{viewer;moveDistanceDelta=.1;rotateAngleDelta=Math.PI/180;keys={KeyW:e.MOVE_FORWARD,KeyS:e.MOVE_BACKWARD,KeyA:e.MOVE_LEFT,KeyD:e.MOVE_RIGHT,KeyQ:e.MOVE_UP,KeyE:e.MOVE_DOWN,ArrowLeft:e.ROTATE_LEFT,ArrowRight:e.ROTATE_RIGHT,ArrowUp:e.ROTATE_UP,ArrowDown:e.ROTATE_DOWN};_state={[e.MOVE_FORWARD]:{fn:()=>this.viewer.controls.forward(this.moveDistanceDelta),pressed:!1},[e.MOVE_BACKWARD]:{fn:()=>this.viewer.controls.forward(-this.moveDistanceDelta),pressed:!1},[e.MOVE_LEFT]:{fn:()=>this.viewer.controls.truck(-this.moveDistanceDelta,0),pressed:!1},[e.MOVE_RIGHT]:{fn:()=>this.viewer.controls.truck(this.moveDistanceDelta,0),pressed:!1},[e.MOVE_UP]:{fn:()=>this.viewer.controls.elevate(this.moveDistanceDelta),pressed:!1},[e.MOVE_DOWN]:{fn:()=>this.viewer.controls.elevate(-this.moveDistanceDelta),pressed:!1},[e.ROTATE_LEFT]:{fn:()=>this.viewer.controls.rotate(this.rotateAngleDelta,0),pressed:!1},[e.ROTATE_RIGHT]:{fn:()=>this.viewer.controls.rotate(-this.rotateAngleDelta,0),pressed:!1},[e.ROTATE_UP]:{fn:()=>this.viewer.controls.rotate(0,this.rotateAngleDelta),pressed:!1},[e.ROTATE_DOWN]:{fn:()=>this.viewer.controls.rotate(0,-this.rotateAngleDelta),pressed:!1}};constructor(t){this.viewer=t}_onKeyDown=t=>{const s=this.keys[t.code];s&&(this._state[s].pressed=!0)};_onKeyUp=t=>{const s=this.keys[t.code];s&&(this._state[s].pressed=!1)};_update=()=>{const{_state:t}=this;for(const{pressed:s,fn:o}of Object.values(t))s&&o()};enable(){return window.addEventListener("keydown",this._onKeyDown),window.addEventListener("keyup",this._onKeyUp),this.viewer.addEventListener("beforeControlsUpdate",this._update),this}disable(){return window.removeEventListener("keydown",this._onKeyDown),window.removeEventListener("keyup",this._onKeyUp),this.viewer.removeEventListener("beforeControlsUpdate",this._update),this}}exports.ACTION=e;exports.KeyboardControls=r;
@@ -0,0 +1 @@
1
+ export * from './KeyboardControls';
@@ -0,0 +1,67 @@
1
+ const e = Object.freeze({
2
+ MOVE_FORWARD: "move-forward",
3
+ MOVE_BACKWARD: "move-backward",
4
+ MOVE_LEFT: "move-left",
5
+ MOVE_RIGHT: "move-right",
6
+ MOVE_UP: "move-up",
7
+ MOVE_DOWN: "move-down",
8
+ ROTATE_LEFT: "rotate-left",
9
+ ROTATE_RIGHT: "rotate-right",
10
+ ROTATE_UP: "rotate-up",
11
+ ROTATE_DOWN: "rotate-down"
12
+ });
13
+ class n {
14
+ viewer;
15
+ moveDistanceDelta = 0.1;
16
+ rotateAngleDelta = Math.PI / 180;
17
+ keys = {
18
+ KeyW: e.MOVE_FORWARD,
19
+ KeyS: e.MOVE_BACKWARD,
20
+ KeyA: e.MOVE_LEFT,
21
+ KeyD: e.MOVE_RIGHT,
22
+ KeyQ: e.MOVE_UP,
23
+ KeyE: e.MOVE_DOWN,
24
+ ArrowLeft: e.ROTATE_LEFT,
25
+ ArrowRight: e.ROTATE_RIGHT,
26
+ ArrowUp: e.ROTATE_UP,
27
+ ArrowDown: e.ROTATE_DOWN
28
+ };
29
+ _state = {
30
+ [e.MOVE_FORWARD]: { fn: () => this.viewer.controls.forward(this.moveDistanceDelta), pressed: !1 },
31
+ [e.MOVE_BACKWARD]: { fn: () => this.viewer.controls.forward(-this.moveDistanceDelta), pressed: !1 },
32
+ [e.MOVE_LEFT]: { fn: () => this.viewer.controls.truck(-this.moveDistanceDelta, 0), pressed: !1 },
33
+ [e.MOVE_RIGHT]: { fn: () => this.viewer.controls.truck(this.moveDistanceDelta, 0), pressed: !1 },
34
+ [e.MOVE_UP]: { fn: () => this.viewer.controls.elevate(this.moveDistanceDelta), pressed: !1 },
35
+ [e.MOVE_DOWN]: { fn: () => this.viewer.controls.elevate(-this.moveDistanceDelta), pressed: !1 },
36
+ [e.ROTATE_LEFT]: { fn: () => this.viewer.controls.rotate(this.rotateAngleDelta, 0), pressed: !1 },
37
+ [e.ROTATE_RIGHT]: { fn: () => this.viewer.controls.rotate(-this.rotateAngleDelta, 0), pressed: !1 },
38
+ [e.ROTATE_UP]: { fn: () => this.viewer.controls.rotate(0, this.rotateAngleDelta), pressed: !1 },
39
+ [e.ROTATE_DOWN]: { fn: () => this.viewer.controls.rotate(0, -this.rotateAngleDelta), pressed: !1 }
40
+ };
41
+ constructor(t) {
42
+ this.viewer = t;
43
+ }
44
+ _onKeyDown = (t) => {
45
+ const s = this.keys[t.code];
46
+ s && (this._state[s].pressed = !0);
47
+ };
48
+ _onKeyUp = (t) => {
49
+ const s = this.keys[t.code];
50
+ s && (this._state[s].pressed = !1);
51
+ };
52
+ _update = () => {
53
+ const { _state: t } = this;
54
+ for (const { pressed: s, fn: o } of Object.values(t))
55
+ s && o();
56
+ };
57
+ enable() {
58
+ return window.addEventListener("keydown", this._onKeyDown), window.addEventListener("keyup", this._onKeyUp), this.viewer.addEventListener("beforeControlsUpdate", this._update), this;
59
+ }
60
+ disable() {
61
+ return window.removeEventListener("keydown", this._onKeyDown), window.removeEventListener("keyup", this._onKeyUp), this.viewer.removeEventListener("beforeControlsUpdate", this._update), this;
62
+ }
63
+ }
64
+ export {
65
+ e as ACTION,
66
+ n as KeyboardControls
67
+ };
@@ -0,0 +1,22 @@
1
+ import { CanvasTarget, Mesh, MeshBasicNodeMaterial, OrthographicCamera, PlaneGeometry, RenderTarget, Scene, type Object3D } from 'three/webgpu';
2
+ import { type Viewer, CameraControls } from 'u-space';
3
+ declare class Minimap {
4
+ viewer: Viewer;
5
+ camera: OrthographicCamera;
6
+ scene: Scene;
7
+ canvas: HTMLCanvasElement;
8
+ canvasTarget: CanvasTarget;
9
+ renderTarget: RenderTarget;
10
+ controls: CameraControls;
11
+ plane: Mesh<PlaneGeometry, MeshBasicNodeMaterial>;
12
+ target: Object3D | null;
13
+ marker: Object3D;
14
+ needsUpdate: boolean;
15
+ constructor(viewer: Viewer);
16
+ _update: () => Promise<void>;
17
+ setSize(width: number, height: number, updateStyle?: boolean): void;
18
+ enable(): this;
19
+ disable(): this;
20
+ dispose(): void;
21
+ }
22
+ export { Minimap };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("three/tsl"),t=require("three/webgpu"),c=require("u-space"),n=new t.Vector3,g=new t.Vector3;class v{viewer;camera;scene;canvas;canvasTarget;renderTarget;controls;plane;target;marker;needsUpdate;constructor(e){this.viewer=e,this.canvas=document.createElement("canvas"),this.canvas.style.position="absolute",this.canvas.style.top="10px",this.canvas.style.left="10px",this.canvasTarget=new t.CanvasTarget(this.canvas),this.camera=new t.OrthographicCamera,this.camera.position.z=1,this.scene=new t.Scene,this.scene.environment=e.scene.environment,this.renderTarget=new t.RenderTarget(1,1,{flipY:!1}),this.controls=new c.CameraControls(this.camera,this.canvas),this.controls.enabled=!1,this.plane=new t.Mesh(new t.PlaneGeometry(1,1).rotateX(-Math.PI/2),new t.MeshBasicNodeMaterial({colorNode:a.texture(this.renderTarget.texture,a.vec2(a.uv().x,a.uv().y.oneMinus())),transparent:!0,depthTest:!1})),this.target=null,this.marker=new t.Mesh(new t.ShapeGeometry(new t.Shape([new t.Vector2(0,.9),new t.Vector2(.6,-.9),new t.Vector2(0,-.4),new t.Vector2(-.6,-.9)])).rotateX(-Math.PI/2),new t.MeshBasicNodeMaterial({color:16711680,transparent:!0,depthTest:!1})),this.marker.scale.setScalar(5),this.marker.renderOrder=1,this.needsUpdate=!1,this.setSize(300,300)}_update=async()=>{const{renderer:e,timer:s,controls:r}=this.viewer;if(this.needsUpdate&&this.target){this.needsUpdate=!1;const o=this.target.parent;this.scene.attach(this.target);const i=new t.Box3().setFromObject(this.target),p=i.getCenter(n),h=i.getSize(g);this.plane.position.copy(p),this.plane.scale.set(h.x,1,h.z),this.scene.remove(this.plane),this.scene.remove(this.marker),this.controls.flyToBox(i,{viewpoint:"top",enableTransition:!1}),this.controls.update(s.getDelta());const m=e.getRenderTarget();e.setRenderTarget(this.renderTarget),e.render(this.scene,this.camera),e.setRenderTarget(m),o?o.attach(this.target):this.scene.remove(this.target),this.scene.add(this.plane),this.scene.add(this.marker)}r.getPosition(n),this.marker.position.x=n.x,this.marker.position.y=this.plane.position.y,this.marker.position.z=n.z,this.marker.rotation.y=r.azimuthAngle;const l=e.getCanvasTarget(),d=e.getRenderTarget();e.setCanvasTarget(this.canvasTarget),e.setRenderTarget(null),e.render(this.scene,this.camera),e.setCanvasTarget(l),e.setRenderTarget(d)};setSize(e,s,r=!0){this.canvasTarget.setSize(e,s,r),this.camera.left=-e/2,this.camera.right=e/2,this.camera.top=s/2,this.camera.bottom=-s/2,this.camera.updateProjectionMatrix(),this.renderTarget.setSize(e,s)}enable(){return this.viewer.el.appendChild(this.canvas),this.viewer.addEventListener("afterRender",this._update),this}disable(){return this.viewer.el.removeChild(this.canvas),this.viewer.removeEventListener("afterRender",this._update),this}dispose(){this.disable(),c.ObjectUtils.traverseMeshes(this.marker,e=>{e.geometry.dispose(),e.material.dispose()}),this.plane.geometry.dispose(),this.plane.material.dispose(),this.renderTarget.dispose(),this.renderTarget.texture.dispose(),this.controls.dispose()}}exports.Minimap=v;
@@ -0,0 +1 @@
1
+ export * from './Minimap';
@@ -0,0 +1,67 @@
1
+ import { texture as T, vec2 as w, uv as h } from "three/tsl";
2
+ import { Vector3 as d, CanvasTarget as u, OrthographicCamera as f, Scene as x, RenderTarget as y, Mesh as c, PlaneGeometry as k, MeshBasicNodeMaterial as l, ShapeGeometry as z, Shape as C, Vector2 as a, Box3 as b } from "three/webgpu";
3
+ import { CameraControls as M, ObjectUtils as R } from "u-space";
4
+ const r = new d(), S = new d();
5
+ class j {
6
+ viewer;
7
+ camera;
8
+ scene;
9
+ canvas;
10
+ canvasTarget;
11
+ renderTarget;
12
+ controls;
13
+ plane;
14
+ target;
15
+ marker;
16
+ needsUpdate;
17
+ constructor(e) {
18
+ this.viewer = e, this.canvas = document.createElement("canvas"), this.canvas.style.position = "absolute", this.canvas.style.top = "10px", this.canvas.style.left = "10px", this.canvasTarget = new u(this.canvas), this.camera = new f(), this.camera.position.z = 1, this.scene = new x(), this.scene.environment = e.scene.environment, this.renderTarget = new y(1, 1, { flipY: !1 }), this.controls = new M(this.camera, this.canvas), this.controls.enabled = !1, this.plane = new c(
19
+ new k(1, 1).rotateX(-Math.PI / 2),
20
+ new l({
21
+ colorNode: T(this.renderTarget.texture, w(h().x, h().y.oneMinus())),
22
+ transparent: !0,
23
+ depthTest: !1
24
+ })
25
+ ), this.target = null, this.marker = new c(
26
+ new z(
27
+ new C([new a(0, 0.9), new a(0.6, -0.9), new a(0, -0.4), new a(-0.6, -0.9)])
28
+ ).rotateX(-Math.PI / 2),
29
+ new l({ color: 16711680, transparent: !0, depthTest: !1 })
30
+ ), this.marker.scale.setScalar(5), this.marker.renderOrder = 1, this.needsUpdate = !1, this.setSize(300, 300);
31
+ }
32
+ _update = async () => {
33
+ const { renderer: e, timer: t, controls: s } = this.viewer;
34
+ if (this.needsUpdate && this.target) {
35
+ this.needsUpdate = !1;
36
+ const i = this.target.parent;
37
+ this.scene.attach(this.target);
38
+ const n = new b().setFromObject(this.target), g = n.getCenter(r), o = n.getSize(S);
39
+ this.plane.position.copy(g), this.plane.scale.set(o.x, 1, o.z), this.scene.remove(this.plane), this.scene.remove(this.marker), this.controls.flyToBox(n, {
40
+ viewpoint: "top",
41
+ enableTransition: !1
42
+ }), this.controls.update(t.getDelta());
43
+ const v = e.getRenderTarget();
44
+ e.setRenderTarget(this.renderTarget), e.render(this.scene, this.camera), e.setRenderTarget(v), i ? i.attach(this.target) : this.scene.remove(this.target), this.scene.add(this.plane), this.scene.add(this.marker);
45
+ }
46
+ s.getPosition(r), this.marker.position.x = r.x, this.marker.position.y = this.plane.position.y, this.marker.position.z = r.z, this.marker.rotation.y = s.azimuthAngle;
47
+ const p = e.getCanvasTarget(), m = e.getRenderTarget();
48
+ e.setCanvasTarget(this.canvasTarget), e.setRenderTarget(null), e.render(this.scene, this.camera), e.setCanvasTarget(p), e.setRenderTarget(m);
49
+ };
50
+ setSize(e, t, s = !0) {
51
+ this.canvasTarget.setSize(e, t, s), this.camera.left = -e / 2, this.camera.right = e / 2, this.camera.top = t / 2, this.camera.bottom = -t / 2, this.camera.updateProjectionMatrix(), this.renderTarget.setSize(e, t);
52
+ }
53
+ enable() {
54
+ return this.viewer.el.appendChild(this.canvas), this.viewer.addEventListener("afterRender", this._update), this;
55
+ }
56
+ disable() {
57
+ return this.viewer.el.removeChild(this.canvas), this.viewer.removeEventListener("afterRender", this._update), this;
58
+ }
59
+ dispose() {
60
+ this.disable(), R.traverseMeshes(this.marker, (e) => {
61
+ e.geometry.dispose(), e.material.dispose();
62
+ }), this.plane.geometry.dispose(), this.plane.material.dispose(), this.renderTarget.dispose(), this.renderTarget.texture.dispose(), this.controls.dispose();
63
+ }
64
+ }
65
+ export {
66
+ j as Minimap
67
+ };
@@ -0,0 +1,14 @@
1
+ import type { Viewer } from 'u-space';
2
+ import { Globe } from './Globe';
3
+ declare class ArcgisTilesRenderer extends Globe {
4
+ viewer: Viewer;
5
+ loedTilesSets: Set<() => void>;
6
+ constructor(viewer: Viewer);
7
+ render: () => void;
8
+ beforeRenderHandler: () => void;
9
+ enable(): this;
10
+ disable(): this;
11
+ invalidate(lon: number, lat: number, alt: number): () => void;
12
+ dispose(): void;
13
+ }
14
+ export { ArcgisTilesRenderer };
@@ -0,0 +1,22 @@
1
+ import { TilesRenderer } from '3d-tiles-renderer';
2
+ import { TileCompressionPlugin, UpdateOnChangePlugin, ReorientationPlugin, XYZTilesPlugin } from '3d-tiles-renderer/plugins';
3
+ import { TilesFadePlugin } from './plugins/fade/TilesFadePlugin';
4
+ import { TileMaterialReplacementPlugin } from './plugins/TileMaterialReplacementPlugin';
5
+ declare class Globe {
6
+ tiles: TilesRenderer;
7
+ tileCompressionPlugin: TileCompressionPlugin;
8
+ updateOnChangePlugin: UpdateOnChangePlugin;
9
+ reorientationPlugin: ReorientationPlugin;
10
+ xyzTilesPlugin: XYZTilesPlugin;
11
+ tilesFadePlugin: TilesFadePlugin;
12
+ tileMaterialReplacementPlugin: TileMaterialReplacementPlugin;
13
+ constructor();
14
+ _initTilesRenderer(): TilesRenderer<import("3d-tiles-renderer").TilesRendererEventMap>;
15
+ _initTileCompressionPlugin(): TileCompressionPlugin;
16
+ _initUpdateOnChangePlugin(): UpdateOnChangePlugin;
17
+ _initReorientationPlugin(): ReorientationPlugin;
18
+ _initXYZTilesPlugin(): XYZTilesPlugin;
19
+ _initTilesFadePlugin(): TilesFadePlugin;
20
+ _initTileMaterialReplacementPlugin(): TileMaterialReplacementPlugin;
21
+ }
22
+ export { Globe };
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("three/webgpu"),v=require("3d-tiles-renderer"),l=require("3d-tiles-renderer/plugins"),f=require("3d-tiles-renderer/src/three/plugins/fade/FadeMaterialManager.js"),M=require("3d-tiles-renderer/src/three/plugins/fade/wrapFadeMaterial.js"),s=require("three/tsl"),o=require("@takram/three-geospatial"),c=require("@takram/three-geospatial/webgpu"),u=Symbol("FADE_PARAMS"),h=c.FnLayout({name:"bayerDither2x2",type:"float",inputs:[{name:"v",type:"vec2"}]})(([t])=>(o.reinterpretType(t),t.y.mul(3).add(t.x.mul(2)).mod(4))),T=c.FnLayout({name:"bayerDither4x4",type:"float",inputs:[{name:"v",type:"vec2"}]})(([t])=>{o.reinterpretType(t);const e=t.mod(2),i=t.mod(4).mul(.5).floor();return h(e).mul(4).add(h(i))}),y=s.uniform(0).onObjectUpdate(({material:t})=>t!=null?t?.params?.fadeIn.value??0:0),R=s.uniform(0).onObjectUpdate(({material:t})=>t!=null?t?.params?.fadeOut.value??0:0),w=s.Fn(()=>{const i=T(s.screenCoordinate.xy.mod(4).floor()).add(.5).div(16);return s.If(i.greaterThanEqual(y),()=>{s.Discard()}),s.If(i.lessThan(R),()=>{s.Discard()}),s.output})();function E(t){if(o.reinterpretType(t),t[u]!=null)return t[u];const e={fadeIn:{value:0},fadeOut:{value:0},fadeTexture:{value:null}};let i=0;return t.params=e,t.defines={get FEATURE_FADE(){return i},set FEATURE_FADE(r){r!==i&&(i=r,t.outputNode=r===1?w:null)}},e}class F extends f.FadeMaterialManager{prepareMaterial(e){const i=this._fadeParams;if(i.has(e))return;let r;e instanceof n.NodeMaterial?r=E(e):r=M.wrapFadeMaterial(e,e.onBeforeCompile),i.set(e,r)}}class _ extends l.TilesFadePlugin{constructor(...e){super(...e),this._fadeMaterialManager=new F}}function p(t,e){const i=t.material;if(Array.isArray(i))throw new Error("Multiple materials are not supported yet.");const r=new e;"map"in i&&i.map!=null&&"map"in r&&(o.reinterpretType(i.map),o.reinterpretType(r.map),i.map.flipY=!1,r.map=i.map.clone()),t.material=r,i.dispose()}class b{tiles;overrideMaterial;constructor(e=n.MeshBasicNodeMaterial){this.overrideMaterial=e}init(e){this.tiles=e,e.group.traverse(i=>{i instanceof n.Mesh&&p(i,this.overrideMaterial)}),e.addEventListener("load-model",this.handleLoadModel),e.addEventListener("dispose-model",this.handleDisposeModel)}handleLoadModel=({scene:e})=>{e.traverse(i=>{i instanceof n.Mesh&&p(i,this.overrideMaterial)})};handleDisposeModel=({scene:e})=>{e.traverse(i=>{i instanceof n.Mesh&&i.material.dispose()})};dispose(){this.tiles?.removeEventListener("load-model",this.handleLoadModel),this.tiles?.removeEventListener("dispose-model",this.handleDisposeModel)}}class g{tiles;tileCompressionPlugin;updateOnChangePlugin;reorientationPlugin;xyzTilesPlugin;tilesFadePlugin;tileMaterialReplacementPlugin;constructor(){this.tiles=this._initTilesRenderer(),this.tileCompressionPlugin=this._initTileCompressionPlugin(),this.updateOnChangePlugin=this._initUpdateOnChangePlugin(),this.reorientationPlugin=this._initReorientationPlugin(),this.xyzTilesPlugin=this._initXYZTilesPlugin(),this.tilesFadePlugin=this._initTilesFadePlugin(),this.tileMaterialReplacementPlugin=this._initTileMaterialReplacementPlugin()}_initTilesRenderer(){const e=new v.TilesRenderer;return e.maxDepth=20,e.errorTarget=1,e}_initTileCompressionPlugin(){const e=new l.TileCompressionPlugin;return this.tiles.registerPlugin(e),e}_initUpdateOnChangePlugin(){const e=new l.UpdateOnChangePlugin;return this.tiles.registerPlugin(e),e}_initReorientationPlugin(){const e=new l.ReorientationPlugin;return this.tiles.registerPlugin(e),e}_initXYZTilesPlugin(){const e=new l.XYZTilesPlugin({center:!0,shape:"ellipsoid",url:"https://server.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"});return this.tiles.registerPlugin(e),e}_initTilesFadePlugin(){const e=new _;return this.tiles.registerPlugin(e),e}_initTileMaterialReplacementPlugin(){const e=new b(n.MeshBasicNodeMaterial);return this.tiles.registerPlugin(e),e}}class L extends g{viewer;loedTilesSets=new Set;constructor(e){super(),this.viewer=e,this.tiles.addEventListener("needs-render",this.render),this.tiles.addEventListener("needs-update",this.render)}render=()=>{this.viewer.render()};beforeRenderHandler=()=>{this.viewer.camera.updateMatrixWorld(),this.tiles.setCamera(this.viewer.camera),this.tiles.setResolutionFromRenderer(this.viewer.camera,this.viewer.renderer),this.tiles.update()};enable(){return this.viewer.scene.add(this.tiles.group),this.viewer.addEventListener("beforeRender",this.beforeRenderHandler),this}disable(){return this.viewer.scene.remove(this.tiles.group),this.viewer.removeEventListener("beforeRender",this.beforeRenderHandler),this}invalidate(e,i,r){const a=()=>{const m=n.MathUtils.degToRad(i),P=n.MathUtils.degToRad(e);this.reorientationPlugin.transformLatLonHeightToOrigin(m,P,r),this.render(),d()},d=()=>{this.tiles.removeEventListener("load-root-tileset",a),this.loedTilesSets.delete(a)};return this.tiles.addEventListener("load-root-tileset",a),this.loedTilesSets.add(a),this.tiles.root&&a(),d}dispose(){this.disable(),this.loedTilesSets.forEach(e=>this.tiles.removeEventListener("load-root-tileset",e)),this.loedTilesSets.clear(),this.tiles.removeEventListener("needs-render",this.render),this.tiles.removeEventListener("needs-update",this.render),this.tiles.dispose()}}exports.ArcgisTilesRenderer=L;exports.Globe=g;
@@ -0,0 +1,2 @@
1
+ export * from './ArcgisTilesRenderer';
2
+ export * from './Globe';