@zephyr3d/scene 0.8.2 → 0.9.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 (241) hide show
  1. package/dist/animation/animationset.js +473 -60
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/cloth/gpu_cloth_system.js +2516 -0
  4. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -0
  5. package/dist/animation/fixed_geometry_cache_track.js +138 -0
  6. package/dist/animation/fixed_geometry_cache_track.js.map +1 -0
  7. package/dist/animation/geometry_cache_utils.js +120 -0
  8. package/dist/animation/geometry_cache_utils.js.map +1 -0
  9. package/dist/animation/ik_modifier.js +9 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +469 -0
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -0
  13. package/dist/animation/joint_dynamics/constraints.js +329 -0
  14. package/dist/animation/joint_dynamics/constraints.js.map +1 -0
  15. package/dist/animation/joint_dynamics/controller.js +699 -0
  16. package/dist/animation/joint_dynamics/controller.js.map +1 -0
  17. package/dist/animation/joint_dynamics/joint_dynamics_system.js +393 -0
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -0
  19. package/dist/animation/joint_dynamics/solver.js +794 -0
  20. package/dist/animation/joint_dynamics/solver.js.map +1 -0
  21. package/dist/animation/joint_dynamics/types.js +19 -0
  22. package/dist/animation/joint_dynamics/types.js.map +1 -0
  23. package/dist/animation/joint_dynamics/vrm_spring_bone.js +46 -0
  24. package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +1 -0
  25. package/dist/animation/joint_dynamics_modifier.js +51 -0
  26. package/dist/animation/joint_dynamics_modifier.js.map +1 -0
  27. package/dist/animation/pca_geometry_cache_track.js +222 -0
  28. package/dist/animation/pca_geometry_cache_track.js.map +1 -0
  29. package/dist/animation/skeleton.js +2011 -139
  30. package/dist/animation/skeleton.js.map +1 -1
  31. package/dist/animation/skeleton_modifier.js +3 -5
  32. package/dist/animation/skeleton_modifier.js.map +1 -1
  33. package/dist/animation/spring/multi_chain_spring_system.js +2 -0
  34. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  35. package/dist/animation/spring/spring_chain.js +3 -2
  36. package/dist/animation/spring/spring_chain.js.map +1 -1
  37. package/dist/animation/spring/spring_collider.js +35 -5
  38. package/dist/animation/spring/spring_collider.js.map +1 -1
  39. package/dist/animation/spring/spring_particle.js +1 -0
  40. package/dist/animation/spring/spring_particle.js.map +1 -1
  41. package/dist/animation/spring/spring_system.js +325 -28
  42. package/dist/animation/spring/spring_system.js.map +1 -1
  43. package/dist/animation/spring2/collision.js +469 -0
  44. package/dist/animation/spring2/collision.js.map +1 -0
  45. package/dist/animation/spring2/constraints.js +329 -0
  46. package/dist/animation/spring2/constraints.js.map +1 -0
  47. package/dist/animation/spring2/controller.js +434 -0
  48. package/dist/animation/spring2/controller.js.map +1 -0
  49. package/dist/animation/spring2/math.js +16 -0
  50. package/dist/animation/spring2/math.js.map +1 -0
  51. package/dist/animation/spring2/solver.js +624 -0
  52. package/dist/animation/spring2/solver.js.map +1 -0
  53. package/dist/animation/spring2/spring_system.js +118 -0
  54. package/dist/animation/spring2/spring_system.js.map +1 -0
  55. package/dist/animation/spring2/types.js +19 -0
  56. package/dist/animation/spring2/types.js.map +1 -0
  57. package/dist/animation/spring_modifier.js +17 -1
  58. package/dist/animation/spring_modifier.js.map +1 -1
  59. package/dist/app/engine.js +42 -15
  60. package/dist/app/engine.js.map +1 -1
  61. package/dist/app/runtimescript.js +132 -1
  62. package/dist/app/runtimescript.js.map +1 -1
  63. package/dist/app/screen.js +3 -3
  64. package/dist/app/screen.js.map +1 -1
  65. package/dist/app/scriptingsystem.js +69 -37
  66. package/dist/app/scriptingsystem.js.map +1 -1
  67. package/dist/app/scriptregistry.js +14 -3
  68. package/dist/app/scriptregistry.js.map +1 -1
  69. package/dist/asset/assetmanager.js +2 -1
  70. package/dist/asset/assetmanager.js.map +1 -1
  71. package/dist/asset/loaders/zabc/zabc_loader.js +570 -0
  72. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -0
  73. package/dist/asset/model.js +192 -0
  74. package/dist/asset/model.js.map +1 -1
  75. package/dist/camera/base.js +26 -7
  76. package/dist/camera/base.js.map +1 -1
  77. package/dist/camera/camera.js +146 -24
  78. package/dist/camera/camera.js.map +1 -1
  79. package/dist/camera/fps.js +2 -2
  80. package/dist/camera/fps.js.map +1 -1
  81. package/dist/camera/orbit.js +2 -2
  82. package/dist/camera/orbit.js.map +1 -1
  83. package/dist/index.d.ts +11728 -8535
  84. package/dist/index.js +29 -8
  85. package/dist/index.js.map +1 -1
  86. package/dist/material/lambert.js +1 -1
  87. package/dist/material/lambert.js.map +1 -1
  88. package/dist/material/material.js +9 -3
  89. package/dist/material/material.js.map +1 -1
  90. package/dist/material/meshmaterial.js +54 -7
  91. package/dist/material/meshmaterial.js.map +1 -1
  92. package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
  93. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  94. package/dist/material/mixins/lightmodel/lambert.js +7 -2
  95. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  96. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +108 -16
  97. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  98. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +209 -14
  99. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  100. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +24 -12
  101. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  102. package/dist/material/mixins/lit.js +11 -8
  103. package/dist/material/mixins/lit.js.map +1 -1
  104. package/dist/material/mixins/pbr/common.js +72 -5
  105. package/dist/material/mixins/pbr/common.js.map +1 -1
  106. package/dist/material/pbrblueprint.js +148 -1
  107. package/dist/material/pbrblueprint.js.map +1 -1
  108. package/dist/material/pbrmr.js +115 -2
  109. package/dist/material/pbrmr.js.map +1 -1
  110. package/dist/material/shader/helper.js +10 -4
  111. package/dist/material/shader/helper.js.map +1 -1
  112. package/dist/material/water.js +2 -2
  113. package/dist/material/water.js.map +1 -1
  114. package/dist/posteffect/coloradjust.js +145 -0
  115. package/dist/posteffect/coloradjust.js.map +1 -0
  116. package/dist/posteffect/taa.js +68 -32
  117. package/dist/posteffect/taa.js.map +1 -1
  118. package/dist/render/cluster_light.js +17 -12
  119. package/dist/render/cluster_light.js.map +1 -1
  120. package/dist/render/deferredlightpass.js +510 -0
  121. package/dist/render/deferredlightpass.js.map +1 -0
  122. package/dist/render/deferredshadowlightpass.js +428 -0
  123. package/dist/render/deferredshadowlightpass.js.map +1 -0
  124. package/dist/render/drawable.js.map +1 -1
  125. package/dist/render/drawable_mixin.js +21 -12
  126. package/dist/render/drawable_mixin.js.map +1 -1
  127. package/dist/render/envlight.js +20 -22
  128. package/dist/render/envlight.js.map +1 -1
  129. package/dist/render/gbufferpass.js +50 -0
  130. package/dist/render/gbufferpass.js.map +1 -0
  131. package/dist/render/lightpass.js +1 -2
  132. package/dist/render/lightpass.js.map +1 -1
  133. package/dist/render/primitive.js +1 -1
  134. package/dist/render/primitive.js.map +1 -1
  135. package/dist/render/render_queue.js +3 -2
  136. package/dist/render/render_queue.js.map +1 -1
  137. package/dist/render/renderer.js +5 -358
  138. package/dist/render/renderer.js.map +1 -1
  139. package/dist/render/rendergraph/executor.js +15 -12
  140. package/dist/render/rendergraph/executor.js.map +1 -1
  141. package/dist/render/rendergraph/forward_plus_builder.js +144 -88
  142. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  143. package/dist/render/rendergraph/history_resource_manager.js +178 -0
  144. package/dist/render/rendergraph/history_resource_manager.js.map +1 -0
  145. package/dist/render/rendergraph/rendergraph.js +12 -1
  146. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  147. package/dist/render/rendergraph/types.js +2 -2
  148. package/dist/render/rendergraph/types.js.map +1 -1
  149. package/dist/render/sky.js +26 -9
  150. package/dist/render/sky.js.map +1 -1
  151. package/dist/scene/basesprite.js +4 -3
  152. package/dist/scene/basesprite.js.map +1 -1
  153. package/dist/scene/batchgroup.js +4 -4
  154. package/dist/scene/environment.js +7 -4
  155. package/dist/scene/environment.js.map +1 -1
  156. package/dist/scene/light.js +184 -18
  157. package/dist/scene/light.js.map +1 -1
  158. package/dist/scene/mesh.js +30 -0
  159. package/dist/scene/mesh.js.map +1 -1
  160. package/dist/scene/particlesys.js +3 -2
  161. package/dist/scene/particlesys.js.map +1 -1
  162. package/dist/scene/raycast_visitor.js +29 -3
  163. package/dist/scene/raycast_visitor.js.map +1 -1
  164. package/dist/scene/scene.js +86 -19
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/scene_node.js +87 -31
  167. package/dist/scene/scene_node.js.map +1 -1
  168. package/dist/scene/script_attachment.js +59 -0
  169. package/dist/scene/script_attachment.js.map +1 -0
  170. package/dist/scene/terrain-cm/grass.js +3 -2
  171. package/dist/scene/terrain-cm/grass.js.map +1 -1
  172. package/dist/scene/terrain-cm/terrain-cm.js +4 -3
  173. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  174. package/dist/scene/water.js +3 -2
  175. package/dist/scene/water.js.map +1 -1
  176. package/dist/shaders/shadow.js +2 -2
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shadow/shadowmapper.js +74 -4
  179. package/dist/shadow/shadowmapper.js.map +1 -1
  180. package/dist/shapes/box.js +163 -0
  181. package/dist/shapes/box.js.map +1 -1
  182. package/dist/shapes/capsule.js +216 -0
  183. package/dist/shapes/capsule.js.map +1 -0
  184. package/dist/shapes/cylinder.js +91 -0
  185. package/dist/shapes/cylinder.js.map +1 -1
  186. package/dist/shapes/plane.js +32 -0
  187. package/dist/shapes/plane.js.map +1 -1
  188. package/dist/shapes/tetrahedron.js +211 -0
  189. package/dist/shapes/tetrahedron.js.map +1 -1
  190. package/dist/shapes/torus.js +173 -0
  191. package/dist/shapes/torus.js.map +1 -1
  192. package/dist/utility/blueprint/common/math.js +111 -1
  193. package/dist/utility/blueprint/common/math.js.map +1 -1
  194. package/dist/utility/blueprint/material/inputs.js +235 -1
  195. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  196. package/dist/utility/blueprint/material/ir.js +154 -10
  197. package/dist/utility/blueprint/material/ir.js.map +1 -1
  198. package/dist/utility/blueprint/material/texture.js +273 -19
  199. package/dist/utility/blueprint/material/texture.js.map +1 -1
  200. package/dist/utility/serialization/json.js +12 -2
  201. package/dist/utility/serialization/json.js.map +1 -1
  202. package/dist/utility/serialization/manager.js +30 -11
  203. package/dist/utility/serialization/manager.js.map +1 -1
  204. package/dist/utility/serialization/scene/animation.js +250 -7
  205. package/dist/utility/serialization/scene/animation.js.map +1 -1
  206. package/dist/utility/serialization/scene/batch.js +4 -2
  207. package/dist/utility/serialization/scene/batch.js.map +1 -1
  208. package/dist/utility/serialization/scene/camera.js +154 -2
  209. package/dist/utility/serialization/scene/camera.js.map +1 -1
  210. package/dist/utility/serialization/scene/cloth_script.js +834 -0
  211. package/dist/utility/serialization/scene/cloth_script.js.map +1 -0
  212. package/dist/utility/serialization/scene/common.js +7 -0
  213. package/dist/utility/serialization/scene/common.js.map +1 -1
  214. package/dist/utility/serialization/scene/light.js +120 -4
  215. package/dist/utility/serialization/scene/light.js.map +1 -1
  216. package/dist/utility/serialization/scene/material.js +453 -1
  217. package/dist/utility/serialization/scene/material.js.map +1 -1
  218. package/dist/utility/serialization/scene/mesh.js +4 -2
  219. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  220. package/dist/utility/serialization/scene/node.js +298 -10
  221. package/dist/utility/serialization/scene/node.js.map +1 -1
  222. package/dist/utility/serialization/scene/particle.js +4 -2
  223. package/dist/utility/serialization/scene/particle.js.map +1 -1
  224. package/dist/utility/serialization/scene/primitive.js +100 -3
  225. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  226. package/dist/utility/serialization/scene/scene.js +130 -3
  227. package/dist/utility/serialization/scene/scene.js.map +1 -1
  228. package/dist/utility/serialization/scene/script.js +66 -0
  229. package/dist/utility/serialization/scene/script.js.map +1 -0
  230. package/dist/utility/serialization/scene/spring_script.js +596 -0
  231. package/dist/utility/serialization/scene/spring_script.js.map +1 -0
  232. package/dist/utility/serialization/scene/sprite.js +5 -3
  233. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  234. package/dist/utility/serialization/scene/terrain.js +4 -2
  235. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  236. package/dist/utility/serialization/scene/water.js +4 -2
  237. package/dist/utility/serialization/scene/water.js.map +1 -1
  238. package/dist/utility/serialization/types.js.map +1 -1
  239. package/dist/values.js +5 -1
  240. package/dist/values.js.map +1 -1
  241. package/package.json +3 -3
@@ -35,6 +35,7 @@
35
35
  * @public
36
36
  */ class BaseCameraController {
37
37
  /** @internal */ _camera;
38
+ /** @internal */ _enabled;
38
39
  /**
39
40
  * Create a base camera controller.
40
41
  *
@@ -42,6 +43,7 @@
42
43
  * to attach a camera (performed by the owning system), which triggers `reset()`.
43
44
  */ constructor(){
44
45
  this._camera = null;
46
+ this._enabled = true;
45
47
  }
46
48
  /**
47
49
  * Get the attached camera.
@@ -64,6 +66,14 @@
64
66
  }
65
67
  }
66
68
  /**
69
+ * Check if the controller is enabled.
70
+ */ get enabled() {
71
+ return this._enabled;
72
+ }
73
+ set enabled(value) {
74
+ this._enabled = value;
75
+ }
76
+ /**
67
77
  * Convenience method that delegates to `camera.lookAt`.
68
78
  *
69
79
  * @param from - Camera position.
@@ -84,7 +94,7 @@
84
94
  * @param evt - The pointer event.
85
95
  * @returns `true` if handled and should stop further processing; otherwise `false`.
86
96
  */ onMouseDown(evt) {
87
- return this._onMouseDown(evt);
97
+ return this._enabled ? this._onMouseDown(evt) : false;
88
98
  }
89
99
  /**
90
100
  * Handle pointer up events.
@@ -92,7 +102,7 @@
92
102
  * @param evt - The pointer event.
93
103
  * @returns `true` if handled; otherwise `false`.
94
104
  */ onMouseUp(evt) {
95
- return this._onMouseUp(evt);
105
+ return this._enabled ? this._onMouseUp(evt) : false;
96
106
  }
97
107
  /**
98
108
  * Handle mouse wheel (scroll) events.
@@ -102,7 +112,7 @@
102
112
  * @param evt - The wheel event.
103
113
  * @returns `true` if handled; otherwise `false`.
104
114
  */ onMouseWheel(evt) {
105
- return this._onMouseWheel(evt);
115
+ return this._enabled ? this._onMouseWheel(evt) : false;
106
116
  }
107
117
  /**
108
118
  * Handle pointer move events.
@@ -112,7 +122,7 @@
112
122
  * @param evt - The pointer event.
113
123
  * @returns `true` if handled; otherwise `false`.
114
124
  */ onMouseMove(evt) {
115
- return this._onMouseMove(evt);
125
+ return this._enabled ? this._onMouseMove(evt) : false;
116
126
  }
117
127
  /**
118
128
  * Handle key down events.
@@ -122,7 +132,7 @@
122
132
  * @param evt - The keyboard event.
123
133
  * @returns `true` if handled; otherwise `false`.
124
134
  */ onKeyDown(evt) {
125
- return this._onKeyDown(evt);
135
+ return this._enabled ? this._onKeyDown(evt) : false;
126
136
  }
127
137
  /**
128
138
  * Handle key up events.
@@ -130,7 +140,7 @@
130
140
  * @param evt - The keyboard event.
131
141
  * @returns `true` if handled; otherwise `false`.
132
142
  */ onKeyUp(evt) {
133
- return this._onKeyUp(evt);
143
+ return this._enabled ? this._onKeyUp(evt) : false;
134
144
  }
135
145
  /**
136
146
  * Per-frame update.
@@ -141,7 +151,11 @@
141
151
  * - Clamp angles/distances/FOV, etc.
142
152
  *
143
153
  * Called once per frame by the owning system.
144
- */ update() {}
154
+ */ update() {
155
+ if (this._enabled) {
156
+ this._onUpdate();
157
+ }
158
+ }
145
159
  /**
146
160
  * Mouse down event handler
147
161
  * @param evt - Mouse event
@@ -189,6 +203,11 @@
189
203
  */ _onKeyUp(_evt) {
190
204
  return false;
191
205
  }
206
+ /**
207
+ * Per-frame update handler for subclasses to override.
208
+ */ _onUpdate() {
209
+ // Subclasses can override this for per-frame updates.
210
+ }
192
211
  }
193
212
 
194
213
  export { BaseCameraController };
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sources":["../../src/camera/base.ts"],"sourcesContent":["import type { Nullable, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from './camera';\r\n\r\n/**\r\n * Base structure for all controller events.\r\n *\r\n * Represents a typed event emitted or handled by a camera controller.\r\n *\r\n * @public\r\n */\r\nexport interface IBaseEvent<T extends string> {\r\n /** Event type identifier. */\r\n type: T;\r\n /**\r\n * Optional method to cancel the default event behavior.\r\n * May be provided by the event source.\r\n */\r\n preventDefault?: () => void;\r\n}\r\n\r\n/**\r\n * Standard modifier key set for mouse/keyboard events.\r\n *\r\n * Encapsulates common modifier keys such as Ctrl, Alt, Shift, and Meta.\r\n *\r\n * @public\r\n */\r\nexport interface IModKey {\r\n /** Whether the Control key is pressed. */\r\n readonly ctrlKey: boolean;\r\n /** Whether the Meta (Command on macOS) key is pressed. */\r\n readonly metaKey: boolean;\r\n /** Whether the Shift key is pressed. */\r\n readonly shiftKey: boolean;\r\n /** Whether the Alt/Option key is pressed. */\r\n readonly altKey: boolean;\r\n}\r\n\r\n/**\r\n * Base interface for all controller mouse and pointer events.\r\n *\r\n * Extends the base event with positional and button information, as well as modifier keys.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerMouseEvent<T extends string> extends IBaseEvent<T>, IModKey {\r\n /** Pointer offset along the X-axis, typically relative to the event target. */\r\n readonly offsetX: number;\r\n /** Pointer offset along the Y-axis, typically relative to the event target. */\r\n readonly offsetY: number;\r\n /** Mouse button index: `0` for left, `1` for middle, `2` for right, etc. */\r\n readonly button: number;\r\n}\r\n\r\n/**\r\n * Pointer down event for camera controllers.\r\n *\r\n * Triggered when a mouse, pen, or touch pointer is pressed down.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerPointerDownEvent extends IControllerMouseEvent<'pointerdown'> {}\r\n\r\n/**\r\n * Pointer up event for camera controllers.\r\n *\r\n * Triggered when a mouse, pen, or touch pointer is released.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerPointerUpEvent extends IControllerMouseEvent<'pointerup'> {}\r\n\r\n/**\r\n * Pointer move event for camera controllers.\r\n *\r\n * Triggered when the pointer (mouse, pen, or touch) moves across the viewport.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerPointerMoveEvent extends IControllerMouseEvent<'pointermove'> {}\r\n\r\n/**\r\n * Pointer cancel event for camera controllers.\r\n *\r\n * Triggered when the pointer operation is canceled (e.g., touch canceled, system interruption).\r\n *\r\n * @public\r\n */\r\nexport interface IControllerPointerCancelEvent extends IControllerMouseEvent<'pointercancel'> {}\r\n\r\n/**\r\n * Wheel (scroll) event for camera controllers.\r\n *\r\n * Extends a mouse event with wheel delta values for scroll-based input (e.g., zoom).\r\n *\r\n * @public\r\n */\r\nexport interface IControllerWheelEvent extends IControllerMouseEvent<'wheel'> {\r\n /** Horizontal wheel scroll delta. */\r\n readonly deltaX: number;\r\n /** Vertical wheel scroll delta. */\r\n readonly deltaY: number;\r\n /** Delta mode */\r\n readonly deltaMode: number;\r\n}\r\n\r\n/**\r\n * Base interface for all controller keyboard events.\r\n *\r\n * Provides key identification along with standard modifier flags.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerKeyboardEvent<T extends string> extends IBaseEvent<T>, IModKey {\r\n /** key code */\r\n readonly code: string;\r\n /** Character value */\r\n readonly key: string;\r\n}\r\n\r\n/**\r\n * Key down event for camera controllers.\r\n *\r\n * Triggered when a keyboard key is pressed down.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerKeydownEvent extends IControllerKeyboardEvent<'keydown'> {}\r\n\r\n/**\r\n * Key up event for camera controllers.\r\n *\r\n * Triggered when a keyboard key is released.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerKeyupEvent extends IControllerKeyboardEvent<'keyup'> {}\r\n\r\n/**\r\n * Key press event for camera controllers.\r\n *\r\n * Triggered when a key is pressed and generates a character value (legacy usage).\r\n *\r\n * @public\r\n */\r\nexport interface IControllerKeypressEvent extends IControllerKeyboardEvent<'keypress'> {}\r\n\r\n/**\r\n * Base class for camera controllers.\r\n *\r\n * Provides a common lifecycle and event-handling surface for concrete camera controllers\r\n * (e.g., orbit, fly, FPS). Subclasses implement protected handler methods to react to\r\n * mouse/keyboard input, and update camera transforms in `update()`.\r\n *\r\n * Responsibilities:\r\n * - Holds a reference to a `Camera` and resets internal state when the camera changes.\r\n * - Offers a `lookAt(from, to, up)` helper that delegates to the camera.\r\n * - Exposes public event entry points (`onMouseDown`, `onMouseUp`, `onMouseMove`,\r\n * `onMouseWheel`, `onKeyDown`, `onKeyUp`) that forward to protected handlers which\r\n * subclasses can override.\r\n * - Defines `reset()` and `update()` lifecycle methods for state initialization and per-frame updates.\r\n *\r\n * Event handling contract:\r\n * - Each public `onXxx` method returns a boolean that indicates whether the event\r\n * was handled by the controller. Returning `true` allows upstream dispatchers to\r\n * stop propagation if desired.\r\n *\r\n * Subclassing guidelines:\r\n * - Override the protected `_onXxx` handlers rather than the public `onXxx` methods.\r\n * - Override `reset()` to reinitialize controller state when a new camera is attached.\r\n * - Override `update()` to advance state each frame (e.g., apply accumulated deltas with damping).\r\n *\r\n * Lifecycle:\r\n * 1. A camera is attached via internal `_setCamera(camera)`, which calls `reset()`.\r\n * 2. Input events are passed in through the public `onXxx` methods.\r\n * 3. Per-frame, `update()` is called to apply state changes to the camera.\r\n *\r\n * Thread-safety/assumptions:\r\n * - Designed for use on the main thread in a browser environment.\r\n * - Pointer events are used for mouse input; keyboard events for key input.\r\n *\r\n * @public\r\n */\r\nexport class BaseCameraController {\r\n /** @internal */\r\n private _camera: Nullable<Camera>;\r\n /**\r\n * Create a base camera controller.\r\n *\r\n * The controller starts without an attached camera. Call the internal `_setCamera`\r\n * to attach a camera (performed by the owning system), which triggers `reset()`.\r\n */\r\n constructor() {\r\n this._camera = null;\r\n }\r\n /**\r\n * Get the attached camera.\r\n *\r\n * @returns The current camera or `null` if none is attached.\r\n */\r\n _getCamera() {\r\n return this._camera;\r\n }\r\n /**\r\n * Attach a camera to the controller.\r\n *\r\n * If the camera changes, the controller will call `reset()` so subclasses can\r\n * reinitialize state that depends on the camera.\r\n *\r\n * @param camera - The camera to attach.\r\n */\r\n _setCamera(camera: Nullable<Camera>) {\r\n if (this._camera !== camera) {\r\n this._camera = camera;\r\n this.reset();\r\n }\r\n }\r\n /**\r\n * Convenience method that delegates to `camera.lookAt`.\r\n *\r\n * @param from - Camera position.\r\n * @param to - Look-at target.\r\n * @param up - Up direction.\r\n */\r\n lookAt(from: Vector3, to: Vector3, up: Vector3) {\r\n this._camera?.lookAt(from, to, up);\r\n }\r\n /**\r\n * Reset the controller's internal state.\r\n *\r\n * Called automatically when a camera is attached via `_setCamera`. Subclasses\r\n * should override this to reset accumulators, velocities, targets, etc.\r\n */\r\n reset() {}\r\n /**\r\n * Handle pointer down (mouse/touch/pen) events.\r\n *\r\n * @param evt - The pointer event.\r\n * @returns `true` if handled and should stop further processing; otherwise `false`.\r\n */\r\n onMouseDown(evt: IControllerPointerDownEvent) {\r\n return this._onMouseDown(evt);\r\n }\r\n /**\r\n * Handle pointer up events.\r\n *\r\n * @param evt - The pointer event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onMouseUp(evt: IControllerPointerUpEvent) {\r\n return this._onMouseUp(evt);\r\n }\r\n /**\r\n * Handle mouse wheel (scroll) events.\r\n *\r\n * Typical usage: zoom/dolly control, FOV adjustments.\r\n *\r\n * @param evt - The wheel event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onMouseWheel(evt: IControllerWheelEvent) {\r\n return this._onMouseWheel(evt);\r\n }\r\n /**\r\n * Handle pointer move events.\r\n *\r\n * Typical usage: orbit, pan, or look controls based on button/modifier state.\r\n *\r\n * @param evt - The pointer event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onMouseMove(evt: IControllerPointerMoveEvent) {\r\n return this._onMouseMove(evt);\r\n }\r\n /**\r\n * Handle key down events.\r\n *\r\n * Typical usage: WASD navigation, modifiers for speed, toggling modes.\r\n *\r\n * @param evt - The keyboard event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onKeyDown(evt: IControllerKeydownEvent) {\r\n return this._onKeyDown(evt);\r\n }\r\n /**\r\n * Handle key up events.\r\n *\r\n * @param evt - The keyboard event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onKeyUp(evt: IControllerKeyupEvent) {\r\n return this._onKeyUp(evt);\r\n }\r\n /**\r\n * Per-frame update.\r\n *\r\n * Subclasses should override this to:\r\n * - Integrate velocities/accelerations and apply damping.\r\n * - Smoothly interpolate camera transforms.\r\n * - Clamp angles/distances/FOV, etc.\r\n *\r\n * Called once per frame by the owning system.\r\n */\r\n update() {}\r\n /**\r\n * Mouse down event handler\r\n * @param evt - Mouse event\r\n * @returns Boolean value indices whether this event was handled\r\n */\r\n protected _onMouseDown(_evt: IControllerPointerDownEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Pointer up handler for subclasses to override.\r\n *\r\n * @param _evt - Pointer event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onMouseUp(_evt: IControllerPointerUpEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Mouse wheel handler for subclasses to override.\r\n *\r\n * @param _evt - Wheel event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onMouseWheel(_evt: IControllerWheelEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Pointer move handler for subclasses to override.\r\n *\r\n * @param _evt - Pointer event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onMouseMove(_evt: IControllerPointerMoveEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Key down handler for subclasses to override.\r\n *\r\n * @param _evt - Keyboard event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onKeyDown(_evt: IControllerKeydownEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Key up handler for subclasses to override.\r\n *\r\n * @param _evt - Keyboard event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onKeyUp(_evt: IControllerKeyupEvent): boolean {\r\n return false;\r\n }\r\n}\r\n"],"names":["BaseCameraController","_camera","_getCamera","_setCamera","camera","reset","lookAt","from","to","up","onMouseDown","evt","_onMouseDown","onMouseUp","_onMouseUp","onMouseWheel","_onMouseWheel","onMouseMove","_onMouseMove","onKeyDown","_onKeyDown","onKeyUp","_onKeyUp","update","_evt"],"mappings":"AAmJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCC,IACM,MAAMA,oBAAAA,CAAAA;qBAEX,OAAkC;AAClC;;;;;AAKC,MACD,WAAc,EAAA;QACZ,IAAI,CAACC,OAAO,GAAG,IAAA;AACjB;AACA;;;;AAIC,MACDC,UAAa,GAAA;QACX,OAAO,IAAI,CAACD,OAAO;AACrB;AACA;;;;;;;MAQAE,UAAAA,CAAWC,MAAwB,EAAE;AACnC,QAAA,IAAI,IAAI,CAACH,OAAO,KAAKG,MAAQ,EAAA;YAC3B,IAAI,CAACH,OAAO,GAAGG,MAAAA;AACf,YAAA,IAAI,CAACC,KAAK,EAAA;AACZ;AACF;AACA;;;;;;AAMC,MACDC,OAAOC,IAAa,EAAEC,EAAW,EAAEC,EAAW,EAAE;AAC9C,QAAA,IAAI,CAACR,OAAO,EAAEK,MAAAA,CAAOC,MAAMC,EAAIC,EAAAA,EAAAA,CAAAA;AACjC;AACA;;;;;AAKC,MACDJ,QAAQ;AACR;;;;;MAMAK,WAAAA,CAAYC,GAAgC,EAAE;QAC5C,OAAO,IAAI,CAACC,YAAY,CAACD,GAAAA,CAAAA;AAC3B;AACA;;;;;MAMAE,SAAAA,CAAUF,GAA8B,EAAE;QACxC,OAAO,IAAI,CAACG,UAAU,CAACH,GAAAA,CAAAA;AACzB;AACA;;;;;;;MAQAI,YAAAA,CAAaJ,GAA0B,EAAE;QACvC,OAAO,IAAI,CAACK,aAAa,CAACL,GAAAA,CAAAA;AAC5B;AACA;;;;;;;MAQAM,WAAAA,CAAYN,GAAgC,EAAE;QAC5C,OAAO,IAAI,CAACO,YAAY,CAACP,GAAAA,CAAAA;AAC3B;AACA;;;;;;;MAQAQ,SAAAA,CAAUR,GAA4B,EAAE;QACtC,OAAO,IAAI,CAACS,UAAU,CAACT,GAAAA,CAAAA;AACzB;AACA;;;;;MAMAU,OAAAA,CAAQV,GAA0B,EAAE;QAClC,OAAO,IAAI,CAACW,QAAQ,CAACX,GAAAA,CAAAA;AACvB;AACA;;;;;;;;;AASC,MACDY,SAAS;AACT;;;;MAKUX,YAAaY,CAAAA,IAAiC,EAAW;QACjE,OAAO,KAAA;AACT;AACA;;;;;MAMUV,UAAWU,CAAAA,IAA+B,EAAW;QAC7D,OAAO,KAAA;AACT;AACA;;;;;MAMUR,aAAcQ,CAAAA,IAA2B,EAAW;QAC5D,OAAO,KAAA;AACT;AACA;;;;;MAMUN,YAAaM,CAAAA,IAAiC,EAAW;QACjE,OAAO,KAAA;AACT;AACA;;;;;MAMUJ,UAAWI,CAAAA,IAA6B,EAAW;QAC3D,OAAO,KAAA;AACT;AACA;;;;;MAMUF,QAASE,CAAAA,IAA2B,EAAW;QACvD,OAAO,KAAA;AACT;AACF;;;;"}
1
+ {"version":3,"file":"base.js","sources":["../../src/camera/base.ts"],"sourcesContent":["import type { Nullable, Vector3 } from '@zephyr3d/base';\r\nimport type { Camera } from './camera';\r\n\r\n/**\r\n * Base structure for all controller events.\r\n *\r\n * Represents a typed event emitted or handled by a camera controller.\r\n *\r\n * @public\r\n */\r\nexport interface IBaseEvent<T extends string> {\r\n /** Event type identifier. */\r\n type: T;\r\n /**\r\n * Optional method to cancel the default event behavior.\r\n * May be provided by the event source.\r\n */\r\n preventDefault?: () => void;\r\n}\r\n\r\n/**\r\n * Standard modifier key set for mouse/keyboard events.\r\n *\r\n * Encapsulates common modifier keys such as Ctrl, Alt, Shift, and Meta.\r\n *\r\n * @public\r\n */\r\nexport interface IModKey {\r\n /** Whether the Control key is pressed. */\r\n readonly ctrlKey: boolean;\r\n /** Whether the Meta (Command on macOS) key is pressed. */\r\n readonly metaKey: boolean;\r\n /** Whether the Shift key is pressed. */\r\n readonly shiftKey: boolean;\r\n /** Whether the Alt/Option key is pressed. */\r\n readonly altKey: boolean;\r\n}\r\n\r\n/**\r\n * Base interface for all controller mouse and pointer events.\r\n *\r\n * Extends the base event with positional and button information, as well as modifier keys.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerMouseEvent<T extends string> extends IBaseEvent<T>, IModKey {\r\n /** Pointer offset along the X-axis, typically relative to the event target. */\r\n readonly offsetX: number;\r\n /** Pointer offset along the Y-axis, typically relative to the event target. */\r\n readonly offsetY: number;\r\n /** Mouse button index: `0` for left, `1` for middle, `2` for right, etc. */\r\n readonly button: number;\r\n}\r\n\r\n/**\r\n * Pointer down event for camera controllers.\r\n *\r\n * Triggered when a mouse, pen, or touch pointer is pressed down.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerPointerDownEvent extends IControllerMouseEvent<'pointerdown'> {}\r\n\r\n/**\r\n * Pointer up event for camera controllers.\r\n *\r\n * Triggered when a mouse, pen, or touch pointer is released.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerPointerUpEvent extends IControllerMouseEvent<'pointerup'> {}\r\n\r\n/**\r\n * Pointer move event for camera controllers.\r\n *\r\n * Triggered when the pointer (mouse, pen, or touch) moves across the viewport.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerPointerMoveEvent extends IControllerMouseEvent<'pointermove'> {}\r\n\r\n/**\r\n * Pointer cancel event for camera controllers.\r\n *\r\n * Triggered when the pointer operation is canceled (e.g., touch canceled, system interruption).\r\n *\r\n * @public\r\n */\r\nexport interface IControllerPointerCancelEvent extends IControllerMouseEvent<'pointercancel'> {}\r\n\r\n/**\r\n * Wheel (scroll) event for camera controllers.\r\n *\r\n * Extends a mouse event with wheel delta values for scroll-based input (e.g., zoom).\r\n *\r\n * @public\r\n */\r\nexport interface IControllerWheelEvent extends IControllerMouseEvent<'wheel'> {\r\n /** Horizontal wheel scroll delta. */\r\n readonly deltaX: number;\r\n /** Vertical wheel scroll delta. */\r\n readonly deltaY: number;\r\n /** Delta mode */\r\n readonly deltaMode: number;\r\n}\r\n\r\n/**\r\n * Base interface for all controller keyboard events.\r\n *\r\n * Provides key identification along with standard modifier flags.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerKeyboardEvent<T extends string> extends IBaseEvent<T>, IModKey {\r\n /** key code */\r\n readonly code: string;\r\n /** Character value */\r\n readonly key: string;\r\n}\r\n\r\n/**\r\n * Key down event for camera controllers.\r\n *\r\n * Triggered when a keyboard key is pressed down.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerKeydownEvent extends IControllerKeyboardEvent<'keydown'> {}\r\n\r\n/**\r\n * Key up event for camera controllers.\r\n *\r\n * Triggered when a keyboard key is released.\r\n *\r\n * @public\r\n */\r\nexport interface IControllerKeyupEvent extends IControllerKeyboardEvent<'keyup'> {}\r\n\r\n/**\r\n * Key press event for camera controllers.\r\n *\r\n * Triggered when a key is pressed and generates a character value (legacy usage).\r\n *\r\n * @public\r\n */\r\nexport interface IControllerKeypressEvent extends IControllerKeyboardEvent<'keypress'> {}\r\n\r\n/**\r\n * Base class for camera controllers.\r\n *\r\n * Provides a common lifecycle and event-handling surface for concrete camera controllers\r\n * (e.g., orbit, fly, FPS). Subclasses implement protected handler methods to react to\r\n * mouse/keyboard input, and update camera transforms in `update()`.\r\n *\r\n * Responsibilities:\r\n * - Holds a reference to a `Camera` and resets internal state when the camera changes.\r\n * - Offers a `lookAt(from, to, up)` helper that delegates to the camera.\r\n * - Exposes public event entry points (`onMouseDown`, `onMouseUp`, `onMouseMove`,\r\n * `onMouseWheel`, `onKeyDown`, `onKeyUp`) that forward to protected handlers which\r\n * subclasses can override.\r\n * - Defines `reset()` and `update()` lifecycle methods for state initialization and per-frame updates.\r\n *\r\n * Event handling contract:\r\n * - Each public `onXxx` method returns a boolean that indicates whether the event\r\n * was handled by the controller. Returning `true` allows upstream dispatchers to\r\n * stop propagation if desired.\r\n *\r\n * Subclassing guidelines:\r\n * - Override the protected `_onXxx` handlers rather than the public `onXxx` methods.\r\n * - Override `reset()` to reinitialize controller state when a new camera is attached.\r\n * - Override `update()` to advance state each frame (e.g., apply accumulated deltas with damping).\r\n *\r\n * Lifecycle:\r\n * 1. A camera is attached via internal `_setCamera(camera)`, which calls `reset()`.\r\n * 2. Input events are passed in through the public `onXxx` methods.\r\n * 3. Per-frame, `update()` is called to apply state changes to the camera.\r\n *\r\n * Thread-safety/assumptions:\r\n * - Designed for use on the main thread in a browser environment.\r\n * - Pointer events are used for mouse input; keyboard events for key input.\r\n *\r\n * @public\r\n */\r\nexport class BaseCameraController {\r\n /** @internal */\r\n private _camera: Nullable<Camera>;\r\n /** @internal */\r\n private _enabled: boolean;\r\n /**\r\n * Create a base camera controller.\r\n *\r\n * The controller starts without an attached camera. Call the internal `_setCamera`\r\n * to attach a camera (performed by the owning system), which triggers `reset()`.\r\n */\r\n constructor() {\r\n this._camera = null;\r\n this._enabled = true;\r\n }\r\n /**\r\n * Get the attached camera.\r\n *\r\n * @returns The current camera or `null` if none is attached.\r\n */\r\n _getCamera() {\r\n return this._camera;\r\n }\r\n /**\r\n * Attach a camera to the controller.\r\n *\r\n * If the camera changes, the controller will call `reset()` so subclasses can\r\n * reinitialize state that depends on the camera.\r\n *\r\n * @param camera - The camera to attach.\r\n */\r\n _setCamera(camera: Nullable<Camera>) {\r\n if (this._camera !== camera) {\r\n this._camera = camera;\r\n this.reset();\r\n }\r\n }\r\n /**\r\n * Check if the controller is enabled.\r\n */\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set enabled(value: boolean) {\r\n this._enabled = value;\r\n }\r\n /**\r\n * Convenience method that delegates to `camera.lookAt`.\r\n *\r\n * @param from - Camera position.\r\n * @param to - Look-at target.\r\n * @param up - Up direction.\r\n */\r\n lookAt(from: Vector3, to: Vector3, up: Vector3) {\r\n this._camera?.lookAt(from, to, up);\r\n }\r\n /**\r\n * Reset the controller's internal state.\r\n *\r\n * Called automatically when a camera is attached via `_setCamera`. Subclasses\r\n * should override this to reset accumulators, velocities, targets, etc.\r\n */\r\n reset() {}\r\n /**\r\n * Handle pointer down (mouse/touch/pen) events.\r\n *\r\n * @param evt - The pointer event.\r\n * @returns `true` if handled and should stop further processing; otherwise `false`.\r\n */\r\n onMouseDown(evt: IControllerPointerDownEvent) {\r\n return this._enabled ? this._onMouseDown(evt) : false;\r\n }\r\n /**\r\n * Handle pointer up events.\r\n *\r\n * @param evt - The pointer event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onMouseUp(evt: IControllerPointerUpEvent) {\r\n return this._enabled ? this._onMouseUp(evt) : false;\r\n }\r\n /**\r\n * Handle mouse wheel (scroll) events.\r\n *\r\n * Typical usage: zoom/dolly control, FOV adjustments.\r\n *\r\n * @param evt - The wheel event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onMouseWheel(evt: IControllerWheelEvent) {\r\n return this._enabled ? this._onMouseWheel(evt) : false;\r\n }\r\n /**\r\n * Handle pointer move events.\r\n *\r\n * Typical usage: orbit, pan, or look controls based on button/modifier state.\r\n *\r\n * @param evt - The pointer event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onMouseMove(evt: IControllerPointerMoveEvent) {\r\n return this._enabled ? this._onMouseMove(evt) : false;\r\n }\r\n /**\r\n * Handle key down events.\r\n *\r\n * Typical usage: WASD navigation, modifiers for speed, toggling modes.\r\n *\r\n * @param evt - The keyboard event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onKeyDown(evt: IControllerKeydownEvent) {\r\n return this._enabled ? this._onKeyDown(evt) : false;\r\n }\r\n /**\r\n * Handle key up events.\r\n *\r\n * @param evt - The keyboard event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n onKeyUp(evt: IControllerKeyupEvent) {\r\n return this._enabled ? this._onKeyUp(evt) : false;\r\n }\r\n /**\r\n * Per-frame update.\r\n *\r\n * Subclasses should override this to:\r\n * - Integrate velocities/accelerations and apply damping.\r\n * - Smoothly interpolate camera transforms.\r\n * - Clamp angles/distances/FOV, etc.\r\n *\r\n * Called once per frame by the owning system.\r\n */\r\n update() {\r\n if (this._enabled) {\r\n this._onUpdate();\r\n }\r\n }\r\n /**\r\n * Mouse down event handler\r\n * @param evt - Mouse event\r\n * @returns Boolean value indices whether this event was handled\r\n */\r\n protected _onMouseDown(_evt: IControllerPointerDownEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Pointer up handler for subclasses to override.\r\n *\r\n * @param _evt - Pointer event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onMouseUp(_evt: IControllerPointerUpEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Mouse wheel handler for subclasses to override.\r\n *\r\n * @param _evt - Wheel event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onMouseWheel(_evt: IControllerWheelEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Pointer move handler for subclasses to override.\r\n *\r\n * @param _evt - Pointer event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onMouseMove(_evt: IControllerPointerMoveEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Key down handler for subclasses to override.\r\n *\r\n * @param _evt - Keyboard event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onKeyDown(_evt: IControllerKeydownEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Key up handler for subclasses to override.\r\n *\r\n * @param _evt - Keyboard event.\r\n * @returns `true` if handled; otherwise `false`.\r\n */\r\n protected _onKeyUp(_evt: IControllerKeyupEvent): boolean {\r\n return false;\r\n }\r\n /**\r\n * Per-frame update handler for subclasses to override.\r\n */\r\n protected _onUpdate() {\r\n // Subclasses can override this for per-frame updates.\r\n }\r\n}\r\n"],"names":["BaseCameraController","_camera","_enabled","_getCamera","_setCamera","camera","reset","enabled","value","lookAt","from","to","up","onMouseDown","evt","_onMouseDown","onMouseUp","_onMouseUp","onMouseWheel","_onMouseWheel","onMouseMove","_onMouseMove","onKeyDown","_onKeyDown","onKeyUp","_onKeyUp","update","_onUpdate","_evt"],"mappings":"AAmJA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCC,IACM,MAAMA,oBAAAA,CAAAA;qBAEX,OAAkC;qBAElC,QAA0B;AAC1B;;;;;AAKC,MACD,WAAc,EAAA;QACZ,IAAI,CAACC,OAAO,GAAG,IAAA;QACf,IAAI,CAACC,QAAQ,GAAG,IAAA;AAClB;AACA;;;;AAIC,MACDC,UAAa,GAAA;QACX,OAAO,IAAI,CAACF,OAAO;AACrB;AACA;;;;;;;MAQAG,UAAAA,CAAWC,MAAwB,EAAE;AACnC,QAAA,IAAI,IAAI,CAACJ,OAAO,KAAKI,MAAQ,EAAA;YAC3B,IAAI,CAACJ,OAAO,GAAGI,MAAAA;AACf,YAAA,IAAI,CAACC,KAAK,EAAA;AACZ;AACF;AACA;;AAEC,MACD,IAAIC,OAAU,GAAA;QACZ,OAAO,IAAI,CAACL,QAAQ;AACtB;IACA,IAAIK,OAAAA,CAAQC,KAAc,EAAE;QAC1B,IAAI,CAACN,QAAQ,GAAGM,KAAAA;AAClB;AACA;;;;;;AAMC,MACDC,OAAOC,IAAa,EAAEC,EAAW,EAAEC,EAAW,EAAE;AAC9C,QAAA,IAAI,CAACX,OAAO,EAAEQ,MAAAA,CAAOC,MAAMC,EAAIC,EAAAA,EAAAA,CAAAA;AACjC;AACA;;;;;AAKC,MACDN,QAAQ;AACR;;;;;MAMAO,WAAAA,CAAYC,GAAgC,EAAE;QAC5C,OAAO,IAAI,CAACZ,QAAQ,GAAG,IAAI,CAACa,YAAY,CAACD,GAAO,CAAA,GAAA,KAAA;AAClD;AACA;;;;;MAMAE,SAAAA,CAAUF,GAA8B,EAAE;QACxC,OAAO,IAAI,CAACZ,QAAQ,GAAG,IAAI,CAACe,UAAU,CAACH,GAAO,CAAA,GAAA,KAAA;AAChD;AACA;;;;;;;MAQAI,YAAAA,CAAaJ,GAA0B,EAAE;QACvC,OAAO,IAAI,CAACZ,QAAQ,GAAG,IAAI,CAACiB,aAAa,CAACL,GAAO,CAAA,GAAA,KAAA;AACnD;AACA;;;;;;;MAQAM,WAAAA,CAAYN,GAAgC,EAAE;QAC5C,OAAO,IAAI,CAACZ,QAAQ,GAAG,IAAI,CAACmB,YAAY,CAACP,GAAO,CAAA,GAAA,KAAA;AAClD;AACA;;;;;;;MAQAQ,SAAAA,CAAUR,GAA4B,EAAE;QACtC,OAAO,IAAI,CAACZ,QAAQ,GAAG,IAAI,CAACqB,UAAU,CAACT,GAAO,CAAA,GAAA,KAAA;AAChD;AACA;;;;;MAMAU,OAAAA,CAAQV,GAA0B,EAAE;QAClC,OAAO,IAAI,CAACZ,QAAQ,GAAG,IAAI,CAACuB,QAAQ,CAACX,GAAO,CAAA,GAAA,KAAA;AAC9C;AACA;;;;;;;;;AASC,MACDY,MAAS,GAAA;QACP,IAAI,IAAI,CAACxB,QAAQ,EAAE;AACjB,YAAA,IAAI,CAACyB,SAAS,EAAA;AAChB;AACF;AACA;;;;MAKUZ,YAAaa,CAAAA,IAAiC,EAAW;QACjE,OAAO,KAAA;AACT;AACA;;;;;MAMUX,UAAWW,CAAAA,IAA+B,EAAW;QAC7D,OAAO,KAAA;AACT;AACA;;;;;MAMUT,aAAcS,CAAAA,IAA2B,EAAW;QAC5D,OAAO,KAAA;AACT;AACA;;;;;MAMUP,YAAaO,CAAAA,IAAiC,EAAW;QACjE,OAAO,KAAA;AACT;AACA;;;;;MAMUL,UAAWK,CAAAA,IAA6B,EAAW;QAC3D,OAAO,KAAA;AACT;AACA;;;;;MAMUH,QAASG,CAAAA,IAA2B,EAAW;QACvD,OAAO,KAAA;AACT;AACA;;AAEC,MACD,SAAsB,GAAA;;AAEtB;AACF;;;;"}
@@ -8,8 +8,11 @@ import { FXAA } from '../posteffect/fxaa.js';
8
8
  import { Bloom } from '../posteffect/bloom.js';
9
9
  import { SAO } from '../posteffect/sao.js';
10
10
  import { MotionBlur } from '../posteffect/motionblur.js';
11
+ import { ColorAdjust } from '../posteffect/coloradjust.js';
11
12
  import { getDevice } from '../app/api.js';
12
13
  import { ScreenAdapter } from '../app/screen.js';
14
+ import { ABufferOIT } from '../render/abuffer_oit.js';
15
+ import { WeightedBlendedOIT } from '../render/weightedblended_oit.js';
13
16
 
14
17
  /**
15
18
  * A renderable camera node that manages view/projection math, frusta,
@@ -31,7 +34,7 @@ import { ScreenAdapter } from '../app/screen.js';
31
34
  * @public
32
35
  */ class Camera extends SceneNode {
33
36
  /** @internal Halton 2-3 sequence used for TAA jittering. */ static _halton23 = halton23(16);
34
- /** @internal Per-camera history resources. */ static _historyData = new WeakMap();
37
+ /** @internal Per-camera history resource manager. */ static _historyResourceManager = new WeakMap();
35
38
  /** @internal Screen adapter for this camera */ _screenAdapter;
36
39
  /** @internal Whether the camera is adapted */ _adapted;
37
40
  /** @internal Adapted viewport */ _adaptedViewport;
@@ -54,6 +57,8 @@ import { ScreenAdapter } from '../app/screen.js';
54
57
  /** @internal Scissor rectangle [x, y, w, h]; null uses viewport. */ _scissor;
55
58
  /** @internal Clip plane mask for custom clipping schemes. */ _clipMask;
56
59
  /** @internal Order-Independent Transparency reference. */ _oit;
60
+ /** @internal OIT algorithm selection mode. */ _oitMode;
61
+ /** @internal ABuffer OIT layer budget. */ _oitABufferLayers;
57
62
  /** @internal Whether to perform a depth pre-pass. */ _depthPrePass;
58
63
  /** @internal Whether command buffers may be reused for optimization. */ _commandBufferReuse;
59
64
  /** @internal Hi-Z acceleration enable (primarily for SSR). */ _HiZ;
@@ -71,6 +76,12 @@ import { ScreenAdapter } from '../app/screen.js';
71
76
  /** @internal Bloom threshold. */ _bloomThreshold;
72
77
  /** @internal Bloom threshold knee (soft thresholding). */ _bloomThresholdKnee;
73
78
  /** @internal Bloom intensity. */ _bloomIntensity;
79
+ /** @internal Color adjustment enable flag (via post effect). */ _colorAdjustEnabled;
80
+ /** @internal Color adjustment post effect reference. */ _postEffectColorAdjust;
81
+ /** @internal Color adjustment saturation. */ _colorAdjustSaturation;
82
+ /** @internal Color adjustment contrast. */ _colorAdjustContrast;
83
+ /** @internal Color adjustment hue (degrees). */ _colorAdjustHue;
84
+ /** @internal Color adjustment sharpen amount. */ _colorAdjustSharpen;
74
85
  /** @internal FXAA enable flag (via post effect). */ _FXAA;
75
86
  /** @internal FXAA post effect reference. */ _postEffectFXAA;
76
87
  /** @internal TAA enable flag (via post effect). */ _TAA;
@@ -139,6 +150,8 @@ import { ScreenAdapter } from '../app/screen.js';
139
150
  this._frustum = null;
140
151
  this._frustumV = null;
141
152
  this._oit = new DRef();
153
+ this._oitMode = 'none';
154
+ this._oitABufferLayers = 20;
142
155
  this._depthPrePass = false;
143
156
  this._screenAdapter = new ScreenAdapter();
144
157
  this._adapted = false;
@@ -157,6 +170,12 @@ import { ScreenAdapter } from '../app/screen.js';
157
170
  this._bloomThreshold = 0.8;
158
171
  this._bloomThresholdKnee = 0;
159
172
  this._bloomIntensity = 1;
173
+ this._colorAdjustEnabled = false;
174
+ this._postEffectColorAdjust = new DRef();
175
+ this._colorAdjustSaturation = 1;
176
+ this._colorAdjustContrast = 1;
177
+ this._colorAdjustHue = 0;
178
+ this._colorAdjustSharpen = 0;
160
179
  this._FXAA = false;
161
180
  this._postEffectFXAA = new DRef();
162
181
  this._TAA = false;
@@ -346,6 +365,48 @@ import { ScreenAdapter } from '../app/screen.js';
346
365
  this._postEffectBloom.get().intensity = val;
347
366
  }
348
367
  }
368
+ /** Whether color adjustment is enabled. */ get colorAdjust() {
369
+ return this._postEffectColorAdjust.get().enabled;
370
+ }
371
+ set colorAdjust(val) {
372
+ this._postEffectColorAdjust.get().enabled = !!val;
373
+ }
374
+ /** Color adjustment saturation, 1 means unchanged. */ get colorAdjustSaturation() {
375
+ return this._colorAdjustSaturation;
376
+ }
377
+ set colorAdjustSaturation(val) {
378
+ this._colorAdjustSaturation = val;
379
+ if (this._postEffectColorAdjust.get()) {
380
+ this._postEffectColorAdjust.get().saturation = val;
381
+ }
382
+ }
383
+ /** Color adjustment contrast, 1 means unchanged. */ get colorAdjustContrast() {
384
+ return this._colorAdjustContrast;
385
+ }
386
+ set colorAdjustContrast(val) {
387
+ this._colorAdjustContrast = val;
388
+ if (this._postEffectColorAdjust.get()) {
389
+ this._postEffectColorAdjust.get().contrast = val;
390
+ }
391
+ }
392
+ /** Color adjustment hue in degrees. */ get colorAdjustHue() {
393
+ return this._colorAdjustHue;
394
+ }
395
+ set colorAdjustHue(val) {
396
+ this._colorAdjustHue = val;
397
+ if (this._postEffectColorAdjust.get()) {
398
+ this._postEffectColorAdjust.get().hue = val;
399
+ }
400
+ }
401
+ /** Color adjustment sharpen amount, 0 means disabled. */ get colorAdjustSharpen() {
402
+ return this._colorAdjustSharpen;
403
+ }
404
+ set colorAdjustSharpen(val) {
405
+ this._colorAdjustSharpen = val;
406
+ if (this._postEffectColorAdjust.get()) {
407
+ this._postEffectColorAdjust.get().sharpen = val;
408
+ }
409
+ }
349
410
  /**
350
411
  * Gets whether FXAA is enabled.
351
412
  */ get FXAA() {
@@ -572,6 +633,32 @@ import { ScreenAdapter } from '../app/screen.js';
572
633
  }
573
634
  set oit(val) {
574
635
  this._oit.set(val);
636
+ const inferredMode = this.inferOITMode(val);
637
+ if (inferredMode) {
638
+ this._oitMode = inferredMode;
639
+ }
640
+ }
641
+ /** OIT mode */ get oitMode() {
642
+ return this._oitMode;
643
+ }
644
+ set oitMode(val) {
645
+ const mode = val ?? 'none';
646
+ if (mode !== this._oitMode) {
647
+ this._oitMode = mode;
648
+ this._oit.set(this.createOITForMode(mode));
649
+ }
650
+ }
651
+ /** ABuffer OIT layer budget. */ get oitABufferLayers() {
652
+ return this._oitABufferLayers;
653
+ }
654
+ set oitABufferLayers(val) {
655
+ const layers = Math.max(1, Math.floor(val || 0));
656
+ if (layers !== this._oitABufferLayers) {
657
+ this._oitABufferLayers = layers;
658
+ if (this._oitMode === 'abuffer') {
659
+ this._oit.set(this.createOITForMode('abuffer'));
660
+ }
661
+ }
575
662
  }
576
663
  /** Clip plane mask */ get clipMask() {
577
664
  return this._clipMask;
@@ -664,10 +751,12 @@ import { ScreenAdapter } from '../app/screen.js';
664
751
  *
665
752
  * @param x - The x-component of the screen coordinates, relative to the top-left corner of the viewport.
666
753
  * @param y - The y-component of the screen coordinates, relative to the top-left corner of the viewport.
754
+ * @param viewportWidth - Optional width of the viewport for normalizing screen coordinates. If not provided, it will be derived from the camera's viewport or the device's viewport.
755
+ * @param viewportHeight - Optional height of the viewport for normalizing screen coordinates. If not provided, it will be derived from the camera's viewport or the device's viewport.
667
756
  * @returns The ray originating from the camera position and passing through the given screen coordinates.
668
- */ constructRay(x, y) {
669
- const width = this.viewport ? this.viewport[2] : getDevice().getViewport().width;
670
- const height = this.viewport ? this.viewport[3] : getDevice().getViewport().height;
757
+ */ constructRay(x, y, viewportWidth, viewportHeight) {
758
+ const width = viewportWidth ?? (this.viewport ? this.viewport[2] : getDevice().getViewport().width);
759
+ const height = viewportHeight ?? (this.viewport ? this.viewport[3] : getDevice().getViewport().height);
671
760
  const ndcX = 2 * x / width - 1;
672
761
  const ndcY = 1 - 2 * y / height;
673
762
  const nearClip = new Vector4(ndcX, ndcY, -1, 1);
@@ -840,31 +929,31 @@ import { ScreenAdapter } from '../app/screen.js';
840
929
  return this.getProjectionMatrix().isOrtho();
841
930
  }
842
931
  /**
843
- * Gets the camera history data which is used in temporal reprojection
844
- * @returns Camera history data
845
- */ getHistoryData() {
846
- let data = Camera._historyData.get(this);
847
- if (!data) {
848
- data = {
849
- prevColorTex: null,
850
- prevMotionVectorTex: null
851
- };
852
- Camera._historyData.set(this, data);
932
+ * Gets the camera history resource manager for temporal effects
933
+ * @returns History resource manager
934
+ */ getHistoryResourceManager() {
935
+ let manager = Camera._historyResourceManager.get(this);
936
+ if (!manager) {
937
+ // Import dynamically to avoid circular dependency
938
+ // The actual import happens in forward_plus_builder.ts
939
+ return null;
853
940
  }
854
- return data;
941
+ return manager;
942
+ }
943
+ /**
944
+ * Sets the camera history resource manager for temporal effects
945
+ * @internal
946
+ */ setHistoryResourceManager(manager) {
947
+ Camera._historyResourceManager.set(this, manager);
855
948
  }
856
949
  /**
857
950
  * Clears the camera history data which is used in temporal reprojection
858
951
  */ clearHistoryData() {
859
- const data = Camera._historyData.get(this);
860
- if (data) {
861
- if (data.prevColorTex) {
862
- getDevice().pool.releaseTexture(data.prevColorTex);
863
- }
864
- if (data.prevMotionVectorTex) {
865
- getDevice().pool.releaseTexture(data.prevMotionVectorTex);
866
- }
867
- Camera._historyData.delete(this);
952
+ // Clear history resource manager
953
+ const manager = Camera._historyResourceManager.get(this);
954
+ if (manager) {
955
+ manager.dispose();
956
+ Camera._historyResourceManager.delete(this);
868
957
  }
869
958
  this._prevVPMatrix = null;
870
959
  this._prevPosition = null;
@@ -910,6 +999,16 @@ import { ScreenAdapter } from '../app/screen.js';
910
999
  this._postEffectTonemap.set(tonemap);
911
1000
  this._compositor.appendPostEffect(tonemap);
912
1001
  }
1002
+ if (!this._postEffectColorAdjust.get()) {
1003
+ const colorAdjust = new ColorAdjust();
1004
+ colorAdjust.enabled = false;
1005
+ colorAdjust.saturation = this._colorAdjustSaturation;
1006
+ colorAdjust.contrast = this._colorAdjustContrast;
1007
+ colorAdjust.hue = this._colorAdjustHue;
1008
+ colorAdjust.sharpen = this._colorAdjustSharpen;
1009
+ this._postEffectColorAdjust.set(colorAdjust);
1010
+ this._compositor.appendPostEffect(colorAdjust);
1011
+ }
913
1012
  if (!this._postEffectFXAA.get()) {
914
1013
  const fxaa = new FXAA();
915
1014
  fxaa.enabled = false;
@@ -1080,8 +1179,31 @@ import { ScreenAdapter } from '../app/screen.js';
1080
1179
  this._postEffectSSR.dispose();
1081
1180
  this._postEffectTAA.dispose();
1082
1181
  this._postEffectTonemap.dispose();
1182
+ this._postEffectColorAdjust.dispose();
1083
1183
  this._oit.dispose();
1084
1184
  }
1185
+ /** @internal */ createOITForMode(mode) {
1186
+ if (mode === 'abuffer') {
1187
+ return new ABufferOIT(this._oitABufferLayers);
1188
+ }
1189
+ if (mode === 'weighted') {
1190
+ return new WeightedBlendedOIT();
1191
+ }
1192
+ return null;
1193
+ }
1194
+ /** @internal */ inferOITMode(oit) {
1195
+ if (!oit) {
1196
+ return 'none';
1197
+ }
1198
+ const type = oit.getType();
1199
+ if (type === ABufferOIT.type) {
1200
+ return 'abuffer';
1201
+ }
1202
+ if (type === WeightedBlendedOIT.type) {
1203
+ return 'weighted';
1204
+ }
1205
+ return null;
1206
+ }
1085
1207
  /** @internal */ posInViewport(x, y) {
1086
1208
  let rect = this._interactionRect;
1087
1209
  if (!rect && this.viewport) {