@hology/core 0.0.211 → 0.0.213

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 (207) hide show
  1. package/dist/effects/sequence/index.d.ts +1 -0
  2. package/dist/effects/sequence/index.js +1 -1
  3. package/dist/effects/sequence/sequence-action.d.ts +5 -0
  4. package/dist/effects/sequence/sequence-actor.d.ts +7 -0
  5. package/dist/effects/sequence/sequence-actor.js +1 -1
  6. package/dist/effects/sequence/sequence-animation-retiming.js +1 -1
  7. package/dist/effects/sequence/sequence-data.d.ts +9 -0
  8. package/dist/effects/sequence/sequence-data.js +1 -1
  9. package/dist/effects/sequence/sequence-player.d.ts +12 -1
  10. package/dist/effects/sequence/sequence-player.js +1 -1
  11. package/dist/effects/sequence/sequence-transform.d.ts +10 -0
  12. package/dist/effects/sequence/sequence-transform.js +4 -0
  13. package/dist/effects/sequence/sequence-value-lane.d.ts +2 -0
  14. package/dist/effects/sequence/sequence-value-lane.js +1 -1
  15. package/dist/effects/vfx/initializsers.d.ts +8 -1
  16. package/dist/effects/vfx/initializsers.js +1 -1
  17. package/dist/effects/vfx/vfx-actor.d.ts +5 -0
  18. package/dist/effects/vfx/vfx-actor.js +1 -1
  19. package/dist/effects/vfx/vfx-asset.d.ts +2 -1
  20. package/dist/effects/vfx/vfx-asset.js +1 -1
  21. package/dist/effects/vfx/vfx-collision-behaviour.js +1 -1
  22. package/dist/effects/vfx/vfx-defs.d.ts +10 -1
  23. package/dist/effects/vfx/vfx-defs.js +1 -1
  24. package/dist/effects/vfx/vfx-materializer.js +1 -1
  25. package/dist/effects/vfx/vfx-renderers.d.ts +2 -0
  26. package/dist/effects/vfx/vfx-renderers.js +1 -1
  27. package/dist/gameplay/actors/actor.d.ts +21 -1
  28. package/dist/gameplay/actors/actor.js +1 -1
  29. package/dist/gameplay/actors/builtin/components/character/character-animation.d.ts +3 -0
  30. package/dist/gameplay/actors/builtin/components/character/character-animation.js +1 -1
  31. package/dist/gameplay/actors/builtin/components/character/character-movement-like.d.ts +25 -0
  32. package/dist/gameplay/actors/builtin/components/character/character-movement-like.js +4 -0
  33. package/dist/gameplay/actors/builtin/components/character/character-movement-policy.d.ts +26 -0
  34. package/dist/gameplay/actors/builtin/components/character/character-movement-policy.js +4 -0
  35. package/dist/gameplay/actors/builtin/components/character/character-movement.d.ts +158 -55
  36. package/dist/gameplay/actors/builtin/components/character/character-movement.js +1 -1
  37. package/dist/gameplay/actors/builtin/components/character/net-character-movement-protocol.d.ts +128 -0
  38. package/dist/gameplay/actors/builtin/components/character/net-character-movement-protocol.js +4 -0
  39. package/dist/gameplay/actors/builtin/components/character/old-character-movement.d.ts +100 -0
  40. package/dist/gameplay/actors/builtin/components/character/old-character-movement.js +4 -0
  41. package/dist/gameplay/actors/builtin/components/index.d.ts +2 -0
  42. package/dist/gameplay/actors/builtin/components/index.js +1 -1
  43. package/dist/gameplay/actors/builtin/components/mesh-component.d.ts +1 -0
  44. package/dist/gameplay/actors/builtin/components/mesh-component.js +1 -1
  45. package/dist/gameplay/actors/builtin/components/tween-component.js +1 -1
  46. package/dist/gameplay/actors/builtin/navmesh-actor.d.ts +2 -0
  47. package/dist/gameplay/actors/builtin/navmesh-actor.js +1 -1
  48. package/dist/gameplay/actors/builtin/trigger-volume.d.ts +3 -3
  49. package/dist/gameplay/actors/builtin/trigger-volume.js +1 -1
  50. package/dist/gameplay/actors/camera/camera-component.d.ts +1 -3
  51. package/dist/gameplay/actors/camera/camera-component.js +1 -1
  52. package/dist/gameplay/actors/camera/third-person-camera-component.d.ts +3 -0
  53. package/dist/gameplay/actors/camera/third-person-camera-component.js +1 -1
  54. package/dist/gameplay/actors/component.d.ts +3 -0
  55. package/dist/gameplay/actors/component.js +1 -1
  56. package/dist/gameplay/actors/controller/actor-controller.d.ts +16 -0
  57. package/dist/gameplay/actors/controller/actor-controller.js +4 -0
  58. package/dist/gameplay/actors/factory.d.ts +3 -0
  59. package/dist/gameplay/actors/factory.js +1 -1
  60. package/dist/gameplay/actors/index.d.ts +4 -0
  61. package/dist/gameplay/actors/index.js +1 -1
  62. package/dist/gameplay/actors/internal/component-init.js +1 -1
  63. package/dist/gameplay/actors/type-registry.d.ts +10 -0
  64. package/dist/gameplay/actors/type-registry.js +4 -0
  65. package/dist/gameplay/ai/behavior-tree/move.d.ts +2 -2
  66. package/dist/gameplay/animation/retarget.d.ts +50 -0
  67. package/dist/gameplay/animation/retarget.js +4 -0
  68. package/dist/gameplay/animation/root-motion.js +1 -1
  69. package/dist/gameplay/event-graph/actor-transform-properties.d.ts +6 -0
  70. package/dist/gameplay/event-graph/actor-transform-properties.js +4 -0
  71. package/dist/gameplay/event-graph/asset-actor-types.d.ts +3 -0
  72. package/dist/gameplay/event-graph/asset-actor-types.js +4 -0
  73. package/dist/gameplay/event-graph/asset-references.d.ts +12 -0
  74. package/dist/gameplay/event-graph/asset-references.js +4 -0
  75. package/dist/gameplay/event-graph/compiler.d.ts +107 -0
  76. package/dist/gameplay/event-graph/compiler.js +4 -0
  77. package/dist/gameplay/event-graph/decorators.d.ts +74 -0
  78. package/dist/gameplay/event-graph/decorators.js +4 -0
  79. package/dist/gameplay/event-graph/document-compiler.d.ts +107 -0
  80. package/dist/gameplay/event-graph/document-compiler.js +4 -0
  81. package/dist/gameplay/event-graph/event-graph-demo.d.ts +2 -0
  82. package/dist/gameplay/event-graph/event-graph-demo.js +4 -0
  83. package/dist/gameplay/event-graph/graph.d.ts +106 -0
  84. package/dist/gameplay/event-graph/graph.js +4 -0
  85. package/dist/gameplay/event-graph/index.d.ts +13 -0
  86. package/dist/gameplay/event-graph/index.js +4 -0
  87. package/dist/gameplay/event-graph/model.d.ts +71 -0
  88. package/dist/gameplay/event-graph/model.js +4 -0
  89. package/dist/gameplay/event-graph/nodes/execution-nodes.d.ts +115 -0
  90. package/dist/gameplay/event-graph/nodes/execution-nodes.js +4 -0
  91. package/dist/gameplay/event-graph/nodes/gameplay-nodes.d.ts +208 -0
  92. package/dist/gameplay/event-graph/nodes/gameplay-nodes.js +4 -0
  93. package/dist/gameplay/event-graph/nodes/index.d.ts +4 -0
  94. package/dist/gameplay/event-graph/nodes/index.js +4 -0
  95. package/dist/gameplay/event-graph/nodes/value-nodes.d.ts +53 -0
  96. package/dist/gameplay/event-graph/nodes/value-nodes.js +4 -0
  97. package/dist/gameplay/event-graph/registry.d.ts +33 -0
  98. package/dist/gameplay/event-graph/registry.js +4 -0
  99. package/dist/gameplay/event-graph/runtime-assets.d.ts +21 -0
  100. package/dist/gameplay/event-graph/runtime-assets.js +4 -0
  101. package/dist/gameplay/event-graph/runtime.d.ts +160 -0
  102. package/dist/gameplay/event-graph/runtime.js +4 -0
  103. package/dist/gameplay/event-graph/type-inference.d.ts +41 -0
  104. package/dist/gameplay/event-graph/type-inference.js +4 -0
  105. package/dist/gameplay/event-graph/types.d.ts +77 -0
  106. package/dist/gameplay/event-graph/types.js +4 -0
  107. package/dist/gameplay/index.d.ts +17 -2
  108. package/dist/gameplay/index.js +1 -1
  109. package/dist/gameplay/initiate.d.ts +4 -0
  110. package/dist/gameplay/initiate.js +1 -1
  111. package/dist/gameplay/input/input.d.ts +22 -17
  112. package/dist/gameplay/input/input.js +1 -1
  113. package/dist/gameplay/net/browser/index.d.ts +147 -0
  114. package/dist/gameplay/net/browser/index.js +4 -0
  115. package/dist/gameplay/net/index.d.ts +7 -0
  116. package/dist/gameplay/net/index.js +4 -0
  117. package/dist/gameplay/net/net-connection.d.ts +25 -0
  118. package/dist/gameplay/net/net-connection.js +4 -0
  119. package/dist/gameplay/net/net-session.d.ts +70 -0
  120. package/dist/gameplay/net/net-session.js +4 -0
  121. package/dist/gameplay/net/service/net-actor-role.d.ts +12 -0
  122. package/dist/gameplay/net/service/net-actor-role.js +4 -0
  123. package/dist/gameplay/net/service/net-decorator.d.ts +29 -0
  124. package/dist/gameplay/net/service/net-decorator.js +4 -0
  125. package/dist/gameplay/net/service/net-serializer.d.ts +15 -0
  126. package/dist/gameplay/net/service/net-serializer.js +4 -0
  127. package/dist/gameplay/net/service/net-service.d.ts +171 -0
  128. package/dist/gameplay/net/service/net-service.js +4 -0
  129. package/dist/gameplay/net/service/net-utils.d.ts +8 -0
  130. package/dist/gameplay/net/service/net-utils.js +4 -0
  131. package/dist/gameplay/net/service/replication.d.ts +31 -0
  132. package/dist/gameplay/net/service/replication.js +4 -0
  133. package/dist/gameplay/net/service/rpc-decorator.d.ts +21 -0
  134. package/dist/gameplay/net/service/rpc-decorator.js +4 -0
  135. package/dist/gameplay/net/service/rpc.d.ts +35 -0
  136. package/dist/gameplay/net/service/rpc.js +4 -0
  137. package/dist/gameplay/services/asset-loader.d.ts +10 -2
  138. package/dist/gameplay/services/asset-loader.js +1 -1
  139. package/dist/gameplay/services/physics/physics-system.d.ts +16 -1
  140. package/dist/gameplay/services/physics/physics-system.js +1 -1
  141. package/dist/gameplay/services/world.d.ts +25 -2
  142. package/dist/gameplay/services/world.js +1 -1
  143. package/dist/rendering/color-pass.js +1 -1
  144. package/dist/rendering.d.ts +2 -0
  145. package/dist/rendering.js +1 -1
  146. package/dist/scene/asset-resource-loader.d.ts +7 -1
  147. package/dist/scene/asset-resource-loader.js +1 -1
  148. package/dist/scene/batched-mesh-2.d.ts +9 -0
  149. package/dist/scene/batched-mesh-2.js +1 -1
  150. package/dist/scene/bootstrap.d.ts +2 -0
  151. package/dist/scene/bootstrap.js +1 -1
  152. package/dist/scene/custom-param-deserialize.js +1 -1
  153. package/dist/scene/custom-param-runtime-types.js +1 -1
  154. package/dist/scene/materializer.d.ts +29 -0
  155. package/dist/scene/materializer.js +1 -1
  156. package/dist/scene/model.d.ts +114 -2
  157. package/dist/scene/model.js +1 -1
  158. package/dist/scene/objects/prefab.js +1 -1
  159. package/dist/scene/storage/storage.d.ts +1 -1
  160. package/dist/scene/storage/storage.js +1 -1
  161. package/dist/shader/builtin/standard-shader.js +1 -1
  162. package/dist/shader/builtin/toon-shader.js +1 -1
  163. package/dist/shader/builtin/unlit-shader.js +1 -1
  164. package/dist/shader/color-layer.js +1 -1
  165. package/dist/shader/graph/compiler.d.ts +3 -0
  166. package/dist/shader/graph/compiler.js +1 -1
  167. package/dist/shader/graph/model.d.ts +1 -1
  168. package/dist/shader/graph/registry.js +1 -1
  169. package/dist/shader/parameter.d.ts +1 -1
  170. package/dist/shader/parameter.js +1 -1
  171. package/dist/shader-nodes/depth.js +1 -1
  172. package/dist/shader-nodes/scene-sample.js +1 -1
  173. package/dist/test/animation-retarget.test.d.ts +2 -0
  174. package/dist/test/animation-retarget.test.js +4 -0
  175. package/dist/test/batched-mesh-2.test.d.ts +2 -0
  176. package/dist/test/batched-mesh-2.test.js +4 -0
  177. package/dist/test/browser-net-session.test.d.ts +2 -0
  178. package/dist/test/browser-net-session.test.js +4 -0
  179. package/dist/test/event-graph-generated-code.test.d.ts +2 -0
  180. package/dist/test/event-graph-generated-code.test.js +4 -0
  181. package/dist/test/event-graph-types.test.d.ts +2 -0
  182. package/dist/test/event-graph-types.test.js +4 -0
  183. package/dist/test/event-graph.test.d.ts +2 -0
  184. package/dist/test/event-graph.test.js +4 -0
  185. package/dist/test/first-person-camera-component.test.js +1 -1
  186. package/dist/test/input.test.d.ts +2 -0
  187. package/dist/test/input.test.js +4 -0
  188. package/dist/test/net-character-movement.test.d.ts +2 -0
  189. package/dist/test/net-character-movement.test.js +4 -0
  190. package/dist/test/net-property-snapshot.test.d.ts +2 -0
  191. package/dist/test/net-property-snapshot.test.js +4 -0
  192. package/dist/test/prefab-instance-params.test.js +1 -1
  193. package/dist/test/sequence-animation-retiming.test.js +1 -1
  194. package/dist/test/sequence-camera-control.test.js +1 -1
  195. package/dist/test/sequence-scene-binding.test.d.ts +2 -0
  196. package/dist/test/sequence-scene-binding.test.js +4 -0
  197. package/dist/test/sequence-transform.test.d.ts +2 -0
  198. package/dist/test/sequence-transform.test.js +4 -0
  199. package/dist/test/shader-graph.test.js +1 -1
  200. package/dist/test/vfx-random-color-initializer.test.d.ts +2 -0
  201. package/dist/test/vfx-random-color-initializer.test.js +4 -0
  202. package/dist/test/world-prefab-spawn.test.d.ts +2 -0
  203. package/dist/test/world-prefab-spawn.test.js +4 -0
  204. package/dist/utils/three/placeholder-texture.d.ts +3 -0
  205. package/dist/utils/three/placeholder-texture.js +4 -0
  206. package/package.json +18 -2
  207. package/tsconfig.tsbuildinfo +1 -1
@@ -7,7 +7,7 @@ import { AbstractType, Type } from '../../../utils/type.js';
7
7
  import { BaseActor } from '../../actors/actor.js';
8
8
  import { ViewController } from '../render.js';
9
9
  import { AbstractPhysicsSystem, ActorPhysicsOptions } from './abstract-physics-system.js';
10
- export { Component, ActorComponent, type ComponentOptions, attach, Attach } from '../../actors/component.js';
10
+ export { ActorComponent, attach, Attach, Component, type ComponentOptions } from '../../actors/component.js';
11
11
  /**
12
12
  * Pairwise filtering using bit masks.
13
13
  *
@@ -237,6 +237,8 @@ export declare class PhysicsSystem extends AbstractPhysicsSystem {
237
237
  * @returns The corrected movement vector accounting for collisions
238
238
  */
239
239
  getActorComputedMovement(actor: BaseActor, cc: KinematicCharacterController, desiredTranslation: Vector3, collisionGroup?: number): Vector3;
240
+ setActorCapsuleCollider(actor: BaseActor, length: number, radius: number, offsetY: number): boolean;
241
+ hasActorCapsuleIntersection(actor: BaseActor, position: Vector3, length: number, radius: number, offsetY: number, collisionFilter?: InteractionGroups): boolean;
240
242
  /**
241
243
  * Creates a collider from a given collision shape.
242
244
  * This method adds a collision shape to the physics world as a collider,
@@ -517,6 +519,18 @@ export declare class PhysicsSystem extends AbstractPhysicsSystem {
517
519
  * @returns Observable boolean indicating contact state
518
520
  */
519
521
  onHasContactChanged(self: BaseActor): Observable<boolean>;
522
+ /**
523
+ * Gets an observable for when an actor begins overlapping any other actor.
524
+ * @param self - The actor to observe overlaps for
525
+ * @returns Observable of overlapping actors
526
+ */
527
+ onBeginOverlap<T extends BaseActor>(self: T): Observable<BaseActor>;
528
+ /**
529
+ * Gets an observable for when an actor ends overlapping any other actor.
530
+ * @param self - The actor to observe overlaps for
531
+ * @returns Observable of overlapping actors
532
+ */
533
+ onEndOverlap<T extends BaseActor>(self: T): Observable<BaseActor>;
520
534
  /**
521
535
  * Gets an observable for when an actor begins overlapping with actors of a specific type.
522
536
  * @param self - The actor to observe overlaps for
@@ -564,6 +578,7 @@ export declare class PhysicsSystem extends AbstractPhysicsSystem {
564
578
  * @param actor - The actor to update
565
579
  */
566
580
  updateActorTransform(actor: BaseActor): void;
581
+ flushModifiedBodyPositionsToColliders(): void;
567
582
  /**
568
583
  * Sets up the physics world with default gravity.
569
584
  * @private
@@ -1,4 +1,4 @@
1
- import{__decorate as t,__metadata as e}from"tslib";import*as i from"@dimforge/rapier3d-simd-compat";import{QueryFilterFlags as s}from"@dimforge/rapier3d-simd-compat";import{BehaviorSubject as o,distinctUntilChanged as n,filter as r,map as a,Subject as l,takeUntil as c}from"rxjs";import*as d from"three";import{ArrowHelper as h,BufferAttribute as u,BufferGeometry as y,Group as p,LineSegments as g,Matrix4 as m,Object3D as f,Quaternion as w,Raycaster as x,Scene as B,Vector3 as b}from"three";import{Service as v}from"typedi";import{AssetMeshInstance as C}from"../../../scene/asset-resource-loader.js";import{BoxCollisionShape as S,CapsuleCollisionShape as A,ConeCollisionShape as R,ConvexPolyhedronCollisionShape as D,CylinderCollisionShape as z,PhysicalShapeMesh as T,PlaneCollisionShape as E,SphereCollisionShape as M,toInstancedCollisionShape as P,TrimeshCollisionShape as _}from"../../../index.js";import{LandscapeGroup as F}from"../../../scene/landscape/landscape.js";import{ViewController as I}from"../render.js";import{World as V}from"../world.js";import*as k from"three/examples/jsm/utils/BufferGeometryUtils.js";import{calculateEffectiveScale as j}from"../../../utils/three/traverse.js";import{AbstractPhysicsSystem as N}from"./abstract-physics-system.js";import{ActorComponent as W,Component as L}from"../../../gameplay/actors/component.js";import{inject as O}from"../../../gameplay/inject.js";export{Component,ActorComponent,attach,Attach}from"../../actors/component.js";export class RayTestResult{constructor(){this.hasHit=!1,this.hitPoint=new b,this.hitNormal=new b}}export class ShapeCastResult{constructor(){this.hasHit=!1,this.hitPoint=new b,this.normal=new b}reset(){this.actor=void 0,this.hasHit=!1,this.distance=0,this.hitPoint.set(0,0,0),this.normal.set(0,0,0)}}ShapeCastResult.shared=new ShapeCastResult;export var PhysicsBodyType;!function(t){t[t.dynamic=1]="dynamic",t[t.static=2]="static",t[t.kinematic=4]="kinematic",t[t.kinematicVelocityBased=8]="kinematicVelocityBased"}(PhysicsBodyType||(PhysicsBodyType={}));const G=new b,K=new b,U=new w,q=new w,H=(new w,[]);let Q=class extends N{set showDebug(t){this.shouldRenderDebug=t,this.debugMesh&&(this.debugMesh.visible=t)}get showDebug(){return this.shouldRenderDebug}constructor(){super(),this.staticMeshes=new Map,this.staticBodies=new Map,this.actorBodies=new Map,this.bodyActors=new Map,this.colliders=new Map,this.collisionEvents=new l,this.beforeStep=new l,this.afterStep=new l,this.shouldRenderDebug=!1,this.viewController=O(I),this.shapeCacheBox=new Map,this.shapeCacheBall=new Map,this._raycaster=new x,this._reusableResult=new RayTestResult,this._raytestDiff=new b,this._raytestDirection=new b,this.controlledActors=new Set,this._isStopped=!1,this.ready=this.setup()}getBallShape(t){let e=this.shapeCacheBall.get(t);return null==e&&(e=new this.rapier.Ball(t),this.shapeCacheBall.set(t,e)),e}getBoxShape(t,e,i){const s=t+1e6*e+1e12*i;let o=this.shapeCacheBox.get(s);return null==o&&(o=new this.rapier.Cuboid(t,e,i),this.shapeCacheBox.set(s,o)),o}hasBoxIntersection(t){const e=t.getCenter(G),i=t.getSize(K),s=this.getBoxShape(i.x/2,i.y/2,i.z/2);return null!=this.world.intersectionWithShape(e,U,s)}hasSphereIntersection(t){const e=this.getBallShape(t.radius);return null!=this.world.intersectionWithShape(t.center,U,e)}findActorsInRadius(t,e,i){const s=this.getBallShape(e),o=[];for(const[e,n]of this.bodyActors)if(n instanceof i||null==i)for(let i=0,r=e.numColliders();i<r;i++){e.collider(i).intersectsShape(s,t,U)&&o.push(n)}return o}createDebugMesh(){return new g(new y,new d.LineBasicMaterial({color:255}))}async start(){return await this.ready,this.handleTick(),this.handleCollisionEvents(),this.ready}handleCollisionEvents(){this.collisionSub=this.collisionEvents.subscribe(t=>{const e=this.colliders.get(t.handle1);if(null==e)return;const i=this.world.getCollider(t.handle2);if(null==i||null==i.parent())return;const s=this.bodyActors.get(i.parent());null!=s&&(t.started?e.onBeginOverlapActor.next({actor:s}):e.onEndOverlapActor.next({actor:s}))})}renderDebug(){if(null==this.scene)return;null==this.debugMesh&&(this.debugMesh=this.createDebugMesh(),this.debugMesh.visible=this.shouldRenderDebug,this.debugMesh.raycast=function(){},this.scene?.add(this.debugMesh));const t=this.world.debugRender().vertices,e=this.debugMesh.geometry,i=e.getAttribute("position");null==i||(i.array.length,t.length);{const i=new u(t,3);i.setUsage(d.DynamicDrawUsage),e.setAttribute("position",i)}e.setDrawRange(0,t.length/3)}async setup(){if(null!=this.rapier)throw new Error("Rapier is already estup");this.rapier=await lt(),this.eventQueue=new this.rapier.EventQueue(!0),this.setupWorld()}handleTick(){this.fixedupdateSub=this.viewController.onUpdate().subscribe(t=>{this._isStopped||(t=Math.min(.1,t),this.beforeStep.next(t),this.updatePhysics(t),this.showDebug&&this.renderDebug(),this.world.bodies.forEach(t=>{if(t.isFixed())return;const e=this.staticMeshes.get(t)??this.bodyActors.get(t)?.object;null!=e&&e.parent instanceof B&&(ht(e.position,t.translation()),(t.isDynamic()||t.isKinematic()&&!this.controlledActors.has(this.bodyActors.get(t)?.id))&&ut(e.quaternion,t.rotation()),e.matrixWorldNeedsUpdate=!0)}),this.afterStep.next(t))})}_updateWorld(){this.world.timestep=0,this.world.step()}updatePhysics(t){this._isStopped||(this.world.timestep=t,this.world.step(this.eventQueue),this.eventQueue.drainCollisionEvents((t,e,i)=>{this.collisionEvents.next({handle1:t,handle2:e,started:i}),this.collisionEvents.next({handle1:e,handle2:t,started:i})}))}rayTestFromCamera(t,e,i){this._raycaster.setFromCamera(ot,this.viewController.getCamera());const s=this._raycaster.ray.origin,o=this._raycaster.ray.direction.multiplyScalar(t).add(s);return this.rayTest(s,o,e,i)}rayTest(t,e,i,s){null==i&&(i=this._reusableResult);const o=this._raytestDiff,n=this._raytestDirection;if(o.subVectors(e,t),n.copy(o).normalize(),0===n.length())return console.warn("Ray test called with to and from being equal"),i;null==wt&&(wt=new this.rapier.Ray(new this.rapier.Vector3(0,0,0),new this.rapier.Vector3(0,1,0))),ct(wt.origin,t),ct(wt.dir,n);const r=o.length(),a=this.world.castRayAndGetNormal(wt,r,!1,void 0,s?.collisionFilter,void 0,null!=s?.excludeActor?this.actorBodies.get(s.excludeActor.id):void 0,s?.excludeTriggers?t=>!t.isSensor():void 0);if(i.hasHit=null!=a,i.hasHit){const e=wt.pointAt(a.timeOfImpact);if(i._internal=a,ht(i.hitNormal,a.normal),ht(i.hitPoint,e),i.distance=pt.subVectors(i.hitPoint,t).length(),!1!==s?.resolveActor){const t=this.world.bodies.getAll().find(t=>function(t,e){for(let i=0,s=t.numColliders();i<s;i++){const s=t.collider(i);if(e(s))return s}}(t,t=>t===a.collider));i.actor=null!=t?this.bodyActors.get(t):null}}if(this.showDebug){let e;H.length>0?(e=H.pop(),e.setDirection(n),e.position.copy(t),e.setLength(r,.2,.1),e.setColor(s?.debugColor??255)):e=new h(n,t,r,s?.debugColor??255),this.scene?.add(e),setTimeout(()=>{this.scene?.remove(e),H.push(e)},s?.debugLifetime??200)}return i}setGravity(t,e,i){this.world.gravity.x=t,this.world.gravity.y=e,this.world.gravity.z=i}getGravity(){return Z.set(this.world.gravity.x,this.world.gravity.y,this.world.gravity.z)}addFromScene(t){this.addRecursively(t);for(const t of this.staticBodies.values())yt(t,t=>t.setActiveEvents(i.ActiveEvents.COLLISION_EVENTS))}addRecursively(t){if(this.removeSceneObject(t),!function(t){if(null!=t.userData?.src){const e=t.userData?.src;return"actor"===e.type}return!1}(t))if(t instanceof T&&null!=t.collisionShape){const e=this.createStaticBody(t,[t.collisionShape],t.physics);this.staticMeshes.set(e,t),this.staticBodies.set(t,e)}else if(t instanceof C){const e=!1!==t.userData?.src?.collisionDetection;if(t.children[0]&&(t.children[0].instanceMatrix&&e||t.children[0].isBatchedMesh))this.createForInstancedMesh(t.children[0],t.collisionShapes);else if(e&&t.children.length>0){const e=this.createStaticBody(t,t.collisionShapes,t.physics);this.staticMeshes.set(e,t),this.staticBodies.set(t,e)}}else t instanceof F?this.addLandscapeGroup(t):(t instanceof p||t instanceof B)&&t.children.forEach(t=>this.addRecursively(t))}createForInstancedMesh(t,e){const i=new m;if(t instanceof d.BatchedMesh){const e=t._instanceInfo??t._drawInfo,s=new Map;for(let o=0;o<e.length;o++){if(null!=t.userData.hasCollision&&!t.userData.hasCollision[o])continue;const e=t.userData.collisionShapes;let n=e?.[o];if(null==n&&null==e&&t.parent instanceof C&&(n=t.parent.collisionShapes),null==n)continue;let r=s.get(n);null==r&&(r=this.instancedShapeReset(n),s.set(n,r));const a=new f;a.matrix.identity(),t.getMatrixAt(o,i),a.applyMatrix4(i);this.createStaticBody(a,r)}}else{const s=this.instancedShapeReset(e);for(let e=0;e<t.count;e++){if(null!=t.userData.hasCollision&&!t.userData.hasCollision[e])continue;const o=new f;o.matrix.identity(),i.fromArray(t.instanceMatrix.array,16*e),o.applyMatrix4(i);this.createStaticBody(o,s)}}}instancedShapeReset(t){return t.filter(t=>null!=t).map(t=>P(t))}getCharacterController(t){return this.world?.createCharacterController(t)}getActorComputedMovement(t,e,i,o=null){const n=this.actorBodies.get(t.id);this.controlledActors.add(t.id);const r=n.collider(0);e.computeColliderMovement(r,i,s.EXCLUDE_SENSORS,o,mt);const a=e.computedMovement();return ht(gt,a),gt}createCollider(t,e){const i=this.addShape(e?.body,t),s=new PhysicsCollider(i,this.world);return this.colliders.set(i.handle,s),s.disposed.subscribe(()=>{this.colliders.delete(i.handle)}),s}createBody(t=PhysicsBodyType.dynamic,e={}){const i=(()=>{switch(t){case PhysicsBodyType.dynamic:return this.rapier.RigidBodyDesc.dynamic();case PhysicsBodyType.static:return this.rapier.RigidBodyDesc.fixed();case PhysicsBodyType.kinematic:return this.rapier.RigidBodyDesc.kinematicPositionBased();case PhysicsBodyType.kinematicVelocityBased:return this.rapier.RigidBodyDesc.kinematicVelocityBased();default:return this.rapier.RigidBodyDesc.dynamic()}})();e.position&&i.setTranslation(e.position.x,e.position.y,e.position.z),e.rotation&&i.setRotation({x:e.rotation.x,y:e.rotation.y,z:e.rotation.z,w:e.rotation.w}),"boolean"==typeof e.canSleep&&i.setCanSleep(e.canSleep),"boolean"==typeof e.ccdEnabled&&i.setCcdEnabled(e.ccdEnabled),"number"==typeof e.gravityScale&&i.setGravityScale(e.gravityScale),"number"==typeof e.mass&&i.setAdditionalMass(e.mass),void 0!==e.userData&&(i.userData=e.userData);const s=this.world.createRigidBody(i);return new PhysicsBody(s,this.world)}getCharacterComputedMovement(t,e,i,o=null){const n=t.collider;e.computeColliderMovement(n,i,s.EXCLUDE_SENSORS,o,mt);const r=e.computedMovement();return ht(gt,r),gt}setNextKinematicTranslation(t,e){const i=this.actorBodies.get(t.id),s=i.translation();s.x+=e.x,s.y+=e.y,s.z+=e.z,i?.setNextKinematicTranslation(s)}setNextKinematicPosition(t,e){this.actorBodies.get(t.id).setNextKinematicTranslation(e)}setNextKinematicRotation(t,e){this.actorBodies.get(t.id).setNextKinematicRotation(e)}setNextKinematicTransform(t){!function(t,e){const i=e.getWorldPosition($),s=e.getWorldQuaternion(X);t.setNextKinematicTranslation(nt(i)),t.setNextKinematicRotation(rt(s))}(this.actorBodies.get(t.id),t.object)}setAngularVelocity(t,e){const i=this.actorBodies.get(t.id);et.x=e.x,et.y=e.y,et.z=e.z,i?.setAngvel(et,!0)}setLinearVelocity(t,e){const i=this.actorBodies.get(t.id);et.x=e.x,et.y=e.y,et.z=e.z,i?.setLinvel(et,!0)}getLinearVelocity(t,e=new b){const i=this.actorBodies.get(t.id).linvel();return e.x=i.x,e.y=i.y,e.z=i.z,e}getAngularVelocity(t,e=new b){const i=this.actorBodies.get(t.id).angvel();return e.x=i.x,e.y=i.y,e.z=i.z,e}setLinearDamping(t,e){const i=this.actorBodies.get(t.id);i?.setLinearDamping(e)}getLienarDamping(t){const e=this.actorBodies.get(t.id);return e?.linearDamping()??0}setAngularDamping(t,e){const i=this.actorBodies.get(t.id);i?.setAngularDamping(e)}getAngularDamping(t){const e=this.actorBodies.get(t.id);e?.angularDamping()}setPosition(t,e){const i=this.actorBodies.get(t.id);i?.setTranslation(nt(e),!1)}getPosition(t,e=new b){const i=this.actorBodies.get(t.id);i&&ht(e,i.translation())}setRotation(t,e){const i=this.actorBodies.get(t.id);i?.setTranslation(rt(e),!1)}getRotation(t,e=new w){const i=this.actorBodies.get(t.id);i&&ut(e,i.rotation())}lockTranslations(t,e){const i=this.actorBodies.get(t.id);i?.lockTranslations(e,!1)}lockRotations(t,e){const i=this.actorBodies.get(t.id);i?.lockRotations(e,!1)}setEnabledTranslations(t,e,i,s){const o=this.actorBodies.get(t.id);o?.setEnabledTranslations(e,i,s,!1)}setEnabledRotations(t,e,i,s){const o=this.actorBodies.get(t.id);o?.setEnabledRotations(e,i,s,!1)}addLandscapeGroup(t){const e=t.userData.src,s=e.landscape.heightMaps;for(const n of t.sections){this.staticBodies.has(n)&&this.world.removeRigidBody(this.staticBodies.get(n));var o=n.getWorldPosition(new b);if(e.landscape.holes&&e.landscape.holes.some(t=>t.m===n.name&&0!==t.w[0])){const t=n.geometry.clone(),i=n.scale,s=n.geometry.getAttribute("hole"),r=new Float32Array(t.getAttribute("position").array);for(let t=0;t<r.length;t+=3)r[t]*=i.x,r[t+1]*=i.y,r[t+2]*=i.z;const a=t.index;for(let t=0;t<a.count;t+=3){const e=s.getX(a.getX(t)),i=s.getX(a.getY(t)),o=s.getX(a.getZ(t));(e>.5||i>.5||o>.5)&&(a.setX(t,0),a.setY(t,0),a.setZ(t,0))}const l=this.rapier.ColliderDesc.trimesh(r,new Uint32Array(t.getIndex().array));if(!1!==e.collisionDetection){const t=this.world.createRigidBody(this.rapier.RigidBodyDesc.fixed()),e=new this.rapier.Vector3(0,0,0);ct(e,o),t.setTranslation(e,!1),this.world.createCollider(l,t),this.staticBodies.set(n,t)}continue}const t=e.landscape.options.density+1,r=e.landscape.options.sectionSize,a=new Array(t);for(let e=0;e<t;e++)a[e]=new Array(t).fill(0);const l=s.find(t=>t.x===n.x&&t.y==n.y);if(null!=l)for(const e of l.points){if(null==a[e.i%t])continue;const i=t-1-Math.floor(e.i/t);i in a[e.i%t]?a[e.i%t][i]=e.y/r:console.warn("wrong index",{points:a,point:e,i:e.i%t,k:i,heightMap:l})}const c=e.landscape.options.density,d=a.flatMap(t=>t.reverse()),h=i.ColliderDesc.heightfield(c,c,new Float32Array(d),new this.rapier.Vector3(r,r,r));if(!1!==e.collisionDetection){const t=this.world.createRigidBody(this.rapier.RigidBodyDesc.fixed()),e=new this.rapier.Vector3(0,0,0);ct(e,o),t.setTranslation(e,!1),this.world.createCollider(h,t),this.staticBodies.set(n,t)}}}setEnabled(t,e){const i=this.actorBodies.get(t.id);i?.setEnabled(e)}addActor(t,e,i={}){if(0==e.length)return void console.error("No collision shapes were defined when adding actor to the physics system.");this.removeActor(t);const s=t.object;let o;switch(i.type??PhysicsBodyType.static){case PhysicsBodyType.dynamic:o=this.rapier.RigidBodyDesc.dynamic(),o.mass=i.mass??1;break;case PhysicsBodyType.kinematic:o=this.rapier.RigidBodyDesc.kinematicPositionBased();break;case PhysicsBodyType.kinematicVelocityBased:o=this.rapier.RigidBodyDesc.kinematicVelocityBased();break;default:o=i.isTrigger?this.rapier.RigidBodyDesc.kinematicVelocityBased():this.rapier.RigidBodyDesc.fixed()}const n=this.world.createRigidBody(o);n.enableCcd(1==i.continousCollisionDetection);for(const t of e)this.addShape(n,t,s);return yt(n,t=>{null!=i.isTrigger&&(t.setSensor(i.isTrigger),t.setActiveCollisionTypes(this.rapier.ActiveCollisionTypes.ALL),t.setActiveEvents(this.rapier.ActiveEvents.COLLISION_EVENTS)),null!=i.friction&&t.setFriction(i.friction),null!=i.density&&t.setDensity(i.density),null!=i.mass&&t.setMass(i.mass),null!=i.restitution&&t.setRestitution(i.restitution)}),Y(n,s),!0===i.ignoreForNavMesh&&(n.userData={ignoreForNavMesh:!0}),this.actorBodies.set(t.id,n),this.bodyActors.set(n,t),new PhysicsBody(n,this.world)}applyTorque(t,e){const i=this.actorBodies.get(t.id);et.x=e.x,et.y=e.y,et.z=e.z,i?.addTorque(et,!0)}applyTorqueImpulse(t,e){const i=this.actorBodies.get(t.id);et.x=e.x,et.y=e.y,et.z=e.z,i?.applyTorqueImpulse(et,!0)}resetForces(t){const e=this.actorBodies.get(t.id);e?.resetForces(!1)}resetTorques(t){const e=this.actorBodies.get(t.id);e?.resetTorques(!1)}applyForce(t,e){const i=this.actorBodies.get(t.id);et.x=e.x,et.y=e.y,et.z=e.z,i?.addForce(et,!0)}applyImpulse(t,e){const i=this.actorBodies.get(t.id);et.x=e.x,et.y=e.y,et.z=e.z,i?.applyImpulse(et,!0)}applyLocalForce(t,e,i){const s=this.actorBodies.get(t.id);ct(et,e),null==i?s?.addForce(et,!0):(ct(it,i),s?.addForceAtPoint(et,it,!0))}applyLocalImpulse(t,e,i){const s=this.actorBodies.get(t.id);ct(et,e),null==i?s.applyImpulse(et,!0):(ct(it,i),s.applyImpulseAtPoint(et,it,!0))}applyRadiusImpulse(t,e,s){this.world.bodies.forEach(o=>{if(o.collider(0)?.isSensor())return;if(o.bodyType()!==i.RigidBodyType.Dynamic)return;const n=st;ht(n,o.translation());const r=n.clone().sub(t);if(r.length()>e)return;const a=r.clone().normalize().multiplyScalar(s);et.x=a.x,et.y=a.y,et.z=a.z,o.applyImpulse(et,!0)})}removeActor(t){if(null==t)return;this.controlledActors.delete(t.id);const e=this.actorBodies.get(t.id);null!=e&&(this.bodyActors.delete(e),this.world.removeRigidBody(e)),this.actorBodies.delete(t.id)}removeRemoved(t){if(null==t)return;const e=new Set;t.traverse(t=>{e.add(t.uuid)});for(const[t,i]of this.staticBodies.entries())e.has(t.uuid)&&this.world.getRigidBody(i.handle)&&(this.staticBodies.delete(t),this.world.removeRigidBody(i))}removeSceneObject(t){if(t instanceof F){for(const e of t.sections)this.removeSceneObject(e);return}let e=this.staticBodies.get(t);null!=e&&this.world.getRigidBody(e.handle)&&this.world.removeRigidBody(e),this.staticBodies.delete(t)}activateActorEvents(t){this.actorBodies.get(t.id)}_onCollisionWithActorEvent(t,e,i){return this.activateActorEvents(t),this.collisionEvents.pipe(c(t.disposed),r(({started:t})=>t===i),a(({handle1:t,handle2:e,started:i})=>({a1:this.bodyActors.get(this.world.getCollider(t)?.parent()),a2:this.bodyActors.get(this.world.getCollider(e)?.parent()),started:i})),r(({a1:i,a2:s})=>null!=i&&null!=s&&i.id===t.id&&e(i,s)),a(({a2:t})=>t))}onBeginContact(t){return this.activateActorEvents(t),this.collisionEvents.pipe(c(t.disposed),r(t=>t.started),r(({handle1:e})=>{const i=this.bodyActors.get(this.world.getCollider(e)?.parent());return null!=i&&i.id===t.id}),a(t=>t.handle2))}onEndContact(t){return this.activateActorEvents(t),this.collisionEvents.pipe(c(t.disposed),r(t=>!t.started),r(({handle1:e})=>{const i=this.bodyActors.get(this.world.getCollider(e)?.parent());return null!=i&&i.id===t.id}),a(t=>t.handle2))}onHasContactChanged(t){const e=new Set,i=new o(!1);return this.onBeginContact(t).subscribe(t=>{e.add(t),i.next(e.size>0)}),this.onEndContact(t).subscribe(t=>{e.delete(t),i.next(e.size>0)}),i.pipe(n())}onBeginOverlapWithActorType(t,e){return this._onCollisionWithActorEvent(t,(t,i)=>i instanceof e,!0)}onEndOverlapWithActorType(t,e){return this._onCollisionWithActorEvent(t,(t,i)=>i instanceof e,!1)}onBeginOverlapWithActor(t,e){return this._onCollisionWithActorEvent(t,(t,i)=>e.id===i.id,!0)}onEndOverlapWithActor(t,e){return this._onCollisionWithActorEvent(t,(t,i)=>e.id===i.id,!1)}onCollisionWithActor(t,e){return this.onBeginOverlapWithActor(t,e)}onCollisionWithActorType(t,e){return this.onBeginOverlapWithActorType(t,e)}updateActorTransform(t){const e=this.actorBodies.get(t.id);null!=e&&Y(e,t.object)}setupWorld(){const t=new this.rapier.World({x:0,y:-9.81,z:0});this.world=t}sphereCast(t,e,i,s,o=ShapeCastResult.shared,n){o.reset();const r=this.getBallShape(e);this.shapeCacheBall.get;const a={x:t.x,y:t.y,z:t.z},l={x:i.x,y:i.y,z:i.z},c=n?.excludeActor?this.actorBodies.get(n.excludeActor.id):null,d=this.world.castShape(a,{x:0,y:0,z:0,w:1},l,r,.01,s,!0,null,n?.collisionFilter??void 0,null,c,n?.excludeTriggers?t=>!t.isSensor():void 0);if(null!=d){ht(o.hitPoint,d.witness1),o.normal.set(d.normal1.x,d.normal1.y,d.normal1.z),o.distance=d.time_of_impact,o.hasHit=!0;const t=d.collider.parent();if(t){const e=this.bodyActors.get(t);e&&(o.actor=e)}}return o}castActorShape(t,e,i,s=ShapeCastResult.shared,o=void 0){s.reset();const n=this.actorBodies.get(t.id);if(n&&n.numColliders()>0){for(let t=0;t<n.numColliders();t++){const r=n.collider(t);let a=r.shape,l=r.translation(),c=r.rotation(),d=e,h=i;const u=this.world.castShape(l,c,d,a,.01,h,!0,null,o,null,n,void 0);if(null!=u){u.collider;const t=r;return ht(s.hitPoint,u.witness1),Bt(t.rotation(),u.normal1,s.normal,q),s.distance=u.time_of_impact,s.actor=this.bodyActors.get(u.collider.parent()),s.hasHit=!0,s}}return s}return console.warn("Actor is not added to the physics system"),s}stop(){if(!this._isStopped){this._isStopped=!0,this.bodyActors.clear(),this.actorBodies.clear(),this.staticBodies.clear(),this.staticMeshes.clear(),this.colliders.clear(),this.fixedupdateSub?.unsubscribe(),this.collisionSub?.unsubscribe(),this.world?.bodies.forEach(t=>this.world.removeRigidBody(t));try{this.world?.free(),this.world=void 0}catch(t){console.warn("Error while freeing physics world",t)}H.length=0}}createStaticBody(t,e,s){const o=s?.type===PhysicsBodyType.dynamic?i.RigidBodyDesc.dynamic():i.RigidBodyDesc.fixed();o.setSleeping(!0);const n=this.world.createRigidBody(o);let r=0;for(const i of e){if(r>128){console.warn("Too many collision shapes for object",t);break}if(r++,null==i){console.warn("Collision shape is missing for object",t);continue}const o=this.addShape(n,i,t);null!=o&&(null!=s?.friction&&o.setFriction(s.friction),null!=s?.density&&o.setDensity(s.density),null!=s?.mass&&o.setMass(s.mass/e.length),null!=s?.restitution&&o.setRestitution(s.restitution))}return Y(n,t),n.userData=t.uuid,n.sleep(),n}addShape(t=void 0,e,i){const s=i?.getWorldScale(ft)??tt,o=this.createShape(e,s);if(null==o)return void console.error("Failed to create physics shape. This can happen if the geometry is degenerate or zero-scaled.",{shapeInfo:e,object:i});this.applyShapeSettings(o,e);const n=e.offset.clone().multiply(s);ct(o.translation,n);const r=(new w).setFromEuler(e.rotation);dt(o.rotation,r),null!=t&&t.numColliders()>128&&console.warn(`Rigid body has many colliders (${t.numColliders()}). Consider using a Trimesh if this is static geometry.`,t);try{return this.world.createCollider(o,t)}catch(t){return void console.error("Failed to create collider",t)}}applyShapeSettings(t,e){null!=e.collisionGroup&&t.setCollisionGroups(e.collisionGroup),t.friction=e.friction??.1,null!=e.restitution&&(t.restitution=e.restitution),null!=e.density&&(t.density=e.density,t.massPropsMode=i.MassPropsMode.Density),null!=e.mass&&(t.mass=e.mass,t.massPropsMode=i.MassPropsMode.Mass)}createShape(t,e){if(t instanceof S)return this.rapier.ColliderDesc.cuboid(t.dimensions.x*e.x/2,t.dimensions.y*e.y/2,t.dimensions.z*e.z/2);if(t instanceof A){return this.rapier.ColliderDesc.capsule(t.length/2*e.y,t.radius*Math.max(e.z,e.x))}if(t instanceof _){const i=null!=t.geometry.getIndex()?t.geometry:k.mergeVertices(t.geometry),s=extractFloat32Array(i.getAttribute("position"));for(let t=0;t<s.length;t+=3)s[t]*=e.x,s[t+1]*=e.y,s[t+2]*=e.z;const o=i.getIndex();return null==o?(console.error("Trimesh collision shape is missing an index buffer.",t),null):this.rapier.ColliderDesc.trimesh(s,new Uint32Array(o.array))}if(t instanceof D){let i,s;t.mesh instanceof d.Mesh?i=t.mesh.geometry:t.mesh instanceof d.BufferGeometry?i=t.mesh:console.log("Unknownd shape",{shapeInfo:t}),t.mesh instanceof d.Mesh&&(s=j(t.mesh));const o=`${i.uuid}|${s?.x??1},${s?.y??1},${s?.z??1}|${e.x},${e.y},${e.z}`,n=J.get(o);if(void 0!==n)return n;const r=extractFloat32Array(i.getAttribute("position"));if(null!=s)for(let t=0;t<r.length;t+=3)r[t]*=s.x,r[t+1]*=s.y,r[t+2]*=s.z;for(let t=0;t<r.length;t+=3)r[t]*=e.x,r[t+1]*=e.y,r[t+2]*=e.z;const a=this.rapier.ColliderDesc.convexHull(r);return null==a&&console.error("Failed to compute convex hull. Points may be coplanar or too few.",{count:r.length/3}),J.set(o,a),a}if(t instanceof M){const i=2*e.x-e.y-e.z;return Math.abs(i)>.01?this.createShape(new D(new d.SphereGeometry(t.radius).scale(e.x,e.y,e.z)),new b(1,1,1)):this.rapier.ColliderDesc.ball(t.radius*Math.max(e.x,e.y,e.z))}return t instanceof z?this.rapier.ColliderDesc.cylinder(t.height/2*e.y,t.radiusTop*Math.max(e.z,e.x)):t instanceof R?this.rapier.ColliderDesc.cone(t.height*e.y,t.radiusBottom/2*Math.max(e.z,e.x)):t instanceof E?this.rapier.ColliderDesc.cuboid(t.width/2*e.x,t.height/2*e.y,.001):(console.error("Unsupported shape",t),this.rapier.ColliderDesc.cuboid(1,1,1))}createCharacterCollision(){return new this.rapier.CharacterCollision}};Q=t([v(),e("design:paramtypes",[])],Q);export{Q as PhysicsSystem};const $=new b,X=new d.Quaternion;function Y(t,e){const i=e.getWorldPosition($),s=e.getWorldQuaternion(X);t.setTranslation(nt(i),!1),t.setRotation(rt(s),!1)}const Z=new b,J=new Map,tt=new b(1,1,1),et=new i.Vector3(0,0,0),it=new i.Vector3(0,0,0),st=new b,ot=new d.Vector2;function nt(t){return ct(et,t),et}function rt(t){return dt(q,t),q}let at=null;const lt=async()=>(null==at&&(at=(async()=>{let t=await import("@dimforge/rapier3d-simd-compat");return await t.init(),t})()),at);function ct(t,e){t.x=e.x,t.y=e.y,t.z=e.z}function dt(t,e){t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w}function ht(t,e){t.x=e.x,t.y=e.y,t.z=e.z}function ut(t,e){t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w}function yt(t,e){for(let i=0,s=t.numColliders();i<s;i++){e(t.collider(i))}}const pt=new b,gt=new b,mt=t=>!t.isSensor(),ft=new b;let wt,xt=class extends W{constructor(){super(...arguments),this._active=!0,this.physics=O(Q),this.world=O(V)}set active(t){this._active=t,t?(this.world.scene.remove(this.actor.object),this.physics.setEnabled(this.actor,t)):(this.world.scene.add(this.actor.object),this.physics.setEnabled(this.actor,t))}get active(){return this._active}};xt=t([L()],xt);export function extractFloat32Array(t){const e=t.itemSize,i=t.count,s=new Float32Array(i*e);for(let o=0;o<i;o++)for(let i=0;i<e;i++)s[o*e+i]=t.getComponent(o,i);return s}function Bt(t,e,i,s){return s.set(t.x,t.y,t.z,t.w),i.set(e.x,e.y,e.z),i.applyQuaternion(s),i}export class PhysicsCollider{constructor(t,e){this.collider=t,this.world=e,this.disposed=new l,this.onBeginOverlapActor=new l,this.onEndOverlapActor=new l}dispose(){this.world.removeCollider(this.collider,!1),this.disposed.next(!0),this.disposed.complete(),this.onBeginOverlapActor.complete(),this.onEndOverlapActor.complete()}set mass(t){this.collider.setMass(t)}get mass(){return this.collider.mass()}set friction(t){this.collider.setFriction(t)}get friction(){return this.collider.friction()}set restitution(t){this.collider.setRestitution(t)}get restitution(){return this.collider.restitution()}set density(t){this.collider.setDensity(t)}get density(){return this.collider.density()}set isTrigger(t){this.collider.setSensor(t)}get isTrigger(){return this.collider.isSensor()}set collisionGroups(t){this.collider.setCollisionGroups(t)}get collisionGroups(){return this.collider.collisionGroups()}set enabled(t){this.collider.setEnabled(t)}get enabled(){return this.collider.isEnabled()}}export class PhysicsBody{constructor(t,e){this.body=t,this.world=e}dispose(){this.world.removeRigidBody(this.body)}setEnabled(t){this.body.setEnabled(t)}isEnabled(){return this.body.isEnabled()}getPosition(t){const e=this.body.translation();return t.set(e.x,e.y,e.z),t}setPosition(t){this.body.setTranslation({x:t.x,y:t.y,z:t.z},!0)}getRotation(t){const e=this.body.rotation();return t.set(e.x,e.y,e.z,e.w),t}setRotation(t){this.body.setRotation({x:t.x,y:t.y,z:t.z,w:t.w},!0)}getLinearVelocity(t){const e=this.body.linvel();return t.set(e.x,e.y,e.z),t}setLinearVelocity(t){this.body.setLinvel({x:t.x,y:t.y,z:t.z},!0)}getAngularVelocity(t){const e=this.body.angvel();return t.set(e.x,e.y,e.z),t}setAngularVelocity(t){this.body.setAngvel({x:t.x,y:t.y,z:t.z},!0)}applyImpulse(t,e=!0){this.body.applyImpulse({x:t.x,y:t.y,z:t.z},e)}applyTorqueImpulse(t,e=!0){this.body.applyTorqueImpulse({x:t.x,y:t.y,z:t.z},e)}setNextKinematicPosition(t){this.body.setNextKinematicTranslation(t)}setNextKinematicRotation(t){this.body.setNextKinematicRotation(t)}setType(t){this.body.setBodyType(function(t){switch(t){case PhysicsBodyType.dynamic:return i.RigidBodyType.Dynamic;case PhysicsBodyType.static:return i.RigidBodyType.Fixed;case PhysicsBodyType.kinematic:return i.RigidBodyType.KinematicPositionBased;case PhysicsBodyType.kinematicVelocityBased:return i.RigidBodyType.KinematicVelocityBased}}(t),t!==PhysicsBodyType.static)}setGravityScale(t){this.body.setGravityScale(t,!1)}getGravityScale(){return this.body.gravityScale()}isDynamic(){return this.body.isDynamic()}isKinematic(){return this.body.isKinematic()}isStatic(){return this.body.isFixed()}sleep(){this.body.sleep()}wakeUp(){this.body.wakeUp()}}/*
1
+ import{__decorate as t,__metadata as e}from"tslib";import*as i from"@dimforge/rapier3d-simd-compat";import{QueryFilterFlags as s}from"@dimforge/rapier3d-simd-compat";import{BehaviorSubject as o,distinctUntilChanged as n,filter as r,map as a,Subject as l,takeUntil as c}from"rxjs";import*as d from"three";import{ArrowHelper as h,BufferAttribute as u,BufferGeometry as p,Group as y,LineSegments as g,Matrix4 as m,Object3D as f,Quaternion as w,Raycaster as x,Scene as b,Vector3 as B}from"three";import*as v from"three/examples/jsm/utils/BufferGeometryUtils.js";import{Service as C}from"typedi";import{ActorComponent as S,Component as A}from"../../../gameplay/actors/component.js";import{inject as R}from"../../../gameplay/inject.js";import{BoxCollisionShape as z,CapsuleCollisionShape as D,ConeCollisionShape as T,ConvexPolyhedronCollisionShape as M,CylinderCollisionShape as E,PhysicalShapeMesh as P,PlaneCollisionShape as _,SphereCollisionShape as F,toInstancedCollisionShape as W,TrimeshCollisionShape as I}from"../../../index.js";import{AssetMeshInstance as j}from"../../../scene/asset-resource-loader.js";import{LandscapeGroup as V}from"../../../scene/landscape/landscape.js";import{calculateEffectiveScale as k}from"../../../utils/three/traverse.js";import{ViewController as N}from"../render.js";import{World as L}from"../world.js";import{AbstractPhysicsSystem as O}from"./abstract-physics-system.js";import{NetRole as G}from"../../net/index.js";export{ActorComponent,attach,Attach,Component}from"../../actors/component.js";export class RayTestResult{constructor(){this.hasHit=!1,this.hitPoint=new B,this.hitNormal=new B}}export class ShapeCastResult{constructor(){this.hasHit=!1,this.hitPoint=new B,this.normal=new B}reset(){this.actor=void 0,this.hasHit=!1,this.distance=0,this.hitPoint.set(0,0,0),this.normal.set(0,0,0)}}ShapeCastResult.shared=new ShapeCastResult;export var PhysicsBodyType;!function(t){t[t.dynamic=1]="dynamic",t[t.static=2]="static",t[t.kinematic=4]="kinematic",t[t.kinematicVelocityBased=8]="kinematicVelocityBased"}(PhysicsBodyType||(PhysicsBodyType={}));const K=new B,U=new B,H=new w,q=new w,Q=new w,X=[];let $=class extends O{set showDebug(t){this.shouldRenderDebug=t,this.debugMesh&&(this.debugMesh.visible=t)}get showDebug(){return this.shouldRenderDebug}constructor(){super(),this.staticMeshes=new Map,this.staticBodies=new Map,this.actorBodies=new Map,this.bodyActors=new Map,this.colliders=new Map,this.collisionEvents=new l,this.beforeStep=new l,this.afterStep=new l,this.shouldRenderDebug=!1,this.viewController=R(N),this.shapeCacheBox=new Map,this.shapeCacheBall=new Map,this._raycaster=new x,this._reusableResult=new RayTestResult,this._raytestDiff=new B,this._raytestDirection=new B,this.controlledActors=new Set,this._isStopped=!1,this.ready=this.setup()}getBallShape(t){let e=this.shapeCacheBall.get(t);return null==e&&(e=new this.rapier.Ball(t),this.shapeCacheBall.set(t,e)),e}getBoxShape(t,e,i){const s=t+1e6*e+1e12*i;let o=this.shapeCacheBox.get(s);return null==o&&(o=new this.rapier.Cuboid(t,e,i),this.shapeCacheBox.set(s,o)),o}hasBoxIntersection(t){const e=t.getCenter(K),i=t.getSize(U),s=this.getBoxShape(i.x/2,i.y/2,i.z/2);return null!=this.world.intersectionWithShape(e,H,s)}hasSphereIntersection(t){const e=this.getBallShape(t.radius);return null!=this.world.intersectionWithShape(t.center,H,e)}findActorsInRadius(t,e,i){const s=this.getBallShape(e),o=[];for(const[e,n]of this.bodyActors)if(n instanceof i||null==i)for(let i=0,r=e.numColliders();i<r;i++){e.collider(i).intersectsShape(s,t,H)&&o.push(n)}return o}createDebugMesh(){return new g(new p,new d.LineBasicMaterial({color:255}))}async start(){return await this.ready,this.handleTick(),this.handleCollisionEvents(),this.ready}handleCollisionEvents(){this.collisionSub=this.collisionEvents.subscribe(t=>{const e=this.colliders.get(t.handle1);if(null==e)return;const i=this.world.getCollider(t.handle2);if(null==i||null==i.parent())return;const s=this.bodyActors.get(i.parent());null!=s&&(t.started?e.onBeginOverlapActor.next({actor:s}):e.onEndOverlapActor.next({actor:s}))})}renderDebug(){if(null==this.scene)return;null==this.debugMesh&&(this.debugMesh=this.createDebugMesh(),this.debugMesh.visible=this.shouldRenderDebug,this.debugMesh.raycast=function(){},this.scene?.add(this.debugMesh));const t=this.world.debugRender().vertices,e=this.debugMesh.geometry,i=e.getAttribute("position");null==i||(i.array.length,t.length);{const i=new u(t,3);i.setUsage(d.DynamicDrawUsage),e.setAttribute("position",i)}e.setDrawRange(0,t.length/3)}async setup(){if(null!=this.rapier)throw new Error("Rapier is already estup");this.rapier=await dt(),this.eventQueue=new this.rapier.EventQueue(!0),this.setupWorld()}handleTick(){this.fixedupdateSub=this.viewController.onUpdate().subscribe(t=>{this._isStopped||(t=Math.min(.1,t),this.beforeStep.next(t),this.updatePhysics(t),this.showDebug&&this.renderDebug(),this.world.bodies.forEach(t=>{if(t.isFixed())return;let e,i=this.staticMeshes.get(t);if(null==i&&(e=this.bodyActors.get(t),null!=e)){if(e.netRole===G.simulatedProxy)return;i=e.object}null!=i&&i.parent instanceof b&&(pt(i.position,t.translation()),(t.isDynamic()||t.isKinematic()&&!this.controlledActors.has(this.bodyActors.get(t)?.id))&&yt(i.quaternion,t.rotation()),i.matrixWorldNeedsUpdate=!0)}),this.afterStep.next(t))})}_updateWorld(){this.world.timestep=0,this.world.step()}updatePhysics(t){this._isStopped||(this.world.timestep=t,this.world.step(this.eventQueue),this.eventQueue.drainCollisionEvents((t,e,i)=>{this.collisionEvents.next({handle1:t,handle2:e,started:i}),this.collisionEvents.next({handle1:e,handle2:t,started:i})}))}rayTestFromCamera(t,e,i){this._raycaster.setFromCamera(rt,this.viewController.getCamera());const s=this._raycaster.ray.origin,o=this._raycaster.ray.direction.multiplyScalar(t).add(s);return this.rayTest(s,o,e,i)}rayTest(t,e,i,s){null==i&&(i=this._reusableResult);const o=this._raytestDiff,n=this._raytestDirection;if(o.subVectors(e,t),n.copy(o).normalize(),0===n.length())return console.warn("Ray test called with to and from being equal"),i;null==bt&&(bt=new this.rapier.Ray(new this.rapier.Vector3(0,0,0),new this.rapier.Vector3(0,1,0))),ht(bt.origin,t),ht(bt.dir,n);const r=o.length(),a=this.world.castRayAndGetNormal(bt,r,!1,void 0,s?.collisionFilter,void 0,null!=s?.excludeActor?this.actorBodies.get(s.excludeActor.id):void 0,s?.excludeTriggers?t=>!t.isSensor():void 0);if(i.hasHit=null!=a,i.hasHit){const e=bt.pointAt(a.timeOfImpact);if(i._internal=a,pt(i.hitNormal,a.normal),pt(i.hitPoint,e),i.distance=mt.subVectors(i.hitPoint,t).length(),!1!==s?.resolveActor){const t=this.world.bodies.getAll().find(t=>function(t,e){for(let i=0,s=t.numColliders();i<s;i++){const s=t.collider(i);if(e(s))return s}}(t,t=>t===a.collider));i.actor=null!=t?this.bodyActors.get(t):null}}if(this.showDebug){let e;X.length>0?(e=X.pop(),e.setDirection(n),e.position.copy(t),e.setLength(r,.2,.1),e.setColor(s?.debugColor??255)):e=new h(n,t,r,s?.debugColor??255),this.scene?.add(e),setTimeout(()=>{this.scene?.remove(e),X.push(e)},s?.debugLifetime??200)}return i}setGravity(t,e,i){this.world.gravity.x=t,this.world.gravity.y=e,this.world.gravity.z=i}getGravity(){return tt.set(this.world.gravity.x,this.world.gravity.y,this.world.gravity.z)}addFromScene(t){this.addRecursively(t);for(const t of this.staticBodies.values())gt(t,t=>t.setActiveEvents(i.ActiveEvents.COLLISION_EVENTS))}addRecursively(t){if(this.removeSceneObject(t),!function(t){if(null!=t.userData?.src){const e=t.userData?.src;return"actor"===e.type}return!1}(t))if(t instanceof P&&null!=t.collisionShape){const e=this.createStaticBody(t,[t.collisionShape],t.physics);this.staticMeshes.set(e,t),this.staticBodies.set(t,e)}else if(t instanceof j){const e=!1!==t.userData?.src?.collisionDetection;if(t.children[0]&&(t.children[0].instanceMatrix&&e||t.children[0].isBatchedMesh))this.createForInstancedMesh(t.children[0],t.collisionShapes);else if(e&&t.children.length>0){const e=this.createStaticBody(t,t.collisionShapes,t.physics);this.staticMeshes.set(e,t),this.staticBodies.set(t,e)}}else t instanceof V?this.addLandscapeGroup(t):(t instanceof y||t instanceof b)&&t.children.forEach(t=>this.addRecursively(t))}createForInstancedMesh(t,e){const i=new m;if(t instanceof d.BatchedMesh){const e=t._instanceInfo??t._drawInfo,s=new Map;for(let o=0;o<e.length;o++){if(null!=t.userData.hasCollision&&!t.userData.hasCollision[o])continue;const e=t.userData.collisionShapes;let n=e?.[o];if(null==n&&null==e&&t.parent instanceof j&&(n=t.parent.collisionShapes),null==n)continue;let r=s.get(n);null==r&&(r=this.instancedShapeReset(n),s.set(n,r));const a=new f;a.matrix.identity(),t.getMatrixAt(o,i),a.applyMatrix4(i);this.createStaticBody(a,r)}}else{const s=this.instancedShapeReset(e);for(let e=0;e<t.count;e++){if(null!=t.userData.hasCollision&&!t.userData.hasCollision[e])continue;const o=new f;o.matrix.identity(),i.fromArray(t.instanceMatrix.array,16*e),o.applyMatrix4(i);this.createStaticBody(o,s)}}}instancedShapeReset(t){return t.filter(t=>null!=t).map(t=>W(t))}getCharacterController(t){return this.world?.createCharacterController(t)}getActorComputedMovement(t,e,i,o=null){const n=this.actorBodies.get(t.id);this.controlledActors.add(t.id);const r=n.collider(0);e.computeColliderMovement(r,i,s.EXCLUDE_SENSORS,o,wt);const a=e.computedMovement();return pt(ft,a),ft}setActorCapsuleCollider(t,e,i,s){const o=this.actorBodies.get(t.id),n=o?.collider(0);if(null==o||null==n)return!1;const r=t.object?.getWorldScale(xt)??it,a=Math.max(0,e*Math.abs(r.y)),l=Math.max(.001,i*Math.max(Math.abs(r.x),Math.abs(r.z)));return n.setHalfHeight(a/2),n.setRadius(l),nt.set(0,s,0).multiply(r),ht(st,nt),n.setTranslationWrtParent(st),o.recomputeMassPropertiesFromColliders(),!0}hasActorCapsuleIntersection(t,e,i,o,n,r=null){const a=this.actorBodies.get(t.id),l=t.object?.getWorldScale(xt)??it,c=Math.max(0,i*Math.abs(l.y)),d=Math.max(.001,o*Math.max(Math.abs(l.x),Math.abs(l.z))),h=new this.rapier.Capsule(c/2,d),u=t.object?.getWorldQuaternion(Q)??H;nt.set(0,n,0).multiply(l).applyQuaternion(u).add(e);return null!=this.world.intersectionWithShape(nt,u,h,s.EXCLUDE_SENSORS,r??void 0,void 0,a,wt)}createCollider(t,e){const i=this.addShape(e?.body,t),s=new PhysicsCollider(i,this.world);return this.colliders.set(i.handle,s),s.disposed.subscribe(()=>{this.colliders.delete(i.handle)}),s}createBody(t=PhysicsBodyType.dynamic,e={}){const i=(()=>{switch(t){case PhysicsBodyType.dynamic:return this.rapier.RigidBodyDesc.dynamic();case PhysicsBodyType.static:return this.rapier.RigidBodyDesc.fixed();case PhysicsBodyType.kinematic:return this.rapier.RigidBodyDesc.kinematicPositionBased();case PhysicsBodyType.kinematicVelocityBased:return this.rapier.RigidBodyDesc.kinematicVelocityBased();default:return this.rapier.RigidBodyDesc.dynamic()}})();e.position&&i.setTranslation(e.position.x,e.position.y,e.position.z),e.rotation&&i.setRotation({x:e.rotation.x,y:e.rotation.y,z:e.rotation.z,w:e.rotation.w}),"boolean"==typeof e.canSleep&&i.setCanSleep(e.canSleep),"boolean"==typeof e.ccdEnabled&&i.setCcdEnabled(e.ccdEnabled),"number"==typeof e.gravityScale&&i.setGravityScale(e.gravityScale),"number"==typeof e.mass&&i.setAdditionalMass(e.mass),void 0!==e.userData&&(i.userData=e.userData);const s=this.world.createRigidBody(i);return new PhysicsBody(s,this.world)}getCharacterComputedMovement(t,e,i,o=null){const n=t.collider;e.computeColliderMovement(n,i,s.EXCLUDE_SENSORS,o,wt);const r=e.computedMovement();return pt(ft,r),ft}setNextKinematicTranslation(t,e){const i=this.actorBodies.get(t.id),s=i.translation();s.x+=e.x,s.y+=e.y,s.z+=e.z,i?.setNextKinematicTranslation(s)}setNextKinematicPosition(t,e){this.actorBodies.get(t.id).setNextKinematicTranslation(e)}setNextKinematicRotation(t,e){this.actorBodies.get(t.id).setNextKinematicRotation(e)}setNextKinematicTransform(t){!function(t,e){const i=e.getWorldPosition(Y),s=e.getWorldQuaternion(Z);t.setNextKinematicTranslation(at(i)),t.setNextKinematicRotation(lt(s))}(this.actorBodies.get(t.id),t.object)}setAngularVelocity(t,e){const i=this.actorBodies.get(t.id);st.x=e.x,st.y=e.y,st.z=e.z,i?.setAngvel(st,!0)}setLinearVelocity(t,e){const i=this.actorBodies.get(t.id);st.x=e.x,st.y=e.y,st.z=e.z,i?.setLinvel(st,!0)}getLinearVelocity(t,e=new B){const i=this.actorBodies.get(t.id).linvel();return e.x=i.x,e.y=i.y,e.z=i.z,e}getAngularVelocity(t,e=new B){const i=this.actorBodies.get(t.id).angvel();return e.x=i.x,e.y=i.y,e.z=i.z,e}setLinearDamping(t,e){const i=this.actorBodies.get(t.id);i?.setLinearDamping(e)}getLienarDamping(t){const e=this.actorBodies.get(t.id);return e?.linearDamping()??0}setAngularDamping(t,e){const i=this.actorBodies.get(t.id);i?.setAngularDamping(e)}getAngularDamping(t){const e=this.actorBodies.get(t.id);e?.angularDamping()}setPosition(t,e){const i=this.actorBodies.get(t.id);i?.setTranslation(at(e),!1)}getPosition(t,e=new B){const i=this.actorBodies.get(t.id);i&&pt(e,i.translation())}setRotation(t,e){const i=this.actorBodies.get(t.id);i?.setTranslation(lt(e),!1)}getRotation(t,e=new w){const i=this.actorBodies.get(t.id);i&&yt(e,i.rotation())}lockTranslations(t,e){const i=this.actorBodies.get(t.id);i?.lockTranslations(e,!1)}lockRotations(t,e){const i=this.actorBodies.get(t.id);i?.lockRotations(e,!1)}setEnabledTranslations(t,e,i,s){const o=this.actorBodies.get(t.id);o?.setEnabledTranslations(e,i,s,!1)}setEnabledRotations(t,e,i,s){const o=this.actorBodies.get(t.id);o?.setEnabledRotations(e,i,s,!1)}addLandscapeGroup(t){const e=t.userData.src,s=e.landscape.heightMaps;for(const n of t.sections){this.staticBodies.has(n)&&this.world.removeRigidBody(this.staticBodies.get(n));var o=n.getWorldPosition(new B);if(e.landscape.holes&&e.landscape.holes.some(t=>t.m===n.name&&0!==t.w[0])){const t=n.geometry.clone(),i=n.scale,s=n.geometry.getAttribute("hole"),r=new Float32Array(t.getAttribute("position").array);for(let t=0;t<r.length;t+=3)r[t]*=i.x,r[t+1]*=i.y,r[t+2]*=i.z;const a=t.index;for(let t=0;t<a.count;t+=3){const e=s.getX(a.getX(t)),i=s.getX(a.getY(t)),o=s.getX(a.getZ(t));(e>.5||i>.5||o>.5)&&(a.setX(t,0),a.setY(t,0),a.setZ(t,0))}const l=this.rapier.ColliderDesc.trimesh(r,new Uint32Array(t.getIndex().array));if(!1!==e.collisionDetection){const t=this.world.createRigidBody(this.rapier.RigidBodyDesc.fixed()),e=new this.rapier.Vector3(0,0,0);ht(e,o),t.setTranslation(e,!1),this.world.createCollider(l,t),this.staticBodies.set(n,t)}continue}const t=e.landscape.options.density+1,r=e.landscape.options.sectionSize,a=new Array(t);for(let e=0;e<t;e++)a[e]=new Array(t).fill(0);const l=s.find(t=>t.x===n.x&&t.y==n.y);if(null!=l)for(const e of l.points){if(null==a[e.i%t])continue;const i=t-1-Math.floor(e.i/t);i in a[e.i%t]?a[e.i%t][i]=e.y/r:console.warn("wrong index",{points:a,point:e,i:e.i%t,k:i,heightMap:l})}const c=e.landscape.options.density,d=a.flatMap(t=>t.reverse()),h=i.ColliderDesc.heightfield(c,c,new Float32Array(d),new this.rapier.Vector3(r,r,r));if(!1!==e.collisionDetection){const t=this.world.createRigidBody(this.rapier.RigidBodyDesc.fixed()),e=new this.rapier.Vector3(0,0,0);ht(e,o),t.setTranslation(e,!1),this.world.createCollider(h,t),this.staticBodies.set(n,t)}}}setEnabled(t,e){const i=this.actorBodies.get(t.id);i?.setEnabled(e)}addActor(t,e,i={}){if(0==e.length)return void console.error("No collision shapes were defined when adding actor to the physics system.");this.removeActor(t);const s=t.object;let o;switch(i.type??PhysicsBodyType.static){case PhysicsBodyType.dynamic:o=this.rapier.RigidBodyDesc.dynamic(),o.mass=i.mass??1;break;case PhysicsBodyType.kinematic:o=this.rapier.RigidBodyDesc.kinematicPositionBased();break;case PhysicsBodyType.kinematicVelocityBased:o=this.rapier.RigidBodyDesc.kinematicVelocityBased();break;default:o=i.isTrigger?this.rapier.RigidBodyDesc.kinematicVelocityBased():this.rapier.RigidBodyDesc.fixed()}const n=this.world.createRigidBody(o);n.enableCcd(1==i.continousCollisionDetection);for(const t of e)this.addShape(n,t,s);return gt(n,t=>{null!=i.isTrigger&&(t.setSensor(i.isTrigger),t.setActiveCollisionTypes(this.rapier.ActiveCollisionTypes.ALL),t.setActiveEvents(this.rapier.ActiveEvents.COLLISION_EVENTS)),null!=i.friction&&t.setFriction(i.friction),null!=i.density&&t.setDensity(i.density),null!=i.mass&&t.setMass(i.mass),null!=i.restitution&&t.setRestitution(i.restitution)}),J(n,s),!0===i.ignoreForNavMesh&&(n.userData={ignoreForNavMesh:!0}),this.actorBodies.set(t.id,n),this.bodyActors.set(n,t),new PhysicsBody(n,this.world)}applyTorque(t,e){const i=this.actorBodies.get(t.id);st.x=e.x,st.y=e.y,st.z=e.z,i?.addTorque(st,!0)}applyTorqueImpulse(t,e){const i=this.actorBodies.get(t.id);st.x=e.x,st.y=e.y,st.z=e.z,i?.applyTorqueImpulse(st,!0)}resetForces(t){const e=this.actorBodies.get(t.id);e?.resetForces(!1)}resetTorques(t){const e=this.actorBodies.get(t.id);e?.resetTorques(!1)}applyForce(t,e){const i=this.actorBodies.get(t.id);st.x=e.x,st.y=e.y,st.z=e.z,i?.addForce(st,!0)}applyImpulse(t,e){const i=this.actorBodies.get(t.id);st.x=e.x,st.y=e.y,st.z=e.z,i?.applyImpulse(st,!0)}applyLocalForce(t,e,i){const s=this.actorBodies.get(t.id);ht(st,e),null==i?s?.addForce(st,!0):(ht(ot,i),s?.addForceAtPoint(st,ot,!0))}applyLocalImpulse(t,e,i){const s=this.actorBodies.get(t.id);ht(st,e),null==i?s.applyImpulse(st,!0):(ht(ot,i),s.applyImpulseAtPoint(st,ot,!0))}applyRadiusImpulse(t,e,s){this.world.bodies.forEach(o=>{if(o.collider(0)?.isSensor())return;if(o.bodyType()!==i.RigidBodyType.Dynamic)return;const n=nt;pt(n,o.translation());const r=n.clone().sub(t);if(r.length()>e)return;const a=r.clone().normalize().multiplyScalar(s);st.x=a.x,st.y=a.y,st.z=a.z,o.applyImpulse(st,!0)})}removeActor(t){if(null==t)return;this.controlledActors.delete(t.id);const e=this.actorBodies.get(t.id);null!=e&&(this.bodyActors.delete(e),this.world.removeRigidBody(e)),this.actorBodies.delete(t.id)}removeRemoved(t){if(null==t)return;const e=new Set;t.traverse(t=>{e.add(t.uuid)});for(const[t,i]of this.staticBodies.entries())e.has(t.uuid)&&this.world.getRigidBody(i.handle)&&(this.staticBodies.delete(t),this.world.removeRigidBody(i))}removeSceneObject(t){if(t instanceof V){for(const e of t.sections)this.removeSceneObject(e);return}let e=this.staticBodies.get(t);null!=e&&this.world.getRigidBody(e.handle)&&this.world.removeRigidBody(e),this.staticBodies.delete(t)}activateActorEvents(t){this.actorBodies.get(t.id)}_onCollisionWithActorEvent(t,e,i){return this.activateActorEvents(t),this.collisionEvents.pipe(c(t.disposed),r(({started:t})=>t===i),a(({handle1:t,handle2:e,started:i})=>({a1:this.bodyActors.get(this.world.getCollider(t)?.parent()),a2:this.bodyActors.get(this.world.getCollider(e)?.parent()),started:i})),r(({a1:i,a2:s})=>null!=i&&null!=s&&i.id===t.id&&e(i,s)),a(({a2:t})=>t))}onBeginContact(t){return this.activateActorEvents(t),this.collisionEvents.pipe(c(t.disposed),r(t=>t.started),r(({handle1:e})=>{const i=this.bodyActors.get(this.world.getCollider(e)?.parent());return null!=i&&i.id===t.id}),a(t=>t.handle2))}onEndContact(t){return this.activateActorEvents(t),this.collisionEvents.pipe(c(t.disposed),r(t=>!t.started),r(({handle1:e})=>{const i=this.bodyActors.get(this.world.getCollider(e)?.parent());return null!=i&&i.id===t.id}),a(t=>t.handle2))}onHasContactChanged(t){const e=new Set,i=new o(!1);return this.onBeginContact(t).subscribe(t=>{e.add(t),i.next(e.size>0)}),this.onEndContact(t).subscribe(t=>{e.delete(t),i.next(e.size>0)}),i.pipe(n())}onBeginOverlap(t){return this._onCollisionWithActorEvent(t,()=>!0,!0)}onEndOverlap(t){return this._onCollisionWithActorEvent(t,()=>!0,!1)}onBeginOverlapWithActorType(t,e){return this._onCollisionWithActorEvent(t,(t,i)=>i instanceof e,!0)}onEndOverlapWithActorType(t,e){return this._onCollisionWithActorEvent(t,(t,i)=>i instanceof e,!1)}onBeginOverlapWithActor(t,e){return this._onCollisionWithActorEvent(t,(t,i)=>e.id===i.id,!0)}onEndOverlapWithActor(t,e){return this._onCollisionWithActorEvent(t,(t,i)=>e.id===i.id,!1)}onCollisionWithActor(t,e){return this.onBeginOverlapWithActor(t,e)}onCollisionWithActorType(t,e){return this.onBeginOverlapWithActorType(t,e)}updateActorTransform(t){const e=this.actorBodies.get(t.id);null!=e&&J(e,t.object)}flushModifiedBodyPositionsToColliders(){this.world.propagateModifiedBodyPositionsToColliders()}setupWorld(){const t=new this.rapier.World({x:0,y:-9.81,z:0});this.world=t}sphereCast(t,e,i,s,o=ShapeCastResult.shared,n){o.reset();const r=this.getBallShape(e);this.shapeCacheBall.get;const a={x:t.x,y:t.y,z:t.z},l={x:i.x,y:i.y,z:i.z},c=n?.excludeActor?this.actorBodies.get(n.excludeActor.id):null,d=this.world.castShape(a,{x:0,y:0,z:0,w:1},l,r,.01,s,!0,null,n?.collisionFilter??void 0,null,c,n?.excludeTriggers?t=>!t.isSensor():void 0);if(null!=d){pt(o.hitPoint,d.witness1),o.normal.set(d.normal1.x,d.normal1.y,d.normal1.z),o.distance=d.time_of_impact,o.hasHit=!0;const t=d.collider.parent();if(t){const e=this.bodyActors.get(t);e&&(o.actor=e)}}return o}castActorShape(t,e,i,s=ShapeCastResult.shared,o=void 0){s.reset();const n=this.actorBodies.get(t.id);if(n&&n.numColliders()>0){for(let t=0;t<n.numColliders();t++){const r=n.collider(t);let a=r.shape,l=r.translation(),c=r.rotation(),d=e,h=i;const u=this.world.castShape(l,c,d,a,.01,h,!0,null,o,null,n,void 0);if(null!=u){u.collider;const t=r;return pt(s.hitPoint,u.witness1),vt(t.rotation(),u.normal1,s.normal,q),s.distance=u.time_of_impact,s.actor=this.bodyActors.get(u.collider.parent()),s.hasHit=!0,s}}return s}return console.warn("Actor is not added to the physics system"),s}stop(){if(!this._isStopped){this._isStopped=!0,this.bodyActors.clear(),this.actorBodies.clear(),this.staticBodies.clear(),this.staticMeshes.clear(),this.colliders.clear(),this.fixedupdateSub?.unsubscribe(),this.collisionSub?.unsubscribe(),this.world?.bodies.forEach(t=>this.world.removeRigidBody(t));try{this.world?.free(),this.world=void 0}catch(t){console.warn("Error while freeing physics world",t)}X.length=0}}createStaticBody(t,e,s){const o=s?.type===PhysicsBodyType.dynamic?i.RigidBodyDesc.dynamic():i.RigidBodyDesc.fixed();o.setSleeping(!0);const n=this.world.createRigidBody(o);let r=0;for(const i of e){if(r>128){console.warn("Too many collision shapes for object",t);break}if(r++,null==i){console.warn("Collision shape is missing for object",t);continue}const o=this.addShape(n,i,t);null!=o&&(null!=s?.friction&&o.setFriction(s.friction),null!=s?.density&&o.setDensity(s.density),null!=s?.mass&&o.setMass(s.mass/e.length),null!=s?.restitution&&o.setRestitution(s.restitution))}return J(n,t),n.userData=t.uuid,n.sleep(),n}addShape(t=void 0,e,i){const s=i?.getWorldScale(xt)??it,o=this.createShape(e,s);if(null==o)return void console.error("Failed to create physics shape. This can happen if the geometry is degenerate or zero-scaled.",{shapeInfo:e,object:i});this.applyShapeSettings(o,e);const n=e.offset.clone().multiply(s);ht(o.translation,n);const r=(new w).setFromEuler(e.rotation);ut(o.rotation,r),null!=t&&t.numColliders()>128&&console.warn(`Rigid body has many colliders (${t.numColliders()}). Consider using a Trimesh if this is static geometry.`,t);try{return this.world.createCollider(o,t)}catch(t){return void console.error("Failed to create collider",t)}}applyShapeSettings(t,e){null!=e.collisionGroup&&t.setCollisionGroups(e.collisionGroup),t.friction=e.friction??.1,null!=e.restitution&&(t.restitution=e.restitution),null!=e.density&&(t.density=e.density,t.massPropsMode=i.MassPropsMode.Density),null!=e.mass&&(t.mass=e.mass,t.massPropsMode=i.MassPropsMode.Mass)}createShape(t,e){if(t instanceof z)return this.rapier.ColliderDesc.cuboid(t.dimensions.x*e.x/2,t.dimensions.y*e.y/2,t.dimensions.z*e.z/2);if(t instanceof D){return this.rapier.ColliderDesc.capsule(t.length/2*e.y,t.radius*Math.max(e.z,e.x))}if(t instanceof I){const i=null!=t.geometry.getIndex()?t.geometry:v.mergeVertices(t.geometry),s=extractFloat32Array(i.getAttribute("position"));for(let t=0;t<s.length;t+=3)s[t]*=e.x,s[t+1]*=e.y,s[t+2]*=e.z;const o=i.getIndex();return null==o?(console.error("Trimesh collision shape is missing an index buffer.",t),null):this.rapier.ColliderDesc.trimesh(s,new Uint32Array(o.array))}if(t instanceof M){let i,s;t.mesh instanceof d.Mesh?i=t.mesh.geometry:t.mesh instanceof d.BufferGeometry?i=t.mesh:console.log("Unknownd shape",{shapeInfo:t}),t.mesh instanceof d.Mesh&&(s=k(t.mesh));const o=`${i.uuid}|${s?.x??1},${s?.y??1},${s?.z??1}|${e.x},${e.y},${e.z}`,n=et.get(o);if(void 0!==n)return n;const r=extractFloat32Array(i.getAttribute("position"));if(null!=s)for(let t=0;t<r.length;t+=3)r[t]*=s.x,r[t+1]*=s.y,r[t+2]*=s.z;for(let t=0;t<r.length;t+=3)r[t]*=e.x,r[t+1]*=e.y,r[t+2]*=e.z;const a=this.rapier.ColliderDesc.convexHull(r);return null==a&&console.error("Failed to compute convex hull. Points may be coplanar or too few.",{count:r.length/3}),et.set(o,a),a}if(t instanceof F){const i=2*e.x-e.y-e.z;return Math.abs(i)>.01?this.createShape(new M(new d.SphereGeometry(t.radius).scale(e.x,e.y,e.z)),new B(1,1,1)):this.rapier.ColliderDesc.ball(t.radius*Math.max(e.x,e.y,e.z))}return t instanceof E?this.rapier.ColliderDesc.cylinder(t.height/2*e.y,t.radiusTop*Math.max(e.z,e.x)):t instanceof T?this.rapier.ColliderDesc.cone(t.height*e.y,t.radiusBottom/2*Math.max(e.z,e.x)):t instanceof _?this.rapier.ColliderDesc.cuboid(t.width/2*e.x,t.height/2*e.y,.001):(console.error("Unsupported shape",t),this.rapier.ColliderDesc.cuboid(1,1,1))}createCharacterCollision(){return new this.rapier.CharacterCollision}};$=t([C(),e("design:paramtypes",[])],$);export{$ as PhysicsSystem};const Y=new B,Z=new d.Quaternion;function J(t,e){const i=e.getWorldPosition(Y),s=e.getWorldQuaternion(Z);t.setTranslation(at(i),!1),t.setRotation(lt(s),!1)}const tt=new B,et=new Map,it=new B(1,1,1),st=new i.Vector3(0,0,0),ot=new i.Vector3(0,0,0),nt=new B,rt=new d.Vector2;function at(t){return ht(st,t),st}function lt(t){return ut(q,t),q}let ct=null;const dt=async()=>(null==ct&&(ct=(async()=>{let t=await import("@dimforge/rapier3d-simd-compat");return await t.init(),t})()),ct);function ht(t,e){t.x=e.x,t.y=e.y,t.z=e.z}function ut(t,e){t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w}function pt(t,e){t.x=e.x,t.y=e.y,t.z=e.z}function yt(t,e){t.x=e.x,t.y=e.y,t.z=e.z,t.w=e.w}function gt(t,e){for(let i=0,s=t.numColliders();i<s;i++){e(t.collider(i))}}const mt=new B,ft=new B,wt=t=>!t.isSensor(),xt=new B;let bt,Bt=class extends S{constructor(){super(...arguments),this._active=!0,this.physics=R($),this.world=R(L)}set active(t){this._active=t,t?(this.world.scene.remove(this.actor.object),this.physics.setEnabled(this.actor,t)):(this.world.scene.add(this.actor.object),this.physics.setEnabled(this.actor,t))}get active(){return this._active}};Bt=t([A()],Bt);export function extractFloat32Array(t){const e=t.itemSize,i=t.count,s=new Float32Array(i*e);for(let o=0;o<i;o++)for(let i=0;i<e;i++)s[o*e+i]=t.getComponent(o,i);return s}function vt(t,e,i,s){return s.set(t.x,t.y,t.z,t.w),i.set(e.x,e.y,e.z),i.applyQuaternion(s),i}export class PhysicsCollider{constructor(t,e){this.collider=t,this.world=e,this.disposed=new l,this.onBeginOverlapActor=new l,this.onEndOverlapActor=new l}dispose(){this.world.removeCollider(this.collider,!1),this.disposed.next(!0),this.disposed.complete(),this.onBeginOverlapActor.complete(),this.onEndOverlapActor.complete()}set mass(t){this.collider.setMass(t)}get mass(){return this.collider.mass()}set friction(t){this.collider.setFriction(t)}get friction(){return this.collider.friction()}set restitution(t){this.collider.setRestitution(t)}get restitution(){return this.collider.restitution()}set density(t){this.collider.setDensity(t)}get density(){return this.collider.density()}set isTrigger(t){this.collider.setSensor(t)}get isTrigger(){return this.collider.isSensor()}set collisionGroups(t){this.collider.setCollisionGroups(t)}get collisionGroups(){return this.collider.collisionGroups()}set enabled(t){this.collider.setEnabled(t)}get enabled(){return this.collider.isEnabled()}}export class PhysicsBody{constructor(t,e){this.body=t,this.world=e}dispose(){this.world.removeRigidBody(this.body)}setEnabled(t){this.body.setEnabled(t)}isEnabled(){return this.body.isEnabled()}getPosition(t){const e=this.body.translation();return t.set(e.x,e.y,e.z),t}setPosition(t){this.body.setTranslation({x:t.x,y:t.y,z:t.z},!0)}getRotation(t){const e=this.body.rotation();return t.set(e.x,e.y,e.z,e.w),t}setRotation(t){this.body.setRotation({x:t.x,y:t.y,z:t.z,w:t.w},!0)}getLinearVelocity(t){const e=this.body.linvel();return t.set(e.x,e.y,e.z),t}setLinearVelocity(t){this.body.setLinvel({x:t.x,y:t.y,z:t.z},!0)}getAngularVelocity(t){const e=this.body.angvel();return t.set(e.x,e.y,e.z),t}setAngularVelocity(t){this.body.setAngvel({x:t.x,y:t.y,z:t.z},!0)}applyImpulse(t,e=!0){this.body.applyImpulse({x:t.x,y:t.y,z:t.z},e)}applyTorqueImpulse(t,e=!0){this.body.applyTorqueImpulse({x:t.x,y:t.y,z:t.z},e)}setNextKinematicPosition(t){this.body.setNextKinematicTranslation(t)}setNextKinematicRotation(t){this.body.setNextKinematicRotation(t)}setType(t){this.body.setBodyType(function(t){switch(t){case PhysicsBodyType.dynamic:return i.RigidBodyType.Dynamic;case PhysicsBodyType.static:return i.RigidBodyType.Fixed;case PhysicsBodyType.kinematic:return i.RigidBodyType.KinematicPositionBased;case PhysicsBodyType.kinematicVelocityBased:return i.RigidBodyType.KinematicVelocityBased}}(t),t!==PhysicsBodyType.static)}setGravityScale(t){this.body.setGravityScale(t,!1)}getGravityScale(){return this.body.gravityScale()}isDynamic(){return this.body.isDynamic()}isKinematic(){return this.body.isKinematic()}isStatic(){return this.body.isFixed()}sleep(){this.body.sleep()}wakeUp(){this.body.wakeUp()}}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -3,8 +3,10 @@ import { BaseActor } from '../actors/actor.js';
3
3
  import { Euler, Scene, Vector3 } from 'three';
4
4
  import { Observable } from 'rxjs';
5
5
  import { RenderingView } from "../../rendering.js";
6
- import { Prefab, PrefabOf } from "../../scene/objects/prefab.js";
6
+ import { Prefab } from "../../scene/objects/prefab.js";
7
+ import type { SceneMaterializer } from "../../scene/materializer.js";
7
8
  import { PrefabInstance } from '../../scene/objects/prefab';
9
+ import { BasePlayerController } from "../actors/controller/actor-controller.js";
8
10
  declare class DirectionalLightController {
9
11
  private view;
10
12
  constructor(view: RenderingView);
@@ -22,20 +24,41 @@ declare class DirectionalLightController {
22
24
  */
23
25
  get position(): Vector3;
24
26
  }
27
+ export type ActorSpawnOptions = {
28
+ owner: BaseActor;
29
+ };
25
30
  export declare class World {
26
31
  private actorFactory;
27
32
  private view;
33
+ private viewController;
28
34
  private physics;
35
+ private assetsProvider;
36
+ private eventGraphAssets;
29
37
  readonly actors: BaseActor[];
30
38
  readonly actorAdded: Observable<BaseActor>;
31
39
  readonly actorRemoved: Observable<BaseActor>;
32
40
  scene: Scene;
33
41
  readonly directionalLight: DirectionalLightController;
34
- spawnActor<T extends BaseActor>(type: Constructable<T> | PrefabOf<T>, position?: Vector3, rotation?: Euler): Promise<T>;
42
+ private readonly sceneEventGraphs;
43
+ private readonly sceneEventGraphSubscriptions;
44
+ spawnActor<T extends BaseActor>(type: Constructable<T>, position?: Vector3, rotation?: Euler, options?: ActorSpawnOptions): Promise<T>;
45
+ /**
46
+ * Spawn the player controller to run locally.
47
+ * This is only called by the server and if it is not a dedicated server in
48
+ * which case it doesn't have its own local player controller.
49
+ * It sets isLocallyControlled to true
50
+ */
51
+ spawnLocalPlayerController<T extends BasePlayerController>(type: Constructable<T>, position?: Vector3, rotation?: Euler): Promise<T>;
35
52
  addActor(actor: BaseActor, position?: Vector3, rotation?: Euler): void;
36
53
  removeActor(actor: BaseActor): void;
37
54
  findActorByType<T extends BaseActor>(type: Constructable<T>, name?: string): T;
38
55
  findActorsByType<T extends BaseActor>(type: Constructable<T>, name?: string): T[];
56
+ /** Starts event graphs owned by prefabs that were materialized with the scene. */
57
+ startSceneEventGraphs(materializer: SceneMaterializer): Promise<void>;
58
+ /** Stops scene-owned graphs before their actors or materializer are disposed. */
59
+ stopSceneEventGraphs(): void;
60
+ private activateSceneEventGraph;
61
+ private deactivateSceneEventGraph;
39
62
  spawnPrefab(prefab: Prefab, position?: Vector3, rotation?: Euler): Promise<PrefabInstance>;
40
63
  removePrefab(instance: PrefabInstance): void;
41
64
  }
@@ -1,4 +1,4 @@
1
- import{__decorate as t}from"tslib";import{Service as r}from"typedi";import{BaseActor as o}from"../actors/actor.js";import{ActorFactory as e}from"../actors/factory.js";import{Vector3 as i}from"three";import{ActorComponent as s}from"../../gameplay/actors/component.js";import{Subject as n}from"rxjs";import{RenderingView as c}from"../../rendering.js";import{randomUUID as a}from"../../utils/uuid";import{PrefabInstance as h}from"../../scene/objects/prefab";import{PhysicsSystem as m}from"./physics/physics-system.js";import{inject as p}from"../../gameplay/inject.js";import{isComponentEnabledInEnvironment as l}from"../actors/internal/component-init.js";const f=new i;class d{constructor(t){this.view=t}get direction(){return this.view.csm.lightDirection}set intensity(t){this.view.csm.lightIntensity=t,this.view.csm.lights.forEach(t=>t.intensity=this.view.csm.lightIntensity)}get intensity(){return this.view.csm.lightIntensity}get position(){return 0==this.view.csm.lights.length?f:this.view.csm.lights[0].position}}let y=class{constructor(){this.actorFactory=p(e),this.view=p(c),this.physics=p(m),this.actors=[],this.actorAdded=new n,this.actorRemoved=new n,this.directionalLight=new d(this.view)}async spawnActor(t,r,o){if(null==t)throw new Error("Cannot spawn actor with null type");if("prefab"in t){const e=await this.spawnPrefab(t.prefab,r,o),i=e.mainActor;if(null==i)throw new Error(`Prefab has no main actor or there was an error when spwaning it. Prefab: ${JSON.stringify(t.prefab)}`);return i.disposed.subscribe(()=>{const t=e.actors.findIndex(t=>t===i);t>=0&&e.actors.splice(t,1),this.removePrefab(e)}),i}const e=await this.actorFactory.create(t,r,o);return this.addActor(e,r,o),e}spawnActorSync(t,r,o){if(null==t)throw new Error("Cannot spawn actor with null type");const e=this.actorFactory.createSync(t,r,o);return this.addActor(e,r,o),e}addActor(t,r,o){r&&t.object.position.copy(r),o&&t.object.rotation.copy(o),null==t.object.parent&&this.scene.add(t.object),this.actors.push(t),w(t,t=>t.onBeginPlay(),this.actorFactory.inEditor),this.actorAdded.next(t)}removeActor(t){w(t,t=>t.onEndPlay(),this.actorFactory.inEditor);const r=this.actors.indexOf(t);r>=0&&this.actors.splice(r,1),t.object.removeFromParent(),t.disposed.next(!0),this.actorRemoved.next(t),this.physics.removeActor(t)}findActorByType(t,r){return this.actors.find(o=>o instanceof t&&(null==r||o.object.name==r))}findActorsByType(t,r){return this.actors.filter(o=>o instanceof t&&(null==r||o.object.name==r))}async spawnPrefab(t,r,o){if(null==this.materializer)return console.error("Internal error: Materializer is missing on World"),null;const e=new h,{object:i,actors:s,mainActor:n}=await this.materializer.createFromPrefabAsset(t.asset,{sceneObjectChain:["r-"+a()]},void 0,void 0,!1);return e.object=i,e.actors=s,e.mainActor=n,this.scene.add(i),null!=r&&i.position.copy(r),null!=o&&i.rotation.copy(o),s.forEach(t=>{this.addActor(t)}),this.physics.addFromScene(i),e}removePrefab(t){t.actors.forEach(t=>this.removeActor(t)),t.object?.removeFromParent(),this.physics.removeRemoved(t.object)}};y=t([r()],y);export{y as World};function w(t,r,e=!1,i=new WeakSet){if(!i.has(t))return i.add(t),r(t),t instanceof o&&t.attachedComponents.forEach(t=>{l(t,e)&&w(t,r,e,i)}),Object.entries(t).filter(([t,r])=>r instanceof s&&l(r,e)).forEach(([t,o])=>{w(o,r,e,i)})}/*
1
+ import{__decorate as t}from"tslib";import{Service as e}from"typedi";import{BaseActor as r}from"../actors/actor.js";import{ActorFactory as s}from"../actors/factory.js";import{Group as o,Vector3 as i}from"three";import{ActorComponent as n}from"../../gameplay/actors/component.js";import{Subject as a}from"rxjs";import{RenderingView as c}from"../../rendering.js";import{randomUUID as h}from"../../utils/uuid";import{PrefabInstance as p}from"../../scene/objects/prefab";import{PhysicsSystem as l}from"./physics/physics-system.js";import{inject as d}from"../../gameplay/inject.js";import{isComponentEnabledInEnvironment as m}from"../actors/internal/component-init.js";import{NetRole as v}from"../net/service/net-actor-role.js";import{BasePlayerController as f}from"../actors/controller/actor-controller.js";import{EventGraphInstance as y}from"../event-graph/runtime.js";import{ViewController as w}from"./render.js";import{AssetsProvider as u}from"../../scene/assets-provider.js";import{WorldEventGraphAssetRuntime as b}from"../event-graph/runtime-assets.js";import{hasExecutableEventGraphDocument as E}from"../event-graph/model.js";const A=new i;class G{constructor(t){this.view=t}get direction(){return this.view.csm.lightDirection}set intensity(t){this.view.csm.lightIntensity=t,this.view.csm.lights.forEach(t=>t.intensity=this.view.csm.lightIntensity)}get intensity(){return this.view.csm.lightIntensity}get position(){return 0==this.view.csm.lights.length?A:this.view.csm.lights[0].position}}let g=class{constructor(){this.actorFactory=d(s),this.view=d(c),this.viewController=d(w),this.physics=d(l),this.assetsProvider=d(u),this.eventGraphAssets=new b(this,this.assetsProvider),this.actors=[],this.actorAdded=new a,this.actorRemoved=new a,this.directionalLight=new G(this.view),this.sceneEventGraphs=new Map,this.sceneEventGraphSubscriptions=[]}async spawnActor(t,e,r,s){if(null==t)throw new Error("Cannot spawn actor with null type");if("prefab"in t){const o=t.prefab,i=await this.spawnPrefab(o,e,r),n=i.mainActor;if(null==n)throw new Error(`Prefab has no main actor or there was an error when spwaning it. Prefab: ${JSON.stringify(o)}`);return n.disposed.subscribe(()=>{const t=i.actors.findIndex(t=>t===n);t>=0&&i.actors.splice(t,1),this.removePrefab(i)}),null!=s?.owner&&(n.owner=s.owner),n}const o=await this.actorFactory.create(t,e,r);return null!=s?.owner&&(o.owner=s.owner),this.addActor(o,e,r),o}async spawnActorWithNetInfo(t,e,r,s,o,i){const n=await this.actorFactory.create(t,o,i,!0),a=null!=s&&0!==s?this.actors.find(t=>t.__netid===s):null;return n.__netid=e,n.netRole=r,n.owner=a,n instanceof f&&(n.isLocallyControlled=r===v.autonomousProxy),this.actorFactory.initActor(n),this.addActor(n,o,i),n}async spawnLocalPlayerController(t,e,r){const s=await this.actorFactory.create(t,e,r,!0);return s.isLocallyControlled=!0,this.actorFactory.initActor(s),this.addActor(s,e,r),s}spawnActorSync(t,e,r){if(null==t)throw new Error("Cannot spawn actor with null type");const s=this.actorFactory.createSync(t,e,r);return this.addActor(s,e,r),s}addActor(t,e,r){e&&t.object.position.copy(e),r&&t.object.rotation.copy(r),null==t.object.parent&&this.scene.add(t.object),this.actors.push(t),j(t,t=>t.onBeginPlay(),this.actorFactory.inEditor),this.actorAdded.next(t)}removeActor(t){for(const[e,r]of[...this.sceneEventGraphs])r.binding.mainActor===t&&this.deactivateSceneEventGraph(e);j(t,t=>t.onEndPlay(),this.actorFactory.inEditor);const e=this.actors.indexOf(t);e>=0&&this.actors.splice(e,1),t.object.removeFromParent(),t.disposed.next(!0),this.actorRemoved.next(t),this.physics.removeActor(t)}findActorByType(t,e){return this.actors.find(r=>r instanceof t&&(null==e||r.object.name==e))}findActorsByType(t,e){return this.actors.filter(r=>r instanceof t&&(null==e||r.object.name==e))}resolveSceneActor(t){return this.materializer?.resolveSceneActor(t)}async startSceneEventGraphs(t){this.stopSceneEventGraphs(),this.sceneEventGraphSubscriptions.push(t.prefabEventGraphAdded$.subscribe(t=>{this.activateSceneEventGraph(t).catch(e=>{console.error(`Failed to start scene prefab event graph ${JSON.stringify(t.id)}`,e)})}),t.prefabEventGraphRemoved$.subscribe(t=>{this.deactivateSceneEventGraph(t.id);for(const e of t.actors)this.actors.includes(e)&&this.removeActor(e)}));for(const e of t.prefabEventGraphInstances)await this.activateSceneEventGraph(e)}stopSceneEventGraphs(){for(const t of this.sceneEventGraphSubscriptions)t.unsubscribe();this.sceneEventGraphSubscriptions.length=0;for(const t of[...this.sceneEventGraphs.keys()])this.deactivateSceneEventGraph(t)}async activateSceneEventGraph(t){if(this.sceneEventGraphs.has(t.id))return;for(const e of t.actors)this.actors.includes(e)||this.addActor(e);const e=new y(t.graph,{world:this,actorsById:t.actorsById,mainActor:t.mainActor,updates:this.viewController.onUpdate(),timer:this.viewController,physics:this.physics,assets:this.eventGraphAssets});this.sceneEventGraphs.set(t.id,{binding:t,runtime:e});try{await e.beginPlay()}catch(r){throw this.sceneEventGraphs.delete(t.id),e.endPlay(),r}}deactivateSceneEventGraph(t){const e=this.sceneEventGraphs.get(t);null!=e&&(this.sceneEventGraphs.delete(t),e.runtime.endPlay())}async spawnPrefab(t,e,r){if(null==this.materializer)return console.error("Internal error: Materializer is missing on World"),null;const s=new p,i=new o;null!=e&&i.position.copy(e),null!=r&&i.rotation.copy(r),this.materializer.setScene(this.scene),this.materializer.inEditor=this.actorFactory.inEditor;const{object:n,actors:a,actorsById:c,mainActor:l}=await this.materializer.createFromPrefabAsset(t.asset,{sceneObjectChain:["r-"+h()],runtimeSpawn:!0},i,void 0,!1);s.object=n,s.actors=a,s.mainActor=l,this.scene.attach(n),a.forEach(t=>{this.addActor(t)}),this.physics.addFromScene(n);const d=t.asset.prefab?.eventGraph;if(!this.actorFactory.inEditor&&E(d)){s.eventGraph=new y(d,{world:this,actorsById:c,mainActor:l,updates:this.viewController.onUpdate(),timer:this.viewController,physics:this.physics,assets:this.eventGraphAssets});try{await s.eventGraph.beginPlay()}catch(t){throw this.removePrefab(s),t}}return s}removePrefab(t){if(t.destroyed)return;t.destroyed=!0,t.eventGraph?.endPlay(),t.eventGraph=void 0;t.actors.splice(0).forEach(t=>this.removeActor(t)),t.object?.removeFromParent(),this.physics.removeRemoved(t.object)}};g=t([e()],g);export{g as World};function j(t,e,s=!1,o=new WeakSet){if(!o.has(t))return o.add(t),e(t),t instanceof r&&t.attachedComponents.forEach(t=>{m(t,s)&&j(t,e,s,o)}),Object.entries(t).filter(([t,e])=>e instanceof n&&m(e,s)).forEach(([t,r])=>{j(r,e,s,o)})}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -1,4 +1,4 @@
1
- import{Color as t,NoToneMapping as n,Texture as e,Vector3 as i}from"three";import{ShaderPass as a}from"three-stdlib";export class ColorPass extends a{constructor(){super({uniforms:{tDiffuse:{value:new e},whiteBalanceEnabled:{value:!1},whiteBalanceScale:{value:new i(1,1,1)},vignetteEnabled:{value:!1},vignetteIntensity:{value:.5},colorTintEnabled:{value:!1},colorTint:{value:new i(1,1,1)},colorTintIntensity:{value:0},colorGradingEnabled:{value:!1},toneMappingMode:{value:n},toneMappingEnabled:{value:!1},toneMappingExposure:{value:1},globalSaturation:{value:new i(1,1,1)},globalContrast:{value:new i(1,1,1)},globalGamma:{value:new i(1,1,1)},globalGain:{value:new i(1,1,1)},globalOffset:{value:new i(0,0,0)},shadowsSaturation:{value:new i(1,1,1)},shadowsContrast:{value:new i(1,1,1)},shadowsGamma:{value:new i(1,1,1)},shadowsGain:{value:new i(1,1,1)},shadowsOffset:{value:new i(0,0,0)},shadowsMax:{value:.09},midtonesSaturation:{value:new i(1,1,1)},midtonesContrast:{value:new i(1,1,1)},midtonesGamma:{value:new i(1,1,1)},midtonesGain:{value:new i(1,1,1)},midtonesOffset:{value:new i(0,0,0)},highlightsSaturation:{value:new i(1,1,1)},highlightsContrast:{value:new i(1,1,1)},highlightsGamma:{value:new i(1,1,1)},highlightsGain:{value:new i(1,1,1)},highlightsOffset:{value:new i(0,0,0)},highlightsMin:{value:.5}},vertexShader:"\n varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform bool whiteBalanceEnabled;\n uniform vec3 whiteBalanceScale;\n uniform bool vignetteEnabled;\n uniform float vignetteIntensity;\n uniform bool colorTintEnabled;\n uniform vec3 colorTint;\n uniform float colorTintIntensity;\n uniform bool colorGradingEnabled;\n uniform int toneMappingMode;\n uniform bool toneMappingEnabled;\n uniform vec3 globalSaturation;\n uniform vec3 globalContrast;\n uniform vec3 globalGamma;\n uniform vec3 globalGain;\n uniform vec3 globalOffset;\n uniform vec3 shadowsSaturation;\n uniform vec3 shadowsContrast;\n uniform vec3 shadowsGamma;\n uniform vec3 shadowsGain;\n uniform vec3 shadowsOffset;\n uniform float shadowsMax;\n uniform vec3 midtonesSaturation;\n uniform vec3 midtonesContrast;\n uniform vec3 midtonesGamma;\n uniform vec3 midtonesGain;\n uniform vec3 midtonesOffset;\n uniform vec3 highlightsSaturation;\n uniform vec3 highlightsContrast;\n uniform vec3 highlightsGamma;\n uniform vec3 highlightsGain;\n uniform vec3 highlightsOffset;\n uniform float highlightsMin;\n\n varying vec2 vUv;\n\n #include <tonemapping_pars_fragment>\n\n const vec3 LUMA = vec3(0.2126, 0.7152, 0.0722);\n\n vec3 applySaturation(vec3 color, vec3 saturation) {\n vec3 luminanceColor = vec3(dot(color, LUMA));\n return mix(luminanceColor, color, saturation);\n }\n\n vec3 applyContrast(vec3 color, vec3 contrast) {\n return (color - vec3(0.18)) * contrast + vec3(0.18);\n }\n\n vec3 applyGamma(vec3 color, vec3 gammaValue) {\n return pow(max(color, vec3(0.0)), vec3(1.0) / max(gammaValue, vec3(1e-4)));\n }\n\n vec3 applyGain(vec3 color, vec3 gainValue) {\n return color * gainValue;\n }\n\n vec3 applyOffset(vec3 color, vec3 offsetValue) {\n return color + offsetValue;\n }\n\n vec3 applyGrade(vec3 color, vec3 saturation, vec3 contrast, vec3 gammaValue, vec3 gainValue, vec3 offsetValue) {\n color = applySaturation(color, saturation);\n color = applyContrast(color, contrast);\n color = applyGamma(color, gammaValue);\n color = applyGain(color, gainValue);\n color = applyOffset(color, offsetValue);\n return max(color, vec3(0.0));\n }\n\n vec3 applyToneMappingMode(vec3 color) {\n if (toneMappingMode == 1) return LinearToneMapping(color);\n if (toneMappingMode == 2) return ReinhardToneMapping(color);\n if (toneMappingMode == 3) return CineonToneMapping(color);\n if (toneMappingMode == 4) return ACESFilmicToneMapping(color);\n if (toneMappingMode == 6) return AgXToneMapping(color);\n if (toneMappingMode == 7) return NeutralToneMapping(color);\n return color;\n }\n\n void main() {\n vec3 color = texture2D(tDiffuse, vUv).rgb;\n\n if (whiteBalanceEnabled) {\n color *= whiteBalanceScale;\n }\n\n if (colorTintEnabled) {\n color = mix(color, color * colorTint, clamp(colorTintIntensity, 0.0, 1.0));\n }\n\n if (colorGradingEnabled) {\n float shadowLimit = clamp(shadowsMax, 0.0, 0.98);\n float highlightLimit = clamp(max(highlightsMin, shadowLimit + 0.02), 0.02, 1.0);\n float luminance = clamp(dot(color, LUMA), 0.0, 1.0);\n\n float shadowTransition = max(0.02, min(0.25, shadowLimit + 0.05));\n float highlightTransition = max(0.02, min(0.25, (1.0 - highlightLimit) + 0.05));\n\n float shadowWeight = 1.0 - smoothstep(shadowLimit, min(1.0, shadowLimit + shadowTransition), luminance);\n float highlightWeight = smoothstep(max(0.0, highlightLimit - highlightTransition), highlightLimit, luminance);\n float midtoneWeight = clamp(1.0 - shadowWeight - highlightWeight, 0.0, 1.0);\n\n vec3 saturation = globalSaturation;\n vec3 contrast = globalContrast;\n vec3 gammaValue = globalGamma;\n vec3 gainValue = globalGain;\n vec3 offsetValue = globalOffset;\n\n saturation *= mix(vec3(1.0), shadowsSaturation, shadowWeight);\n saturation *= mix(vec3(1.0), midtonesSaturation, midtoneWeight);\n saturation *= mix(vec3(1.0), highlightsSaturation, highlightWeight);\n\n contrast *= mix(vec3(1.0), shadowsContrast, shadowWeight);\n contrast *= mix(vec3(1.0), midtonesContrast, midtoneWeight);\n contrast *= mix(vec3(1.0), highlightsContrast, highlightWeight);\n\n gammaValue *= mix(vec3(1.0), shadowsGamma, shadowWeight);\n gammaValue *= mix(vec3(1.0), midtonesGamma, midtoneWeight);\n gammaValue *= mix(vec3(1.0), highlightsGamma, highlightWeight);\n\n gainValue *= mix(vec3(1.0), shadowsGain, shadowWeight);\n gainValue *= mix(vec3(1.0), midtonesGain, midtoneWeight);\n gainValue *= mix(vec3(1.0), highlightsGain, highlightWeight);\n\n offsetValue += shadowsOffset * shadowWeight;\n offsetValue += midtonesOffset * midtoneWeight;\n offsetValue += highlightsOffset * highlightWeight;\n\n color = applyGrade(color, saturation, contrast, gammaValue, gainValue, offsetValue);\n }\n\n if (toneMappingEnabled) {\n color = applyToneMappingMode(color);\n }\n\n if (vignetteEnabled) {\n float d = distance(vUv, vec2(0.5));\n float offset = 0.2;\n float vignette = smoothstep(0.8, offset * 0.799, d * (vignetteIntensity + offset));\n color *= vignette;\n }\n\n gl_FragColor = vec4(color, 1.0);\n }\n "});const t=this.material;t.toneMapped=!1,t.depthWrite=!1,t.depthTest=!1}set vignetteEnabled(t){this.uniforms.vignetteEnabled.value=t}get vignetteEnabled(){return this.uniforms.vignetteEnabled.value}set whiteBalanceEnabled(t){this.uniforms.whiteBalanceEnabled.value=t}get whiteBalanceEnabled(){return this.uniforms.whiteBalanceEnabled.value}set whiteBalanceScale(t){this.setVec3Uniform("whiteBalanceScale",t)}get whiteBalanceScale(){return this.getVec3Uniform("whiteBalanceScale")}set vignetteIntensity(t){this.uniforms.vignetteIntensity.value=t}get vignetteIntensity(){return this.uniforms.vignetteIntensity.value}set colorTintEnabled(t){this.uniforms.colorTintEnabled.value=t}get colorTintEnabled(){return this.uniforms.colorTintEnabled.value}set colorTint(t){this.setVec3Uniform("colorTint",t)}get colorTint(){return(new t).setFromVector3(this.getVec3Uniform("colorTint"))}set colorTintIntensity(t){this.uniforms.colorTintIntensity.value=t}get colorTintIntensity(){return this.uniforms.colorTintIntensity.value}set colorGradingEnabled(t){this.uniforms.colorGradingEnabled.value=t}get colorGradingEnabled(){return this.uniforms.colorGradingEnabled.value}set toneMapping(t){this.uniforms.toneMappingMode.value=t??n}get toneMapping(){return this.uniforms.toneMappingMode.value}set toneMappingEnabled(t){this.uniforms.toneMappingEnabled.value=t}get toneMappingEnabled(){return this.uniforms.toneMappingEnabled.value}set toneMappingExposure(t){this.uniforms.toneMappingExposure.value=t}get toneMappingExposure(){return this.uniforms.toneMappingExposure.value}set globalSaturation(t){this.setVec3Uniform("globalSaturation",t)}get globalSaturation(){return this.getVec3Uniform("globalSaturation")}set globalContrast(t){this.setVec3Uniform("globalContrast",t)}get globalContrast(){return this.getVec3Uniform("globalContrast")}set globalGamma(t){this.setVec3Uniform("globalGamma",t)}get globalGamma(){return this.getVec3Uniform("globalGamma")}set globalGain(t){this.setVec3Uniform("globalGain",t)}get globalGain(){return this.getVec3Uniform("globalGain")}set globalOffset(t){this.setVec3Uniform("globalOffset",t)}get globalOffset(){return this.getVec3Uniform("globalOffset")}set shadowsSaturation(t){this.setVec3Uniform("shadowsSaturation",t)}get shadowsSaturation(){return this.getVec3Uniform("shadowsSaturation")}set shadowsContrast(t){this.setVec3Uniform("shadowsContrast",t)}get shadowsContrast(){return this.getVec3Uniform("shadowsContrast")}set shadowsGamma(t){this.setVec3Uniform("shadowsGamma",t)}get shadowsGamma(){return this.getVec3Uniform("shadowsGamma")}set shadowsGain(t){this.setVec3Uniform("shadowsGain",t)}get shadowsGain(){return this.getVec3Uniform("shadowsGain")}set shadowsOffset(t){this.setVec3Uniform("shadowsOffset",t)}get shadowsOffset(){return this.getVec3Uniform("shadowsOffset")}set shadowsMax(t){this.uniforms.shadowsMax.value=t}get shadowsMax(){return this.uniforms.shadowsMax.value}set midtonesSaturation(t){this.setVec3Uniform("midtonesSaturation",t)}get midtonesSaturation(){return this.getVec3Uniform("midtonesSaturation")}set midtonesContrast(t){this.setVec3Uniform("midtonesContrast",t)}get midtonesContrast(){return this.getVec3Uniform("midtonesContrast")}set midtonesGamma(t){this.setVec3Uniform("midtonesGamma",t)}get midtonesGamma(){return this.getVec3Uniform("midtonesGamma")}set midtonesGain(t){this.setVec3Uniform("midtonesGain",t)}get midtonesGain(){return this.getVec3Uniform("midtonesGain")}set midtonesOffset(t){this.setVec3Uniform("midtonesOffset",t)}get midtonesOffset(){return this.getVec3Uniform("midtonesOffset")}set highlightsSaturation(t){this.setVec3Uniform("highlightsSaturation",t)}get highlightsSaturation(){return this.getVec3Uniform("highlightsSaturation")}set highlightsContrast(t){this.setVec3Uniform("highlightsContrast",t)}get highlightsContrast(){return this.getVec3Uniform("highlightsContrast")}set highlightsGamma(t){this.setVec3Uniform("highlightsGamma",t)}get highlightsGamma(){return this.getVec3Uniform("highlightsGamma")}set highlightsGain(t){this.setVec3Uniform("highlightsGain",t)}get highlightsGain(){return this.getVec3Uniform("highlightsGain")}set highlightsOffset(t){this.setVec3Uniform("highlightsOffset",t)}get highlightsOffset(){return this.getVec3Uniform("highlightsOffset")}set highlightsMin(t){this.uniforms.highlightsMin.value=t}get highlightsMin(){return this.uniforms.highlightsMin.value}setVec3Uniform(n,e){const i=this.uniforms[n].value;e instanceof t?i.set(e.r,e.g,e.b):i.copy(e)}getVec3Uniform(t){return this.uniforms[t].value}}/*
1
+ import{Color as t,NoToneMapping as n,Vector3 as e}from"three";import{ShaderPass as i}from"three-stdlib";import{createPlaceholderTexture as a}from"../utils/three/placeholder-texture.js";export class ColorPass extends i{constructor(){super({uniforms:{tDiffuse:{value:a()},whiteBalanceEnabled:{value:!1},whiteBalanceScale:{value:new e(1,1,1)},vignetteEnabled:{value:!1},vignetteIntensity:{value:.5},colorTintEnabled:{value:!1},colorTint:{value:new e(1,1,1)},colorTintIntensity:{value:0},colorGradingEnabled:{value:!1},toneMappingMode:{value:n},toneMappingEnabled:{value:!1},toneMappingExposure:{value:1},globalSaturation:{value:new e(1,1,1)},globalContrast:{value:new e(1,1,1)},globalGamma:{value:new e(1,1,1)},globalGain:{value:new e(1,1,1)},globalOffset:{value:new e(0,0,0)},shadowsSaturation:{value:new e(1,1,1)},shadowsContrast:{value:new e(1,1,1)},shadowsGamma:{value:new e(1,1,1)},shadowsGain:{value:new e(1,1,1)},shadowsOffset:{value:new e(0,0,0)},shadowsMax:{value:.09},midtonesSaturation:{value:new e(1,1,1)},midtonesContrast:{value:new e(1,1,1)},midtonesGamma:{value:new e(1,1,1)},midtonesGain:{value:new e(1,1,1)},midtonesOffset:{value:new e(0,0,0)},highlightsSaturation:{value:new e(1,1,1)},highlightsContrast:{value:new e(1,1,1)},highlightsGamma:{value:new e(1,1,1)},highlightsGain:{value:new e(1,1,1)},highlightsOffset:{value:new e(0,0,0)},highlightsMin:{value:.5}},vertexShader:"\n varying vec2 vUv;\n\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform bool whiteBalanceEnabled;\n uniform vec3 whiteBalanceScale;\n uniform bool vignetteEnabled;\n uniform float vignetteIntensity;\n uniform bool colorTintEnabled;\n uniform vec3 colorTint;\n uniform float colorTintIntensity;\n uniform bool colorGradingEnabled;\n uniform int toneMappingMode;\n uniform bool toneMappingEnabled;\n uniform vec3 globalSaturation;\n uniform vec3 globalContrast;\n uniform vec3 globalGamma;\n uniform vec3 globalGain;\n uniform vec3 globalOffset;\n uniform vec3 shadowsSaturation;\n uniform vec3 shadowsContrast;\n uniform vec3 shadowsGamma;\n uniform vec3 shadowsGain;\n uniform vec3 shadowsOffset;\n uniform float shadowsMax;\n uniform vec3 midtonesSaturation;\n uniform vec3 midtonesContrast;\n uniform vec3 midtonesGamma;\n uniform vec3 midtonesGain;\n uniform vec3 midtonesOffset;\n uniform vec3 highlightsSaturation;\n uniform vec3 highlightsContrast;\n uniform vec3 highlightsGamma;\n uniform vec3 highlightsGain;\n uniform vec3 highlightsOffset;\n uniform float highlightsMin;\n\n varying vec2 vUv;\n\n #include <tonemapping_pars_fragment>\n\n const vec3 LUMA = vec3(0.2126, 0.7152, 0.0722);\n\n vec3 applySaturation(vec3 color, vec3 saturation) {\n vec3 luminanceColor = vec3(dot(color, LUMA));\n return mix(luminanceColor, color, saturation);\n }\n\n vec3 applyContrast(vec3 color, vec3 contrast) {\n return (color - vec3(0.18)) * contrast + vec3(0.18);\n }\n\n vec3 applyGamma(vec3 color, vec3 gammaValue) {\n return pow(max(color, vec3(0.0)), vec3(1.0) / max(gammaValue, vec3(1e-4)));\n }\n\n vec3 applyGain(vec3 color, vec3 gainValue) {\n return color * gainValue;\n }\n\n vec3 applyOffset(vec3 color, vec3 offsetValue) {\n return color + offsetValue;\n }\n\n vec3 applyGrade(vec3 color, vec3 saturation, vec3 contrast, vec3 gammaValue, vec3 gainValue, vec3 offsetValue) {\n color = applySaturation(color, saturation);\n color = applyContrast(color, contrast);\n color = applyGamma(color, gammaValue);\n color = applyGain(color, gainValue);\n color = applyOffset(color, offsetValue);\n return max(color, vec3(0.0));\n }\n\n vec3 applyToneMappingMode(vec3 color) {\n if (toneMappingMode == 1) return LinearToneMapping(color);\n if (toneMappingMode == 2) return ReinhardToneMapping(color);\n if (toneMappingMode == 3) return CineonToneMapping(color);\n if (toneMappingMode == 4) return ACESFilmicToneMapping(color);\n if (toneMappingMode == 6) return AgXToneMapping(color);\n if (toneMappingMode == 7) return NeutralToneMapping(color);\n return color;\n }\n\n void main() {\n vec3 color = texture2D(tDiffuse, vUv).rgb;\n\n if (whiteBalanceEnabled) {\n color *= whiteBalanceScale;\n }\n\n if (colorTintEnabled) {\n color = mix(color, color * colorTint, clamp(colorTintIntensity, 0.0, 1.0));\n }\n\n if (colorGradingEnabled) {\n float shadowLimit = clamp(shadowsMax, 0.0, 0.98);\n float highlightLimit = clamp(max(highlightsMin, shadowLimit + 0.02), 0.02, 1.0);\n float luminance = clamp(dot(color, LUMA), 0.0, 1.0);\n\n float shadowTransition = max(0.02, min(0.25, shadowLimit + 0.05));\n float highlightTransition = max(0.02, min(0.25, (1.0 - highlightLimit) + 0.05));\n\n float shadowWeight = 1.0 - smoothstep(shadowLimit, min(1.0, shadowLimit + shadowTransition), luminance);\n float highlightWeight = smoothstep(max(0.0, highlightLimit - highlightTransition), highlightLimit, luminance);\n float midtoneWeight = clamp(1.0 - shadowWeight - highlightWeight, 0.0, 1.0);\n\n vec3 saturation = globalSaturation;\n vec3 contrast = globalContrast;\n vec3 gammaValue = globalGamma;\n vec3 gainValue = globalGain;\n vec3 offsetValue = globalOffset;\n\n saturation *= mix(vec3(1.0), shadowsSaturation, shadowWeight);\n saturation *= mix(vec3(1.0), midtonesSaturation, midtoneWeight);\n saturation *= mix(vec3(1.0), highlightsSaturation, highlightWeight);\n\n contrast *= mix(vec3(1.0), shadowsContrast, shadowWeight);\n contrast *= mix(vec3(1.0), midtonesContrast, midtoneWeight);\n contrast *= mix(vec3(1.0), highlightsContrast, highlightWeight);\n\n gammaValue *= mix(vec3(1.0), shadowsGamma, shadowWeight);\n gammaValue *= mix(vec3(1.0), midtonesGamma, midtoneWeight);\n gammaValue *= mix(vec3(1.0), highlightsGamma, highlightWeight);\n\n gainValue *= mix(vec3(1.0), shadowsGain, shadowWeight);\n gainValue *= mix(vec3(1.0), midtonesGain, midtoneWeight);\n gainValue *= mix(vec3(1.0), highlightsGain, highlightWeight);\n\n offsetValue += shadowsOffset * shadowWeight;\n offsetValue += midtonesOffset * midtoneWeight;\n offsetValue += highlightsOffset * highlightWeight;\n\n color = applyGrade(color, saturation, contrast, gammaValue, gainValue, offsetValue);\n }\n\n if (toneMappingEnabled) {\n color = applyToneMappingMode(color);\n }\n\n if (vignetteEnabled) {\n float d = distance(vUv, vec2(0.5));\n float offset = 0.2;\n float vignette = smoothstep(0.8, offset * 0.799, d * (vignetteIntensity + offset));\n color *= vignette;\n }\n\n gl_FragColor = vec4(color, 1.0);\n }\n "});const t=this.material;t.toneMapped=!1,t.depthWrite=!1,t.depthTest=!1}set vignetteEnabled(t){this.uniforms.vignetteEnabled.value=t}get vignetteEnabled(){return this.uniforms.vignetteEnabled.value}set whiteBalanceEnabled(t){this.uniforms.whiteBalanceEnabled.value=t}get whiteBalanceEnabled(){return this.uniforms.whiteBalanceEnabled.value}set whiteBalanceScale(t){this.setVec3Uniform("whiteBalanceScale",t)}get whiteBalanceScale(){return this.getVec3Uniform("whiteBalanceScale")}set vignetteIntensity(t){this.uniforms.vignetteIntensity.value=t}get vignetteIntensity(){return this.uniforms.vignetteIntensity.value}set colorTintEnabled(t){this.uniforms.colorTintEnabled.value=t}get colorTintEnabled(){return this.uniforms.colorTintEnabled.value}set colorTint(t){this.setVec3Uniform("colorTint",t)}get colorTint(){return(new t).setFromVector3(this.getVec3Uniform("colorTint"))}set colorTintIntensity(t){this.uniforms.colorTintIntensity.value=t}get colorTintIntensity(){return this.uniforms.colorTintIntensity.value}set colorGradingEnabled(t){this.uniforms.colorGradingEnabled.value=t}get colorGradingEnabled(){return this.uniforms.colorGradingEnabled.value}set toneMapping(t){this.uniforms.toneMappingMode.value=t??n}get toneMapping(){return this.uniforms.toneMappingMode.value}set toneMappingEnabled(t){this.uniforms.toneMappingEnabled.value=t}get toneMappingEnabled(){return this.uniforms.toneMappingEnabled.value}set toneMappingExposure(t){this.uniforms.toneMappingExposure.value=t}get toneMappingExposure(){return this.uniforms.toneMappingExposure.value}set globalSaturation(t){this.setVec3Uniform("globalSaturation",t)}get globalSaturation(){return this.getVec3Uniform("globalSaturation")}set globalContrast(t){this.setVec3Uniform("globalContrast",t)}get globalContrast(){return this.getVec3Uniform("globalContrast")}set globalGamma(t){this.setVec3Uniform("globalGamma",t)}get globalGamma(){return this.getVec3Uniform("globalGamma")}set globalGain(t){this.setVec3Uniform("globalGain",t)}get globalGain(){return this.getVec3Uniform("globalGain")}set globalOffset(t){this.setVec3Uniform("globalOffset",t)}get globalOffset(){return this.getVec3Uniform("globalOffset")}set shadowsSaturation(t){this.setVec3Uniform("shadowsSaturation",t)}get shadowsSaturation(){return this.getVec3Uniform("shadowsSaturation")}set shadowsContrast(t){this.setVec3Uniform("shadowsContrast",t)}get shadowsContrast(){return this.getVec3Uniform("shadowsContrast")}set shadowsGamma(t){this.setVec3Uniform("shadowsGamma",t)}get shadowsGamma(){return this.getVec3Uniform("shadowsGamma")}set shadowsGain(t){this.setVec3Uniform("shadowsGain",t)}get shadowsGain(){return this.getVec3Uniform("shadowsGain")}set shadowsOffset(t){this.setVec3Uniform("shadowsOffset",t)}get shadowsOffset(){return this.getVec3Uniform("shadowsOffset")}set shadowsMax(t){this.uniforms.shadowsMax.value=t}get shadowsMax(){return this.uniforms.shadowsMax.value}set midtonesSaturation(t){this.setVec3Uniform("midtonesSaturation",t)}get midtonesSaturation(){return this.getVec3Uniform("midtonesSaturation")}set midtonesContrast(t){this.setVec3Uniform("midtonesContrast",t)}get midtonesContrast(){return this.getVec3Uniform("midtonesContrast")}set midtonesGamma(t){this.setVec3Uniform("midtonesGamma",t)}get midtonesGamma(){return this.getVec3Uniform("midtonesGamma")}set midtonesGain(t){this.setVec3Uniform("midtonesGain",t)}get midtonesGain(){return this.getVec3Uniform("midtonesGain")}set midtonesOffset(t){this.setVec3Uniform("midtonesOffset",t)}get midtonesOffset(){return this.getVec3Uniform("midtonesOffset")}set highlightsSaturation(t){this.setVec3Uniform("highlightsSaturation",t)}get highlightsSaturation(){return this.getVec3Uniform("highlightsSaturation")}set highlightsContrast(t){this.setVec3Uniform("highlightsContrast",t)}get highlightsContrast(){return this.getVec3Uniform("highlightsContrast")}set highlightsGamma(t){this.setVec3Uniform("highlightsGamma",t)}get highlightsGamma(){return this.getVec3Uniform("highlightsGamma")}set highlightsGain(t){this.setVec3Uniform("highlightsGain",t)}get highlightsGain(){return this.getVec3Uniform("highlightsGain")}set highlightsOffset(t){this.setVec3Uniform("highlightsOffset",t)}get highlightsOffset(){return this.getVec3Uniform("highlightsOffset")}set highlightsMin(t){this.uniforms.highlightsMin.value=t}get highlightsMin(){return this.uniforms.highlightsMin.value}setVec3Uniform(n,e){const i=this.uniforms[n].value;e instanceof t?i.set(e.r,e.g,e.b):i.copy(e)}getVec3Uniform(t){return this.uniforms[t].value}}/*
2
2
  * Copyright (©) 2026 Hology Interactive AB. All rights reserved.
3
3
  * See the LICENSE.md file for details.
4
4
  */
@@ -256,8 +256,10 @@ export declare class RenderingView {
256
256
  loop(onFrame: (deltaTime: number) => any, showStats?: boolean): void;
257
257
  private gBufferCachedMaterials;
258
258
  private gBufferCachedVisibility;
259
+ private gBufferCachedOnBeforeRender;
259
260
  private applyGBufferMaterials;
260
261
  private unapplyGBufferMaterials;
262
+ private applyGBufferShadowUniformUpdater;
261
263
  initTextures(scene?: THREE.Scene): void;
262
264
  private _initiatedMaterialTextures;
263
265
  private _initiatedTextures;