@hellpig/anarchy-engine 22.0.2 → 22.0.4

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 (397) hide show
  1. package/dist/Abstract/Entities/AbstractEntity.js.map +1 -1
  2. package/dist/Abstract/Factories/AbstractFactory.js.map +1 -1
  3. package/dist/Abstract/Factories/ReactiveFactory.js.map +1 -1
  4. package/dist/Abstract/Loaders/AbstractLoader.js.map +1 -1
  5. package/dist/Abstract/Mixins/WithWrapperIdMixin.js.map +1 -1
  6. package/dist/Abstract/Models/THtmlElementStyleDeclaration.d.ts +4 -4
  7. package/dist/Abstract/Registries/AbstractEntityAsyncRegistry.js.map +1 -1
  8. package/dist/Abstract/Registries/AbstractEntityRegistry.js.map +1 -1
  9. package/dist/Abstract/Registries/AbstractResourceAsyncRegistry.js.map +1 -1
  10. package/dist/Abstract/Registries/AbstractSimpleRegistry.js.map +1 -1
  11. package/dist/Abstract/Registries/AbstractWatcherRegistry.js.map +1 -1
  12. package/dist/Abstract/Registries/Mixin/Registry/WithBaseAccessorsRegistry.js.map +1 -1
  13. package/dist/Abstract/Registries/Mixin/Registry/WithReactiveRegistry.js.map +1 -1
  14. package/dist/Abstract/Services/AbstractService.js.map +1 -1
  15. package/dist/Abstract/Watchers/AbstractWatcher.js.map +1 -1
  16. package/dist/Abstract/Watchers/AbstractWatcherWithState.js.map +1 -1
  17. package/dist/Abstract/Wrappers/AbstractWrapper.js.map +1 -1
  18. package/dist/Actor/Adapters/ConfigToParams.js.map +1 -1
  19. package/dist/Actor/Adapters/EntityToConfig.js.map +1 -1
  20. package/dist/Actor/Adapters/Helpers/ActorStatesConfigToParams.js.map +1 -1
  21. package/dist/Actor/Adapters/Helpers/Model3dSettingsConfigToParams.js.map +1 -1
  22. package/dist/Actor/Entities/Actor/Actor.js.map +1 -1
  23. package/dist/Actor/Factories/ActorFactory.js.map +1 -1
  24. package/dist/Actor/Mixins/WithActorStates.js.map +1 -1
  25. package/dist/Actor/Registries/ActorRegistry.js.map +1 -1
  26. package/dist/Actor/Registries/Model3dToActorConnectionRegistry.js.map +1 -1
  27. package/dist/Actor/Services/ActorService.js.map +1 -1
  28. package/dist/Actor/TransformDrive/ActorTransformDrive.js.map +1 -1
  29. package/dist/Actor/Utils/ActorUtils.js.map +1 -1
  30. package/dist/Animations/Adapters/EntityToConfig.js.map +1 -1
  31. package/dist/Animations/Loader/AnimationsLoader.js.map +1 -1
  32. package/dist/Animations/Registries/AnimationsMetaInfoRegistry.js.map +1 -1
  33. package/dist/Animations/Registries/AnimationsResourceAsyncRegistry.js.map +1 -1
  34. package/dist/Animations/Services/AnimationsService.js.map +1 -1
  35. package/dist/Animations/Utils/SerializationUtils.js.map +1 -1
  36. package/dist/Audio/Adapters/AudioConfigToParams.js.map +1 -1
  37. package/dist/Audio/Adapters/EntityToConfig.js.map +1 -1
  38. package/dist/Audio/Factories/AudioFactory.js.map +1 -1
  39. package/dist/Audio/Loader/AudioLoader.js.map +1 -1
  40. package/dist/Audio/Registries/AudioListenersRegistry.js.map +1 -1
  41. package/dist/Audio/Registries/AudioMetaInfoRegistry.js.map +1 -1
  42. package/dist/Audio/Registries/AudioRegistry.js.map +1 -1
  43. package/dist/Audio/Registries/AudioResourceAsyncRegistry.js.map +1 -1
  44. package/dist/Audio/Services/AudioService.js.map +1 -1
  45. package/dist/Audio/TransformDrive/Audio3dTransformDrive.js.map +1 -1
  46. package/dist/Audio/Utils/AudioUtils.js.map +1 -1
  47. package/dist/Audio/Utils/DebugAudioRenderer.js.map +1 -1
  48. package/dist/Audio/Wrappers/AbstractAudioWrapper.js.map +1 -1
  49. package/dist/Audio/Wrappers/Audio3dWrapper.js.map +1 -1
  50. package/dist/Audio/Wrappers/AudioWrapper.js.map +1 -1
  51. package/dist/Camera/Adapters/ConfigToParams.js.map +1 -1
  52. package/dist/Camera/Adapters/EntityToConfig.js.map +1 -1
  53. package/dist/Camera/Factories/CameraFactory.js.map +1 -1
  54. package/dist/Camera/Registries/AbstractCameraRegistry.js.map +1 -1
  55. package/dist/Camera/Services/CameraService.js.map +1 -1
  56. package/dist/Camera/TransformDrive/CameraTransformDrive.js.map +1 -1
  57. package/dist/Camera/Utils/CameraUtils.js.map +1 -1
  58. package/dist/Camera/Wrappers/Accessors.js.map +1 -1
  59. package/dist/Camera/Wrappers/OrthographicCameraWrapper.js.map +1 -1
  60. package/dist/Camera/Wrappers/PerspectiveCameraWrapper.js.map +1 -1
  61. package/dist/Collisions/Mixins/WithCollisions.js.map +1 -1
  62. package/dist/Collisions/Services/BvhService.js.map +1 -1
  63. package/dist/Collisions/Services/CollisionsService.js.map +1 -1
  64. package/dist/Color/Adapters/EntityToConfig.js.map +1 -1
  65. package/dist/Color/Wrappers/ColorWrapper.js.map +1 -1
  66. package/dist/Context/AmbientContext/AmbientContext.js.map +1 -1
  67. package/dist/Controls/Adapters/ConfigToParams.js.map +1 -1
  68. package/dist/Controls/Adapters/EntityToConfig.js.map +1 -1
  69. package/dist/Controls/Factories/ControlsFactory.js.map +1 -1
  70. package/dist/Controls/Loop/ControlsLoopEffect.js.map +1 -1
  71. package/dist/Controls/Models/TFpsControlsWrapper.d.ts +1 -1
  72. package/dist/Controls/Models/TOrbitControlsWrapper.d.ts +1 -1
  73. package/dist/Controls/Registries/ControlsRegistry.js.map +1 -1
  74. package/dist/Controls/Services/ControlsService.js.map +1 -1
  75. package/dist/Controls/Utils/ControlsUtils.js.map +1 -1
  76. package/dist/Controls/Wrappers/FpsControls/FpsControlsAccessors.d.ts +1 -1
  77. package/dist/Controls/Wrappers/FpsControls/FpsControlsAccessors.js.map +1 -1
  78. package/dist/Controls/Wrappers/FpsControls/FpsControlsWrapper.js.map +1 -1
  79. package/dist/Controls/Wrappers/FpsControls/FpsControlsWrapperHelper.js.map +1 -1
  80. package/dist/Controls/Wrappers/OrbitControls/OrbitControlsAccessors.d.ts +1 -1
  81. package/dist/Controls/Wrappers/OrbitControls/OrbitControlsAccessors.js.map +1 -1
  82. package/dist/Controls/Wrappers/OrbitControls/OrbitControlsWrapper.js.map +1 -1
  83. package/dist/Controls/Wrappers/OrbitControls/OrbitControlsWrapperHelper.js.map +1 -1
  84. package/dist/Distance/Utils/DistanceUtils.js.map +1 -1
  85. package/dist/EnvMap/Adapters/ConfigToParams.js.map +1 -1
  86. package/dist/EnvMap/Adapters/EntityToConfig.js.map +1 -1
  87. package/dist/EnvMap/Factories/EnvMapFactory.js.map +1 -1
  88. package/dist/EnvMap/Loader/EnvMapLoader.js.map +1 -1
  89. package/dist/EnvMap/Registries/EnvMapMetaInfoRegistry.js.map +1 -1
  90. package/dist/EnvMap/Registries/EnvMapRegistry.js.map +1 -1
  91. package/dist/EnvMap/Registries/EnvMapTextureAsyncRegistry.js.map +1 -1
  92. package/dist/EnvMap/Services/EnvMapService.js.map +1 -1
  93. package/dist/EnvMap/Wrappers/EnvMapWrapper.js.map +1 -1
  94. package/dist/Fog/Adapters/ConfigToParams.js.map +1 -1
  95. package/dist/Fog/Adapters/EntityToConfig.js.map +1 -1
  96. package/dist/Fog/Factories/FogFactory.js.map +1 -1
  97. package/dist/Fog/Registries/FogRegistry.js.map +1 -1
  98. package/dist/Fog/Services/FogService.js.map +1 -1
  99. package/dist/Fog/Wrappers/FogWrapper.js.map +1 -1
  100. package/dist/Fsm/Adapters/ConfigToParams.js.map +1 -1
  101. package/dist/Fsm/Adapters/EntityToConfig.js.map +1 -1
  102. package/dist/Fsm/Entities/FsmSource.js.map +1 -1
  103. package/dist/Fsm/Factories/FsmInstanceFactory.js.map +1 -1
  104. package/dist/Fsm/Factories/FsmSourceFactory.js.map +1 -1
  105. package/dist/Fsm/Registries/FsmInstanceRegistry.js.map +1 -1
  106. package/dist/Fsm/Registries/FsmSourceRegistry.js.map +1 -1
  107. package/dist/Fsm/Services/FsmInstanceService.js.map +1 -1
  108. package/dist/Fsm/Services/FsmService.js.map +1 -1
  109. package/dist/Fsm/Services/FsmSourceService.js.map +1 -1
  110. package/dist/Fsm/Wrappers/FsmWrapper.js.map +1 -1
  111. package/dist/Global/Decorators/ContainerDecorator.js.map +1 -1
  112. package/dist/Global/Utils/ContainerUtils.js.map +1 -1
  113. package/dist/Intersections/Adapters/ConfigToParams.js.map +1 -1
  114. package/dist/Intersections/Adapters/EntityToConfig.js.map +1 -1
  115. package/dist/Intersections/Factories/IntersectionsWatcherFactory.js.map +1 -1
  116. package/dist/Intersections/Models/TIntersectionsDirectionWatcher.d.ts +1 -1
  117. package/dist/Intersections/Registries/IntersectionsWatcherRegistry.js.map +1 -1
  118. package/dist/Intersections/Services/IntersectionsWatcherService.js.map +1 -1
  119. package/dist/Intersections/Utils/IntersectionsWatcherUtils.js.map +1 -1
  120. package/dist/Intersections/Watchers/AbstractIntersectionsWatcher.js.map +1 -1
  121. package/dist/Intersections/Watchers/IntersectionsCameraWatcher.js.map +1 -1
  122. package/dist/Intersections/Watchers/IntersectionsDirectionWatcher.js.map +1 -1
  123. package/dist/Keyboard/Factories/KeyWatcherFactory.js.map +1 -1
  124. package/dist/Keyboard/Registries/KeyWatcherRegistry.js.map +1 -1
  125. package/dist/Keyboard/Services/KeyboardService.js.map +1 -1
  126. package/dist/Keyboard/Utils/KeysRxJsUtils.js.map +1 -1
  127. package/dist/Keyboard/Utils/KeysUtils.js.map +1 -1
  128. package/dist/Keyboard/Watchers/KeyComboWatcher.js.map +1 -1
  129. package/dist/Keyboard/Watchers/KeyPressWatcher.js.map +1 -1
  130. package/dist/Keyboard/Watchers/KeyReleaseWatcher.js.map +1 -1
  131. package/dist/Kinematic/Adapters/ConfigToParams.js.map +1 -1
  132. package/dist/Kinematic/Adapters/EntityToConfig.js.map +1 -1
  133. package/dist/Kinematic/Constants/KinematicConstants.js.map +1 -1
  134. package/dist/Kinematic/Utils/KinematicUtils.js.map +1 -1
  135. package/dist/Light/Adapters/ConfigToParams.js.map +1 -1
  136. package/dist/Light/Adapters/EntityToConfig.js.map +1 -1
  137. package/dist/Light/Factories/LightFactory.js.map +1 -1
  138. package/dist/Light/Registries/LightRegistry.js.map +1 -1
  139. package/dist/Light/Services/LightService.js.map +1 -1
  140. package/dist/Light/TransformDrive/LightTransformDrive.js.map +1 -1
  141. package/dist/Light/Utils/Utils.js.map +1 -1
  142. package/dist/Light/Wrappers/AbstractLightWrapper.js.map +1 -1
  143. package/dist/Light/Wrappers/AmbientLightWrapper.js.map +1 -1
  144. package/dist/Light/Wrappers/DirectionalLightWrapper.js.map +1 -1
  145. package/dist/Light/Wrappers/HemisphereLightWrapper.js.map +1 -1
  146. package/dist/Light/Wrappers/LightWrapperHelper.js.map +1 -1
  147. package/dist/Light/Wrappers/PointLightWrapper.js.map +1 -1
  148. package/dist/Light/Wrappers/RectAreaLightWrapper.js.map +1 -1
  149. package/dist/Light/Wrappers/SpotLightWrapper.js.map +1 -1
  150. package/dist/LoadingManager/Factories/LoadingManagerFactory.js.map +1 -1
  151. package/dist/LoadingManager/Registries/LoadingManagerRegistry.js.map +1 -1
  152. package/dist/LoadingManager/Services/LoadingManagerService.js.map +1 -1
  153. package/dist/LoadingManager/Wrappers/LoadingManagerWrapper.js.map +1 -1
  154. package/dist/Loop/Constants/LoopsDefaultSettings.js.map +1 -1
  155. package/dist/Loop/Entities/DeltaCalculator.js.map +1 -1
  156. package/dist/Loop/Entities/Loop.js.map +1 -1
  157. package/dist/Loop/Factories/LoopFactory.js.map +1 -1
  158. package/dist/Loop/Registries/LoopRegistry.js.map +1 -1
  159. package/dist/Loop/Services/LoopService.js.map +1 -1
  160. package/dist/Loop/Utils/LoopDebugUtils.js.map +1 -1
  161. package/dist/Loop/Utils/LoopUtils.js.map +1 -1
  162. package/dist/Material/Adapters/ConfigToParams.js.map +1 -1
  163. package/dist/Material/Adapters/EntityToConfig.js.map +1 -1
  164. package/dist/Material/Constants/Material/MaterialMap.js.map +1 -1
  165. package/dist/Material/Factories/MaterialFactory.js.map +1 -1
  166. package/dist/Material/Mixins/WithMaterial.d.ts +1 -1
  167. package/dist/Material/Mixins/WithMaterial.js.map +1 -1
  168. package/dist/Material/Models/TMaterialParamsOptions.d.ts +1 -4
  169. package/dist/Material/Registries/MaterialRegistry.js.map +1 -1
  170. package/dist/Material/Services/MaterialService.js.map +1 -1
  171. package/dist/Material/Utils/MaterialUtils.js.map +1 -1
  172. package/dist/Material/Wrappers/MaterialWrapper.js.map +1 -1
  173. package/dist/Math/Utils/AnglesUtils.js +1 -1
  174. package/dist/Math/Utils/AnglesUtils.js.map +1 -1
  175. package/dist/Math/Utils/DistanceUtils.js.map +1 -1
  176. package/dist/Measurements/Constants/Distance.js.map +1 -1
  177. package/dist/Measurements/Constants/Time.js.map +1 -1
  178. package/dist/Measurements/Utils/MeasurementsUtils.d.ts +1 -1
  179. package/dist/Measurements/Utils/MeasurementsUtils.js.map +1 -1
  180. package/dist/Mixins/GameObjects/Mixins/Movable/WithMoveBy2dMixin.js.map +1 -1
  181. package/dist/Mixins/GameObjects/Mixins/Movable/WithMoveBy3dMixin.js.map +1 -1
  182. package/dist/Mixins/GameObjects/Mixins/Movable/WithMoveBy4dMixin.js.map +1 -1
  183. package/dist/Mixins/GameObjects/Mixins/Movable/WithMoveByWMixin.js.map +1 -1
  184. package/dist/Mixins/GameObjects/Mixins/Movable/WithMoveByXMixin.js.map +1 -1
  185. package/dist/Mixins/GameObjects/Mixins/Movable/WithMoveByYMixin.js.map +1 -1
  186. package/dist/Mixins/GameObjects/Mixins/Movable/WithMoveByZMixin.js.map +1 -1
  187. package/dist/Mixins/GameObjects/Mixins/Position/WithPosition2dMixin.js.map +1 -1
  188. package/dist/Mixins/GameObjects/Mixins/Position/WithPosition3dMixin.js.map +1 -1
  189. package/dist/Mixins/GameObjects/Mixins/Position/WithPosition4dMixin.js.map +1 -1
  190. package/dist/Mixins/GameObjects/Mixins/Position/WithPositionMixin.js.map +1 -1
  191. package/dist/Mixins/GameObjects/Mixins/Rotatable/WithRotationByWMixin.js.map +1 -1
  192. package/dist/Mixins/GameObjects/Mixins/Rotatable/WithRotationByXMixin.js.map +1 -1
  193. package/dist/Mixins/GameObjects/Mixins/Rotatable/WithRotationByXyzMixin.js.map +1 -1
  194. package/dist/Mixins/GameObjects/Mixins/Rotatable/WithRotationByYMixin.js.map +1 -1
  195. package/dist/Mixins/GameObjects/Mixins/Rotatable/WithRotationByZMixin.js.map +1 -1
  196. package/dist/Mixins/GameObjects/Mixins/Rotatable/WithRotationMixin.js.map +1 -1
  197. package/dist/Mixins/GameObjects/Mixins/Scalable/WithScaleMixin.js.map +1 -1
  198. package/dist/Mixins/GameObjects/Mixins/WithObject3D.js.map +1 -1
  199. package/dist/Mixins/Generics/DestroyableMixin.js.map +1 -1
  200. package/dist/Mixins/Generics/ExtractSerializableRegistrableFields.js.map +1 -1
  201. package/dist/Mixins/Generics/WithActiveEntityServiceMixin.js.map +1 -1
  202. package/dist/Mixins/Generics/WithActiveMixin.js.map +1 -1
  203. package/dist/Mixins/Generics/WithNameAndNameAccessorsMixin.js.map +1 -1
  204. package/dist/Mixins/Services/WithCreateFromConfigService.js.map +1 -1
  205. package/dist/Mixins/Services/WithCreateService.js.map +1 -1
  206. package/dist/Mixins/Services/WithFactoryService.js.map +1 -1
  207. package/dist/Mixins/Services/WithRegistryService.js.map +1 -1
  208. package/dist/Mixins/Services/WithSceneGetterService.js.map +1 -1
  209. package/dist/Mixins/Services/WithSerializableEntities.js.map +1 -1
  210. package/dist/Mixins/Services/WithSerializeAllResources.js.map +1 -1
  211. package/dist/Models3d/Adapters/ConfigToParams.js.map +1 -1
  212. package/dist/Models3d/Adapters/EntityToConfig.js.map +1 -1
  213. package/dist/Models3d/Entities/Model3d.js.map +1 -1
  214. package/dist/Models3d/Factories/Models3dFactory.js.map +1 -1
  215. package/dist/Models3d/Loaders/Loader3dCore.js.map +1 -1
  216. package/dist/Models3d/Loaders/Models3dLoader.js.map +1 -1
  217. package/dist/Models3d/Mixins/WithModel3dEntities.js.map +1 -1
  218. package/dist/Models3d/Models/TModel3dParams.d.ts +1 -1
  219. package/dist/Models3d/Models/TModels3dLoader.d.ts +1 -1
  220. package/dist/Models3d/Models/TModels3dResourceAsyncRegistry.d.ts +1 -1
  221. package/dist/Models3d/Models/TModels3dService.d.ts +1 -1
  222. package/dist/Models3d/Registries/Model3dRawToModel3dConnectionRegistry.js.map +1 -1
  223. package/dist/Models3d/Registries/Models3dMetaInfoRegistry.js.map +1 -1
  224. package/dist/Models3d/Registries/Models3dRegistry.js.map +1 -1
  225. package/dist/Models3d/Registries/Models3dResourceAsyncRegistry.js.map +1 -1
  226. package/dist/Models3d/Services/Models3dService.js.map +1 -1
  227. package/dist/Models3d/Utils/SerializationUtils.js.map +1 -1
  228. package/dist/Models3d/Utils/UtilsModel3d.d.ts +1 -1
  229. package/dist/Models3d/Utils/UtilsModel3d.js.map +1 -1
  230. package/dist/Models3d/Utils/UtilsModels3dService.js.map +1 -1
  231. package/dist/Models3d/Utils/UtilsPrimitiveModels3d.d.ts +1 -1
  232. package/dist/Models3d/Utils/UtilsPrimitiveModels3d.js.map +1 -1
  233. package/dist/Mouse/Factories/MouseClickWatcherFactory.js.map +1 -1
  234. package/dist/Mouse/Factories/MousePositionWatcherFactory.js.map +1 -1
  235. package/dist/Mouse/Registries/MouseClickWatcherRegistry.js.map +1 -1
  236. package/dist/Mouse/Registries/MousePositionWatcherRegistry.js.map +1 -1
  237. package/dist/Mouse/Services/MouseService.js.map +1 -1
  238. package/dist/Mouse/Utils/MouseUtils.js.map +1 -1
  239. package/dist/Mouse/Watchers/MouseClickWatcher.js.map +1 -1
  240. package/dist/Mouse/Watchers/MousePositionWatcher.js.map +1 -1
  241. package/dist/Particles/Adapters/ConfigToParams.js.map +1 -1
  242. package/dist/Particles/Adapters/EntityToConfig.js.map +1 -1
  243. package/dist/Particles/Factories/ParticlesFactory.js.map +1 -1
  244. package/dist/Particles/Registries/ParticlesRegistry.js.map +1 -1
  245. package/dist/Particles/Services/ParticlesService.js.map +1 -1
  246. package/dist/Particles/TransformDrive/ParticlesTransformDrive.js.map +1 -1
  247. package/dist/Particles/Wrappers/ParticlesWrapper.js.map +1 -1
  248. package/dist/Physics/Adapters/EntityToConfig.d.ts +1 -1
  249. package/dist/Physics/Adapters/EntityToConfig.js.map +1 -1
  250. package/dist/Physics/Adapters/PhysicsBodyConfigToParams.js +1 -1
  251. package/dist/Physics/Adapters/PhysicsBodyConfigToParams.js.map +1 -1
  252. package/dist/Physics/Adapters/PhysicsWorldConfigToParams.js.map +1 -1
  253. package/dist/Physics/Constants/RigidBodyTypesMap.d.ts +1 -1
  254. package/dist/Physics/Constants/RigidBodyTypesMap.js +1 -1
  255. package/dist/Physics/Constants/RigidBodyTypesMap.js.map +1 -1
  256. package/dist/Physics/Entities/PhysicsBody.js.map +1 -1
  257. package/dist/Physics/Entities/PhysicsBodyUtils.d.ts +1 -1
  258. package/dist/Physics/Entities/PhysicsBodyUtils.js +1 -1
  259. package/dist/Physics/Entities/PhysicsBodyUtils.js.map +1 -1
  260. package/dist/Physics/Factories/PhysicsBodyFactory.js.map +1 -1
  261. package/dist/Physics/Mixins/WithPhysicsBodyEntities.js.map +1 -1
  262. package/dist/Physics/Models/TPhysicsWorldService.d.ts +1 -1
  263. package/dist/Physics/Registries/PhysicsBodyRegistry.js.map +1 -1
  264. package/dist/Physics/Renderers/PhysicsDebugRenderer.d.ts +1 -1
  265. package/dist/Physics/Renderers/PhysicsDebugRenderer.js.map +1 -1
  266. package/dist/Physics/Services/PhysicsBodyService.js.map +1 -1
  267. package/dist/Physics/Services/PhysicsWorldService.js +1 -1
  268. package/dist/Physics/Services/PhysicsWorldService.js.map +1 -1
  269. package/dist/Physics/Utils/ParamsUtils.js.map +1 -1
  270. package/dist/Physics/Utils/PhysicsMovementUtils.d.ts +2 -2
  271. package/dist/Physics/Utils/PhysicsMovementUtils.js +1 -1
  272. package/dist/Physics/Utils/PhysicsMovementUtils.js.map +1 -1
  273. package/dist/Renderer/Adapters/ConfigToParams.js.map +1 -1
  274. package/dist/Renderer/Adapters/EntityToConfig.js.map +1 -1
  275. package/dist/Renderer/Factories/RendererFactory.js.map +1 -1
  276. package/dist/Renderer/Loop/RendererLoopEffect.js.map +1 -1
  277. package/dist/Renderer/Mixins/WithThreeJsRendererParamsAccessors.js.map +1 -1
  278. package/dist/Renderer/Mixins/WithThreeJsRendererPropsAccessors.js.map +1 -1
  279. package/dist/Renderer/Registries/RendererRegistry.js.map +1 -1
  280. package/dist/Renderer/Services/RendererService.js.map +1 -1
  281. package/dist/Renderer/Wrappers/Accessors.js.map +1 -1
  282. package/dist/Renderer/Wrappers/RendererWrapper.js.map +1 -1
  283. package/dist/Scene/Adapters/ConfigToParams.js.map +1 -1
  284. package/dist/Scene/Adapters/EntityToConfig.js.map +1 -1
  285. package/dist/Scene/Factories/SceneFactory.js.map +1 -1
  286. package/dist/Scene/Registries/SceneRegistry.js.map +1 -1
  287. package/dist/Scene/Services/ScenesService.js.map +1 -1
  288. package/dist/Scene/Wrappers/SceneWrapper.js.map +1 -1
  289. package/dist/Space/Adapters/ConfigToParams.js.map +1 -1
  290. package/dist/Space/Adapters/EntityToConfig.js.map +1 -1
  291. package/dist/Space/Entities/Space.js.map +1 -1
  292. package/dist/Space/Entities/SpaceFromConfig.js.map +1 -1
  293. package/dist/Space/Factories/SpaceFactory.js.map +1 -1
  294. package/dist/Space/Registries/SpaceRegistry.js.map +1 -1
  295. package/dist/Space/Services/SpaceService.js.map +1 -1
  296. package/dist/Space/Utils/CanvasUtils.js.map +1 -1
  297. package/dist/Space/Utils/CreateEntitiesUtils.js.map +1 -1
  298. package/dist/Space/Utils/CreateLoopsUtils.js.map +1 -1
  299. package/dist/Space/Utils/LoadResourcesUtils.js.map +1 -1
  300. package/dist/Space/Utils/PrepareServicesUtils.js.map +1 -1
  301. package/dist/Space/Utils/SchemaValidationUtils.js.map +1 -1
  302. package/dist/Space/Validators/SchemasValidator.js.map +1 -1
  303. package/dist/Space/Validators/ValidateConfig.js.map +1 -1
  304. package/dist/Space/Validators/ValidateSpace.js.map +1 -1
  305. package/dist/Spatial/Adapters/ConfigToParams.js.map +1 -1
  306. package/dist/Spatial/Adapters/ConfigToParamsSpatialData.js.map +1 -1
  307. package/dist/Spatial/Adapters/EntityToConfig.js.map +1 -1
  308. package/dist/Spatial/Factories/SpatialGridFactory.js.map +1 -1
  309. package/dist/Spatial/Mixins/WithReactivePosition.js.map +1 -1
  310. package/dist/Spatial/Mixins/WithReactiveRotation.js.map +1 -1
  311. package/dist/Spatial/Mixins/WithSpatial.js.map +1 -1
  312. package/dist/Spatial/Mixins/WithUpdateSpatialCell.js.map +1 -1
  313. package/dist/Spatial/Registries/SpatialGridRegistry.js.map +1 -1
  314. package/dist/Spatial/Services/SpatialGridService.js.map +1 -1
  315. package/dist/Spatial/Services/SpatialHelper.d.ts +1 -1
  316. package/dist/Spatial/Services/SpatialHelper.js.map +1 -1
  317. package/dist/Spatial/Wrappers/SpatialCellWrapper.js.map +1 -1
  318. package/dist/Spatial/Wrappers/SpatialGridWrapper.js.map +1 -1
  319. package/dist/Text/Adapters/ConfigToParams.js.map +1 -1
  320. package/dist/Text/Adapters/EntityToConfig.js.map +1 -1
  321. package/dist/Text/Factories/TextFactory.js.map +1 -1
  322. package/dist/Text/Loop/TextLoopEffect.js.map +1 -1
  323. package/dist/Text/Models/TText2dRenderer.d.ts +1 -1
  324. package/dist/Text/Models/TText2dWrapper.d.ts +1 -1
  325. package/dist/Text/Models/TText3dRenderer.d.ts +1 -1
  326. package/dist/Text/Models/TText3dWrapper.d.ts +1 -1
  327. package/dist/Text/Models/TTextRenderer.d.ts +2 -2
  328. package/dist/Text/Models/TTextWrapper.d.ts +2 -2
  329. package/dist/Text/Registries/Text2dRegistry.js.map +1 -1
  330. package/dist/Text/Registries/Text2dRendererRegistry.js.map +1 -1
  331. package/dist/Text/Registries/Text3dRegistry.js.map +1 -1
  332. package/dist/Text/Registries/Text3dRendererRegistry.js.map +1 -1
  333. package/dist/Text/Registries/Text3dTextureRegistry.js.map +1 -1
  334. package/dist/Text/Renderers/Text2dRenderer.js.map +1 -1
  335. package/dist/Text/Renderers/Text3dRenderer.js.map +1 -1
  336. package/dist/Text/Renderers/TextRendererBuilder.d.ts +2 -2
  337. package/dist/Text/Renderers/TextRendererBuilder.js.map +1 -1
  338. package/dist/Text/Services/TextService.js.map +1 -1
  339. package/dist/Text/TransformDrive/TextTransformDrive.js.map +1 -1
  340. package/dist/Text/Utils/TextUtils.js.map +1 -1
  341. package/dist/Text/Wrappers/Accessors.js.map +1 -1
  342. package/dist/Text/Wrappers/Text2dWrapper.js.map +1 -1
  343. package/dist/Text/Wrappers/Text3dTextureWrapper.js.map +1 -1
  344. package/dist/Text/Wrappers/Text3dWrapper.js.map +1 -1
  345. package/dist/Text/Wrappers/TextTextureWrapper.js.map +1 -1
  346. package/dist/Text/Wrappers/TextWrapper.d.ts +2 -2
  347. package/dist/Text/Wrappers/TextWrapper.js.map +1 -1
  348. package/dist/Text/Wrappers/TextWrapperBuilder.js.map +1 -1
  349. package/dist/Text/Wrappers/TextWrapperHelper.js.map +1 -1
  350. package/dist/Texture/Loaders/TexturesLoader.js.map +1 -1
  351. package/dist/Texture/Registries/TextureMetaInfoRegistry.js.map +1 -1
  352. package/dist/Texture/Registries/TextureResourceAsyncRegistry.js.map +1 -1
  353. package/dist/Texture/Services/TextureService.js.map +1 -1
  354. package/dist/Texture/Utils/TextureServiceHelper.js.map +1 -1
  355. package/dist/ThreeLib/Utils/Object3dUtils.js.map +1 -1
  356. package/dist/TransformDrive/Adapters/EntityToConfig.js.map +1 -1
  357. package/dist/TransformDrive/Entities/Agents/AbstractTransformAgent.js.map +1 -1
  358. package/dist/TransformDrive/Entities/Agents/ConnectedTransformAgent.js.map +1 -1
  359. package/dist/TransformDrive/Entities/Agents/DefaultTransformAgent.js.map +1 -1
  360. package/dist/TransformDrive/Entities/Agents/KinematicTransformAgent.js.map +1 -1
  361. package/dist/TransformDrive/Entities/Agents/PhysicsTransformAgent.js.map +1 -1
  362. package/dist/TransformDrive/Entities/Connectors/DriveToTargetConnector.js.map +1 -1
  363. package/dist/TransformDrive/Entities/Drive/TransformDrive.js.map +1 -1
  364. package/dist/TransformDrive/Factories/TransformDriveFactory.js.map +1 -1
  365. package/dist/TransformDrive/Mixins/WithMutablePositionConnector.js.map +1 -1
  366. package/dist/TransformDrive/Mixins/WithMutableRotationConnector.js.map +1 -1
  367. package/dist/TransformDrive/Mixins/WithMutableScaleConnector.js.map +1 -1
  368. package/dist/TransformDrive/Mixins/WithProxyTransform.js.map +1 -1
  369. package/dist/TransformDrive/Registries/TransformDriveRegistry.js.map +1 -1
  370. package/dist/TransformDrive/Services/TransformDriveService.js.map +1 -1
  371. package/dist/TransformDrive/Utils/ActorDriveUtils.js.map +1 -1
  372. package/dist/TransformDrive/Utils/AgentUtils.js.map +1 -1
  373. package/dist/TransformDrive/Utils/KinematicAgentUtils.js.map +1 -1
  374. package/dist/TransformDrive/Utils/PhysicsTransformAgentUtils.d.ts +1 -1
  375. package/dist/TransformDrive/Utils/PhysicsTransformAgentUtils.js.map +1 -1
  376. package/dist/TransformDrive/Utils/TransformDriveUtils.js.map +1 -1
  377. package/dist/Utils/CheckUtils.js.map +1 -1
  378. package/dist/Utils/CoordsUtils.js.map +1 -1
  379. package/dist/Utils/DateTimeUtils.d.ts +1 -1
  380. package/dist/Utils/DestroyUtils.js.map +1 -1
  381. package/dist/Utils/DomUtils.js.map +1 -1
  382. package/dist/Utils/EntityUtils.js.map +1 -1
  383. package/dist/Utils/RegistryAsyncUtils.js.map +1 -1
  384. package/dist/Utils/RegistryUtils.js.map +1 -1
  385. package/dist/Utils/RxJsUtils.js.map +1 -1
  386. package/dist/Utils/ScreenUtils.js.map +1 -1
  387. package/dist/Utils/TagsUtils.js.map +1 -1
  388. package/dist/Utils/TransformUtils.js.map +1 -1
  389. package/dist/Utils/WrapperHelpers.d.ts +1 -1
  390. package/dist/Utils/WrapperHelpers.js.map +1 -1
  391. package/dist/assets/Loop.worker-D1bMWlsN.js.map +1 -1
  392. package/dist/packages/anarchy-shared/src/Utils/AsyncUtils.js.map +1 -1
  393. package/dist/packages/anarchy-shared/src/Utils/CssUtils.js.map +1 -1
  394. package/dist/packages/anarchy-shared/src/Utils/ObjectUtils.js.map +1 -1
  395. package/legal/NOTICE.md +1 -1
  396. package/legal/THIRD_PARTY_LICENSES.md +1 -1
  397. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultTransformAgent.js","sources":["../../../../src/TransformDrive/Entities/Agents/DefaultTransformAgent.ts"],"sourcesContent":["import type { TWithPosition3dProperty, TWithQuaternionRotationProperty, TWithScaleProperty } from '@Anarchy/Engine/Mixins';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport { withProxyTransform } from '@Anarchy/Engine/TransformDrive/Mixins';\nimport type { TAbstractTransformAgent, TDefaultTransformAgent, TTransformAgentParams } from '@Anarchy/Engine/TransformDrive/Models';\nimport { updateSubjOnChange } from '@Anarchy/Engine/Utils';\nimport type { Subject, Subscription } from 'rxjs';\nimport type { Quaternion, Vector3 } from 'three';\n\nimport { AbstractTransformAgent } from './AbstractTransformAgent';\n\nexport function DefaultTransformAgent(params: TTransformAgentParams): TDefaultTransformAgent {\n const abstractTransformAgent: TAbstractTransformAgent = AbstractTransformAgent(params, TransformAgent.Default);\n\n const destroySub$: Subscription = abstractTransformAgent.destroy$.subscribe((): void => {\n //Stop subscriptions\n destroySub$.unsubscribe();\n\n abstractTransformAgent.destroy$.next();\n });\n\n const positionObj: TWithPosition3dProperty = { position: abstractTransformAgent.position$.value.clone() };\n const rotationObj: TWithQuaternionRotationProperty = { rotation: abstractTransformAgent.rotation$.value.clone() };\n const scaleObj: TWithScaleProperty = { scale: abstractTransformAgent.scale$.value.clone() };\n\n const proxyPositionObj: TWithPosition3dProperty = updateSubjOnChange(\n positionObj,\n 'position',\n abstractTransformAgent.position$ as unknown as Subject<Vector3>,\n (value: TReadonlyVector3): Vector3 => value.clone()\n );\n const proxyRotationObj: TWithQuaternionRotationProperty = updateSubjOnChange(\n rotationObj,\n 'rotation',\n abstractTransformAgent.rotation$ as unknown as Subject<Quaternion>,\n (value: TReadonlyQuaternion): Quaternion => value.clone()\n );\n const proxyScaleObj: TWithScaleProperty = updateSubjOnChange(\n scaleObj,\n 'scale',\n abstractTransformAgent.scale$ as unknown as Subject<Vector3>,\n (value: TReadonlyVector3): Vector3 => value.clone()\n ) as TWithScaleProperty;\n\n // eslint-disable-next-line functional/immutable-data\n return Object.assign(abstractTransformAgent, {\n ...withProxyTransform(abstractTransformAgent, proxyPositionObj, proxyRotationObj, proxyScaleObj),\n setPosition: (position: TReadonlyVector3): void => abstractTransformAgent.position$.next(position),\n setRotation: (rotation: TReadonlyQuaternion): void => abstractTransformAgent.rotation$.next(rotation),\n setScale: (scale: TReadonlyVector3): void => abstractTransformAgent.scale$.next(scale)\n });\n}\n"],"names":["DefaultTransformAgent","params","abstractTransformAgent","AbstractTransformAgent","TransformAgent","Default","destroySub$","destroy$","subscribe","unsubscribe","next","positionObj","position","position$","value","clone","rotationObj","rotation","rotation$","scaleObj","scale","scale$","proxyPositionObj","updateSubjOnChange","proxyRotationObj","proxyScaleObj","Object","assign","withProxyTransform","setPosition","setRotation","setScale"],"mappings":"6PAWO,SAASA,sBAAsBC,QACpC,MAAMC,uBAAkDC,uBAAuBF,OAAQG,eAAeC,SAEhGC,YAA4BJ,uBAAuBK,SAASC,UAAU,KAE1EF,YAAYG,cAEZP,uBAAuBK,SAASG,SAG5BC,YAAuC,CAAEC,SAAUV,uBAAuBW,UAAUC,MAAMC,SAC1FC,YAA+C,CAAEC,SAAUf,uBAAuBgB,UAAUJ,MAAMC,SAClGI,SAA+B,CAAEC,MAAOlB,uBAAuBmB,OAAOP,MAAMC,SAE5EO,iBAA4CC,mBAChDZ,YACA,WACAT,uBAAuBW,UACtBC,OAAqCA,MAAMC,SAExCS,iBAAoDD,mBACxDP,YACA,WACAd,uBAAuBgB,UACtBJ,OAA2CA,MAAMC,SAE9CU,cAAoCF,mBACxCJ,SACA,QACAjB,uBAAuBmB,OACtBP,OAAqCA,MAAMC,SAI9C,OAAOW,OAAOC,OAAOzB,uBAAwB,IACxC0B,mBAAmB1B,uBAAwBoB,iBAAkBE,iBAAkBC,eAClFI,YAAcjB,UAAqCV,uBAAuBW,UAAUH,KAAKE,UACzFkB,YAAcb,UAAwCf,uBAAuBgB,UAAUR,KAAKO,UAC5Fc,SAAWX,OAAkClB,uBAAuBmB,OAAOX,KAAKU,QAEpF"}
1
+ {"version":3,"file":"DefaultTransformAgent.js","sources":["../../../../src/TransformDrive/Entities/Agents/DefaultTransformAgent.ts"],"sourcesContent":["import type { TWithPosition3dProperty, TWithQuaternionRotationProperty, TWithScaleProperty } from '@hellpig/anarchy-engine/Mixins';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@hellpig/anarchy-engine/ThreeLib';\nimport { TransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Constants';\nimport { withProxyTransform } from '@hellpig/anarchy-engine/TransformDrive/Mixins';\nimport type { TAbstractTransformAgent, TDefaultTransformAgent, TTransformAgentParams } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { updateSubjOnChange } from '@hellpig/anarchy-engine/Utils';\nimport type { Subject, Subscription } from 'rxjs';\nimport type { Quaternion, Vector3 } from 'three';\n\nimport { AbstractTransformAgent } from './AbstractTransformAgent';\n\nexport function DefaultTransformAgent(params: TTransformAgentParams): TDefaultTransformAgent {\n const abstractTransformAgent: TAbstractTransformAgent = AbstractTransformAgent(params, TransformAgent.Default);\n\n const destroySub$: Subscription = abstractTransformAgent.destroy$.subscribe((): void => {\n //Stop subscriptions\n destroySub$.unsubscribe();\n\n abstractTransformAgent.destroy$.next();\n });\n\n const positionObj: TWithPosition3dProperty = { position: abstractTransformAgent.position$.value.clone() };\n const rotationObj: TWithQuaternionRotationProperty = { rotation: abstractTransformAgent.rotation$.value.clone() };\n const scaleObj: TWithScaleProperty = { scale: abstractTransformAgent.scale$.value.clone() };\n\n const proxyPositionObj: TWithPosition3dProperty = updateSubjOnChange(\n positionObj,\n 'position',\n abstractTransformAgent.position$ as unknown as Subject<Vector3>,\n (value: TReadonlyVector3): Vector3 => value.clone()\n );\n const proxyRotationObj: TWithQuaternionRotationProperty = updateSubjOnChange(\n rotationObj,\n 'rotation',\n abstractTransformAgent.rotation$ as unknown as Subject<Quaternion>,\n (value: TReadonlyQuaternion): Quaternion => value.clone()\n );\n const proxyScaleObj: TWithScaleProperty = updateSubjOnChange(\n scaleObj,\n 'scale',\n abstractTransformAgent.scale$ as unknown as Subject<Vector3>,\n (value: TReadonlyVector3): Vector3 => value.clone()\n ) as TWithScaleProperty;\n\n // eslint-disable-next-line functional/immutable-data\n return Object.assign(abstractTransformAgent, {\n ...withProxyTransform(abstractTransformAgent, proxyPositionObj, proxyRotationObj, proxyScaleObj),\n setPosition: (position: TReadonlyVector3): void => abstractTransformAgent.position$.next(position),\n setRotation: (rotation: TReadonlyQuaternion): void => abstractTransformAgent.rotation$.next(rotation),\n setScale: (scale: TReadonlyVector3): void => abstractTransformAgent.scale$.next(scale)\n });\n}\n"],"names":["DefaultTransformAgent","params","abstractTransformAgent","AbstractTransformAgent","TransformAgent","Default","destroySub$","destroy$","subscribe","unsubscribe","next","positionObj","position","position$","value","clone","rotationObj","rotation","rotation$","scaleObj","scale","scale$","proxyPositionObj","updateSubjOnChange","proxyRotationObj","proxyScaleObj","Object","assign","withProxyTransform","setPosition","setRotation","setScale"],"mappings":"6PAWO,SAASA,sBAAsBC,QACpC,MAAMC,uBAAkDC,uBAAuBF,OAAQG,eAAeC,SAEhGC,YAA4BJ,uBAAuBK,SAASC,UAAU,KAE1EF,YAAYG,cAEZP,uBAAuBK,SAASG,SAG5BC,YAAuC,CAAEC,SAAUV,uBAAuBW,UAAUC,MAAMC,SAC1FC,YAA+C,CAAEC,SAAUf,uBAAuBgB,UAAUJ,MAAMC,SAClGI,SAA+B,CAAEC,MAAOlB,uBAAuBmB,OAAOP,MAAMC,SAE5EO,iBAA4CC,mBAChDZ,YACA,WACAT,uBAAuBW,UACtBC,OAAqCA,MAAMC,SAExCS,iBAAoDD,mBACxDP,YACA,WACAd,uBAAuBgB,UACtBJ,OAA2CA,MAAMC,SAE9CU,cAAoCF,mBACxCJ,SACA,QACAjB,uBAAuBmB,OACtBP,OAAqCA,MAAMC,SAI9C,OAAOW,OAAOC,OAAOzB,uBAAwB,IACxC0B,mBAAmB1B,uBAAwBoB,iBAAkBE,iBAAkBC,eAClFI,YAAcjB,UAAqCV,uBAAuBW,UAAUH,KAAKE,UACzFkB,YAAcb,UAAwCf,uBAAuBgB,UAAUR,KAAKO,UAC5Fc,SAAWX,OAAkClB,uBAAuBmB,OAAOX,KAAKU,QAEpF"}
@@ -1 +1 @@
1
- {"version":3,"file":"KinematicTransformAgent.js","sources":["../../../../src/TransformDrive/Entities/Agents/KinematicTransformAgent.ts"],"sourcesContent":["import { metersPerSecond } from '@Anarchy/Engine/Distance';\nimport { DefaultIsAutoUpdate, DefaultKinematicState, DefaultKinematicTarget, kinematicEntityToConfig } from '@Anarchy/Engine/Kinematic';\nimport { ForwardAxis } from '@Anarchy/Engine/Kinematic/Constants';\nimport type { TKinematicConfig, TKinematicData, TKinematicWritableData } from '@Anarchy/Engine/Kinematic/Models';\nimport type { TMeters, TMetersPerSecond, TMilliseconds, TRadians, TRadiansPerSecond } from '@Anarchy/Engine/Math';\nimport { getAzimuthElevationFromVector, getElevationFromDirection } from '@Anarchy/Engine/Math';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport type { TAbstractTransformAgent, TKinematicAgentDependencies, TKinematicSpeed, TKinematicTransformAgent, TKinematicTransformAgentParams } from '@Anarchy/Engine/TransformDrive/Models';\nimport { getStepRotation, isInstant, isPointReached, isRotationReached, moveInstantly, rotateInstantly } from '@Anarchy/Engine/TransformDrive/Utils/KinematicAgentUtils';\nimport { isDefined, isNotDefined } from '@Anarchy/Shared/Utils';\nimport type { Observable, Subscription } from 'rxjs';\nimport { BehaviorSubject, combineLatest, EMPTY, switchMap } from 'rxjs';\nimport type { QuaternionLike, Vector3Like } from 'three';\nimport { Object3D, Quaternion, Vector3 } from 'three';\n\nimport { AbstractTransformAgent } from './AbstractTransformAgent';\n\nexport function KinematicTransformAgent(params: TKinematicTransformAgentParams, { kinematicLoop }: TKinematicAgentDependencies): TKinematicTransformAgent {\n const autoUpdate$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(params.isAutoUpdate ?? DefaultIsAutoUpdate);\n const abstractTransformAgent: TAbstractTransformAgent = AbstractTransformAgent(params, TransformAgent.Kinematic);\n\n let kinematicSub$: Subscription | undefined = undefined;\n\n let tempObject: Object3D = new Object3D();\n let linearDirection: Vector3 = new Vector3();\n let displacement: Vector3 = new Vector3();\n\n const destroySub$: Subscription = abstractTransformAgent.destroy$.subscribe((): void => {\n //Stop subscriptions\n destroySub$.unsubscribe();\n kinematicSub$?.unsubscribe();\n\n abstractTransformAgent.destroy$.next();\n\n tempObject.parent?.remove(tempObject);\n tempObject = null as any;\n linearDirection = null as any;\n displacement = null as any;\n });\n\n // eslint-disable-next-line functional/immutable-data\n const agent: Omit<TKinematicTransformAgent, 'data'> & Readonly<{ data: TKinematicWritableData }> = Object.assign(abstractTransformAgent, {\n data: {\n state: {\n linearSpeed: params.state.linearSpeed ?? DefaultKinematicState.linearSpeed,\n linearDirection: params.state.linearDirection?.clone() ?? DefaultKinematicState.linearDirection,\n angularSpeed: params.state.angularSpeed ?? DefaultKinematicState.angularSpeed,\n radius: params.state.radius ?? DefaultKinematicState.radius,\n angularDirection: params.state.angularDirection?.clone() ?? DefaultKinematicState.angularDirection,\n forwardAxis: params.state.forwardAxis ?? DefaultKinematicState.forwardAxis,\n isInfiniteRotation: params.state.isInfiniteRotation ?? DefaultKinematicState.isInfiniteRotation\n },\n target: {\n positionThreshold: params.target?.positionThreshold ?? DefaultKinematicTarget.positionThreshold,\n position: params.target?.position?.clone() ?? DefaultKinematicTarget.position,\n rotationThreshold: params.target?.rotationThreshold ?? DefaultKinematicTarget.rotationThreshold,\n rotation: params.target?.rotation?.clone() ?? DefaultKinematicTarget.rotation\n }\n },\n setData({ state, target }: TKinematicData): void {\n const { linearSpeed, linearDirection, angularSpeed, angularDirection, forwardAxis, isInfiniteRotation } = state;\n const { positionThreshold, position, rotationThreshold, rotation } = target ?? {};\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.linearSpeed = linearSpeed;\n\n agent.data.state.linearDirection.copy(linearDirection);\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.angularSpeed = angularSpeed;\n\n agent.data.state.angularDirection.copy(angularDirection);\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.forwardAxis = forwardAxis;\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.isInfiniteRotation = isInfiniteRotation;\n\n if (isNotDefined(target)) return;\n\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(positionThreshold)) agent.data.target.positionThreshold = positionThreshold;\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.position = position;\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(rotationThreshold)) agent.data.target.rotationThreshold = rotationThreshold;\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.rotation = rotation;\n },\n getData(): TKinematicData {\n return agent.data;\n },\n getRadius(): TMeters {\n return agent.data.state.radius;\n },\n setRadius(radius: TMeters): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.radius = radius;\n },\n getForwardAxis(): ForwardAxis {\n return agent.data.state.forwardAxis;\n },\n setForwardAxis(axis: ForwardAxis): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.forwardAxis = axis;\n },\n moveTo(targetPosition: TReadonlyVector3, speed: TKinematicSpeed): void | never {\n if (isInstant(speed)) return moveInstantly(agent, targetPosition);\n if (speed < 0) throw new Error('[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.');\n if (speed === 0) return agent.setLinearSpeed(0);\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.position = targetPosition.clone();\n\n // If the agent is already at the target, do not move\n if (targetPosition.equals(abstractTransformAgent.position$.value)) return agent.setLinearSpeed(0);\n\n agent.setLinearDirection(targetPosition.clone().sub(abstractTransformAgent.position$.value).normalize());\n agent.setLinearSpeed(speed);\n return undefined;\n },\n // Rotates agent to \"look\" at the target position (e.g., mouse click position or any other actor, etc.)\n lookAt(targetPosition: TReadonlyVector3, speed: TKinematicSpeed): void | never {\n tempObject.position.copy(abstractTransformAgent.position$.value);\n tempObject.up.set(0, 1, 0);\n tempObject.lookAt(targetPosition as Vector3);\n const targetRotation: Quaternion = tempObject.quaternion.clone().normalize();\n\n return agent.rotateTo(targetRotation, speed);\n },\n // Rotates agent as provided Quaternion (useful when you want to rotate as someone else already rotated)\n rotateTo(targetRotation: TReadonlyQuaternion, speed: TKinematicSpeed, infinite: boolean = false): void | never {\n if (isInstant(speed)) return rotateInstantly(agent, targetRotation);\n\n if (speed < 0) throw new Error('[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.');\n if (speed === 0) return agent.setAngularSpeed(0);\n if (agent.data.state.radius === 0) throw new Error('[KinematicTransformAgent]: Radius must be greater than 0 to calculate angular speed.');\n const angularSpeed: TRadiansPerSecond = (speed / agent.data.state.radius) as TRadiansPerSecond;\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.rotation = targetRotation.clone().normalize();\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.isInfiniteRotation = infinite;\n\n agent.setAngularSpeed(angularSpeed);\n return undefined;\n },\n getLinearSpeed(): TMetersPerSecond {\n return agent.data.state.linearSpeed;\n },\n setLinearSpeed(speed: TMetersPerSecond): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.linearSpeed = speed;\n },\n getLinearDirection(): Vector3 {\n return agent.data.state.linearDirection;\n },\n setLinearDirection(direction: Vector3Like): void {\n agent.data.state.linearDirection.copy(direction);\n },\n getLinearAzimuth(): TRadians {\n return getAzimuthElevationFromVector(agent.data.state.linearDirection, agent.data.state.forwardAxis).azimuth;\n },\n setLinearAzimuth(azimuthRad: TRadians): void {\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) agent.data.target.position = undefined;\n\n const { forwardAxis } = agent.data.state;\n const currentDir: Vector3 = agent.data.state.linearDirection.clone();\n\n const { elevation } = getAzimuthElevationFromVector(currentDir, forwardAxis);\n const totalLength: number = currentDir.length() || 1;\n\n let newX: number, newZ: number;\n const horizontalScale: number = Math.cos(elevation) * totalLength;\n\n if (forwardAxis === ForwardAxis.Z) {\n newX = Math.sin(azimuthRad) * horizontalScale;\n newZ = Math.cos(azimuthRad) * horizontalScale;\n } else if (forwardAxis === ForwardAxis.X) {\n newX = Math.cos(azimuthRad) * horizontalScale;\n newZ = Math.sin(azimuthRad) * horizontalScale;\n } else {\n throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);\n }\n\n const newY = Math.sin(elevation) * totalLength;\n agent.data.state.linearDirection.set(newX, newY, newZ).normalize();\n\n // An alternative approach (better calculations with edge cases). Uses vector projection instead of trigonometry (If chose this approach, makes sense to make setLinearAzimuth using the same approach)\n // const current = agent.data.state.linearDirection;\n // const currentY = current.y;\n // const horizontalMag = Math.sqrt(current.x * current.x + current.z * current.z);\n // let newX: number, newZ: number;\n // if (agent.data.state.forwardAxis === 'Z') {\n // newX = Math.sin(azimuthRad) * horizontalMag;\n // newZ = Math.cos(azimuthRad) * horizontalMag;\n // } else {\n // // forwardAxis === 'X'\n // newX = Math.cos(azimuthRad) * horizontalMag;\n // newZ = Math.sin(azimuthRad) * horizontalMag;\n // }\n // agent.data.state.linearDirection.set(newX, currentY, newZ);\n // // agent.data.state.linearDirection.normalize();\n },\n getLinearElevation(): TRadians {\n return getElevationFromDirection(agent.data.state.linearDirection);\n },\n setLinearElevation(elevationRad: TRadians): void {\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) agent.data.target.position = undefined;\n\n const { forwardAxis } = agent.data.state;\n const currentDir = agent.data.state.linearDirection.clone();\n\n const { azimuth } = getAzimuthElevationFromVector(currentDir, forwardAxis);\n const totalLength: number = currentDir.length() || 1;\n\n const horizontalScale: number = Math.cos(elevationRad) * totalLength;\n let newX: number, newZ: number;\n\n if (forwardAxis === ForwardAxis.Z) {\n newX = Math.sin(azimuth) * horizontalScale;\n newZ = Math.cos(azimuth) * horizontalScale;\n } else if (ForwardAxis.X) {\n newX = Math.cos(azimuth) * horizontalScale;\n newZ = Math.sin(azimuth) * horizontalScale;\n } else {\n throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);\n }\n\n const newY = Math.sin(elevationRad) * totalLength;\n\n agent.data.state.linearDirection.set(newX, newY, newZ).normalize();\n\n // An alternative approach (better calculations with edge cases). Uses vector projection instead of trigonometry (If chose this approach, makes sense to make setLinearAzimuth using the same approach)\n // const current = agent.data.state.linearDirection;\n // const horizontal = new Vector3(current.x, 0, current.z);\n // const h = horizontal.length();\n //\n // let horizontalDir: Vector3;\n // if (h > 1e-6) {\n // horizontalDir = horizontal.clone().normalize();\n // } else {\n // horizontalDir = agent.data.state.forwardAxis === 'Z' ? new Vector3(0, 0, 1) : new Vector3(1, 0, 0);\n // }\n //\n // // Approach 1 (absolute): Set the vector as in spherical coordinates with the given elevation.\n // // horizontal component will be cos(elevation), and vertical sin(elevation).\n // const newHorizontalMag = Math.cos(elevationRad);\n // const newHorizontal = horizontalDir.multiplyScalar(newHorizontalMag);\n // const newY = Math.sin(elevationRad);\n // agent.data.state.linearDirection.set(newHorizontal.x, newY, newHorizontal.z);\n //\n // // Approach 2 (additive): If you want to \"add\" vertical movement\n // // const newY = current.y + Math.tan(elevationRad) * h;\n // // agent.data.state.linearDirection.set(current.x, newY, current.z);\n // // agent.data.state.linearDirection.normalize();\n },\n resetLinear(resetSpeed: boolean, resetDirection: boolean): void {\n if (resetSpeed) agent.setLinearSpeed(0);\n if (resetDirection) agent.setLinearDirection(new Vector3());\n },\n getAngularSpeed(): TRadiansPerSecond {\n return agent.data.state.angularSpeed;\n },\n getAngularSpeedMps(): TMetersPerSecond | never {\n if (agent.data.state.radius <= 0) throw new Error('Radius must be set and be greater than 0 to calculate angular speed.');\n return metersPerSecond(agent.data.state.angularSpeed * agent.data.state.radius);\n },\n setAngularSpeed(speed: TRadiansPerSecond): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.angularSpeed = speed;\n },\n setAngularSpeedMps(speed: TMetersPerSecond): void | never {\n if (agent.data.state.radius <= 0) throw new Error('Radius must be set and be greater than 0 to calculate angular speed.');\n agent.setAngularSpeed((speed / agent.data.state.radius) as TRadiansPerSecond);\n },\n getAngularDirection(): Quaternion {\n return agent.data.state.angularDirection.clone();\n },\n setAngularDirection(direction: QuaternionLike): void {\n agent.data.state.angularDirection.copy(direction);\n },\n resetAngular(resetSpeed: boolean, resetDirection: boolean): void {\n if (resetSpeed) agent.setAngularSpeed(0);\n if (resetDirection) agent.setAngularDirection(new Quaternion());\n },\n serialize(): TKinematicConfig {\n return kinematicEntityToConfig(agent);\n },\n autoUpdate$\n });\n\n function doKinematicMove(delta: TMilliseconds): void {\n if (agent.data.state.linearSpeed <= 0) return;\n\n if (isPointReached(agent.data.target, abstractTransformAgent.position$.value, agent.data.state)) return;\n\n const safeDelta: TMilliseconds = delta > 0 ? delta : (1 as TMilliseconds);\n linearDirection.copy(agent.data.state.linearDirection).normalize();\n displacement.copy(linearDirection).multiplyScalar(agent.data.state.linearSpeed * safeDelta);\n\n abstractTransformAgent.position$.next(abstractTransformAgent.position$.value.clone().add(displacement));\n }\n\n function doKinematicRotation(delta: TMilliseconds): void {\n if (agent.data.state.angularSpeed <= 0) return;\n\n const safeDelta: TMilliseconds = delta > 0 ? delta : (1 as TMilliseconds);\n const rotationStep: TRadians = (agent.data.state.angularSpeed * safeDelta) as TRadians;\n\n if (!agent.data.state.isInfiniteRotation && isRotationReached(agent.data.target, agent.rotation$.value, agent.data.state)) return;\n const stepRotation: Quaternion | undefined = getStepRotation(agent, rotationStep, agent.data.state.isInfiniteRotation);\n\n if (isNotDefined(stepRotation)) return;\n\n agent.data.state.angularDirection.multiply(stepRotation).normalize();\n agent.rotation$.next(agent.data.state.angularDirection);\n }\n\n kinematicSub$ = combineLatest([agent.enabled$, agent.autoUpdate$])\n .pipe(\n //Do not update if agent is disabled or autoUpdate is turned off\n switchMap(([isEnabled, isAutoUpdate]: ReadonlyArray<boolean>): Observable<TMilliseconds> => (isEnabled && isAutoUpdate ? kinematicLoop.tick$ : EMPTY))\n )\n .subscribe((delta: TMilliseconds): void => {\n doKinematicRotation(delta);\n doKinematicMove(delta);\n });\n\n return agent;\n}\n"],"names":["KinematicTransformAgent","params","kinematicLoop","autoUpdate$","BehaviorSubject","isAutoUpdate","DefaultIsAutoUpdate","abstractTransformAgent","AbstractTransformAgent","TransformAgent","Kinematic","kinematicSub$","tempObject","Object3D","linearDirection","Vector3","displacement","destroySub$","destroy$","subscribe","unsubscribe","next","parent","remove","agent","Object","assign","data","state","linearSpeed","DefaultKinematicState","clone","angularSpeed","radius","angularDirection","forwardAxis","isInfiniteRotation","target","positionThreshold","DefaultKinematicTarget","position","rotationThreshold","rotation","setData","copy","isNotDefined","isDefined","getData","getRadius","setRadius","getForwardAxis","setForwardAxis","axis","moveTo","targetPosition","speed","isInstant","moveInstantly","Error","setLinearSpeed","equals","position$","value","setLinearDirection","sub","normalize","lookAt","up","set","targetRotation","quaternion","rotateTo","infinite","rotateInstantly","setAngularSpeed","getLinearSpeed","getLinearDirection","direction","getLinearAzimuth","getAzimuthElevationFromVector","azimuth","setLinearAzimuth","azimuthRad","currentDir","elevation","totalLength","length","newX","newZ","horizontalScale","Math","cos","ForwardAxis","Z","sin","X","newY","getLinearElevation","getElevationFromDirection","setLinearElevation","elevationRad","resetLinear","resetSpeed","resetDirection","getAngularSpeed","getAngularSpeedMps","metersPerSecond","setAngularSpeedMps","getAngularDirection","setAngularDirection","resetAngular","Quaternion","serialize","kinematicEntityToConfig","combineLatest","enabled$","pipe","switchMap","isEnabled","tick$","EMPTY","delta","rotationStep","isRotationReached","rotation$","stepRotation","getStepRotation","multiply","doKinematicRotation","isPointReached","safeDelta","multiplyScalar","add","doKinematicMove"],"mappings":"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"}
1
+ {"version":3,"file":"KinematicTransformAgent.js","sources":["../../../../src/TransformDrive/Entities/Agents/KinematicTransformAgent.ts"],"sourcesContent":["import { metersPerSecond } from '@hellpig/anarchy-engine/Distance';\nimport { DefaultIsAutoUpdate, DefaultKinematicState, DefaultKinematicTarget, kinematicEntityToConfig } from '@hellpig/anarchy-engine/Kinematic';\nimport { ForwardAxis } from '@hellpig/anarchy-engine/Kinematic/Constants';\nimport type { TKinematicConfig, TKinematicData, TKinematicWritableData } from '@hellpig/anarchy-engine/Kinematic/Models';\nimport type { TMeters, TMetersPerSecond, TMilliseconds, TRadians, TRadiansPerSecond } from '@hellpig/anarchy-engine/Math';\nimport { getAzimuthElevationFromVector, getElevationFromDirection } from '@hellpig/anarchy-engine/Math';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@hellpig/anarchy-engine/ThreeLib';\nimport { TransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Constants';\nimport type { TAbstractTransformAgent, TKinematicAgentDependencies, TKinematicSpeed, TKinematicTransformAgent, TKinematicTransformAgentParams } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { getStepRotation, isInstant, isPointReached, isRotationReached, moveInstantly, rotateInstantly } from '@hellpig/anarchy-engine/TransformDrive/Utils/KinematicAgentUtils';\nimport { isDefined, isNotDefined } from '@hellpig/anarchy-shared/Utils';\nimport type { Observable, Subscription } from 'rxjs';\nimport { BehaviorSubject, combineLatest, EMPTY, switchMap } from 'rxjs';\nimport type { QuaternionLike, Vector3Like } from 'three';\nimport { Object3D, Quaternion, Vector3 } from 'three';\n\nimport { AbstractTransformAgent } from './AbstractTransformAgent';\n\nexport function KinematicTransformAgent(params: TKinematicTransformAgentParams, { kinematicLoop }: TKinematicAgentDependencies): TKinematicTransformAgent {\n const autoUpdate$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(params.isAutoUpdate ?? DefaultIsAutoUpdate);\n const abstractTransformAgent: TAbstractTransformAgent = AbstractTransformAgent(params, TransformAgent.Kinematic);\n\n let kinematicSub$: Subscription | undefined = undefined;\n\n let tempObject: Object3D = new Object3D();\n let linearDirection: Vector3 = new Vector3();\n let displacement: Vector3 = new Vector3();\n\n const destroySub$: Subscription = abstractTransformAgent.destroy$.subscribe((): void => {\n //Stop subscriptions\n destroySub$.unsubscribe();\n kinematicSub$?.unsubscribe();\n\n abstractTransformAgent.destroy$.next();\n\n tempObject.parent?.remove(tempObject);\n tempObject = null as any;\n linearDirection = null as any;\n displacement = null as any;\n });\n\n // eslint-disable-next-line functional/immutable-data\n const agent: Omit<TKinematicTransformAgent, 'data'> & Readonly<{ data: TKinematicWritableData }> = Object.assign(abstractTransformAgent, {\n data: {\n state: {\n linearSpeed: params.state.linearSpeed ?? DefaultKinematicState.linearSpeed,\n linearDirection: params.state.linearDirection?.clone() ?? DefaultKinematicState.linearDirection,\n angularSpeed: params.state.angularSpeed ?? DefaultKinematicState.angularSpeed,\n radius: params.state.radius ?? DefaultKinematicState.radius,\n angularDirection: params.state.angularDirection?.clone() ?? DefaultKinematicState.angularDirection,\n forwardAxis: params.state.forwardAxis ?? DefaultKinematicState.forwardAxis,\n isInfiniteRotation: params.state.isInfiniteRotation ?? DefaultKinematicState.isInfiniteRotation\n },\n target: {\n positionThreshold: params.target?.positionThreshold ?? DefaultKinematicTarget.positionThreshold,\n position: params.target?.position?.clone() ?? DefaultKinematicTarget.position,\n rotationThreshold: params.target?.rotationThreshold ?? DefaultKinematicTarget.rotationThreshold,\n rotation: params.target?.rotation?.clone() ?? DefaultKinematicTarget.rotation\n }\n },\n setData({ state, target }: TKinematicData): void {\n const { linearSpeed, linearDirection, angularSpeed, angularDirection, forwardAxis, isInfiniteRotation } = state;\n const { positionThreshold, position, rotationThreshold, rotation } = target ?? {};\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.linearSpeed = linearSpeed;\n\n agent.data.state.linearDirection.copy(linearDirection);\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.angularSpeed = angularSpeed;\n\n agent.data.state.angularDirection.copy(angularDirection);\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.forwardAxis = forwardAxis;\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.isInfiniteRotation = isInfiniteRotation;\n\n if (isNotDefined(target)) return;\n\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(positionThreshold)) agent.data.target.positionThreshold = positionThreshold;\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.position = position;\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(rotationThreshold)) agent.data.target.rotationThreshold = rotationThreshold;\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.rotation = rotation;\n },\n getData(): TKinematicData {\n return agent.data;\n },\n getRadius(): TMeters {\n return agent.data.state.radius;\n },\n setRadius(radius: TMeters): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.radius = radius;\n },\n getForwardAxis(): ForwardAxis {\n return agent.data.state.forwardAxis;\n },\n setForwardAxis(axis: ForwardAxis): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.forwardAxis = axis;\n },\n moveTo(targetPosition: TReadonlyVector3, speed: TKinematicSpeed): void | never {\n if (isInstant(speed)) return moveInstantly(agent, targetPosition);\n if (speed < 0) throw new Error('[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.');\n if (speed === 0) return agent.setLinearSpeed(0);\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.position = targetPosition.clone();\n\n // If the agent is already at the target, do not move\n if (targetPosition.equals(abstractTransformAgent.position$.value)) return agent.setLinearSpeed(0);\n\n agent.setLinearDirection(targetPosition.clone().sub(abstractTransformAgent.position$.value).normalize());\n agent.setLinearSpeed(speed);\n return undefined;\n },\n // Rotates agent to \"look\" at the target position (e.g., mouse click position or any other actor, etc.)\n lookAt(targetPosition: TReadonlyVector3, speed: TKinematicSpeed): void | never {\n tempObject.position.copy(abstractTransformAgent.position$.value);\n tempObject.up.set(0, 1, 0);\n tempObject.lookAt(targetPosition as Vector3);\n const targetRotation: Quaternion = tempObject.quaternion.clone().normalize();\n\n return agent.rotateTo(targetRotation, speed);\n },\n // Rotates agent as provided Quaternion (useful when you want to rotate as someone else already rotated)\n rotateTo(targetRotation: TReadonlyQuaternion, speed: TKinematicSpeed, infinite: boolean = false): void | never {\n if (isInstant(speed)) return rotateInstantly(agent, targetRotation);\n\n if (speed < 0) throw new Error('[KinematicTransformAgent]: Speed must be greater than 0 to calculate angular speed.');\n if (speed === 0) return agent.setAngularSpeed(0);\n if (agent.data.state.radius === 0) throw new Error('[KinematicTransformAgent]: Radius must be greater than 0 to calculate angular speed.');\n const angularSpeed: TRadiansPerSecond = (speed / agent.data.state.radius) as TRadiansPerSecond;\n\n // eslint-disable-next-line functional/immutable-data\n agent.data.target.rotation = targetRotation.clone().normalize();\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.isInfiniteRotation = infinite;\n\n agent.setAngularSpeed(angularSpeed);\n return undefined;\n },\n getLinearSpeed(): TMetersPerSecond {\n return agent.data.state.linearSpeed;\n },\n setLinearSpeed(speed: TMetersPerSecond): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.linearSpeed = speed;\n },\n getLinearDirection(): Vector3 {\n return agent.data.state.linearDirection;\n },\n setLinearDirection(direction: Vector3Like): void {\n agent.data.state.linearDirection.copy(direction);\n },\n getLinearAzimuth(): TRadians {\n return getAzimuthElevationFromVector(agent.data.state.linearDirection, agent.data.state.forwardAxis).azimuth;\n },\n setLinearAzimuth(azimuthRad: TRadians): void {\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) agent.data.target.position = undefined;\n\n const { forwardAxis } = agent.data.state;\n const currentDir: Vector3 = agent.data.state.linearDirection.clone();\n\n const { elevation } = getAzimuthElevationFromVector(currentDir, forwardAxis);\n const totalLength: number = currentDir.length() || 1;\n\n let newX: number, newZ: number;\n const horizontalScale: number = Math.cos(elevation) * totalLength;\n\n if (forwardAxis === ForwardAxis.Z) {\n newX = Math.sin(azimuthRad) * horizontalScale;\n newZ = Math.cos(azimuthRad) * horizontalScale;\n } else if (forwardAxis === ForwardAxis.X) {\n newX = Math.cos(azimuthRad) * horizontalScale;\n newZ = Math.sin(azimuthRad) * horizontalScale;\n } else {\n throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);\n }\n\n const newY = Math.sin(elevation) * totalLength;\n agent.data.state.linearDirection.set(newX, newY, newZ).normalize();\n\n // An alternative approach (better calculations with edge cases). Uses vector projection instead of trigonometry (If chose this approach, makes sense to make setLinearAzimuth using the same approach)\n // const current = agent.data.state.linearDirection;\n // const currentY = current.y;\n // const horizontalMag = Math.sqrt(current.x * current.x + current.z * current.z);\n // let newX: number, newZ: number;\n // if (agent.data.state.forwardAxis === 'Z') {\n // newX = Math.sin(azimuthRad) * horizontalMag;\n // newZ = Math.cos(azimuthRad) * horizontalMag;\n // } else {\n // // forwardAxis === 'X'\n // newX = Math.cos(azimuthRad) * horizontalMag;\n // newZ = Math.sin(azimuthRad) * horizontalMag;\n // }\n // agent.data.state.linearDirection.set(newX, currentY, newZ);\n // // agent.data.state.linearDirection.normalize();\n },\n getLinearElevation(): TRadians {\n return getElevationFromDirection(agent.data.state.linearDirection);\n },\n setLinearElevation(elevationRad: TRadians): void {\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) agent.data.target.position = undefined;\n\n const { forwardAxis } = agent.data.state;\n const currentDir = agent.data.state.linearDirection.clone();\n\n const { azimuth } = getAzimuthElevationFromVector(currentDir, forwardAxis);\n const totalLength: number = currentDir.length() || 1;\n\n const horizontalScale: number = Math.cos(elevationRad) * totalLength;\n let newX: number, newZ: number;\n\n if (forwardAxis === ForwardAxis.Z) {\n newX = Math.sin(azimuth) * horizontalScale;\n newZ = Math.cos(azimuth) * horizontalScale;\n } else if (ForwardAxis.X) {\n newX = Math.cos(azimuth) * horizontalScale;\n newZ = Math.sin(azimuth) * horizontalScale;\n } else {\n throw new Error(`[KinematicTransformAgent]: Unknown forward axis: must be either ${ForwardAxis.Z} or ${ForwardAxis.X}`);\n }\n\n const newY = Math.sin(elevationRad) * totalLength;\n\n agent.data.state.linearDirection.set(newX, newY, newZ).normalize();\n\n // An alternative approach (better calculations with edge cases). Uses vector projection instead of trigonometry (If chose this approach, makes sense to make setLinearAzimuth using the same approach)\n // const current = agent.data.state.linearDirection;\n // const horizontal = new Vector3(current.x, 0, current.z);\n // const h = horizontal.length();\n //\n // let horizontalDir: Vector3;\n // if (h > 1e-6) {\n // horizontalDir = horizontal.clone().normalize();\n // } else {\n // horizontalDir = agent.data.state.forwardAxis === 'Z' ? new Vector3(0, 0, 1) : new Vector3(1, 0, 0);\n // }\n //\n // // Approach 1 (absolute): Set the vector as in spherical coordinates with the given elevation.\n // // horizontal component will be cos(elevation), and vertical sin(elevation).\n // const newHorizontalMag = Math.cos(elevationRad);\n // const newHorizontal = horizontalDir.multiplyScalar(newHorizontalMag);\n // const newY = Math.sin(elevationRad);\n // agent.data.state.linearDirection.set(newHorizontal.x, newY, newHorizontal.z);\n //\n // // Approach 2 (additive): If you want to \"add\" vertical movement\n // // const newY = current.y + Math.tan(elevationRad) * h;\n // // agent.data.state.linearDirection.set(current.x, newY, current.z);\n // // agent.data.state.linearDirection.normalize();\n },\n resetLinear(resetSpeed: boolean, resetDirection: boolean): void {\n if (resetSpeed) agent.setLinearSpeed(0);\n if (resetDirection) agent.setLinearDirection(new Vector3());\n },\n getAngularSpeed(): TRadiansPerSecond {\n return agent.data.state.angularSpeed;\n },\n getAngularSpeedMps(): TMetersPerSecond | never {\n if (agent.data.state.radius <= 0) throw new Error('Radius must be set and be greater than 0 to calculate angular speed.');\n return metersPerSecond(agent.data.state.angularSpeed * agent.data.state.radius);\n },\n setAngularSpeed(speed: TRadiansPerSecond): void {\n // eslint-disable-next-line functional/immutable-data\n agent.data.state.angularSpeed = speed;\n },\n setAngularSpeedMps(speed: TMetersPerSecond): void | never {\n if (agent.data.state.radius <= 0) throw new Error('Radius must be set and be greater than 0 to calculate angular speed.');\n agent.setAngularSpeed((speed / agent.data.state.radius) as TRadiansPerSecond);\n },\n getAngularDirection(): Quaternion {\n return agent.data.state.angularDirection.clone();\n },\n setAngularDirection(direction: QuaternionLike): void {\n agent.data.state.angularDirection.copy(direction);\n },\n resetAngular(resetSpeed: boolean, resetDirection: boolean): void {\n if (resetSpeed) agent.setAngularSpeed(0);\n if (resetDirection) agent.setAngularDirection(new Quaternion());\n },\n serialize(): TKinematicConfig {\n return kinematicEntityToConfig(agent);\n },\n autoUpdate$\n });\n\n function doKinematicMove(delta: TMilliseconds): void {\n if (agent.data.state.linearSpeed <= 0) return;\n\n if (isPointReached(agent.data.target, abstractTransformAgent.position$.value, agent.data.state)) return;\n\n const safeDelta: TMilliseconds = delta > 0 ? delta : (1 as TMilliseconds);\n linearDirection.copy(agent.data.state.linearDirection).normalize();\n displacement.copy(linearDirection).multiplyScalar(agent.data.state.linearSpeed * safeDelta);\n\n abstractTransformAgent.position$.next(abstractTransformAgent.position$.value.clone().add(displacement));\n }\n\n function doKinematicRotation(delta: TMilliseconds): void {\n if (agent.data.state.angularSpeed <= 0) return;\n\n const safeDelta: TMilliseconds = delta > 0 ? delta : (1 as TMilliseconds);\n const rotationStep: TRadians = (agent.data.state.angularSpeed * safeDelta) as TRadians;\n\n if (!agent.data.state.isInfiniteRotation && isRotationReached(agent.data.target, agent.rotation$.value, agent.data.state)) return;\n const stepRotation: Quaternion | undefined = getStepRotation(agent, rotationStep, agent.data.state.isInfiniteRotation);\n\n if (isNotDefined(stepRotation)) return;\n\n agent.data.state.angularDirection.multiply(stepRotation).normalize();\n agent.rotation$.next(agent.data.state.angularDirection);\n }\n\n kinematicSub$ = combineLatest([agent.enabled$, agent.autoUpdate$])\n .pipe(\n //Do not update if agent is disabled or autoUpdate is turned off\n switchMap(([isEnabled, isAutoUpdate]: ReadonlyArray<boolean>): Observable<TMilliseconds> => (isEnabled && isAutoUpdate ? kinematicLoop.tick$ : EMPTY))\n )\n .subscribe((delta: TMilliseconds): void => {\n doKinematicRotation(delta);\n doKinematicMove(delta);\n });\n\n return agent;\n}\n"],"names":["KinematicTransformAgent","params","kinematicLoop","autoUpdate$","BehaviorSubject","isAutoUpdate","DefaultIsAutoUpdate","abstractTransformAgent","AbstractTransformAgent","TransformAgent","Kinematic","kinematicSub$","tempObject","Object3D","linearDirection","Vector3","displacement","destroySub$","destroy$","subscribe","unsubscribe","next","parent","remove","agent","Object","assign","data","state","linearSpeed","DefaultKinematicState","clone","angularSpeed","radius","angularDirection","forwardAxis","isInfiniteRotation","target","positionThreshold","DefaultKinematicTarget","position","rotationThreshold","rotation","setData","copy","isNotDefined","isDefined","getData","getRadius","setRadius","getForwardAxis","setForwardAxis","axis","moveTo","targetPosition","speed","isInstant","moveInstantly","Error","setLinearSpeed","equals","position$","value","setLinearDirection","sub","normalize","lookAt","up","set","targetRotation","quaternion","rotateTo","infinite","rotateInstantly","setAngularSpeed","getLinearSpeed","getLinearDirection","direction","getLinearAzimuth","getAzimuthElevationFromVector","azimuth","setLinearAzimuth","azimuthRad","currentDir","elevation","totalLength","length","newX","newZ","horizontalScale","Math","cos","ForwardAxis","Z","sin","X","newY","getLinearElevation","getElevationFromDirection","setLinearElevation","elevationRad","resetLinear","resetSpeed","resetDirection","getAngularSpeed","getAngularSpeedMps","metersPerSecond","setAngularSpeedMps","getAngularDirection","setAngularDirection","resetAngular","Quaternion","serialize","kinematicEntityToConfig","combineLatest","enabled$","pipe","switchMap","isEnabled","tick$","EMPTY","delta","rotationStep","isRotationReached","rotation$","stepRotation","getStepRotation","multiply","doKinematicRotation","isPointReached","safeDelta","multiplyScalar","add","doKinematicMove"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PhysicsTransformAgent.js","sources":["../../../../src/TransformDrive/Entities/Agents/PhysicsTransformAgent.ts"],"sourcesContent":["import type { TMeters, TMilliseconds, TRadians } from '@Anarchy/Engine/Math';\nimport { meters, radians } from '@Anarchy/Engine/Measurements';\nimport type { TPhysicsBody, TPhysicsBodyConfig } from '@Anarchy/Engine/Physics';\nimport { RigidBodyTypesNames } from '@Anarchy/Engine/Physics';\nimport { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport type {\n TAbstractTransformAgent,\n TPhysicsAgentDependencies,\n TPhysicsTransformAgent,\n TPhysicsTransformAgentParams,\n TReadonlyTransform,\n TRigidBodyTransformData\n} from '@Anarchy/Engine/TransformDrive/Models';\nimport { applyLatestTransform, getPhysicsBodyTransform } from '@Anarchy/Engine/TransformDrive/Utils';\nimport { isDefined, isNotDefined } from '@Anarchy/Shared/Utils';\nimport type { Observable, Subscription } from 'rxjs';\nimport { BehaviorSubject, distinctUntilChanged, EMPTY, filter, map, switchMap, takeWhile, withLatestFrom } from 'rxjs';\nimport { Quaternion, Vector3 } from 'three';\n\nimport { AbstractTransformAgent } from './AbstractTransformAgent';\n\n// Physics bodies doesn't play well with manual set of position/rotation (e.g. position$.next(), rotation$.next() from any external sources).\n// In principle, it's better to avoid manual setting of position/rotation for physics objects.\n// But if you have to, first change active agent to \"Default\", then set position/rotation, and then switch back to \"Physics\" agent.\nexport function PhysicsTransformAgent(params: TPhysicsTransformAgentParams, { physicsLoop }: TPhysicsAgentDependencies): TPhysicsTransformAgent {\n const positionNoiseThreshold: TMeters = params.performance?.positionNoiseThreshold ?? meters(0.0000001);\n const rotationNoiseThreshold: TRadians = params.performance?.rotationNoiseThreshold ?? radians(0.0000001);\n const abstractTransformAgent: TAbstractTransformAgent = AbstractTransformAgent(params, TransformAgent.Physics);\n\n const onDeactivated$Sub: Subscription = abstractTransformAgent.onDeactivated$.pipe(takeWhile((): boolean => isNotDefined(params.onDeactivated))).subscribe((): void => {\n if (isNotDefined(params.onDeactivated)) {\n console.warn(\n 'PhysicsTransformAgent: onDeactivated is not defined. The physics body remains at the position it was the moment of deactivation. Please handle this (remove, move to a safe place), cause if left it as is could produce unexpected behavior.'\n );\n }\n });\n\n //apply the latest position/rotation to the physics body on activation\n const onActivated$Sub: Subscription = abstractTransformAgent.onActivated$.subscribe(({ position, rotation }: TReadonlyTransform): void => {\n if (isNotDefined(physicsBody$.value)) physicsBody$.next(params.physicsBody);\n applyLatestTransform(physicsBody$.value?.getRigidBody(), position, rotation);\n });\n\n let physicsSub$: Subscription | undefined = undefined;\n\n const physicsBody$: BehaviorSubject<TPhysicsBody | undefined> = new BehaviorSubject<TPhysicsBody | undefined>(undefined);\n\n // eslint-disable-next-line functional/immutable-data\n const agent: TPhysicsTransformAgent = Object.assign(abstractTransformAgent, {\n physicsBody$,\n serialize: (): TPhysicsBodyConfig => {\n const body: TPhysicsBody | undefined = physicsBody$.value;\n if (isNotDefined(body)) throw new Error(`[Serialization] [PhysicsTransformAgent]: physics body with name \"${params.physicsBody.name}\" is not defined for physics agent(id: \"${agent.id}\")`);\n\n return body.serialize();\n }\n });\n\n let previousPhysicsBodyType: RigidBodyTypesNames = physicsBody$.value?.getPhysicsBodyType() ?? RigidBodyTypesNames.Fixed;\n\n const prevBodyTypeSub: Subscription = physicsBody$.subscribe((physicsBody: TPhysicsBody | undefined): void => {\n if (isNotDefined(physicsBody)) return;\n previousPhysicsBodyType = physicsBody.getPhysicsBodyType();\n });\n\n const enabledSub$: Subscription = agent.enabled$\n .pipe(\n withLatestFrom(physicsBody$),\n distinctUntilChanged(\n ([prevEnabled, prevPhysicsBody]: [boolean, TPhysicsBody | undefined], [enabled, physicsBody]: [boolean, TPhysicsBody | undefined]): boolean =>\n prevEnabled === enabled && prevPhysicsBody === physicsBody\n )\n )\n .subscribe(([isEnabled, physicsBody]: [boolean, TPhysicsBody | undefined]): void | never => {\n if (isNotDefined(physicsBody?.getRigidBody())) return;\n if (!isEnabled) physicsBody.setPhysicsBodyType(RigidBodyTypesNames.KinematicPositionBased, false);\n else physicsBody?.setPhysicsBodyType(previousPhysicsBodyType, false);\n });\n\n const destroySub$: Subscription = abstractTransformAgent.destroy$.subscribe((): void => {\n //Stop subscriptions\n destroySub$.unsubscribe();\n physicsSub$?.unsubscribe();\n enabledSub$.unsubscribe();\n prevBodyTypeSub.unsubscribe();\n onDeactivated$Sub?.unsubscribe();\n onActivated$Sub?.unsubscribe();\n\n abstractTransformAgent.destroy$.next();\n physicsBody$.complete();\n });\n\n const tmpPosition = new Float32Array(3);\n const prevPosition = new Float32Array(3);\n const tmpRotation = new Float32Array(4);\n const prevRotation = new Float32Array(4);\n\n physicsSub$ = agent.enabled$\n .pipe(\n distinctUntilChanged(),\n switchMap((isEnabled: boolean): Observable<TMilliseconds | never> => (isEnabled ? physicsLoop.tick$ : EMPTY)),\n filter((): boolean => {\n const body: TPhysicsBody | undefined = physicsBody$.value;\n return isDefined(body) && body.getPhysicsBodyType() !== RigidBodyTypesNames.Fixed;\n }),\n //Get the latest transform data from the physics body every physics tick\n map((): TRigidBodyTransformData | undefined =>\n getPhysicsBodyTransform(physicsBody$.value?.getRigidBody(), prevPosition, prevRotation, tmpPosition, tmpRotation, positionNoiseThreshold, rotationNoiseThreshold)\n ),\n filter(isDefined)\n )\n .subscribe(({ position, rotation }): void => {\n if (position) agent.position$.next(new Vector3(position[0], position[1], position[2]));\n if (rotation) agent.rotation$.next(new Quaternion(rotation[0], rotation[1], rotation[2], rotation[3]));\n });\n\n return agent;\n}\n"],"names":["PhysicsTransformAgent","params","physicsLoop","positionNoiseThreshold","performance","meters","rotationNoiseThreshold","radians","abstractTransformAgent","AbstractTransformAgent","TransformAgent","Physics","onDeactivated$Sub","onDeactivated$","pipe","takeWhile","isNotDefined","onDeactivated","subscribe","console","warn","onActivated$Sub","onActivated$","position","rotation","physicsBody$","value","next","physicsBody","applyLatestTransform","getRigidBody","physicsSub$","BehaviorSubject","agent","Object","assign","serialize","body","Error","name","id","previousPhysicsBodyType","getPhysicsBodyType","RigidBodyTypesNames","Fixed","prevBodyTypeSub","enabledSub$","enabled$","withLatestFrom","distinctUntilChanged","prevEnabled","prevPhysicsBody","enabled","isEnabled","setPhysicsBodyType","KinematicPositionBased","destroySub$","destroy$","unsubscribe","complete","tmpPosition","Float32Array","prevPosition","tmpRotation","prevRotation","switchMap","tick$","EMPTY","filter","isDefined","map","getPhysicsBodyTransform","position$","Vector3","rotation$","Quaternion"],"mappings":"6uCAwBO,SAASA,sBAAsBC,QAAsCC,YAAEA,cAC5E,MAAMC,uBAAkCF,OAAOG,aAAaD,wBAA0BE,OAAO,MACvFC,uBAAmCL,OAAOG,aAAaE,wBAA0BC,QAAQ,MACzFC,uBAAkDC,uBAAuBR,OAAQS,eAAeC,SAEhGC,kBAAkCJ,uBAAuBK,eAAeC,KAAKC,UAAU,IAAeC,aAAaf,OAAOgB,iBAAiBC,UAAU,KACrJF,aAAaf,OAAOgB,gBACtBE,QAAQC,KACN,mPAMAC,gBAAgCb,uBAAuBc,aAAaJ,UAAU,EAAGK,kBAAUC,sBAC3FR,aAAaS,aAAaC,QAAQD,aAAaE,KAAK1B,OAAO2B,aAC/DC,qBAAqBJ,aAAaC,OAAOI,eAAgBP,SAAUC,YAGrE,IAAIO,YAEJ,MAAMN,aAA0D,IAAIO,wBAG9DC,MAAgCC,OAAOC,OAAO3B,uBAAwB,CAC1EiB,0BACAW,UAAW,KACT,MAAMC,KAAiCZ,aAAaC,MACpD,GAAIV,aAAaqB,MAAO,MAAM,IAAIC,MAAM,oEAAoErC,OAAO2B,YAAYW,+CAA+CN,MAAMO,QAEpL,OAAOH,KAAKD,eAIhB,IAAIK,wBAA+ChB,aAAaC,OAAOgB,sBAAwBC,oBAAoBC,MAEnH,MAAMC,gBAAgCpB,aAAaP,UAAWU,cACxDZ,aAAaY,eACjBa,wBAA0Bb,YAAYc,wBAGlCI,YAA4Bb,MAAMc,SACrCjC,KACCkC,eAAevB,cACfwB,qBACE,EAAEC,YAAaC,kBAAwDC,QAASxB,eAC9EsB,cAAgBE,SAAWD,kBAAoBvB,cAGpDV,UAAU,EAAEmC,UAAWzB,gBAClBZ,aAAaY,aAAaE,iBAEzBF,aAAa0B,mBADbD,UACgCZ,wBADUE,oBAAoBY,wBACL,KAG5DC,YAA4BhD,uBAAuBiD,SAASvC,UAAU,KAE1EsC,YAAYE,cACZ3B,aAAa2B,cACbZ,YAAYY,cACZb,gBAAgBa,cAChB9C,mBAAmB8C,cACnBrC,iBAAiBqC,cAEjBlD,uBAAuBiD,SAAS9B,OAChCF,aAAakC,aAGTC,YAAc,IAAIC,aAAa,GAC/BC,aAAe,IAAID,aAAa,GAChCE,YAAc,IAAIF,aAAa,GAC/BG,aAAe,IAAIH,aAAa,GAqBtC,OAnBA9B,YAAcE,MAAMc,SACjBjC,KACCmC,uBACAgB,UAAWZ,WAA2DA,UAAYnD,YAAYgE,MAAQC,OACtGC,OAAO,KACL,MAAM/B,KAAiCZ,aAAaC,MACpD,OAAO2C,UAAUhC,OAASA,KAAKK,uBAAyBC,oBAAoBC,QAG9E0B,IAAI,IACFC,wBAAwB9C,aAAaC,OAAOI,eAAgBgC,aAAcE,aAAcJ,YAAaG,YAAa5D,uBAAwBG,yBAE5I8D,OAAOC,YAERnD,UAAU,EAAGK,kBAAUC,sBAClBD,UAAUU,MAAMuC,UAAU7C,KAAK,IAAI8C,QAAQlD,SAAS,GAAIA,SAAS,GAAIA,SAAS,KAC9EC,UAAUS,MAAMyC,UAAU/C,KAAK,IAAIgD,WAAWnD,SAAS,GAAIA,SAAS,GAAIA,SAAS,GAAIA,SAAS,OAG/FS,KACT"}
1
+ {"version":3,"file":"PhysicsTransformAgent.js","sources":["../../../../src/TransformDrive/Entities/Agents/PhysicsTransformAgent.ts"],"sourcesContent":["import type { TMeters, TMilliseconds, TRadians } from '@hellpig/anarchy-engine/Math';\nimport { meters, radians } from '@hellpig/anarchy-engine/Measurements';\nimport type { TPhysicsBody, TPhysicsBodyConfig } from '@hellpig/anarchy-engine/Physics';\nimport { RigidBodyTypesNames } from '@hellpig/anarchy-engine/Physics';\nimport { TransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Constants';\nimport type {\n TAbstractTransformAgent,\n TPhysicsAgentDependencies,\n TPhysicsTransformAgent,\n TPhysicsTransformAgentParams,\n TReadonlyTransform,\n TRigidBodyTransformData\n} from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { applyLatestTransform, getPhysicsBodyTransform } from '@hellpig/anarchy-engine/TransformDrive/Utils';\nimport { isDefined, isNotDefined } from '@hellpig/anarchy-shared/Utils';\nimport type { Observable, Subscription } from 'rxjs';\nimport { BehaviorSubject, distinctUntilChanged, EMPTY, filter, map, switchMap, takeWhile, withLatestFrom } from 'rxjs';\nimport { Quaternion, Vector3 } from 'three';\n\nimport { AbstractTransformAgent } from './AbstractTransformAgent';\n\n// Physics bodies doesn't play well with manual set of position/rotation (e.g. position$.next(), rotation$.next() from any external sources).\n// In principle, it's better to avoid manual setting of position/rotation for physics objects.\n// But if you have to, first change active agent to \"Default\", then set position/rotation, and then switch back to \"Physics\" agent.\nexport function PhysicsTransformAgent(params: TPhysicsTransformAgentParams, { physicsLoop }: TPhysicsAgentDependencies): TPhysicsTransformAgent {\n const positionNoiseThreshold: TMeters = params.performance?.positionNoiseThreshold ?? meters(0.0000001);\n const rotationNoiseThreshold: TRadians = params.performance?.rotationNoiseThreshold ?? radians(0.0000001);\n const abstractTransformAgent: TAbstractTransformAgent = AbstractTransformAgent(params, TransformAgent.Physics);\n\n const onDeactivated$Sub: Subscription = abstractTransformAgent.onDeactivated$.pipe(takeWhile((): boolean => isNotDefined(params.onDeactivated))).subscribe((): void => {\n if (isNotDefined(params.onDeactivated)) {\n console.warn(\n 'PhysicsTransformAgent: onDeactivated is not defined. The physics body remains at the position it was the moment of deactivation. Please handle this (remove, move to a safe place), cause if left it as is could produce unexpected behavior.'\n );\n }\n });\n\n //apply the latest position/rotation to the physics body on activation\n const onActivated$Sub: Subscription = abstractTransformAgent.onActivated$.subscribe(({ position, rotation }: TReadonlyTransform): void => {\n if (isNotDefined(physicsBody$.value)) physicsBody$.next(params.physicsBody);\n applyLatestTransform(physicsBody$.value?.getRigidBody(), position, rotation);\n });\n\n let physicsSub$: Subscription | undefined = undefined;\n\n const physicsBody$: BehaviorSubject<TPhysicsBody | undefined> = new BehaviorSubject<TPhysicsBody | undefined>(undefined);\n\n // eslint-disable-next-line functional/immutable-data\n const agent: TPhysicsTransformAgent = Object.assign(abstractTransformAgent, {\n physicsBody$,\n serialize: (): TPhysicsBodyConfig => {\n const body: TPhysicsBody | undefined = physicsBody$.value;\n if (isNotDefined(body)) throw new Error(`[Serialization] [PhysicsTransformAgent]: physics body with name \"${params.physicsBody.name}\" is not defined for physics agent(id: \"${agent.id}\")`);\n\n return body.serialize();\n }\n });\n\n let previousPhysicsBodyType: RigidBodyTypesNames = physicsBody$.value?.getPhysicsBodyType() ?? RigidBodyTypesNames.Fixed;\n\n const prevBodyTypeSub: Subscription = physicsBody$.subscribe((physicsBody: TPhysicsBody | undefined): void => {\n if (isNotDefined(physicsBody)) return;\n previousPhysicsBodyType = physicsBody.getPhysicsBodyType();\n });\n\n const enabledSub$: Subscription = agent.enabled$\n .pipe(\n withLatestFrom(physicsBody$),\n distinctUntilChanged(\n ([prevEnabled, prevPhysicsBody]: [boolean, TPhysicsBody | undefined], [enabled, physicsBody]: [boolean, TPhysicsBody | undefined]): boolean =>\n prevEnabled === enabled && prevPhysicsBody === physicsBody\n )\n )\n .subscribe(([isEnabled, physicsBody]: [boolean, TPhysicsBody | undefined]): void | never => {\n if (isNotDefined(physicsBody?.getRigidBody())) return;\n if (!isEnabled) physicsBody.setPhysicsBodyType(RigidBodyTypesNames.KinematicPositionBased, false);\n else physicsBody?.setPhysicsBodyType(previousPhysicsBodyType, false);\n });\n\n const destroySub$: Subscription = abstractTransformAgent.destroy$.subscribe((): void => {\n //Stop subscriptions\n destroySub$.unsubscribe();\n physicsSub$?.unsubscribe();\n enabledSub$.unsubscribe();\n prevBodyTypeSub.unsubscribe();\n onDeactivated$Sub?.unsubscribe();\n onActivated$Sub?.unsubscribe();\n\n abstractTransformAgent.destroy$.next();\n physicsBody$.complete();\n });\n\n const tmpPosition = new Float32Array(3);\n const prevPosition = new Float32Array(3);\n const tmpRotation = new Float32Array(4);\n const prevRotation = new Float32Array(4);\n\n physicsSub$ = agent.enabled$\n .pipe(\n distinctUntilChanged(),\n switchMap((isEnabled: boolean): Observable<TMilliseconds | never> => (isEnabled ? physicsLoop.tick$ : EMPTY)),\n filter((): boolean => {\n const body: TPhysicsBody | undefined = physicsBody$.value;\n return isDefined(body) && body.getPhysicsBodyType() !== RigidBodyTypesNames.Fixed;\n }),\n //Get the latest transform data from the physics body every physics tick\n map((): TRigidBodyTransformData | undefined =>\n getPhysicsBodyTransform(physicsBody$.value?.getRigidBody(), prevPosition, prevRotation, tmpPosition, tmpRotation, positionNoiseThreshold, rotationNoiseThreshold)\n ),\n filter(isDefined)\n )\n .subscribe(({ position, rotation }): void => {\n if (position) agent.position$.next(new Vector3(position[0], position[1], position[2]));\n if (rotation) agent.rotation$.next(new Quaternion(rotation[0], rotation[1], rotation[2], rotation[3]));\n });\n\n return agent;\n}\n"],"names":["PhysicsTransformAgent","params","physicsLoop","positionNoiseThreshold","performance","meters","rotationNoiseThreshold","radians","abstractTransformAgent","AbstractTransformAgent","TransformAgent","Physics","onDeactivated$Sub","onDeactivated$","pipe","takeWhile","isNotDefined","onDeactivated","subscribe","console","warn","onActivated$Sub","onActivated$","position","rotation","physicsBody$","value","next","physicsBody","applyLatestTransform","getRigidBody","physicsSub$","BehaviorSubject","agent","Object","assign","serialize","body","Error","name","id","previousPhysicsBodyType","getPhysicsBodyType","RigidBodyTypesNames","Fixed","prevBodyTypeSub","enabledSub$","enabled$","withLatestFrom","distinctUntilChanged","prevEnabled","prevPhysicsBody","enabled","isEnabled","setPhysicsBodyType","KinematicPositionBased","destroySub$","destroy$","unsubscribe","complete","tmpPosition","Float32Array","prevPosition","tmpRotation","prevRotation","switchMap","tick$","EMPTY","filter","isDefined","map","getPhysicsBodyTransform","position$","Vector3","rotation$","Quaternion"],"mappings":"6uCAwBO,SAASA,sBAAsBC,QAAsCC,YAAEA,cAC5E,MAAMC,uBAAkCF,OAAOG,aAAaD,wBAA0BE,OAAO,MACvFC,uBAAmCL,OAAOG,aAAaE,wBAA0BC,QAAQ,MACzFC,uBAAkDC,uBAAuBR,OAAQS,eAAeC,SAEhGC,kBAAkCJ,uBAAuBK,eAAeC,KAAKC,UAAU,IAAeC,aAAaf,OAAOgB,iBAAiBC,UAAU,KACrJF,aAAaf,OAAOgB,gBACtBE,QAAQC,KACN,mPAMAC,gBAAgCb,uBAAuBc,aAAaJ,UAAU,EAAGK,kBAAUC,sBAC3FR,aAAaS,aAAaC,QAAQD,aAAaE,KAAK1B,OAAO2B,aAC/DC,qBAAqBJ,aAAaC,OAAOI,eAAgBP,SAAUC,YAGrE,IAAIO,YAEJ,MAAMN,aAA0D,IAAIO,wBAG9DC,MAAgCC,OAAOC,OAAO3B,uBAAwB,CAC1EiB,0BACAW,UAAW,KACT,MAAMC,KAAiCZ,aAAaC,MACpD,GAAIV,aAAaqB,MAAO,MAAM,IAAIC,MAAM,oEAAoErC,OAAO2B,YAAYW,+CAA+CN,MAAMO,QAEpL,OAAOH,KAAKD,eAIhB,IAAIK,wBAA+ChB,aAAaC,OAAOgB,sBAAwBC,oBAAoBC,MAEnH,MAAMC,gBAAgCpB,aAAaP,UAAWU,cACxDZ,aAAaY,eACjBa,wBAA0Bb,YAAYc,wBAGlCI,YAA4Bb,MAAMc,SACrCjC,KACCkC,eAAevB,cACfwB,qBACE,EAAEC,YAAaC,kBAAwDC,QAASxB,eAC9EsB,cAAgBE,SAAWD,kBAAoBvB,cAGpDV,UAAU,EAAEmC,UAAWzB,gBAClBZ,aAAaY,aAAaE,iBAEzBF,aAAa0B,mBADbD,UACgCZ,wBADUE,oBAAoBY,wBACL,KAG5DC,YAA4BhD,uBAAuBiD,SAASvC,UAAU,KAE1EsC,YAAYE,cACZ3B,aAAa2B,cACbZ,YAAYY,cACZb,gBAAgBa,cAChB9C,mBAAmB8C,cACnBrC,iBAAiBqC,cAEjBlD,uBAAuBiD,SAAS9B,OAChCF,aAAakC,aAGTC,YAAc,IAAIC,aAAa,GAC/BC,aAAe,IAAID,aAAa,GAChCE,YAAc,IAAIF,aAAa,GAC/BG,aAAe,IAAIH,aAAa,GAqBtC,OAnBA9B,YAAcE,MAAMc,SACjBjC,KACCmC,uBACAgB,UAAWZ,WAA2DA,UAAYnD,YAAYgE,MAAQC,OACtGC,OAAO,KACL,MAAM/B,KAAiCZ,aAAaC,MACpD,OAAO2C,UAAUhC,OAASA,KAAKK,uBAAyBC,oBAAoBC,QAG9E0B,IAAI,IACFC,wBAAwB9C,aAAaC,OAAOI,eAAgBgC,aAAcE,aAAcJ,YAAaG,YAAa5D,uBAAwBG,yBAE5I8D,OAAOC,YAERnD,UAAU,EAAGK,kBAAUC,sBAClBD,UAAUU,MAAMuC,UAAU7C,KAAK,IAAI8C,QAAQlD,SAAS,GAAIA,SAAS,GAAIA,SAAS,KAC9EC,UAAUS,MAAMyC,UAAU/C,KAAK,IAAIgD,WAAWnD,SAAS,GAAIA,SAAS,GAAIA,SAAS,GAAIA,SAAS,OAG/FS,KACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"DriveToTargetConnector.js","sources":["../../../../src/TransformDrive/Entities/Connectors/DriveToTargetConnector.ts"],"sourcesContent":["import type { TReadonlyEuler, TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport type { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport type { TAbstractTransformAgent, TDriveToTargetConnector, TOffsets, TTransformDrive, TWithTransforms } from '@Anarchy/Engine/TransformDrive/Models';\nimport { isNotDefined } from '@Anarchy/Shared/Utils';\nimport type { Subscription } from 'rxjs';\nimport { Euler } from 'three';\n\nexport function DriveToTargetConnector<T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(\n drive: TTransformDrive<T>,\n target: TWithTransforms,\n offsets?: TOffsets\n): TDriveToTargetConnector {\n const { positionOffset, rotationOffset, scaleOffset } = offsets ?? {};\n\n const positionSub$: Subscription = drive.position$.subscribe((position: TReadonlyVector3): TReadonlyVector3 => {\n if (isNotDefined(positionOffset)) return target.position.copy(position);\n return target.position.copy(position).add(positionOffset);\n });\n\n const rotationSub$: Subscription = drive.rotation$.subscribe((rotation: TReadonlyQuaternion): TReadonlyEuler | void => {\n const rotationEuler: Euler = new Euler().setFromQuaternion(rotation.clone());\n if (isNotDefined(rotationOffset)) return target.rotation.copy(rotationEuler);\n return target.rotation.copy(new Euler().setFromQuaternion(rotation.clone().multiply(rotationOffset.clone())));\n });\n\n const scaleSub$: Subscription = drive.scale$.subscribe((scale: TReadonlyVector3): TReadonlyVector3 => {\n if (isNotDefined(scaleOffset)) return target.scale.copy(scale);\n return target.scale.copy(scale).add(scaleOffset);\n });\n\n const destroySub$: Subscription = drive.destroy$.subscribe((): void => {\n //Finish subscriptions\n destroySub$.unsubscribe();\n positionSub$.unsubscribe();\n rotationSub$.unsubscribe();\n scaleSub$.unsubscribe();\n });\n\n return {\n destroy$: drive.destroy$\n };\n}\n"],"names":["DriveToTargetConnector","drive","target","offsets","positionOffset","rotationOffset","scaleOffset","positionSub$","position$","subscribe","position","isNotDefined","copy","add","rotationSub$","rotation$","rotation","rotationEuler","Euler","setFromQuaternion","clone","multiply","scaleSub$","scale$","scale","destroySub$","destroy$","unsubscribe"],"mappings":"4GAOO,SAASA,uBACdC,MACAC,OACAC,SAEA,MAAMC,eAAEA,eAAAC,eAAgBA,eAAAC,YAAgBA,aAAgBH,SAAW,CAAA,EAE7DI,aAA6BN,MAAMO,UAAUC,UAAWC,UACxDC,aAAaP,gBAAwBF,OAAOQ,SAASE,KAAKF,UACvDR,OAAOQ,SAASE,KAAKF,UAAUG,IAAIT,iBAGtCU,aAA6Bb,MAAMc,UAAUN,UAAWO,WAC5D,MAAMC,eAAuB,IAAIC,OAAQC,kBAAkBH,SAASI,SACpE,OAAIT,aAAaN,gBAAwBH,OAAOc,SAASJ,KAAKK,eACvDf,OAAOc,SAASJ,MAAK,IAAIM,OAAQC,kBAAkBH,SAASI,QAAQC,SAAShB,eAAee,aAG/FE,UAA0BrB,MAAMsB,OAAOd,UAAWe,OAClDb,aAAaL,aAAqBJ,OAAOsB,MAAMZ,KAAKY,OACjDtB,OAAOsB,MAAMZ,KAAKY,OAAOX,IAAIP,cAGhCmB,YAA4BxB,MAAMyB,SAASjB,UAAU,KAEzDgB,YAAYE,cACZpB,aAAaoB,cACbb,aAAaa,cACbL,UAAUK,gBAGZ,MAAO,CACLD,SAAUzB,MAAMyB,SAEpB"}
1
+ {"version":3,"file":"DriveToTargetConnector.js","sources":["../../../../src/TransformDrive/Entities/Connectors/DriveToTargetConnector.ts"],"sourcesContent":["import type { TReadonlyEuler, TReadonlyQuaternion, TReadonlyVector3 } from '@hellpig/anarchy-engine/ThreeLib';\nimport type { TransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Constants';\nimport type { TAbstractTransformAgent, TDriveToTargetConnector, TOffsets, TTransformDrive, TWithTransforms } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { isNotDefined } from '@hellpig/anarchy-shared/Utils';\nimport type { Subscription } from 'rxjs';\nimport { Euler } from 'three';\n\nexport function DriveToTargetConnector<T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(\n drive: TTransformDrive<T>,\n target: TWithTransforms,\n offsets?: TOffsets\n): TDriveToTargetConnector {\n const { positionOffset, rotationOffset, scaleOffset } = offsets ?? {};\n\n const positionSub$: Subscription = drive.position$.subscribe((position: TReadonlyVector3): TReadonlyVector3 => {\n if (isNotDefined(positionOffset)) return target.position.copy(position);\n return target.position.copy(position).add(positionOffset);\n });\n\n const rotationSub$: Subscription = drive.rotation$.subscribe((rotation: TReadonlyQuaternion): TReadonlyEuler | void => {\n const rotationEuler: Euler = new Euler().setFromQuaternion(rotation.clone());\n if (isNotDefined(rotationOffset)) return target.rotation.copy(rotationEuler);\n return target.rotation.copy(new Euler().setFromQuaternion(rotation.clone().multiply(rotationOffset.clone())));\n });\n\n const scaleSub$: Subscription = drive.scale$.subscribe((scale: TReadonlyVector3): TReadonlyVector3 => {\n if (isNotDefined(scaleOffset)) return target.scale.copy(scale);\n return target.scale.copy(scale).add(scaleOffset);\n });\n\n const destroySub$: Subscription = drive.destroy$.subscribe((): void => {\n //Finish subscriptions\n destroySub$.unsubscribe();\n positionSub$.unsubscribe();\n rotationSub$.unsubscribe();\n scaleSub$.unsubscribe();\n });\n\n return {\n destroy$: drive.destroy$\n };\n}\n"],"names":["DriveToTargetConnector","drive","target","offsets","positionOffset","rotationOffset","scaleOffset","positionSub$","position$","subscribe","position","isNotDefined","copy","add","rotationSub$","rotation$","rotation","rotationEuler","Euler","setFromQuaternion","clone","multiply","scaleSub$","scale$","scale","destroySub$","destroy$","unsubscribe"],"mappings":"4GAOO,SAASA,uBACdC,MACAC,OACAC,SAEA,MAAMC,eAAEA,eAAAC,eAAgBA,eAAAC,YAAgBA,aAAgBH,SAAW,CAAA,EAE7DI,aAA6BN,MAAMO,UAAUC,UAAWC,UACxDC,aAAaP,gBAAwBF,OAAOQ,SAASE,KAAKF,UACvDR,OAAOQ,SAASE,KAAKF,UAAUG,IAAIT,iBAGtCU,aAA6Bb,MAAMc,UAAUN,UAAWO,WAC5D,MAAMC,eAAuB,IAAIC,OAAQC,kBAAkBH,SAASI,SACpE,OAAIT,aAAaN,gBAAwBH,OAAOc,SAASJ,KAAKK,eACvDf,OAAOc,SAASJ,MAAK,IAAIM,OAAQC,kBAAkBH,SAASI,QAAQC,SAAShB,eAAee,aAG/FE,UAA0BrB,MAAMsB,OAAOd,UAAWe,OAClDb,aAAaL,aAAqBJ,OAAOsB,MAAMZ,KAAKY,OACjDtB,OAAOsB,MAAMZ,KAAKY,OAAOX,IAAIP,cAGhCmB,YAA4BxB,MAAMyB,SAASjB,UAAU,KAEzDgB,YAAYE,cACZpB,aAAaoB,cACbb,aAAaa,cACbL,UAAUK,gBAGZ,MAAO,CACLD,SAAUzB,MAAMyB,SAEpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransformDrive.js","sources":["../../../../src/TransformDrive/Entities/Drive/TransformDrive.ts"],"sourcesContent":["import { meters, radians } from '@Anarchy/Engine/Measurements';\nimport type { TDestroyable } from '@Anarchy/Engine/Mixins';\nimport { destroyableMixin } from '@Anarchy/Engine/Mixins';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport { transformDriveToConfig } from '@Anarchy/Engine/TransformDrive/Adapters';\nimport { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport type {\n TAbstractTransformAgent,\n TTransformDrive,\n TTransformDriveMandatoryFields,\n TTransformDriveParams,\n TTransformDrivePerformanceOptions,\n TTransformDriveSerializedData\n} from '@Anarchy/Engine/TransformDrive/Models';\nimport { getDynamicAgents, updateFromActiveAgent } from '@Anarchy/Engine/TransformDrive/Utils';\nimport { isNotDefined } from '@Anarchy/Shared/Utils';\nimport { nanoid } from 'nanoid';\nimport type { Observable, Subscription } from 'rxjs';\nimport { BehaviorSubject, distinctUntilChanged, filter, map, merge, ReplaySubject } from 'rxjs';\n\n// TransformDrive is an entity to move/rotate/scale other entities\n// TransformDrive could use different \"agents\" (modes) which can be switched in runtime:\n// - Connected agent is expose mutable position/rotation/scale objects and follow the changes of them. Useful to work with 3rd party libs (e.g. animejs). But recommended to avoid.\n// - Kinematic agent is a mode that moves actor by angular velocity and linear velocity (vectors). Useful when you need to know the direction (e.g. bullet, car) of the object. Recommended way for NPCs.\n// - Default agent is providing almost nothing, but setters. Recommended for static objects.\n// - Also: with every mode you can do position$.next() to \"teleport\" the object to the new position\nexport function TransformDrive<T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(params: TTransformDriveParams, agents: T): TTransformDrive<T> | never {\n const id: string = 'transform_drive_' + nanoid();\n\n //All agent instances must be used only with this drive\n const relatedDriveIdSub$: Subscription = merge(\n ...Object.values(agents).map((agent: TAbstractTransformAgent): Observable<Readonly<{ value: string | undefined; agent: TAbstractTransformAgent }>> => {\n agent.relatedDriveId$.next(id);\n return agent.relatedDriveId$.pipe(map((value: string | undefined): Readonly<{ value: string | undefined; agent: TAbstractTransformAgent }> => ({ value, agent })));\n })\n ).subscribe(({ value, agent }: Readonly<{ value: string | undefined; agent: TAbstractTransformAgent }>): void => {\n if (value !== id) throw new Error(`TransformDrive: Agent \"${agent.type}\" (${agent.id}) initialized in TransformDrive (${id}), but attempted to use in another TransformDrive (${value})`);\n });\n\n const agent$: BehaviorSubject<TransformAgent> = new BehaviorSubject<TransformAgent>(params.activeAgent ?? TransformAgent.Default);\n\n let activeAgent: TAbstractTransformAgent | undefined = agents[agent$.value];\n if (isNotDefined(activeAgent)) {\n throw new Error(`TransformDrive: Can't set an active agent. Agent \"${agent$.value}\" is not defined`);\n }\n const activeAgent$: BehaviorSubject<TAbstractTransformAgent> = new BehaviorSubject(activeAgent);\n\n if (isNotDefined(activeAgent$.value)) throw new Error(`TransformDrive: Active agent (\"${activeAgent$.value}\") is not defined`);\n\n const agentSub$: Subscription = agent$.subscribe((agent: TransformAgent): void => {\n const newAgent: TAbstractTransformAgent | undefined = agents[agent];\n if (isNotDefined(newAgent)) throw new Error(`TransformDrive: Can't change an active agent for \"${agent}\": not defined`);\n activeAgent$.next(newAgent);\n });\n\n const position$: BehaviorSubject<TReadonlyVector3> = new BehaviorSubject<TReadonlyVector3>(activeAgent$.value.position$.value);\n const rotation$: BehaviorSubject<TReadonlyQuaternion> = new BehaviorSubject<TReadonlyQuaternion>(activeAgent$.value.rotation$.value);\n const scale$: BehaviorSubject<TReadonlyVector3> = new BehaviorSubject<TReadonlyVector3>(activeAgent$.value.scale$.value);\n\n let prevAgent: TAbstractTransformAgent | undefined;\n const activeAgentSub$: Subscription = activeAgent$\n .pipe(distinctUntilChanged((prev: TAbstractTransformAgent, curr: TAbstractTransformAgent): boolean => prev.type === curr.type))\n .subscribe((newAgent: TAbstractTransformAgent): void => {\n const position: TReadonlyVector3 = position$.value;\n const rotation: TReadonlyQuaternion = rotation$.value;\n const scale: TReadonlyVector3 = scale$.value;\n\n prevAgent?.onDeactivated$.next({ position, rotation, scale });\n Object.values(agents).forEach((agent: TAbstractTransformAgent): void => {\n const isActiveAgent: boolean = agent.type === newAgent.type;\n agent.enabled$.next(isActiveAgent);\n\n //when we change the active agent, we need to update the values of the agent\n agent.position$.next(position);\n agent.rotation$.next(rotation);\n agent.scale$.next(scale);\n });\n newAgent.onActivated$.next({ position, rotation, scale });\n prevAgent = newAgent;\n });\n\n //We don't expose these BehaviorSubjects, because they're vulnerable to external changes without .next() (e.g. \"position.value = ...\")\n const activeAgentRep$: ReplaySubject<TAbstractTransformAgent> = new ReplaySubject(1);\n\n activeAgent$.subscribe((agent: TAbstractTransformAgent): void => activeAgentRep$.next(agent));\n\n // Update values of the active agent when drive.position$.next() is called from an external code\n position$.pipe(filter((value: TReadonlyVector3): boolean => value !== activeAgent$.value.position$.value)).subscribe((value: TReadonlyVector3): void => activeAgent$.value.position$.next(value));\n rotation$\n .pipe(filter((value: TReadonlyQuaternion): boolean => value !== activeAgent$.value.rotation$.value))\n .subscribe((value: TReadonlyQuaternion): void => activeAgent$.value.rotation$.next(value));\n scale$.pipe(filter((value: TReadonlyVector3): boolean => value !== activeAgent$.value.scale$.value)).subscribe((value: TReadonlyVector3): void => activeAgent$.value.scale$.next(value));\n\n const destroyable: TDestroyable = destroyableMixin();\n\n const performance: Required<TTransformDrivePerformanceOptions> = {\n positionNoiseThreshold: params.performance?.positionNoiseThreshold ?? meters(0.0000001),\n rotationNoiseThreshold: params.performance?.rotationNoiseThreshold ?? radians(0.0000001),\n scaleNoiseThreshold: params.performance?.scaleNoiseThreshold ?? 0.0000001\n };\n\n const positionSub$: Subscription = updateFromActiveAgent<TReadonlyVector3>(activeAgent$, 'position$', { threshold: performance.positionNoiseThreshold }).subscribe((v: TReadonlyVector3): void =>\n position$.next(v)\n );\n const rotationSub$: Subscription = updateFromActiveAgent<TReadonlyQuaternion>(activeAgent$, 'rotation$', { threshold: performance.rotationNoiseThreshold }).subscribe(\n (r: TReadonlyQuaternion): void => rotation$.next(r)\n );\n const scaleSub$: Subscription = updateFromActiveAgent<TReadonlyVector3>(activeAgent$, 'scale$', { threshold: performance.scaleNoiseThreshold }).subscribe((s: TReadonlyVector3): void =>\n scale$.next(s)\n );\n\n const result: TTransformDriveMandatoryFields = {\n ...destroyable,\n id,\n agent$,\n activeAgent$: activeAgentRep$,\n getActiveAgent: (): TAbstractTransformAgent => activeAgent$.value,\n position$,\n rotation$,\n scale$,\n relatedEntityId: params.relatedEntityId,\n serialize: (): TTransformDriveSerializedData => transformDriveToConfig(result),\n ...getDynamicAgents(agents)\n };\n\n const destroySub$: Subscription = destroyable.destroy$.subscribe((): void => {\n // Stop subscriptions\n positionSub$.unsubscribe();\n rotationSub$.unsubscribe();\n scaleSub$.unsubscribe();\n agentSub$.unsubscribe();\n activeAgentSub$.unsubscribe();\n relatedDriveIdSub$.unsubscribe();\n\n //Stop subjects\n agent$.complete();\n activeAgent$.complete();\n activeAgentRep$.complete();\n position$.complete();\n rotation$.complete();\n scale$.complete();\n\n activeAgent = null as any;\n prevAgent = null as any;\n Object.values(agents).forEach((agent: TAbstractTransformAgent): void => agent.destroy$.next());\n destroySub$.unsubscribe();\n });\n\n return result as TTransformDrive<T>;\n}\n"],"names":["TransformDrive","params","agents","id","nanoid","relatedDriveIdSub$","merge","Object","values","map","agent","relatedDriveId$","next","pipe","value","subscribe","Error","type","agent$","BehaviorSubject","activeAgent","TransformAgent","Default","isNotDefined","activeAgent$","agentSub$","newAgent","position$","rotation$","scale$","prevAgent","activeAgentSub$","distinctUntilChanged","prev","curr","position","rotation","scale","onDeactivated$","forEach","enabled$","onActivated$","activeAgentRep$","ReplaySubject","filter","destroyable","destroyableMixin","performance","positionNoiseThreshold","meters","rotationNoiseThreshold","radians","scaleNoiseThreshold","positionSub$","updateFromActiveAgent","threshold","v","rotationSub$","r","scaleSub$","s","result","getActiveAgent","relatedEntityId","serialize","transformDriveToConfig","getDynamicAgents","destroySub$","destroy$","unsubscribe","complete"],"mappings":"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"}
1
+ {"version":3,"file":"TransformDrive.js","sources":["../../../../src/TransformDrive/Entities/Drive/TransformDrive.ts"],"sourcesContent":["import { meters, radians } from '@hellpig/anarchy-engine/Measurements';\nimport type { TDestroyable } from '@hellpig/anarchy-engine/Mixins';\nimport { destroyableMixin } from '@hellpig/anarchy-engine/Mixins';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@hellpig/anarchy-engine/ThreeLib';\nimport { transformDriveToConfig } from '@hellpig/anarchy-engine/TransformDrive/Adapters';\nimport { TransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Constants';\nimport type {\n TAbstractTransformAgent,\n TTransformDrive,\n TTransformDriveMandatoryFields,\n TTransformDriveParams,\n TTransformDrivePerformanceOptions,\n TTransformDriveSerializedData\n} from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { getDynamicAgents, updateFromActiveAgent } from '@hellpig/anarchy-engine/TransformDrive/Utils';\nimport { isNotDefined } from '@hellpig/anarchy-shared/Utils';\nimport { nanoid } from 'nanoid';\nimport type { Observable, Subscription } from 'rxjs';\nimport { BehaviorSubject, distinctUntilChanged, filter, map, merge, ReplaySubject } from 'rxjs';\n\n// TransformDrive is an entity to move/rotate/scale other entities\n// TransformDrive could use different \"agents\" (modes) which can be switched in runtime:\n// - Connected agent is expose mutable position/rotation/scale objects and follow the changes of them. Useful to work with 3rd party libs (e.g. animejs). But recommended to avoid.\n// - Kinematic agent is a mode that moves actor by angular velocity and linear velocity (vectors). Useful when you need to know the direction (e.g. bullet, car) of the object. Recommended way for NPCs.\n// - Default agent is providing almost nothing, but setters. Recommended for static objects.\n// - Also: with every mode you can do position$.next() to \"teleport\" the object to the new position\nexport function TransformDrive<T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(params: TTransformDriveParams, agents: T): TTransformDrive<T> | never {\n const id: string = 'transform_drive_' + nanoid();\n\n //All agent instances must be used only with this drive\n const relatedDriveIdSub$: Subscription = merge(\n ...Object.values(agents).map((agent: TAbstractTransformAgent): Observable<Readonly<{ value: string | undefined; agent: TAbstractTransformAgent }>> => {\n agent.relatedDriveId$.next(id);\n return agent.relatedDriveId$.pipe(map((value: string | undefined): Readonly<{ value: string | undefined; agent: TAbstractTransformAgent }> => ({ value, agent })));\n })\n ).subscribe(({ value, agent }: Readonly<{ value: string | undefined; agent: TAbstractTransformAgent }>): void => {\n if (value !== id) throw new Error(`TransformDrive: Agent \"${agent.type}\" (${agent.id}) initialized in TransformDrive (${id}), but attempted to use in another TransformDrive (${value})`);\n });\n\n const agent$: BehaviorSubject<TransformAgent> = new BehaviorSubject<TransformAgent>(params.activeAgent ?? TransformAgent.Default);\n\n let activeAgent: TAbstractTransformAgent | undefined = agents[agent$.value];\n if (isNotDefined(activeAgent)) {\n throw new Error(`TransformDrive: Can't set an active agent. Agent \"${agent$.value}\" is not defined`);\n }\n const activeAgent$: BehaviorSubject<TAbstractTransformAgent> = new BehaviorSubject(activeAgent);\n\n if (isNotDefined(activeAgent$.value)) throw new Error(`TransformDrive: Active agent (\"${activeAgent$.value}\") is not defined`);\n\n const agentSub$: Subscription = agent$.subscribe((agent: TransformAgent): void => {\n const newAgent: TAbstractTransformAgent | undefined = agents[agent];\n if (isNotDefined(newAgent)) throw new Error(`TransformDrive: Can't change an active agent for \"${agent}\": not defined`);\n activeAgent$.next(newAgent);\n });\n\n const position$: BehaviorSubject<TReadonlyVector3> = new BehaviorSubject<TReadonlyVector3>(activeAgent$.value.position$.value);\n const rotation$: BehaviorSubject<TReadonlyQuaternion> = new BehaviorSubject<TReadonlyQuaternion>(activeAgent$.value.rotation$.value);\n const scale$: BehaviorSubject<TReadonlyVector3> = new BehaviorSubject<TReadonlyVector3>(activeAgent$.value.scale$.value);\n\n let prevAgent: TAbstractTransformAgent | undefined;\n const activeAgentSub$: Subscription = activeAgent$\n .pipe(distinctUntilChanged((prev: TAbstractTransformAgent, curr: TAbstractTransformAgent): boolean => prev.type === curr.type))\n .subscribe((newAgent: TAbstractTransformAgent): void => {\n const position: TReadonlyVector3 = position$.value;\n const rotation: TReadonlyQuaternion = rotation$.value;\n const scale: TReadonlyVector3 = scale$.value;\n\n prevAgent?.onDeactivated$.next({ position, rotation, scale });\n Object.values(agents).forEach((agent: TAbstractTransformAgent): void => {\n const isActiveAgent: boolean = agent.type === newAgent.type;\n agent.enabled$.next(isActiveAgent);\n\n //when we change the active agent, we need to update the values of the agent\n agent.position$.next(position);\n agent.rotation$.next(rotation);\n agent.scale$.next(scale);\n });\n newAgent.onActivated$.next({ position, rotation, scale });\n prevAgent = newAgent;\n });\n\n //We don't expose these BehaviorSubjects, because they're vulnerable to external changes without .next() (e.g. \"position.value = ...\")\n const activeAgentRep$: ReplaySubject<TAbstractTransformAgent> = new ReplaySubject(1);\n\n activeAgent$.subscribe((agent: TAbstractTransformAgent): void => activeAgentRep$.next(agent));\n\n // Update values of the active agent when drive.position$.next() is called from an external code\n position$.pipe(filter((value: TReadonlyVector3): boolean => value !== activeAgent$.value.position$.value)).subscribe((value: TReadonlyVector3): void => activeAgent$.value.position$.next(value));\n rotation$\n .pipe(filter((value: TReadonlyQuaternion): boolean => value !== activeAgent$.value.rotation$.value))\n .subscribe((value: TReadonlyQuaternion): void => activeAgent$.value.rotation$.next(value));\n scale$.pipe(filter((value: TReadonlyVector3): boolean => value !== activeAgent$.value.scale$.value)).subscribe((value: TReadonlyVector3): void => activeAgent$.value.scale$.next(value));\n\n const destroyable: TDestroyable = destroyableMixin();\n\n const performance: Required<TTransformDrivePerformanceOptions> = {\n positionNoiseThreshold: params.performance?.positionNoiseThreshold ?? meters(0.0000001),\n rotationNoiseThreshold: params.performance?.rotationNoiseThreshold ?? radians(0.0000001),\n scaleNoiseThreshold: params.performance?.scaleNoiseThreshold ?? 0.0000001\n };\n\n const positionSub$: Subscription = updateFromActiveAgent<TReadonlyVector3>(activeAgent$, 'position$', { threshold: performance.positionNoiseThreshold }).subscribe((v: TReadonlyVector3): void =>\n position$.next(v)\n );\n const rotationSub$: Subscription = updateFromActiveAgent<TReadonlyQuaternion>(activeAgent$, 'rotation$', { threshold: performance.rotationNoiseThreshold }).subscribe(\n (r: TReadonlyQuaternion): void => rotation$.next(r)\n );\n const scaleSub$: Subscription = updateFromActiveAgent<TReadonlyVector3>(activeAgent$, 'scale$', { threshold: performance.scaleNoiseThreshold }).subscribe((s: TReadonlyVector3): void =>\n scale$.next(s)\n );\n\n const result: TTransformDriveMandatoryFields = {\n ...destroyable,\n id,\n agent$,\n activeAgent$: activeAgentRep$,\n getActiveAgent: (): TAbstractTransformAgent => activeAgent$.value,\n position$,\n rotation$,\n scale$,\n relatedEntityId: params.relatedEntityId,\n serialize: (): TTransformDriveSerializedData => transformDriveToConfig(result),\n ...getDynamicAgents(agents)\n };\n\n const destroySub$: Subscription = destroyable.destroy$.subscribe((): void => {\n // Stop subscriptions\n positionSub$.unsubscribe();\n rotationSub$.unsubscribe();\n scaleSub$.unsubscribe();\n agentSub$.unsubscribe();\n activeAgentSub$.unsubscribe();\n relatedDriveIdSub$.unsubscribe();\n\n //Stop subjects\n agent$.complete();\n activeAgent$.complete();\n activeAgentRep$.complete();\n position$.complete();\n rotation$.complete();\n scale$.complete();\n\n activeAgent = null as any;\n prevAgent = null as any;\n Object.values(agents).forEach((agent: TAbstractTransformAgent): void => agent.destroy$.next());\n destroySub$.unsubscribe();\n });\n\n return result as TTransformDrive<T>;\n}\n"],"names":["TransformDrive","params","agents","id","nanoid","relatedDriveIdSub$","merge","Object","values","map","agent","relatedDriveId$","next","pipe","value","subscribe","Error","type","agent$","BehaviorSubject","activeAgent","TransformAgent","Default","isNotDefined","activeAgent$","agentSub$","newAgent","position$","rotation$","scale$","prevAgent","activeAgentSub$","distinctUntilChanged","prev","curr","position","rotation","scale","onDeactivated$","forEach","enabled$","onActivated$","activeAgentRep$","ReplaySubject","filter","destroyable","destroyableMixin","performance","positionNoiseThreshold","meters","rotationNoiseThreshold","radians","scaleNoiseThreshold","positionSub$","updateFromActiveAgent","threshold","v","rotationSub$","r","scaleSub$","s","result","getActiveAgent","relatedEntityId","serialize","transformDriveToConfig","getDynamicAgents","destroySub$","destroy$","unsubscribe","complete"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransformDriveFactory.js","sources":["../../../src/TransformDrive/Factories/TransformDriveFactory.ts"],"sourcesContent":["import { FactoryType, ReactiveFactory } from '@Anarchy/Engine/Abstract';\nimport { TransformDrive } from '@Anarchy/Engine/TransformDrive/Entities';\nimport type { TTransformDriveFactory, TTransformDriveFactoryParams } from '@Anarchy/Engine/TransformDrive/Models';\n\nexport function TransformDriveFactory(): TTransformDriveFactory {\n return ReactiveFactory(FactoryType.TransformDrive, ({ params, agents }: TTransformDriveFactoryParams) => TransformDrive(params, agents));\n}\n"],"names":["TransformDriveFactory","ReactiveFactory","FactoryType","TransformDrive","params","agents"],"mappings":"0MAIO,SAASA,wBACd,OAAOC,gBAAgBC,YAAYC,eAAgB,EAAGC,cAAQC,iBAA2CF,eAAeC,OAAQC,QAClI"}
1
+ {"version":3,"file":"TransformDriveFactory.js","sources":["../../../src/TransformDrive/Factories/TransformDriveFactory.ts"],"sourcesContent":["import { FactoryType, ReactiveFactory } from '@hellpig/anarchy-engine/Abstract';\nimport { TransformDrive } from '@hellpig/anarchy-engine/TransformDrive/Entities';\nimport type { TTransformDriveFactory, TTransformDriveFactoryParams } from '@hellpig/anarchy-engine/TransformDrive/Models';\n\nexport function TransformDriveFactory(): TTransformDriveFactory {\n return ReactiveFactory(FactoryType.TransformDrive, ({ params, agents }: TTransformDriveFactoryParams) => TransformDrive(params, agents));\n}\n"],"names":["TransformDriveFactory","ReactiveFactory","FactoryType","TransformDrive","params","agents"],"mappings":"0MAIO,SAASA,wBACd,OAAOC,gBAAgBC,YAAYC,eAAgB,EAAGC,cAAQC,iBAA2CF,eAAeC,OAAQC,QAClI"}
@@ -1 +1 @@
1
- {"version":3,"file":"WithMutablePositionConnector.js","sources":["../../../src/TransformDrive/Mixins/WithMutablePositionConnector.ts"],"sourcesContent":["import type { TVector3OrEuler } from '@Anarchy/Engine/ThreeLib';\nimport type { TWithMutablePositionConnector } from '@Anarchy/Engine/TransformDrive/Models';\nimport { getXyzUpdateProxy } from '@Anarchy/Engine/TransformDrive/Utils/ActorDriveUtils';\nimport type { BehaviorSubject } from 'rxjs';\n\nexport function withMutablePositionConnector<T extends TVector3OrEuler>(position$: BehaviorSubject<T>): TWithMutablePositionConnector {\n return { positionConnector: getXyzUpdateProxy(position$.value.clone(), position$) };\n}\n"],"names":["withMutablePositionConnector","position$","positionConnector","getXyzUpdateProxy","value","clone"],"mappings":"2DAKO,SAASA,6BAAwDC,WACtE,MAAO,CAAEC,kBAAmBC,kBAAkBF,UAAUG,MAAMC,QAASJ,WACzE"}
1
+ {"version":3,"file":"WithMutablePositionConnector.js","sources":["../../../src/TransformDrive/Mixins/WithMutablePositionConnector.ts"],"sourcesContent":["import type { TVector3OrEuler } from '@hellpig/anarchy-engine/ThreeLib';\nimport type { TWithMutablePositionConnector } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { getXyzUpdateProxy } from '@hellpig/anarchy-engine/TransformDrive/Utils/ActorDriveUtils';\nimport type { BehaviorSubject } from 'rxjs';\n\nexport function withMutablePositionConnector<T extends TVector3OrEuler>(position$: BehaviorSubject<T>): TWithMutablePositionConnector {\n return { positionConnector: getXyzUpdateProxy(position$.value.clone(), position$) };\n}\n"],"names":["withMutablePositionConnector","position$","positionConnector","getXyzUpdateProxy","value","clone"],"mappings":"2DAKO,SAASA,6BAAwDC,WACtE,MAAO,CAAEC,kBAAmBC,kBAAkBF,UAAUG,MAAMC,QAASJ,WACzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"WithMutableRotationConnector.js","sources":["../../../src/TransformDrive/Mixins/WithMutableRotationConnector.ts"],"sourcesContent":["import type { TVector3OrEuler, TVector4OrQuaternion } from '@Anarchy/Engine/ThreeLib';\nimport type { TWithMutableRotationConnector } from '@Anarchy/Engine/TransformDrive/Models';\nimport { getXyzUpdateProxy, getXyzwUpdateProxy } from '@Anarchy/Engine/TransformDrive/Utils/ActorDriveUtils';\nimport type { BehaviorSubject } from 'rxjs';\n\nexport function withMutableRotationConnector<T1 extends TVector3OrEuler, T2 extends TVector4OrQuaternion>(rotation$: BehaviorSubject<T1 | T2>): TWithMutableRotationConnector {\n return {\n rotationEulerConnector: getXyzUpdateProxy(rotation$.value.clone(), rotation$),\n rotationQuaternionConnector: getXyzwUpdateProxy((rotation$ as BehaviorSubject<T2>).value.clone(), rotation$ as BehaviorSubject<T2>)\n };\n}\n"],"names":["withMutableRotationConnector","rotation$","rotationEulerConnector","getXyzUpdateProxy","value","clone","rotationQuaternionConnector","getXyzwUpdateProxy"],"mappings":"8EAKO,SAASA,6BAA0FC,WACxG,MAAO,CACLC,uBAAwBC,kBAAkBF,UAAUG,MAAMC,QAASJ,WACnEK,4BAA6BC,mBAAoBN,UAAkCG,MAAMC,QAASJ,WAEtG"}
1
+ {"version":3,"file":"WithMutableRotationConnector.js","sources":["../../../src/TransformDrive/Mixins/WithMutableRotationConnector.ts"],"sourcesContent":["import type { TVector3OrEuler, TVector4OrQuaternion } from '@hellpig/anarchy-engine/ThreeLib';\nimport type { TWithMutableRotationConnector } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { getXyzUpdateProxy, getXyzwUpdateProxy } from '@hellpig/anarchy-engine/TransformDrive/Utils/ActorDriveUtils';\nimport type { BehaviorSubject } from 'rxjs';\n\nexport function withMutableRotationConnector<T1 extends TVector3OrEuler, T2 extends TVector4OrQuaternion>(rotation$: BehaviorSubject<T1 | T2>): TWithMutableRotationConnector {\n return {\n rotationEulerConnector: getXyzUpdateProxy(rotation$.value.clone(), rotation$),\n rotationQuaternionConnector: getXyzwUpdateProxy((rotation$ as BehaviorSubject<T2>).value.clone(), rotation$ as BehaviorSubject<T2>)\n };\n}\n"],"names":["withMutableRotationConnector","rotation$","rotationEulerConnector","getXyzUpdateProxy","value","clone","rotationQuaternionConnector","getXyzwUpdateProxy"],"mappings":"8EAKO,SAASA,6BAA0FC,WACxG,MAAO,CACLC,uBAAwBC,kBAAkBF,UAAUG,MAAMC,QAASJ,WACnEK,4BAA6BC,mBAAoBN,UAAkCG,MAAMC,QAASJ,WAEtG"}
@@ -1 +1 @@
1
- {"version":3,"file":"WithMutableScaleConnector.js","sources":["../../../src/TransformDrive/Mixins/WithMutableScaleConnector.ts"],"sourcesContent":["import type { TVector3OrEuler } from '@Anarchy/Engine/ThreeLib';\nimport type { TWithMutableScaleConnector } from '@Anarchy/Engine/TransformDrive/Models';\nimport { getXyzUpdateProxy } from '@Anarchy/Engine/TransformDrive/Utils/ActorDriveUtils';\nimport type { BehaviorSubject } from 'rxjs';\n\nexport function withMutableScaleConnector<T extends TVector3OrEuler>(scale$: BehaviorSubject<T>): TWithMutableScaleConnector {\n return { scaleConnector: getXyzUpdateProxy(scale$.value.clone(), scale$) };\n}\n"],"names":["withMutableScaleConnector","scale$","scaleConnector","getXyzUpdateProxy","value","clone"],"mappings":"2DAKO,SAASA,0BAAqDC,QACnE,MAAO,CAAEC,eAAgBC,kBAAkBF,OAAOG,MAAMC,QAASJ,QACnE"}
1
+ {"version":3,"file":"WithMutableScaleConnector.js","sources":["../../../src/TransformDrive/Mixins/WithMutableScaleConnector.ts"],"sourcesContent":["import type { TVector3OrEuler } from '@hellpig/anarchy-engine/ThreeLib';\nimport type { TWithMutableScaleConnector } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { getXyzUpdateProxy } from '@hellpig/anarchy-engine/TransformDrive/Utils/ActorDriveUtils';\nimport type { BehaviorSubject } from 'rxjs';\n\nexport function withMutableScaleConnector<T extends TVector3OrEuler>(scale$: BehaviorSubject<T>): TWithMutableScaleConnector {\n return { scaleConnector: getXyzUpdateProxy(scale$.value.clone(), scale$) };\n}\n"],"names":["withMutableScaleConnector","scale$","scaleConnector","getXyzUpdateProxy","value","clone"],"mappings":"2DAKO,SAASA,0BAAqDC,QACnE,MAAO,CAAEC,eAAgBC,kBAAkBF,OAAOG,MAAMC,QAASJ,QACnE"}
@@ -1 +1 @@
1
- {"version":3,"file":"WithProxyTransform.js","sources":["../../../src/TransformDrive/Mixins/WithProxyTransform.ts"],"sourcesContent":["import type { TMovableXYZ, TQuaternionRotatable, TScaleMixin, TWithPosition3dProperty, TWithQuaternionRotationProperty, TWithScaleProperty } from '@Anarchy/Engine/Mixins';\nimport { withMoveBy3dMixin, withQuaternionRotationByXyzMixin, withScaleMixin } from '@Anarchy/Engine/Mixins';\nimport type { TAbstractTransformAgent } from '@Anarchy/Engine/TransformDrive/Models';\n\nexport function withProxyTransform(\n abstractTransformAgent: TAbstractTransformAgent,\n proxyPositionObj: TWithPosition3dProperty,\n proxyRotationObj: TWithQuaternionRotationProperty,\n proxyScaleObj: TWithScaleProperty\n): TMovableXYZ & TScaleMixin & TQuaternionRotatable {\n const { getX, getZ, getY } = withMoveBy3dMixin(proxyPositionObj);\n const { getScaleX, getScaleY, getScaleZ } = withScaleMixin(proxyScaleObj);\n const { getRotationX, getRotationY, getRotationZ, getRotationW } = withQuaternionRotationByXyzMixin(proxyRotationObj);\n\n return {\n getX,\n getY,\n getZ,\n getScaleX,\n getScaleY,\n getScaleZ,\n getRotationX,\n getRotationY,\n getRotationZ,\n getRotationW,\n setX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.x = x;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return x;\n },\n setY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.y = y;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return y;\n },\n setZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.z = z;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return z;\n },\n addX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.x += x;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return proxyPositionObj.position.x;\n },\n addY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.y += y;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return proxyPositionObj.position.y;\n },\n addZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.z += z;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return proxyPositionObj.position.z;\n },\n setRotationX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.x = x;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return x;\n },\n setRotationY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.y = y;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return y;\n },\n setRotationZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.z = z;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return z;\n },\n setRotationW: (w: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.w = w;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return w;\n },\n adjustRotationByX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.x += x;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return proxyRotationObj.rotation.x;\n },\n adjustRotationByY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.y += y;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return proxyRotationObj.rotation.y;\n },\n adjustRotationByZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.z += z;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return proxyRotationObj.rotation.z;\n },\n adjustRotationByW: (w: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.w += w;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return proxyRotationObj.rotation.w;\n },\n setScaleX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.x = x;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return x;\n },\n setScaleY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.y = y;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return y;\n },\n setScaleZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.z = z;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return z;\n },\n adjustScaleByX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.x += x;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return proxyScaleObj.scale.x;\n },\n adjustScaleByY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.y += y;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return proxyScaleObj.scale.y;\n },\n adjustScaleByZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.z += z;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return proxyScaleObj.scale.z;\n }\n };\n}\n"],"names":["withProxyTransform","abstractTransformAgent","proxyPositionObj","proxyRotationObj","proxyScaleObj","getX","getZ","getY","withMoveBy3dMixin","getScaleX","getScaleY","getScaleZ","withScaleMixin","getRotationX","getRotationY","getRotationZ","getRotationW","withQuaternionRotationByXyzMixin","setX","x","position","position$","next","setY","y","setZ","z","addX","addY","addZ","setRotationX","rotation","rotation$","setRotationY","setRotationZ","setRotationW","w","adjustRotationByX","adjustRotationByY","adjustRotationByZ","adjustRotationByW","setScaleX","scale","scale$","setScaleY","setScaleZ","adjustScaleByX","adjustScaleByY","adjustScaleByZ"],"mappings":"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"}
1
+ {"version":3,"file":"WithProxyTransform.js","sources":["../../../src/TransformDrive/Mixins/WithProxyTransform.ts"],"sourcesContent":["import type { TMovableXYZ, TQuaternionRotatable, TScaleMixin, TWithPosition3dProperty, TWithQuaternionRotationProperty, TWithScaleProperty } from '@hellpig/anarchy-engine/Mixins';\nimport { withMoveBy3dMixin, withQuaternionRotationByXyzMixin, withScaleMixin } from '@hellpig/anarchy-engine/Mixins';\nimport type { TAbstractTransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Models';\n\nexport function withProxyTransform(\n abstractTransformAgent: TAbstractTransformAgent,\n proxyPositionObj: TWithPosition3dProperty,\n proxyRotationObj: TWithQuaternionRotationProperty,\n proxyScaleObj: TWithScaleProperty\n): TMovableXYZ & TScaleMixin & TQuaternionRotatable {\n const { getX, getZ, getY } = withMoveBy3dMixin(proxyPositionObj);\n const { getScaleX, getScaleY, getScaleZ } = withScaleMixin(proxyScaleObj);\n const { getRotationX, getRotationY, getRotationZ, getRotationW } = withQuaternionRotationByXyzMixin(proxyRotationObj);\n\n return {\n getX,\n getY,\n getZ,\n getScaleX,\n getScaleY,\n getScaleZ,\n getRotationX,\n getRotationY,\n getRotationZ,\n getRotationW,\n setX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.x = x;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return x;\n },\n setY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.y = y;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return y;\n },\n setZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.z = z;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return z;\n },\n addX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.x += x;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return proxyPositionObj.position.x;\n },\n addY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.y += y;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return proxyPositionObj.position.y;\n },\n addZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyPositionObj.position.z += z;\n abstractTransformAgent.position$.next(proxyPositionObj.position);\n return proxyPositionObj.position.z;\n },\n setRotationX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.x = x;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return x;\n },\n setRotationY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.y = y;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return y;\n },\n setRotationZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.z = z;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return z;\n },\n setRotationW: (w: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.w = w;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return w;\n },\n adjustRotationByX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.x += x;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return proxyRotationObj.rotation.x;\n },\n adjustRotationByY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.y += y;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return proxyRotationObj.rotation.y;\n },\n adjustRotationByZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.z += z;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return proxyRotationObj.rotation.z;\n },\n adjustRotationByW: (w: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyRotationObj.rotation.w += w;\n abstractTransformAgent.rotation$.next(proxyRotationObj.rotation);\n return proxyRotationObj.rotation.w;\n },\n setScaleX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.x = x;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return x;\n },\n setScaleY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.y = y;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return y;\n },\n setScaleZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.z = z;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return z;\n },\n adjustScaleByX: (x: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.x += x;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return proxyScaleObj.scale.x;\n },\n adjustScaleByY: (y: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.y += y;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return proxyScaleObj.scale.y;\n },\n adjustScaleByZ: (z: number): number => {\n // eslint-disable-next-line functional/immutable-data\n proxyScaleObj.scale.z += z;\n abstractTransformAgent.scale$.next(proxyScaleObj.scale);\n return proxyScaleObj.scale.z;\n }\n };\n}\n"],"names":["withProxyTransform","abstractTransformAgent","proxyPositionObj","proxyRotationObj","proxyScaleObj","getX","getZ","getY","withMoveBy3dMixin","getScaleX","getScaleY","getScaleZ","withScaleMixin","getRotationX","getRotationY","getRotationZ","getRotationW","withQuaternionRotationByXyzMixin","setX","x","position","position$","next","setY","y","setZ","z","addX","addY","addZ","setRotationX","rotation","rotation$","setRotationY","setRotationZ","setRotationW","w","adjustRotationByX","adjustRotationByY","adjustRotationByZ","adjustRotationByW","setScaleX","scale","scale$","setScaleY","setScaleZ","adjustScaleByX","adjustScaleByY","adjustScaleByZ"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransformDriveRegistry.js","sources":["../../../src/TransformDrive/Registries/TransformDriveRegistry.ts"],"sourcesContent":["import { AbstractEntityRegistry, RegistryType } from '@Anarchy/Engine/Abstract';\nimport type { TTransformDrive, TTransformDriveCompatibleEntity, TTransformDriveRegistry } from '@Anarchy/Engine/TransformDrive/Models';\n\nexport function TransformDriveRegistry(): TTransformDriveRegistry {\n return AbstractEntityRegistry<TTransformDrive<TTransformDriveCompatibleEntity>>(RegistryType.TransformDrive);\n}\n"],"names":["TransformDriveRegistry","AbstractEntityRegistry","RegistryType","TransformDrive"],"mappings":"2JAGO,SAASA,yBACd,OAAOC,uBAAyEC,aAAaC,eAC/F"}
1
+ {"version":3,"file":"TransformDriveRegistry.js","sources":["../../../src/TransformDrive/Registries/TransformDriveRegistry.ts"],"sourcesContent":["import { AbstractEntityRegistry, RegistryType } from '@hellpig/anarchy-engine/Abstract';\nimport type { TTransformDrive, TTransformDriveCompatibleEntity, TTransformDriveRegistry } from '@hellpig/anarchy-engine/TransformDrive/Models';\n\nexport function TransformDriveRegistry(): TTransformDriveRegistry {\n return AbstractEntityRegistry<TTransformDrive<TTransformDriveCompatibleEntity>>(RegistryType.TransformDrive);\n}\n"],"names":["TransformDriveRegistry","AbstractEntityRegistry","RegistryType","TransformDrive"],"mappings":"2JAGO,SAASA,yBACd,OAAOC,uBAAyEC,aAAaC,eAC/F"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransformDriveService.js","sources":["../../../src/TransformDrive/Services/TransformDriveService.ts"],"sourcesContent":["import type { TAbstractService } from '@Anarchy/Engine/Abstract';\nimport { AbstractService } from '@Anarchy/Engine/Abstract';\nimport type { TKinematicLoop } from '@Anarchy/Engine/Kinematic';\nimport { toQuaternion } from '@Anarchy/Engine/Math';\nimport type { TDisposable } from '@Anarchy/Engine/Mixins';\nimport { withFactoryService, withRegistryService, withSerializableEntities } from '@Anarchy/Engine/Mixins';\nimport type { TPhysicsLoop } from '@Anarchy/Engine/Physics';\nimport { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport { ConnectedTransformAgent, DefaultTransformAgent, PhysicsTransformAgent } from '@Anarchy/Engine/TransformDrive/Entities';\nimport type {\n TAbstractTransformAgent,\n TGetTransformAgentsOptions,\n TGetTransformAgentsParams,\n TTransformAgentParams,\n TTransformAgents,\n TTransformDrive,\n TTransformDriveCompatibleEntity,\n TTransformDriveFactory,\n TTransformDriveParams,\n TTransformDriveRegistry,\n TTransformDriveSerializedData,\n TTransformDriveService,\n TTransformDriveServiceDependencies,\n TTransformDriveServiceWithFactory,\n TTransformDriveServiceWithRegistry\n} from '@Anarchy/Engine/TransformDrive/Models';\nimport { getKinematicTransformAgent } from '@Anarchy/Engine/TransformDrive/Utils';\nimport { mergeAll } from '@Anarchy/Engine/Utils';\nimport type { TOptional, TWriteable } from '@Anarchy/Shared/Utils';\nimport { isDefined } from '@Anarchy/Shared/Utils';\nimport type { Subscription } from 'rxjs';\nimport { Quaternion, Vector3 } from 'three';\n\nexport function TransformDriveService(factory: TTransformDriveFactory, registry: TTransformDriveRegistry, { loopService }: TTransformDriveServiceDependencies): TTransformDriveService {\n const factorySub$: Subscription = factory.entityCreated$.subscribe((entity: TTransformDrive<TTransformDriveCompatibleEntity>): void => registry.add(entity));\n const disposable: ReadonlyArray<TDisposable> = [registry, factory, factorySub$];\n const abstractService: TAbstractService = AbstractService(disposable);\n\n const create = <T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(params: TTransformDriveParams, agents: T): TTransformDrive<T> => {\n return factory.create({ params, agents }, undefined) as TTransformDrive<T>;\n };\n const createFromList = <T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(\n paramsList: ReadonlyArray<TTransformDriveParams>,\n agentsList: ReadonlyArray<T>\n ): ReadonlyArray<TTransformDrive<T>> => {\n if (paramsList.length !== agentsList.length) throw new Error('TransformDriveService: paramsList and agentsList should have the same length');\n return paramsList.map((p: TTransformDriveParams, i: number): TTransformDrive<T> => create(p, agentsList[i] as T));\n };\n\n const withFactory: TTransformDriveServiceWithFactory = withFactoryService(factory);\n const withRegistry: TTransformDriveServiceWithRegistry = withRegistryService(registry);\n\n function getTransformAgents(\n { position, rotation, scale, kinematic, physicsBody }: TGetTransformAgentsParams,\n { hasKinematic, hasPhysics, hasConnected }: TGetTransformAgentsOptions\n ): TOptional<TTransformAgents> {\n const result: TWriteable<TOptional<TTransformAgents>> = {};\n\n //PhysicsTransformAgent might need a special \"onDeactivated\" hook if it supposed to switch physics/non-physics mode in runtime\n const agentParams: TTransformAgentParams = {\n position: position,\n rotation: rotation ? toQuaternion(rotation) : new Quaternion(),\n scale: scale ?? new Vector3(1, 1, 1),\n onDeactivated: undefined,\n onActivated: undefined\n };\n\n if (hasKinematic) {\n const kinematicLoop: TKinematicLoop = loopService.getKinematicLoop();\n // eslint-disable-next-line functional/immutable-data\n result[TransformAgent.Kinematic] = getKinematicTransformAgent(agentParams, kinematic, { kinematicLoop });\n }\n\n if (hasPhysics && isDefined(physicsBody)) {\n const physicsLoop: TPhysicsLoop = loopService.getPhysicsLoop();\n // eslint-disable-next-line functional/immutable-data\n result[TransformAgent.Physics] = PhysicsTransformAgent({ ...agentParams, physicsBody: physicsBody }, { physicsLoop });\n }\n\n // eslint-disable-next-line functional/immutable-data\n if (hasConnected) result[TransformAgent.Connected] = ConnectedTransformAgent(agentParams);\n\n // eslint-disable-next-line functional/immutable-data\n result[TransformAgent.Default] = DefaultTransformAgent(agentParams);\n\n return result;\n }\n\n return mergeAll(abstractService, withFactory, withRegistry, withSerializableEntities<TTransformDrive<TTransformDriveCompatibleEntity>, TTransformDriveSerializedData, undefined>(registry), {\n create,\n createFromList,\n getTransformAgents\n });\n}\n"],"names":["TransformDriveService","factory","registry","loopService","factorySub$","entityCreated$","subscribe","entity","add","abstractService","AbstractService","create","params","agents","withFactory","withFactoryService","withRegistry","withRegistryService","mergeAll","withSerializableEntities","createFromList","paramsList","agentsList","length","Error","map","p","i","getTransformAgents","position","rotation","scale","kinematic","physicsBody","hasKinematic","hasPhysics","hasConnected","result","agentParams","toQuaternion","Quaternion","Vector3","onDeactivated","onActivated","kinematicLoop","getKinematicLoop","TransformAgent","Kinematic","getKinematicTransformAgent","isDefined","physicsLoop","getPhysicsLoop","Physics","PhysicsTransformAgent","Connected","ConnectedTransformAgent","Default","DefaultTransformAgent"],"mappings":"m4BAiCO,SAASA,sBAAsBC,QAAiCC,UAAmCC,YAAEA,cAC1G,MAAMC,YAA4BH,QAAQI,eAAeC,UAAWC,QAAmEL,SAASM,IAAID,SAE9IE,gBAAoCC,gBADK,CAACR,SAAUD,QAASG,cAG7DO,OAAS,CAAqEC,OAA+BC,SAC1GZ,QAAQU,OAAO,CAAEC,cAAQC,oBAAU,GAUtCC,YAAiDC,mBAAmBd,SACpEe,aAAmDC,oBAAoBf,UAsC7E,OAAOgB,SAAST,gBAAiBK,YAAaE,aAAcG,yBAAqHjB,UAAW,CAC1LS,cACAS,eAjDqB,CACrBC,WACAC,cAEA,GAAID,WAAWE,SAAWD,WAAWC,OAAQ,MAAM,IAAIC,MAAM,gFAC7D,OAAOH,WAAWI,IAAI,CAACC,EAA0BC,IAAkChB,OAAOe,EAAGJ,WAAWK,MA6CxGC,mBAvCF,UACEC,SAAEA,SAAAC,SAAUA,SAAAC,MAAUA,MAAAC,UAAOA,UAAAC,YAAWA,cACxCC,aAAEA,aAAAC,WAAcA,WAAAC,aAAYA,eAE5B,MAAMC,OAAkD,CAAA,EAGlDC,YAAqC,CACzCT,kBACAC,SAAUA,SAAWS,aAAaT,UAAY,IAAIU,WAClDT,MAAOA,OAAS,IAAIU,QAAQ,EAAG,EAAG,GAClCC,mBAAe,EACfC,iBAAa,GAGf,GAAIT,aAAc,CAChB,MAAMU,cAAgCzC,YAAY0C,mBAElDR,OAAOS,eAAeC,WAAaC,2BAA2BV,YAAaN,UAAW,CAAEY,6BAC1F,CAEA,GAAIT,YAAcc,UAAUhB,aAAc,CACxC,MAAMiB,YAA4B/C,YAAYgD,iBAE9Cd,OAAOS,eAAeM,SAAWC,sBAAsB,IAAKf,YAAaL,yBAA4B,CAAEiB,yBACzG,CAQA,OALId,eAAcC,OAAOS,eAAeQ,WAAaC,wBAAwBjB,cAG7ED,OAAOS,eAAeU,SAAWC,sBAAsBnB,aAEhDD,MACT,GAOF"}
1
+ {"version":3,"file":"TransformDriveService.js","sources":["../../../src/TransformDrive/Services/TransformDriveService.ts"],"sourcesContent":["import type { TAbstractService } from '@hellpig/anarchy-engine/Abstract';\nimport { AbstractService } from '@hellpig/anarchy-engine/Abstract';\nimport type { TKinematicLoop } from '@hellpig/anarchy-engine/Kinematic';\nimport { toQuaternion } from '@hellpig/anarchy-engine/Math';\nimport type { TDisposable } from '@hellpig/anarchy-engine/Mixins';\nimport { withFactoryService, withRegistryService, withSerializableEntities } from '@hellpig/anarchy-engine/Mixins';\nimport type { TPhysicsLoop } from '@hellpig/anarchy-engine/Physics';\nimport { TransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Constants';\nimport { ConnectedTransformAgent, DefaultTransformAgent, PhysicsTransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Entities';\nimport type {\n TAbstractTransformAgent,\n TGetTransformAgentsOptions,\n TGetTransformAgentsParams,\n TTransformAgentParams,\n TTransformAgents,\n TTransformDrive,\n TTransformDriveCompatibleEntity,\n TTransformDriveFactory,\n TTransformDriveParams,\n TTransformDriveRegistry,\n TTransformDriveSerializedData,\n TTransformDriveService,\n TTransformDriveServiceDependencies,\n TTransformDriveServiceWithFactory,\n TTransformDriveServiceWithRegistry\n} from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { getKinematicTransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Utils';\nimport { mergeAll } from '@hellpig/anarchy-engine/Utils';\nimport type { TOptional, TWriteable } from '@hellpig/anarchy-shared/Utils';\nimport { isDefined } from '@hellpig/anarchy-shared/Utils';\nimport type { Subscription } from 'rxjs';\nimport { Quaternion, Vector3 } from 'three';\n\nexport function TransformDriveService(factory: TTransformDriveFactory, registry: TTransformDriveRegistry, { loopService }: TTransformDriveServiceDependencies): TTransformDriveService {\n const factorySub$: Subscription = factory.entityCreated$.subscribe((entity: TTransformDrive<TTransformDriveCompatibleEntity>): void => registry.add(entity));\n const disposable: ReadonlyArray<TDisposable> = [registry, factory, factorySub$];\n const abstractService: TAbstractService = AbstractService(disposable);\n\n const create = <T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(params: TTransformDriveParams, agents: T): TTransformDrive<T> => {\n return factory.create({ params, agents }, undefined) as TTransformDrive<T>;\n };\n const createFromList = <T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(\n paramsList: ReadonlyArray<TTransformDriveParams>,\n agentsList: ReadonlyArray<T>\n ): ReadonlyArray<TTransformDrive<T>> => {\n if (paramsList.length !== agentsList.length) throw new Error('TransformDriveService: paramsList and agentsList should have the same length');\n return paramsList.map((p: TTransformDriveParams, i: number): TTransformDrive<T> => create(p, agentsList[i] as T));\n };\n\n const withFactory: TTransformDriveServiceWithFactory = withFactoryService(factory);\n const withRegistry: TTransformDriveServiceWithRegistry = withRegistryService(registry);\n\n function getTransformAgents(\n { position, rotation, scale, kinematic, physicsBody }: TGetTransformAgentsParams,\n { hasKinematic, hasPhysics, hasConnected }: TGetTransformAgentsOptions\n ): TOptional<TTransformAgents> {\n const result: TWriteable<TOptional<TTransformAgents>> = {};\n\n //PhysicsTransformAgent might need a special \"onDeactivated\" hook if it supposed to switch physics/non-physics mode in runtime\n const agentParams: TTransformAgentParams = {\n position: position,\n rotation: rotation ? toQuaternion(rotation) : new Quaternion(),\n scale: scale ?? new Vector3(1, 1, 1),\n onDeactivated: undefined,\n onActivated: undefined\n };\n\n if (hasKinematic) {\n const kinematicLoop: TKinematicLoop = loopService.getKinematicLoop();\n // eslint-disable-next-line functional/immutable-data\n result[TransformAgent.Kinematic] = getKinematicTransformAgent(agentParams, kinematic, { kinematicLoop });\n }\n\n if (hasPhysics && isDefined(physicsBody)) {\n const physicsLoop: TPhysicsLoop = loopService.getPhysicsLoop();\n // eslint-disable-next-line functional/immutable-data\n result[TransformAgent.Physics] = PhysicsTransformAgent({ ...agentParams, physicsBody: physicsBody }, { physicsLoop });\n }\n\n // eslint-disable-next-line functional/immutable-data\n if (hasConnected) result[TransformAgent.Connected] = ConnectedTransformAgent(agentParams);\n\n // eslint-disable-next-line functional/immutable-data\n result[TransformAgent.Default] = DefaultTransformAgent(agentParams);\n\n return result;\n }\n\n return mergeAll(abstractService, withFactory, withRegistry, withSerializableEntities<TTransformDrive<TTransformDriveCompatibleEntity>, TTransformDriveSerializedData, undefined>(registry), {\n create,\n createFromList,\n getTransformAgents\n });\n}\n"],"names":["TransformDriveService","factory","registry","loopService","factorySub$","entityCreated$","subscribe","entity","add","abstractService","AbstractService","create","params","agents","withFactory","withFactoryService","withRegistry","withRegistryService","mergeAll","withSerializableEntities","createFromList","paramsList","agentsList","length","Error","map","p","i","getTransformAgents","position","rotation","scale","kinematic","physicsBody","hasKinematic","hasPhysics","hasConnected","result","agentParams","toQuaternion","Quaternion","Vector3","onDeactivated","onActivated","kinematicLoop","getKinematicLoop","TransformAgent","Kinematic","getKinematicTransformAgent","isDefined","physicsLoop","getPhysicsLoop","Physics","PhysicsTransformAgent","Connected","ConnectedTransformAgent","Default","DefaultTransformAgent"],"mappings":"m4BAiCO,SAASA,sBAAsBC,QAAiCC,UAAmCC,YAAEA,cAC1G,MAAMC,YAA4BH,QAAQI,eAAeC,UAAWC,QAAmEL,SAASM,IAAID,SAE9IE,gBAAoCC,gBADK,CAACR,SAAUD,QAASG,cAG7DO,OAAS,CAAqEC,OAA+BC,SAC1GZ,QAAQU,OAAO,CAAEC,cAAQC,oBAAU,GAUtCC,YAAiDC,mBAAmBd,SACpEe,aAAmDC,oBAAoBf,UAsC7E,OAAOgB,SAAST,gBAAiBK,YAAaE,aAAcG,yBAAqHjB,UAAW,CAC1LS,cACAS,eAjDqB,CACrBC,WACAC,cAEA,GAAID,WAAWE,SAAWD,WAAWC,OAAQ,MAAM,IAAIC,MAAM,gFAC7D,OAAOH,WAAWI,IAAI,CAACC,EAA0BC,IAAkChB,OAAOe,EAAGJ,WAAWK,MA6CxGC,mBAvCF,UACEC,SAAEA,SAAAC,SAAUA,SAAAC,MAAUA,MAAAC,UAAOA,UAAAC,YAAWA,cACxCC,aAAEA,aAAAC,WAAcA,WAAAC,aAAYA,eAE5B,MAAMC,OAAkD,CAAA,EAGlDC,YAAqC,CACzCT,kBACAC,SAAUA,SAAWS,aAAaT,UAAY,IAAIU,WAClDT,MAAOA,OAAS,IAAIU,QAAQ,EAAG,EAAG,GAClCC,mBAAe,EACfC,iBAAa,GAGf,GAAIT,aAAc,CAChB,MAAMU,cAAgCzC,YAAY0C,mBAElDR,OAAOS,eAAeC,WAAaC,2BAA2BV,YAAaN,UAAW,CAAEY,6BAC1F,CAEA,GAAIT,YAAcc,UAAUhB,aAAc,CACxC,MAAMiB,YAA4B/C,YAAYgD,iBAE9Cd,OAAOS,eAAeM,SAAWC,sBAAsB,IAAKf,YAAaL,yBAA4B,CAAEiB,yBACzG,CAQA,OALId,eAAcC,OAAOS,eAAeQ,WAAaC,wBAAwBjB,cAG7ED,OAAOS,eAAeU,SAAWC,sBAAsBnB,aAEhDD,MACT,GAOF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActorDriveUtils.js","sources":["../../../src/TransformDrive/Utils/ActorDriveUtils.ts"],"sourcesContent":["import type { TVector3OrEuler, TVector4OrQuaternion } from '@Anarchy/Engine/ThreeLib';\nimport type { TWriteable } from '@Anarchy/Shared/Utils';\nimport type { Subject } from 'rxjs';\n\nexport function getXyzUpdateProxy<T extends TVector3OrEuler>(coordsObj: TWriteable<TVector3OrEuler>, subj$: Subject<T>): TVector3OrEuler {\n return new Proxy(coordsObj, {\n set(target: TWriteable<TVector3OrEuler>, prop: string, value: number): boolean {\n if (prop === 'x' || prop === 'y' || prop === 'z') {\n // eslint-disable-next-line functional/immutable-data\n target[prop] = value;\n subj$.next(target.clone() as T);\n }\n return true;\n }\n });\n}\n\nexport function getXyzwUpdateProxy<T extends TVector4OrQuaternion>(coordsObj: TWriteable<TVector4OrQuaternion>, subj$: Subject<T>): TVector4OrQuaternion {\n return new Proxy(coordsObj, {\n set(target: TWriteable<TVector4OrQuaternion>, prop: string, value: number): boolean {\n if (prop === 'x' || prop === 'y' || prop === 'z' || prop === 'w') {\n // eslint-disable-next-line functional/immutable-data\n target[prop] = value;\n subj$.next(target.clone() as T);\n }\n return true;\n }\n });\n}\n"],"names":["getXyzUpdateProxy","coordsObj","subj$","Proxy","set","target","prop","value","next","clone","getXyzwUpdateProxy"],"mappings":"AAIO,SAASA,kBAA6CC,UAAwCC,OACnG,OAAO,IAAIC,MAAMF,UAAW,CAC1BG,IAAA,CAAIC,OAAqCC,KAAcC,SACxC,MAATD,MAAyB,MAATA,MAAyB,MAATA,OAElCD,OAAOC,MAAQC,MACfL,MAAMM,KAAKH,OAAOI,WAEb,IAGb,CAEO,SAASC,mBAAmDT,UAA6CC,OAC9G,OAAO,IAAIC,MAAMF,UAAW,CAC1BG,IAAA,CAAIC,OAA0CC,KAAcC,SAC7C,MAATD,MAAyB,MAATA,MAAyB,MAATA,MAAyB,MAATA,OAElDD,OAAOC,MAAQC,MACfL,MAAMM,KAAKH,OAAOI,WAEb,IAGb"}
1
+ {"version":3,"file":"ActorDriveUtils.js","sources":["../../../src/TransformDrive/Utils/ActorDriveUtils.ts"],"sourcesContent":["import type { TVector3OrEuler, TVector4OrQuaternion } from '@hellpig/anarchy-engine/ThreeLib';\nimport type { TWriteable } from '@hellpig/anarchy-shared/Utils';\nimport type { Subject } from 'rxjs';\n\nexport function getXyzUpdateProxy<T extends TVector3OrEuler>(coordsObj: TWriteable<TVector3OrEuler>, subj$: Subject<T>): TVector3OrEuler {\n return new Proxy(coordsObj, {\n set(target: TWriteable<TVector3OrEuler>, prop: string, value: number): boolean {\n if (prop === 'x' || prop === 'y' || prop === 'z') {\n // eslint-disable-next-line functional/immutable-data\n target[prop] = value;\n subj$.next(target.clone() as T);\n }\n return true;\n }\n });\n}\n\nexport function getXyzwUpdateProxy<T extends TVector4OrQuaternion>(coordsObj: TWriteable<TVector4OrQuaternion>, subj$: Subject<T>): TVector4OrQuaternion {\n return new Proxy(coordsObj, {\n set(target: TWriteable<TVector4OrQuaternion>, prop: string, value: number): boolean {\n if (prop === 'x' || prop === 'y' || prop === 'z' || prop === 'w') {\n // eslint-disable-next-line functional/immutable-data\n target[prop] = value;\n subj$.next(target.clone() as T);\n }\n return true;\n }\n });\n}\n"],"names":["getXyzUpdateProxy","coordsObj","subj$","Proxy","set","target","prop","value","next","clone","getXyzwUpdateProxy"],"mappings":"AAIO,SAASA,kBAA6CC,UAAwCC,OACnG,OAAO,IAAIC,MAAMF,UAAW,CAC1BG,IAAA,CAAIC,OAAqCC,KAAcC,SACxC,MAATD,MAAyB,MAATA,MAAyB,MAATA,OAElCD,OAAOC,MAAQC,MACfL,MAAMM,KAAKH,OAAOI,WAEb,IAGb,CAEO,SAASC,mBAAmDT,UAA6CC,OAC9G,OAAO,IAAIC,MAAMF,UAAW,CAC1BG,IAAA,CAAIC,OAA0CC,KAAcC,SAC7C,MAATD,MAAyB,MAATA,MAAyB,MAATA,MAAyB,MAATA,OAElDD,OAAOC,MAAQC,MACfL,MAAMM,KAAKH,OAAOI,WAEb,IAGb"}
@@ -1 +1 @@
1
- {"version":3,"file":"AgentUtils.js","sources":["../../../src/TransformDrive/Utils/AgentUtils.ts"],"sourcesContent":["import type { TKinematicData, TKinematicParams } from '@Anarchy/Engine/Kinematic';\nimport { DEFAULT_RADIUS, ForwardAxis } from '@Anarchy/Engine/Kinematic';\nimport { KinematicTransformAgent } from '@Anarchy/Engine/TransformDrive/Entities/Agents/KinematicTransformAgent';\nimport type { TKinematicAgentDependencies, TKinematicTransformAgent, TKinematicTransformAgentParams, TTransformAgentParams } from '@Anarchy/Engine/TransformDrive/Models';\nimport type { TOptional } from '@Anarchy/Shared/Utils';\nimport { Quaternion, Vector3 } from 'three';\n\nexport function getKinematicTransformAgent(params: TTransformAgentParams, kinematic: TOptional<TKinematicParams> | undefined, dependencies: TKinematicAgentDependencies): TKinematicTransformAgent {\n const agentParams: TTransformAgentParams = { position: params.position, rotation: params.rotation, scale: params.scale ?? new Vector3(1, 1, 1) };\n const kinematicData: TKinematicData = getKinematicWithDefaults(kinematic);\n const kinematicAgentParams: TKinematicTransformAgentParams = { ...agentParams, ...kinematicData, isAutoUpdate: kinematic?.isAutoUpdate ?? true };\n return KinematicTransformAgent(kinematicAgentParams, dependencies);\n}\n\nexport function getKinematicWithDefaults(kinematic: TOptional<TKinematicParams> | undefined): TKinematicData {\n const state = kinematic?.state ?? {};\n const target = kinematic?.target ?? {};\n const { linearSpeed, linearDirection, angularDirection, angularSpeed, radius } = state;\n const { position, rotation, positionThreshold, rotationThreshold } = target;\n\n return {\n state: {\n linearSpeed: linearSpeed ?? 0,\n linearDirection: linearDirection ?? new Vector3(),\n angularSpeed: angularSpeed ?? 0,\n angularDirection: angularDirection ?? new Quaternion(),\n radius: radius ?? DEFAULT_RADIUS,\n forwardAxis: ForwardAxis.X,\n isInfiniteRotation: false\n },\n target: {\n positionThreshold: positionThreshold ?? 0.01,\n position,\n rotationThreshold: rotationThreshold ?? 0.0001,\n rotation\n }\n };\n}\n"],"names":["getKinematicTransformAgent","params","kinematic","dependencies","kinematicAgentParams","position","rotation","scale","Vector3","getKinematicWithDefaults","isAutoUpdate","KinematicTransformAgent","state","target","linearSpeed","linearDirection","angularDirection","angularSpeed","radius","positionThreshold","rotationThreshold","Quaternion","DEFAULT_RADIUS","forwardAxis","ForwardAxis","X","isInfiniteRotation"],"mappings":"uQAOO,SAASA,2BAA2BC,OAA+BC,UAAoDC,cAC5H,MAEMC,qBAAuD,CAFhBC,SAAUJ,OAAOI,SAAUC,SAAUL,OAAOK,SAAUC,MAAON,OAAOM,OAAS,IAAIC,QAAQ,EAAG,EAAG,MACtGC,yBAAyBP,WACkCQ,aAAcR,WAAWQ,eAAgB,GAC1I,OAAOC,wBAAwBP,qBAAsBD,aACvD,CAEO,SAASM,yBAAyBP,WACvC,MAAMU,MAAQV,WAAWU,OAAS,CAAA,EAC5BC,OAASX,WAAWW,QAAU,CAAA,GAC9BC,YAAEA,YAAAC,gBAAaA,gBAAAC,iBAAiBA,iBAAAC,aAAkBA,aAAAC,OAAcA,QAAWN,OAC3EP,SAAEA,SAAAC,SAAUA,SAAAa,kBAAUA,kBAAAC,kBAAmBA,mBAAsBP,OAErE,MAAO,CACLD,MAAO,CACLE,YAAaA,aAAe,EAC5BC,gBAAiBA,iBAAmB,IAAIP,QACxCS,aAAcA,cAAgB,EAC9BD,iBAAkBA,kBAAoB,IAAIK,WAC1CH,OAAQA,QAAUI,eAClBC,YAAaC,YAAYC,EACzBC,oBAAoB,GAEtBb,OAAQ,CACNM,kBAAmBA,mBAAqB,IACxCd,kBACAe,kBAAmBA,mBAAqB,KACxCd,mBAGN"}
1
+ {"version":3,"file":"AgentUtils.js","sources":["../../../src/TransformDrive/Utils/AgentUtils.ts"],"sourcesContent":["import type { TKinematicData, TKinematicParams } from '@hellpig/anarchy-engine/Kinematic';\nimport { DEFAULT_RADIUS, ForwardAxis } from '@hellpig/anarchy-engine/Kinematic';\nimport { KinematicTransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Entities/Agents/KinematicTransformAgent';\nimport type { TKinematicAgentDependencies, TKinematicTransformAgent, TKinematicTransformAgentParams, TTransformAgentParams } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport type { TOptional } from '@hellpig/anarchy-shared/Utils';\nimport { Quaternion, Vector3 } from 'three';\n\nexport function getKinematicTransformAgent(params: TTransformAgentParams, kinematic: TOptional<TKinematicParams> | undefined, dependencies: TKinematicAgentDependencies): TKinematicTransformAgent {\n const agentParams: TTransformAgentParams = { position: params.position, rotation: params.rotation, scale: params.scale ?? new Vector3(1, 1, 1) };\n const kinematicData: TKinematicData = getKinematicWithDefaults(kinematic);\n const kinematicAgentParams: TKinematicTransformAgentParams = { ...agentParams, ...kinematicData, isAutoUpdate: kinematic?.isAutoUpdate ?? true };\n return KinematicTransformAgent(kinematicAgentParams, dependencies);\n}\n\nexport function getKinematicWithDefaults(kinematic: TOptional<TKinematicParams> | undefined): TKinematicData {\n const state = kinematic?.state ?? {};\n const target = kinematic?.target ?? {};\n const { linearSpeed, linearDirection, angularDirection, angularSpeed, radius } = state;\n const { position, rotation, positionThreshold, rotationThreshold } = target;\n\n return {\n state: {\n linearSpeed: linearSpeed ?? 0,\n linearDirection: linearDirection ?? new Vector3(),\n angularSpeed: angularSpeed ?? 0,\n angularDirection: angularDirection ?? new Quaternion(),\n radius: radius ?? DEFAULT_RADIUS,\n forwardAxis: ForwardAxis.X,\n isInfiniteRotation: false\n },\n target: {\n positionThreshold: positionThreshold ?? 0.01,\n position,\n rotationThreshold: rotationThreshold ?? 0.0001,\n rotation\n }\n };\n}\n"],"names":["getKinematicTransformAgent","params","kinematic","dependencies","kinematicAgentParams","position","rotation","scale","Vector3","getKinematicWithDefaults","isAutoUpdate","KinematicTransformAgent","state","target","linearSpeed","linearDirection","angularDirection","angularSpeed","radius","positionThreshold","rotationThreshold","Quaternion","DEFAULT_RADIUS","forwardAxis","ForwardAxis","X","isInfiniteRotation"],"mappings":"uQAOO,SAASA,2BAA2BC,OAA+BC,UAAoDC,cAC5H,MAEMC,qBAAuD,CAFhBC,SAAUJ,OAAOI,SAAUC,SAAUL,OAAOK,SAAUC,MAAON,OAAOM,OAAS,IAAIC,QAAQ,EAAG,EAAG,MACtGC,yBAAyBP,WACkCQ,aAAcR,WAAWQ,eAAgB,GAC1I,OAAOC,wBAAwBP,qBAAsBD,aACvD,CAEO,SAASM,yBAAyBP,WACvC,MAAMU,MAAQV,WAAWU,OAAS,CAAA,EAC5BC,OAASX,WAAWW,QAAU,CAAA,GAC9BC,YAAEA,YAAAC,gBAAaA,gBAAAC,iBAAiBA,iBAAAC,aAAkBA,aAAAC,OAAcA,QAAWN,OAC3EP,SAAEA,SAAAC,SAAUA,SAAAa,kBAAUA,kBAAAC,kBAAmBA,mBAAsBP,OAErE,MAAO,CACLD,MAAO,CACLE,YAAaA,aAAe,EAC5BC,gBAAiBA,iBAAmB,IAAIP,QACxCS,aAAcA,cAAgB,EAC9BD,iBAAkBA,kBAAoB,IAAIK,WAC1CH,OAAQA,QAAUI,eAClBC,YAAaC,YAAYC,EACzBC,oBAAoB,GAEtBb,OAAQ,CACNM,kBAAmBA,mBAAqB,IACxCd,kBACAe,kBAAmBA,mBAAqB,KACxCd,mBAGN"}
@@ -1 +1 @@
1
- {"version":3,"file":"KinematicAgentUtils.js","sources":["../../../src/TransformDrive/Utils/KinematicAgentUtils.ts"],"sourcesContent":["import type { TKinematicState, TKinematicTarget } from '@Anarchy/Engine/Kinematic';\nimport { KinematicSpeed } from '@Anarchy/Engine/Kinematic';\nimport type { TMeters, TRadians } from '@Anarchy/Engine/Math';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport type { TKinematicSpeed, TKinematicTransformAgent } from '@Anarchy/Engine/TransformDrive/Models';\nimport type { TWriteable } from '@Anarchy/Shared/Utils';\nimport { isDefined, isNotDefined } from '@Anarchy/Shared/Utils';\nimport { Quaternion, Vector3 } from 'three';\n\nexport function getStepRotation(agent: TKinematicTransformAgent, rotationStep: TRadians, infinite: boolean): Quaternion | undefined {\n if (!infinite && isNotDefined(agent.data.target?.rotation)) return undefined;\n\n // Retrieve the target rotation (for infinite mode, it's used as a descriptor).\n const targetRotation: Quaternion = agent.data.target?.rotation ?? new Quaternion();\n const targetNormalized: Quaternion = targetRotation.clone().normalize();\n\n // Clamp w-component to prevent floating-point errors.\n const clamped: number = Math.min(Math.max(targetNormalized.w, -1), 1);\n let angle: number = 2 * Math.acos(clamped);\n\n // Correct angle to take the shortest rotation path.\n if (angle > Math.PI) angle -= 2 * Math.PI;\n\n const sinHalfAngle: number = Math.sqrt(1 - clamped * clamped);\n\n // Extract rotation axis; use a default axis if sinHalfAngle is too small.\n const axis: Vector3 = sinHalfAngle > 1e-6 ? new Vector3(targetNormalized.x, targetNormalized.y, targetNormalized.z).divideScalar(sinHalfAngle).normalize() : new Vector3(0, 1, 0);\n\n // Infinite Rotation Mode\n if (infinite) {\n // Use the computed sign (after correction) to determine a rotation direction.\n const stepAngle: number = Math.sign(angle) * rotationStep;\n return new Quaternion().setFromAxisAngle(axis, stepAngle);\n }\n\n // Finite Rotation Mode\n const currentRotation: Quaternion = agent.rotation$.value.clone().normalize();\n const qRelative: Quaternion = currentRotation.clone().invert().multiply(targetNormalized);\n\n // Clamp w-component for relative rotation.\n const relativeClampedW: number = Math.min(Math.max(qRelative.w, -1), 1);\n let relativeAngle: number = 2 * Math.acos(relativeClampedW);\n\n // Correct relative angle for the shortest path.\n if (relativeAngle > Math.PI) relativeAngle -= 2 * Math.PI;\n\n const relativeSinHalfAngle: number = Math.sqrt(1 - relativeClampedW * relativeClampedW);\n\n // Extract the relative rotation axis.\n const relativeAxis: Vector3 = relativeSinHalfAngle > 1e-6 ? new Vector3(qRelative.x, qRelative.y, qRelative.z).divideScalar(relativeSinHalfAngle).normalize() : new Vector3(0, 1, 0);\n\n // Compute the rotation step with the shortest path correction.\n const stepAngle: number = Math.sign(relativeAngle) * Math.min(Math.abs(relativeAngle), rotationStep);\n\n return stepAngle !== 0 ? new Quaternion().setFromAxisAngle(relativeAxis, stepAngle) : undefined;\n}\n\nexport function isPointReached(target: TKinematicTarget | undefined, position: TReadonlyVector3, state: TKinematicState): boolean {\n if (isNotDefined(target)) return false;\n const { position: targetPosition, positionThreshold } = target;\n if (isNotDefined(targetPosition)) return false;\n\n const { linearSpeed, linearDirection } = state;\n\n // If the agent is already at the target, do not move\n if (linearSpeed === 0) return true;\n\n const vectorToTarget: Vector3 = targetPosition.clone().sub(position);\n const distanceSquared: TMeters = vectorToTarget.lengthSq() as TMeters;\n\n // If the agent is close enough to the target, stop\n if (distanceSquared < positionThreshold * positionThreshold) return true;\n\n const crossedTarget: boolean = vectorToTarget.dot(linearDirection) < 0;\n // If the agent has passed the target, stop\n if (crossedTarget) return true;\n\n return false;\n}\n\nexport function isRotationReached(target: TKinematicTarget | undefined, rotation: TReadonlyQuaternion, state: TKinematicState): boolean {\n if (isNotDefined(target)) return false;\n const { rotation: targetRotation, rotationThreshold } = target;\n\n if (isNotDefined(targetRotation)) return false;\n\n const { angularSpeed } = state;\n\n // If the speed is 0, do nothing\n if (angularSpeed === 0) return true;\n\n // Calculate the current angle to the target\n const angleToTarget: TRadians = rotation.angleTo(targetRotation) as TRadians;\n\n // If the agent is close enough to the target, stop\n if (angleToTarget < rotationThreshold) return true;\n\n return false;\n}\n\nexport function rotateInstantly(agent: TWriteable<TKinematicTransformAgent>, targetRotation: TReadonlyQuaternion): void {\n agent.setAngularSpeed(0);\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.rotation)) (agent.data.target as TWriteable<TKinematicTarget>).rotation = undefined;\n // eslint-disable-next-line functional/immutable-data\n (agent.data.state as TWriteable<TKinematicState>).angularDirection = targetRotation.clone().normalize();\n agent.rotation$.next(agent.data.state.angularDirection);\n return;\n}\n\nexport function moveInstantly(agent: TWriteable<TKinematicTransformAgent>, targetPosition: TReadonlyVector3): void {\n agent.setLinearSpeed(0);\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) (agent.data.target as TWriteable<TKinematicTarget>).position = undefined;\n agent.position$.next(targetPosition);\n return;\n}\n\nexport function isInstant(speed: TKinematicSpeed): speed is KinematicSpeed.Instant {\n return speed === KinematicSpeed.Instant;\n}\n"],"names":["getStepRotation","agent","rotationStep","infinite","isNotDefined","data","target","rotation","targetNormalized","Quaternion","clone","normalize","clamped","Math","min","max","w","angle","acos","PI","sinHalfAngle","sqrt","axis","Vector3","x","y","z","divideScalar","stepAngle","sign","setFromAxisAngle","qRelative","rotation$","value","invert","multiply","relativeClampedW","relativeAngle","relativeSinHalfAngle","relativeAxis","abs","isPointReached","position","state","targetPosition","positionThreshold","linearSpeed","linearDirection","vectorToTarget","sub","lengthSq","dot","isRotationReached","targetRotation","rotationThreshold","angularSpeed","angleTo","rotateInstantly","setAngularSpeed","isDefined","angularDirection","next","moveInstantly","setLinearSpeed","position$","isInstant","speed","KinematicSpeed","Instant"],"mappings":"4MASO,SAASA,gBAAgBC,MAAiCC,aAAwBC,UACvF,IAAKA,UAAYC,aAAaH,MAAMI,KAAKC,QAAQC,UAAW,OAG5D,MACMC,kBAD6BP,MAAMI,KAAKC,QAAQC,UAAY,IAAIE,YAClBC,QAAQC,YAGtDC,QAAkBC,KAAKC,IAAID,KAAKE,IAAIP,iBAAiBQ,MAAQ,GACnE,IAAIC,MAAgB,EAAIJ,KAAKK,KAAKN,SAG9BK,MAAQJ,KAAKM,KAAIF,OAAS,EAAIJ,KAAKM,IAEvC,MAAMC,aAAuBP,KAAKQ,KAAK,EAAIT,QAAUA,SAG/CU,KAAgBF,aAAe,KAAO,IAAIG,QAAQf,iBAAiBgB,EAAGhB,iBAAiBiB,EAAGjB,iBAAiBkB,GAAGC,aAAaP,cAAcT,YAAc,IAAIY,QAAQ,EAAG,EAAG,GAG/K,GAAIpB,SAAU,CAEZ,MAAMyB,WAAoBf,KAAKgB,KAAKZ,OAASf,aAC7C,OAAO,IAAIO,YAAaqB,iBAAiBR,KAAMM,WACjD,CAGA,MACMG,UAD8B9B,MAAM+B,UAAUC,MAAMvB,QAAQC,YACpBD,QAAQwB,SAASC,SAAS3B,kBAGlE4B,iBAA2BvB,KAAKC,IAAID,KAAKE,IAAIgB,UAAUf,MAAQ,GACrE,IAAIqB,cAAwB,EAAIxB,KAAKK,KAAKkB,kBAGtCC,cAAgBxB,KAAKM,KAAIkB,eAAiB,EAAIxB,KAAKM,IAEvD,MAAMmB,qBAA+BzB,KAAKQ,KAAK,EAAIe,iBAAmBA,kBAGhEG,aAAwBD,qBAAuB,KAAO,IAAIf,QAAQQ,UAAUP,EAAGO,UAAUN,EAAGM,UAAUL,GAAGC,aAAaW,sBAAsB3B,YAAc,IAAIY,QAAQ,EAAG,EAAG,GAG5KK,UAAoBf,KAAKgB,KAAKQ,eAAiBxB,KAAKC,IAAID,KAAK2B,IAAIH,eAAgBnC,cAEvF,OAAqB,IAAd0B,WAAkB,IAAInB,YAAaqB,iBAAiBS,aAAcX,gBAAa,CACxF,CAEO,SAASa,eAAenC,OAAsCoC,SAA4BC,OAC/F,GAAIvC,aAAaE,QAAS,OAAO,EACjC,MAAQoC,SAAUE,eAAAC,kBAAgBA,mBAAsBvC,OACxD,GAAIF,aAAawC,gBAAiB,OAAO,EAEzC,MAAME,YAAEA,YAAAC,gBAAaA,iBAAoBJ,MAGzC,GAAoB,IAAhBG,YAAmB,OAAO,EAE9B,MAAME,eAA0BJ,eAAelC,QAAQuC,IAAIP,UAI3D,OAHiCM,eAAeE,WAG1BL,kBAAoBA,sBAEXG,eAAeG,IAAIJ,iBAAmB,EAKvE,CAEO,SAASK,kBAAkB9C,OAAsCC,SAA+BoC,OACrG,GAAIvC,aAAaE,QAAS,OAAO,EACjC,MAAQC,SAAU8C,eAAAC,kBAAgBA,mBAAsBhD,OAExD,GAAIF,aAAaiD,gBAAiB,OAAO,EAEzC,MAAME,aAAEA,cAAiBZ,MAGzB,OAAqB,IAAjBY,cAG4BhD,SAASiD,QAAQH,gBAG7BC,iBAGtB,CAEO,SAASG,gBAAgBxD,MAA6CoD,gBAC3EpD,MAAMyD,gBAAgB,GAElBC,UAAU1D,MAAMI,KAAKC,QAAQC,YAAYN,MAAMI,KAAKC,OAAwCC,cAAW,GAE1GN,MAAMI,KAAKsC,MAAsCiB,iBAAmBP,eAAe3C,QAAQC,YAC5FV,MAAM+B,UAAU6B,KAAK5D,MAAMI,KAAKsC,MAAMiB,iBAExC,CAEO,SAASE,cAAc7D,MAA6C2C,gBACzE3C,MAAM8D,eAAe,GAEjBJ,UAAU1D,MAAMI,KAAKC,QAAQoC,YAAYzC,MAAMI,KAAKC,OAAwCoC,cAAW,GAC3GzC,MAAM+D,UAAUH,KAAKjB,eAEvB,CAEO,SAASqB,UAAUC,OACxB,OAAOA,QAAUC,eAAeC,OAClC"}
1
+ {"version":3,"file":"KinematicAgentUtils.js","sources":["../../../src/TransformDrive/Utils/KinematicAgentUtils.ts"],"sourcesContent":["import type { TKinematicState, TKinematicTarget } from '@hellpig/anarchy-engine/Kinematic';\nimport { KinematicSpeed } from '@hellpig/anarchy-engine/Kinematic';\nimport type { TMeters, TRadians } from '@hellpig/anarchy-engine/Math';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@hellpig/anarchy-engine/ThreeLib';\nimport type { TKinematicSpeed, TKinematicTransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport type { TWriteable } from '@hellpig/anarchy-shared/Utils';\nimport { isDefined, isNotDefined } from '@hellpig/anarchy-shared/Utils';\nimport { Quaternion, Vector3 } from 'three';\n\nexport function getStepRotation(agent: TKinematicTransformAgent, rotationStep: TRadians, infinite: boolean): Quaternion | undefined {\n if (!infinite && isNotDefined(agent.data.target?.rotation)) return undefined;\n\n // Retrieve the target rotation (for infinite mode, it's used as a descriptor).\n const targetRotation: Quaternion = agent.data.target?.rotation ?? new Quaternion();\n const targetNormalized: Quaternion = targetRotation.clone().normalize();\n\n // Clamp w-component to prevent floating-point errors.\n const clamped: number = Math.min(Math.max(targetNormalized.w, -1), 1);\n let angle: number = 2 * Math.acos(clamped);\n\n // Correct angle to take the shortest rotation path.\n if (angle > Math.PI) angle -= 2 * Math.PI;\n\n const sinHalfAngle: number = Math.sqrt(1 - clamped * clamped);\n\n // Extract rotation axis; use a default axis if sinHalfAngle is too small.\n const axis: Vector3 = sinHalfAngle > 1e-6 ? new Vector3(targetNormalized.x, targetNormalized.y, targetNormalized.z).divideScalar(sinHalfAngle).normalize() : new Vector3(0, 1, 0);\n\n // Infinite Rotation Mode\n if (infinite) {\n // Use the computed sign (after correction) to determine a rotation direction.\n const stepAngle: number = Math.sign(angle) * rotationStep;\n return new Quaternion().setFromAxisAngle(axis, stepAngle);\n }\n\n // Finite Rotation Mode\n const currentRotation: Quaternion = agent.rotation$.value.clone().normalize();\n const qRelative: Quaternion = currentRotation.clone().invert().multiply(targetNormalized);\n\n // Clamp w-component for relative rotation.\n const relativeClampedW: number = Math.min(Math.max(qRelative.w, -1), 1);\n let relativeAngle: number = 2 * Math.acos(relativeClampedW);\n\n // Correct relative angle for the shortest path.\n if (relativeAngle > Math.PI) relativeAngle -= 2 * Math.PI;\n\n const relativeSinHalfAngle: number = Math.sqrt(1 - relativeClampedW * relativeClampedW);\n\n // Extract the relative rotation axis.\n const relativeAxis: Vector3 = relativeSinHalfAngle > 1e-6 ? new Vector3(qRelative.x, qRelative.y, qRelative.z).divideScalar(relativeSinHalfAngle).normalize() : new Vector3(0, 1, 0);\n\n // Compute the rotation step with the shortest path correction.\n const stepAngle: number = Math.sign(relativeAngle) * Math.min(Math.abs(relativeAngle), rotationStep);\n\n return stepAngle !== 0 ? new Quaternion().setFromAxisAngle(relativeAxis, stepAngle) : undefined;\n}\n\nexport function isPointReached(target: TKinematicTarget | undefined, position: TReadonlyVector3, state: TKinematicState): boolean {\n if (isNotDefined(target)) return false;\n const { position: targetPosition, positionThreshold } = target;\n if (isNotDefined(targetPosition)) return false;\n\n const { linearSpeed, linearDirection } = state;\n\n // If the agent is already at the target, do not move\n if (linearSpeed === 0) return true;\n\n const vectorToTarget: Vector3 = targetPosition.clone().sub(position);\n const distanceSquared: TMeters = vectorToTarget.lengthSq() as TMeters;\n\n // If the agent is close enough to the target, stop\n if (distanceSquared < positionThreshold * positionThreshold) return true;\n\n const crossedTarget: boolean = vectorToTarget.dot(linearDirection) < 0;\n // If the agent has passed the target, stop\n if (crossedTarget) return true;\n\n return false;\n}\n\nexport function isRotationReached(target: TKinematicTarget | undefined, rotation: TReadonlyQuaternion, state: TKinematicState): boolean {\n if (isNotDefined(target)) return false;\n const { rotation: targetRotation, rotationThreshold } = target;\n\n if (isNotDefined(targetRotation)) return false;\n\n const { angularSpeed } = state;\n\n // If the speed is 0, do nothing\n if (angularSpeed === 0) return true;\n\n // Calculate the current angle to the target\n const angleToTarget: TRadians = rotation.angleTo(targetRotation) as TRadians;\n\n // If the agent is close enough to the target, stop\n if (angleToTarget < rotationThreshold) return true;\n\n return false;\n}\n\nexport function rotateInstantly(agent: TWriteable<TKinematicTransformAgent>, targetRotation: TReadonlyQuaternion): void {\n agent.setAngularSpeed(0);\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.rotation)) (agent.data.target as TWriteable<TKinematicTarget>).rotation = undefined;\n // eslint-disable-next-line functional/immutable-data\n (agent.data.state as TWriteable<TKinematicState>).angularDirection = targetRotation.clone().normalize();\n agent.rotation$.next(agent.data.state.angularDirection);\n return;\n}\n\nexport function moveInstantly(agent: TWriteable<TKinematicTransformAgent>, targetPosition: TReadonlyVector3): void {\n agent.setLinearSpeed(0);\n // eslint-disable-next-line functional/immutable-data\n if (isDefined(agent.data.target?.position)) (agent.data.target as TWriteable<TKinematicTarget>).position = undefined;\n agent.position$.next(targetPosition);\n return;\n}\n\nexport function isInstant(speed: TKinematicSpeed): speed is KinematicSpeed.Instant {\n return speed === KinematicSpeed.Instant;\n}\n"],"names":["getStepRotation","agent","rotationStep","infinite","isNotDefined","data","target","rotation","targetNormalized","Quaternion","clone","normalize","clamped","Math","min","max","w","angle","acos","PI","sinHalfAngle","sqrt","axis","Vector3","x","y","z","divideScalar","stepAngle","sign","setFromAxisAngle","qRelative","rotation$","value","invert","multiply","relativeClampedW","relativeAngle","relativeSinHalfAngle","relativeAxis","abs","isPointReached","position","state","targetPosition","positionThreshold","linearSpeed","linearDirection","vectorToTarget","sub","lengthSq","dot","isRotationReached","targetRotation","rotationThreshold","angularSpeed","angleTo","rotateInstantly","setAngularSpeed","isDefined","angularDirection","next","moveInstantly","setLinearSpeed","position$","isInstant","speed","KinematicSpeed","Instant"],"mappings":"4MASO,SAASA,gBAAgBC,MAAiCC,aAAwBC,UACvF,IAAKA,UAAYC,aAAaH,MAAMI,KAAKC,QAAQC,UAAW,OAG5D,MACMC,kBAD6BP,MAAMI,KAAKC,QAAQC,UAAY,IAAIE,YAClBC,QAAQC,YAGtDC,QAAkBC,KAAKC,IAAID,KAAKE,IAAIP,iBAAiBQ,MAAQ,GACnE,IAAIC,MAAgB,EAAIJ,KAAKK,KAAKN,SAG9BK,MAAQJ,KAAKM,KAAIF,OAAS,EAAIJ,KAAKM,IAEvC,MAAMC,aAAuBP,KAAKQ,KAAK,EAAIT,QAAUA,SAG/CU,KAAgBF,aAAe,KAAO,IAAIG,QAAQf,iBAAiBgB,EAAGhB,iBAAiBiB,EAAGjB,iBAAiBkB,GAAGC,aAAaP,cAAcT,YAAc,IAAIY,QAAQ,EAAG,EAAG,GAG/K,GAAIpB,SAAU,CAEZ,MAAMyB,WAAoBf,KAAKgB,KAAKZ,OAASf,aAC7C,OAAO,IAAIO,YAAaqB,iBAAiBR,KAAMM,WACjD,CAGA,MACMG,UAD8B9B,MAAM+B,UAAUC,MAAMvB,QAAQC,YACpBD,QAAQwB,SAASC,SAAS3B,kBAGlE4B,iBAA2BvB,KAAKC,IAAID,KAAKE,IAAIgB,UAAUf,MAAQ,GACrE,IAAIqB,cAAwB,EAAIxB,KAAKK,KAAKkB,kBAGtCC,cAAgBxB,KAAKM,KAAIkB,eAAiB,EAAIxB,KAAKM,IAEvD,MAAMmB,qBAA+BzB,KAAKQ,KAAK,EAAIe,iBAAmBA,kBAGhEG,aAAwBD,qBAAuB,KAAO,IAAIf,QAAQQ,UAAUP,EAAGO,UAAUN,EAAGM,UAAUL,GAAGC,aAAaW,sBAAsB3B,YAAc,IAAIY,QAAQ,EAAG,EAAG,GAG5KK,UAAoBf,KAAKgB,KAAKQ,eAAiBxB,KAAKC,IAAID,KAAK2B,IAAIH,eAAgBnC,cAEvF,OAAqB,IAAd0B,WAAkB,IAAInB,YAAaqB,iBAAiBS,aAAcX,gBAAa,CACxF,CAEO,SAASa,eAAenC,OAAsCoC,SAA4BC,OAC/F,GAAIvC,aAAaE,QAAS,OAAO,EACjC,MAAQoC,SAAUE,eAAAC,kBAAgBA,mBAAsBvC,OACxD,GAAIF,aAAawC,gBAAiB,OAAO,EAEzC,MAAME,YAAEA,YAAAC,gBAAaA,iBAAoBJ,MAGzC,GAAoB,IAAhBG,YAAmB,OAAO,EAE9B,MAAME,eAA0BJ,eAAelC,QAAQuC,IAAIP,UAI3D,OAHiCM,eAAeE,WAG1BL,kBAAoBA,sBAEXG,eAAeG,IAAIJ,iBAAmB,EAKvE,CAEO,SAASK,kBAAkB9C,OAAsCC,SAA+BoC,OACrG,GAAIvC,aAAaE,QAAS,OAAO,EACjC,MAAQC,SAAU8C,eAAAC,kBAAgBA,mBAAsBhD,OAExD,GAAIF,aAAaiD,gBAAiB,OAAO,EAEzC,MAAME,aAAEA,cAAiBZ,MAGzB,OAAqB,IAAjBY,cAG4BhD,SAASiD,QAAQH,gBAG7BC,iBAGtB,CAEO,SAASG,gBAAgBxD,MAA6CoD,gBAC3EpD,MAAMyD,gBAAgB,GAElBC,UAAU1D,MAAMI,KAAKC,QAAQC,YAAYN,MAAMI,KAAKC,OAAwCC,cAAW,GAE1GN,MAAMI,KAAKsC,MAAsCiB,iBAAmBP,eAAe3C,QAAQC,YAC5FV,MAAM+B,UAAU6B,KAAK5D,MAAMI,KAAKsC,MAAMiB,iBAExC,CAEO,SAASE,cAAc7D,MAA6C2C,gBACzE3C,MAAM8D,eAAe,GAEjBJ,UAAU1D,MAAMI,KAAKC,QAAQoC,YAAYzC,MAAMI,KAAKC,OAAwCoC,cAAW,GAC3GzC,MAAM+D,UAAUH,KAAKjB,eAEvB,CAEO,SAASqB,UAAUC,OACxB,OAAOA,QAAUC,eAAeC,OAClC"}
@@ -1,8 +1,8 @@
1
+ import { RigidBody } from '@dimforge/rapier3d';
1
2
  import { TMeters, TRadians } from '../../Math';
2
3
  import { TPhysicsBody, TPhysicsBodyParams, TPhysicsBodyService } from '../../Physics';
3
4
  import { TReadonlyQuaternion, TReadonlyVector3 } from '../../ThreeLib';
4
5
  import { TRigidBodyTransformData } from '../Models';
5
- import { RigidBody } from '@dimforge/rapier3d';
6
6
  export declare function getPhysicsBodyTransform(body: RigidBody | undefined, prevPosition: Float32Array, prevRotation: Float32Array, tmpPosition: Float32Array, tmpRotation: Float32Array, positionNoiseThreshold: TMeters, rotationNoiseThreshold: TRadians): TRigidBodyTransformData | undefined;
7
7
  export declare function createPhysicsBody(physicsBodyParams: TPhysicsBodyParams, physicsBodyService: TPhysicsBodyService): TPhysicsBody | undefined;
8
8
  export declare function applyLatestTransform(rigidBody: RigidBody | undefined, position: TReadonlyVector3, rotation: TReadonlyQuaternion): void;
@@ -1 +1 @@
1
- {"version":3,"file":"PhysicsTransformAgentUtils.js","sources":["../../../src/TransformDrive/Utils/PhysicsTransformAgentUtils.ts"],"sourcesContent":["import type { TMeters, TRadians } from '@Anarchy/Engine/Math';\nimport type { TPhysicsBody, TPhysicsBodyParams, TPhysicsBodyService } from '@Anarchy/Engine/Physics';\nimport { isPhysicsBodyParamsComplete } from '@Anarchy/Engine/Physics';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport type { TRigidBodyTransformData } from '@Anarchy/Engine/TransformDrive/Models';\nimport { isNotDefined } from '@Anarchy/Shared/Utils';\nimport type { RigidBody, Rotation, Vector } from '@dimforge/rapier3d';\n\nexport function getPhysicsBodyTransform(\n body: RigidBody | undefined,\n prevPosition: Float32Array,\n prevRotation: Float32Array,\n tmpPosition: Float32Array,\n tmpRotation: Float32Array,\n positionNoiseThreshold: TMeters,\n rotationNoiseThreshold: TRadians\n): TRigidBodyTransformData | undefined {\n if (isNotDefined(body)) return undefined;\n\n const translation: Vector = body.translation();\n // eslint-disable-next-line functional/immutable-data\n tmpPosition[0] = translation.x;\n // eslint-disable-next-line functional/immutable-data\n tmpPosition[1] = translation.y;\n // eslint-disable-next-line functional/immutable-data\n tmpPosition[2] = translation.z;\n\n const rotation: Rotation = body.rotation();\n // eslint-disable-next-line functional/immutable-data\n tmpRotation[0] = rotation.x;\n // eslint-disable-next-line functional/immutable-data\n tmpRotation[1] = rotation.y;\n // eslint-disable-next-line functional/immutable-data\n tmpRotation[2] = rotation.z;\n // eslint-disable-next-line functional/immutable-data\n tmpRotation[3] = rotation.w;\n\n const changedPosition: boolean =\n Math.abs(tmpPosition[0] - prevPosition[0]) > positionNoiseThreshold ||\n Math.abs(tmpPosition[1] - prevPosition[1]) > positionNoiseThreshold ||\n Math.abs(tmpPosition[2] - prevPosition[2]) > positionNoiseThreshold;\n\n const changedRotation: boolean =\n Math.abs(tmpRotation[0] - prevRotation[0]) > rotationNoiseThreshold ||\n Math.abs(tmpRotation[1] - prevRotation[1]) > rotationNoiseThreshold ||\n Math.abs(tmpRotation[2] - prevRotation[2]) > rotationNoiseThreshold ||\n Math.abs(tmpRotation[3] - prevRotation[3]) > rotationNoiseThreshold;\n\n if (!changedPosition && !changedRotation) return undefined;\n\n if (changedPosition) prevPosition.set(tmpPosition);\n if (changedRotation) prevRotation.set(tmpRotation);\n\n return {\n position: changedPosition ? new Float32Array(prevPosition) : undefined,\n rotation: changedRotation ? new Float32Array(prevRotation) : undefined\n };\n}\n\nexport function createPhysicsBody(physicsBodyParams: TPhysicsBodyParams, physicsBodyService: TPhysicsBodyService): TPhysicsBody | undefined {\n if (!isPhysicsBodyParamsComplete(physicsBodyParams)) return undefined;\n return physicsBodyService.create(physicsBodyParams);\n}\n\nexport function applyLatestTransform(rigidBody: RigidBody | undefined, position: TReadonlyVector3, rotation: TReadonlyQuaternion): void {\n if (isNotDefined(rigidBody)) return;\n rigidBody.setTranslation(position, false);\n rigidBody.setRotation(rotation, false);\n}\n"],"names":["getPhysicsBodyTransform","body","prevPosition","prevRotation","tmpPosition","tmpRotation","positionNoiseThreshold","rotationNoiseThreshold","isNotDefined","translation","x","y","z","rotation","w","changedPosition","Math","abs","changedRotation","set","position","Float32Array","createPhysicsBody","physicsBodyParams","physicsBodyService","isPhysicsBodyParamsComplete","create","applyLatestTransform","rigidBody","setTranslation","setRotation"],"mappings":"4JAQO,SAASA,wBACdC,KACAC,aACAC,aACAC,YACAC,YACAC,uBACAC,wBAEA,GAAIC,aAAaP,MAAO,OAExB,MAAMQ,YAAsBR,KAAKQ,cAEjCL,YAAY,GAAKK,YAAYC,EAE7BN,YAAY,GAAKK,YAAYE,EAE7BP,YAAY,GAAKK,YAAYG,EAE7B,MAAMC,SAAqBZ,KAAKY,WAEhCR,YAAY,GAAKQ,SAASH,EAE1BL,YAAY,GAAKQ,SAASF,EAE1BN,YAAY,GAAKQ,SAASD,EAE1BP,YAAY,GAAKQ,SAASC,EAE1B,MAAMC,gBACJC,KAAKC,IAAIb,YAAY,GAAKF,aAAa,IAAMI,wBAC7CU,KAAKC,IAAIb,YAAY,GAAKF,aAAa,IAAMI,wBAC7CU,KAAKC,IAAIb,YAAY,GAAKF,aAAa,IAAMI,uBAEzCY,gBACJF,KAAKC,IAAIZ,YAAY,GAAKF,aAAa,IAAMI,wBAC7CS,KAAKC,IAAIZ,YAAY,GAAKF,aAAa,IAAMI,wBAC7CS,KAAKC,IAAIZ,YAAY,GAAKF,aAAa,IAAMI,wBAC7CS,KAAKC,IAAIZ,YAAY,GAAKF,aAAa,IAAMI,uBAE/C,OAAKQ,iBAAoBG,iBAErBH,iBAAiBb,aAAaiB,IAAIf,aAClCc,iBAAiBf,aAAagB,IAAId,aAE/B,CACLe,SAAUL,gBAAkB,IAAIM,aAAanB,mBAAgB,EAC7DW,SAAUK,gBAAkB,IAAIG,aAAalB,mBAAgB,SAP/D,CASF,CAEO,SAASmB,kBAAkBC,kBAAuCC,oBACvE,GAAKC,4BAA4BF,mBACjC,OAAOC,mBAAmBE,OAAOH,kBACnC,CAEO,SAASI,qBAAqBC,UAAkCR,SAA4BP,UAC7FL,aAAaoB,aACjBA,UAAUC,eAAeT,UAAU,GACnCQ,UAAUE,YAAYjB,UAAU,GAClC"}
1
+ {"version":3,"file":"PhysicsTransformAgentUtils.js","sources":["../../../src/TransformDrive/Utils/PhysicsTransformAgentUtils.ts"],"sourcesContent":["import type { RigidBody, Rotation, Vector } from '@dimforge/rapier3d';\nimport type { TMeters, TRadians } from '@hellpig/anarchy-engine/Math';\nimport type { TPhysicsBody, TPhysicsBodyParams, TPhysicsBodyService } from '@hellpig/anarchy-engine/Physics';\nimport { isPhysicsBodyParamsComplete } from '@hellpig/anarchy-engine/Physics';\nimport type { TReadonlyQuaternion, TReadonlyVector3 } from '@hellpig/anarchy-engine/ThreeLib';\nimport type { TRigidBodyTransformData } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { isNotDefined } from '@hellpig/anarchy-shared/Utils';\n\nexport function getPhysicsBodyTransform(\n body: RigidBody | undefined,\n prevPosition: Float32Array,\n prevRotation: Float32Array,\n tmpPosition: Float32Array,\n tmpRotation: Float32Array,\n positionNoiseThreshold: TMeters,\n rotationNoiseThreshold: TRadians\n): TRigidBodyTransformData | undefined {\n if (isNotDefined(body)) return undefined;\n\n const translation: Vector = body.translation();\n // eslint-disable-next-line functional/immutable-data\n tmpPosition[0] = translation.x;\n // eslint-disable-next-line functional/immutable-data\n tmpPosition[1] = translation.y;\n // eslint-disable-next-line functional/immutable-data\n tmpPosition[2] = translation.z;\n\n const rotation: Rotation = body.rotation();\n // eslint-disable-next-line functional/immutable-data\n tmpRotation[0] = rotation.x;\n // eslint-disable-next-line functional/immutable-data\n tmpRotation[1] = rotation.y;\n // eslint-disable-next-line functional/immutable-data\n tmpRotation[2] = rotation.z;\n // eslint-disable-next-line functional/immutable-data\n tmpRotation[3] = rotation.w;\n\n const changedPosition: boolean =\n Math.abs(tmpPosition[0] - prevPosition[0]) > positionNoiseThreshold ||\n Math.abs(tmpPosition[1] - prevPosition[1]) > positionNoiseThreshold ||\n Math.abs(tmpPosition[2] - prevPosition[2]) > positionNoiseThreshold;\n\n const changedRotation: boolean =\n Math.abs(tmpRotation[0] - prevRotation[0]) > rotationNoiseThreshold ||\n Math.abs(tmpRotation[1] - prevRotation[1]) > rotationNoiseThreshold ||\n Math.abs(tmpRotation[2] - prevRotation[2]) > rotationNoiseThreshold ||\n Math.abs(tmpRotation[3] - prevRotation[3]) > rotationNoiseThreshold;\n\n if (!changedPosition && !changedRotation) return undefined;\n\n if (changedPosition) prevPosition.set(tmpPosition);\n if (changedRotation) prevRotation.set(tmpRotation);\n\n return {\n position: changedPosition ? new Float32Array(prevPosition) : undefined,\n rotation: changedRotation ? new Float32Array(prevRotation) : undefined\n };\n}\n\nexport function createPhysicsBody(physicsBodyParams: TPhysicsBodyParams, physicsBodyService: TPhysicsBodyService): TPhysicsBody | undefined {\n if (!isPhysicsBodyParamsComplete(physicsBodyParams)) return undefined;\n return physicsBodyService.create(physicsBodyParams);\n}\n\nexport function applyLatestTransform(rigidBody: RigidBody | undefined, position: TReadonlyVector3, rotation: TReadonlyQuaternion): void {\n if (isNotDefined(rigidBody)) return;\n rigidBody.setTranslation(position, false);\n rigidBody.setRotation(rotation, false);\n}\n"],"names":["getPhysicsBodyTransform","body","prevPosition","prevRotation","tmpPosition","tmpRotation","positionNoiseThreshold","rotationNoiseThreshold","isNotDefined","translation","x","y","z","rotation","w","changedPosition","Math","abs","changedRotation","set","position","Float32Array","createPhysicsBody","physicsBodyParams","physicsBodyService","isPhysicsBodyParamsComplete","create","applyLatestTransform","rigidBody","setTranslation","setRotation"],"mappings":"4JAQO,SAASA,wBACdC,KACAC,aACAC,aACAC,YACAC,YACAC,uBACAC,wBAEA,GAAIC,aAAaP,MAAO,OAExB,MAAMQ,YAAsBR,KAAKQ,cAEjCL,YAAY,GAAKK,YAAYC,EAE7BN,YAAY,GAAKK,YAAYE,EAE7BP,YAAY,GAAKK,YAAYG,EAE7B,MAAMC,SAAqBZ,KAAKY,WAEhCR,YAAY,GAAKQ,SAASH,EAE1BL,YAAY,GAAKQ,SAASF,EAE1BN,YAAY,GAAKQ,SAASD,EAE1BP,YAAY,GAAKQ,SAASC,EAE1B,MAAMC,gBACJC,KAAKC,IAAIb,YAAY,GAAKF,aAAa,IAAMI,wBAC7CU,KAAKC,IAAIb,YAAY,GAAKF,aAAa,IAAMI,wBAC7CU,KAAKC,IAAIb,YAAY,GAAKF,aAAa,IAAMI,uBAEzCY,gBACJF,KAAKC,IAAIZ,YAAY,GAAKF,aAAa,IAAMI,wBAC7CS,KAAKC,IAAIZ,YAAY,GAAKF,aAAa,IAAMI,wBAC7CS,KAAKC,IAAIZ,YAAY,GAAKF,aAAa,IAAMI,wBAC7CS,KAAKC,IAAIZ,YAAY,GAAKF,aAAa,IAAMI,uBAE/C,OAAKQ,iBAAoBG,iBAErBH,iBAAiBb,aAAaiB,IAAIf,aAClCc,iBAAiBf,aAAagB,IAAId,aAE/B,CACLe,SAAUL,gBAAkB,IAAIM,aAAanB,mBAAgB,EAC7DW,SAAUK,gBAAkB,IAAIG,aAAalB,mBAAgB,SAP/D,CASF,CAEO,SAASmB,kBAAkBC,kBAAuCC,oBACvE,GAAKC,4BAA4BF,mBACjC,OAAOC,mBAAmBE,OAAOH,kBACnC,CAEO,SAASI,qBAAqBC,UAAkCR,SAA4BP,UAC7FL,aAAaoB,aACjBA,UAAUC,eAAeT,UAAU,GACnCQ,UAAUE,YAAYjB,UAAU,GAClC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TransformDriveUtils.js","sources":["../../../src/TransformDrive/Utils/TransformDriveUtils.ts"],"sourcesContent":["import type { TReadonlyQuaternion, TReadonlyVector3 } from '@Anarchy/Engine/ThreeLib';\nimport type { TransformAgent } from '@Anarchy/Engine/TransformDrive/Constants';\nimport type { TAbstractTransformAgent } from '@Anarchy/Engine/TransformDrive/Models';\nimport { isEqualOrSimilarByXyzCoords } from '@Anarchy/Engine/Utils';\nimport { isDefined } from '@Anarchy/Shared/Utils';\nimport type { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { distinctUntilChanged, EMPTY, switchMap, tap } from 'rxjs';\n\nexport function getDynamicAgents<T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(agents: T): T {\n return Object.fromEntries(Object.entries(agents).map((v) => [v[0], v[1]])) as T;\n}\n\nexport function updateFromActiveAgent<T extends TReadonlyVector3 | TReadonlyQuaternion>(\n activeAgent$: BehaviorSubject<TAbstractTransformAgent>,\n agentProp: 'position$' | 'rotation$' | 'scale$',\n { threshold }: Readonly<{ threshold: number }>\n): Observable<T> {\n const prevValue: Float32Array = new Float32Array([0, 0, 0]);\n\n return activeAgent$.pipe(\n switchMap((agent: TAbstractTransformAgent): Subject<T> | Observable<never> => {\n return isDefined(agent) ? (agent[agentProp] as unknown as Subject<T>) : EMPTY;\n }),\n distinctUntilChanged((_prev: T, curr: T): boolean => isEqualOrSimilarByXyzCoords(prevValue[0], prevValue[1], prevValue[2], curr.x, curr.y, curr.z, threshold)),\n tap((value: T): void => {\n // eslint-disable-next-line functional/immutable-data\n prevValue[0] = value.x;\n // eslint-disable-next-line functional/immutable-data\n prevValue[1] = value.y;\n // eslint-disable-next-line functional/immutable-data\n prevValue[2] = value.z;\n })\n );\n}\n"],"names":["getDynamicAgents","agents","Object","fromEntries","entries","map","v","updateFromActiveAgent","activeAgent$","agentProp","threshold","prevValue","Float32Array","pipe","switchMap","agent","isDefined","EMPTY","distinctUntilChanged","_prev","curr","isEqualOrSimilarByXyzCoords","x","y","z","tap","value"],"mappings":"2fAQO,SAASA,iBAAqFC,QACnG,OAAOC,OAAOC,YAAYD,OAAOE,QAAQH,QAAQI,IAAKC,GAAM,CAACA,EAAE,GAAIA,EAAE,KACvE,CAEO,SAASC,sBACdC,aACAC,WACAC,UAAEA,YAEF,MAAMC,UAA0B,IAAIC,aAAa,CAAC,EAAG,EAAG,IAExD,OAAOJ,aAAaK,KAClBC,UAAWC,OACFC,UAAUD,OAAUA,MAAMN,WAAuCQ,OAE1EC,qBAAqB,CAACC,MAAUC,OAAqBC,4BAA4BV,UAAU,GAAIA,UAAU,GAAIA,UAAU,GAAIS,KAAKE,EAAGF,KAAKG,EAAGH,KAAKI,EAAGd,YACnJe,IAAKC,QAEHf,UAAU,GAAKe,MAAMJ,EAErBX,UAAU,GAAKe,MAAMH,EAErBZ,UAAU,GAAKe,MAAMF,IAG3B"}
1
+ {"version":3,"file":"TransformDriveUtils.js","sources":["../../../src/TransformDrive/Utils/TransformDriveUtils.ts"],"sourcesContent":["import type { TReadonlyQuaternion, TReadonlyVector3 } from '@hellpig/anarchy-engine/ThreeLib';\nimport type { TransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Constants';\nimport type { TAbstractTransformAgent } from '@hellpig/anarchy-engine/TransformDrive/Models';\nimport { isEqualOrSimilarByXyzCoords } from '@hellpig/anarchy-engine/Utils';\nimport { isDefined } from '@hellpig/anarchy-shared/Utils';\nimport type { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { distinctUntilChanged, EMPTY, switchMap, tap } from 'rxjs';\n\nexport function getDynamicAgents<T extends Partial<Record<TransformAgent, TAbstractTransformAgent>>>(agents: T): T {\n return Object.fromEntries(Object.entries(agents).map((v) => [v[0], v[1]])) as T;\n}\n\nexport function updateFromActiveAgent<T extends TReadonlyVector3 | TReadonlyQuaternion>(\n activeAgent$: BehaviorSubject<TAbstractTransformAgent>,\n agentProp: 'position$' | 'rotation$' | 'scale$',\n { threshold }: Readonly<{ threshold: number }>\n): Observable<T> {\n const prevValue: Float32Array = new Float32Array([0, 0, 0]);\n\n return activeAgent$.pipe(\n switchMap((agent: TAbstractTransformAgent): Subject<T> | Observable<never> => {\n return isDefined(agent) ? (agent[agentProp] as unknown as Subject<T>) : EMPTY;\n }),\n distinctUntilChanged((_prev: T, curr: T): boolean => isEqualOrSimilarByXyzCoords(prevValue[0], prevValue[1], prevValue[2], curr.x, curr.y, curr.z, threshold)),\n tap((value: T): void => {\n // eslint-disable-next-line functional/immutable-data\n prevValue[0] = value.x;\n // eslint-disable-next-line functional/immutable-data\n prevValue[1] = value.y;\n // eslint-disable-next-line functional/immutable-data\n prevValue[2] = value.z;\n })\n );\n}\n"],"names":["getDynamicAgents","agents","Object","fromEntries","entries","map","v","updateFromActiveAgent","activeAgent$","agentProp","threshold","prevValue","Float32Array","pipe","switchMap","agent","isDefined","EMPTY","distinctUntilChanged","_prev","curr","isEqualOrSimilarByXyzCoords","x","y","z","tap","value"],"mappings":"2fAQO,SAASA,iBAAqFC,QACnG,OAAOC,OAAOC,YAAYD,OAAOE,QAAQH,QAAQI,IAAKC,GAAM,CAACA,EAAE,GAAIA,EAAE,KACvE,CAEO,SAASC,sBACdC,aACAC,WACAC,UAAEA,YAEF,MAAMC,UAA0B,IAAIC,aAAa,CAAC,EAAG,EAAG,IAExD,OAAOJ,aAAaK,KAClBC,UAAWC,OACFC,UAAUD,OAAUA,MAAMN,WAAuCQ,OAE1EC,qBAAqB,CAACC,MAAUC,OAAqBC,4BAA4BV,UAAU,GAAIA,UAAU,GAAIA,UAAU,GAAIS,KAAKE,EAAGF,KAAKG,EAAGH,KAAKI,EAAGd,YACnJe,IAAKC,QAEHf,UAAU,GAAKe,MAAMJ,EAErBX,UAAU,GAAKe,MAAMH,EAErBZ,UAAU,GAAKe,MAAMF,IAG3B"}