@zephyr3d/scene 0.9.21 → 0.9.23

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 (238) hide show
  1. package/dist/animation/joint_dynamics/collision.js +1 -7
  2. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  3. package/dist/animation/joint_dynamics/constraints.js +2 -17
  4. package/dist/animation/joint_dynamics/constraints.js.map +1 -1
  5. package/dist/animation/joint_dynamics/controller.js +2 -20
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
  8. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  9. package/dist/animation/joint_dynamics/solver.js +14 -60
  10. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  11. package/dist/animation/joint_dynamics/types.js +3 -3
  12. package/dist/animation/joint_dynamics/types.js.map +1 -1
  13. package/dist/app/app.js +23 -0
  14. package/dist/app/app.js.map +1 -1
  15. package/dist/app/scriptregistry.js +16 -53
  16. package/dist/app/scriptregistry.js.map +1 -1
  17. package/dist/asset/assetmanager.js +2 -0
  18. package/dist/asset/assetmanager.js.map +1 -1
  19. package/dist/asset/model.js +22 -0
  20. package/dist/asset/model.js.map +1 -1
  21. package/dist/blitter/bilateralblur.js +3 -1
  22. package/dist/blitter/bilateralblur.js.map +1 -1
  23. package/dist/blitter/blitter.js +3 -3
  24. package/dist/blitter/blitter.js.map +1 -1
  25. package/dist/camera/camera.js +398 -45
  26. package/dist/camera/camera.js.map +1 -1
  27. package/dist/camera/perspectivecamera.js +69 -2
  28. package/dist/camera/perspectivecamera.js.map +1 -1
  29. package/dist/index.d.ts +9100 -8712
  30. package/dist/index.js +9 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/material/blinn.js +1 -1
  33. package/dist/material/blinn.js.map +1 -1
  34. package/dist/material/lambert.js +3 -3
  35. package/dist/material/lambert.js.map +1 -1
  36. package/dist/material/material.js +8 -5
  37. package/dist/material/material.js.map +1 -1
  38. package/dist/material/meshmaterial.js +17 -10
  39. package/dist/material/meshmaterial.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  41. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  42. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  43. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  44. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
  45. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  46. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
  47. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  48. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
  49. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  50. package/dist/material/mixins/lit.js +33 -11
  51. package/dist/material/mixins/lit.js.map +1 -1
  52. package/dist/material/mixins/pbr/brdf.js +44 -12
  53. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  54. package/dist/material/mixins/pbr/common.js +149 -14
  55. package/dist/material/mixins/pbr/common.js.map +1 -1
  56. package/dist/material/mtoon.js +7 -4
  57. package/dist/material/mtoon.js.map +1 -1
  58. package/dist/material/pbrblueprint.js +5 -1
  59. package/dist/material/pbrblueprint.js.map +1 -1
  60. package/dist/material/pbrmr.js +1 -1
  61. package/dist/material/pbrmr.js.map +1 -1
  62. package/dist/material/pbrsg.js +1 -1
  63. package/dist/material/pbrsg.js.map +1 -1
  64. package/dist/material/shader/helper.js +186 -11
  65. package/dist/material/shader/helper.js.map +1 -1
  66. package/dist/material/skin.js +2 -2
  67. package/dist/material/skin.js.map +1 -1
  68. package/dist/material/terrain-cm.js +5 -5
  69. package/dist/material/terrain-cm.js.map +1 -1
  70. package/dist/material/water.js +6 -4
  71. package/dist/material/water.js.map +1 -1
  72. package/dist/posteffect/bloom.js +54 -4
  73. package/dist/posteffect/bloom.js.map +1 -1
  74. package/dist/posteffect/compositor.js +41 -0
  75. package/dist/posteffect/compositor.js.map +1 -1
  76. package/dist/posteffect/posteffect.js +51 -0
  77. package/dist/posteffect/posteffect.js.map +1 -1
  78. package/dist/posteffect/sao.js +7 -6
  79. package/dist/posteffect/sao.js.map +1 -1
  80. package/dist/posteffect/skinsss.js +3 -3
  81. package/dist/posteffect/skinsss.js.map +1 -1
  82. package/dist/posteffect/ssgi.js +1196 -0
  83. package/dist/posteffect/ssgi.js.map +1 -0
  84. package/dist/posteffect/ssr.js +83 -45
  85. package/dist/posteffect/ssr.js.map +1 -1
  86. package/dist/posteffect/sss.js +137 -49
  87. package/dist/posteffect/sss.js.map +1 -1
  88. package/dist/posteffect/taa.js +5 -4
  89. package/dist/posteffect/taa.js.map +1 -1
  90. package/dist/posteffect/tonemap.js +15 -3
  91. package/dist/posteffect/tonemap.js.map +1 -1
  92. package/dist/render/abuffer_oit.js +2 -2
  93. package/dist/render/abuffer_oit.js.map +1 -1
  94. package/dist/render/cluster_light.js +12 -6
  95. package/dist/render/cluster_light.js.map +1 -1
  96. package/dist/render/drawable_mixin.js +8 -5
  97. package/dist/render/drawable_mixin.js.map +1 -1
  98. package/dist/render/dualdepthpeeling_oit.js +10 -5
  99. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  100. package/dist/render/envlight.js +298 -5
  101. package/dist/render/envlight.js.map +1 -1
  102. package/dist/render/gpu_picking.js +7 -5
  103. package/dist/render/gpu_picking.js.map +1 -1
  104. package/dist/render/hzb.js +28 -19
  105. package/dist/render/hzb.js.map +1 -1
  106. package/dist/render/lightpass.js +18 -4
  107. package/dist/render/lightpass.js.map +1 -1
  108. package/dist/render/render_queue.js +37 -4
  109. package/dist/render/render_queue.js.map +1 -1
  110. package/dist/render/renderer.js +8 -3
  111. package/dist/render/renderer.js.map +1 -1
  112. package/dist/render/rendergraph/blackboard.js +20 -48
  113. package/dist/render/rendergraph/blackboard.js.map +1 -1
  114. package/dist/render/rendergraph/device_pool_allocator.js +18 -58
  115. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  116. package/dist/render/rendergraph/executor.js +89 -115
  117. package/dist/render/rendergraph/executor.js.map +1 -1
  118. package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
  119. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  120. package/dist/render/rendergraph/frame_graph_context.js +41 -0
  121. package/dist/render/rendergraph/frame_graph_context.js.map +1 -0
  122. package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
  123. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
  124. package/dist/render/rendergraph/history_resource_manager.js +74 -140
  125. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  126. package/dist/render/rendergraph/history_resources.js +7 -5
  127. package/dist/render/rendergraph/history_resources.js.map +1 -1
  128. package/dist/render/rendergraph/render_context.js +19 -0
  129. package/dist/render/rendergraph/render_context.js.map +1 -0
  130. package/dist/render/rendergraph/render_pipeline.js +315 -0
  131. package/dist/render/rendergraph/render_pipeline.js.map +1 -0
  132. package/dist/render/rendergraph/rendergraph.js +158 -141
  133. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  134. package/dist/render/rendergraph/scene_render_context.js +267 -0
  135. package/dist/render/rendergraph/scene_render_context.js.map +1 -0
  136. package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
  137. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
  138. package/dist/render/rendergraph/types.js +19 -31
  139. package/dist/render/rendergraph/types.js.map +1 -1
  140. package/dist/render/renderpass.js +3 -3
  141. package/dist/render/renderpass.js.map +1 -1
  142. package/dist/render/shadow_mask_pass.js +10 -6
  143. package/dist/render/shadow_mask_pass.js.map +1 -1
  144. package/dist/render/sky.js +197 -35
  145. package/dist/render/sky.js.map +1 -1
  146. package/dist/render/weightedblended_oit.js +4 -3
  147. package/dist/render/weightedblended_oit.js.map +1 -1
  148. package/dist/scene/basesprite.js +2 -0
  149. package/dist/scene/basesprite.js.map +1 -1
  150. package/dist/scene/batchgroup.js +10 -0
  151. package/dist/scene/batchgroup.js.map +1 -1
  152. package/dist/scene/environment.js +61 -2
  153. package/dist/scene/environment.js.map +1 -1
  154. package/dist/scene/light.js +178 -10
  155. package/dist/scene/light.js.map +1 -1
  156. package/dist/scene/meshdrawable.js +89 -2
  157. package/dist/scene/meshdrawable.js.map +1 -1
  158. package/dist/scene/msdftext.js +2 -0
  159. package/dist/scene/msdftext.js.map +1 -1
  160. package/dist/scene/msdftextsprite.js +2 -0
  161. package/dist/scene/msdftextsprite.js.map +1 -1
  162. package/dist/scene/particlesys.js +2 -0
  163. package/dist/scene/particlesys.js.map +1 -1
  164. package/dist/scene/scene.js +34 -1
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/terrain-cm/grass.js +2 -1
  167. package/dist/scene/terrain-cm/grass.js.map +1 -1
  168. package/dist/scene/terrain-cm/terrain-cm.js +2 -0
  169. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  170. package/dist/scene/water.js +2 -0
  171. package/dist/scene/water.js.map +1 -1
  172. package/dist/shaders/atmosphere.js +5 -4
  173. package/dist/shaders/atmosphere.js.map +1 -1
  174. package/dist/shaders/fog.js +10 -3
  175. package/dist/shaders/fog.js.map +1 -1
  176. package/dist/shaders/shadow.js +96 -29
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shaders/ssgi.js +63 -0
  179. package/dist/shaders/ssgi.js.map +1 -0
  180. package/dist/shaders/ssgi_reprojection.js +118 -0
  181. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  182. package/dist/shaders/ssr.js +322 -154
  183. package/dist/shaders/ssr.js.map +1 -1
  184. package/dist/shadow/esm.js +13 -8
  185. package/dist/shadow/esm.js.map +1 -1
  186. package/dist/shadow/pcf_opt.js +15 -12
  187. package/dist/shadow/pcf_opt.js.map +1 -1
  188. package/dist/shadow/pcf_pd.js +15 -12
  189. package/dist/shadow/pcf_pd.js.map +1 -1
  190. package/dist/shadow/pcss.js +17 -11
  191. package/dist/shadow/pcss.js.map +1 -1
  192. package/dist/shadow/shadow_impl.js +20 -2
  193. package/dist/shadow/shadow_impl.js.map +1 -1
  194. package/dist/shadow/shadowmapper.js +10 -3
  195. package/dist/shadow/shadowmapper.js.map +1 -1
  196. package/dist/shadow/ssm.js +16 -13
  197. package/dist/shadow/ssm.js.map +1 -1
  198. package/dist/shadow/vsm.js +10 -8
  199. package/dist/shadow/vsm.js.map +1 -1
  200. package/dist/utility/physical.js +74 -0
  201. package/dist/utility/physical.js.map +1 -0
  202. package/dist/utility/rendermipmap.js +2 -2
  203. package/dist/utility/rendermipmap.js.map +1 -1
  204. package/dist/utility/serialization/manager.js +3 -1
  205. package/dist/utility/serialization/manager.js.map +1 -1
  206. package/dist/utility/serialization/scene/animation.js +3 -1
  207. package/dist/utility/serialization/scene/animation.js.map +1 -1
  208. package/dist/utility/serialization/scene/batch.js +3 -1
  209. package/dist/utility/serialization/scene/batch.js.map +1 -1
  210. package/dist/utility/serialization/scene/camera.js +598 -2
  211. package/dist/utility/serialization/scene/camera.js.map +1 -1
  212. package/dist/utility/serialization/scene/light.js +180 -9
  213. package/dist/utility/serialization/scene/light.js.map +1 -1
  214. package/dist/utility/serialization/scene/material.js +43 -3
  215. package/dist/utility/serialization/scene/material.js.map +1 -1
  216. package/dist/utility/serialization/scene/mesh.js +3 -1
  217. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  218. package/dist/utility/serialization/scene/node.js +3 -1
  219. package/dist/utility/serialization/scene/node.js.map +1 -1
  220. package/dist/utility/serialization/scene/particle.js +3 -1
  221. package/dist/utility/serialization/scene/particle.js.map +1 -1
  222. package/dist/utility/serialization/scene/primitive.js +2 -0
  223. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  224. package/dist/utility/serialization/scene/scene.js +70 -0
  225. package/dist/utility/serialization/scene/scene.js.map +1 -1
  226. package/dist/utility/serialization/scene/sprite.js +3 -1
  227. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  228. package/dist/utility/serialization/scene/terrain.js +3 -1
  229. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  230. package/dist/utility/serialization/scene/text.js +3 -0
  231. package/dist/utility/serialization/scene/text.js.map +1 -1
  232. package/dist/utility/serialization/scene/water.js +3 -1
  233. package/dist/utility/serialization/scene/water.js.map +1 -1
  234. package/dist/values.js +2 -3
  235. package/dist/values.js.map +1 -1
  236. package/package.json +3 -3
  237. package/dist/animation/joint_dynamics/convex_collider.js +0 -320
  238. package/dist/animation/joint_dynamics/convex_collider.js.map +0 -1
@@ -1,6 +1,7 @@
1
1
  import { Camera } from './camera.js';
2
2
  import { Matrix4x4 } from '@zephyr3d/base';
3
3
  import { getDevice, getEngine } from '../app/api.js';
4
+ import { calculateVerticalFov } from '../utility/physical.js';
4
5
 
5
6
  /**
6
7
  * Perspective camera class
@@ -12,6 +13,11 @@ import { getDevice, getEngine } from '../app/api.js';
12
13
  _aspect;
13
14
  _autoAspect;
14
15
  _window;
16
+ _projectionMode;
17
+ _focalLengthMm;
18
+ _sensorWidthMm;
19
+ _sensorHeightMm;
20
+ _sensorFit;
15
21
  /**
16
22
  * Creates an instance of PerspectiveCamera
17
23
  * @param scene - The scene that the camera belongs to.
@@ -27,8 +33,66 @@ import { getDevice, getEngine } from '../app/api.js';
27
33
  this._far = far;
28
34
  this._autoAspect = true;
29
35
  this._window = null;
36
+ this._projectionMode = 'fov';
37
+ this._focalLengthMm = 50;
38
+ this._sensorWidthMm = 36;
39
+ this._sensorHeightMm = 24;
40
+ this._sensorFit = 'horizontal';
30
41
  this._invalidate(true);
31
42
  }
43
+ /** Perspective projection parameterization. */ get projectionMode() {
44
+ return this._projectionMode;
45
+ }
46
+ set projectionMode(val) {
47
+ const mode = val === 'physical' ? 'physical' : 'fov';
48
+ if (mode !== this._projectionMode) {
49
+ this._projectionMode = mode;
50
+ this._invalidate(true);
51
+ }
52
+ }
53
+ /** Physical focal length in millimeters. */ get focalLengthMm() {
54
+ return this._focalLengthMm;
55
+ }
56
+ set focalLengthMm(val) {
57
+ const focalLength = Math.max(0.0001, val);
58
+ if (focalLength !== this._focalLengthMm) {
59
+ this._focalLengthMm = focalLength;
60
+ this._invalidate(true);
61
+ }
62
+ }
63
+ /** Physical sensor width in millimeters. */ get sensorWidthMm() {
64
+ return this._sensorWidthMm;
65
+ }
66
+ set sensorWidthMm(val) {
67
+ const width = Math.max(0.0001, val);
68
+ if (width !== this._sensorWidthMm) {
69
+ this._sensorWidthMm = width;
70
+ this._invalidate(true);
71
+ }
72
+ }
73
+ /** Physical sensor height in millimeters. */ get sensorHeightMm() {
74
+ return this._sensorHeightMm;
75
+ }
76
+ set sensorHeightMm(val) {
77
+ const height = Math.max(0.0001, val);
78
+ if (height !== this._sensorHeightMm) {
79
+ this._sensorHeightMm = height;
80
+ this._invalidate(true);
81
+ }
82
+ }
83
+ /** Sensor dimension kept fixed while fitting the viewport aspect ratio. */ get sensorFit() {
84
+ return this._sensorFit;
85
+ }
86
+ set sensorFit(val) {
87
+ const fit = val === 'vertical' ? 'vertical' : 'horizontal';
88
+ if (fit !== this._sensorFit) {
89
+ this._sensorFit = fit;
90
+ this._invalidate(true);
91
+ }
92
+ }
93
+ /** Effective vertical field of view used by the projection matrix. */ get effectiveFovY() {
94
+ return this._projectionMode === 'physical' ? calculateVerticalFov(this._focalLengthMm, this._sensorWidthMm, this._sensorHeightMm, this._aspect, this._sensorFit) : this._fovY;
95
+ }
32
96
  /** Sub-window of the frustum */ get window() {
33
97
  return this._window;
34
98
  }
@@ -94,6 +158,7 @@ import { getDevice, getEngine } from '../app/api.js';
94
158
  /**
95
159
  * {@inheritDoc Camera.setPerspective}
96
160
  */ setPerspective(fovY, aspect, zNear, zFar) {
161
+ this._projectionMode = 'fov';
97
162
  this._aspect = aspect;
98
163
  this._fovY = fovY;
99
164
  this._near = zNear;
@@ -118,6 +183,7 @@ import { getDevice, getEngine } from '../app/api.js';
118
183
  super.setProjectionMatrix(matrix);
119
184
  this._aspect = matrix.getAspect();
120
185
  this._fovY = matrix.getFov();
186
+ this._projectionMode = 'fov';
121
187
  this._near = matrix.getNearPlane();
122
188
  this._far = matrix.getFarPlane();
123
189
  } else {
@@ -132,10 +198,11 @@ import { getDevice, getEngine } from '../app/api.js';
132
198
  super.render(scene);
133
199
  }
134
200
  /** @internal */ _computeProj() {
201
+ const fovY = this.effectiveFovY;
135
202
  if (this.adapted) {
136
- this.calcAdaptedPerspectiveProjection(this._fovY, this._near, this._far, this._projMatrix);
203
+ this.calcAdaptedPerspectiveProjection(fovY, this._near, this._far, this._projMatrix);
137
204
  } else {
138
- const h = this._near * Math.tan(this._fovY * 0.5);
205
+ const h = this._near * Math.tan(fovY * 0.5);
139
206
  const w = h * this._aspect;
140
207
  let left = -w;
141
208
  let right = w;
@@ -1 +1 @@
1
- {"version":3,"file":"perspectivecamera.js","sources":["../../src/camera/perspectivecamera.ts"],"sourcesContent":["import { Camera } from './camera';\r\nimport type { Scene } from '../scene/scene';\r\nimport type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\nimport { getDevice, getEngine } from '../app/api';\r\n\r\n/**\r\n * Perspective camera class\r\n * @public\r\n */\r\nexport class PerspectiveCamera extends Camera {\r\n /** @internal */\r\n private _near: number;\r\n private _far: number;\r\n private _fovY: number;\r\n private _aspect: number;\r\n private _autoAspect: boolean;\r\n private _window: Nullable<number[]>;\r\n /**\r\n * Creates an instance of PerspectiveCamera\r\n * @param scene - The scene that the camera belongs to.\r\n * @param fovY - A radian value indicates the field of view in Y axis\r\n * @param aspect - Aspect ratio of the perspective transform\r\n * @param near - The near clip plane\r\n * @param far - The far clip plane\r\n */\r\n constructor(scene: Nullable<Scene>, fovY = Math.PI / 3, near = 1, far = 1000, aspect = 1) {\r\n super(scene);\r\n this._fovY = fovY;\r\n this._aspect = aspect;\r\n this._near = near;\r\n this._far = far;\r\n this._autoAspect = true;\r\n this._window = null;\r\n this._invalidate(true);\r\n }\r\n /** Sub-window of the frustum */\r\n get window(): Nullable<Immutable<number[]>> {\r\n return this._window;\r\n }\r\n set window(val: Nullable<number[]>) {\r\n this._window = val?.slice() ?? null;\r\n this._invalidate(true);\r\n }\r\n /** Automatically calculate aspect ratio before render according to current viewport */\r\n get autoAspect() {\r\n return this._autoAspect;\r\n }\r\n set autoAspect(val) {\r\n this._autoAspect = !!val;\r\n }\r\n /** The near clip plane */\r\n get near() {\r\n return this._near;\r\n }\r\n set near(val) {\r\n if (val !== this._near) {\r\n this._near = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The far clip plane */\r\n get far() {\r\n return this._far;\r\n }\r\n set far(val) {\r\n if (val !== this._far) {\r\n this._far = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Radian value indicates the field of view in Y axis */\r\n get fovY() {\r\n return this._fovY;\r\n }\r\n set fovY(val) {\r\n if (val !== this._fovY) {\r\n this._fovY = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Aspect ratio of the perspective transform */\r\n get aspect() {\r\n return this._aspect;\r\n }\r\n set aspect(val) {\r\n if (val !== this._aspect) {\r\n this._aspect = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Adjust aspect ratio according to viewport settings of the camera */\r\n adjustAspectRatio() {\r\n if (this.viewport) {\r\n this.aspect = this.viewport[2] / this.viewport[3];\r\n } else {\r\n if (!this.adapted || getDevice().getFramebuffer()) {\r\n const vp = getDevice().getViewport();\r\n this.aspect = vp.width / vp.height;\r\n } else {\r\n const transform = getEngine().screen.transform;\r\n this.aspect = transform.viewportWidth / transform.viewportHeight;\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Camera.setPerspective}\r\n */\r\n setPerspective(fovY: number, aspect: number, zNear: number, zFar: number) {\r\n this._aspect = aspect;\r\n this._fovY = fovY;\r\n this._near = zNear;\r\n this._far = zFar;\r\n this._invalidate(true);\r\n return this;\r\n }\r\n /**\r\n * Not valid for PerspectiveCamera\r\n *\r\n * @remarks\r\n * This method is only valid for {@link Camera} class or {@link OrthoCamera} class.\r\n */\r\n setOrtho(_left: number, _right: number, _bottom: number, _top: number, _near: number, _far: number): this {\r\n throw new Error(`setOrtho() not allowed on PerspectiveCamera`);\r\n }\r\n /**\r\n * Setup a projection matrix for the camera\r\n * @param matrix - The projection matrix\r\n */\r\n setProjectionMatrix(matrix: Matrix4x4) {\r\n if (matrix !== this._projMatrix) {\r\n if (matrix?.isPerspective()) {\r\n super.setProjectionMatrix(matrix);\r\n this._aspect = matrix.getAspect();\r\n this._fovY = matrix.getFov();\r\n this._near = matrix.getNearPlane();\r\n this._far = matrix.getFarPlane();\r\n } else {\r\n throw new Error(\r\n `PerspectiveCamera.setProjectionMatrix(): param is not a perspective projection matrix`\r\n );\r\n }\r\n }\r\n }\r\n /** {@inheritDoc Camera.render} */\r\n render(scene: Scene) {\r\n if (this._autoAspect) {\r\n this.adjustAspectRatio();\r\n }\r\n super.render(scene);\r\n }\r\n /** @internal */\r\n protected _computeProj() {\r\n if (this.adapted) {\r\n this.calcAdaptedPerspectiveProjection(this._fovY, this._near, this._far, this._projMatrix);\r\n } else {\r\n const h = this._near * Math.tan(this._fovY * 0.5);\r\n const w = h * this._aspect;\r\n let left = -w;\r\n let right = w;\r\n let top = h;\r\n let bottom = -h;\r\n if (this._window) {\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * this._window[0];\r\n bottom += height * this._window[1];\r\n right = left + width * this._window[2];\r\n top = bottom + height * this._window[3];\r\n }\r\n this._projMatrix.frustum(left, right, bottom, top, this._near, this._far);\r\n }\r\n Matrix4x4.invert(this._projMatrix, this._invProjMatrix);\r\n }\r\n}\r\n"],"names":["PerspectiveCamera","Camera","_far","_fovY","_aspect","_autoAspect","_window","scene","fovY","Math","PI","near","far","aspect","_near","_invalidate","window","val","slice","autoAspect","adjustAspectRatio","viewport","adapted","getDevice","getFramebuffer","vp","getViewport","width","height","transform","getEngine","screen","viewportWidth","viewportHeight","setPerspective","zNear","zFar","setOrtho","_left","_right","_bottom","_top","Error","setProjectionMatrix","matrix","_projMatrix","isPerspective","getAspect","getFov","getNearPlane","getFarPlane","render","calcAdaptedPerspectiveProjection","h","tan","w","left","right","top","bottom","frustum","Matrix4x4","invert","_invProjMatrix"],"mappings":"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"}
1
+ {"version":3,"file":"perspectivecamera.js","sources":["../../src/camera/perspectivecamera.ts"],"sourcesContent":["import { Camera } from './camera';\r\nimport type { Scene } from '../scene/scene';\r\nimport type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\nimport { getDevice, getEngine } from '../app/api';\r\nimport { calculateVerticalFov } from '../utility/physical';\r\nimport type { CameraProjectionMode, CameraSensorFit } from '../utility/physical';\r\n\r\n/**\r\n * Perspective camera class\r\n * @public\r\n */\r\nexport class PerspectiveCamera extends Camera {\r\n /** @internal */\r\n private _near: number;\r\n private _far: number;\r\n private _fovY: number;\r\n private _aspect: number;\r\n private _autoAspect: boolean;\r\n private _window: Nullable<number[]>;\r\n private _projectionMode: CameraProjectionMode;\r\n private _focalLengthMm: number;\r\n private _sensorWidthMm: number;\r\n private _sensorHeightMm: number;\r\n private _sensorFit: CameraSensorFit;\r\n /**\r\n * Creates an instance of PerspectiveCamera\r\n * @param scene - The scene that the camera belongs to.\r\n * @param fovY - A radian value indicates the field of view in Y axis\r\n * @param aspect - Aspect ratio of the perspective transform\r\n * @param near - The near clip plane\r\n * @param far - The far clip plane\r\n */\r\n constructor(scene: Nullable<Scene>, fovY = Math.PI / 3, near = 1, far = 1000, aspect = 1) {\r\n super(scene);\r\n this._fovY = fovY;\r\n this._aspect = aspect;\r\n this._near = near;\r\n this._far = far;\r\n this._autoAspect = true;\r\n this._window = null;\r\n this._projectionMode = 'fov';\r\n this._focalLengthMm = 50;\r\n this._sensorWidthMm = 36;\r\n this._sensorHeightMm = 24;\r\n this._sensorFit = 'horizontal';\r\n this._invalidate(true);\r\n }\r\n /** Perspective projection parameterization. */\r\n get projectionMode() {\r\n return this._projectionMode;\r\n }\r\n set projectionMode(val: CameraProjectionMode) {\r\n const mode = val === 'physical' ? 'physical' : 'fov';\r\n if (mode !== this._projectionMode) {\r\n this._projectionMode = mode;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Physical focal length in millimeters. */\r\n get focalLengthMm() {\r\n return this._focalLengthMm;\r\n }\r\n set focalLengthMm(val: number) {\r\n const focalLength = Math.max(0.0001, val);\r\n if (focalLength !== this._focalLengthMm) {\r\n this._focalLengthMm = focalLength;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Physical sensor width in millimeters. */\r\n get sensorWidthMm() {\r\n return this._sensorWidthMm;\r\n }\r\n set sensorWidthMm(val: number) {\r\n const width = Math.max(0.0001, val);\r\n if (width !== this._sensorWidthMm) {\r\n this._sensorWidthMm = width;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Physical sensor height in millimeters. */\r\n get sensorHeightMm() {\r\n return this._sensorHeightMm;\r\n }\r\n set sensorHeightMm(val: number) {\r\n const height = Math.max(0.0001, val);\r\n if (height !== this._sensorHeightMm) {\r\n this._sensorHeightMm = height;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Sensor dimension kept fixed while fitting the viewport aspect ratio. */\r\n get sensorFit() {\r\n return this._sensorFit;\r\n }\r\n set sensorFit(val: CameraSensorFit) {\r\n const fit = val === 'vertical' ? 'vertical' : 'horizontal';\r\n if (fit !== this._sensorFit) {\r\n this._sensorFit = fit;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Effective vertical field of view used by the projection matrix. */\r\n get effectiveFovY() {\r\n return this._projectionMode === 'physical'\r\n ? calculateVerticalFov(\r\n this._focalLengthMm,\r\n this._sensorWidthMm,\r\n this._sensorHeightMm,\r\n this._aspect,\r\n this._sensorFit\r\n )\r\n : this._fovY;\r\n }\r\n /** Sub-window of the frustum */\r\n get window(): Nullable<Immutable<number[]>> {\r\n return this._window;\r\n }\r\n set window(val: Nullable<number[]>) {\r\n this._window = val?.slice() ?? null;\r\n this._invalidate(true);\r\n }\r\n /** Automatically calculate aspect ratio before render according to current viewport */\r\n get autoAspect() {\r\n return this._autoAspect;\r\n }\r\n set autoAspect(val) {\r\n this._autoAspect = !!val;\r\n }\r\n /** The near clip plane */\r\n get near() {\r\n return this._near;\r\n }\r\n set near(val) {\r\n if (val !== this._near) {\r\n this._near = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The far clip plane */\r\n get far() {\r\n return this._far;\r\n }\r\n set far(val) {\r\n if (val !== this._far) {\r\n this._far = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Radian value indicates the field of view in Y axis */\r\n get fovY() {\r\n return this._fovY;\r\n }\r\n set fovY(val) {\r\n if (val !== this._fovY) {\r\n this._fovY = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Aspect ratio of the perspective transform */\r\n get aspect() {\r\n return this._aspect;\r\n }\r\n set aspect(val) {\r\n if (val !== this._aspect) {\r\n this._aspect = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Adjust aspect ratio according to viewport settings of the camera */\r\n adjustAspectRatio() {\r\n if (this.viewport) {\r\n this.aspect = this.viewport[2] / this.viewport[3];\r\n } else {\r\n if (!this.adapted || getDevice().getFramebuffer()) {\r\n const vp = getDevice().getViewport();\r\n this.aspect = vp.width / vp.height;\r\n } else {\r\n const transform = getEngine().screen.transform;\r\n this.aspect = transform.viewportWidth / transform.viewportHeight;\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Camera.setPerspective}\r\n */\r\n setPerspective(fovY: number, aspect: number, zNear: number, zFar: number) {\r\n this._projectionMode = 'fov';\r\n this._aspect = aspect;\r\n this._fovY = fovY;\r\n this._near = zNear;\r\n this._far = zFar;\r\n this._invalidate(true);\r\n return this;\r\n }\r\n /**\r\n * Not valid for PerspectiveCamera\r\n *\r\n * @remarks\r\n * This method is only valid for {@link Camera} class or {@link OrthoCamera} class.\r\n */\r\n setOrtho(_left: number, _right: number, _bottom: number, _top: number, _near: number, _far: number): this {\r\n throw new Error(`setOrtho() not allowed on PerspectiveCamera`);\r\n }\r\n /**\r\n * Setup a projection matrix for the camera\r\n * @param matrix - The projection matrix\r\n */\r\n setProjectionMatrix(matrix: Matrix4x4) {\r\n if (matrix !== this._projMatrix) {\r\n if (matrix?.isPerspective()) {\r\n super.setProjectionMatrix(matrix);\r\n this._aspect = matrix.getAspect();\r\n this._fovY = matrix.getFov();\r\n this._projectionMode = 'fov';\r\n this._near = matrix.getNearPlane();\r\n this._far = matrix.getFarPlane();\r\n } else {\r\n throw new Error(\r\n `PerspectiveCamera.setProjectionMatrix(): param is not a perspective projection matrix`\r\n );\r\n }\r\n }\r\n }\r\n /** {@inheritDoc Camera.render} */\r\n render(scene: Scene) {\r\n if (this._autoAspect) {\r\n this.adjustAspectRatio();\r\n }\r\n super.render(scene);\r\n }\r\n /** @internal */\r\n protected _computeProj() {\r\n const fovY = this.effectiveFovY;\r\n if (this.adapted) {\r\n this.calcAdaptedPerspectiveProjection(fovY, this._near, this._far, this._projMatrix);\r\n } else {\r\n const h = this._near * Math.tan(fovY * 0.5);\r\n const w = h * this._aspect;\r\n let left = -w;\r\n let right = w;\r\n let top = h;\r\n let bottom = -h;\r\n if (this._window) {\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * this._window[0];\r\n bottom += height * this._window[1];\r\n right = left + width * this._window[2];\r\n top = bottom + height * this._window[3];\r\n }\r\n this._projMatrix.frustum(left, right, bottom, top, this._near, this._far);\r\n }\r\n Matrix4x4.invert(this._projMatrix, this._invProjMatrix);\r\n }\r\n}\r\n"],"names":["PerspectiveCamera","Camera","_far","_fovY","_aspect","_autoAspect","_window","_projectionMode","_focalLengthMm","_sensorWidthMm","_sensorHeightMm","_sensorFit","scene","fovY","Math","PI","near","far","aspect","_near","_invalidate","projectionMode","val","mode","focalLengthMm","focalLength","max","sensorWidthMm","width","sensorHeightMm","height","sensorFit","fit","effectiveFovY","calculateVerticalFov","window","slice","autoAspect","adjustAspectRatio","viewport","adapted","getDevice","getFramebuffer","vp","getViewport","transform","getEngine","screen","viewportWidth","viewportHeight","setPerspective","zNear","zFar","setOrtho","_left","_right","_bottom","_top","Error","setProjectionMatrix","matrix","_projMatrix","isPerspective","getAspect","getFov","getNearPlane","getFarPlane","render","calcAdaptedPerspectiveProjection","h","tan","w","left","right","top","bottom","frustum","Matrix4x4","invert","_invProjMatrix"],"mappings":"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"}