@zephyr3d/scene 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animationset.js +563 -128
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/cloth/gpu_cloth_system.js +2516 -0
- package/dist/animation/cloth/gpu_cloth_system.js.map +1 -0
- package/dist/animation/fixed_geometry_cache_track.js +138 -0
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -0
- package/dist/animation/geometry_cache_utils.js +120 -0
- package/dist/animation/geometry_cache_utils.js.map +1 -0
- package/dist/animation/ik_modifier.js +9 -1
- package/dist/animation/ik_modifier.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +469 -0
- package/dist/animation/joint_dynamics/collision.js.map +1 -0
- package/dist/animation/joint_dynamics/constraints.js +329 -0
- package/dist/animation/joint_dynamics/constraints.js.map +1 -0
- package/dist/animation/joint_dynamics/controller.js +699 -0
- package/dist/animation/joint_dynamics/controller.js.map +1 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +393 -0
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -0
- package/dist/animation/joint_dynamics/solver.js +794 -0
- package/dist/animation/joint_dynamics/solver.js.map +1 -0
- package/dist/animation/joint_dynamics/types.js +19 -0
- package/dist/animation/joint_dynamics/types.js.map +1 -0
- package/dist/animation/joint_dynamics/vrm_spring_bone.js +46 -0
- package/dist/animation/joint_dynamics/vrm_spring_bone.js.map +1 -0
- package/dist/animation/joint_dynamics_modifier.js +51 -0
- package/dist/animation/joint_dynamics_modifier.js.map +1 -0
- package/dist/animation/pca_geometry_cache_track.js +222 -0
- package/dist/animation/pca_geometry_cache_track.js.map +1 -0
- package/dist/animation/skeleton.js +1907 -3
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +3 -5
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/multi_chain_spring_system.js +2 -0
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
- package/dist/animation/spring/spring_chain.js +3 -2
- package/dist/animation/spring/spring_chain.js.map +1 -1
- package/dist/animation/spring/spring_collider.js +35 -5
- package/dist/animation/spring/spring_collider.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +1 -0
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring/spring_system.js +325 -28
- package/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/animation/spring2/collision.js +469 -0
- package/dist/animation/spring2/collision.js.map +1 -0
- package/dist/animation/spring2/constraints.js +329 -0
- package/dist/animation/spring2/constraints.js.map +1 -0
- package/dist/animation/spring2/controller.js +434 -0
- package/dist/animation/spring2/controller.js.map +1 -0
- package/dist/animation/spring2/math.js +16 -0
- package/dist/animation/spring2/math.js.map +1 -0
- package/dist/animation/spring2/solver.js +624 -0
- package/dist/animation/spring2/solver.js.map +1 -0
- package/dist/animation/spring2/spring_system.js +118 -0
- package/dist/animation/spring2/spring_system.js.map +1 -0
- package/dist/animation/spring2/types.js +19 -0
- package/dist/animation/spring2/types.js.map +1 -0
- package/dist/animation/spring_modifier.js +17 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/app/engine.js +42 -15
- package/dist/app/engine.js.map +1 -1
- package/dist/app/runtimescript.js +132 -1
- package/dist/app/runtimescript.js.map +1 -1
- package/dist/app/screen.js +3 -3
- package/dist/app/screen.js.map +1 -1
- package/dist/app/scriptingsystem.js +69 -37
- package/dist/app/scriptingsystem.js.map +1 -1
- package/dist/app/scriptregistry.js +157 -146
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +2 -1
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/zabc/zabc_loader.js +570 -0
- package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -0
- package/dist/asset/model.js +192 -0
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/base.js +26 -7
- package/dist/camera/base.js.map +1 -1
- package/dist/camera/camera.js +146 -24
- package/dist/camera/camera.js.map +1 -1
- package/dist/camera/fps.js +2 -2
- package/dist/camera/fps.js.map +1 -1
- package/dist/camera/orbit.js +2 -2
- package/dist/camera/orbit.js.map +1 -1
- package/dist/index.d.ts +11701 -8506
- package/dist/index.js +29 -8
- package/dist/index.js.map +1 -1
- package/dist/material/lambert.js +1 -1
- package/dist/material/lambert.js.map +1 -1
- package/dist/material/material.js +9 -3
- package/dist/material/material.js.map +1 -1
- package/dist/material/meshmaterial.js +54 -7
- package/dist/material/meshmaterial.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +17 -7
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/lightmodel/lambert.js +7 -2
- package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +108 -16
- package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +222 -14
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js +24 -12
- package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
- package/dist/material/mixins/lit.js +11 -8
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +72 -5
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/pbrblueprint.js +148 -1
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/pbrmr.js +125 -2
- package/dist/material/pbrmr.js.map +1 -1
- package/dist/material/shader/helper.js +10 -4
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/water.js +2 -2
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/coloradjust.js +145 -0
- package/dist/posteffect/coloradjust.js.map +1 -0
- package/dist/posteffect/taa.js +68 -32
- package/dist/posteffect/taa.js.map +1 -1
- package/dist/render/cluster_light.js +17 -12
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/deferredlightpass.js +510 -0
- package/dist/render/deferredlightpass.js.map +1 -0
- package/dist/render/deferredshadowlightpass.js +428 -0
- package/dist/render/deferredshadowlightpass.js.map +1 -0
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +21 -12
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js +20 -22
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/gbufferpass.js +50 -0
- package/dist/render/gbufferpass.js.map +1 -0
- package/dist/render/lightpass.js +1 -2
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/primitive.js +1 -1
- package/dist/render/primitive.js.map +1 -1
- package/dist/render/render_queue.js +3 -2
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +5 -358
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/executor.js +15 -12
- package/dist/render/rendergraph/executor.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +144 -88
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/history_resource_manager.js +178 -0
- package/dist/render/rendergraph/history_resource_manager.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +12 -1
- package/dist/render/rendergraph/rendergraph.js.map +1 -1
- package/dist/render/rendergraph/types.js +2 -2
- package/dist/render/rendergraph/types.js.map +1 -1
- package/dist/render/sky.js +26 -9
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +4 -3
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +4 -4
- package/dist/scene/environment.js +7 -4
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/light.js +184 -18
- package/dist/scene/light.js.map +1 -1
- package/dist/scene/mesh.js +30 -0
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/particlesys.js +3 -2
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/raycast_visitor.js +29 -3
- package/dist/scene/raycast_visitor.js.map +1 -1
- package/dist/scene/scene.js +86 -19
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +87 -31
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/script_attachment.js +59 -0
- package/dist/scene/script_attachment.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +3 -2
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +4 -3
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/water.js +3 -2
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/shadow.js +2 -2
- package/dist/shaders/shadow.js.map +1 -1
- package/dist/shadow/shadowmapper.js +74 -4
- package/dist/shadow/shadowmapper.js.map +1 -1
- package/dist/shapes/box.js +163 -0
- package/dist/shapes/box.js.map +1 -1
- package/dist/shapes/capsule.js +216 -0
- package/dist/shapes/capsule.js.map +1 -0
- package/dist/shapes/cylinder.js +91 -0
- package/dist/shapes/cylinder.js.map +1 -1
- package/dist/shapes/plane.js +32 -0
- package/dist/shapes/plane.js.map +1 -1
- package/dist/shapes/tetrahedron.js +211 -0
- package/dist/shapes/tetrahedron.js.map +1 -1
- package/dist/shapes/torus.js +173 -0
- package/dist/shapes/torus.js.map +1 -1
- package/dist/utility/blueprint/common/math.js +111 -1
- package/dist/utility/blueprint/common/math.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js +235 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +154 -10
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/texture.js +273 -19
- package/dist/utility/blueprint/material/texture.js.map +1 -1
- package/dist/utility/serialization/json.js +12 -2
- package/dist/utility/serialization/json.js.map +1 -1
- package/dist/utility/serialization/manager.js +30 -11
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +250 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +4 -2
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +154 -2
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/cloth_script.js +834 -0
- package/dist/utility/serialization/scene/cloth_script.js.map +1 -0
- package/dist/utility/serialization/scene/common.js +7 -0
- package/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +120 -4
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +453 -1
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +4 -2
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +298 -10
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +4 -2
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +100 -3
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/scene.js +130 -3
- package/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/utility/serialization/scene/script.js +66 -0
- package/dist/utility/serialization/scene/script.js.map +1 -0
- package/dist/utility/serialization/scene/spring_script.js +596 -0
- package/dist/utility/serialization/scene/spring_script.js.map +1 -0
- package/dist/utility/serialization/scene/sprite.js +5 -3
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +4 -2
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +4 -2
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/values.js +5 -1
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
package/dist/camera/base.js
CHANGED
|
@@ -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 };
|
package/dist/camera/base.js.map
CHANGED
|
@@ -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;;;;"}
|
package/dist/camera/camera.js
CHANGED
|
@@ -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
|
|
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
|
|
844
|
-
* @returns
|
|
845
|
-
*/
|
|
846
|
-
let
|
|
847
|
-
if (!
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
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
|
|
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
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
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) {
|