@zephyr3d/scene 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/dist/animation/animation.js +4 -33
  2. package/dist/animation/animation.js.map +1 -1
  3. package/dist/animation/animationset.js +24 -11
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js +1 -0
  6. package/dist/animation/animationtrack.js.map +1 -1
  7. package/dist/animation/eulerrotationtrack.js +0 -1
  8. package/dist/animation/eulerrotationtrack.js.map +1 -1
  9. package/dist/animation/ik/ccd_solver.js +372 -0
  10. package/dist/animation/ik/ccd_solver.js.map +1 -0
  11. package/dist/animation/ik/fabrik_solver.js +399 -0
  12. package/dist/animation/ik/fabrik_solver.js.map +1 -0
  13. package/dist/animation/ik/ik_angle_constraint.js +181 -0
  14. package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
  15. package/dist/animation/ik/ik_chain.js +163 -0
  16. package/dist/animation/ik/ik_chain.js.map +1 -0
  17. package/dist/animation/ik/ik_chain_builder.js +68 -0
  18. package/dist/animation/ik/ik_chain_builder.js.map +1 -0
  19. package/dist/animation/ik/ik_constraint.js +25 -0
  20. package/dist/animation/ik/ik_constraint.js.map +1 -0
  21. package/dist/animation/ik/ik_pole_constraint.js +123 -0
  22. package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
  23. package/dist/animation/ik/ik_solver.js +48 -0
  24. package/dist/animation/ik/ik_solver.js.map +1 -0
  25. package/dist/animation/ik/ik_track.js +96 -0
  26. package/dist/animation/ik/ik_track.js.map +1 -0
  27. package/dist/animation/ik/ik_utils.js +270 -0
  28. package/dist/animation/ik/ik_utils.js.map +1 -0
  29. package/dist/animation/ik/two_bone_ik_solver.js +332 -0
  30. package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
  31. package/dist/animation/ik_modifier.js +61 -0
  32. package/dist/animation/ik_modifier.js.map +1 -0
  33. package/dist/animation/ik_postprocessor.js +71 -0
  34. package/dist/animation/ik_postprocessor.js.map +1 -0
  35. package/dist/animation/manual_transform_processor.js +156 -0
  36. package/dist/animation/manual_transform_processor.js.map +1 -0
  37. package/dist/animation/morphtarget.js +7 -1
  38. package/dist/animation/morphtarget.js.map +1 -1
  39. package/dist/animation/morphtrack.js +3 -3
  40. package/dist/animation/morphtrack.js.map +1 -1
  41. package/dist/animation/proptrack.js +37 -41
  42. package/dist/animation/proptrack.js.map +1 -1
  43. package/dist/animation/rotationtrack.js +0 -1
  44. package/dist/animation/rotationtrack.js.map +1 -1
  45. package/dist/animation/scaletrack.js +0 -1
  46. package/dist/animation/scaletrack.js.map +1 -1
  47. package/dist/animation/skeleton.js +57 -60
  48. package/dist/animation/skeleton.js.map +1 -1
  49. package/dist/animation/skeleton_modifier.js +38 -0
  50. package/dist/animation/skeleton_modifier.js.map +1 -0
  51. package/dist/animation/skeleton_postprocessor.js +50 -0
  52. package/dist/animation/skeleton_postprocessor.js.map +1 -0
  53. package/dist/animation/spring/multi_chain_spring_system.js +503 -0
  54. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
  55. package/dist/animation/spring/spring_chain.js +103 -0
  56. package/dist/animation/spring/spring_chain.js.map +1 -0
  57. package/dist/animation/spring/spring_collider.js +247 -0
  58. package/dist/animation/spring/spring_collider.js.map +1 -0
  59. package/dist/animation/spring/spring_constraint.js +21 -0
  60. package/dist/animation/spring/spring_constraint.js.map +1 -0
  61. package/dist/animation/spring/spring_particle.js +20 -0
  62. package/dist/animation/spring/spring_particle.js.map +1 -0
  63. package/dist/animation/spring/spring_system.js +526 -0
  64. package/dist/animation/spring/spring_system.js.map +1 -0
  65. package/dist/animation/spring_modifier.js +45 -0
  66. package/dist/animation/spring_modifier.js.map +1 -0
  67. package/dist/animation/spring_postprocessor.js +54 -0
  68. package/dist/animation/spring_postprocessor.js.map +1 -0
  69. package/dist/animation/translationtrack.js +0 -1
  70. package/dist/animation/translationtrack.js.map +1 -1
  71. package/dist/app/api.js +13 -4
  72. package/dist/app/api.js.map +1 -1
  73. package/dist/app/app.js +13 -1
  74. package/dist/app/app.js.map +1 -1
  75. package/dist/app/engine.js +33 -45
  76. package/dist/app/engine.js.map +1 -1
  77. package/dist/app/inputmgr.js.map +1 -1
  78. package/dist/app/runtimescript.js.map +1 -1
  79. package/dist/app/screen.js +318 -0
  80. package/dist/app/screen.js.map +1 -0
  81. package/dist/app/scriptingsystem.js +10 -6
  82. package/dist/app/scriptingsystem.js.map +1 -1
  83. package/dist/app/scriptregistry.js +11 -22
  84. package/dist/app/scriptregistry.js.map +1 -1
  85. package/dist/asset/assetmanager.js +79 -58
  86. package/dist/asset/assetmanager.js.map +1 -1
  87. package/dist/asset/builtin.js +5 -5
  88. package/dist/asset/builtin.js.map +1 -1
  89. package/dist/asset/loaders/dds/dds.js +6 -2
  90. package/dist/asset/loaders/dds/dds.js.map +1 -1
  91. package/dist/asset/loaders/dds/dds_loader.js +1 -1
  92. package/dist/asset/loaders/dds/dds_loader.js.map +1 -1
  93. package/dist/asset/loaders/gltf/gltf_loader.js +14 -6
  94. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  95. package/dist/asset/loaders/gltf/helpers.js +6 -2
  96. package/dist/asset/loaders/gltf/helpers.js.map +1 -1
  97. package/dist/asset/loaders/hdr/hdr.js +22 -15
  98. package/dist/asset/loaders/hdr/hdr.js.map +1 -1
  99. package/dist/asset/loaders/image/tga_Loader.js +2 -1
  100. package/dist/asset/loaders/image/tga_Loader.js.map +1 -1
  101. package/dist/asset/loaders/image/webimage_loader.js.map +1 -1
  102. package/dist/asset/loaders/loader.js +2 -2
  103. package/dist/asset/loaders/loader.js.map +1 -1
  104. package/dist/asset/model.js +9 -5
  105. package/dist/asset/model.js.map +1 -1
  106. package/dist/blitter/bilateralblur.js.map +1 -1
  107. package/dist/blitter/blitter.js +9 -11
  108. package/dist/blitter/blitter.js.map +1 -1
  109. package/dist/blitter/box.js +0 -1
  110. package/dist/blitter/box.js.map +1 -1
  111. package/dist/blitter/copy.js.map +1 -1
  112. package/dist/blitter/gaussianblur.js.map +1 -1
  113. package/dist/camera/base.js +1 -3
  114. package/dist/camera/base.js.map +1 -1
  115. package/dist/camera/camera.js +121 -37
  116. package/dist/camera/camera.js.map +1 -1
  117. package/dist/camera/fps.js +19 -17
  118. package/dist/camera/fps.js.map +1 -1
  119. package/dist/camera/orbit.js +45 -43
  120. package/dist/camera/orbit.js.map +1 -1
  121. package/dist/camera/orthocamera.js +27 -21
  122. package/dist/camera/orthocamera.js.map +1 -1
  123. package/dist/camera/perspectivecamera.js +28 -19
  124. package/dist/camera/perspectivecamera.js.map +1 -1
  125. package/dist/index.d.ts +15802 -15577
  126. package/dist/index.js +33 -11
  127. package/dist/index.js.map +1 -1
  128. package/dist/material/blinn.js.map +1 -1
  129. package/dist/material/grassmaterial.js.map +1 -1
  130. package/dist/material/lambert.js.map +1 -1
  131. package/dist/material/material.js +11 -5
  132. package/dist/material/material.js.map +1 -1
  133. package/dist/material/meshmaterial.js +10 -9
  134. package/dist/material/meshmaterial.js.map +1 -1
  135. package/dist/material/mixins/albedocolor.js.map +1 -1
  136. package/dist/material/mixins/foliage.js.map +1 -1
  137. package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
  138. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  139. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  140. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +7 -0
  141. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  142. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  143. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  144. package/dist/material/mixins/lit.js +3 -3
  145. package/dist/material/mixins/lit.js.map +1 -1
  146. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  147. package/dist/material/mixins/pbr/common.js.map +1 -1
  148. package/dist/material/mixins/texture.js +3 -0
  149. package/dist/material/mixins/texture.js.map +1 -1
  150. package/dist/material/mixins/vertexcolor.js.map +1 -1
  151. package/dist/material/particle.js.map +1 -1
  152. package/dist/material/pbrblueprint.js +180 -22
  153. package/dist/material/pbrblueprint.js.map +1 -1
  154. package/dist/material/pbrmr.js.map +1 -1
  155. package/dist/material/pbrsg.js.map +1 -1
  156. package/dist/material/shader/helper.js +41 -56
  157. package/dist/material/shader/helper.js.map +1 -1
  158. package/dist/material/sprite.js +301 -0
  159. package/dist/material/sprite.js.map +1 -0
  160. package/dist/material/sprite3d.js +301 -0
  161. package/dist/material/sprite3d.js.map +1 -0
  162. package/dist/material/sprite3d_std.js +116 -0
  163. package/dist/material/sprite3d_std.js.map +1 -0
  164. package/dist/material/sprite3dblueprint.js +235 -0
  165. package/dist/material/sprite3dblueprint.js.map +1 -0
  166. package/dist/material/sprite_std.js +116 -0
  167. package/dist/material/sprite_std.js.map +1 -0
  168. package/dist/material/spriteblueprint.js +235 -0
  169. package/dist/material/spriteblueprint.js.map +1 -0
  170. package/dist/material/terrain-cm.js +0 -1
  171. package/dist/material/terrain-cm.js.map +1 -1
  172. package/dist/material/unlit.js.map +1 -1
  173. package/dist/material/water.js.map +1 -1
  174. package/dist/posteffect/bloom.js.map +1 -1
  175. package/dist/posteffect/compositor.js.map +1 -1
  176. package/dist/posteffect/fxaa.js.map +1 -1
  177. package/dist/posteffect/grayscale.js.map +1 -1
  178. package/dist/posteffect/motionblur.js.map +1 -1
  179. package/dist/posteffect/posteffect.js.map +1 -1
  180. package/dist/posteffect/sao.js.map +1 -1
  181. package/dist/posteffect/ssr.js +7 -5
  182. package/dist/posteffect/ssr.js.map +1 -1
  183. package/dist/posteffect/taa.js.map +1 -1
  184. package/dist/posteffect/tonemap.js.map +1 -1
  185. package/dist/render/abuffer_oit.js +8 -6
  186. package/dist/render/abuffer_oit.js.map +1 -1
  187. package/dist/render/clipmap.js +0 -10
  188. package/dist/render/clipmap.js.map +1 -1
  189. package/dist/render/cluster_light.js +4 -4
  190. package/dist/render/cluster_light.js.map +1 -1
  191. package/dist/render/cull_visitor.js +15 -17
  192. package/dist/render/cull_visitor.js.map +1 -1
  193. package/dist/render/depthpass.js +3 -4
  194. package/dist/render/depthpass.js.map +1 -1
  195. package/dist/render/drawable.js +15 -0
  196. package/dist/render/drawable.js.map +1 -0
  197. package/dist/render/drawable_mixin.js +8 -4
  198. package/dist/render/drawable_mixin.js.map +1 -1
  199. package/dist/render/envlight.js.map +1 -1
  200. package/dist/render/fbm_wavegenerator.js +3 -1
  201. package/dist/render/fbm_wavegenerator.js.map +1 -1
  202. package/dist/render/fft_wavegenerator.js +67 -64
  203. package/dist/render/fft_wavegenerator.js.map +1 -1
  204. package/dist/render/fullscreenquad.js.map +1 -1
  205. package/dist/render/gerstner_wavegenerator.js +3 -1
  206. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  207. package/dist/render/globalbindgroup_allocator.js +3 -1
  208. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  209. package/dist/render/hzb.js +1 -2
  210. package/dist/render/hzb.js.map +1 -1
  211. package/dist/render/lightpass.js +13 -13
  212. package/dist/render/lightpass.js.map +1 -1
  213. package/dist/render/objectcolorpass.js +4 -7
  214. package/dist/render/objectcolorpass.js.map +1 -1
  215. package/dist/render/primitive.js +4 -5
  216. package/dist/render/primitive.js.map +1 -1
  217. package/dist/render/render_queue.js +10 -5
  218. package/dist/render/render_queue.js.map +1 -1
  219. package/dist/render/renderer.js +16 -22
  220. package/dist/render/renderer.js.map +1 -1
  221. package/dist/render/renderpass.js +27 -52
  222. package/dist/render/renderpass.js.map +1 -1
  223. package/dist/render/rendertarget.js +5 -0
  224. package/dist/render/rendertarget.js.map +1 -0
  225. package/dist/render/screenrendertarget.js +56 -0
  226. package/dist/render/screenrendertarget.js.map +1 -0
  227. package/dist/render/shadowmap_pass.js +4 -5
  228. package/dist/render/shadowmap_pass.js.map +1 -1
  229. package/dist/render/sky.js +16 -14
  230. package/dist/render/sky.js.map +1 -1
  231. package/dist/render/weightedblended_oit.js.map +1 -1
  232. package/dist/scene/basesprite.js +296 -0
  233. package/dist/scene/basesprite.js.map +1 -0
  234. package/dist/scene/batchgroup.js +4 -2
  235. package/dist/scene/batchgroup.js.map +1 -1
  236. package/dist/scene/environment.js +9 -10
  237. package/dist/scene/environment.js.map +1 -1
  238. package/dist/scene/graph_node.js.map +1 -1
  239. package/dist/scene/light.js +22 -4
  240. package/dist/scene/light.js.map +1 -1
  241. package/dist/scene/mesh.js +96 -26
  242. package/dist/scene/mesh.js.map +1 -1
  243. package/dist/scene/octree.js.map +1 -1
  244. package/dist/scene/particlesys.js +25 -22
  245. package/dist/scene/particlesys.js.map +1 -1
  246. package/dist/scene/raycast_visitor.js +0 -16
  247. package/dist/scene/raycast_visitor.js.map +1 -1
  248. package/dist/scene/scene.js +7 -4
  249. package/dist/scene/scene.js.map +1 -1
  250. package/dist/scene/scene_node.js +20 -35
  251. package/dist/scene/scene_node.js.map +1 -1
  252. package/dist/scene/sprite.js +18 -0
  253. package/dist/scene/sprite.js.map +1 -0
  254. package/dist/scene/sprite3d.js +18 -0
  255. package/dist/scene/sprite3d.js.map +1 -0
  256. package/dist/scene/terrain-cm/grass.js +5 -4
  257. package/dist/scene/terrain-cm/grass.js.map +1 -1
  258. package/dist/scene/terrain-cm/grassmaterial.js +3 -1
  259. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  260. package/dist/scene/terrain-cm/terrain-cm.js +65 -48
  261. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  262. package/dist/scene/water.js +35 -30
  263. package/dist/scene/water.js.map +1 -1
  264. package/dist/shaders/atmosphere.js +17 -29
  265. package/dist/shaders/atmosphere.js.map +1 -1
  266. package/dist/shaders/fog.js.map +1 -1
  267. package/dist/shaders/misc.js.map +1 -1
  268. package/dist/shaders/noise.js.map +1 -1
  269. package/dist/shaders/pbr.js.map +1 -1
  270. package/dist/shaders/shadow.js.map +1 -1
  271. package/dist/shaders/ssr.js.map +1 -1
  272. package/dist/shaders/temporal.js.map +1 -1
  273. package/dist/shaders/water.js.map +1 -1
  274. package/dist/shadow/esm.js +1 -1
  275. package/dist/shadow/esm.js.map +1 -1
  276. package/dist/shadow/pcf_opt.js.map +1 -1
  277. package/dist/shadow/pcf_pd.js.map +1 -1
  278. package/dist/shadow/shader.js +3 -1
  279. package/dist/shadow/shader.js.map +1 -1
  280. package/dist/shadow/shadow_impl.js.map +1 -1
  281. package/dist/shadow/shadowmapper.js +6 -18
  282. package/dist/shadow/shadowmapper.js.map +1 -1
  283. package/dist/shadow/ssm.js.map +1 -1
  284. package/dist/shadow/vsm.js.map +1 -1
  285. package/dist/shapes/box.js +9 -3
  286. package/dist/shapes/box.js.map +1 -1
  287. package/dist/shapes/cylinder.js +2 -2
  288. package/dist/shapes/cylinder.js.map +1 -1
  289. package/dist/shapes/plane.js +2 -2
  290. package/dist/shapes/plane.js.map +1 -1
  291. package/dist/shapes/shape.js +2 -1
  292. package/dist/shapes/shape.js.map +1 -1
  293. package/dist/shapes/sphere.js +2 -2
  294. package/dist/shapes/sphere.js.map +1 -1
  295. package/dist/shapes/tetrahedron.js +5 -6
  296. package/dist/shapes/tetrahedron.js.map +1 -1
  297. package/dist/shapes/torus.js +2 -2
  298. package/dist/shapes/torus.js.map +1 -1
  299. package/dist/utility/aabbtree.js +1 -1
  300. package/dist/utility/aabbtree.js.map +1 -1
  301. package/dist/utility/blueprint/common/constants.js +578 -104
  302. package/dist/utility/blueprint/common/constants.js.map +1 -1
  303. package/dist/utility/blueprint/common/math.js +471 -9
  304. package/dist/utility/blueprint/common/math.js.map +1 -1
  305. package/dist/utility/blueprint/common.js +1 -1
  306. package/dist/utility/blueprint/common.js.map +1 -1
  307. package/dist/utility/blueprint/material/func.js +9 -5
  308. package/dist/utility/blueprint/material/func.js.map +1 -1
  309. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  310. package/dist/utility/blueprint/material/ir.js +288 -80
  311. package/dist/utility/blueprint/material/ir.js.map +1 -1
  312. package/dist/utility/blueprint/material/pbr.js +92 -4
  313. package/dist/utility/blueprint/material/pbr.js.map +1 -1
  314. package/dist/utility/blueprint/material/texture.js +62 -45
  315. package/dist/utility/blueprint/material/texture.js.map +1 -1
  316. package/dist/utility/blueprint/node.js +28 -1
  317. package/dist/utility/blueprint/node.js.map +1 -1
  318. package/dist/utility/bounding_volume.js.map +1 -1
  319. package/dist/utility/debug.js.map +1 -1
  320. package/dist/utility/draco/decoder.js.map +1 -1
  321. package/dist/utility/misc.js +1 -1
  322. package/dist/utility/misc.js.map +1 -1
  323. package/dist/utility/panorama.js.map +1 -1
  324. package/dist/utility/pmrem.js.map +1 -1
  325. package/dist/utility/rendermipmap.js.map +1 -1
  326. package/dist/utility/serialization/json.js +19 -15
  327. package/dist/utility/serialization/json.js.map +1 -1
  328. package/dist/utility/serialization/manager.js +89 -22
  329. package/dist/utility/serialization/manager.js.map +1 -1
  330. package/dist/utility/serialization/scene/animation.js +44 -41
  331. package/dist/utility/serialization/scene/animation.js.map +1 -1
  332. package/dist/utility/serialization/scene/batch.js +4 -3
  333. package/dist/utility/serialization/scene/batch.js.map +1 -1
  334. package/dist/utility/serialization/scene/camera.js +97 -9
  335. package/dist/utility/serialization/scene/camera.js.map +1 -1
  336. package/dist/utility/serialization/scene/common.js +102 -28
  337. package/dist/utility/serialization/scene/common.js.map +1 -1
  338. package/dist/utility/serialization/scene/light.js +14 -12
  339. package/dist/utility/serialization/scene/light.js.map +1 -1
  340. package/dist/utility/serialization/scene/material.js +216 -26
  341. package/dist/utility/serialization/scene/material.js.map +1 -1
  342. package/dist/utility/serialization/scene/mesh.js +71 -100
  343. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  344. package/dist/utility/serialization/scene/misc.js +3 -2
  345. package/dist/utility/serialization/scene/misc.js.map +1 -1
  346. package/dist/utility/serialization/scene/node.js +42 -9
  347. package/dist/utility/serialization/scene/node.js.map +1 -1
  348. package/dist/utility/serialization/scene/particle.js +7 -5
  349. package/dist/utility/serialization/scene/particle.js.map +1 -1
  350. package/dist/utility/serialization/scene/primitive.js +18 -15
  351. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  352. package/dist/utility/serialization/scene/scene.js +3 -2
  353. package/dist/utility/serialization/scene/scene.js.map +1 -1
  354. package/dist/utility/serialization/scene/sprite.js +164 -0
  355. package/dist/utility/serialization/scene/sprite.js.map +1 -0
  356. package/dist/utility/serialization/scene/terrain.js +8 -6
  357. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  358. package/dist/utility/serialization/scene/water.js +11 -9
  359. package/dist/utility/serialization/scene/water.js.map +1 -1
  360. package/dist/utility/serialization/types.js +6 -0
  361. package/dist/utility/serialization/types.js.map +1 -0
  362. package/dist/utility/shprojector.js.map +1 -1
  363. package/dist/utility/textures/ggxlut.js.map +1 -1
  364. package/dist/utility/textures/gradientnoise.js.map +1 -1
  365. package/dist/utility/textures/randomnoise.js.map +1 -1
  366. package/dist/values.js +14 -14
  367. package/dist/values.js.map +1 -1
  368. package/package.json +80 -80
@@ -182,14 +182,17 @@ import { BaseCameraController } from './base.js';
182
182
  }
183
183
  }
184
184
  lookAt(from, to, up) {
185
- this.eyePos.set(from);
186
- this.options.center.set(to);
187
- this.upVector.set(up);
188
- this._getCamera().lookAt(this.eyePos, this.options.center, this.upVector);
189
- Vector3.sub(this.eyePos, this.options.center, this.direction);
190
- this.direction.inplaceNormalize();
191
- const mat = this._getCamera().localMatrix;
192
- this.xVector.setXYZ(mat[0], mat[1], mat[2]);
185
+ const camera = this._getCamera();
186
+ if (camera) {
187
+ this.eyePos.set(from);
188
+ this.options.center.set(to);
189
+ this.upVector.set(up);
190
+ camera.lookAt(this.eyePos, this.options.center, this.upVector);
191
+ Vector3.sub(this.eyePos, this.options.center, this.direction);
192
+ this.direction.inplaceNormalize();
193
+ const mat = camera.localMatrix;
194
+ this.xVector.setXYZ(mat[0], mat[1], mat[2]);
195
+ }
193
196
  }
194
197
  /**
195
198
  * Set options
@@ -202,44 +205,43 @@ import { BaseCameraController } from './base.js';
202
205
  * {@inheritDoc BaseCameraController.update}
203
206
  * @override
204
207
  */ update() {
205
- if (this._getCamera()) {
206
- const center = this.options.center;
207
- if (Math.abs(this.panVelocityX) > 0.0001 || Math.abs(this.panVelocityY) > 0.0001) {
208
- const right = this.xVector;
209
- const up = this.upVector;
210
- center.combineBy(right, 1, this.panVelocityX);
211
- center.combineBy(up, 1, this.panVelocityY);
212
- this.eyePos.combineBy(right, 1, this.panVelocityX);
213
- this.eyePos.combineBy(up, 1, this.panVelocityY);
214
- this.panVelocityX *= 1 - this.options.damping;
215
- this.panVelocityY *= 1 - this.options.damping;
216
- if (Math.abs(this.panVelocityX) < 0.0001) {
217
- this.panVelocityX = 0;
218
- }
219
- if (Math.abs(this.panVelocityY) < 0.0001) {
220
- this.panVelocityY = 0;
221
- }
208
+ const camera = this._getCamera();
209
+ const center = this.options.center;
210
+ if (Math.abs(this.panVelocityX) > 0.0001 || Math.abs(this.panVelocityY) > 0.0001) {
211
+ const right = this.xVector;
212
+ const up = this.upVector;
213
+ center.combineBy(right, 1, this.panVelocityX);
214
+ center.combineBy(up, 1, this.panVelocityY);
215
+ this.eyePos.combineBy(right, 1, this.panVelocityX);
216
+ this.eyePos.combineBy(up, 1, this.panVelocityY);
217
+ this.panVelocityX *= 1 - this.options.damping;
218
+ this.panVelocityY *= 1 - this.options.damping;
219
+ if (Math.abs(this.panVelocityX) < 0.0001) {
220
+ this.panVelocityX = 0;
221
+ }
222
+ if (Math.abs(this.panVelocityY) < 0.0001) {
223
+ this.panVelocityY = 0;
224
+ }
225
+ }
226
+ if (Math.abs(this.rotateX) > 0.0001 || Math.abs(this.rotateY) > 0.0001) {
227
+ Quaternion.fromAxisAngle(this.xVector, this.rotateX, this.quat);
228
+ this.quat.transform(this.eyePos.subBy(center), this.eyePos);
229
+ Quaternion.fromEulerAngle(0, this.rotateY, 0, 'ZYX', this.quat);
230
+ this.quat.transform(this.eyePos, this.eyePos);
231
+ this.quat.transform(this.xVector, this.xVector).inplaceNormalize();
232
+ Vector3.normalize(this.eyePos, this.direction).inplaceNormalize();
233
+ Vector3.cross(this.direction, this.xVector, this.upVector).inplaceNormalize();
234
+ this.eyePos.addBy(center);
235
+ this.rotateX *= 1 - this.options.damping;
236
+ this.rotateY *= 1 - this.options.damping;
237
+ if (Math.abs(this.rotateX) < 0.0001) {
238
+ this.rotateX = 0;
222
239
  }
223
- if (Math.abs(this.rotateX) > 0.0001 || Math.abs(this.rotateY) > 0.0001) {
224
- Quaternion.fromAxisAngle(this.xVector, this.rotateX, this.quat);
225
- this.quat.transform(this.eyePos.subBy(center), this.eyePos);
226
- Quaternion.fromEulerAngle(0, this.rotateY, 0, 'ZYX', this.quat);
227
- this.quat.transform(this.eyePos, this.eyePos);
228
- this.quat.transform(this.xVector, this.xVector).inplaceNormalize();
229
- Vector3.normalize(this.eyePos, this.direction).inplaceNormalize();
230
- Vector3.cross(this.direction, this.xVector, this.upVector).inplaceNormalize();
231
- this.eyePos.addBy(center);
232
- this.rotateX *= 1 - this.options.damping;
233
- this.rotateY *= 1 - this.options.damping;
234
- if (Math.abs(this.rotateX) < 0.0001) {
235
- this.rotateX = 0;
236
- }
237
- if (Math.abs(this.rotateY) < 0.0001) {
238
- this.rotateY = 0;
239
- }
240
+ if (Math.abs(this.rotateY) < 0.0001) {
241
+ this.rotateY = 0;
240
242
  }
241
- this._getCamera().lookAt(this.eyePos, center, this.upVector);
242
243
  }
244
+ camera.lookAt(this.eyePos, center, this.upVector);
243
245
  }
244
246
  }
245
247
 
@@ -1 +1 @@
1
- {"version":3,"file":"orbit.js","sources":["../../src/camera/orbit.ts"],"sourcesContent":["import { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type {\r\n IControllerMouseEvent,\r\n IControllerPointerDownEvent,\r\n IControllerPointerMoveEvent,\r\n IControllerPointerUpEvent,\r\n IControllerWheelEvent\r\n} from './base';\r\nimport { BaseCameraController } from './base';\r\n\r\n/**\r\n * Creation options for OrbitCameraController\r\n * @public\r\n */\r\nexport interface OrbitCameraControllerOptions {\r\n /** target position */\r\n center: Vector3;\r\n /** damping value */\r\n damping?: number;\r\n /** Zooming speed */\r\n zoomSpeed?: number;\r\n /** Rotating speed */\r\n rotateSpeed?: number;\r\n /** Panning speed */\r\n panSpeed?: number;\r\n controls?: {\r\n rotate?: {\r\n button: number;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n };\r\n pan?: {\r\n button: number;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n };\r\n zoom?: {\r\n button: number;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n };\r\n zoomWheel?: boolean; // 是否启用滚轮缩放\r\n };\r\n}\r\n\r\nenum OperationType {\r\n NONE = 0,\r\n ROTATE = 1,\r\n PAN = 2,\r\n ZOOM = 3\r\n}\r\n\r\n/**\r\n * Orbit camera controller\r\n * @public\r\n */\r\nexport class OrbitCameraController extends BaseCameraController {\r\n /** @internal */\r\n private readonly options: OrbitCameraControllerOptions;\r\n /** @internal */\r\n private lastMouseX: number;\r\n /** @internal */\r\n private lastMouseY: number;\r\n /** @internal */\r\n private rotateX: number;\r\n /** @internal */\r\n private rotateY: number;\r\n /** @internal */\r\n private readonly eyePos: Vector3;\r\n /** @internal */\r\n private upVector: Vector3;\r\n /** @internal */\r\n private readonly xVector: Vector3;\r\n /** @internal */\r\n private readonly direction: Vector3;\r\n /** @internal */\r\n private readonly quat: Quaternion;\r\n /** @internal */\r\n private currentOp: OperationType;\r\n /** @internal */\r\n private panVelocityX: number;\r\n /** @internal */\r\n private panVelocityY: number;\r\n /**\r\n * Creates an instance of OrbitCameraController\r\n * @param options - The creation options\r\n */\r\n constructor(options?: Partial<OrbitCameraControllerOptions>) {\r\n super();\r\n this.options = Object.assign(\r\n {\r\n center: Vector3.zero(),\r\n damping: 1,\r\n rotateSpeed: 1,\r\n panSpeed: 1,\r\n zoomSpeed: 1,\r\n controls: {\r\n rotate: {\r\n button: 0,\r\n shiftKey: false,\r\n ctrlKey: false,\r\n altKey: false,\r\n metaKey: false\r\n },\r\n pan: {\r\n button: 0,\r\n shiftKey: true,\r\n ctrlKey: false,\r\n altKey: false,\r\n metaKey: false\r\n },\r\n zoom: {\r\n button: 2,\r\n shiftKey: false,\r\n ctrlKey: true,\r\n altKey: false,\r\n metaKey: false\r\n },\r\n zoomWheel: true\r\n }\r\n },\r\n options || {}\r\n );\r\n this.eyePos = new Vector3();\r\n this.upVector = new Vector3();\r\n this.xVector = new Vector3();\r\n this.direction = new Vector3();\r\n this.quat = new Quaternion();\r\n this.reset();\r\n }\r\n /** Rotation center */\r\n get center(): Vector3 {\r\n return this.options.center;\r\n }\r\n set center(val: Vector3) {\r\n const center = this.options.center;\r\n const dx = val.x - center.x;\r\n const dy = val.y - center.y;\r\n const dz = val.z - center.z;\r\n center.x += dx;\r\n center.y += dy;\r\n center.z += dz;\r\n this.eyePos.x += dx;\r\n this.eyePos.y += dy;\r\n this.eyePos.z += dz;\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController.reset}\r\n * @override\r\n */\r\n reset(): void {\r\n this.lastMouseX = 0;\r\n this.lastMouseY = 0;\r\n this.rotateX = 0;\r\n this.rotateY = 0;\r\n this.upVector = Vector3.axisPY();\r\n this.currentOp = OperationType.NONE;\r\n this.panVelocityX = 0;\r\n this.panVelocityY = 0;\r\n this._loadCameraParams();\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController._onMouseDown}\r\n * @override\r\n */\r\n protected _onMouseDown(evt: IControllerPointerDownEvent): boolean {\r\n if (this.matchesControl(evt, this.options.controls.rotate)) {\r\n this.lastMouseX = evt.offsetX;\r\n this.lastMouseY = evt.offsetY;\r\n this.rotateX = 0;\r\n this.rotateY = 0;\r\n this.panVelocityX = 0;\r\n this.panVelocityY = 0;\r\n this.currentOp = OperationType.ROTATE;\r\n return true;\r\n } else if (this.matchesControl(evt, this.options.controls.pan)) {\r\n this.lastMouseX = evt.offsetX;\r\n this.lastMouseY = evt.offsetY;\r\n this.rotateX = 0;\r\n this.rotateY = 0;\r\n this.panVelocityX = 0;\r\n this.panVelocityY = 0;\r\n this.currentOp = OperationType.PAN;\r\n return true;\r\n } else if (this.matchesControl(evt, this.options.controls.zoom)) {\r\n this.lastMouseX = evt.offsetX;\r\n this.lastMouseY = evt.offsetY;\r\n this.currentOp = OperationType.ZOOM;\r\n this.rotateX = 0;\r\n this.rotateY = 0;\r\n this.panVelocityX = 0;\r\n this.panVelocityY = 0;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController._onMouseUp}\r\n * @override\r\n */\r\n protected _onMouseUp(evt: IControllerPointerUpEvent): boolean {\r\n const control =\r\n this.currentOp === OperationType.ROTATE\r\n ? this.options.controls.rotate\r\n : this.currentOp === OperationType.PAN\r\n ? this.options.controls.pan\r\n : this.currentOp === OperationType.ZOOM\r\n ? this.options.controls.zoom\r\n : null;\r\n if (control && evt.button === control.button) {\r\n this.currentOp = OperationType.NONE;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController._onMouseWheel}\r\n * @override\r\n */\r\n protected _onMouseWheel(evt: IControllerWheelEvent): boolean {\r\n this.zoom(evt.deltaY);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController._onMouseMove}\r\n * @override\r\n */\r\n protected _onMouseMove(evt: IControllerPointerMoveEvent): boolean {\r\n if (this.currentOp !== OperationType.NONE) {\r\n const dx = evt.offsetX - this.lastMouseX;\r\n const dy = evt.offsetY - this.lastMouseY;\r\n this.lastMouseX = evt.offsetX;\r\n this.lastMouseY = evt.offsetY;\r\n if (this.currentOp === OperationType.ROTATE) {\r\n this.rotateX -= dy * this.options.rotateSpeed * 0.005;\r\n this.rotateY -= dx * this.options.rotateSpeed * 0.005;\r\n } else if (this.currentOp === OperationType.PAN) {\r\n this.panVelocityX = -dx * this.options.panSpeed;\r\n this.panVelocityY = dy * this.options.panSpeed;\r\n } else if (this.currentOp === OperationType.ZOOM) {\r\n this.zoom(dy);\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n private zoom(dy: number) {\r\n const distance = Vector3.distance(this.eyePos, this.options.center);\r\n let t = dy > 0 ? this.options.zoomSpeed : dy < 0 ? -this.options.zoomSpeed : 0;\r\n t = Math.exp(t * 0.1);\r\n if (t > 1 || distance > 0.01) {\r\n this.eyePos.combineBy(this.options.center, t, 1 - t);\r\n }\r\n }\r\n private matchesControl(\r\n evt: IControllerMouseEvent<any>,\r\n control: {\r\n button: number;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n }\r\n ): boolean {\r\n return (\r\n evt.button === control.button &&\r\n evt.shiftKey === control.shiftKey &&\r\n evt.ctrlKey === control.ctrlKey &&\r\n evt.altKey === control.altKey &&\r\n evt.metaKey === control.metaKey\r\n );\r\n }\r\n /** @internal */\r\n private _loadCameraParams() {\r\n const camera = this._getCamera();\r\n if (camera) {\r\n this.lookAt(camera.position, this.options.center, this.upVector);\r\n }\r\n }\r\n lookAt(from: Vector3, to: Vector3, up: Vector3) {\r\n this.eyePos.set(from);\r\n this.options.center.set(to);\r\n this.upVector.set(up);\r\n this._getCamera().lookAt(this.eyePos, this.options.center, this.upVector);\r\n Vector3.sub(this.eyePos, this.options.center, this.direction);\r\n this.direction.inplaceNormalize();\r\n const mat = this._getCamera().localMatrix;\r\n this.xVector.setXYZ(mat[0], mat[1], mat[2]);\r\n }\r\n /**\r\n * Set options\r\n * @param opt - options\r\n */\r\n setOptions(opt?: OrbitCameraControllerOptions) {\r\n Object.assign(this.options, opt ?? {});\r\n this.reset();\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController.update}\r\n * @override\r\n */\r\n update() {\r\n if (this._getCamera()) {\r\n const center = this.options.center;\r\n\r\n if (Math.abs(this.panVelocityX) > 0.0001 || Math.abs(this.panVelocityY) > 0.0001) {\r\n const right = this.xVector;\r\n const up = this.upVector;\r\n\r\n center.combineBy(right, 1, this.panVelocityX);\r\n center.combineBy(up, 1, this.panVelocityY);\r\n this.eyePos.combineBy(right, 1, this.panVelocityX);\r\n this.eyePos.combineBy(up, 1, this.panVelocityY);\r\n\r\n this.panVelocityX *= 1 - this.options.damping;\r\n this.panVelocityY *= 1 - this.options.damping;\r\n\r\n if (Math.abs(this.panVelocityX) < 0.0001) {\r\n this.panVelocityX = 0;\r\n }\r\n if (Math.abs(this.panVelocityY) < 0.0001) {\r\n this.panVelocityY = 0;\r\n }\r\n }\r\n\r\n if (Math.abs(this.rotateX) > 0.0001 || Math.abs(this.rotateY) > 0.0001) {\r\n Quaternion.fromAxisAngle(this.xVector, this.rotateX, this.quat);\r\n this.quat.transform(this.eyePos.subBy(center), this.eyePos);\r\n Quaternion.fromEulerAngle(0, this.rotateY, 0, 'ZYX', this.quat);\r\n this.quat.transform(this.eyePos, this.eyePos);\r\n this.quat.transform(this.xVector, this.xVector).inplaceNormalize();\r\n Vector3.normalize(this.eyePos, this.direction).inplaceNormalize();\r\n Vector3.cross(this.direction, this.xVector, this.upVector).inplaceNormalize();\r\n this.eyePos.addBy(center);\r\n\r\n this.rotateX *= 1 - this.options.damping;\r\n this.rotateY *= 1 - this.options.damping;\r\n if (Math.abs(this.rotateX) < 0.0001) {\r\n this.rotateX = 0;\r\n }\r\n if (Math.abs(this.rotateY) < 0.0001) {\r\n this.rotateY = 0;\r\n }\r\n }\r\n\r\n this._getCamera().lookAt(this.eyePos, center, this.upVector);\r\n }\r\n }\r\n}\r\n"],"names":["OrbitCameraController","BaseCameraController","options","Object","assign","center","Vector3","zero","damping","rotateSpeed","panSpeed","zoomSpeed","controls","rotate","button","shiftKey","ctrlKey","altKey","metaKey","pan","zoom","zoomWheel","eyePos","upVector","xVector","direction","quat","Quaternion","reset","val","dx","x","dy","y","dz","z","lastMouseX","lastMouseY","rotateX","rotateY","axisPY","currentOp","panVelocityX","panVelocityY","_loadCameraParams","_onMouseDown","evt","matchesControl","offsetX","offsetY","_onMouseUp","control","_onMouseWheel","deltaY","_onMouseMove","distance","t","Math","exp","combineBy","camera","_getCamera","lookAt","position","from","to","up","set","sub","inplaceNormalize","mat","localMatrix","setXYZ","setOptions","opt","update","abs","right","fromAxisAngle","transform","subBy","fromEulerAngle","normalize","cross","addBy"],"mappings":"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"}
1
+ {"version":3,"file":"orbit.js","sources":["../../src/camera/orbit.ts"],"sourcesContent":["import type { DeepRequireOptionals, Immutable } from '@zephyr3d/base';\r\nimport { Vector3, Quaternion } from '@zephyr3d/base';\r\nimport type {\r\n IControllerMouseEvent,\r\n IControllerPointerDownEvent,\r\n IControllerPointerMoveEvent,\r\n IControllerPointerUpEvent,\r\n IControllerWheelEvent\r\n} from './base';\r\nimport { BaseCameraController } from './base';\r\n\r\n/**\r\n * Creation options for OrbitCameraController\r\n * @public\r\n */\r\nexport interface OrbitCameraControllerOptions {\r\n /** target position */\r\n center: Vector3;\r\n /** damping value */\r\n damping?: number;\r\n /** Zooming speed */\r\n zoomSpeed?: number;\r\n /** Rotating speed */\r\n rotateSpeed?: number;\r\n /** Panning speed */\r\n panSpeed?: number;\r\n controls?: {\r\n rotate?: {\r\n button: number;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n };\r\n pan?: {\r\n button: number;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n };\r\n zoom?: {\r\n button: number;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n };\r\n zoomWheel?: boolean; // 是否启用滚轮缩放\r\n };\r\n}\r\n\r\nenum OperationType {\r\n NONE = 0,\r\n ROTATE = 1,\r\n PAN = 2,\r\n ZOOM = 3\r\n}\r\n\r\n/**\r\n * Orbit camera controller\r\n * @public\r\n */\r\nexport class OrbitCameraController extends BaseCameraController {\r\n /** @internal */\r\n private readonly options: DeepRequireOptionals<OrbitCameraControllerOptions>;\r\n /** @internal */\r\n private lastMouseX!: number;\r\n /** @internal */\r\n private lastMouseY!: number;\r\n /** @internal */\r\n private rotateX!: number;\r\n /** @internal */\r\n private rotateY!: number;\r\n /** @internal */\r\n private readonly eyePos: Vector3;\r\n /** @internal */\r\n private upVector: Vector3;\r\n /** @internal */\r\n private readonly xVector: Vector3;\r\n /** @internal */\r\n private readonly direction: Vector3;\r\n /** @internal */\r\n private readonly quat: Quaternion;\r\n /** @internal */\r\n private currentOp!: OperationType;\r\n /** @internal */\r\n private panVelocityX!: number;\r\n /** @internal */\r\n private panVelocityY!: number;\r\n /**\r\n * Creates an instance of OrbitCameraController\r\n * @param options - The creation options\r\n */\r\n constructor(options?: Partial<OrbitCameraControllerOptions>) {\r\n super();\r\n this.options = Object.assign(\r\n {\r\n center: Vector3.zero(),\r\n damping: 1,\r\n rotateSpeed: 1,\r\n panSpeed: 1,\r\n zoomSpeed: 1,\r\n controls: {\r\n rotate: {\r\n button: 0,\r\n shiftKey: false,\r\n ctrlKey: false,\r\n altKey: false,\r\n metaKey: false\r\n },\r\n pan: {\r\n button: 0,\r\n shiftKey: true,\r\n ctrlKey: false,\r\n altKey: false,\r\n metaKey: false\r\n },\r\n zoom: {\r\n button: 2,\r\n shiftKey: false,\r\n ctrlKey: true,\r\n altKey: false,\r\n metaKey: false\r\n },\r\n zoomWheel: true\r\n }\r\n },\r\n options || {}\r\n );\r\n this.eyePos = new Vector3();\r\n this.upVector = new Vector3();\r\n this.xVector = new Vector3();\r\n this.direction = new Vector3();\r\n this.quat = new Quaternion();\r\n this.reset();\r\n }\r\n /** Rotation center */\r\n get center(): Immutable<Vector3> {\r\n return this.options.center;\r\n }\r\n set center(val: Immutable<Vector3>) {\r\n const center = this.options.center;\r\n const dx = val.x - center.x;\r\n const dy = val.y - center.y;\r\n const dz = val.z - center.z;\r\n center.x += dx;\r\n center.y += dy;\r\n center.z += dz;\r\n this.eyePos.x += dx;\r\n this.eyePos.y += dy;\r\n this.eyePos.z += dz;\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController.reset}\r\n * @override\r\n */\r\n reset() {\r\n this.lastMouseX = 0;\r\n this.lastMouseY = 0;\r\n this.rotateX = 0;\r\n this.rotateY = 0;\r\n this.upVector = Vector3.axisPY();\r\n this.currentOp = OperationType.NONE;\r\n this.panVelocityX = 0;\r\n this.panVelocityY = 0;\r\n this._loadCameraParams();\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController._onMouseDown}\r\n * @override\r\n */\r\n protected _onMouseDown(evt: IControllerPointerDownEvent) {\r\n if (this.matchesControl(evt, this.options.controls.rotate)) {\r\n this.lastMouseX = evt.offsetX;\r\n this.lastMouseY = evt.offsetY;\r\n this.rotateX = 0;\r\n this.rotateY = 0;\r\n this.panVelocityX = 0;\r\n this.panVelocityY = 0;\r\n this.currentOp = OperationType.ROTATE;\r\n return true;\r\n } else if (this.matchesControl(evt, this.options.controls.pan)) {\r\n this.lastMouseX = evt.offsetX;\r\n this.lastMouseY = evt.offsetY;\r\n this.rotateX = 0;\r\n this.rotateY = 0;\r\n this.panVelocityX = 0;\r\n this.panVelocityY = 0;\r\n this.currentOp = OperationType.PAN;\r\n return true;\r\n } else if (this.matchesControl(evt, this.options.controls.zoom)) {\r\n this.lastMouseX = evt.offsetX;\r\n this.lastMouseY = evt.offsetY;\r\n this.currentOp = OperationType.ZOOM;\r\n this.rotateX = 0;\r\n this.rotateY = 0;\r\n this.panVelocityX = 0;\r\n this.panVelocityY = 0;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController._onMouseUp}\r\n * @override\r\n */\r\n protected _onMouseUp(evt: IControllerPointerUpEvent) {\r\n const control =\r\n this.currentOp === OperationType.ROTATE\r\n ? this.options.controls.rotate\r\n : this.currentOp === OperationType.PAN\r\n ? this.options.controls.pan\r\n : this.currentOp === OperationType.ZOOM\r\n ? this.options.controls.zoom\r\n : null;\r\n if (control && evt.button === control.button) {\r\n this.currentOp = OperationType.NONE;\r\n return true;\r\n }\r\n return false;\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController._onMouseWheel}\r\n * @override\r\n */\r\n protected _onMouseWheel(evt: IControllerWheelEvent) {\r\n this.zoom(evt.deltaY);\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController._onMouseMove}\r\n * @override\r\n */\r\n protected _onMouseMove(evt: IControllerPointerMoveEvent) {\r\n if (this.currentOp !== OperationType.NONE) {\r\n const dx = evt.offsetX - this.lastMouseX;\r\n const dy = evt.offsetY - this.lastMouseY;\r\n this.lastMouseX = evt.offsetX;\r\n this.lastMouseY = evt.offsetY;\r\n if (this.currentOp === OperationType.ROTATE) {\r\n this.rotateX -= dy * this.options.rotateSpeed * 0.005;\r\n this.rotateY -= dx * this.options.rotateSpeed * 0.005;\r\n } else if (this.currentOp === OperationType.PAN) {\r\n this.panVelocityX = -dx * this.options.panSpeed;\r\n this.panVelocityY = dy * this.options.panSpeed;\r\n } else if (this.currentOp === OperationType.ZOOM) {\r\n this.zoom(dy);\r\n }\r\n return true;\r\n }\r\n return false;\r\n }\r\n private zoom(dy: number) {\r\n const distance = Vector3.distance(this.eyePos, this.options.center);\r\n let t = dy > 0 ? this.options.zoomSpeed : dy < 0 ? -this.options.zoomSpeed : 0;\r\n t = Math.exp(t * 0.1);\r\n if (t > 1 || distance > 0.01) {\r\n this.eyePos.combineBy(this.options.center, t, 1 - t);\r\n }\r\n }\r\n private matchesControl(\r\n evt: IControllerMouseEvent<any>,\r\n control: {\r\n button: number;\r\n shiftKey: boolean;\r\n ctrlKey: boolean;\r\n altKey: boolean;\r\n metaKey: boolean;\r\n }\r\n ) {\r\n return (\r\n evt.button === control.button &&\r\n evt.shiftKey === control.shiftKey &&\r\n evt.ctrlKey === control.ctrlKey &&\r\n evt.altKey === control.altKey &&\r\n evt.metaKey === control.metaKey\r\n );\r\n }\r\n /** @internal */\r\n private _loadCameraParams() {\r\n const camera = this._getCamera();\r\n if (camera) {\r\n this.lookAt(camera.position, this.options.center, this.upVector);\r\n }\r\n }\r\n lookAt(from: Vector3, to: Vector3, up: Vector3) {\r\n const camera = this._getCamera();\r\n if (camera) {\r\n this.eyePos.set(from);\r\n this.options.center.set(to);\r\n this.upVector.set(up);\r\n camera.lookAt(this.eyePos, this.options.center, this.upVector);\r\n Vector3.sub(this.eyePos, this.options.center, this.direction);\r\n this.direction.inplaceNormalize();\r\n const mat = camera.localMatrix;\r\n this.xVector.setXYZ(mat[0], mat[1], mat[2]);\r\n }\r\n }\r\n /**\r\n * Set options\r\n * @param opt - options\r\n */\r\n setOptions(opt?: OrbitCameraControllerOptions) {\r\n Object.assign(this.options, opt ?? {});\r\n this.reset();\r\n }\r\n /**\r\n * {@inheritDoc BaseCameraController.update}\r\n * @override\r\n */\r\n update() {\r\n const camera = this._getCamera()!;\r\n const center = this.options.center;\r\n\r\n if (Math.abs(this.panVelocityX) > 0.0001 || Math.abs(this.panVelocityY) > 0.0001) {\r\n const right = this.xVector;\r\n const up = this.upVector;\r\n\r\n center.combineBy(right, 1, this.panVelocityX);\r\n center.combineBy(up, 1, this.panVelocityY);\r\n this.eyePos.combineBy(right, 1, this.panVelocityX);\r\n this.eyePos.combineBy(up, 1, this.panVelocityY);\r\n\r\n this.panVelocityX *= 1 - this.options.damping;\r\n this.panVelocityY *= 1 - this.options.damping;\r\n\r\n if (Math.abs(this.panVelocityX) < 0.0001) {\r\n this.panVelocityX = 0;\r\n }\r\n if (Math.abs(this.panVelocityY) < 0.0001) {\r\n this.panVelocityY = 0;\r\n }\r\n }\r\n\r\n if (Math.abs(this.rotateX) > 0.0001 || Math.abs(this.rotateY) > 0.0001) {\r\n Quaternion.fromAxisAngle(this.xVector, this.rotateX, this.quat);\r\n this.quat.transform(this.eyePos.subBy(center), this.eyePos);\r\n Quaternion.fromEulerAngle(0, this.rotateY, 0, 'ZYX', this.quat);\r\n this.quat.transform(this.eyePos, this.eyePos);\r\n this.quat.transform(this.xVector, this.xVector).inplaceNormalize();\r\n Vector3.normalize(this.eyePos, this.direction).inplaceNormalize();\r\n Vector3.cross(this.direction, this.xVector, this.upVector).inplaceNormalize();\r\n this.eyePos.addBy(center);\r\n\r\n this.rotateX *= 1 - this.options.damping;\r\n this.rotateY *= 1 - this.options.damping;\r\n if (Math.abs(this.rotateX) < 0.0001) {\r\n this.rotateX = 0;\r\n }\r\n if (Math.abs(this.rotateY) < 0.0001) {\r\n this.rotateY = 0;\r\n }\r\n }\r\n\r\n camera.lookAt(this.eyePos, center, this.upVector);\r\n }\r\n}\r\n"],"names":["OrbitCameraController","BaseCameraController","options","Object","assign","center","Vector3","zero","damping","rotateSpeed","panSpeed","zoomSpeed","controls","rotate","button","shiftKey","ctrlKey","altKey","metaKey","pan","zoom","zoomWheel","eyePos","upVector","xVector","direction","quat","Quaternion","reset","val","dx","x","dy","y","dz","z","lastMouseX","lastMouseY","rotateX","rotateY","axisPY","currentOp","panVelocityX","panVelocityY","_loadCameraParams","_onMouseDown","evt","matchesControl","offsetX","offsetY","_onMouseUp","control","_onMouseWheel","deltaY","_onMouseMove","distance","t","Math","exp","combineBy","camera","_getCamera","lookAt","position","from","to","up","set","sub","inplaceNormalize","mat","localMatrix","setXYZ","setOptions","opt","update","abs","right","fromAxisAngle","transform","subBy","fromEulerAngle","normalize","cross","addBy"],"mappings":"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"}
@@ -13,12 +13,14 @@ import { Matrix4x4 } from '@zephyr3d/base';
13
13
  _far;
14
14
  _window;
15
15
  /**
16
- * Creates an instance of PerspectiveCamera
16
+ * Creates an instance of OrthoCamera
17
17
  * @param scene - The scene that the camera belongs to.
18
- * @param fovY - A radian value indicates the field of view in Y axis
19
- * @param aspect - Aspect ratio of the perspective transform
20
- * @param nearPlane - The near clip plane
21
- * @param farPlane - The far clip plane
18
+ * @param left - The left clip plane
19
+ * @param right - The right clip plane
20
+ * @param bottom - The bottom clip plane
21
+ * @param top - The top clip plane
22
+ * @param near - The near clip plane
23
+ * @param far - The far clip plane
22
24
  */ constructor(scene, left = -1, right = 1, bottom = -1, top = 1, near = -1, far = 1){
23
25
  super(scene);
24
26
  this._left = left;
@@ -56,7 +58,7 @@ import { Matrix4x4 } from '@zephyr3d/base';
56
58
  }
57
59
  }
58
60
  /** The left clip plane */ get left() {
59
- return this._left;
61
+ return this.adapted ? this.getProjectionMatrix().getLeftPlane() : this._left;
60
62
  }
61
63
  set left(val) {
62
64
  if (val !== this._left) {
@@ -65,7 +67,7 @@ import { Matrix4x4 } from '@zephyr3d/base';
65
67
  }
66
68
  }
67
69
  /** The right clip plane */ get right() {
68
- return this._right;
70
+ return this.adapted ? this.getProjectionMatrix().getRightPlane() : this._right;
69
71
  }
70
72
  set right(val) {
71
73
  if (val !== this._right) {
@@ -74,7 +76,7 @@ import { Matrix4x4 } from '@zephyr3d/base';
74
76
  }
75
77
  }
76
78
  /** The top clip plane */ get top() {
77
- return this._top;
79
+ return this.adapted ? this.getProjectionMatrix().getTopPlane() : this._top;
78
80
  }
79
81
  set top(val) {
80
82
  if (val !== this._top) {
@@ -83,7 +85,7 @@ import { Matrix4x4 } from '@zephyr3d/base';
83
85
  }
84
86
  }
85
87
  /** The bottom clip plane */ get bottom() {
86
- return this._bottom;
88
+ return this.adapted ? this.getProjectionMatrix().getBottomPlane() : this._bottom;
87
89
  }
88
90
  set bottom(val) {
89
91
  if (val !== this._bottom) {
@@ -130,19 +132,23 @@ import { Matrix4x4 } from '@zephyr3d/base';
130
132
  }
131
133
  }
132
134
  /** @internal */ _computeProj() {
133
- let left = this._left;
134
- let right = this._right;
135
- let bottom = this._bottom;
136
- let top = this._top;
137
- if (this._window) {
138
- const width = right - left;
139
- const height = top - bottom;
140
- left += width * this._window[0];
141
- bottom += height * this._window[1];
142
- right = left + width * this._window[2];
143
- top = bottom + height * this._window[3];
135
+ if (this.adapted) {
136
+ this.calcAdaptedOrthographicProjection(this._near, this._far, this._projMatrix);
137
+ } else {
138
+ let left = this._left;
139
+ let right = this._right;
140
+ let bottom = this._bottom;
141
+ let top = this._top;
142
+ if (this._window) {
143
+ const width = right - left;
144
+ const height = top - bottom;
145
+ left += width * this._window[0];
146
+ bottom += height * this._window[1];
147
+ right = left + width * this._window[2];
148
+ top = bottom + height * this._window[3];
149
+ }
150
+ this._projMatrix.ortho(left, right, bottom, top, this._near, this._far);
144
151
  }
145
- this._projMatrix.ortho(left, right, bottom, top, this._near, this._far);
146
152
  Matrix4x4.invert(this._projMatrix, this._invProjMatrix);
147
153
  }
148
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"orthocamera.js","sources":["../../src/camera/orthocamera.ts"],"sourcesContent":["import { Camera } from './camera';\r\nimport type { Scene } from '../scene/scene';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\n\r\n/**\r\n * Orthogonal camera class\r\n * @public\r\n */\r\nexport class OrthoCamera extends Camera {\r\n /** @internal */\r\n private _left: number;\r\n private _right: number;\r\n private _top: number;\r\n private _bottom: number;\r\n private _near: number;\r\n private _far: number;\r\n private _window: 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 nearPlane - The near clip plane\r\n * @param farPlane - The far clip plane\r\n */\r\n constructor(scene: Scene, left = -1, right = 1, bottom = -1, top = 1, near = -1, far = 1) {\r\n super(scene);\r\n this._left = left;\r\n this._right = right;\r\n this._bottom = bottom;\r\n this._top = top;\r\n this._near = near;\r\n this._far = far;\r\n this._window = null;\r\n this._invalidate(true);\r\n }\r\n /** Sub-window of the frustum */\r\n get window(): number[] {\r\n return this._window;\r\n }\r\n set window(val: number[]) {\r\n this._window = val?.slice() ?? null;\r\n this._invalidate(true);\r\n }\r\n /** The near clip plane */\r\n get near(): number {\r\n return this._near;\r\n }\r\n set near(val: number) {\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(): number {\r\n return this._far;\r\n }\r\n set far(val: number) {\r\n if (val !== this._far) {\r\n this._far = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The left clip plane */\r\n get left(): number {\r\n return this._left;\r\n }\r\n set left(val: number) {\r\n if (val !== this._left) {\r\n this._left = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The right clip plane */\r\n get right(): number {\r\n return this._right;\r\n }\r\n set right(val: number) {\r\n if (val !== this._right) {\r\n this._right = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The top clip plane */\r\n get top(): number {\r\n return this._top;\r\n }\r\n set top(val: number) {\r\n if (val !== this._top) {\r\n this._top = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The bottom clip plane */\r\n get bottom(): number {\r\n return this._bottom;\r\n }\r\n set bottom(val: number) {\r\n if (val !== this._bottom) {\r\n this._bottom = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /**\r\n * Not valid for OrthoCamera\r\n *\r\n * @remarks\r\n * This method is only valid for {@link Camera} class or {@link PerspectiveCamera} class.\r\n */\r\n setPerspective(): this {\r\n throw new Error(`setPerspective() not allowed on OrthoCamera`);\r\n }\r\n /**\r\n * {@inheritDoc Camera.setOrtho}\r\n */\r\n setOrtho(left: number, right: number, bottom: number, top: number, near: number, far: number): this {\r\n this._left = left;\r\n this._right = right;\r\n this._bottom = bottom;\r\n this._top = top;\r\n this._near = near;\r\n this._far = far;\r\n this._invalidate(true);\r\n return this;\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): void {\r\n if (matrix !== this._projMatrix) {\r\n if (matrix?.isOrtho()) {\r\n super.setProjectionMatrix(matrix);\r\n this._left = matrix.getLeftPlane();\r\n this._right = matrix.getRightPlane();\r\n this._near = matrix.getNearPlane();\r\n this._far = matrix.getFarPlane();\r\n this._top = matrix.getTopPlane();\r\n this._bottom = matrix.getBottomPlane();\r\n } else {\r\n throw new Error(`OrthoCamera.setProjectionMatrix(): param is not an orthogonal projection matrix`);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected _computeProj(): void {\r\n let left = this._left;\r\n let right = this._right;\r\n let bottom = this._bottom;\r\n let top = this._top;\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.ortho(left, right, bottom, top, this._near, this._far);\r\n Matrix4x4.invert(this._projMatrix, this._invProjMatrix);\r\n }\r\n}\r\n"],"names":["OrthoCamera","Camera","_right","_top","_bottom","_near","_far","_window","scene","left","right","bottom","top","near","far","_left","_invalidate","window","val","slice","setPerspective","Error","setOrtho","setProjectionMatrix","matrix","_projMatrix","isOrtho","getLeftPlane","getRightPlane","getNearPlane","getFarPlane","getTopPlane","getBottomPlane","width","height","ortho","Matrix4x4","invert","_invProjMatrix"],"mappings":";;;AAIA;;;IAIO,MAAMA,WAAoBC,SAAAA,MAAAA,CAAAA;qBAE/B,KAAsB;IACdC,MAAe;IACfC,IAAa;IACbC,OAAgB;IAChBC,KAAc;IACdC,IAAa;IACbC,OAAkB;AAC1B;;;;;;;MAQA,WAAA,CAAYC,KAAY,EAAEC,IAAAA,GAAO,EAAE,EAAEC,KAAQ,GAAA,CAAC,EAAEC,MAAAA,GAAS,EAAE,EAAEC,GAAM,GAAA,CAAC,EAAEC,IAAAA,GAAO,EAAE,EAAEC,GAAM,GAAA,CAAC,CAAE;AACxF,QAAA,KAAK,CAACN,KAAAA,CAAAA;QACN,IAAI,CAACO,KAAK,GAAGN,IAAAA;QACb,IAAI,CAACP,MAAM,GAAGQ,KAAAA;QACd,IAAI,CAACN,OAAO,GAAGO,MAAAA;QACf,IAAI,CAACR,IAAI,GAAGS,GAAAA;QACZ,IAAI,CAACP,KAAK,GAAGQ,IAAAA;QACb,IAAI,CAACP,IAAI,GAAGQ,GAAAA;QACZ,IAAI,CAACP,OAAO,GAAG,IAAA;QACf,IAAI,CAACS,WAAW,CAAC,IAAA,CAAA;AACnB;qCAEA,IAAIC,MAAmB,GAAA;QACrB,OAAO,IAAI,CAACV,OAAO;AACrB;IACA,IAAIU,MAAAA,CAAOC,GAAa,EAAE;AACxB,QAAA,IAAI,CAACX,OAAO,GAAGW,GAAAA,EAAKC,KAAW,EAAA,IAAA,IAAA;QAC/B,IAAI,CAACH,WAAW,CAAC,IAAA,CAAA;AACnB;+BAEA,IAAIH,IAAe,GAAA;QACjB,OAAO,IAAI,CAACR,KAAK;AACnB;IACA,IAAIQ,IAAAA,CAAKK,GAAW,EAAE;AACpB,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACb,KAAK,EAAE;YACtB,IAAI,CAACA,KAAK,GAAGa,GAAAA;YACb,IAAI,CAACF,WAAW,CAAC,IAAA,CAAA;AACnB;AACF;8BAEA,IAAIF,GAAc,GAAA;QAChB,OAAO,IAAI,CAACR,IAAI;AAClB;IACA,IAAIQ,GAAAA,CAAII,GAAW,EAAE;AACnB,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACZ,IAAI,EAAE;YACrB,IAAI,CAACA,IAAI,GAAGY,GAAAA;YACZ,IAAI,CAACF,WAAW,CAAC,IAAA,CAAA;AACnB;AACF;+BAEA,IAAIP,IAAe,GAAA;QACjB,OAAO,IAAI,CAACM,KAAK;AACnB;IACA,IAAIN,IAAAA,CAAKS,GAAW,EAAE;AACpB,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACH,KAAK,EAAE;YACtB,IAAI,CAACA,KAAK,GAAGG,GAAAA;YACb,IAAI,CAACF,WAAW,CAAC,IAAA,CAAA;AACnB;AACF;gCAEA,IAAIN,KAAgB,GAAA;QAClB,OAAO,IAAI,CAACR,MAAM;AACpB;IACA,IAAIQ,KAAAA,CAAMQ,GAAW,EAAE;AACrB,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAAChB,MAAM,EAAE;YACvB,IAAI,CAACA,MAAM,GAAGgB,GAAAA;YACd,IAAI,CAACF,WAAW,CAAC,IAAA,CAAA;AACnB;AACF;8BAEA,IAAIJ,GAAc,GAAA;QAChB,OAAO,IAAI,CAACT,IAAI;AAClB;IACA,IAAIS,GAAAA,CAAIM,GAAW,EAAE;AACnB,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACf,IAAI,EAAE;YACrB,IAAI,CAACA,IAAI,GAAGe,GAAAA;YACZ,IAAI,CAACF,WAAW,CAAC,IAAA,CAAA;AACnB;AACF;iCAEA,IAAIL,MAAiB,GAAA;QACnB,OAAO,IAAI,CAACP,OAAO;AACrB;IACA,IAAIO,MAAAA,CAAOO,GAAW,EAAE;AACtB,QAAA,IAAIA,GAAQ,KAAA,IAAI,CAACd,OAAO,EAAE;YACxB,IAAI,CAACA,OAAO,GAAGc,GAAAA;YACf,IAAI,CAACF,WAAW,CAAC,IAAA,CAAA;AACnB;AACF;AACA;;;;;AAKC,MACDI,cAAuB,GAAA;AACrB,QAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,2CAA2C,CAAC,CAAA;AAC/D;AACA;;AAEC,MACDC,QAASb,CAAAA,IAAY,EAAEC,KAAa,EAAEC,MAAc,EAAEC,GAAW,EAAEC,IAAY,EAAEC,GAAW,EAAQ;QAClG,IAAI,CAACC,KAAK,GAAGN,IAAAA;QACb,IAAI,CAACP,MAAM,GAAGQ,KAAAA;QACd,IAAI,CAACN,OAAO,GAAGO,MAAAA;QACf,IAAI,CAACR,IAAI,GAAGS,GAAAA;QACZ,IAAI,CAACP,KAAK,GAAGQ,IAAAA;QACb,IAAI,CAACP,IAAI,GAAGQ,GAAAA;QACZ,IAAI,CAACE,WAAW,CAAC,IAAA,CAAA;AACjB,QAAA,OAAO,IAAI;AACb;AACA;;;MAIAO,mBAAAA,CAAoBC,MAAiB,EAAQ;AAC3C,QAAA,IAAIA,MAAW,KAAA,IAAI,CAACC,WAAW,EAAE;AAC/B,YAAA,IAAID,QAAQE,OAAW,EAAA,EAAA;AACrB,gBAAA,KAAK,CAACH,mBAAoBC,CAAAA,MAAAA,CAAAA;AAC1B,gBAAA,IAAI,CAACT,KAAK,GAAGS,MAAAA,CAAOG,YAAY,EAAA;AAChC,gBAAA,IAAI,CAACzB,MAAM,GAAGsB,MAAAA,CAAOI,aAAa,EAAA;AAClC,gBAAA,IAAI,CAACvB,KAAK,GAAGmB,MAAAA,CAAOK,YAAY,EAAA;AAChC,gBAAA,IAAI,CAACvB,IAAI,GAAGkB,MAAAA,CAAOM,WAAW,EAAA;AAC9B,gBAAA,IAAI,CAAC3B,IAAI,GAAGqB,MAAAA,CAAOO,WAAW,EAAA;AAC9B,gBAAA,IAAI,CAAC3B,OAAO,GAAGoB,MAAAA,CAAOQ,cAAc,EAAA;aAC/B,MAAA;AACL,gBAAA,MAAM,IAAIX,KAAAA,CAAM,CAAC,+EAA+E,CAAC,CAAA;AACnG;AACF;AACF;qBAEA,YAA+B,GAAA;QAC7B,IAAIZ,IAAAA,GAAO,IAAI,CAACM,KAAK;QACrB,IAAIL,KAAAA,GAAQ,IAAI,CAACR,MAAM;QACvB,IAAIS,MAAAA,GAAS,IAAI,CAACP,OAAO;QACzB,IAAIQ,GAAAA,GAAM,IAAI,CAACT,IAAI;QACnB,IAAI,IAAI,CAACI,OAAO,EAAE;AAChB,YAAA,MAAM0B,QAAQvB,KAAQD,GAAAA,IAAAA;AACtB,YAAA,MAAMyB,SAAStB,GAAMD,GAAAA,MAAAA;AACrBF,YAAAA,IAAAA,IAAQwB,KAAQ,GAAA,IAAI,CAAC1B,OAAO,CAAC,CAAE,CAAA;AAC/BI,YAAAA,MAAAA,IAAUuB,MAAS,GAAA,IAAI,CAAC3B,OAAO,CAAC,CAAE,CAAA;AAClCG,YAAAA,KAAAA,GAAQD,OAAOwB,KAAQ,GAAA,IAAI,CAAC1B,OAAO,CAAC,CAAE,CAAA;AACtCK,YAAAA,GAAAA,GAAMD,SAASuB,MAAS,GAAA,IAAI,CAAC3B,OAAO,CAAC,CAAE,CAAA;AACzC;AACA,QAAA,IAAI,CAACkB,WAAW,CAACU,KAAK,CAAC1B,IAAMC,EAAAA,KAAAA,EAAOC,MAAQC,EAAAA,GAAAA,EAAK,IAAI,CAACP,KAAK,EAAE,IAAI,CAACC,IAAI,CAAA;QACtE8B,SAAUC,CAAAA,MAAM,CAAC,IAAI,CAACZ,WAAW,EAAE,IAAI,CAACa,cAAc,CAAA;AACxD;AACF;;;;"}
1
+ {"version":3,"file":"orthocamera.js","sources":["../../src/camera/orthocamera.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\n\r\n/**\r\n * Orthogonal camera class\r\n * @public\r\n */\r\nexport class OrthoCamera extends Camera {\r\n /** @internal */\r\n private _left: number;\r\n private _right: number;\r\n private _top: number;\r\n private _bottom: number;\r\n private _near: number;\r\n private _far: number;\r\n private _window: Nullable<number[]>;\r\n /**\r\n * Creates an instance of OrthoCamera\r\n * @param scene - The scene that the camera belongs to.\r\n * @param left - The left clip plane\r\n * @param right - The right clip plane\r\n * @param bottom - The bottom clip plane\r\n * @param top - The top clip plane\r\n * @param near - The near clip plane\r\n * @param far - The far clip plane\r\n */\r\n constructor(scene: Nullable<Scene>, left = -1, right = 1, bottom = -1, top = 1, near = -1, far = 1) {\r\n super(scene);\r\n this._left = left;\r\n this._right = right;\r\n this._bottom = bottom;\r\n this._top = top;\r\n this._near = near;\r\n this._far = far;\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<Immutable<number[]>>) {\r\n this._window = val?.slice() ?? null;\r\n this._invalidate(true);\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 /** The left clip plane */\r\n get left() {\r\n return this.adapted ? this.getProjectionMatrix().getLeftPlane() : this._left;\r\n }\r\n set left(val) {\r\n if (val !== this._left) {\r\n this._left = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The right clip plane */\r\n get right() {\r\n return this.adapted ? this.getProjectionMatrix().getRightPlane() : this._right;\r\n }\r\n set right(val) {\r\n if (val !== this._right) {\r\n this._right = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The top clip plane */\r\n get top() {\r\n return this.adapted ? this.getProjectionMatrix().getTopPlane() : this._top;\r\n }\r\n set top(val) {\r\n if (val !== this._top) {\r\n this._top = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The bottom clip plane */\r\n get bottom() {\r\n return this.adapted ? this.getProjectionMatrix().getBottomPlane() : this._bottom;\r\n }\r\n set bottom(val) {\r\n if (val !== this._bottom) {\r\n this._bottom = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /**\r\n * Not valid for OrthoCamera\r\n *\r\n * @remarks\r\n * This method is only valid for {@link Camera} class or {@link PerspectiveCamera} class.\r\n */\r\n setPerspective(): this {\r\n throw new Error(`setPerspective() not allowed on OrthoCamera`);\r\n }\r\n /**\r\n * {@inheritDoc Camera.setOrtho}\r\n */\r\n setOrtho(left: number, right: number, bottom: number, top: number, near: number, far: number) {\r\n this._left = left;\r\n this._right = right;\r\n this._bottom = bottom;\r\n this._top = top;\r\n this._near = near;\r\n this._far = far;\r\n this._invalidate(true);\r\n return this;\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?.isOrtho()) {\r\n super.setProjectionMatrix(matrix);\r\n this._left = matrix.getLeftPlane();\r\n this._right = matrix.getRightPlane();\r\n this._near = matrix.getNearPlane();\r\n this._far = matrix.getFarPlane();\r\n this._top = matrix.getTopPlane();\r\n this._bottom = matrix.getBottomPlane();\r\n } else {\r\n throw new Error(`OrthoCamera.setProjectionMatrix(): param is not an orthogonal projection matrix`);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected _computeProj() {\r\n if (this.adapted) {\r\n this.calcAdaptedOrthographicProjection(this._near, this._far, this._projMatrix);\r\n } else {\r\n let left = this._left;\r\n let right = this._right;\r\n let bottom = this._bottom;\r\n let top = this._top;\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.ortho(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":["OrthoCamera","Camera","_right","_top","_bottom","_near","_far","_window","scene","left","right","bottom","top","near","far","_left","_invalidate","window","val","slice","adapted","getProjectionMatrix","getLeftPlane","getRightPlane","getTopPlane","getBottomPlane","setPerspective","Error","setOrtho","setProjectionMatrix","matrix","_projMatrix","isOrtho","getNearPlane","getFarPlane","calcAdaptedOrthographicProjection","width","height","ortho","Matrix4x4","invert","_invProjMatrix"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Camera } from './camera.js';
2
2
  import { Matrix4x4 } from '@zephyr3d/base';
3
- import { getDevice } from '../app/api.js';
3
+ import { getDevice, getEngine } from '../app/api.js';
4
4
 
5
5
  /**
6
6
  * Perspective camera class
@@ -79,11 +79,16 @@ import { getDevice } from '../app/api.js';
79
79
  }
80
80
  }
81
81
  /** Adjust aspect ratio according to viewport settings of the camera */ adjustAspectRatio() {
82
- if (this._viewport) {
83
- this.aspect = this._viewport[2] / this._viewport[3];
82
+ if (this.viewport) {
83
+ this.aspect = this.viewport[2] / this.viewport[3];
84
84
  } else {
85
- const vp = getDevice().getViewport();
86
- this.aspect = vp.width / vp.height;
85
+ if (!this.adapted || getDevice().getFramebuffer()) {
86
+ const vp = getDevice().getViewport();
87
+ this.aspect = vp.width / vp.height;
88
+ } else {
89
+ const transform = getEngine().screen.transform;
90
+ this.aspect = transform.viewportWidth / transform.viewportHeight;
91
+ }
87
92
  }
88
93
  }
89
94
  /**
@@ -127,21 +132,25 @@ import { getDevice } from '../app/api.js';
127
132
  super.render(scene);
128
133
  }
129
134
  /** @internal */ _computeProj() {
130
- const h = this._near * Math.tan(this._fovY * 0.5);
131
- const w = h * this._aspect;
132
- let left = -w;
133
- let right = w;
134
- let top = h;
135
- let bottom = -h;
136
- if (this._window) {
137
- const width = right - left;
138
- const height = top - bottom;
139
- left += width * this._window[0];
140
- bottom += height * this._window[1];
141
- right = left + width * this._window[2];
142
- top = bottom + height * this._window[3];
135
+ if (this.adapted) {
136
+ this.calcAdaptedPerspectiveProjection(this._fovY, this._near, this._far, this._projMatrix);
137
+ } else {
138
+ const h = this._near * Math.tan(this._fovY * 0.5);
139
+ const w = h * this._aspect;
140
+ let left = -w;
141
+ let right = w;
142
+ let top = h;
143
+ let bottom = -h;
144
+ if (this._window) {
145
+ const width = right - left;
146
+ const height = top - bottom;
147
+ left += width * this._window[0];
148
+ bottom += height * this._window[1];
149
+ right = left + width * this._window[2];
150
+ top = bottom + height * this._window[3];
151
+ }
152
+ this._projMatrix.frustum(left, right, bottom, top, this._near, this._far);
143
153
  }
144
- this._projMatrix.frustum(left, right, bottom, top, this._near, this._far);
145
154
  Matrix4x4.invert(this._projMatrix, this._invProjMatrix);
146
155
  }
147
156
  }
@@ -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 { Matrix4x4 } from '@zephyr3d/base';\r\nimport { getDevice } 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: 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: 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(): number[] {\r\n return this._window;\r\n }\r\n set window(val: 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: boolean) {\r\n this._autoAspect = !!val;\r\n }\r\n /** The near clip plane */\r\n get near(): number {\r\n return this._near;\r\n }\r\n set near(val: number) {\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(): number {\r\n return this._far;\r\n }\r\n set far(val: number) {\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(): number {\r\n return this._fovY;\r\n }\r\n set fovY(val: number) {\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(): number {\r\n return this._aspect;\r\n }\r\n set aspect(val: number) {\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 const vp = getDevice().getViewport();\r\n this.aspect = vp.width / vp.height;\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Camera.setPerspective}\r\n */\r\n setPerspective(fovY: number, aspect: number, zNear: number, zFar: number): this {\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): void {\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(): void {\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 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","vp","getDevice","getViewport","width","height","setPerspective","zNear","zFar","setOrtho","_left","_right","_bottom","_top","Error","setProjectionMatrix","matrix","_projMatrix","isPerspective","getAspect","getFov","getNearPlane","getFarPlane","render","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\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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"}