lythreeframe 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/lythreeFrame/exporter.ts +36 -0
  2. package/lythreeFrame/src/AssetManagement/AssetDefines.ts +8 -0
  3. package/lythreeFrame/src/AssetManagement/AssetManager.ts +286 -0
  4. package/lythreeFrame/src/AssetManagement/AssetPointer/AssetPointer.ts +41 -0
  5. package/lythreeFrame/src/AssetManagement/Task/Task.ts +24 -0
  6. package/lythreeFrame/src/Container/SmartPointer.ts +54 -0
  7. package/lythreeFrame/src/Defines.ts +11 -0
  8. package/lythreeFrame/src/Delegate.ts +37 -0
  9. package/lythreeFrame/src/Factory/CameraFactory.ts +81 -0
  10. package/lythreeFrame/src/Factory/RendererFactory.ts +7 -0
  11. package/lythreeFrame/src/Frame/Controller.ts +261 -0
  12. package/lythreeFrame/src/Frame/Viewport.ts +516 -0
  13. package/lythreeFrame/src/Frame/World.ts +59 -0
  14. package/lythreeFrame/src/Frame.ts +511 -0
  15. package/lythreeFrame/src/Geometry/PlaneGeometry.ts +53 -0
  16. package/lythreeFrame/src/Geometry/TriangleGeometry.ts +50 -0
  17. package/lythreeFrame/src/Library/ContainerLibrary.ts +21 -0
  18. package/lythreeFrame/src/Library/MaterialLibrary.ts +288 -0
  19. package/lythreeFrame/src/Library/Math.ts +154 -0
  20. package/lythreeFrame/src/Library/ResourceLibrary.ts +21 -0
  21. package/lythreeFrame/src/Object/Actor.ts +571 -0
  22. package/lythreeFrame/src/Object/Actors/Camera/CameraActor.ts +11 -0
  23. package/lythreeFrame/src/Object/Actors/Light/DirectionalLightActor.ts +18 -0
  24. package/lythreeFrame/src/Object/Actors/Shape/BoxActor.ts +20 -0
  25. package/lythreeFrame/src/Object/Actors/Shape/CurveActor.ts +11 -0
  26. package/lythreeFrame/src/Object/Actors/Shape/PlaneActor.ts +27 -0
  27. package/lythreeFrame/src/Object/Actors/Shape/TubeActor.ts +37 -0
  28. package/lythreeFrame/src/Object/BaseObject.ts +45 -0
  29. package/lythreeFrame/src/Object/Components/2D/2DComponent.ts +64 -0
  30. package/lythreeFrame/src/Object/Components/Camera/CameraComponent.ts +113 -0
  31. package/lythreeFrame/src/Object/Components/Component.ts +67 -0
  32. package/lythreeFrame/src/Object/Components/Light/DirectionalLight/DirectionalLightComponent.ts +78 -0
  33. package/lythreeFrame/src/Object/Components/Light/LightComponent.ts +54 -0
  34. package/lythreeFrame/src/Object/Components/Mesh/InstanceMesh/InstanceMeshComponent.ts +39 -0
  35. package/lythreeFrame/src/Object/Components/Mesh/InstanceMesh/MultiInstanceMeshComponent.ts +115 -0
  36. package/lythreeFrame/src/Object/Components/Mesh/Line/CurveComponent.ts +221 -0
  37. package/lythreeFrame/src/Object/Components/Mesh/MeshComponent.ts +162 -0
  38. package/lythreeFrame/src/Object/Components/Mesh/Shape/BoxComponent.ts +17 -0
  39. package/lythreeFrame/src/Object/Components/Mesh/Shape/PlaneComponent.ts +10 -0
  40. package/lythreeFrame/src/Object/Components/Mesh/Shape/SphereComponent.ts +10 -0
  41. package/lythreeFrame/src/Object/Components/Mesh/Sprite/SpriteComponent.ts +32 -0
  42. package/lythreeFrame/src/Object/Components/SceneComponent.ts +809 -0
  43. package/lythreeFrame/src/Object/Controller/Controller.ts +764 -0
  44. package/lythreeFrame/src/Object/Pawn/CameraStatus.ts +262 -0
  45. package/lythreeFrame/src/Object/Pawn/FirstPerson.ts +230 -0
  46. package/lythreeFrame/src/Object/Pawn/Oribital.ts +276 -0
  47. package/lythreeFrame/src/Object/Pawn/PawnBase.ts +189 -0
  48. package/lythreeFrame/src/Object/Pawn/TopView.ts +205 -0
  49. package/lythreeFrame/src/Object/Pawn/TransformControl.ts +215 -0
  50. package/lythreeFrame/src/Object/Pawn/staticCamera.ts +80 -0
  51. package/lythreeFrame/src/Object/PawnV2/FirstPerson.ts +12 -0
  52. package/lythreeFrame/src/Object/PawnV2/Oribital.ts +45 -0
  53. package/lythreeFrame/src/Object/PawnV2/Pawn.ts +50 -0
  54. package/lythreeFrame/src/Object/PawnV2/TransformControl.ts +201 -0
  55. package/lythreeFrame/src/PostProcess/Param/Bloom.ts +12 -0
  56. package/lythreeFrame/src/PostProcess/Param/DOF.ts +14 -0
  57. package/lythreeFrame/src/PostProcess/Param/Denoise.ts +14 -0
  58. package/lythreeFrame/src/PostProcess/Param/GTAO.ts +21 -0
  59. package/lythreeFrame/src/PostProcess/Param/LensFlare.ts +11 -0
  60. package/lythreeFrame/src/PostProcess/Param/MotionBlur.ts +8 -0
  61. package/lythreeFrame/src/PostProcess/Param/Outline.ts +20 -0
  62. package/lythreeFrame/src/PostProcess/Param/SSR.ts +11 -0
  63. package/lythreeFrame/src/PostProcess/Param/ToneMapping.ts +31 -0
  64. package/lythreeFrame/src/PostProcess/PostProcessParam.ts +26 -0
  65. package/lythreeFrame/src/PostProcess/WebGPUPostProcessFactory.ts +217 -0
  66. package/lythreeFrame/src/Shader/Postprocess/ColorShader.ts +49 -0
  67. package/lythreeFrame/src/ThreeJsApp.ts +124 -0
  68. package/package.json +21 -0
@@ -0,0 +1,261 @@
1
+ import { ThreeJsApp } from "../ThreeJsApp.ts";
2
+ import { Intersection, OrthographicCamera, PerspectiveCamera, Raycaster, Vector2 } from "three";
3
+ import { World } from "./World.ts";
4
+ import { Viewport } from "./Viewport.ts";
5
+ import { Pawn } from "../Object/PawnV2/Pawn.ts";
6
+ import { Orbital } from "../Object/PawnV2/Oribital.ts";
7
+ import { SceneComponent } from "../Object/Components/SceneComponent.ts";
8
+ import { Delegate } from "../Delegate.ts";
9
+
10
+
11
+ export class Controller
12
+ {
13
+ private prepareClickComponent: SceneComponent|null = null;
14
+ get camera(): PerspectiveCamera | OrthographicCamera
15
+ {
16
+ return this.app.camera;
17
+ }
18
+ get world(): World
19
+ {
20
+ return this.app.world
21
+ }
22
+ get viewPort(): Viewport
23
+ {
24
+ return this.app.viewport
25
+ }
26
+
27
+ get pawn(): Pawn
28
+ {
29
+ if (!this._pawn)
30
+ {
31
+ throw Error("pawn is null")
32
+ }
33
+ return this._pawn
34
+ }
35
+
36
+ private app : ThreeJsApp
37
+ private _pawn : Pawn | null = null
38
+ private raycaster: Raycaster;
39
+
40
+ private onPointerMove: ((event: MouseEvent) => void) = (event: MouseEvent) => { this.onPointerMoveEvent(event) }
41
+ private onPointerEnter: ((event: MouseEvent) => void) = (event: MouseEvent) => { this.onPointerEnterEvent(event) }
42
+ private onPointerLeave: ((event: MouseEvent) => void) = (event: MouseEvent) => { this.onPointerLeaveEvent(event) }
43
+ private onPointerUp: ((event: MouseEvent) => void) = (event: MouseEvent) => { this.onPointerUpEvent(event) }
44
+ private onPointerDown: ((event: MouseEvent) => void) = (event: MouseEvent) => { this.onPointerDownEvent(event) }
45
+
46
+ private pointerPosition: Vector2 = new Vector2()
47
+
48
+ private readonly doubleClickDelay: number = 250; // 双击判定时间间隔(毫秒)
49
+ private leftClickTimer: number | null = null;
50
+ private pointerLeftDownPosition: Vector2 = new Vector2();
51
+
52
+ private hoveringComponent: SceneComponent | null = null;
53
+ private _pointButtonIsDown:Set<number> = new Set()
54
+ get onClickNothingDelegate(): Delegate<[void]>
55
+ {
56
+ return this._onClickNothingDelegate
57
+ }
58
+ private _onClickNothingDelegate: Delegate<[void]> = new Delegate()
59
+ constructor(app: ThreeJsApp)
60
+ {
61
+ this.app = app
62
+ this._pawn = new Orbital(this)
63
+ this.pawn.possess()
64
+ this.raycaster = new Raycaster()
65
+ if (!this.viewPort.canvas)
66
+ {
67
+ throw Error("canvas is null")
68
+ }
69
+ this.viewPort.canvas.addEventListener("pointermove", this.onPointerMove)
70
+ this.viewPort.canvas.addEventListener("pointerenter", this.onPointerEnter)
71
+ this.viewPort.canvas.addEventListener("pointerleave", this.onPointerLeave)
72
+ this.viewPort.canvas.addEventListener("pointerup", this.onPointerUp)
73
+ this.viewPort.canvas.addEventListener("pointerdown", this.onPointerDown)
74
+ }
75
+
76
+ init()
77
+ {
78
+
79
+ }
80
+
81
+ tick(deltaTime: number)
82
+ {
83
+ this.pawn.tick(deltaTime);
84
+ }
85
+
86
+ destroy()
87
+ {
88
+ if (this.leftClickTimer)
89
+ {
90
+ clearTimeout(this.leftClickTimer);
91
+ this.leftClickTimer = null;
92
+ }
93
+ if (this.viewPort.canvas)
94
+ {
95
+ this.viewPort.canvas.removeEventListener("pointermove", this.onPointerMove);
96
+ this.viewPort.canvas.removeEventListener("pointerenter", this.onPointerEnter);
97
+ this.viewPort.canvas.removeEventListener("pointerleave", this.onPointerLeave);
98
+ this.viewPort.canvas.removeEventListener("pointerup", this.onPointerUp)
99
+ this.viewPort.canvas.removeEventListener("pointerdown", this.onPointerDown)
100
+ }
101
+
102
+ this.pawn.unpossess()
103
+ this.pawn.destroy()
104
+ this._pawn = null
105
+ }
106
+
107
+ onPointerMoveEvent(event: MouseEvent)
108
+ {
109
+ if (!this.viewPort.canvas)
110
+ {
111
+ throw Error("canvas is null")
112
+ }
113
+ const canvasRect = this.viewPort.canvas.getBoundingClientRect();
114
+ const offsetX = canvasRect.left;
115
+ const offsetY = canvasRect.top;
116
+ const pointer = new Vector2(((event.clientX - offsetX) / this.viewPort.canvas.clientWidth) * 2 - 1, 1 - ((event.clientY - offsetY) / this.viewPort.canvas.clientHeight) * 2)
117
+
118
+ this.pointerPosition = pointer
119
+
120
+ if (this._pointButtonIsDown.size > 0)
121
+ {
122
+ return
123
+ }
124
+
125
+ const hits = this.getHitResultUnderCursor()
126
+
127
+ if (hits)
128
+ {
129
+ let component = hits.object.userData["LYObject"]
130
+ if (component != this.hoveringComponent)
131
+ {
132
+ this.hoveringComponent?.onHorveringEnd();
133
+ this.hoveringComponent = null;
134
+ if (component instanceof SceneComponent && component.isHoverEnabled)
135
+ {
136
+ component.onHorveringBegin();
137
+ this.hoveringComponent = component;
138
+ }
139
+ }
140
+ }
141
+ else
142
+ {
143
+ this.hoveringComponent?.onHorveringEnd();
144
+ this.hoveringComponent = null;
145
+ }
146
+ }
147
+
148
+ onPointerUpEvent(event: MouseEvent)
149
+ {
150
+ this._pointButtonIsDown.delete(event.button)
151
+
152
+ if(event.button === 0)
153
+ {
154
+ const pointerOffset = new Vector2().subVectors(this.pointerLeftDownPosition, this.pointerPosition).length()
155
+ if (pointerOffset > 0.005)
156
+ {
157
+ if (this.leftClickTimer)
158
+ {
159
+ window.clearTimeout(this.leftClickTimer);
160
+ this.leftClickTimer = null;
161
+ }
162
+
163
+ return;
164
+ }
165
+ if(!this.leftClickTimer)
166
+ {
167
+ const hit = this.getHitResultUnderCursor();
168
+ let component = hit?hit.object.userData["LYObject"]:null;
169
+ if(component && component instanceof SceneComponent && component.isClickEnabled)
170
+ {
171
+ this.prepareClickComponent = component
172
+ this.leftClickTimer = window.setTimeout(()=>{
173
+ this.leftClickTimer = null;
174
+
175
+ if(this.prepareClickComponent)
176
+ {
177
+ this.prepareClickComponent.onClicked();
178
+ this.prepareClickComponent = null;
179
+ }
180
+ }, this.doubleClickDelay)
181
+ }
182
+ else
183
+ {
184
+ this._onClickNothingDelegate.broadcast()
185
+ }
186
+ }
187
+ else
188
+ {
189
+ console.log("up 2, ", this.prepareClickComponent)
190
+
191
+ window. clearTimeout(this.leftClickTimer);
192
+ this.leftClickTimer = null;
193
+ if (this.prepareClickComponent)
194
+ {
195
+ this.prepareClickComponent.onDoubleClicked();
196
+ }
197
+ else
198
+ {
199
+ this._onClickNothingDelegate.broadcast()
200
+ }
201
+ this.prepareClickComponent = null;
202
+ }
203
+
204
+ }
205
+
206
+ }
207
+
208
+ onPointerDownEvent(event: MouseEvent)
209
+ {
210
+ this._pointButtonIsDown.add(event.button)
211
+ if(event.button === 0)
212
+ {
213
+ this.pointerLeftDownPosition = this.pointerPosition.clone();
214
+
215
+ }
216
+
217
+
218
+ }
219
+
220
+ onPointerEnterEvent(event: MouseEvent)
221
+ {
222
+ if (!this.viewPort.canvas)
223
+ {
224
+ throw Error("canvas is null")
225
+ }
226
+ this.viewPort.canvas.addEventListener("pointermove", this.onPointerMove)
227
+ this.viewPort.canvas.addEventListener("pointerup", this.onPointerUp)
228
+ this.viewPort.canvas.addEventListener("pointerdown", this.onPointerDown)
229
+ }
230
+
231
+ onPointerLeaveEvent(event: MouseEvent)
232
+ {
233
+ if (!this.viewPort.canvas)
234
+ {
235
+ throw Error("canvas is null")
236
+ }
237
+ this.viewPort.canvas.removeEventListener("pointermove", this.onPointerMove)
238
+ this.viewPort.canvas.removeEventListener("pointerup", this.onPointerUp)
239
+ this.viewPort.canvas.removeEventListener("pointerdown", this.onPointerDown)
240
+ }
241
+
242
+ getHitResultUnderCursor(): Intersection | null
243
+ {
244
+ return this.getHitResultFromScreenPoint(this.pointerPosition.x, this.pointerPosition.y)
245
+ }
246
+
247
+ getHitResultFromScreenPoint(x: number, y: number): Intersection | null
248
+ {
249
+ this.raycaster.setFromCamera(new Vector2(x, y), this.camera);
250
+ let out = this.raycaster.intersectObjects(this.world.scene.children, true)
251
+ for (let i = 0; i < out.length; i++)
252
+ {
253
+ if (out[i].object.userData["rayIgnored"])
254
+ {
255
+ continue
256
+ }
257
+ return out[i]
258
+ }
259
+ return null
260
+ }
261
+ }