391e4f155fb0b356657b68602a20267fa9143fb50830cd82625e3406688a3718.json 304 KB

1
  1. {"ast":null,"code":"import { Matrix, Quaternion, TmpVectors, Vector3 } from \"../../../Maths/math.vector.js\";\nimport { PhysicsPrestepType } from \"../IPhysicsEnginePlugin.js\";\nimport { Logger } from \"../../../Misc/logger.js\";\nimport { PhysicsShape } from \"../physicsShape.js\";\nimport { BoundingBox } from \"../../../Culling/boundingBox.js\";\nimport { Mesh } from \"../../../Meshes/mesh.js\";\nimport { InstancedMesh } from \"../../../Meshes/instancedMesh.js\";\nimport { VertexBuffer } from \"../../../Buffers/buffer.js\";\nimport { BuildArray } from \"../../../Misc/arrayTools.js\";\nimport { Observable } from \"../../../Misc/observable.js\";\nclass MeshAccumulator {\n /**\n * Constructor of the mesh accumulator\n * @param mesh - The mesh used to compute the world matrix.\n * @param collectIndices - use mesh indices\n * @param scene - The scene used to determine the right handed system.\n *\n * Merge mesh and its children so whole hierarchy can be used as a mesh shape or convex hull\n */\n constructor(mesh, collectIndices, scene) {\n this._vertices = []; /// Vertices in body space\n this._indices = [];\n this._isRightHanded = scene.useRightHandedSystem;\n this._collectIndices = collectIndices;\n }\n /**\n * Adds a mesh to the physics engine.\n * @param mesh The mesh to add.\n * @param includeChildren Whether to include the children of the mesh.\n *\n * This method adds a mesh to the physics engine by computing the world matrix,\n * multiplying it with the body from world matrix, and then transforming the\n * coordinates of the mesh's vertices. It also adds the indices of the mesh\n * to the physics engine. If includeChildren is true, it will also add the\n * children of the mesh to the physics engine, ignoring any children which\n * have a physics impostor. This is useful for creating a physics engine\n * that accurately reflects the mesh and its children.\n */\n addNodeMeshes(mesh, includeChildren) {\n // Force absoluteScaling to be computed; we're going to use that to bake\n // the scale of any parent nodes into this shape, as physics engines\n // usually use rigid transforms, so can't handle arbitrary scale.\n mesh.computeWorldMatrix(true);\n const rootScaled = TmpVectors.Matrix[0];\n Matrix.ScalingToRef(mesh.absoluteScaling.x, mesh.absoluteScaling.y, mesh.absoluteScaling.z, rootScaled);\n if (mesh instanceof Mesh) {\n this._addMesh(mesh, rootScaled);\n } else if (mesh instanceof InstancedMesh) {\n this._addMesh(mesh.sourceMesh, rootScaled);\n }\n if (includeChildren) {\n const worldToRoot = TmpVectors.Matrix[1];\n mesh.computeWorldMatrix().invertToRef(worldToRoot);\n const worldToRootScaled = TmpVectors.Matrix[2];\n worldToRoot.multiplyToRef(rootScaled, worldToRootScaled);\n const children = mesh.getChildMeshes(false);\n // Ignore any children which have a physics body.\n // Other plugin implementations do not have this check, which appears to be\n // a bug, as otherwise, the mesh will have a duplicate collider\n children.filter(m => !m.physicsBody).forEach(m => {\n const childToWorld = m.computeWorldMatrix();\n const childToRootScaled = TmpVectors.Matrix[3];\n childToWorld.multiplyToRef(worldToRootScaled, childToRootScaled);\n if (m instanceof Mesh) {\n this._addMesh(m, childToRootScaled);\n } else if (m instanceof InstancedMesh) {\n this._addMesh(m.sourceMesh, childToRootScaled);\n }\n });\n }\n }\n _addMesh(mesh, meshToRoot) {\n const vertexData = mesh.getVerticesData(VertexBuffer.PositionKind) || [];\n const numVerts = vertexData.length / 3;\n const indexOffset = this._vertices.length;\n for (let v = 0; v < numVerts; v++) {\n const pos = new Vector3(vertexData[v * 3 + 0], vertexData[v * 3 + 1], vertexData[v * 3 + 2]);\n this._vertices.push(Vector3.TransformCoordinates(pos, meshToRoot));\n }\n if (this._collectIndices) {\n const meshIndices = mesh.getIndices();\n if (meshIndices) {\n for (let i = 0; i < meshIndices.length; i += 3) {\n // Havok wants the correct triangle winding to enable the interior triangle optimization\n if (this._isRightHanded) {\n this._indices.push(meshIndices[i + 0] + indexOffset);\n this._indices.push(meshIndices[i + 1] + indexOffset);\n this._indices.push(meshIndices[i + 2] + indexOffset);\n } else {\n this._indices.push(meshIndices[i + 2] + indexOffset);\n this._indices.push(meshIndices[i + 1] + indexOffset);\n this._indices.push(meshIndices[i + 0] + indexOffset);\n }\n }\n }\n }\n }\n /**\n * Allocate and populate the vertex positions inside the physics plugin.\n *\n * @param plugin - The plugin to allocate the memory in.\n * @returns An array of floats, whose backing memory is inside the plugin. The array contains the\n * positions of the mesh vertices, where a position is defined by three floats. You must call\n * freeBuffer() on the returned array once you have finished with it, in order to free the\n * memory inside the plugin..\n */\n getVertices(plugin) {\n const nFloats = this._vertices.length * 3;\n const bytesPerFloat = 4;\n const nBytes = nFloats * bytesPerFloat;\n const bufferBegin = plugin._malloc(nBytes);\n const ret = new Float32Array(plugin.HEAPU8.buffer, bufferBegin, nFloats);\n for (let i = 0; i < this._vertices.length; i++) {\n ret[i * 3 + 0] = this._vertices[i].x;\n ret[i * 3 + 1] = this._vertices[i].y;\n ret[i * 3 + 2] = this._vertices[i].z;\n }\n return {\n offset: bufferBegin,\n numObjects: nFloats\n };\n }\n freeBuffer(plugin, arr) {\n plugin._free(arr.offset);\n }\n /**\n * Allocate and populate the triangle indices inside the physics plugin\n *\n * @param plugin - The plugin to allocate the memory in.\n * @returns A new Int32Array, whose backing memory is inside the plugin. The array contains the indices\n * of the triangle positions, where a single triangle is defined by three indices. You must call\n * freeBuffer() on this array once you have finished with it, to free the memory inside the plugin..\n */\n getTriangles(plugin) {\n const bytesPerInt = 4;\n const nBytes = this._indices.length * bytesPerInt;\n const bufferBegin = plugin._malloc(nBytes);\n const ret = new Int32Array(plugin.HEAPU8.buffer, bufferBegin, this._indices.length);\n for (let i = 0; i < this._indices.length; i++) {\n ret[i] = this._indices[i];\n }\n return {\n offset: bufferBegin,\n numObjects: this._indices.length\n };\n }\n}\nclass BodyPluginData {\n constructor(bodyId) {\n this.hpBodyId = bodyId;\n this.userMassProps = {\n centerOfMass: undefined,\n mass: undefined,\n inertia: undefined,\n inertiaOrientation: undefined\n };\n }\n}\n/*\nclass ShapePath\n{\n public colliderId: number;\n public pathData: number;\n}\n*/\nclass CollisionContactPoint {\n constructor() {\n this.bodyId = BigInt(0); //0,2\n //public colliderId: number = 0; //2,4\n //public shapePath: ShapePath = new ShapePath(); //4,8\n this.position = new Vector3(); //8,11\n this.normal = new Vector3(); //11,14\n //public triIdx: number = 0; //14,15\n }\n}\nclass CollisionEvent {\n constructor() {\n this.contactOnA = new CollisionContactPoint(); //1\n this.contactOnB = new CollisionContactPoint();\n this.impulseApplied = 0;\n this.type = 0;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static readToRef(buffer, offset, eventOut) {\n const intBuf = new Int32Array(buffer, offset);\n const floatBuf = new Float32Array(buffer, offset);\n const offA = 2;\n eventOut.contactOnA.bodyId = BigInt(intBuf[offA]); //<todo Need to get the high+low words!\n eventOut.contactOnA.position.set(floatBuf[offA + 8], floatBuf[offA + 9], floatBuf[offA + 10]);\n eventOut.contactOnA.normal.set(floatBuf[offA + 11], floatBuf[offA + 12], floatBuf[offA + 13]);\n const offB = 18;\n eventOut.contactOnB.bodyId = BigInt(intBuf[offB]);\n eventOut.contactOnB.position.set(floatBuf[offB + 8], floatBuf[offB + 9], floatBuf[offB + 10]);\n eventOut.contactOnB.normal.set(floatBuf[offB + 11], floatBuf[offB + 12], floatBuf[offB + 13]);\n eventOut.impulseApplied = floatBuf[offB + 13 + 3];\n eventOut.type = intBuf[0];\n }\n}\nclass TriggerEvent {\n constructor() {\n this.bodyIdA = BigInt(0);\n this.bodyIdB = BigInt(0);\n this.type = 0;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static readToRef(buffer, offset, eventOut) {\n const intBuf = new Int32Array(buffer, offset);\n eventOut.type = intBuf[0];\n eventOut.bodyIdA = BigInt(intBuf[2]);\n eventOut.bodyIdB = BigInt(intBuf[6]);\n }\n}\n/**\n * The Havok Physics plugin\n */\nexport class HavokPlugin {\n constructor(_useDeltaForWorldStep = true, hpInjection = HK) {\n this._useDeltaForWorldStep = _useDeltaForWorldStep;\n /**\n * Reference to the WASM library\n */\n this._hknp = {};\n /**\n * Name of the plugin\n */\n this.name = \"HavokPlugin\";\n this._fixedTimeStep = 1 / 60;\n this._tmpVec3 = BuildArray(3, Vector3.Zero);\n this._bodies = new Map();\n this._shapes = new Map();\n this._bodyCollisionObservable = new Map();\n // Map from constraint id to the pair of bodies, where the first is the parent and the second is the child\n this._constraintToBodyIdPair = new Map();\n this._bodyCollisionEndedObservable = new Map();\n /**\n * Observable for collision started and collision continued events\n */\n this.onCollisionObservable = new Observable();\n /**\n * Observable for collision ended events\n */\n this.onCollisionEndedObservable = new Observable();\n /**\n * Observable for trigger entered and trigger exited events\n */\n this.onTriggerCollisionObservable = new Observable();\n if (typeof hpInjection === \"function\") {\n Logger.Error(\"Havok is not ready. Please make sure you await HK() before using the plugin.\");\n return;\n } else {\n this._hknp = hpInjection;\n }\n if (!this.isSupported()) {\n Logger.Error(\"Havok is not available. Please make sure you included the js file.\");\n return;\n }\n this.world = this._hknp.HP_World_Create()[1];\n this._queryCollector = this._hknp.HP_QueryCollector_Create(1)[1];\n }\n /**\n * If this plugin is supported\n * @returns true if its supported\n */\n isSupported() {\n return this._hknp !== undefined;\n }\n /**\n * Sets the gravity of the physics world.\n *\n * @param gravity - The gravity vector to set.\n *\n */\n setGravity(gravity) {\n this._hknp.HP_World_SetGravity(this.world, this._bVecToV3(gravity));\n }\n /**\n * Sets the fixed time step for the physics engine.\n *\n * @param timeStep - The fixed time step to use for the physics engine.\n *\n */\n setTimeStep(timeStep) {\n this._fixedTimeStep = timeStep;\n }\n /**\n * Gets the fixed time step used by the physics engine.\n *\n * @returns The fixed time step used by the physics engine.\n *\n */\n getTimeStep() {\n return this._fixedTimeStep;\n }\n /**\n * Executes a single step of the physics engine.\n *\n * @param delta The time delta in seconds since the last step.\n * @param physicsBodies An array of physics bodies to be simulated.\n *\n * This method is useful for simulating the physics engine. It sets the physics body transformation,\n * steps the world, syncs the physics body, and notifies collisions. This allows for the physics engine\n * to accurately simulate the physics bodies in the world.\n */\n executeStep(delta, physicsBodies) {\n for (const physicsBody of physicsBodies) {\n if (physicsBody.disablePreStep) {\n continue;\n }\n this.setPhysicsBodyTransformation(physicsBody, physicsBody.transformNode);\n }\n const deltaTime = this._useDeltaForWorldStep ? delta : this._fixedTimeStep;\n this._hknp.HP_World_SetIdealStepTime(this.world, deltaTime);\n this._hknp.HP_World_Step(this.world, deltaTime);\n this._bodyBuffer = this._hknp.HP_World_GetBodyBuffer(this.world)[1];\n for (const physicsBody of physicsBodies) {\n if (!physicsBody.disableSync) {\n this.sync(physicsBody);\n }\n }\n this._notifyCollisions();\n this._notifyTriggers();\n }\n /**\n * Returns the version of the physics engine plugin.\n *\n * @returns The version of the physics engine plugin.\n *\n * This method is useful for determining the version of the physics engine plugin that is currently running.\n */\n getPluginVersion() {\n return 2;\n }\n /**\n * Set the maximum allowed linear and angular velocities\n * @param maxLinearVelocity maximum allowed linear velocity\n * @param maxAngularVelocity maximum allowed angular velocity\n */\n setVelocityLimits(maxLinearVelocity, maxAngularVelocity) {\n this._hknp.HP_World_SetSpeedLimit(this.world, maxLinearVelocity, maxAngularVelocity);\n }\n /**\n * @returns maximum allowed linear velocity\n */\n getMaxLinearVelocity() {\n const limits = this._hknp.HP_World_GetSpeedLimit(this.world);\n return limits[1];\n }\n /**\n * @returns maximum allowed angular velocity\n */\n getMaxAngularVelocity() {\n const limits = this._hknp.HP_World_GetSpeedLimit(this.world);\n return limits[2];\n }\n /**\n * Initializes a physics body with the given position and orientation.\n *\n * @param body - The physics body to initialize.\n * @param motionType - The motion type of the body.\n * @param position - The position of the body.\n * @param orientation - The orientation of the body.\n * This code is useful for initializing a physics body with the given position and orientation.\n * It creates a plugin data for the body and adds it to the world. It then converts the position\n * and orientation to a transform and sets the body's transform to the given values.\n */\n initBody(body, motionType, position, orientation) {\n body._pluginData = new BodyPluginData(this._hknp.HP_Body_Create()[1]);\n this._internalSetMotionType(body._pluginData, motionType);\n const transform = [this._bVecToV3(position), this._bQuatToV4(orientation)]; //<todo temp transform?\n this._hknp.HP_Body_SetQTransform(body._pluginData.hpBodyId, transform);\n this._hknp.HP_World_AddBody(this.world, body._pluginData.hpBodyId, body.startAsleep);\n this._bodies.set(body._pluginData.hpBodyId[0], {\n body: body,\n index: 0\n });\n }\n /**\n * Removes a body from the world. To dispose of a body, it is necessary to remove it from the world first.\n *\n * @param body - The body to remove.\n */\n removeBody(body) {\n if (body._pluginDataInstances && body._pluginDataInstances.length > 0) {\n for (const instance of body._pluginDataInstances) {\n this._bodyCollisionObservable.delete(instance.hpBodyId[0]);\n this._hknp.HP_World_RemoveBody(this.world, instance.hpBodyId);\n this._bodies.delete(instance.hpBodyId[0]);\n }\n }\n if (body._pluginData) {\n this._bodyCollisionObservable.delete(body._pluginData.hpBodyId[0]);\n this._hknp.HP_World_RemoveBody(this.world, body._pluginData.hpBodyId);\n this._bodies.delete(body._pluginData.hpBodyId[0]);\n }\n }\n /**\n * Initializes the body instances for a given physics body and mesh.\n *\n * @param body - The physics body to initialize.\n * @param motionType - How the body will be handled by the engine\n * @param mesh - The mesh to initialize.\n *\n * This code is useful for creating a physics body from a mesh. It creates a\n * body instance for each instance of the mesh and adds it to the world. It also\n * sets the position of the body instance to the position of the mesh instance.\n * This allows for the physics engine to accurately simulate the mesh in the\n * world.\n */\n initBodyInstances(body, motionType, mesh) {\n var _mesh$_thinInstanceDa, _mesh$_thinInstanceDa2;\n const instancesCount = (_mesh$_thinInstanceDa = (_mesh$_thinInstanceDa2 = mesh._thinInstanceDataStorage) === null || _mesh$_thinInstanceDa2 === void 0 ? void 0 : _mesh$_thinInstanceDa2.instancesCount) !== null && _mesh$_thinInstanceDa !== void 0 ? _mesh$_thinInstanceDa : 0;\n const matrixData = mesh._thinInstanceDataStorage.matrixData;\n if (!matrixData) {\n return; // TODO: error handling\n }\n this._createOrUpdateBodyInstances(body, motionType, matrixData, 0, instancesCount, false);\n body._pluginDataInstances.forEach((bodyId, index) => {\n this._bodies.set(bodyId.hpBodyId[0], {\n body: body,\n index: index\n });\n });\n }\n _createOrUpdateBodyInstances(body, motionType, matrixData, startIndex, endIndex, update) {\n const rotation = TmpVectors.Quaternion[0];\n const rotationMatrix = Matrix.Identity();\n for (let i = startIndex; i < endIndex; i++) {\n const position = [matrixData[i * 16 + 12], matrixData[i * 16 + 13], matrixData[i * 16 + 14]];\n let hkbody;\n if (!update) {\n hkbody = this._hknp.HP_Body_Create()[1];\n } else {\n hkbody = body._pluginDataInstances[i].hpBodyId;\n }\n rotationMatrix.setRowFromFloats(0, matrixData[i * 16 + 0], matrixData[i * 16 + 1], matrixData[i * 16 + 2], 0);\n rotationMatrix.setRowFromFloats(1, matrixData[i * 16 + 4], matrixData[i * 16 + 5], matrixData[i * 16 + 6], 0);\n rotationMatrix.setRowFromFloats(2, matrixData[i * 16 + 8], matrixData[i * 16 + 9], matrixData[i * 16 + 10], 0);\n Quaternion.FromRotationMatrixToRef(rotationMatrix, rotation);\n const transform = [position, [rotation.x, rotation.y, rotation.z, rotation.w]];\n this._hknp.HP_Body_SetQTransform(hkbody, transform);\n if (!update) {\n const pluginData = new BodyPluginData(hkbody);\n if (body._pluginDataInstances.length) {\n // If an instance already exists, copy any user-provided mass properties\n pluginData.userMassProps = body._pluginDataInstances[0].userMassProps;\n }\n this._internalSetMotionType(pluginData, motionType);\n this._internalUpdateMassProperties(pluginData);\n body._pluginDataInstances.push(pluginData);\n this._hknp.HP_World_AddBody(this.world, hkbody, body.startAsleep);\n pluginData.worldTransformOffset = this._hknp.HP_Body_GetWorldTransformOffset(hkbody)[1];\n }\n }\n }\n /**\n * Update the internal body instances for a given physics body to match the instances in a mesh.\n * @param body the body that will be updated\n * @param mesh the mesh with reference instances\n */\n updateBodyInstances(body, mesh) {\n var _mesh$_thinInstanceDa3, _mesh$_thinInstanceDa4;\n const instancesCount = (_mesh$_thinInstanceDa3 = (_mesh$_thinInstanceDa4 = mesh._thinInstanceDataStorage) === null || _mesh$_thinInstanceDa4 === void 0 ? void 0 : _mesh$_thinInstanceDa4.instancesCount) !== null && _mesh$_thinInstanceDa3 !== void 0 ? _mesh$_thinInstanceDa3 : 0;\n const matrixData = mesh._thinInstanceDataStorage.matrixData;\n if (!matrixData) {\n return; // TODO: error handling\n }\n const pluginInstancesCount = body._pluginDataInstances.length;\n const motionType = this.getMotionType(body);\n if (instancesCount > pluginInstancesCount) {\n this._createOrUpdateBodyInstances(body, motionType, matrixData, pluginInstancesCount, instancesCount, false);\n const firstBodyShape = this._hknp.HP_Body_GetShape(body._pluginDataInstances[0].hpBodyId)[1];\n // firstBodyShape[0] might be 0 in the case where thin instances data is set (with thinInstancesSetBuffer call) after body creation\n // in that case, use the shape provided at body creation.\n if (!firstBodyShape[0]) {\n var _body$shape;\n firstBodyShape[0] = (_body$shape = body.shape) === null || _body$shape === void 0 ? void 0 : _body$shape._pluginData[0];\n }\n for (let i = pluginInstancesCount; i < instancesCount; i++) {\n this._hknp.HP_Body_SetShape(body._pluginDataInstances[i].hpBodyId, firstBodyShape);\n this._internalUpdateMassProperties(body._pluginDataInstances[i]);\n this._bodies.set(body._pluginDataInstances[i].hpBodyId[0], {\n body: body,\n index: i\n });\n }\n } else if (instancesCount < pluginInstancesCount) {\n const instancesToRemove = pluginInstancesCount - instancesCount;\n for (let i = 0; i < instancesToRemove; i++) {\n const hkbody = body._pluginDataInstances.pop();\n this._bodies.delete(hkbody.hpBodyId[0]);\n this._hknp.HP_World_RemoveBody(this.world, hkbody.hpBodyId);\n this._hknp.HP_Body_Release(hkbody.hpBodyId);\n }\n this._createOrUpdateBodyInstances(body, motionType, matrixData, 0, instancesCount, true);\n }\n }\n /**\n * Synchronizes the transform of a physics body with its transform node.\n * @param body - The physics body to synchronize.\n *\n * This function is useful for keeping the physics body's transform in sync with its transform node.\n * This is important for ensuring that the physics body is accurately represented in the physics engine.\n */\n sync(body) {\n this.syncTransform(body, body.transformNode);\n }\n /**\n * Synchronizes the transform of a physics body with the transform of its\n * corresponding transform node.\n *\n * @param body - The physics body to synchronize.\n * @param transformNode - The destination Transform Node.\n *\n * This code is useful for synchronizing the position and orientation of a\n * physics body with the position and orientation of its corresponding\n * transform node. This is important for ensuring that the physics body and\n * the transform node are in the same position and orientation in the scene.\n * This is necessary for the physics engine to accurately simulate the\n * physical behavior of the body.\n */\n syncTransform(body, transformNode) {\n if (body._pluginDataInstances.length) {\n // instances\n const m = transformNode;\n const matrixData = m._thinInstanceDataStorage.matrixData;\n if (!matrixData) {\n return; // TODO: error handling\n }\n const instancesCount = body._pluginDataInstances.length;\n for (let i = 0; i < instancesCount; i++) {\n const bufOffset = body._pluginDataInstances[i].worldTransformOffset;\n const transformBuffer = new Float32Array(this._hknp.HEAPU8.buffer, this._bodyBuffer + bufOffset, 16);\n const index = i * 16;\n for (let mi = 0; mi < 15; mi++) {\n if ((mi & 3) != 3) {\n matrixData[index + mi] = transformBuffer[mi];\n }\n }\n matrixData[index + 15] = 1;\n }\n m.thinInstanceBufferUpdated(\"matrix\");\n } else {\n try {\n // regular\n const bodyTransform = this._hknp.HP_Body_GetQTransform(body._pluginData.hpBodyId)[1];\n const bodyTranslation = bodyTransform[0];\n const bodyOrientation = bodyTransform[1];\n const quat = TmpVectors.Quaternion[0];\n quat.set(bodyOrientation[0], bodyOrientation[1], bodyOrientation[2], bodyOrientation[3]);\n const parent = transformNode.parent;\n // transform position/orientation in parent space\n if (parent && !parent.getWorldMatrix().isIdentity()) {\n var _transformNode$rotati;\n parent.computeWorldMatrix(true);\n // Save scaling for future use\n TmpVectors.Vector3[1].copyFrom(transformNode.scaling);\n quat.normalize();\n const finalTransform = TmpVectors.Matrix[0];\n const finalTranslation = TmpVectors.Vector3[0];\n finalTranslation.copyFromFloats(bodyTranslation[0], bodyTranslation[1], bodyTranslation[2]);\n Matrix.ComposeToRef(transformNode.absoluteScaling, quat, finalTranslation, finalTransform);\n const parentInverseTransform = TmpVectors.Matrix[1];\n parent.getWorldMatrix().invertToRef(parentInverseTransform);\n const localTransform = TmpVectors.Matrix[2];\n finalTransform.multiplyToRef(parentInverseTransform, localTransform);\n localTransform.decomposeToTransformNode(transformNode);\n (_transformNode$rotati = transformNode.rotationQuaternion) === null || _transformNode$rotati === void 0 || _transformNode$rotati.normalize();\n // Keep original scaling. Re-injecting scaling can introduce discontinuity between frames. Basically, it grows or shrinks.\n transformNode.scaling.copyFrom(TmpVectors.Vector3[1]);\n } else {\n transformNode.position.set(bodyTranslation[0], bodyTranslation[1], bodyTranslation[2]);\n if (transformNode.rotationQuaternion) {\n transformNode.rotationQuaternion.copyFrom(quat);\n } else {\n quat.toEulerAnglesToRef(transformNode.rotation);\n }\n }\n } catch (e) {\n Logger.Error(`Syncing transform failed for node ${transformNode.name}: ${e.message}...`);\n }\n }\n }\n /**\n * Sets the shape of a physics body.\n * @param body - The physics body to set the shape for.\n * @param shape - The physics shape to set.\n *\n * This function is used to set the shape of a physics body. It is useful for\n * creating a physics body with a specific shape, such as a box or a sphere,\n * which can then be used to simulate physical interactions in a physics engine.\n * This function is especially useful for meshes with multiple instances, as it\n * will set the shape for each instance of the mesh.\n */\n setShape(body, shape) {\n var _body$transformNode$_, _m$_thinInstanceDataS, _m$_thinInstanceDataS2;\n const shapeHandle = shape && shape._pluginData ? shape._pluginData : BigInt(0);\n if (!(body.transformNode instanceof Mesh) || !((_body$transformNode$_ = body.transformNode._thinInstanceDataStorage) !== null && _body$transformNode$_ !== void 0 && _body$transformNode$_.matrixData)) {\n this._hknp.HP_Body_SetShape(body._pluginData.hpBodyId, shapeHandle);\n this._internalUpdateMassProperties(body._pluginData);\n return;\n }\n const m = body.transformNode;\n const instancesCount = (_m$_thinInstanceDataS = (_m$_thinInstanceDataS2 = m._thinInstanceDataStorage) === null || _m$_thinInstanceDataS2 === void 0 ? void 0 : _m$_thinInstanceDataS2.instancesCount) !== null && _m$_thinInstanceDataS !== void 0 ? _m$_thinInstanceDataS : 0;\n for (let i = 0; i < instancesCount; i++) {\n this._hknp.HP_Body_SetShape(body._pluginDataInstances[i].hpBodyId, shapeHandle);\n this._internalUpdateMassProperties(body._pluginDataInstances[i]);\n }\n }\n /**\n * Returns a reference to the first instance of the plugin data for a physics body.\n * @param body\n * @param instanceIndex\n * @returns a reference to the first instance\n */\n _getPluginReference(body, instanceIndex) {\n var _body$_pluginDataInst;\n return (_body$_pluginDataInst = body._pluginDataInstances) !== null && _body$_pluginDataInst !== void 0 && _body$_pluginDataInst.length ? body._pluginDataInstances[instanceIndex !== null && instanceIndex !== void 0 ? instanceIndex : 0] : body._pluginData;\n }\n /**\n * Gets the shape of a physics body. This will create a new shape object\n *\n * @param body - The physics body.\n * @returns The shape of the physics body.\n *\n */\n getShape(body) {\n const pluginRef = this._getPluginReference(body);\n const shapePluginData = this._hknp.HP_Body_GetShape(pluginRef.hpBodyId)[1];\n if (shapePluginData != 0) {\n const scene = body.transformNode.getScene();\n return new PhysicsShape({\n pluginData: shapePluginData\n }, scene);\n }\n return null;\n }\n /**\n * Gets the type of a physics shape.\n * @param shape - The physics shape to get the type for.\n * @returns The type of the physics shape.\n *\n */\n getShapeType(shape) {\n if (shape.type) {\n return shape.type;\n } else {\n //<todo This returns a native type!\n return this._hknp.HP_Shape_GetType(shape._pluginData);\n }\n }\n /**\n * Sets the event mask of a physics body.\n * @param body - The physics body to set the event mask for.\n * @param eventMask - The event mask to set.\n * @param instanceIndex - The index of the instance to set the event mask for\n *\n * This function is useful for setting the event mask of a physics body, which is used to determine which events the body will respond to. This is important for ensuring that the physics engine is able to accurately simulate the behavior of the body in the game world.\n */\n setEventMask(body, eventMask, instanceIndex) {\n this._applyToBodyOrInstances(body, bodyPluginData => {\n this._hknp.HP_Body_SetEventMask(bodyPluginData.hpBodyId, eventMask);\n }, instanceIndex);\n }\n /**\n * Retrieves the event mask of a physics body.\n *\n * @param body - The physics body to retrieve the event mask from.\n * @param instanceIndex - The index of the instance to retrieve the event mask from.\n * @returns The event mask of the physics body.\n *\n */\n getEventMask(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n return this._hknp.HP_Body_GetEventMask(pluginRef.hpBodyId)[1];\n }\n _fromMassPropertiesTuple(massPropsTuple) {\n return {\n centerOfMass: Vector3.FromArray(massPropsTuple[0]),\n mass: massPropsTuple[1],\n inertia: Vector3.FromArray(massPropsTuple[2]),\n inertiaOrientation: Quaternion.FromArray(massPropsTuple[3])\n };\n }\n _internalUpdateMassProperties(pluginData) {\n // Recompute the mass based on the shape\n const newProps = this._internalComputeMassProperties(pluginData);\n const massProps = pluginData.userMassProps;\n // Override the computed values with any the user has set\n if (massProps.centerOfMass) {\n newProps[0] = massProps.centerOfMass.asArray();\n }\n if (massProps.mass != undefined) {\n newProps[1] = massProps.mass;\n }\n if (massProps.inertia) {\n newProps[2] = massProps.inertia.asArray();\n }\n if (massProps.inertiaOrientation) {\n newProps[3] = massProps.inertiaOrientation.asArray();\n }\n this._hknp.HP_Body_SetMassProperties(pluginData.hpBodyId, newProps);\n }\n _internalSetMotionType(pluginData, motionType) {\n switch (motionType) {\n case 0 /* PhysicsMotionType.STATIC */:\n this._hknp.HP_Body_SetMotionType(pluginData.hpBodyId, this._hknp.MotionType.STATIC);\n break;\n case 1 /* PhysicsMotionType.ANIMATED */:\n this._hknp.HP_Body_SetMotionType(pluginData.hpBodyId, this._hknp.MotionType.KINEMATIC);\n break;\n case 2 /* PhysicsMotionType.DYNAMIC */:\n this._hknp.HP_Body_SetMotionType(pluginData.hpBodyId, this._hknp.MotionType.DYNAMIC);\n break;\n }\n }\n /**\n * sets the motion type of a physics body.\n * @param body - The physics body to set the motion type for.\n * @param motionType - The motion type to set.\n * @param instanceIndex - The index of the instance to set the motion type for. If undefined, the motion type of all the bodies will be set.\n */\n setMotionType(body, motionType, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginData => {\n this._internalSetMotionType(pluginData, motionType);\n }, instanceIndex);\n }\n /**\n * Gets the motion type of a physics body.\n * @param body - The physics body to get the motion type from.\n * @param instanceIndex - The index of the instance to get the motion type from. If not specified, the motion type of the first instance will be returned.\n * @returns The motion type of the physics body.\n */\n getMotionType(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const type = this._hknp.HP_Body_GetMotionType(pluginRef.hpBodyId)[1];\n switch (type) {\n case this._hknp.MotionType.STATIC:\n return 0 /* PhysicsMotionType.STATIC */;\n case this._hknp.MotionType.KINEMATIC:\n return 1 /* PhysicsMotionType.ANIMATED */;\n case this._hknp.MotionType.DYNAMIC:\n return 2 /* PhysicsMotionType.DYNAMIC */;\n }\n throw new Error(\"Unknown motion type: \" + type);\n }\n /**\n * sets the activation control mode of a physics body, for instance if you need the body to never sleep.\n * @param body - The physics body to set the activation control mode.\n * @param controlMode - The activation control mode.\n */\n setActivationControl(body, controlMode) {\n switch (controlMode) {\n case 1 /* PhysicsActivationControl.ALWAYS_ACTIVE */:\n this._hknp.HP_Body_SetActivationControl(body._pluginData.hpBodyId, this._hknp.ActivationControl.ALWAYS_ACTIVE);\n break;\n case 2 /* PhysicsActivationControl.ALWAYS_INACTIVE */:\n this._hknp.HP_Body_SetActivationControl(body._pluginData.hpBodyId, this._hknp.ActivationControl.ALWAYS_INACTIVE);\n break;\n case 0 /* PhysicsActivationControl.SIMULATION_CONTROLLED */:\n this._hknp.HP_Body_SetActivationControl(body._pluginData.hpBodyId, this._hknp.ActivationControl.SIMULATION_CONTROLLED);\n break;\n }\n }\n _internalComputeMassProperties(pluginData) {\n const shapeRes = this._hknp.HP_Body_GetShape(pluginData.hpBodyId);\n if (shapeRes[0] == this._hknp.Result.RESULT_OK) {\n const shapeMass = this._hknp.HP_Shape_BuildMassProperties(shapeRes[1]);\n if (shapeMass[0] == this._hknp.Result.RESULT_OK) {\n return shapeMass[1];\n }\n }\n // Failed; return a unit inertia\n return [[0, 0, 0], 1, [1, 1, 1], [0, 0, 0, 1]];\n }\n /**\n * Computes the mass properties of a physics body, from it's shape\n *\n * @param body - The physics body to copmute the mass properties of\n * @param instanceIndex - The index of the instance to compute the mass properties of.\n * @returns The mass properties of the physics body.\n */\n computeMassProperties(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const computed = this._internalComputeMassProperties(pluginRef);\n return this._fromMassPropertiesTuple(computed);\n }\n /**\n * Sets the mass properties of a physics body.\n *\n * @param body - The physics body to set the mass properties of.\n * @param massProps - The mass properties to set.\n * @param instanceIndex - The index of the instance to set the mass properties of. If undefined, the mass properties of all the bodies will be set.\n * This function is useful for setting the mass properties of a physics body,\n * such as its mass, inertia, and center of mass. This is important for\n * accurately simulating the physics of the body in the physics engine.\n *\n */\n setMassProperties(body, massProps, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginData => {\n pluginData.userMassProps = massProps;\n this._internalUpdateMassProperties(pluginData);\n }, instanceIndex);\n }\n /**\n * Gets the mass properties of a physics body.\n * @param body - The physics body to get the mass properties from.\n * @param instanceIndex - The index of the instance to get the mass properties from. If not specified, the mass properties of the first instance will be returned.\n * @returns The mass properties of the physics body.\n */\n getMassProperties(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const massPropsTuple = this._hknp.HP_Body_GetMassProperties(pluginRef.hpBodyId)[1];\n return this._fromMassPropertiesTuple(massPropsTuple);\n }\n /**\n * Sets the linear damping of the given body.\n * @param body - The body to set the linear damping for.\n * @param damping - The linear damping to set.\n * @param instanceIndex - The index of the instance to set the linear damping for. If not specified, the linear damping of the first instance will be set.\n *\n * This method is useful for controlling the linear damping of a body in a physics engine.\n * Linear damping is a force that opposes the motion of the body, and is proportional to the velocity of the body.\n * This method allows the user to set the linear damping of a body, which can be used to control the motion of the body.\n */\n setLinearDamping(body, damping, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginData => {\n this._hknp.HP_Body_SetLinearDamping(pluginData.hpBodyId, damping);\n }, instanceIndex);\n }\n /**\n * Gets the linear damping of the given body.\n * @param body - The body to get the linear damping from.\n * @param instanceIndex - The index of the instance to get the linear damping from. If not specified, the linear damping of the first instance will be returned.\n * @returns The linear damping of the given body.\n *\n * This method is useful for getting the linear damping of a body in a physics engine.\n * Linear damping is a force that opposes the motion of the body and is proportional to the velocity of the body.\n * It is used to simulate the effects of air resistance and other forms of friction.\n */\n getLinearDamping(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n return this._hknp.HP_Body_GetLinearDamping(pluginRef.hpBodyId)[1];\n }\n /**\n * Sets the angular damping of a physics body.\n * @param body - The physics body to set the angular damping for.\n * @param damping - The angular damping value to set.\n * @param instanceIndex - The index of the instance to set the angular damping for. If not specified, the angular damping of the first instance will be set.\n *\n * This function is useful for controlling the angular velocity of a physics body.\n * By setting the angular damping, the body's angular velocity will be reduced over time, allowing for more realistic physics simulations.\n */\n setAngularDamping(body, damping, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginData => {\n this._hknp.HP_Body_SetAngularDamping(pluginData.hpBodyId, damping);\n }, instanceIndex);\n }\n /**\n * Gets the angular damping of a physics body.\n * @param body - The physics body to get the angular damping from.\n * @param instanceIndex - The index of the instance to get the angular damping from. If not specified, the angular damping of the first instance will be returned.\n * @returns The angular damping of the body.\n *\n * This function is useful for retrieving the angular damping of a physics body,\n * which is used to control the rotational motion of the body. The angular damping is a value between 0 and 1, where 0 is no damping and 1 is full damping.\n */\n getAngularDamping(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n return this._hknp.HP_Body_GetAngularDamping(pluginRef.hpBodyId)[1];\n }\n /**\n * Sets the linear velocity of a physics body.\n * @param body - The physics body to set the linear velocity of.\n * @param linVel - The linear velocity to set.\n * @param instanceIndex - The index of the instance to set the linear velocity of. If not specified, the linear velocity of the first instance will be set.\n *\n * This function is useful for setting the linear velocity of a physics body, which is necessary for simulating\n * motion in a physics engine. The linear velocity is the speed and direction of the body's movement.\n */\n setLinearVelocity(body, linVel, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginData => {\n this._hknp.HP_Body_SetLinearVelocity(pluginData.hpBodyId, this._bVecToV3(linVel));\n }, instanceIndex);\n }\n /**\n * Gets the linear velocity of a physics body and stores it in a given vector.\n * @param body - The physics body to get the linear velocity from.\n * @param linVel - The vector to store the linear velocity in.\n * @param instanceIndex - The index of the instance to get the linear velocity from. If not specified, the linear velocity of the first instance will be returned.\n *\n * This function is useful for retrieving the linear velocity of a physics body,\n * which can be used to determine the speed and direction of the body. This\n * information can be used to simulate realistic physics behavior in a game.\n */\n getLinearVelocityToRef(body, linVel, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const lv = this._hknp.HP_Body_GetLinearVelocity(pluginRef.hpBodyId)[1];\n this._v3ToBvecRef(lv, linVel);\n }\n /*\n * Apply an operation either to all instances of a body, if instanceIndex is not specified, or to a specific instance.\n */\n _applyToBodyOrInstances(body, fnToApply, instanceIndex) {\n var _body$_pluginDataInst2;\n if (((_body$_pluginDataInst2 = body._pluginDataInstances) === null || _body$_pluginDataInst2 === void 0 ? void 0 : _body$_pluginDataInst2.length) > 0 && instanceIndex === undefined) {\n for (let i = 0; i < body._pluginDataInstances.length; i++) {\n fnToApply(body._pluginDataInstances[i]);\n }\n } else {\n fnToApply(this._getPluginReference(body, instanceIndex));\n }\n }\n /**\n * Applies an impulse to a physics body at a given location.\n * @param body - The physics body to apply the impulse to.\n * @param impulse - The impulse vector to apply.\n * @param location - The location in world space to apply the impulse.\n * @param instanceIndex - The index of the instance to apply the impulse to. If not specified, the impulse will be applied to all instances.\n *\n * This method is useful for applying an impulse to a physics body at a given location.\n * This can be used to simulate physical forces such as explosions, collisions, and gravity.\n */\n applyImpulse(body, impulse, location, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginRef => {\n this._hknp.HP_Body_ApplyImpulse(pluginRef.hpBodyId, this._bVecToV3(location), this._bVecToV3(impulse));\n }, instanceIndex);\n }\n /**\n * Applies an angular impulse(torque) to a physics body\n * @param body - The physics body to apply the impulse to.\n * @param angularImpulse - The torque value\n * @param instanceIndex - The index of the instance to apply the impulse to. If not specified, the impulse will be applied to all instances.\n */\n applyAngularImpulse(body, angularImpulse, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginRef => {\n this._hknp.HP_Body_ApplyAngularImpulse(pluginRef.hpBodyId, this._bVecToV3(angularImpulse));\n }, instanceIndex);\n }\n /**\n * Applies a force to a physics body at a given location.\n * @param body - The physics body to apply the impulse to.\n * @param force - The force vector to apply.\n * @param location - The location in world space to apply the impulse.\n * @param instanceIndex - The index of the instance to apply the force to. If not specified, the force will be applied to all instances.\n *\n * This method is useful for applying a force to a physics body at a given location.\n * This can be used to simulate physical forces such as explosions, collisions, and gravity.\n */\n applyForce(body, force, location, instanceIndex) {\n force.scaleToRef(this.getTimeStep(), this._tmpVec3[0]);\n this.applyImpulse(body, this._tmpVec3[0], location, instanceIndex);\n }\n /**\n * Sets the angular velocity of a physics body.\n *\n * @param body - The physics body to set the angular velocity of.\n * @param angVel - The angular velocity to set.\n * @param instanceIndex - The index of the instance to set the angular velocity of. If not specified, the angular velocity of the first instance will be set.\n *\n * This function is useful for setting the angular velocity of a physics body in a physics engine.\n * This allows for more realistic simulations of physical objects, as they can be given a rotational velocity.\n */\n setAngularVelocity(body, angVel, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginRef => {\n this._hknp.HP_Body_SetAngularVelocity(pluginRef.hpBodyId, this._bVecToV3(angVel));\n }, instanceIndex);\n }\n /**\n * Gets the angular velocity of a body.\n * @param body - The body to get the angular velocity from.\n * @param angVel - The vector3 to store the angular velocity.\n * @param instanceIndex - The index of the instance to get the angular velocity from. If not specified, the angular velocity of the first instance will be returned.\n *\n * This method is useful for getting the angular velocity of a body in a physics engine. It\n * takes the body and a vector3 as parameters and stores the angular velocity of the body\n * in the vector3. This is useful for getting the angular velocity of a body in order to\n * calculate the motion of the body in the physics engine.\n */\n getAngularVelocityToRef(body, angVel, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const av = this._hknp.HP_Body_GetAngularVelocity(pluginRef.hpBodyId)[1];\n this._v3ToBvecRef(av, angVel);\n }\n /**\n * Sets the transformation of the given physics body to the given transform node.\n * @param body The physics body to set the transformation for.\n * @param node The transform node to set the transformation from.\n * Sets the transformation of the given physics body to the given transform node.\n *\n * This function is useful for setting the transformation of a physics body to a\n * transform node, which is necessary for the physics engine to accurately simulate\n * the motion of the body. It also takes into account instances of the transform\n * node, which is necessary for accurate simulation of multiple bodies with the\n * same transformation.\n */\n setPhysicsBodyTransformation(body, node) {\n if (body.getPrestepType() == PhysicsPrestepType.TELEPORT) {\n const transformNode = body.transformNode;\n if (body.numInstances > 0) {\n // instances\n const m = transformNode;\n const matrixData = m._thinInstanceDataStorage.matrixData;\n if (!matrixData) {\n return; // TODO: error handling\n }\n const instancesCount = body.numInstances;\n this._createOrUpdateBodyInstances(body, body.getMotionType(), matrixData, 0, instancesCount, true);\n } else {\n // regular\n this._hknp.HP_Body_SetQTransform(body._pluginData.hpBodyId, this._getTransformInfos(node));\n }\n } else if (body.getPrestepType() == PhysicsPrestepType.ACTION) {\n this.setTargetTransform(body, node.absolutePosition, node.absoluteRotationQuaternion);\n } else if (body.getPrestepType() == PhysicsPrestepType.DISABLED) {\n Logger.Warn(\"Prestep type is set to DISABLED. Unable to set physics body transformation.\");\n } else {\n Logger.Warn(\"Invalid prestep type set to physics body.\");\n }\n }\n /**\n * Set the target transformation (position and rotation) of the body, such that the body will set its velocity to reach that target\n * @param body The physics body to set the target transformation for.\n * @param position The target position\n * @param rotation The target rotation\n * @param instanceIndex The index of the instance in an instanced body\n */\n setTargetTransform(body, position, rotation, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginRef => {\n this._hknp.HP_Body_SetTargetQTransform(pluginRef.hpBodyId, [this._bVecToV3(position), this._bQuatToV4(rotation)]);\n }, instanceIndex);\n }\n /**\n * Sets the gravity factor of a body\n * @param body the physics body to set the gravity factor for\n * @param factor the gravity factor\n * @param instanceIndex the index of the instance in an instanced body\n */\n setGravityFactor(body, factor, instanceIndex) {\n this._applyToBodyOrInstances(body, pluginRef => {\n this._hknp.HP_Body_SetGravityFactor(pluginRef.hpBodyId, factor);\n }, instanceIndex);\n }\n /**\n * Get the gravity factor of a body\n * @param body the physics body to get the gravity factor from\n * @param instanceIndex the index of the instance in an instanced body. If not specified, the gravity factor of the first instance will be returned.\n * @returns the gravity factor\n */\n getGravityFactor(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n return this._hknp.HP_Body_GetGravityFactor(pluginRef.hpBodyId)[1];\n }\n /**\n * Disposes a physics body.\n *\n * @param body - The physics body to dispose.\n *\n * This method is useful for releasing the resources associated with a physics body when it is no longer needed.\n * This is important for avoiding memory leaks in the physics engine.\n */\n disposeBody(body) {\n if (body._pluginDataInstances && body._pluginDataInstances.length > 0) {\n for (const instance of body._pluginDataInstances) {\n this._hknp.HP_Body_Release(instance.hpBodyId);\n instance.hpBodyId = undefined;\n }\n }\n if (body._pluginData) {\n this._hknp.HP_Body_Release(body._pluginData.hpBodyId);\n body._pluginData.hpBodyId = undefined;\n }\n }\n _createOptionsFromGroundMesh(options) {\n const mesh = options.groundMesh;\n if (!mesh) {\n return;\n }\n let pos = mesh.getVerticesData(VertexBuffer.PositionKind);\n const transform = mesh.computeWorldMatrix(true);\n // convert rawVerts to object space\n const transformedVertices = [];\n let index;\n for (index = 0; index < pos.length; index += 3) {\n Vector3.FromArrayToRef(pos, index, TmpVectors.Vector3[0]);\n Vector3.TransformCoordinatesToRef(TmpVectors.Vector3[0], transform, TmpVectors.Vector3[1]);\n TmpVectors.Vector3[1].toArray(transformedVertices, index);\n }\n pos = transformedVertices;\n const arraySize = ~~(Math.sqrt(pos.length / 3) - 1);\n const boundingInfo = mesh.getBoundingInfo();\n const dim = Math.min(boundingInfo.boundingBox.extendSizeWorld.x, boundingInfo.boundingBox.extendSizeWorld.z);\n const minX = boundingInfo.boundingBox.minimumWorld.x;\n const minY = boundingInfo.boundingBox.minimumWorld.y;\n const minZ = boundingInfo.boundingBox.minimumWorld.z;\n const matrix = new Float32Array((arraySize + 1) * (arraySize + 1));\n const elementSize = dim * 2 / arraySize;\n for (let i = 0; i < matrix.length; i++) {\n matrix[i] = minY;\n }\n for (let i = 0; i < pos.length; i = i + 3) {\n const x = Math.round((pos[i + 0] - minX) / elementSize);\n const z = arraySize - Math.round((pos[i + 2] - minZ) / elementSize);\n const y = pos[i + 1] - minY;\n matrix[z * (arraySize + 1) + x] = y;\n }\n options.numHeightFieldSamplesX = arraySize + 1;\n options.numHeightFieldSamplesZ = arraySize + 1;\n options.heightFieldSizeX = boundingInfo.boundingBox.extendSizeWorld.x * 2;\n options.heightFieldSizeZ = boundingInfo.boundingBox.extendSizeWorld.z * 2;\n options.heightFieldData = matrix;\n }\n /**\n * Initializes a physics shape with the given type and parameters.\n * @param shape - The physics shape to initialize.\n * @param type - The type of shape to initialize.\n * @param options - The parameters for the shape.\n *\n * This code is useful for initializing a physics shape with the given type and parameters.\n * It allows for the creation of a sphere, box, capsule, container, cylinder, mesh, and heightfield.\n * Depending on the type of shape, different parameters are required.\n * For example, a sphere requires a radius, while a box requires extents and a rotation.\n */\n initShape(shape, type, options) {\n switch (type) {\n case 0 /* PhysicsShapeType.SPHERE */:\n {\n const radius = options.radius || 1;\n const center = options.center ? this._bVecToV3(options.center) : [0, 0, 0];\n shape._pluginData = this._hknp.HP_Shape_CreateSphere(center, radius)[1];\n }\n break;\n case 3 /* PhysicsShapeType.BOX */:\n {\n const rotation = options.rotation ? this._bQuatToV4(options.rotation) : [0, 0, 0, 1];\n const extent = options.extents ? this._bVecToV3(options.extents) : [1, 1, 1];\n const center = options.center ? this._bVecToV3(options.center) : [0, 0, 0];\n shape._pluginData = this._hknp.HP_Shape_CreateBox(center, rotation, extent)[1];\n }\n break;\n case 1 /* PhysicsShapeType.CAPSULE */:\n {\n const pointA = options.pointA ? this._bVecToV3(options.pointA) : [0, 0, 0];\n const pointB = options.pointB ? this._bVecToV3(options.pointB) : [0, 1, 0];\n const radius = options.radius || 0;\n shape._pluginData = this._hknp.HP_Shape_CreateCapsule(pointA, pointB, radius)[1];\n }\n break;\n case 5 /* PhysicsShapeType.CONTAINER */:\n {\n shape._pluginData = this._hknp.HP_Shape_CreateContainer()[1];\n }\n break;\n case 2 /* PhysicsShapeType.CYLINDER */:\n {\n const pointA = options.pointA ? this._bVecToV3(options.pointA) : [0, 0, 0];\n const pointB = options.pointB ? this._bVecToV3(options.pointB) : [0, 1, 0];\n const radius = options.radius || 0;\n shape._pluginData = this._hknp.HP_Shape_CreateCylinder(pointA, pointB, radius)[1];\n }\n break;\n case 4 /* PhysicsShapeType.CONVEX_HULL */:\n case 6 /* PhysicsShapeType.MESH */:\n {\n const mesh = options.mesh;\n if (mesh) {\n const includeChildMeshes = !!options.includeChildMeshes;\n const needIndices = type != 4 /* PhysicsShapeType.CONVEX_HULL */;\n const accum = new MeshAccumulator(mesh, needIndices, mesh === null || mesh === void 0 ? void 0 : mesh.getScene());\n accum.addNodeMeshes(mesh, includeChildMeshes);\n const positions = accum.getVertices(this._hknp);\n const numVec3s = positions.numObjects / 3;\n if (type == 4 /* PhysicsShapeType.CONVEX_HULL */) {\n shape._pluginData = this._hknp.HP_Shape_CreateConvexHull(positions.offset, numVec3s)[1];\n } else {\n const triangles = accum.getTriangles(this._hknp);\n const numTriangles = triangles.numObjects / 3;\n shape._pluginData = this._hknp.HP_Shape_CreateMesh(positions.offset, numVec3s, triangles.offset, numTriangles)[1];\n accum.freeBuffer(this._hknp, triangles);\n }\n accum.freeBuffer(this._hknp, positions);\n } else {\n throw new Error(\"No mesh provided to create physics shape.\");\n }\n }\n break;\n case 7 /* PhysicsShapeType.HEIGHTFIELD */:\n {\n if (options.groundMesh) {\n // update options with datas from groundMesh\n this._createOptionsFromGroundMesh(options);\n }\n if (options.numHeightFieldSamplesX && options.numHeightFieldSamplesZ && options.heightFieldSizeX && options.heightFieldSizeZ && options.heightFieldData) {\n const totalNumHeights = options.numHeightFieldSamplesX * options.numHeightFieldSamplesZ;\n const numBytes = totalNumHeights * 4;\n const bufferBegin = this._hknp._malloc(numBytes);\n const heightBuffer = new Float32Array(this._hknp.HEAPU8.buffer, bufferBegin, totalNumHeights);\n for (let x = 0; x < options.numHeightFieldSamplesX; x++) {\n for (let z = 0; z < options.numHeightFieldSamplesZ; z++) {\n const hkBufferIndex = z * options.numHeightFieldSamplesX + x;\n const bjsBufferIndex = (options.numHeightFieldSamplesX - 1 - x) * options.numHeightFieldSamplesZ + z;\n heightBuffer[hkBufferIndex] = options.heightFieldData[bjsBufferIndex];\n }\n }\n const scaleX = options.heightFieldSizeX / (options.numHeightFieldSamplesX - 1);\n const scaleZ = options.heightFieldSizeZ / (options.numHeightFieldSamplesZ - 1);\n shape._pluginData = this._hknp.HP_Shape_CreateHeightField(options.numHeightFieldSamplesX, options.numHeightFieldSamplesZ, [scaleX, 1, scaleZ], bufferBegin)[1];\n this._hknp._free(bufferBegin);\n } else {\n throw new Error(\"Missing required heightfield parameters\");\n }\n }\n break;\n default:\n throw new Error(\"Unsupported Shape Type.\");\n break;\n }\n this._shapes.set(shape._pluginData[0], shape);\n }\n /**\n * Sets the shape filter membership mask of a body\n * @param shape - The physics body to set the shape filter membership mask for.\n * @param membershipMask - The shape filter membership mask to set.\n */\n setShapeFilterMembershipMask(shape, membershipMask) {\n const collideWith = this._hknp.HP_Shape_GetFilterInfo(shape._pluginData)[1][1];\n this._hknp.HP_Shape_SetFilterInfo(shape._pluginData, [membershipMask, collideWith]);\n }\n /**\n * Gets the shape filter membership mask of a body\n * @param shape - The physics body to get the shape filter membership mask from.\n * @returns The shape filter membership mask of the given body.\n */\n getShapeFilterMembershipMask(shape) {\n return this._hknp.HP_Shape_GetFilterInfo(shape._pluginData)[1][0];\n }\n /**\n * Sets the shape filter collide mask of a body\n * @param shape - The physics body to set the shape filter collide mask for.\n * @param collideMask - The shape filter collide mask to set.\n */\n setShapeFilterCollideMask(shape, collideMask) {\n const membership = this._hknp.HP_Shape_GetFilterInfo(shape._pluginData)[1][0];\n this._hknp.HP_Shape_SetFilterInfo(shape._pluginData, [membership, collideMask]);\n }\n /**\n * Gets the shape filter collide mask of a body\n * @param shape - The physics body to get the shape filter collide mask from.\n * @returns The shape filter collide mask of the given body.\n */\n getShapeFilterCollideMask(shape) {\n return this._hknp.HP_Shape_GetFilterInfo(shape._pluginData)[1][1];\n }\n /**\n * Sets the material of a physics shape.\n * @param shape - The physics shape to set the material of.\n * @param material - The material to set.\n *\n */\n setMaterial(shape, material) {\n var _material$friction, _material$staticFrict, _material$restitution, _material$frictionCom, _material$restitution2;\n const dynamicFriction = (_material$friction = material.friction) !== null && _material$friction !== void 0 ? _material$friction : 0.5;\n const staticFriction = (_material$staticFrict = material.staticFriction) !== null && _material$staticFrict !== void 0 ? _material$staticFrict : dynamicFriction;\n const restitution = (_material$restitution = material.restitution) !== null && _material$restitution !== void 0 ? _material$restitution : 0.0;\n const frictionCombine = (_material$frictionCom = material.frictionCombine) !== null && _material$frictionCom !== void 0 ? _material$frictionCom : 1 /* PhysicsMaterialCombineMode.MINIMUM */;\n const restitutionCombine = (_material$restitution2 = material.restitutionCombine) !== null && _material$restitution2 !== void 0 ? _material$restitution2 : 2 /* PhysicsMaterialCombineMode.MAXIMUM */;\n const hpMaterial = [staticFriction, dynamicFriction, restitution, this._materialCombineToNative(frictionCombine), this._materialCombineToNative(restitutionCombine)];\n this._hknp.HP_Shape_SetMaterial(shape._pluginData, hpMaterial);\n }\n /**\n * Gets the material associated with a physics shape.\n * @param shape - The shape to get the material from.\n * @returns The material associated with the shape.\n */\n getMaterial(shape) {\n const hkMaterial = this._hknp.HP_Shape_GetMaterial(shape._pluginData)[1];\n return {\n staticFriction: hkMaterial[0],\n friction: hkMaterial[1],\n restitution: hkMaterial[2],\n frictionCombine: this._nativeToMaterialCombine(hkMaterial[3]),\n restitutionCombine: this._nativeToMaterialCombine(hkMaterial[4])\n };\n }\n /**\n * Sets the density of a physics shape.\n * @param shape - The physics shape to set the density of.\n * @param density - The density to set.\n *\n */\n setDensity(shape, density) {\n this._hknp.HP_Shape_SetDensity(shape._pluginData, density);\n }\n /**\n * Calculates the density of a given physics shape.\n *\n * @param shape - The physics shape to calculate the density of.\n * @returns The density of the given physics shape.\n *\n */\n getDensity(shape) {\n return this._hknp.HP_Shape_GetDensity(shape._pluginData)[1];\n }\n /**\n * Gets the transform infos of a given transform node.\n * This code is useful for getting the position and orientation of a given transform node.\n * It first checks if the node has a rotation quaternion, and if not, it creates one from the node's rotation.\n * It then creates an array containing the position and orientation of the node and returns it.\n * @param node - The transform node.\n * @returns An array containing the position and orientation of the node.\n */\n _getTransformInfos(node) {\n if (node.parent) {\n node.computeWorldMatrix(true);\n return [this._bVecToV3(node.absolutePosition), this._bQuatToV4(node.absoluteRotationQuaternion)];\n }\n let orientation = TmpVectors.Quaternion[0];\n if (node.rotationQuaternion) {\n orientation = node.rotationQuaternion;\n } else {\n const r = node.rotation;\n Quaternion.FromEulerAnglesToRef(r.x, r.y, r.z, orientation);\n }\n const transform = [this._bVecToV3(node.position), this._bQuatToV4(orientation)];\n return transform;\n }\n /**\n * Adds a child shape to the given shape.\n * @param shape - The parent shape.\n * @param newChild - The child shape to add.\n * @param translation - The relative translation of the child from the parent shape\n * @param rotation - The relative rotation of the child from the parent shape\n * @param scale - The relative scale scale of the child from the parent shaep\n *\n */\n addChild(shape, newChild, translation, rotation, scale) {\n const transformNative = [translation ? this._bVecToV3(translation) : [0, 0, 0], rotation ? this._bQuatToV4(rotation) : [0, 0, 0, 1], scale ? this._bVecToV3(scale) : [1, 1, 1]];\n this._hknp.HP_Shape_AddChild(shape._pluginData, newChild._pluginData, transformNative);\n }\n /**\n * Removes a child shape from a parent shape.\n * @param shape - The parent shape.\n * @param childIndex - The index of the child shape to remove.\n *\n */\n removeChild(shape, childIndex) {\n this._hknp.HP_Shape_RemoveChild(shape._pluginData, childIndex);\n }\n /**\n * Returns the number of children of the given shape.\n *\n * @param shape - The shape to get the number of children from.\n * @returns The number of children of the given shape.\n *\n */\n getNumChildren(shape) {\n return this._hknp.HP_Shape_GetNumChildren(shape._pluginData)[1];\n }\n /**\n * Marks the shape as a trigger\n * @param shape the shape to mark as a trigger\n * @param isTrigger if the shape is a trigger\n */\n setTrigger(shape, isTrigger) {\n this._hknp.HP_Shape_SetTrigger(shape._pluginData, isTrigger);\n }\n /**\n * Calculates the bounding box of a given physics shape.\n *\n * @param _shape - The physics shape to calculate the bounding box for.\n * @returns The calculated bounding box.\n *\n * This method is useful for physics engines as it allows to calculate the\n * boundaries of a given shape. Knowing the boundaries of a shape is important\n * for collision detection and other physics calculations.\n */\n getBoundingBox(_shape) {\n // get local AABB\n const aabb = this._hknp.HP_Shape_GetBoundingBox(_shape._pluginData, [[0, 0, 0], [0, 0, 0, 1]])[1];\n TmpVectors.Vector3[0].set(aabb[0][0], aabb[0][1], aabb[0][2]); // min\n TmpVectors.Vector3[1].set(aabb[1][0], aabb[1][1], aabb[1][2]); // max\n const boundingbox = new BoundingBox(TmpVectors.Vector3[0], TmpVectors.Vector3[1], Matrix.IdentityReadOnly);\n return boundingbox;\n }\n /**\n * Calculates the world bounding box of a given physics body.\n *\n * @param body - The physics body to calculate the bounding box for.\n * @returns The calculated bounding box.\n *\n * This method is useful for physics engines as it allows to calculate the\n * boundaries of a given body.\n */\n getBodyBoundingBox(body) {\n // get local AABB\n const aabb = this.getBoundingBox(body.shape);\n const boundingbox = new BoundingBox(aabb.minimum, aabb.maximum, body.transformNode.getWorldMatrix());\n return boundingbox;\n }\n /**\n * Gets the geometry of a physics body.\n *\n * @param body - The physics body.\n * @returns An object containing the positions and indices of the body's geometry.\n *\n */\n getBodyGeometry(body) {\n var _body$_pluginDataInst3;\n const dataInfo = ((_body$_pluginDataInst3 = body._pluginDataInstances) === null || _body$_pluginDataInst3 === void 0 ? void 0 : _body$_pluginDataInst3.length) > 0 ? body._pluginDataInstances[0] : body._pluginData;\n const shape = this._hknp.HP_Body_GetShape(dataInfo.hpBodyId)[1];\n const geometryRes = this._hknp.HP_Shape_CreateDebugDisplayGeometry(shape);\n if (geometryRes[0] != this._hknp.Result.RESULT_OK) {\n return {\n positions: [],\n indices: []\n };\n }\n const geometryInfo = this._hknp.HP_DebugGeometry_GetInfo(geometryRes[1])[1];\n const positionsInPlugin = new Float32Array(this._hknp.HEAPU8.buffer, geometryInfo[0], geometryInfo[1] * 3); // 3 floats per position\n const indicesInPlugin = new Uint32Array(this._hknp.HEAPU8.buffer, geometryInfo[2], geometryInfo[3] * 3); // 3 indices per triangle\n // HP_DebugGeometry_Release will free the buffer in the plugin. To avoid a\n // use-after-free, we need to make a copy of the data here.\n const positions = positionsInPlugin.slice(0);\n const indices = indicesInPlugin.slice(0);\n this._hknp.HP_DebugGeometry_Release(geometryRes[1]);\n return {\n positions: positions,\n indices: indices\n };\n }\n /**\n * Releases a physics shape from the physics engine.\n *\n * @param shape - The physics shape to be released.\n *\n * This method is useful for releasing a physics shape from the physics engine, freeing up resources and preventing memory leaks.\n */\n disposeShape(shape) {\n this._hknp.HP_Shape_Release(shape._pluginData);\n shape._pluginData = undefined;\n }\n // constraint\n /**\n * Initializes a physics constraint with the given parameters.\n *\n * @param constraint - The physics constraint to be initialized.\n * @param body - The main body\n * @param childBody - The child body.\n * @param instanceIndex - If this body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.\n * @param childInstanceIndex - If the child body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.\n *\n * This function is useful for setting up a physics constraint in a physics engine.\n */\n initConstraint(constraint, body, childBody, instanceIndex, childInstanceIndex) {\n var _constraint$_pluginDa, _options$axisA, _options$axisB;\n const type = constraint.type;\n const options = constraint.options;\n if (!type || !options) {\n Logger.Warn(\"No constraint type or options. Constraint is invalid.\");\n return;\n }\n if (body._pluginDataInstances.length > 0 && instanceIndex === undefined || childBody._pluginDataInstances.length > 0 && childInstanceIndex === undefined) {\n Logger.Warn(\"Body is instanced but no instance index was specified. Constraint will not be applied.\");\n return;\n }\n constraint._pluginData = (_constraint$_pluginDa = constraint._pluginData) !== null && _constraint$_pluginDa !== void 0 ? _constraint$_pluginDa : [];\n const jointId = this._hknp.HP_Constraint_Create()[1];\n constraint._pluginData.push(jointId);\n // body parenting\n const bodyA = this._getPluginReference(body, instanceIndex).hpBodyId;\n const bodyB = this._getPluginReference(childBody, childInstanceIndex).hpBodyId;\n this._hknp.HP_Constraint_SetParentBody(jointId, bodyA);\n this._hknp.HP_Constraint_SetChildBody(jointId, bodyB);\n this._constraintToBodyIdPair.set(jointId[0], [bodyA[0], bodyB[0]]);\n // anchors\n const pivotA = options.pivotA ? this._bVecToV3(options.pivotA) : this._bVecToV3(Vector3.Zero());\n const axisA = (_options$axisA = options.axisA) !== null && _options$axisA !== void 0 ? _options$axisA : new Vector3(1, 0, 0);\n const perpAxisA = this._tmpVec3[0];\n if (options.perpAxisA) {\n perpAxisA.copyFrom(options.perpAxisA);\n } else {\n axisA.getNormalToRef(perpAxisA);\n }\n this._hknp.HP_Constraint_SetAnchorInParent(jointId, pivotA, this._bVecToV3(axisA), this._bVecToV3(perpAxisA));\n const pivotB = options.pivotB ? this._bVecToV3(options.pivotB) : this._bVecToV3(Vector3.Zero());\n const axisB = (_options$axisB = options.axisB) !== null && _options$axisB !== void 0 ? _options$axisB : new Vector3(1, 0, 0);\n const perpAxisB = this._tmpVec3[0];\n if (options.perpAxisB) {\n perpAxisB.copyFrom(options.perpAxisB);\n } else {\n axisB.getNormalToRef(perpAxisB);\n }\n this._hknp.HP_Constraint_SetAnchorInChild(jointId, pivotB, this._bVecToV3(axisB), this._bVecToV3(perpAxisB));\n // Save the options that were used for initializing the constraint for debugging purposes\n // Check first to avoid copying the same options multiple times\n if (!constraint._initOptions) {\n constraint._initOptions = {\n axisA: axisA.clone(),\n axisB: axisB.clone(),\n perpAxisA: perpAxisA.clone(),\n perpAxisB: perpAxisB.clone(),\n pivotA: new Vector3(pivotA[0], pivotA[1], pivotA[2]),\n pivotB: new Vector3(pivotB[0], pivotB[1], pivotB[2])\n };\n }\n if (type == 5 /* PhysicsConstraintType.LOCK */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n } else if (type == 2 /* PhysicsConstraintType.DISTANCE */) {\n const distance = options.maxDistance || 0;\n const dist3d = this._hknp.ConstraintAxis.LINEAR_DISTANCE;\n this._hknp.HP_Constraint_SetAxisMode(jointId, dist3d, this._hknp.ConstraintAxisLimitMode.LIMITED);\n this._hknp.HP_Constraint_SetAxisMinLimit(jointId, dist3d, distance);\n this._hknp.HP_Constraint_SetAxisMaxLimit(jointId, dist3d, distance);\n } else if (type == 3 /* PhysicsConstraintType.HINGE */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n } else if (type == 6 /* PhysicsConstraintType.PRISMATIC */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n } else if (type == 4 /* PhysicsConstraintType.SLIDER */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n } else if (type == 1 /* PhysicsConstraintType.BALL_AND_SOCKET */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n } else if (type == 7 /* PhysicsConstraintType.SIX_DOF */) {\n const sixdofData = constraint;\n for (const l of sixdofData.limits) {\n var _l$minLimit, _l$maxLimit;\n const axId = this._constraintAxisToNative(l.axis);\n if (((_l$minLimit = l.minLimit) !== null && _l$minLimit !== void 0 ? _l$minLimit : -1) == 0 && ((_l$maxLimit = l.maxLimit) !== null && _l$maxLimit !== void 0 ? _l$maxLimit : -1) == 0) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, axId, this._hknp.ConstraintAxisLimitMode.LOCKED);\n } else {\n if (l.minLimit != undefined) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, axId, this._hknp.ConstraintAxisLimitMode.LIMITED);\n this._hknp.HP_Constraint_SetAxisMinLimit(jointId, axId, l.minLimit);\n }\n if (l.maxLimit != undefined) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, axId, this._hknp.ConstraintAxisLimitMode.LIMITED);\n this._hknp.HP_Constraint_SetAxisMaxLimit(jointId, axId, l.maxLimit);\n }\n }\n if (l.stiffness) {\n this._hknp.HP_Constraint_SetAxisStiffness(jointId, axId, l.stiffness);\n }\n if (l.damping) {\n this._hknp.HP_Constraint_SetAxisDamping(jointId, axId, l.damping);\n }\n }\n } else {\n throw new Error(\"Unsupported Constraint Type.\");\n }\n const collisionEnabled = !!options.collision;\n this._hknp.HP_Constraint_SetCollisionsEnabled(jointId, collisionEnabled);\n this._hknp.HP_Constraint_SetEnabled(jointId, true);\n }\n /**\n * Get a list of all the pairs of bodies that are connected by this constraint.\n * @param constraint the constraint to search from\n * @returns a list of parent, child pairs\n */\n getBodiesUsingConstraint(constraint) {\n const pairs = [];\n for (const jointId of constraint._pluginData) {\n const bodyIds = this._constraintToBodyIdPair.get(jointId[0]);\n if (bodyIds) {\n const parentBodyInfo = this._bodies.get(bodyIds[0]);\n const childBodyInfo = this._bodies.get(bodyIds[1]);\n if (parentBodyInfo && childBodyInfo) {\n pairs.push({\n parentBody: parentBodyInfo.body,\n parentBodyIndex: parentBodyInfo.index,\n childBody: childBodyInfo.body,\n childBodyIndex: childBodyInfo.index\n });\n }\n }\n }\n return pairs;\n }\n /**\n * Adds a constraint to the physics engine.\n *\n * @param body - The main body to which the constraint is applied.\n * @param childBody - The body to which the constraint is applied.\n * @param constraint - The constraint to be applied.\n * @param instanceIndex - If this body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.\n * @param childInstanceIndex - If the child body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.\n */\n addConstraint(body, childBody, constraint, instanceIndex, childInstanceIndex) {\n //<todo It's real weird that initConstraint() is called only after adding to a body!\n this.initConstraint(constraint, body, childBody, instanceIndex, childInstanceIndex);\n }\n /**\n * Enables or disables a constraint in the physics engine.\n * @param constraint - The constraint to enable or disable.\n * @param isEnabled - Whether the constraint should be enabled or disabled.\n *\n */\n setEnabled(constraint, isEnabled) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetEnabled(jointId, isEnabled);\n }\n }\n /**\n * Gets the enabled state of the given constraint.\n * @param constraint - The constraint to get the enabled state from.\n * @returns The enabled state of the given constraint.\n *\n */\n getEnabled(constraint) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetEnabled(firstId)[1];\n }\n return false;\n }\n /**\n * Enables or disables collisions for the given constraint.\n * @param constraint - The constraint to enable or disable collisions for.\n * @param isEnabled - Whether collisions should be enabled or disabled.\n *\n */\n setCollisionsEnabled(constraint, isEnabled) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetCollisionsEnabled(jointId, isEnabled);\n }\n }\n /**\n * Gets whether collisions are enabled for the given constraint.\n * @param constraint - The constraint to get collisions enabled for.\n * @returns Whether collisions are enabled for the given constraint.\n *\n */\n getCollisionsEnabled(constraint) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetCollisionsEnabled(firstId)[1];\n }\n return false;\n }\n /**\n * Sets the friction of the given axis of the given constraint.\n *\n * @param constraint - The constraint to set the friction of.\n * @param axis - The axis of the constraint to set the friction of.\n * @param friction - The friction to set.\n *\n */\n setAxisFriction(constraint, axis, friction) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisFriction(jointId, this._constraintAxisToNative(axis), friction);\n }\n }\n /**\n * Gets the friction value of the specified axis of the given constraint.\n *\n * @param constraint - The constraint to get the axis friction from.\n * @param axis - The axis to get the friction from.\n * @returns The friction value of the specified axis.\n *\n */\n getAxisFriction(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisFriction(firstId, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Sets the limit mode of the specified axis of the given constraint.\n * @param constraint - The constraint to set the axis mode of.\n * @param axis - The axis to set the limit mode of.\n * @param limitMode - The limit mode to set.\n */\n setAxisMode(constraint, axis, limitMode) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._constraintAxisToNative(axis), this._limitModeToNative(limitMode));\n }\n }\n /**\n * Gets the axis limit mode of the given constraint.\n *\n * @param constraint - The constraint to get the axis limit mode from.\n * @param axis - The axis to get the limit mode from.\n * @returns The axis limit mode of the given constraint.\n *\n */\n getAxisMode(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n const mode = this._hknp.HP_Constraint_GetAxisMode(firstId, this._constraintAxisToNative(axis))[1];\n return this._nativeToLimitMode(mode);\n }\n return null;\n }\n /**\n * Sets the minimum limit of the given axis of the given constraint.\n * @param constraint - The constraint to set the minimum limit of.\n * @param axis - The axis to set the minimum limit of.\n * @param limit - The minimum limit to set.\n *\n */\n setAxisMinLimit(constraint, axis, limit) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMinLimit(jointId, this._constraintAxisToNative(axis), limit);\n }\n }\n /**\n * Gets the minimum limit of the specified axis of the given constraint.\n * @param constraint - The constraint to get the minimum limit from.\n * @param axis - The axis to get the minimum limit from.\n * @returns The minimum limit of the specified axis of the given constraint.\n *\n */\n getAxisMinLimit(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisMinLimit(firstId, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Sets the maximum limit of the given axis of the given constraint.\n * @param constraint - The constraint to set the maximum limit of the given axis.\n * @param axis - The axis to set the maximum limit of.\n * @param limit - The maximum limit to set.\n *\n */\n setAxisMaxLimit(constraint, axis, limit) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMaxLimit(jointId, this._constraintAxisToNative(axis), limit);\n }\n }\n /**\n * Gets the maximum limit of the given axis of the given constraint.\n *\n * @param constraint - The constraint to get the maximum limit from.\n * @param axis - The axis to get the maximum limit from.\n * @returns The maximum limit of the given axis of the given constraint.\n *\n */\n getAxisMaxLimit(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisMaxLimit(firstId, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Sets the motor type of the given axis of the given constraint.\n * @param constraint - The constraint to set the motor type of.\n * @param axis - The axis of the constraint to set the motor type of.\n * @param motorType - The motor type to set.\n *\n */\n setAxisMotorType(constraint, axis, motorType) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMotorType(jointId, this._constraintAxisToNative(axis), this._constraintMotorTypeToNative(motorType));\n }\n }\n /**\n * Gets the motor type of the specified axis of the given constraint.\n * @param constraint - The constraint to get the motor type from.\n * @param axis - The axis of the constraint to get the motor type from.\n * @returns The motor type of the specified axis of the given constraint.\n *\n */\n getAxisMotorType(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._nativeToMotorType(this._hknp.HP_Constraint_GetAxisMotorType(firstId, this._constraintAxisToNative(axis))[1]);\n }\n return null;\n }\n /**\n * Sets the target of an axis motor of a constraint.\n *\n * @param constraint - The constraint to set the axis motor target of.\n * @param axis - The axis of the constraint to set the motor target of.\n * @param target - The target of the axis motor.\n *\n */\n setAxisMotorTarget(constraint, axis, target) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMotorTarget(jointId, this._constraintAxisToNative(axis), target);\n }\n }\n /**\n * Gets the target of the motor of the given axis of the given constraint.\n *\n * @param constraint - The constraint to get the motor target from.\n * @param axis - The axis of the constraint to get the motor target from.\n * @returns The target of the motor of the given axis of the given constraint.\n *\n */\n getAxisMotorTarget(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisMotorTarget(constraint._pluginData, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Sets the maximum force that can be applied by the motor of the given constraint axis.\n * @param constraint - The constraint to set the motor max force for.\n * @param axis - The axis of the constraint to set the motor max force for.\n * @param maxForce - The maximum force that can be applied by the motor.\n *\n */\n setAxisMotorMaxForce(constraint, axis, maxForce) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMotorMaxForce(jointId, this._constraintAxisToNative(axis), maxForce);\n }\n }\n /**\n * Gets the maximum force of the motor of the given constraint axis.\n *\n * @param constraint - The constraint to get the motor maximum force from.\n * @param axis - The axis of the constraint to get the motor maximum force from.\n * @returns The maximum force of the motor of the given constraint axis.\n *\n */\n getAxisMotorMaxForce(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisMotorMaxForce(firstId, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Disposes a physics constraint.\n *\n * @param constraint - The physics constraint to dispose.\n *\n * This method is useful for releasing the resources associated with a physics constraint, such as\n * the Havok constraint, when it is no longer needed. This is important for avoiding memory leaks.\n */\n disposeConstraint(constraint) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetEnabled(jointId, false);\n this._hknp.HP_Constraint_Release(jointId);\n }\n constraint._pluginData.length = 0;\n }\n _populateHitData(hitData, result) {\n const hitBody = this._bodies.get(hitData[0][0]);\n result.body = hitBody === null || hitBody === void 0 ? void 0 : hitBody.body;\n result.bodyIndex = hitBody === null || hitBody === void 0 ? void 0 : hitBody.index;\n const hitShape = this._shapes.get(hitData[1][0]);\n result.shape = hitShape;\n const hitPos = hitData[3];\n const hitNormal = hitData[4];\n const hitTriangle = hitData[5];\n result.setHitData({\n x: hitNormal[0],\n y: hitNormal[1],\n z: hitNormal[2]\n }, {\n x: hitPos[0],\n y: hitPos[1],\n z: hitPos[2]\n }, hitTriangle);\n }\n /**\n * Performs a raycast from a given start point to a given end point and stores the result in a given PhysicsRaycastResult object.\n *\n * @param from - The start point of the raycast.\n * @param to - The end point of the raycast.\n * @param result - The PhysicsRaycastResult object to store the result of the raycast.\n * @param query - The raycast query options. See [[IRaycastQuery]] for more information.\n *\n * Performs a raycast. It takes in two points, from and to, and a PhysicsRaycastResult object to store the result of the raycast.\n * It then performs the raycast and stores the hit data in the PhysicsRaycastResult object.\n */\n raycast(from, to, result, query) {\n var _query$membership, _query$collideWith, _query$shouldHitTrigg;\n const queryMembership = (_query$membership = query === null || query === void 0 ? void 0 : query.membership) !== null && _query$membership !== void 0 ? _query$membership : ~0;\n const queryCollideWith = (_query$collideWith = query === null || query === void 0 ? void 0 : query.collideWith) !== null && _query$collideWith !== void 0 ? _query$collideWith : ~0;\n const shouldHitTriggers = (_query$shouldHitTrigg = query === null || query === void 0 ? void 0 : query.shouldHitTriggers) !== null && _query$shouldHitTrigg !== void 0 ? _query$shouldHitTrigg : false;\n result.reset(from, to);\n const bodyToIgnore = [BigInt(0)];\n const hkQuery = [this._bVecToV3(from), this._bVecToV3(to), [queryMembership, queryCollideWith], shouldHitTriggers, bodyToIgnore];\n this._hknp.HP_World_CastRayWithCollector(this.world, this._queryCollector, hkQuery);\n if (this._hknp.HP_QueryCollector_GetNumHits(this._queryCollector)[1] > 0) {\n const [, hitData] = this._hknp.HP_QueryCollector_GetCastRayResult(this._queryCollector, 0)[1];\n this._populateHitData(hitData, result);\n result.calculateHitDistance();\n }\n }\n /**\n * Given a point, returns the closest physics\n * body to that point.\n * @param query the query to perform. @see IPhysicsPointProximityQuery\n * @param result contact point on the hit shape, in world space\n */\n pointProximity(query, result) {\n var _query$collisionFilte, _query$collisionFilte2, _query$collisionFilte3, _query$collisionFilte4;\n const queryMembership = (_query$collisionFilte = query === null || query === void 0 || (_query$collisionFilte2 = query.collisionFilter) === null || _query$collisionFilte2 === void 0 ? void 0 : _query$collisionFilte2.membership) !== null && _query$collisionFilte !== void 0 ? _query$collisionFilte : ~0;\n const queryCollideWith = (_query$collisionFilte3 = query === null || query === void 0 || (_query$collisionFilte4 = query.collisionFilter) === null || _query$collisionFilte4 === void 0 ? void 0 : _query$collisionFilte4.collideWith) !== null && _query$collisionFilte3 !== void 0 ? _query$collisionFilte3 : ~0;\n result.reset();\n const bodyToIgnore = query.ignoreBody ? [BigInt(query.ignoreBody._pluginData.hpBodyId[0])] : [BigInt(0)];\n const hkQuery = [this._bVecToV3(query.position), query.maxDistance, [queryMembership, queryCollideWith], query.shouldHitTriggers, bodyToIgnore];\n this._hknp.HP_World_PointProximityWithCollector(this.world, this._queryCollector, hkQuery);\n if (this._hknp.HP_QueryCollector_GetNumHits(this._queryCollector)[1] > 0) {\n const [distance, hitData] = this._hknp.HP_QueryCollector_GetPointProximityResult(this._queryCollector, 0)[1];\n this._populateHitData(hitData, result);\n result.setHitDistance(distance);\n }\n }\n /**\n * Given a shape in a specific position and orientation, returns the closest point to that shape.\n * @param query the query to perform. @see IPhysicsShapeProximityCastQuery\n * @param inputShapeResult contact point on input shape, in input shape space\n * @param hitShapeResult contact point on hit shape, in world space\n */\n shapeProximity(query, inputShapeResult, hitShapeResult) {\n inputShapeResult.reset();\n hitShapeResult.reset();\n const shapeId = query.shape._pluginData;\n const bodyToIgnore = query.ignoreBody ? [BigInt(query.ignoreBody._pluginData.hpBodyId[0])] : [BigInt(0)];\n const hkQuery = [shapeId, this._bVecToV3(query.position), this._bQuatToV4(query.rotation), query.maxDistance, query.shouldHitTriggers, bodyToIgnore];\n this._hknp.HP_World_ShapeProximityWithCollector(this.world, this._queryCollector, hkQuery);\n if (this._hknp.HP_QueryCollector_GetNumHits(this._queryCollector)[1] > 0) {\n const [distance, hitInputData, hitShapeData] = this._hknp.HP_QueryCollector_GetShapeProximityResult(this._queryCollector, 0)[1];\n this._populateHitData(hitInputData, inputShapeResult);\n this._populateHitData(hitShapeData, hitShapeResult);\n inputShapeResult.setHitDistance(distance);\n hitShapeResult.setHitDistance(distance);\n }\n }\n /**\n * Given a shape in a specific orientation, cast it from the start to end position specified by the query, and return the first hit.\n * @param query the query to perform. @see IPhysicsShapeCastQuery\n * @param inputShapeResult contact point on input shape, in input shape space\n * @param hitShapeResult contact point on hit shape, in world space\n */\n shapeCast(query, inputShapeResult, hitShapeResult) {\n inputShapeResult.reset();\n hitShapeResult.reset();\n const shapeId = query.shape._pluginData;\n const bodyToIgnore = query.ignoreBody ? [BigInt(query.ignoreBody._pluginData.hpBodyId[0])] : [BigInt(0)];\n const hkQuery = [shapeId, this._bQuatToV4(query.rotation), this._bVecToV3(query.startPosition), this._bVecToV3(query.endPosition), query.shouldHitTriggers, bodyToIgnore];\n this._hknp.HP_World_ShapeCastWithCollector(this.world, this._queryCollector, hkQuery);\n if (this._hknp.HP_QueryCollector_GetNumHits(this._queryCollector)[1] > 0) {\n const [fractionAlongRay, hitInputData, hitShapeData] = this._hknp.HP_QueryCollector_GetShapeCastResult(this._queryCollector, 0)[1];\n this._populateHitData(hitInputData, inputShapeResult);\n this._populateHitData(hitShapeData, hitShapeResult);\n inputShapeResult.setHitFraction(fractionAlongRay);\n hitShapeResult.setHitFraction(fractionAlongRay);\n }\n }\n /**\n * Return the collision observable for a particular physics body.\n * @param body the physics body\n * @returns the collision observable for the body\n */\n getCollisionObservable(body) {\n const bodyId = body._pluginData.hpBodyId[0];\n let observable = this._bodyCollisionObservable.get(bodyId);\n if (!observable) {\n observable = new Observable();\n this._bodyCollisionObservable.set(bodyId, observable);\n }\n return observable;\n }\n /**\n * Return the collision ended observable for a particular physics body.\n * @param body the physics body\n * @returns\n */\n getCollisionEndedObservable(body) {\n const bodyId = body._pluginData.hpBodyId[0];\n let observable = this._bodyCollisionEndedObservable.get(bodyId);\n if (!observable) {\n observable = new Observable();\n this._bodyCollisionEndedObservable.set(bodyId, observable);\n }\n return observable;\n }\n /**\n * Enable collision to be reported for a body when a callback is setup on the world\n * @param body the physics body\n * @param enabled whether to enable or disable collision events\n */\n setCollisionCallbackEnabled(body, enabled) {\n // Register for collide events by default\n const collideEvents = this._hknp.EventType.COLLISION_STARTED.value | this._hknp.EventType.COLLISION_CONTINUED.value | this._hknp.EventType.COLLISION_FINISHED.value;\n if (body._pluginDataInstances && body._pluginDataInstances.length) {\n body._pluginDataInstances.forEach(bodyId => {\n this._hknp.HP_Body_SetEventMask(bodyId.hpBodyId, enabled ? collideEvents : 0);\n });\n } else if (body._pluginData) {\n this._hknp.HP_Body_SetEventMask(body._pluginData.hpBodyId, enabled ? collideEvents : 0);\n }\n }\n /**\n * Enable collision ended to be reported for a body when a callback is setup on the world\n * @param body the physics body\n * @param enabled whether to enable or disable collision ended events\n */\n setCollisionEndedCallbackEnabled(body, enabled) {\n // Register to collide ended events\n const pluginRef = this._getPluginReference(body);\n let currentCollideEvents = this._hknp.HP_Body_GetEventMask(pluginRef.hpBodyId)[1];\n // update with the ended mask\n currentCollideEvents = enabled ? currentCollideEvents | this._hknp.EventType.COLLISION_FINISHED.value : currentCollideEvents & ~this._hknp.EventType.COLLISION_FINISHED.value;\n if (body._pluginDataInstances && body._pluginDataInstances.length) {\n body._pluginDataInstances.forEach(bodyId => {\n this._hknp.HP_Body_SetEventMask(bodyId.hpBodyId, currentCollideEvents);\n });\n } else if (body._pluginData) {\n this._hknp.HP_Body_SetEventMask(body._pluginData.hpBodyId, currentCollideEvents);\n }\n }\n _notifyTriggers() {\n let eventAddress = this._hknp.HP_World_GetTriggerEvents(this.world)[1];\n const event = new TriggerEvent();\n while (eventAddress) {\n TriggerEvent.readToRef(this._hknp.HEAPU8.buffer, eventAddress, event);\n const bodyInfoA = this._bodies.get(event.bodyIdA);\n const bodyInfoB = this._bodies.get(event.bodyIdB);\n // Bodies may have been disposed between events. Check both still exist.\n if (bodyInfoA && bodyInfoB) {\n const triggerCollisionInfo = {\n collider: bodyInfoA.body,\n colliderIndex: bodyInfoA.index,\n collidedAgainst: bodyInfoB.body,\n collidedAgainstIndex: bodyInfoB.index,\n type: this._nativeTriggerCollisionValueToCollisionType(event.type)\n };\n this.onTriggerCollisionObservable.notifyObservers(triggerCollisionInfo);\n }\n eventAddress = this._hknp.HP_World_GetNextTriggerEvent(this.world, eventAddress);\n }\n }\n /**\n * Runs thru all detected collisions and filter by body\n */\n _notifyCollisions() {\n let eventAddress = this._hknp.HP_World_GetCollisionEvents(this.world)[1];\n const event = new CollisionEvent();\n const worldAddr = Number(this.world);\n while (eventAddress) {\n CollisionEvent.readToRef(this._hknp.HEAPU8.buffer, eventAddress, event);\n const bodyInfoA = this._bodies.get(event.contactOnA.bodyId);\n const bodyInfoB = this._bodies.get(event.contactOnB.bodyId);\n // Bodies may have been disposed between events. Check both still exist.\n if (bodyInfoA && bodyInfoB) {\n const collisionInfo = {\n collider: bodyInfoA.body,\n colliderIndex: bodyInfoA.index,\n collidedAgainst: bodyInfoB.body,\n collidedAgainstIndex: bodyInfoB.index,\n type: this._nativeCollisionValueToCollisionType(event.type)\n };\n if (collisionInfo.type === \"COLLISION_FINISHED\" /* PhysicsEventType.COLLISION_FINISHED */) {\n this.onCollisionEndedObservable.notifyObservers(collisionInfo);\n } else {\n event.contactOnB.position.subtractToRef(event.contactOnA.position, this._tmpVec3[0]);\n const distance = Vector3.Dot(this._tmpVec3[0], event.contactOnA.normal);\n collisionInfo.point = event.contactOnA.position;\n collisionInfo.distance = distance;\n collisionInfo.impulse = event.impulseApplied;\n collisionInfo.normal = event.contactOnA.normal;\n this.onCollisionObservable.notifyObservers(collisionInfo);\n }\n if (this._bodyCollisionObservable.size && collisionInfo.type !== \"COLLISION_FINISHED\" /* PhysicsEventType.COLLISION_FINISHED */) {\n const observableA = this._bodyCollisionObservable.get(event.contactOnA.bodyId);\n const observableB = this._bodyCollisionObservable.get(event.contactOnB.bodyId);\n event.contactOnA.position.subtractToRef(event.contactOnB.position, this._tmpVec3[0]);\n const distance = Vector3.Dot(this._tmpVec3[0], event.contactOnB.normal);\n if (observableA) {\n observableA.notifyObservers(collisionInfo);\n }\n if (observableB) {\n const collisionInfoB = {\n collider: bodyInfoB.body,\n colliderIndex: bodyInfoB.index,\n collidedAgainst: bodyInfoA.body,\n collidedAgainstIndex: bodyInfoA.index,\n point: event.contactOnB.position,\n distance: distance,\n impulse: event.impulseApplied,\n normal: event.contactOnB.normal,\n type: this._nativeCollisionValueToCollisionType(event.type)\n };\n observableB.notifyObservers(collisionInfoB);\n }\n } else if (this._bodyCollisionEndedObservable.size) {\n const observableA = this._bodyCollisionEndedObservable.get(event.contactOnA.bodyId);\n const observableB = this._bodyCollisionEndedObservable.get(event.contactOnB.bodyId);\n event.contactOnA.position.subtractToRef(event.contactOnB.position, this._tmpVec3[0]);\n const distance = Vector3.Dot(this._tmpVec3[0], event.contactOnB.normal);\n if (observableA) {\n observableA.notifyObservers(collisionInfo);\n }\n if (observableB) {\n const collisionInfoB = {\n collider: bodyInfoB.body,\n colliderIndex: bodyInfoB.index,\n collidedAgainst: bodyInfoA.body,\n collidedAgainstIndex: bodyInfoA.index,\n point: event.contactOnB.position,\n distance: distance,\n impulse: event.impulseApplied,\n normal: event.contactOnB.normal,\n type: this._nativeCollisionValueToCollisionType(event.type)\n };\n observableB.notifyObservers(collisionInfoB);\n }\n }\n }\n eventAddress = this._hknp.HP_World_GetNextCollisionEvent(worldAddr, eventAddress);\n }\n }\n /**\n * Gets the number of bodies in the world\n */\n get numBodies() {\n return this._hknp.HP_World_GetNumBodies(this.world)[1];\n }\n /**\n * Dispose the world and free resources\n */\n dispose() {\n if (this._queryCollector) {\n this._hknp.HP_QueryCollector_Release(this._queryCollector);\n this._queryCollector = undefined;\n }\n if (this.world) {\n this._hknp.HP_World_Release(this.world);\n this.world = undefined;\n }\n }\n _v3ToBvecRef(v, vec3) {\n vec3.set(v[0], v[1], v[2]);\n }\n _bVecToV3(v) {\n return [v._x, v._y, v._z];\n }\n _bQuatToV4(q) {\n return [q._x, q._y, q._z, q._w];\n }\n _constraintMotorTypeToNative(motorType) {\n switch (motorType) {\n case 2 /* PhysicsConstraintMotorType.POSITION */:\n return this._hknp.ConstraintMotorType.POSITION;\n case 1 /* PhysicsConstraintMotorType.VELOCITY */:\n return this._hknp.ConstraintMotorType.VELOCITY;\n }\n return this._hknp.ConstraintMotorType.NONE;\n }\n _nativeToMotorType(motorType) {\n switch (motorType) {\n case this._hknp.ConstraintMotorType.POSITION:\n return 2 /* PhysicsConstraintMotorType.POSITION */;\n case this._hknp.ConstraintMotorType.VELOCITY:\n return 1 /* PhysicsConstraintMotorType.VELOCITY */;\n }\n return 0 /* PhysicsConstraintMotorType.NONE */;\n }\n _materialCombineToNative(mat) {\n switch (mat) {\n case 0 /* PhysicsMaterialCombineMode.GEOMETRIC_MEAN */:\n return this._hknp.MaterialCombine.GEOMETRIC_MEAN;\n case 1 /* PhysicsMaterialCombineMode.MINIMUM */:\n return this._hknp.MaterialCombine.MINIMUM;\n case 2 /* PhysicsMaterialCombineMode.MAXIMUM */:\n return this._hknp.MaterialCombine.MAXIMUM;\n case 3 /* PhysicsMaterialCombineMode.ARITHMETIC_MEAN */:\n return this._hknp.MaterialCombine.ARITHMETIC_MEAN;\n case 4 /* PhysicsMaterialCombineMode.MULTIPLY */:\n return this._hknp.MaterialCombine.MULTIPLY;\n }\n }\n _nativeToMaterialCombine(mat) {\n switch (mat) {\n case this._hknp.MaterialCombine.GEOMETRIC_MEAN:\n return 0 /* PhysicsMaterialCombineMode.GEOMETRIC_MEAN */;\n case this._hknp.MaterialCombine.MINIMUM:\n return 1 /* PhysicsMaterialCombineMode.MINIMUM */;\n case this._hknp.MaterialCombine.MAXIMUM:\n return 2 /* PhysicsMaterialCombineMode.MAXIMUM */;\n case this._hknp.MaterialCombine.ARITHMETIC_MEAN:\n return 3 /* PhysicsMaterialCombineMode.ARITHMETIC_MEAN */;\n case this._hknp.MaterialCombine.MULTIPLY:\n return 4 /* PhysicsMaterialCombineMode.MULTIPLY */;\n default:\n return undefined;\n }\n }\n _constraintAxisToNative(axId) {\n switch (axId) {\n case 0 /* PhysicsConstraintAxis.LINEAR_X */:\n return this._hknp.ConstraintAxis.LINEAR_X;\n case 1 /* PhysicsConstraintAxis.LINEAR_Y */:\n return this._hknp.ConstraintAxis.LINEAR_Y;\n case 2 /* PhysicsConstraintAxis.LINEAR_Z */:\n return this._hknp.ConstraintAxis.LINEAR_Z;\n case 3 /* PhysicsConstraintAxis.ANGULAR_X */:\n return this._hknp.ConstraintAxis.ANGULAR_X;\n case 4 /* PhysicsConstraintAxis.ANGULAR_Y */:\n return this._hknp.ConstraintAxis.ANGULAR_Y;\n case 5 /* PhysicsConstraintAxis.ANGULAR_Z */:\n return this._hknp.ConstraintAxis.ANGULAR_Z;\n case 6 /* PhysicsConstraintAxis.LINEAR_DISTANCE */:\n return this._hknp.ConstraintAxis.LINEAR_DISTANCE;\n }\n }\n _nativeToLimitMode(mode) {\n switch (mode) {\n case this._hknp.ConstraintAxisLimitMode.FREE:\n return 0 /* PhysicsConstraintAxisLimitMode.FREE */;\n case this._hknp.ConstraintAxisLimitMode.LIMITED:\n return 1 /* PhysicsConstraintAxisLimitMode.LIMITED */;\n case this._hknp.ConstraintAxisLimitMode.LOCKED:\n return 2 /* PhysicsConstraintAxisLimitMode.LOCKED */;\n }\n return 0 /* PhysicsConstraintAxisLimitMode.FREE */;\n }\n _limitModeToNative(mode) {\n switch (mode) {\n case 0 /* PhysicsConstraintAxisLimitMode.FREE */:\n return this._hknp.ConstraintAxisLimitMode.FREE;\n case 1 /* PhysicsConstraintAxisLimitMode.LIMITED */:\n return this._hknp.ConstraintAxisLimitMode.LIMITED;\n case 2 /* PhysicsConstraintAxisLimitMode.LOCKED */:\n return this._hknp.ConstraintAxisLimitMode.LOCKED;\n }\n }\n _nativeCollisionValueToCollisionType(type) {\n switch (type) {\n case this._hknp.EventType.COLLISION_STARTED.value:\n return \"COLLISION_STARTED\" /* PhysicsEventType.COLLISION_STARTED */;\n case this._hknp.EventType.COLLISION_FINISHED.value:\n return \"COLLISION_FINISHED\" /* PhysicsEventType.COLLISION_FINISHED */;\n case this._hknp.EventType.COLLISION_CONTINUED.value:\n return \"COLLISION_CONTINUED\" /* PhysicsEventType.COLLISION_CONTINUED */;\n }\n return \"COLLISION_STARTED\" /* PhysicsEventType.COLLISION_STARTED */;\n }\n _nativeTriggerCollisionValueToCollisionType(type) {\n switch (type) {\n case 8:\n return \"TRIGGER_ENTERED\" /* PhysicsEventType.TRIGGER_ENTERED */;\n case 16:\n return \"TRIGGER_EXITED\" /* PhysicsEventType.TRIGGER_EXITED */;\n }\n return \"TRIGGER_ENTERED\" /* PhysicsEventType.TRIGGER_ENTERED */;\n }\n}","map":{"version":3,"names":["Matrix","Quaternion","TmpVectors","Vector3","PhysicsPrestepType","Logger","PhysicsShape","BoundingBox","Mesh","InstancedMesh","VertexBuffer","BuildArray","Observable","MeshAccumulator","constructor","mesh","collectIndices","scene","_vertices","_indices","_isRightHanded","useRightHandedSystem","_collectIndices","addNodeMeshes","includeChildren","computeWorldMatrix","rootScaled","ScalingToRef","absoluteScaling","x","y","z","_addMesh","sourceMesh","worldToRoot","invertToRef","worldToRootScaled","multiplyToRef","children","getChildMeshes","filter","m","physicsBody","forEach","childToWorld","childToRootScaled","meshToRoot","vertexData","getVerticesData","PositionKind","numVerts","length","indexOffset","v","pos","push","TransformCoordinates","meshIndices","getIndices","i","getVertices","plugin","nFloats","bytesPerFloat","nBytes","bufferBegin","_malloc","ret","Float32Array","HEAPU8","buffer","offset","numObjects","freeBuffer","arr","_free","getTriangles","bytesPerInt","Int32Array","BodyPluginData","bodyId","hpBodyId","userMassProps","centerOfMass","undefined","mass","inertia","inertiaOrientation","CollisionContactPoint","BigInt","position","normal","CollisionEvent","contactOnA","contactOnB","impulseApplied","type","readToRef","eventOut","intBuf","floatBuf","offA","set","offB","TriggerEvent","bodyIdA","bodyIdB","HavokPlugin","_useDeltaForWorldStep","hpInjection","HK","_hknp","name","_fixedTimeStep","_tmpVec3","Zero","_bodies","Map","_shapes","_bodyCollisionObservable","_constraintToBodyIdPair","_bodyCollisionEndedObservable","onCollisionObservable","onCollisionEndedObservable","onTriggerCollisionObservable","Error","isSupported","world","HP_World_Create","_queryCollector","HP_QueryCollector_Create","setGravity","gravity","HP_World_SetGravity","_bVecToV3","setTimeStep","timeStep","getTimeStep","executeStep","delta","physicsBodies","disablePreStep","setPhysicsBodyTransformation","transformNode","deltaTime","HP_World_SetIdealStepTime","HP_World_Step","_bodyBuffer","HP_World_GetBodyBuffer","disableSync","sync","_notifyCollisions","_notifyTriggers","getPluginVersion","setVelocityLimits","maxLinearVelocity","maxAngularVelocity","HP_World_SetSpeedLimit","getMaxLinearVelocity","limits","HP_World_GetSpeedLimit","getMaxAngularVelocity","initBody","body","motionType","orientation","_pluginData","HP_Body_Create","_internalSetMotionType","transform","_bQuatToV4","HP_Body_SetQTransform","HP_World_AddBody","startAsleep","index","removeBody","_pluginDataInstances","instance","delete","HP_World_RemoveBody","initBodyInstances","_mesh$_thinInstanceDa","_mesh$_thinInstanceDa2","instancesCount","_thinInstanceDataStorage","matrixData","_createOrUpdateBodyInstances","startIndex","endIndex","update","rotation","rotationMatrix","Identity","hkbody","setRowFromFloats","FromRotationMatrixToRef","w","pluginData","_internalUpdateMassProperties","worldTransformOffset","HP_Body_GetWorldTransformOffset","updateBodyInstances","_mesh$_thinInstanceDa3","_mesh$_thinInstanceDa4","pluginInstancesCount","getMotionType","firstBodyShape","HP_Body_GetShape","_body$shape","shape","HP_Body_SetShape","instancesToRemove","pop","HP_Body_Release","syncTransform","bufOffset","transformBuffer","mi","thinInstanceBufferUpdated","bodyTransform","HP_Body_GetQTransform","bodyTranslation","bodyOrientation","quat","parent","getWorldMatrix","isIdentity","_transformNode$rotati","copyFrom","scaling","normalize","finalTransform","finalTranslation","copyFromFloats","ComposeToRef","parentInverseTransform","localTransform","decomposeToTransformNode","rotationQuaternion","toEulerAnglesToRef","e","message","setShape","_body$transformNode$_","_m$_thinInstanceDataS","_m$_thinInstanceDataS2","shapeHandle","_getPluginReference","instanceIndex","_body$_pluginDataInst","getShape","pluginRef","shapePluginData","getScene","getShapeType","HP_Shape_GetType","setEventMask","eventMask","_applyToBodyOrInstances","bodyPluginData","HP_Body_SetEventMask","getEventMask","HP_Body_GetEventMask","_fromMassPropertiesTuple","massPropsTuple","FromArray","newProps","_internalComputeMassProperties","massProps","asArray","HP_Body_SetMassProperties","HP_Body_SetMotionType","MotionType","STATIC","KINEMATIC","DYNAMIC","setMotionType","HP_Body_GetMotionType","setActivationControl","controlMode","HP_Body_SetActivationControl","ActivationControl","ALWAYS_ACTIVE","ALWAYS_INACTIVE","SIMULATION_CONTROLLED","shapeRes","Result","RESULT_OK","shapeMass","HP_Shape_BuildMassProperties","computeMassProperties","computed","setMassProperties","getMassProperties","HP_Body_GetMassProperties","setLinearDamping","damping","HP_Body_SetLinearDamping","getLinearDamping","HP_Body_GetLinearDamping","setAngularDamping","HP_Body_SetAngularDamping","getAngularDamping","HP_Body_GetAngularDamping","setLinearVelocity","linVel","HP_Body_SetLinearVelocity","getLinearVelocityToRef","lv","HP_Body_GetLinearVelocity","_v3ToBvecRef","fnToApply","_body$_pluginDataInst2","applyImpulse","impulse","location","HP_Body_ApplyImpulse","applyAngularImpulse","angularImpulse","HP_Body_ApplyAngularImpulse","applyForce","force","scaleToRef","setAngularVelocity","angVel","HP_Body_SetAngularVelocity","getAngularVelocityToRef","av","HP_Body_GetAngularVelocity","node","getPrestepType","TELEPORT","numInstances","_getTransformInfos","ACTION","setTargetTransform","absolutePosition","absoluteRotationQuaternion","DISABLED","Warn","HP_Body_SetTargetQTransform","setGravityFactor","factor","HP_Body_SetGravityFactor","getGravityFactor","HP_Body_GetGravityFactor","disposeBody","_createOptionsFromGroundMesh","options","groundMesh","transformedVertices","FromArrayToRef","TransformCoordinatesToRef","toArray","arraySize","Math","sqrt","boundingInfo","getBoundingInfo","dim","min","boundingBox","extendSizeWorld","minX","minimumWorld","minY","minZ","matrix","elementSize","round","numHeightFieldSamplesX","numHeightFieldSamplesZ","heightFieldSizeX","heightFieldSizeZ","heightFieldData","initShape","radius","center","HP_Shape_CreateSphere","extent","extents","HP_Shape_CreateBox","pointA","pointB","HP_Shape_CreateCapsule","HP_Shape_CreateContainer","HP_Shape_CreateCylinder","includeChildMeshes","needIndices","accum","positions","numVec3s","HP_Shape_CreateConvexHull","triangles","numTriangles","HP_Shape_CreateMesh","totalNumHeights","numBytes","heightBuffer","hkBufferIndex","bjsBufferIndex","scaleX","scaleZ","HP_Shape_CreateHeightField","setShapeFilterMembershipMask","membershipMask","collideWith","HP_Shape_GetFilterInfo","HP_Shape_SetFilterInfo","getShapeFilterMembershipMask","setShapeFilterCollideMask","collideMask","membership","getShapeFilterCollideMask","setMaterial","material","_material$friction","_material$staticFrict","_material$restitution","_material$frictionCom","_material$restitution2","dynamicFriction","friction","staticFriction","restitution","frictionCombine","restitutionCombine","hpMaterial","_materialCombineToNative","HP_Shape_SetMaterial","getMaterial","hkMaterial","HP_Shape_GetMaterial","_nativeToMaterialCombine","setDensity","density","HP_Shape_SetDensity","getDensity","HP_Shape_GetDensity","r","FromEulerAnglesToRef","addChild","newChild","translation","scale","transformNative","HP_Shape_AddChild","removeChild","childIndex","HP_Shape_RemoveChild","getNumChildren","HP_Shape_GetNumChildren","setTrigger","isTrigger","HP_Shape_SetTrigger","getBoundingBox","_shape","aabb","HP_Shape_GetBoundingBox","boundingbox","IdentityReadOnly","getBodyBoundingBox","minimum","maximum","getBodyGeometry","_body$_pluginDataInst3","dataInfo","geometryRes","HP_Shape_CreateDebugDisplayGeometry","indices","geometryInfo","HP_DebugGeometry_GetInfo","positionsInPlugin","indicesInPlugin","Uint32Array","slice","HP_DebugGeometry_Release","disposeShape","HP_Shape_Release","initConstraint","constraint","childBody","childInstanceIndex","_constraint$_pluginDa","_options$axisA","_options$axisB","jointId","HP_Constraint_Create","bodyA","bodyB","HP_Constraint_SetParentBody","HP_Constraint_SetChildBody","pivotA","axisA","perpAxisA","getNormalToRef","HP_Constraint_SetAnchorInParent","pivotB","axisB","perpAxisB","HP_Constraint_SetAnchorInChild","_initOptions","clone","HP_Constraint_SetAxisMode","ConstraintAxis","LINEAR_X","ConstraintAxisLimitMode","LOCKED","LINEAR_Y","LINEAR_Z","ANGULAR_X","ANGULAR_Y","ANGULAR_Z","distance","maxDistance","dist3d","LINEAR_DISTANCE","LIMITED","HP_Constraint_SetAxisMinLimit","HP_Constraint_SetAxisMaxLimit","sixdofData","l","_l$minLimit","_l$maxLimit","axId","_constraintAxisToNative","axis","minLimit","maxLimit","stiffness","HP_Constraint_SetAxisStiffness","HP_Constraint_SetAxisDamping","collisionEnabled","collision","HP_Constraint_SetCollisionsEnabled","HP_Constraint_SetEnabled","getBodiesUsingConstraint","pairs","bodyIds","get","parentBodyInfo","childBodyInfo","parentBody","parentBodyIndex","childBodyIndex","addConstraint","setEnabled","isEnabled","getEnabled","firstId","HP_Constraint_GetEnabled","setCollisionsEnabled","getCollisionsEnabled","HP_Constraint_GetCollisionsEnabled","setAxisFriction","HP_Constraint_SetAxisFriction","getAxisFriction","HP_Constraint_GetAxisFriction","setAxisMode","limitMode","_limitModeToNative","getAxisMode","mode","HP_Constraint_GetAxisMode","_nativeToLimitMode","setAxisMinLimit","limit","getAxisMinLimit","HP_Constraint_GetAxisMinLimit","setAxisMaxLimit","getAxisMaxLimit","HP_Constraint_GetAxisMaxLimit","setAxisMotorType","motorType","HP_Constraint_SetAxisMotorType","_constraintMotorTypeToNative","getAxisMotorType","_nativeToMotorType","HP_Constraint_GetAxisMotorType","setAxisMotorTarget","target","HP_Constraint_SetAxisMotorTarget","getAxisMotorTarget","HP_Constraint_GetAxisMotorTarget","setAxisMotorMaxForce","maxForce","HP_Constraint_SetAxisMotorMaxForce","getAxisMotorMaxForce","HP_Constraint_GetAxisMotorMaxForce","disposeConstraint","HP_Constraint_Release","_populateHitData","hitData","result","hitBody","bodyIndex","hitShape","hitPos","hitNormal","hitTriangle","setHitData","raycast","from","to","query","_query$membership","_query$collideWith","_query$shouldHitTrigg","queryMembership","queryCollideWith","shouldHitTriggers","reset","bodyToIgnore","hkQuery","HP_World_CastRayWithCollector","HP_QueryCollector_GetNumHits","HP_QueryCollector_GetCastRayResult","calculateHitDistance","pointProximity","_query$collisionFilte","_query$collisionFilte2","_query$collisionFilte3","_query$collisionFilte4","collisionFilter","ignoreBody","HP_World_PointProximityWithCollector","HP_QueryCollector_GetPointProximityResult","setHitDistance","shapeProximity","inputShapeResult","hitShapeResult","shapeId","HP_World_ShapeProximityWithCollector","hitInputData","hitShapeData","HP_QueryCollector_GetShapeProximityResult","shapeCast","startPosition","endPosition","HP_World_ShapeCastWithCollector","fractionAlongRay","HP_QueryCollector_GetShapeCastResult","setHitFraction","getCollisionObservable","observable","getCollisionEndedObservable","setCollisionCallbackEnabled","enabled","collideEvents","EventType","COLLISION_STARTED","value","COLLISION_CONTINUED","COLLISION_FINISHED","setCollisionEndedCallbackEnabled","currentCollideEvents","eventAddress","HP_World_GetTriggerEvents","event","bodyInfoA","bodyInfoB","triggerCollisionInfo","collider","colliderIndex","collidedAgainst","collidedAgainstIndex","_nativeTriggerCollisionValueToCollisionType","notifyObservers","HP_World_GetNextTriggerEvent","HP_World_GetCollisionEvents","worldAddr","Number","collisionInfo","_nativeCollisionValueToCollisionType","subtractToRef","Dot","point","size","observableA","observableB","collisionInfoB","HP_World_GetNextCollisionEvent","numBodies","HP_World_GetNumBodies","dispose","HP_QueryCollector_Release","HP_World_Release","vec3","_x","_y","_z","q","_w","ConstraintMotorType","POSITION","VELOCITY","NONE","mat","MaterialCombine","GEOMETRIC_MEAN","MINIMUM","MAXIMUM","ARITHMETIC_MEAN","MULTIPLY","FREE"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Physics/v2/Plugins/havokPlugin.js"],"sourcesContent":["import { Matrix, Quaternion, TmpVectors, Vector3 } from \"../../../Maths/math.vector.js\";\nimport { PhysicsPrestepType, } from \"../IPhysicsEnginePlugin.js\";\nimport { Logger } from \"../../../Misc/logger.js\";\nimport { PhysicsShape } from \"../physicsShape.js\";\nimport { BoundingBox } from \"../../../Culling/boundingBox.js\";\nimport { Mesh } from \"../../../Meshes/mesh.js\";\nimport { InstancedMesh } from \"../../../Meshes/instancedMesh.js\";\nimport { VertexBuffer } from \"../../../Buffers/buffer.js\";\nimport { BuildArray } from \"../../../Misc/arrayTools.js\";\nimport { Observable } from \"../../../Misc/observable.js\";\nclass MeshAccumulator {\n /**\n * Constructor of the mesh accumulator\n * @param mesh - The mesh used to compute the world matrix.\n * @param collectIndices - use mesh indices\n * @param scene - The scene used to determine the right handed system.\n *\n * Merge mesh and its children so whole hierarchy can be used as a mesh shape or convex hull\n */\n constructor(mesh, collectIndices, scene) {\n this._vertices = []; /// Vertices in body space\n this._indices = [];\n this._isRightHanded = scene.useRightHandedSystem;\n this._collectIndices = collectIndices;\n }\n /**\n * Adds a mesh to the physics engine.\n * @param mesh The mesh to add.\n * @param includeChildren Whether to include the children of the mesh.\n *\n * This method adds a mesh to the physics engine by computing the world matrix,\n * multiplying it with the body from world matrix, and then transforming the\n * coordinates of the mesh's vertices. It also adds the indices of the mesh\n * to the physics engine. If includeChildren is true, it will also add the\n * children of the mesh to the physics engine, ignoring any children which\n * have a physics impostor. This is useful for creating a physics engine\n * that accurately reflects the mesh and its children.\n */\n addNodeMeshes(mesh, includeChildren) {\n // Force absoluteScaling to be computed; we're going to use that to bake\n // the scale of any parent nodes into this shape, as physics engines\n // usually use rigid transforms, so can't handle arbitrary scale.\n mesh.computeWorldMatrix(true);\n const rootScaled = TmpVectors.Matrix[0];\n Matrix.ScalingToRef(mesh.absoluteScaling.x, mesh.absoluteScaling.y, mesh.absoluteScaling.z, rootScaled);\n if (mesh instanceof Mesh) {\n this._addMesh(mesh, rootScaled);\n }\n else if (mesh instanceof InstancedMesh) {\n this._addMesh(mesh.sourceMesh, rootScaled);\n }\n if (includeChildren) {\n const worldToRoot = TmpVectors.Matrix[1];\n mesh.computeWorldMatrix().invertToRef(worldToRoot);\n const worldToRootScaled = TmpVectors.Matrix[2];\n worldToRoot.multiplyToRef(rootScaled, worldToRootScaled);\n const children = mesh.getChildMeshes(false);\n // Ignore any children which have a physics body.\n // Other plugin implementations do not have this check, which appears to be\n // a bug, as otherwise, the mesh will have a duplicate collider\n children\n .filter((m) => !m.physicsBody)\n .forEach((m) => {\n const childToWorld = m.computeWorldMatrix();\n const childToRootScaled = TmpVectors.Matrix[3];\n childToWorld.multiplyToRef(worldToRootScaled, childToRootScaled);\n if (m instanceof Mesh) {\n this._addMesh(m, childToRootScaled);\n }\n else if (m instanceof InstancedMesh) {\n this._addMesh(m.sourceMesh, childToRootScaled);\n }\n });\n }\n }\n _addMesh(mesh, meshToRoot) {\n const vertexData = mesh.getVerticesData(VertexBuffer.PositionKind) || [];\n const numVerts = vertexData.length / 3;\n const indexOffset = this._vertices.length;\n for (let v = 0; v < numVerts; v++) {\n const pos = new Vector3(vertexData[v * 3 + 0], vertexData[v * 3 + 1], vertexData[v * 3 + 2]);\n this._vertices.push(Vector3.TransformCoordinates(pos, meshToRoot));\n }\n if (this._collectIndices) {\n const meshIndices = mesh.getIndices();\n if (meshIndices) {\n for (let i = 0; i < meshIndices.length; i += 3) {\n // Havok wants the correct triangle winding to enable the interior triangle optimization\n if (this._isRightHanded) {\n this._indices.push(meshIndices[i + 0] + indexOffset);\n this._indices.push(meshIndices[i + 1] + indexOffset);\n this._indices.push(meshIndices[i + 2] + indexOffset);\n }\n else {\n this._indices.push(meshIndices[i + 2] + indexOffset);\n this._indices.push(meshIndices[i + 1] + indexOffset);\n this._indices.push(meshIndices[i + 0] + indexOffset);\n }\n }\n }\n }\n }\n /**\n * Allocate and populate the vertex positions inside the physics plugin.\n *\n * @param plugin - The plugin to allocate the memory in.\n * @returns An array of floats, whose backing memory is inside the plugin. The array contains the\n * positions of the mesh vertices, where a position is defined by three floats. You must call\n * freeBuffer() on the returned array once you have finished with it, in order to free the\n * memory inside the plugin..\n */\n getVertices(plugin) {\n const nFloats = this._vertices.length * 3;\n const bytesPerFloat = 4;\n const nBytes = nFloats * bytesPerFloat;\n const bufferBegin = plugin._malloc(nBytes);\n const ret = new Float32Array(plugin.HEAPU8.buffer, bufferBegin, nFloats);\n for (let i = 0; i < this._vertices.length; i++) {\n ret[i * 3 + 0] = this._vertices[i].x;\n ret[i * 3 + 1] = this._vertices[i].y;\n ret[i * 3 + 2] = this._vertices[i].z;\n }\n return { offset: bufferBegin, numObjects: nFloats };\n }\n freeBuffer(plugin, arr) {\n plugin._free(arr.offset);\n }\n /**\n * Allocate and populate the triangle indices inside the physics plugin\n *\n * @param plugin - The plugin to allocate the memory in.\n * @returns A new Int32Array, whose backing memory is inside the plugin. The array contains the indices\n * of the triangle positions, where a single triangle is defined by three indices. You must call\n * freeBuffer() on this array once you have finished with it, to free the memory inside the plugin..\n */\n getTriangles(plugin) {\n const bytesPerInt = 4;\n const nBytes = this._indices.length * bytesPerInt;\n const bufferBegin = plugin._malloc(nBytes);\n const ret = new Int32Array(plugin.HEAPU8.buffer, bufferBegin, this._indices.length);\n for (let i = 0; i < this._indices.length; i++) {\n ret[i] = this._indices[i];\n }\n return { offset: bufferBegin, numObjects: this._indices.length };\n }\n}\nclass BodyPluginData {\n constructor(bodyId) {\n this.hpBodyId = bodyId;\n this.userMassProps = { centerOfMass: undefined, mass: undefined, inertia: undefined, inertiaOrientation: undefined };\n }\n}\n/*\nclass ShapePath\n{\n public colliderId: number;\n public pathData: number;\n}\n*/\nclass CollisionContactPoint {\n constructor() {\n this.bodyId = BigInt(0); //0,2\n //public colliderId: number = 0; //2,4\n //public shapePath: ShapePath = new ShapePath(); //4,8\n this.position = new Vector3(); //8,11\n this.normal = new Vector3(); //11,14\n //public triIdx: number = 0; //14,15\n }\n}\nclass CollisionEvent {\n constructor() {\n this.contactOnA = new CollisionContactPoint(); //1\n this.contactOnB = new CollisionContactPoint();\n this.impulseApplied = 0;\n this.type = 0;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static readToRef(buffer, offset, eventOut) {\n const intBuf = new Int32Array(buffer, offset);\n const floatBuf = new Float32Array(buffer, offset);\n const offA = 2;\n eventOut.contactOnA.bodyId = BigInt(intBuf[offA]); //<todo Need to get the high+low words!\n eventOut.contactOnA.position.set(floatBuf[offA + 8], floatBuf[offA + 9], floatBuf[offA + 10]);\n eventOut.contactOnA.normal.set(floatBuf[offA + 11], floatBuf[offA + 12], floatBuf[offA + 13]);\n const offB = 18;\n eventOut.contactOnB.bodyId = BigInt(intBuf[offB]);\n eventOut.contactOnB.position.set(floatBuf[offB + 8], floatBuf[offB + 9], floatBuf[offB + 10]);\n eventOut.contactOnB.normal.set(floatBuf[offB + 11], floatBuf[offB + 12], floatBuf[offB + 13]);\n eventOut.impulseApplied = floatBuf[offB + 13 + 3];\n eventOut.type = intBuf[0];\n }\n}\nclass TriggerEvent {\n constructor() {\n this.bodyIdA = BigInt(0);\n this.bodyIdB = BigInt(0);\n this.type = 0;\n }\n // eslint-disable-next-line @typescript-eslint/naming-convention\n static readToRef(buffer, offset, eventOut) {\n const intBuf = new Int32Array(buffer, offset);\n eventOut.type = intBuf[0];\n eventOut.bodyIdA = BigInt(intBuf[2]);\n eventOut.bodyIdB = BigInt(intBuf[6]);\n }\n}\n/**\n * The Havok Physics plugin\n */\nexport class HavokPlugin {\n constructor(_useDeltaForWorldStep = true, hpInjection = HK) {\n this._useDeltaForWorldStep = _useDeltaForWorldStep;\n /**\n * Reference to the WASM library\n */\n this._hknp = {};\n /**\n * Name of the plugin\n */\n this.name = \"HavokPlugin\";\n this._fixedTimeStep = 1 / 60;\n this._tmpVec3 = BuildArray(3, Vector3.Zero);\n this._bodies = new Map();\n this._shapes = new Map();\n this._bodyCollisionObservable = new Map();\n // Map from constraint id to the pair of bodies, where the first is the parent and the second is the child\n this._constraintToBodyIdPair = new Map();\n this._bodyCollisionEndedObservable = new Map();\n /**\n * Observable for collision started and collision continued events\n */\n this.onCollisionObservable = new Observable();\n /**\n * Observable for collision ended events\n */\n this.onCollisionEndedObservable = new Observable();\n /**\n * Observable for trigger entered and trigger exited events\n */\n this.onTriggerCollisionObservable = new Observable();\n if (typeof hpInjection === \"function\") {\n Logger.Error(\"Havok is not ready. Please make sure you await HK() before using the plugin.\");\n return;\n }\n else {\n this._hknp = hpInjection;\n }\n if (!this.isSupported()) {\n Logger.Error(\"Havok is not available. Please make sure you included the js file.\");\n return;\n }\n this.world = this._hknp.HP_World_Create()[1];\n this._queryCollector = this._hknp.HP_QueryCollector_Create(1)[1];\n }\n /**\n * If this plugin is supported\n * @returns true if its supported\n */\n isSupported() {\n return this._hknp !== undefined;\n }\n /**\n * Sets the gravity of the physics world.\n *\n * @param gravity - The gravity vector to set.\n *\n */\n setGravity(gravity) {\n this._hknp.HP_World_SetGravity(this.world, this._bVecToV3(gravity));\n }\n /**\n * Sets the fixed time step for the physics engine.\n *\n * @param timeStep - The fixed time step to use for the physics engine.\n *\n */\n setTimeStep(timeStep) {\n this._fixedTimeStep = timeStep;\n }\n /**\n * Gets the fixed time step used by the physics engine.\n *\n * @returns The fixed time step used by the physics engine.\n *\n */\n getTimeStep() {\n return this._fixedTimeStep;\n }\n /**\n * Executes a single step of the physics engine.\n *\n * @param delta The time delta in seconds since the last step.\n * @param physicsBodies An array of physics bodies to be simulated.\n *\n * This method is useful for simulating the physics engine. It sets the physics body transformation,\n * steps the world, syncs the physics body, and notifies collisions. This allows for the physics engine\n * to accurately simulate the physics bodies in the world.\n */\n executeStep(delta, physicsBodies) {\n for (const physicsBody of physicsBodies) {\n if (physicsBody.disablePreStep) {\n continue;\n }\n this.setPhysicsBodyTransformation(physicsBody, physicsBody.transformNode);\n }\n const deltaTime = this._useDeltaForWorldStep ? delta : this._fixedTimeStep;\n this._hknp.HP_World_SetIdealStepTime(this.world, deltaTime);\n this._hknp.HP_World_Step(this.world, deltaTime);\n this._bodyBuffer = this._hknp.HP_World_GetBodyBuffer(this.world)[1];\n for (const physicsBody of physicsBodies) {\n if (!physicsBody.disableSync) {\n this.sync(physicsBody);\n }\n }\n this._notifyCollisions();\n this._notifyTriggers();\n }\n /**\n * Returns the version of the physics engine plugin.\n *\n * @returns The version of the physics engine plugin.\n *\n * This method is useful for determining the version of the physics engine plugin that is currently running.\n */\n getPluginVersion() {\n return 2;\n }\n /**\n * Set the maximum allowed linear and angular velocities\n * @param maxLinearVelocity maximum allowed linear velocity\n * @param maxAngularVelocity maximum allowed angular velocity\n */\n setVelocityLimits(maxLinearVelocity, maxAngularVelocity) {\n this._hknp.HP_World_SetSpeedLimit(this.world, maxLinearVelocity, maxAngularVelocity);\n }\n /**\n * @returns maximum allowed linear velocity\n */\n getMaxLinearVelocity() {\n const limits = this._hknp.HP_World_GetSpeedLimit(this.world);\n return limits[1];\n }\n /**\n * @returns maximum allowed angular velocity\n */\n getMaxAngularVelocity() {\n const limits = this._hknp.HP_World_GetSpeedLimit(this.world);\n return limits[2];\n }\n /**\n * Initializes a physics body with the given position and orientation.\n *\n * @param body - The physics body to initialize.\n * @param motionType - The motion type of the body.\n * @param position - The position of the body.\n * @param orientation - The orientation of the body.\n * This code is useful for initializing a physics body with the given position and orientation.\n * It creates a plugin data for the body and adds it to the world. It then converts the position\n * and orientation to a transform and sets the body's transform to the given values.\n */\n initBody(body, motionType, position, orientation) {\n body._pluginData = new BodyPluginData(this._hknp.HP_Body_Create()[1]);\n this._internalSetMotionType(body._pluginData, motionType);\n const transform = [this._bVecToV3(position), this._bQuatToV4(orientation)]; //<todo temp transform?\n this._hknp.HP_Body_SetQTransform(body._pluginData.hpBodyId, transform);\n this._hknp.HP_World_AddBody(this.world, body._pluginData.hpBodyId, body.startAsleep);\n this._bodies.set(body._pluginData.hpBodyId[0], { body: body, index: 0 });\n }\n /**\n * Removes a body from the world. To dispose of a body, it is necessary to remove it from the world first.\n *\n * @param body - The body to remove.\n */\n removeBody(body) {\n if (body._pluginDataInstances && body._pluginDataInstances.length > 0) {\n for (const instance of body._pluginDataInstances) {\n this._bodyCollisionObservable.delete(instance.hpBodyId[0]);\n this._hknp.HP_World_RemoveBody(this.world, instance.hpBodyId);\n this._bodies.delete(instance.hpBodyId[0]);\n }\n }\n if (body._pluginData) {\n this._bodyCollisionObservable.delete(body._pluginData.hpBodyId[0]);\n this._hknp.HP_World_RemoveBody(this.world, body._pluginData.hpBodyId);\n this._bodies.delete(body._pluginData.hpBodyId[0]);\n }\n }\n /**\n * Initializes the body instances for a given physics body and mesh.\n *\n * @param body - The physics body to initialize.\n * @param motionType - How the body will be handled by the engine\n * @param mesh - The mesh to initialize.\n *\n * This code is useful for creating a physics body from a mesh. It creates a\n * body instance for each instance of the mesh and adds it to the world. It also\n * sets the position of the body instance to the position of the mesh instance.\n * This allows for the physics engine to accurately simulate the mesh in the\n * world.\n */\n initBodyInstances(body, motionType, mesh) {\n const instancesCount = mesh._thinInstanceDataStorage?.instancesCount ?? 0;\n const matrixData = mesh._thinInstanceDataStorage.matrixData;\n if (!matrixData) {\n return; // TODO: error handling\n }\n this._createOrUpdateBodyInstances(body, motionType, matrixData, 0, instancesCount, false);\n body._pluginDataInstances.forEach((bodyId, index) => {\n this._bodies.set(bodyId.hpBodyId[0], { body: body, index: index });\n });\n }\n _createOrUpdateBodyInstances(body, motionType, matrixData, startIndex, endIndex, update) {\n const rotation = TmpVectors.Quaternion[0];\n const rotationMatrix = Matrix.Identity();\n for (let i = startIndex; i < endIndex; i++) {\n const position = [matrixData[i * 16 + 12], matrixData[i * 16 + 13], matrixData[i * 16 + 14]];\n let hkbody;\n if (!update) {\n hkbody = this._hknp.HP_Body_Create()[1];\n }\n else {\n hkbody = body._pluginDataInstances[i].hpBodyId;\n }\n rotationMatrix.setRowFromFloats(0, matrixData[i * 16 + 0], matrixData[i * 16 + 1], matrixData[i * 16 + 2], 0);\n rotationMatrix.setRowFromFloats(1, matrixData[i * 16 + 4], matrixData[i * 16 + 5], matrixData[i * 16 + 6], 0);\n rotationMatrix.setRowFromFloats(2, matrixData[i * 16 + 8], matrixData[i * 16 + 9], matrixData[i * 16 + 10], 0);\n Quaternion.FromRotationMatrixToRef(rotationMatrix, rotation);\n const transform = [position, [rotation.x, rotation.y, rotation.z, rotation.w]];\n this._hknp.HP_Body_SetQTransform(hkbody, transform);\n if (!update) {\n const pluginData = new BodyPluginData(hkbody);\n if (body._pluginDataInstances.length) {\n // If an instance already exists, copy any user-provided mass properties\n pluginData.userMassProps = body._pluginDataInstances[0].userMassProps;\n }\n this._internalSetMotionType(pluginData, motionType);\n this._internalUpdateMassProperties(pluginData);\n body._pluginDataInstances.push(pluginData);\n this._hknp.HP_World_AddBody(this.world, hkbody, body.startAsleep);\n pluginData.worldTransformOffset = this._hknp.HP_Body_GetWorldTransformOffset(hkbody)[1];\n }\n }\n }\n /**\n * Update the internal body instances for a given physics body to match the instances in a mesh.\n * @param body the body that will be updated\n * @param mesh the mesh with reference instances\n */\n updateBodyInstances(body, mesh) {\n const instancesCount = mesh._thinInstanceDataStorage?.instancesCount ?? 0;\n const matrixData = mesh._thinInstanceDataStorage.matrixData;\n if (!matrixData) {\n return; // TODO: error handling\n }\n const pluginInstancesCount = body._pluginDataInstances.length;\n const motionType = this.getMotionType(body);\n if (instancesCount > pluginInstancesCount) {\n this._createOrUpdateBodyInstances(body, motionType, matrixData, pluginInstancesCount, instancesCount, false);\n const firstBodyShape = this._hknp.HP_Body_GetShape(body._pluginDataInstances[0].hpBodyId)[1];\n // firstBodyShape[0] might be 0 in the case where thin instances data is set (with thinInstancesSetBuffer call) after body creation\n // in that case, use the shape provided at body creation.\n if (!firstBodyShape[0]) {\n firstBodyShape[0] = body.shape?._pluginData[0];\n }\n for (let i = pluginInstancesCount; i < instancesCount; i++) {\n this._hknp.HP_Body_SetShape(body._pluginDataInstances[i].hpBodyId, firstBodyShape);\n this._internalUpdateMassProperties(body._pluginDataInstances[i]);\n this._bodies.set(body._pluginDataInstances[i].hpBodyId[0], { body: body, index: i });\n }\n }\n else if (instancesCount < pluginInstancesCount) {\n const instancesToRemove = pluginInstancesCount - instancesCount;\n for (let i = 0; i < instancesToRemove; i++) {\n const hkbody = body._pluginDataInstances.pop();\n this._bodies.delete(hkbody.hpBodyId[0]);\n this._hknp.HP_World_RemoveBody(this.world, hkbody.hpBodyId);\n this._hknp.HP_Body_Release(hkbody.hpBodyId);\n }\n this._createOrUpdateBodyInstances(body, motionType, matrixData, 0, instancesCount, true);\n }\n }\n /**\n * Synchronizes the transform of a physics body with its transform node.\n * @param body - The physics body to synchronize.\n *\n * This function is useful for keeping the physics body's transform in sync with its transform node.\n * This is important for ensuring that the physics body is accurately represented in the physics engine.\n */\n sync(body) {\n this.syncTransform(body, body.transformNode);\n }\n /**\n * Synchronizes the transform of a physics body with the transform of its\n * corresponding transform node.\n *\n * @param body - The physics body to synchronize.\n * @param transformNode - The destination Transform Node.\n *\n * This code is useful for synchronizing the position and orientation of a\n * physics body with the position and orientation of its corresponding\n * transform node. This is important for ensuring that the physics body and\n * the transform node are in the same position and orientation in the scene.\n * This is necessary for the physics engine to accurately simulate the\n * physical behavior of the body.\n */\n syncTransform(body, transformNode) {\n if (body._pluginDataInstances.length) {\n // instances\n const m = transformNode;\n const matrixData = m._thinInstanceDataStorage.matrixData;\n if (!matrixData) {\n return; // TODO: error handling\n }\n const instancesCount = body._pluginDataInstances.length;\n for (let i = 0; i < instancesCount; i++) {\n const bufOffset = body._pluginDataInstances[i].worldTransformOffset;\n const transformBuffer = new Float32Array(this._hknp.HEAPU8.buffer, this._bodyBuffer + bufOffset, 16);\n const index = i * 16;\n for (let mi = 0; mi < 15; mi++) {\n if ((mi & 3) != 3) {\n matrixData[index + mi] = transformBuffer[mi];\n }\n }\n matrixData[index + 15] = 1;\n }\n m.thinInstanceBufferUpdated(\"matrix\");\n }\n else {\n try {\n // regular\n const bodyTransform = this._hknp.HP_Body_GetQTransform(body._pluginData.hpBodyId)[1];\n const bodyTranslation = bodyTransform[0];\n const bodyOrientation = bodyTransform[1];\n const quat = TmpVectors.Quaternion[0];\n quat.set(bodyOrientation[0], bodyOrientation[1], bodyOrientation[2], bodyOrientation[3]);\n const parent = transformNode.parent;\n // transform position/orientation in parent space\n if (parent && !parent.getWorldMatrix().isIdentity()) {\n parent.computeWorldMatrix(true);\n // Save scaling for future use\n TmpVectors.Vector3[1].copyFrom(transformNode.scaling);\n quat.normalize();\n const finalTransform = TmpVectors.Matrix[0];\n const finalTranslation = TmpVectors.Vector3[0];\n finalTranslation.copyFromFloats(bodyTranslation[0], bodyTranslation[1], bodyTranslation[2]);\n Matrix.ComposeToRef(transformNode.absoluteScaling, quat, finalTranslation, finalTransform);\n const parentInverseTransform = TmpVectors.Matrix[1];\n parent.getWorldMatrix().invertToRef(parentInverseTransform);\n const localTransform = TmpVectors.Matrix[2];\n finalTransform.multiplyToRef(parentInverseTransform, localTransform);\n localTransform.decomposeToTransformNode(transformNode);\n transformNode.rotationQuaternion?.normalize();\n // Keep original scaling. Re-injecting scaling can introduce discontinuity between frames. Basically, it grows or shrinks.\n transformNode.scaling.copyFrom(TmpVectors.Vector3[1]);\n }\n else {\n transformNode.position.set(bodyTranslation[0], bodyTranslation[1], bodyTranslation[2]);\n if (transformNode.rotationQuaternion) {\n transformNode.rotationQuaternion.copyFrom(quat);\n }\n else {\n quat.toEulerAnglesToRef(transformNode.rotation);\n }\n }\n }\n catch (e) {\n Logger.Error(`Syncing transform failed for node ${transformNode.name}: ${e.message}...`);\n }\n }\n }\n /**\n * Sets the shape of a physics body.\n * @param body - The physics body to set the shape for.\n * @param shape - The physics shape to set.\n *\n * This function is used to set the shape of a physics body. It is useful for\n * creating a physics body with a specific shape, such as a box or a sphere,\n * which can then be used to simulate physical interactions in a physics engine.\n * This function is especially useful for meshes with multiple instances, as it\n * will set the shape for each instance of the mesh.\n */\n setShape(body, shape) {\n const shapeHandle = shape && shape._pluginData ? shape._pluginData : BigInt(0);\n if (!(body.transformNode instanceof Mesh) || !body.transformNode._thinInstanceDataStorage?.matrixData) {\n this._hknp.HP_Body_SetShape(body._pluginData.hpBodyId, shapeHandle);\n this._internalUpdateMassProperties(body._pluginData);\n return;\n }\n const m = body.transformNode;\n const instancesCount = m._thinInstanceDataStorage?.instancesCount ?? 0;\n for (let i = 0; i < instancesCount; i++) {\n this._hknp.HP_Body_SetShape(body._pluginDataInstances[i].hpBodyId, shapeHandle);\n this._internalUpdateMassProperties(body._pluginDataInstances[i]);\n }\n }\n /**\n * Returns a reference to the first instance of the plugin data for a physics body.\n * @param body\n * @param instanceIndex\n * @returns a reference to the first instance\n */\n _getPluginReference(body, instanceIndex) {\n return body._pluginDataInstances?.length ? body._pluginDataInstances[instanceIndex ?? 0] : body._pluginData;\n }\n /**\n * Gets the shape of a physics body. This will create a new shape object\n *\n * @param body - The physics body.\n * @returns The shape of the physics body.\n *\n */\n getShape(body) {\n const pluginRef = this._getPluginReference(body);\n const shapePluginData = this._hknp.HP_Body_GetShape(pluginRef.hpBodyId)[1];\n if (shapePluginData != 0) {\n const scene = body.transformNode.getScene();\n return new PhysicsShape({ pluginData: shapePluginData }, scene);\n }\n return null;\n }\n /**\n * Gets the type of a physics shape.\n * @param shape - The physics shape to get the type for.\n * @returns The type of the physics shape.\n *\n */\n getShapeType(shape) {\n if (shape.type) {\n return shape.type;\n }\n else {\n //<todo This returns a native type!\n return this._hknp.HP_Shape_GetType(shape._pluginData);\n }\n }\n /**\n * Sets the event mask of a physics body.\n * @param body - The physics body to set the event mask for.\n * @param eventMask - The event mask to set.\n * @param instanceIndex - The index of the instance to set the event mask for\n *\n * This function is useful for setting the event mask of a physics body, which is used to determine which events the body will respond to. This is important for ensuring that the physics engine is able to accurately simulate the behavior of the body in the game world.\n */\n setEventMask(body, eventMask, instanceIndex) {\n this._applyToBodyOrInstances(body, (bodyPluginData) => {\n this._hknp.HP_Body_SetEventMask(bodyPluginData.hpBodyId, eventMask);\n }, instanceIndex);\n }\n /**\n * Retrieves the event mask of a physics body.\n *\n * @param body - The physics body to retrieve the event mask from.\n * @param instanceIndex - The index of the instance to retrieve the event mask from.\n * @returns The event mask of the physics body.\n *\n */\n getEventMask(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n return this._hknp.HP_Body_GetEventMask(pluginRef.hpBodyId)[1];\n }\n _fromMassPropertiesTuple(massPropsTuple) {\n return {\n centerOfMass: Vector3.FromArray(massPropsTuple[0]),\n mass: massPropsTuple[1],\n inertia: Vector3.FromArray(massPropsTuple[2]),\n inertiaOrientation: Quaternion.FromArray(massPropsTuple[3]),\n };\n }\n _internalUpdateMassProperties(pluginData) {\n // Recompute the mass based on the shape\n const newProps = this._internalComputeMassProperties(pluginData);\n const massProps = pluginData.userMassProps;\n // Override the computed values with any the user has set\n if (massProps.centerOfMass) {\n newProps[0] = massProps.centerOfMass.asArray();\n }\n if (massProps.mass != undefined) {\n newProps[1] = massProps.mass;\n }\n if (massProps.inertia) {\n newProps[2] = massProps.inertia.asArray();\n }\n if (massProps.inertiaOrientation) {\n newProps[3] = massProps.inertiaOrientation.asArray();\n }\n this._hknp.HP_Body_SetMassProperties(pluginData.hpBodyId, newProps);\n }\n _internalSetMotionType(pluginData, motionType) {\n switch (motionType) {\n case 0 /* PhysicsMotionType.STATIC */:\n this._hknp.HP_Body_SetMotionType(pluginData.hpBodyId, this._hknp.MotionType.STATIC);\n break;\n case 1 /* PhysicsMotionType.ANIMATED */:\n this._hknp.HP_Body_SetMotionType(pluginData.hpBodyId, this._hknp.MotionType.KINEMATIC);\n break;\n case 2 /* PhysicsMotionType.DYNAMIC */:\n this._hknp.HP_Body_SetMotionType(pluginData.hpBodyId, this._hknp.MotionType.DYNAMIC);\n break;\n }\n }\n /**\n * sets the motion type of a physics body.\n * @param body - The physics body to set the motion type for.\n * @param motionType - The motion type to set.\n * @param instanceIndex - The index of the instance to set the motion type for. If undefined, the motion type of all the bodies will be set.\n */\n setMotionType(body, motionType, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginData) => {\n this._internalSetMotionType(pluginData, motionType);\n }, instanceIndex);\n }\n /**\n * Gets the motion type of a physics body.\n * @param body - The physics body to get the motion type from.\n * @param instanceIndex - The index of the instance to get the motion type from. If not specified, the motion type of the first instance will be returned.\n * @returns The motion type of the physics body.\n */\n getMotionType(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const type = this._hknp.HP_Body_GetMotionType(pluginRef.hpBodyId)[1];\n switch (type) {\n case this._hknp.MotionType.STATIC:\n return 0 /* PhysicsMotionType.STATIC */;\n case this._hknp.MotionType.KINEMATIC:\n return 1 /* PhysicsMotionType.ANIMATED */;\n case this._hknp.MotionType.DYNAMIC:\n return 2 /* PhysicsMotionType.DYNAMIC */;\n }\n throw new Error(\"Unknown motion type: \" + type);\n }\n /**\n * sets the activation control mode of a physics body, for instance if you need the body to never sleep.\n * @param body - The physics body to set the activation control mode.\n * @param controlMode - The activation control mode.\n */\n setActivationControl(body, controlMode) {\n switch (controlMode) {\n case 1 /* PhysicsActivationControl.ALWAYS_ACTIVE */:\n this._hknp.HP_Body_SetActivationControl(body._pluginData.hpBodyId, this._hknp.ActivationControl.ALWAYS_ACTIVE);\n break;\n case 2 /* PhysicsActivationControl.ALWAYS_INACTIVE */:\n this._hknp.HP_Body_SetActivationControl(body._pluginData.hpBodyId, this._hknp.ActivationControl.ALWAYS_INACTIVE);\n break;\n case 0 /* PhysicsActivationControl.SIMULATION_CONTROLLED */:\n this._hknp.HP_Body_SetActivationControl(body._pluginData.hpBodyId, this._hknp.ActivationControl.SIMULATION_CONTROLLED);\n break;\n }\n }\n _internalComputeMassProperties(pluginData) {\n const shapeRes = this._hknp.HP_Body_GetShape(pluginData.hpBodyId);\n if (shapeRes[0] == this._hknp.Result.RESULT_OK) {\n const shapeMass = this._hknp.HP_Shape_BuildMassProperties(shapeRes[1]);\n if (shapeMass[0] == this._hknp.Result.RESULT_OK) {\n return shapeMass[1];\n }\n }\n // Failed; return a unit inertia\n return [[0, 0, 0], 1, [1, 1, 1], [0, 0, 0, 1]];\n }\n /**\n * Computes the mass properties of a physics body, from it's shape\n *\n * @param body - The physics body to copmute the mass properties of\n * @param instanceIndex - The index of the instance to compute the mass properties of.\n * @returns The mass properties of the physics body.\n */\n computeMassProperties(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const computed = this._internalComputeMassProperties(pluginRef);\n return this._fromMassPropertiesTuple(computed);\n }\n /**\n * Sets the mass properties of a physics body.\n *\n * @param body - The physics body to set the mass properties of.\n * @param massProps - The mass properties to set.\n * @param instanceIndex - The index of the instance to set the mass properties of. If undefined, the mass properties of all the bodies will be set.\n * This function is useful for setting the mass properties of a physics body,\n * such as its mass, inertia, and center of mass. This is important for\n * accurately simulating the physics of the body in the physics engine.\n *\n */\n setMassProperties(body, massProps, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginData) => {\n pluginData.userMassProps = massProps;\n this._internalUpdateMassProperties(pluginData);\n }, instanceIndex);\n }\n /**\n * Gets the mass properties of a physics body.\n * @param body - The physics body to get the mass properties from.\n * @param instanceIndex - The index of the instance to get the mass properties from. If not specified, the mass properties of the first instance will be returned.\n * @returns The mass properties of the physics body.\n */\n getMassProperties(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const massPropsTuple = this._hknp.HP_Body_GetMassProperties(pluginRef.hpBodyId)[1];\n return this._fromMassPropertiesTuple(massPropsTuple);\n }\n /**\n * Sets the linear damping of the given body.\n * @param body - The body to set the linear damping for.\n * @param damping - The linear damping to set.\n * @param instanceIndex - The index of the instance to set the linear damping for. If not specified, the linear damping of the first instance will be set.\n *\n * This method is useful for controlling the linear damping of a body in a physics engine.\n * Linear damping is a force that opposes the motion of the body, and is proportional to the velocity of the body.\n * This method allows the user to set the linear damping of a body, which can be used to control the motion of the body.\n */\n setLinearDamping(body, damping, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginData) => {\n this._hknp.HP_Body_SetLinearDamping(pluginData.hpBodyId, damping);\n }, instanceIndex);\n }\n /**\n * Gets the linear damping of the given body.\n * @param body - The body to get the linear damping from.\n * @param instanceIndex - The index of the instance to get the linear damping from. If not specified, the linear damping of the first instance will be returned.\n * @returns The linear damping of the given body.\n *\n * This method is useful for getting the linear damping of a body in a physics engine.\n * Linear damping is a force that opposes the motion of the body and is proportional to the velocity of the body.\n * It is used to simulate the effects of air resistance and other forms of friction.\n */\n getLinearDamping(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n return this._hknp.HP_Body_GetLinearDamping(pluginRef.hpBodyId)[1];\n }\n /**\n * Sets the angular damping of a physics body.\n * @param body - The physics body to set the angular damping for.\n * @param damping - The angular damping value to set.\n * @param instanceIndex - The index of the instance to set the angular damping for. If not specified, the angular damping of the first instance will be set.\n *\n * This function is useful for controlling the angular velocity of a physics body.\n * By setting the angular damping, the body's angular velocity will be reduced over time, allowing for more realistic physics simulations.\n */\n setAngularDamping(body, damping, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginData) => {\n this._hknp.HP_Body_SetAngularDamping(pluginData.hpBodyId, damping);\n }, instanceIndex);\n }\n /**\n * Gets the angular damping of a physics body.\n * @param body - The physics body to get the angular damping from.\n * @param instanceIndex - The index of the instance to get the angular damping from. If not specified, the angular damping of the first instance will be returned.\n * @returns The angular damping of the body.\n *\n * This function is useful for retrieving the angular damping of a physics body,\n * which is used to control the rotational motion of the body. The angular damping is a value between 0 and 1, where 0 is no damping and 1 is full damping.\n */\n getAngularDamping(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n return this._hknp.HP_Body_GetAngularDamping(pluginRef.hpBodyId)[1];\n }\n /**\n * Sets the linear velocity of a physics body.\n * @param body - The physics body to set the linear velocity of.\n * @param linVel - The linear velocity to set.\n * @param instanceIndex - The index of the instance to set the linear velocity of. If not specified, the linear velocity of the first instance will be set.\n *\n * This function is useful for setting the linear velocity of a physics body, which is necessary for simulating\n * motion in a physics engine. The linear velocity is the speed and direction of the body's movement.\n */\n setLinearVelocity(body, linVel, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginData) => {\n this._hknp.HP_Body_SetLinearVelocity(pluginData.hpBodyId, this._bVecToV3(linVel));\n }, instanceIndex);\n }\n /**\n * Gets the linear velocity of a physics body and stores it in a given vector.\n * @param body - The physics body to get the linear velocity from.\n * @param linVel - The vector to store the linear velocity in.\n * @param instanceIndex - The index of the instance to get the linear velocity from. If not specified, the linear velocity of the first instance will be returned.\n *\n * This function is useful for retrieving the linear velocity of a physics body,\n * which can be used to determine the speed and direction of the body. This\n * information can be used to simulate realistic physics behavior in a game.\n */\n getLinearVelocityToRef(body, linVel, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const lv = this._hknp.HP_Body_GetLinearVelocity(pluginRef.hpBodyId)[1];\n this._v3ToBvecRef(lv, linVel);\n }\n /*\n * Apply an operation either to all instances of a body, if instanceIndex is not specified, or to a specific instance.\n */\n _applyToBodyOrInstances(body, fnToApply, instanceIndex) {\n if (body._pluginDataInstances?.length > 0 && instanceIndex === undefined) {\n for (let i = 0; i < body._pluginDataInstances.length; i++) {\n fnToApply(body._pluginDataInstances[i]);\n }\n }\n else {\n fnToApply(this._getPluginReference(body, instanceIndex));\n }\n }\n /**\n * Applies an impulse to a physics body at a given location.\n * @param body - The physics body to apply the impulse to.\n * @param impulse - The impulse vector to apply.\n * @param location - The location in world space to apply the impulse.\n * @param instanceIndex - The index of the instance to apply the impulse to. If not specified, the impulse will be applied to all instances.\n *\n * This method is useful for applying an impulse to a physics body at a given location.\n * This can be used to simulate physical forces such as explosions, collisions, and gravity.\n */\n applyImpulse(body, impulse, location, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginRef) => {\n this._hknp.HP_Body_ApplyImpulse(pluginRef.hpBodyId, this._bVecToV3(location), this._bVecToV3(impulse));\n }, instanceIndex);\n }\n /**\n * Applies an angular impulse(torque) to a physics body\n * @param body - The physics body to apply the impulse to.\n * @param angularImpulse - The torque value\n * @param instanceIndex - The index of the instance to apply the impulse to. If not specified, the impulse will be applied to all instances.\n */\n applyAngularImpulse(body, angularImpulse, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginRef) => {\n this._hknp.HP_Body_ApplyAngularImpulse(pluginRef.hpBodyId, this._bVecToV3(angularImpulse));\n }, instanceIndex);\n }\n /**\n * Applies a force to a physics body at a given location.\n * @param body - The physics body to apply the impulse to.\n * @param force - The force vector to apply.\n * @param location - The location in world space to apply the impulse.\n * @param instanceIndex - The index of the instance to apply the force to. If not specified, the force will be applied to all instances.\n *\n * This method is useful for applying a force to a physics body at a given location.\n * This can be used to simulate physical forces such as explosions, collisions, and gravity.\n */\n applyForce(body, force, location, instanceIndex) {\n force.scaleToRef(this.getTimeStep(), this._tmpVec3[0]);\n this.applyImpulse(body, this._tmpVec3[0], location, instanceIndex);\n }\n /**\n * Sets the angular velocity of a physics body.\n *\n * @param body - The physics body to set the angular velocity of.\n * @param angVel - The angular velocity to set.\n * @param instanceIndex - The index of the instance to set the angular velocity of. If not specified, the angular velocity of the first instance will be set.\n *\n * This function is useful for setting the angular velocity of a physics body in a physics engine.\n * This allows for more realistic simulations of physical objects, as they can be given a rotational velocity.\n */\n setAngularVelocity(body, angVel, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginRef) => {\n this._hknp.HP_Body_SetAngularVelocity(pluginRef.hpBodyId, this._bVecToV3(angVel));\n }, instanceIndex);\n }\n /**\n * Gets the angular velocity of a body.\n * @param body - The body to get the angular velocity from.\n * @param angVel - The vector3 to store the angular velocity.\n * @param instanceIndex - The index of the instance to get the angular velocity from. If not specified, the angular velocity of the first instance will be returned.\n *\n * This method is useful for getting the angular velocity of a body in a physics engine. It\n * takes the body and a vector3 as parameters and stores the angular velocity of the body\n * in the vector3. This is useful for getting the angular velocity of a body in order to\n * calculate the motion of the body in the physics engine.\n */\n getAngularVelocityToRef(body, angVel, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n const av = this._hknp.HP_Body_GetAngularVelocity(pluginRef.hpBodyId)[1];\n this._v3ToBvecRef(av, angVel);\n }\n /**\n * Sets the transformation of the given physics body to the given transform node.\n * @param body The physics body to set the transformation for.\n * @param node The transform node to set the transformation from.\n * Sets the transformation of the given physics body to the given transform node.\n *\n * This function is useful for setting the transformation of a physics body to a\n * transform node, which is necessary for the physics engine to accurately simulate\n * the motion of the body. It also takes into account instances of the transform\n * node, which is necessary for accurate simulation of multiple bodies with the\n * same transformation.\n */\n setPhysicsBodyTransformation(body, node) {\n if (body.getPrestepType() == PhysicsPrestepType.TELEPORT) {\n const transformNode = body.transformNode;\n if (body.numInstances > 0) {\n // instances\n const m = transformNode;\n const matrixData = m._thinInstanceDataStorage.matrixData;\n if (!matrixData) {\n return; // TODO: error handling\n }\n const instancesCount = body.numInstances;\n this._createOrUpdateBodyInstances(body, body.getMotionType(), matrixData, 0, instancesCount, true);\n }\n else {\n // regular\n this._hknp.HP_Body_SetQTransform(body._pluginData.hpBodyId, this._getTransformInfos(node));\n }\n }\n else if (body.getPrestepType() == PhysicsPrestepType.ACTION) {\n this.setTargetTransform(body, node.absolutePosition, node.absoluteRotationQuaternion);\n }\n else if (body.getPrestepType() == PhysicsPrestepType.DISABLED) {\n Logger.Warn(\"Prestep type is set to DISABLED. Unable to set physics body transformation.\");\n }\n else {\n Logger.Warn(\"Invalid prestep type set to physics body.\");\n }\n }\n /**\n * Set the target transformation (position and rotation) of the body, such that the body will set its velocity to reach that target\n * @param body The physics body to set the target transformation for.\n * @param position The target position\n * @param rotation The target rotation\n * @param instanceIndex The index of the instance in an instanced body\n */\n setTargetTransform(body, position, rotation, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginRef) => {\n this._hknp.HP_Body_SetTargetQTransform(pluginRef.hpBodyId, [this._bVecToV3(position), this._bQuatToV4(rotation)]);\n }, instanceIndex);\n }\n /**\n * Sets the gravity factor of a body\n * @param body the physics body to set the gravity factor for\n * @param factor the gravity factor\n * @param instanceIndex the index of the instance in an instanced body\n */\n setGravityFactor(body, factor, instanceIndex) {\n this._applyToBodyOrInstances(body, (pluginRef) => {\n this._hknp.HP_Body_SetGravityFactor(pluginRef.hpBodyId, factor);\n }, instanceIndex);\n }\n /**\n * Get the gravity factor of a body\n * @param body the physics body to get the gravity factor from\n * @param instanceIndex the index of the instance in an instanced body. If not specified, the gravity factor of the first instance will be returned.\n * @returns the gravity factor\n */\n getGravityFactor(body, instanceIndex) {\n const pluginRef = this._getPluginReference(body, instanceIndex);\n return this._hknp.HP_Body_GetGravityFactor(pluginRef.hpBodyId)[1];\n }\n /**\n * Disposes a physics body.\n *\n * @param body - The physics body to dispose.\n *\n * This method is useful for releasing the resources associated with a physics body when it is no longer needed.\n * This is important for avoiding memory leaks in the physics engine.\n */\n disposeBody(body) {\n if (body._pluginDataInstances && body._pluginDataInstances.length > 0) {\n for (const instance of body._pluginDataInstances) {\n this._hknp.HP_Body_Release(instance.hpBodyId);\n instance.hpBodyId = undefined;\n }\n }\n if (body._pluginData) {\n this._hknp.HP_Body_Release(body._pluginData.hpBodyId);\n body._pluginData.hpBodyId = undefined;\n }\n }\n _createOptionsFromGroundMesh(options) {\n const mesh = options.groundMesh;\n if (!mesh) {\n return;\n }\n let pos = mesh.getVerticesData(VertexBuffer.PositionKind);\n const transform = mesh.computeWorldMatrix(true);\n // convert rawVerts to object space\n const transformedVertices = [];\n let index;\n for (index = 0; index < pos.length; index += 3) {\n Vector3.FromArrayToRef(pos, index, TmpVectors.Vector3[0]);\n Vector3.TransformCoordinatesToRef(TmpVectors.Vector3[0], transform, TmpVectors.Vector3[1]);\n TmpVectors.Vector3[1].toArray(transformedVertices, index);\n }\n pos = transformedVertices;\n const arraySize = ~~(Math.sqrt(pos.length / 3) - 1);\n const boundingInfo = mesh.getBoundingInfo();\n const dim = Math.min(boundingInfo.boundingBox.extendSizeWorld.x, boundingInfo.boundingBox.extendSizeWorld.z);\n const minX = boundingInfo.boundingBox.minimumWorld.x;\n const minY = boundingInfo.boundingBox.minimumWorld.y;\n const minZ = boundingInfo.boundingBox.minimumWorld.z;\n const matrix = new Float32Array((arraySize + 1) * (arraySize + 1));\n const elementSize = (dim * 2) / arraySize;\n for (let i = 0; i < matrix.length; i++) {\n matrix[i] = minY;\n }\n for (let i = 0; i < pos.length; i = i + 3) {\n const x = Math.round((pos[i + 0] - minX) / elementSize);\n const z = arraySize - Math.round((pos[i + 2] - minZ) / elementSize);\n const y = pos[i + 1] - minY;\n matrix[z * (arraySize + 1) + x] = y;\n }\n options.numHeightFieldSamplesX = arraySize + 1;\n options.numHeightFieldSamplesZ = arraySize + 1;\n options.heightFieldSizeX = boundingInfo.boundingBox.extendSizeWorld.x * 2;\n options.heightFieldSizeZ = boundingInfo.boundingBox.extendSizeWorld.z * 2;\n options.heightFieldData = matrix;\n }\n /**\n * Initializes a physics shape with the given type and parameters.\n * @param shape - The physics shape to initialize.\n * @param type - The type of shape to initialize.\n * @param options - The parameters for the shape.\n *\n * This code is useful for initializing a physics shape with the given type and parameters.\n * It allows for the creation of a sphere, box, capsule, container, cylinder, mesh, and heightfield.\n * Depending on the type of shape, different parameters are required.\n * For example, a sphere requires a radius, while a box requires extents and a rotation.\n */\n initShape(shape, type, options) {\n switch (type) {\n case 0 /* PhysicsShapeType.SPHERE */:\n {\n const radius = options.radius || 1;\n const center = options.center ? this._bVecToV3(options.center) : [0, 0, 0];\n shape._pluginData = this._hknp.HP_Shape_CreateSphere(center, radius)[1];\n }\n break;\n case 3 /* PhysicsShapeType.BOX */:\n {\n const rotation = options.rotation ? this._bQuatToV4(options.rotation) : [0, 0, 0, 1];\n const extent = options.extents ? this._bVecToV3(options.extents) : [1, 1, 1];\n const center = options.center ? this._bVecToV3(options.center) : [0, 0, 0];\n shape._pluginData = this._hknp.HP_Shape_CreateBox(center, rotation, extent)[1];\n }\n break;\n case 1 /* PhysicsShapeType.CAPSULE */:\n {\n const pointA = options.pointA ? this._bVecToV3(options.pointA) : [0, 0, 0];\n const pointB = options.pointB ? this._bVecToV3(options.pointB) : [0, 1, 0];\n const radius = options.radius || 0;\n shape._pluginData = this._hknp.HP_Shape_CreateCapsule(pointA, pointB, radius)[1];\n }\n break;\n case 5 /* PhysicsShapeType.CONTAINER */:\n {\n shape._pluginData = this._hknp.HP_Shape_CreateContainer()[1];\n }\n break;\n case 2 /* PhysicsShapeType.CYLINDER */:\n {\n const pointA = options.pointA ? this._bVecToV3(options.pointA) : [0, 0, 0];\n const pointB = options.pointB ? this._bVecToV3(options.pointB) : [0, 1, 0];\n const radius = options.radius || 0;\n shape._pluginData = this._hknp.HP_Shape_CreateCylinder(pointA, pointB, radius)[1];\n }\n break;\n case 4 /* PhysicsShapeType.CONVEX_HULL */:\n case 6 /* PhysicsShapeType.MESH */:\n {\n const mesh = options.mesh;\n if (mesh) {\n const includeChildMeshes = !!options.includeChildMeshes;\n const needIndices = type != 4 /* PhysicsShapeType.CONVEX_HULL */;\n const accum = new MeshAccumulator(mesh, needIndices, mesh?.getScene());\n accum.addNodeMeshes(mesh, includeChildMeshes);\n const positions = accum.getVertices(this._hknp);\n const numVec3s = positions.numObjects / 3;\n if (type == 4 /* PhysicsShapeType.CONVEX_HULL */) {\n shape._pluginData = this._hknp.HP_Shape_CreateConvexHull(positions.offset, numVec3s)[1];\n }\n else {\n const triangles = accum.getTriangles(this._hknp);\n const numTriangles = triangles.numObjects / 3;\n shape._pluginData = this._hknp.HP_Shape_CreateMesh(positions.offset, numVec3s, triangles.offset, numTriangles)[1];\n accum.freeBuffer(this._hknp, triangles);\n }\n accum.freeBuffer(this._hknp, positions);\n }\n else {\n throw new Error(\"No mesh provided to create physics shape.\");\n }\n }\n break;\n case 7 /* PhysicsShapeType.HEIGHTFIELD */:\n {\n if (options.groundMesh) {\n // update options with datas from groundMesh\n this._createOptionsFromGroundMesh(options);\n }\n if (options.numHeightFieldSamplesX && options.numHeightFieldSamplesZ && options.heightFieldSizeX && options.heightFieldSizeZ && options.heightFieldData) {\n const totalNumHeights = options.numHeightFieldSamplesX * options.numHeightFieldSamplesZ;\n const numBytes = totalNumHeights * 4;\n const bufferBegin = this._hknp._malloc(numBytes);\n const heightBuffer = new Float32Array(this._hknp.HEAPU8.buffer, bufferBegin, totalNumHeights);\n for (let x = 0; x < options.numHeightFieldSamplesX; x++) {\n for (let z = 0; z < options.numHeightFieldSamplesZ; z++) {\n const hkBufferIndex = z * options.numHeightFieldSamplesX + x;\n const bjsBufferIndex = (options.numHeightFieldSamplesX - 1 - x) * options.numHeightFieldSamplesZ + z;\n heightBuffer[hkBufferIndex] = options.heightFieldData[bjsBufferIndex];\n }\n }\n const scaleX = options.heightFieldSizeX / (options.numHeightFieldSamplesX - 1);\n const scaleZ = options.heightFieldSizeZ / (options.numHeightFieldSamplesZ - 1);\n shape._pluginData = this._hknp.HP_Shape_CreateHeightField(options.numHeightFieldSamplesX, options.numHeightFieldSamplesZ, [scaleX, 1, scaleZ], bufferBegin)[1];\n this._hknp._free(bufferBegin);\n }\n else {\n throw new Error(\"Missing required heightfield parameters\");\n }\n }\n break;\n default:\n throw new Error(\"Unsupported Shape Type.\");\n break;\n }\n this._shapes.set(shape._pluginData[0], shape);\n }\n /**\n * Sets the shape filter membership mask of a body\n * @param shape - The physics body to set the shape filter membership mask for.\n * @param membershipMask - The shape filter membership mask to set.\n */\n setShapeFilterMembershipMask(shape, membershipMask) {\n const collideWith = this._hknp.HP_Shape_GetFilterInfo(shape._pluginData)[1][1];\n this._hknp.HP_Shape_SetFilterInfo(shape._pluginData, [membershipMask, collideWith]);\n }\n /**\n * Gets the shape filter membership mask of a body\n * @param shape - The physics body to get the shape filter membership mask from.\n * @returns The shape filter membership mask of the given body.\n */\n getShapeFilterMembershipMask(shape) {\n return this._hknp.HP_Shape_GetFilterInfo(shape._pluginData)[1][0];\n }\n /**\n * Sets the shape filter collide mask of a body\n * @param shape - The physics body to set the shape filter collide mask for.\n * @param collideMask - The shape filter collide mask to set.\n */\n setShapeFilterCollideMask(shape, collideMask) {\n const membership = this._hknp.HP_Shape_GetFilterInfo(shape._pluginData)[1][0];\n this._hknp.HP_Shape_SetFilterInfo(shape._pluginData, [membership, collideMask]);\n }\n /**\n * Gets the shape filter collide mask of a body\n * @param shape - The physics body to get the shape filter collide mask from.\n * @returns The shape filter collide mask of the given body.\n */\n getShapeFilterCollideMask(shape) {\n return this._hknp.HP_Shape_GetFilterInfo(shape._pluginData)[1][1];\n }\n /**\n * Sets the material of a physics shape.\n * @param shape - The physics shape to set the material of.\n * @param material - The material to set.\n *\n */\n setMaterial(shape, material) {\n const dynamicFriction = material.friction ?? 0.5;\n const staticFriction = material.staticFriction ?? dynamicFriction;\n const restitution = material.restitution ?? 0.0;\n const frictionCombine = material.frictionCombine ?? 1 /* PhysicsMaterialCombineMode.MINIMUM */;\n const restitutionCombine = material.restitutionCombine ?? 2 /* PhysicsMaterialCombineMode.MAXIMUM */;\n const hpMaterial = [staticFriction, dynamicFriction, restitution, this._materialCombineToNative(frictionCombine), this._materialCombineToNative(restitutionCombine)];\n this._hknp.HP_Shape_SetMaterial(shape._pluginData, hpMaterial);\n }\n /**\n * Gets the material associated with a physics shape.\n * @param shape - The shape to get the material from.\n * @returns The material associated with the shape.\n */\n getMaterial(shape) {\n const hkMaterial = this._hknp.HP_Shape_GetMaterial(shape._pluginData)[1];\n return {\n staticFriction: hkMaterial[0],\n friction: hkMaterial[1],\n restitution: hkMaterial[2],\n frictionCombine: this._nativeToMaterialCombine(hkMaterial[3]),\n restitutionCombine: this._nativeToMaterialCombine(hkMaterial[4]),\n };\n }\n /**\n * Sets the density of a physics shape.\n * @param shape - The physics shape to set the density of.\n * @param density - The density to set.\n *\n */\n setDensity(shape, density) {\n this._hknp.HP_Shape_SetDensity(shape._pluginData, density);\n }\n /**\n * Calculates the density of a given physics shape.\n *\n * @param shape - The physics shape to calculate the density of.\n * @returns The density of the given physics shape.\n *\n */\n getDensity(shape) {\n return this._hknp.HP_Shape_GetDensity(shape._pluginData)[1];\n }\n /**\n * Gets the transform infos of a given transform node.\n * This code is useful for getting the position and orientation of a given transform node.\n * It first checks if the node has a rotation quaternion, and if not, it creates one from the node's rotation.\n * It then creates an array containing the position and orientation of the node and returns it.\n * @param node - The transform node.\n * @returns An array containing the position and orientation of the node.\n */\n _getTransformInfos(node) {\n if (node.parent) {\n node.computeWorldMatrix(true);\n return [this._bVecToV3(node.absolutePosition), this._bQuatToV4(node.absoluteRotationQuaternion)];\n }\n let orientation = TmpVectors.Quaternion[0];\n if (node.rotationQuaternion) {\n orientation = node.rotationQuaternion;\n }\n else {\n const r = node.rotation;\n Quaternion.FromEulerAnglesToRef(r.x, r.y, r.z, orientation);\n }\n const transform = [this._bVecToV3(node.position), this._bQuatToV4(orientation)];\n return transform;\n }\n /**\n * Adds a child shape to the given shape.\n * @param shape - The parent shape.\n * @param newChild - The child shape to add.\n * @param translation - The relative translation of the child from the parent shape\n * @param rotation - The relative rotation of the child from the parent shape\n * @param scale - The relative scale scale of the child from the parent shaep\n *\n */\n addChild(shape, newChild, translation, rotation, scale) {\n const transformNative = [\n translation ? this._bVecToV3(translation) : [0, 0, 0],\n rotation ? this._bQuatToV4(rotation) : [0, 0, 0, 1],\n scale ? this._bVecToV3(scale) : [1, 1, 1],\n ];\n this._hknp.HP_Shape_AddChild(shape._pluginData, newChild._pluginData, transformNative);\n }\n /**\n * Removes a child shape from a parent shape.\n * @param shape - The parent shape.\n * @param childIndex - The index of the child shape to remove.\n *\n */\n removeChild(shape, childIndex) {\n this._hknp.HP_Shape_RemoveChild(shape._pluginData, childIndex);\n }\n /**\n * Returns the number of children of the given shape.\n *\n * @param shape - The shape to get the number of children from.\n * @returns The number of children of the given shape.\n *\n */\n getNumChildren(shape) {\n return this._hknp.HP_Shape_GetNumChildren(shape._pluginData)[1];\n }\n /**\n * Marks the shape as a trigger\n * @param shape the shape to mark as a trigger\n * @param isTrigger if the shape is a trigger\n */\n setTrigger(shape, isTrigger) {\n this._hknp.HP_Shape_SetTrigger(shape._pluginData, isTrigger);\n }\n /**\n * Calculates the bounding box of a given physics shape.\n *\n * @param _shape - The physics shape to calculate the bounding box for.\n * @returns The calculated bounding box.\n *\n * This method is useful for physics engines as it allows to calculate the\n * boundaries of a given shape. Knowing the boundaries of a shape is important\n * for collision detection and other physics calculations.\n */\n getBoundingBox(_shape) {\n // get local AABB\n const aabb = this._hknp.HP_Shape_GetBoundingBox(_shape._pluginData, [\n [0, 0, 0],\n [0, 0, 0, 1],\n ])[1];\n TmpVectors.Vector3[0].set(aabb[0][0], aabb[0][1], aabb[0][2]); // min\n TmpVectors.Vector3[1].set(aabb[1][0], aabb[1][1], aabb[1][2]); // max\n const boundingbox = new BoundingBox(TmpVectors.Vector3[0], TmpVectors.Vector3[1], Matrix.IdentityReadOnly);\n return boundingbox;\n }\n /**\n * Calculates the world bounding box of a given physics body.\n *\n * @param body - The physics body to calculate the bounding box for.\n * @returns The calculated bounding box.\n *\n * This method is useful for physics engines as it allows to calculate the\n * boundaries of a given body.\n */\n getBodyBoundingBox(body) {\n // get local AABB\n const aabb = this.getBoundingBox(body.shape);\n const boundingbox = new BoundingBox(aabb.minimum, aabb.maximum, body.transformNode.getWorldMatrix());\n return boundingbox;\n }\n /**\n * Gets the geometry of a physics body.\n *\n * @param body - The physics body.\n * @returns An object containing the positions and indices of the body's geometry.\n *\n */\n getBodyGeometry(body) {\n const dataInfo = body._pluginDataInstances?.length > 0 ? body._pluginDataInstances[0] : body._pluginData;\n const shape = this._hknp.HP_Body_GetShape(dataInfo.hpBodyId)[1];\n const geometryRes = this._hknp.HP_Shape_CreateDebugDisplayGeometry(shape);\n if (geometryRes[0] != this._hknp.Result.RESULT_OK) {\n return { positions: [], indices: [] };\n }\n const geometryInfo = this._hknp.HP_DebugGeometry_GetInfo(geometryRes[1])[1];\n const positionsInPlugin = new Float32Array(this._hknp.HEAPU8.buffer, geometryInfo[0], geometryInfo[1] * 3); // 3 floats per position\n const indicesInPlugin = new Uint32Array(this._hknp.HEAPU8.buffer, geometryInfo[2], geometryInfo[3] * 3); // 3 indices per triangle\n // HP_DebugGeometry_Release will free the buffer in the plugin. To avoid a\n // use-after-free, we need to make a copy of the data here.\n const positions = positionsInPlugin.slice(0);\n const indices = indicesInPlugin.slice(0);\n this._hknp.HP_DebugGeometry_Release(geometryRes[1]);\n return { positions: positions, indices: indices };\n }\n /**\n * Releases a physics shape from the physics engine.\n *\n * @param shape - The physics shape to be released.\n *\n * This method is useful for releasing a physics shape from the physics engine, freeing up resources and preventing memory leaks.\n */\n disposeShape(shape) {\n this._hknp.HP_Shape_Release(shape._pluginData);\n shape._pluginData = undefined;\n }\n // constraint\n /**\n * Initializes a physics constraint with the given parameters.\n *\n * @param constraint - The physics constraint to be initialized.\n * @param body - The main body\n * @param childBody - The child body.\n * @param instanceIndex - If this body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.\n * @param childInstanceIndex - If the child body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.\n *\n * This function is useful for setting up a physics constraint in a physics engine.\n */\n initConstraint(constraint, body, childBody, instanceIndex, childInstanceIndex) {\n const type = constraint.type;\n const options = constraint.options;\n if (!type || !options) {\n Logger.Warn(\"No constraint type or options. Constraint is invalid.\");\n return;\n }\n if ((body._pluginDataInstances.length > 0 && instanceIndex === undefined) || (childBody._pluginDataInstances.length > 0 && childInstanceIndex === undefined)) {\n Logger.Warn(\"Body is instanced but no instance index was specified. Constraint will not be applied.\");\n return;\n }\n constraint._pluginData = constraint._pluginData ?? [];\n const jointId = this._hknp.HP_Constraint_Create()[1];\n constraint._pluginData.push(jointId);\n // body parenting\n const bodyA = this._getPluginReference(body, instanceIndex).hpBodyId;\n const bodyB = this._getPluginReference(childBody, childInstanceIndex).hpBodyId;\n this._hknp.HP_Constraint_SetParentBody(jointId, bodyA);\n this._hknp.HP_Constraint_SetChildBody(jointId, bodyB);\n this._constraintToBodyIdPair.set(jointId[0], [bodyA[0], bodyB[0]]);\n // anchors\n const pivotA = options.pivotA ? this._bVecToV3(options.pivotA) : this._bVecToV3(Vector3.Zero());\n const axisA = options.axisA ?? new Vector3(1, 0, 0);\n const perpAxisA = this._tmpVec3[0];\n if (options.perpAxisA) {\n perpAxisA.copyFrom(options.perpAxisA);\n }\n else {\n axisA.getNormalToRef(perpAxisA);\n }\n this._hknp.HP_Constraint_SetAnchorInParent(jointId, pivotA, this._bVecToV3(axisA), this._bVecToV3(perpAxisA));\n const pivotB = options.pivotB ? this._bVecToV3(options.pivotB) : this._bVecToV3(Vector3.Zero());\n const axisB = options.axisB ?? new Vector3(1, 0, 0);\n const perpAxisB = this._tmpVec3[0];\n if (options.perpAxisB) {\n perpAxisB.copyFrom(options.perpAxisB);\n }\n else {\n axisB.getNormalToRef(perpAxisB);\n }\n this._hknp.HP_Constraint_SetAnchorInChild(jointId, pivotB, this._bVecToV3(axisB), this._bVecToV3(perpAxisB));\n // Save the options that were used for initializing the constraint for debugging purposes\n // Check first to avoid copying the same options multiple times\n if (!constraint._initOptions) {\n constraint._initOptions = {\n axisA: axisA.clone(),\n axisB: axisB.clone(),\n perpAxisA: perpAxisA.clone(),\n perpAxisB: perpAxisB.clone(),\n pivotA: new Vector3(pivotA[0], pivotA[1], pivotA[2]),\n pivotB: new Vector3(pivotB[0], pivotB[1], pivotB[2]),\n };\n }\n if (type == 5 /* PhysicsConstraintType.LOCK */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n }\n else if (type == 2 /* PhysicsConstraintType.DISTANCE */) {\n const distance = options.maxDistance || 0;\n const dist3d = this._hknp.ConstraintAxis.LINEAR_DISTANCE;\n this._hknp.HP_Constraint_SetAxisMode(jointId, dist3d, this._hknp.ConstraintAxisLimitMode.LIMITED);\n this._hknp.HP_Constraint_SetAxisMinLimit(jointId, dist3d, distance);\n this._hknp.HP_Constraint_SetAxisMaxLimit(jointId, dist3d, distance);\n }\n else if (type == 3 /* PhysicsConstraintType.HINGE */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n }\n else if (type == 6 /* PhysicsConstraintType.PRISMATIC */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n }\n else if (type == 4 /* PhysicsConstraintType.SLIDER */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.ANGULAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n }\n else if (type == 1 /* PhysicsConstraintType.BALL_AND_SOCKET */) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_X, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Y, this._hknp.ConstraintAxisLimitMode.LOCKED);\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._hknp.ConstraintAxis.LINEAR_Z, this._hknp.ConstraintAxisLimitMode.LOCKED);\n }\n else if (type == 7 /* PhysicsConstraintType.SIX_DOF */) {\n const sixdofData = constraint;\n for (const l of sixdofData.limits) {\n const axId = this._constraintAxisToNative(l.axis);\n if ((l.minLimit ?? -1) == 0 && (l.maxLimit ?? -1) == 0) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, axId, this._hknp.ConstraintAxisLimitMode.LOCKED);\n }\n else {\n if (l.minLimit != undefined) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, axId, this._hknp.ConstraintAxisLimitMode.LIMITED);\n this._hknp.HP_Constraint_SetAxisMinLimit(jointId, axId, l.minLimit);\n }\n if (l.maxLimit != undefined) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, axId, this._hknp.ConstraintAxisLimitMode.LIMITED);\n this._hknp.HP_Constraint_SetAxisMaxLimit(jointId, axId, l.maxLimit);\n }\n }\n if (l.stiffness) {\n this._hknp.HP_Constraint_SetAxisStiffness(jointId, axId, l.stiffness);\n }\n if (l.damping) {\n this._hknp.HP_Constraint_SetAxisDamping(jointId, axId, l.damping);\n }\n }\n }\n else {\n throw new Error(\"Unsupported Constraint Type.\");\n }\n const collisionEnabled = !!options.collision;\n this._hknp.HP_Constraint_SetCollisionsEnabled(jointId, collisionEnabled);\n this._hknp.HP_Constraint_SetEnabled(jointId, true);\n }\n /**\n * Get a list of all the pairs of bodies that are connected by this constraint.\n * @param constraint the constraint to search from\n * @returns a list of parent, child pairs\n */\n getBodiesUsingConstraint(constraint) {\n const pairs = [];\n for (const jointId of constraint._pluginData) {\n const bodyIds = this._constraintToBodyIdPair.get(jointId[0]);\n if (bodyIds) {\n const parentBodyInfo = this._bodies.get(bodyIds[0]);\n const childBodyInfo = this._bodies.get(bodyIds[1]);\n if (parentBodyInfo && childBodyInfo) {\n pairs.push({ parentBody: parentBodyInfo.body, parentBodyIndex: parentBodyInfo.index, childBody: childBodyInfo.body, childBodyIndex: childBodyInfo.index });\n }\n }\n }\n return pairs;\n }\n /**\n * Adds a constraint to the physics engine.\n *\n * @param body - The main body to which the constraint is applied.\n * @param childBody - The body to which the constraint is applied.\n * @param constraint - The constraint to be applied.\n * @param instanceIndex - If this body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.\n * @param childInstanceIndex - If the child body is instanced, the index of the instance to which the constraint will be applied. If not specified, no constraint will be applied.\n */\n addConstraint(body, childBody, constraint, instanceIndex, childInstanceIndex) {\n //<todo It's real weird that initConstraint() is called only after adding to a body!\n this.initConstraint(constraint, body, childBody, instanceIndex, childInstanceIndex);\n }\n /**\n * Enables or disables a constraint in the physics engine.\n * @param constraint - The constraint to enable or disable.\n * @param isEnabled - Whether the constraint should be enabled or disabled.\n *\n */\n setEnabled(constraint, isEnabled) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetEnabled(jointId, isEnabled);\n }\n }\n /**\n * Gets the enabled state of the given constraint.\n * @param constraint - The constraint to get the enabled state from.\n * @returns The enabled state of the given constraint.\n *\n */\n getEnabled(constraint) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetEnabled(firstId)[1];\n }\n return false;\n }\n /**\n * Enables or disables collisions for the given constraint.\n * @param constraint - The constraint to enable or disable collisions for.\n * @param isEnabled - Whether collisions should be enabled or disabled.\n *\n */\n setCollisionsEnabled(constraint, isEnabled) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetCollisionsEnabled(jointId, isEnabled);\n }\n }\n /**\n * Gets whether collisions are enabled for the given constraint.\n * @param constraint - The constraint to get collisions enabled for.\n * @returns Whether collisions are enabled for the given constraint.\n *\n */\n getCollisionsEnabled(constraint) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetCollisionsEnabled(firstId)[1];\n }\n return false;\n }\n /**\n * Sets the friction of the given axis of the given constraint.\n *\n * @param constraint - The constraint to set the friction of.\n * @param axis - The axis of the constraint to set the friction of.\n * @param friction - The friction to set.\n *\n */\n setAxisFriction(constraint, axis, friction) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisFriction(jointId, this._constraintAxisToNative(axis), friction);\n }\n }\n /**\n * Gets the friction value of the specified axis of the given constraint.\n *\n * @param constraint - The constraint to get the axis friction from.\n * @param axis - The axis to get the friction from.\n * @returns The friction value of the specified axis.\n *\n */\n getAxisFriction(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisFriction(firstId, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Sets the limit mode of the specified axis of the given constraint.\n * @param constraint - The constraint to set the axis mode of.\n * @param axis - The axis to set the limit mode of.\n * @param limitMode - The limit mode to set.\n */\n setAxisMode(constraint, axis, limitMode) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMode(jointId, this._constraintAxisToNative(axis), this._limitModeToNative(limitMode));\n }\n }\n /**\n * Gets the axis limit mode of the given constraint.\n *\n * @param constraint - The constraint to get the axis limit mode from.\n * @param axis - The axis to get the limit mode from.\n * @returns The axis limit mode of the given constraint.\n *\n */\n getAxisMode(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n const mode = this._hknp.HP_Constraint_GetAxisMode(firstId, this._constraintAxisToNative(axis))[1];\n return this._nativeToLimitMode(mode);\n }\n return null;\n }\n /**\n * Sets the minimum limit of the given axis of the given constraint.\n * @param constraint - The constraint to set the minimum limit of.\n * @param axis - The axis to set the minimum limit of.\n * @param limit - The minimum limit to set.\n *\n */\n setAxisMinLimit(constraint, axis, limit) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMinLimit(jointId, this._constraintAxisToNative(axis), limit);\n }\n }\n /**\n * Gets the minimum limit of the specified axis of the given constraint.\n * @param constraint - The constraint to get the minimum limit from.\n * @param axis - The axis to get the minimum limit from.\n * @returns The minimum limit of the specified axis of the given constraint.\n *\n */\n getAxisMinLimit(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisMinLimit(firstId, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Sets the maximum limit of the given axis of the given constraint.\n * @param constraint - The constraint to set the maximum limit of the given axis.\n * @param axis - The axis to set the maximum limit of.\n * @param limit - The maximum limit to set.\n *\n */\n setAxisMaxLimit(constraint, axis, limit) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMaxLimit(jointId, this._constraintAxisToNative(axis), limit);\n }\n }\n /**\n * Gets the maximum limit of the given axis of the given constraint.\n *\n * @param constraint - The constraint to get the maximum limit from.\n * @param axis - The axis to get the maximum limit from.\n * @returns The maximum limit of the given axis of the given constraint.\n *\n */\n getAxisMaxLimit(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisMaxLimit(firstId, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Sets the motor type of the given axis of the given constraint.\n * @param constraint - The constraint to set the motor type of.\n * @param axis - The axis of the constraint to set the motor type of.\n * @param motorType - The motor type to set.\n *\n */\n setAxisMotorType(constraint, axis, motorType) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMotorType(jointId, this._constraintAxisToNative(axis), this._constraintMotorTypeToNative(motorType));\n }\n }\n /**\n * Gets the motor type of the specified axis of the given constraint.\n * @param constraint - The constraint to get the motor type from.\n * @param axis - The axis of the constraint to get the motor type from.\n * @returns The motor type of the specified axis of the given constraint.\n *\n */\n getAxisMotorType(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._nativeToMotorType(this._hknp.HP_Constraint_GetAxisMotorType(firstId, this._constraintAxisToNative(axis))[1]);\n }\n return null;\n }\n /**\n * Sets the target of an axis motor of a constraint.\n *\n * @param constraint - The constraint to set the axis motor target of.\n * @param axis - The axis of the constraint to set the motor target of.\n * @param target - The target of the axis motor.\n *\n */\n setAxisMotorTarget(constraint, axis, target) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMotorTarget(jointId, this._constraintAxisToNative(axis), target);\n }\n }\n /**\n * Gets the target of the motor of the given axis of the given constraint.\n *\n * @param constraint - The constraint to get the motor target from.\n * @param axis - The axis of the constraint to get the motor target from.\n * @returns The target of the motor of the given axis of the given constraint.\n *\n */\n getAxisMotorTarget(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisMotorTarget(constraint._pluginData, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Sets the maximum force that can be applied by the motor of the given constraint axis.\n * @param constraint - The constraint to set the motor max force for.\n * @param axis - The axis of the constraint to set the motor max force for.\n * @param maxForce - The maximum force that can be applied by the motor.\n *\n */\n setAxisMotorMaxForce(constraint, axis, maxForce) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetAxisMotorMaxForce(jointId, this._constraintAxisToNative(axis), maxForce);\n }\n }\n /**\n * Gets the maximum force of the motor of the given constraint axis.\n *\n * @param constraint - The constraint to get the motor maximum force from.\n * @param axis - The axis of the constraint to get the motor maximum force from.\n * @returns The maximum force of the motor of the given constraint axis.\n *\n */\n getAxisMotorMaxForce(constraint, axis) {\n const firstId = constraint._pluginData && constraint._pluginData[0];\n if (firstId) {\n return this._hknp.HP_Constraint_GetAxisMotorMaxForce(firstId, this._constraintAxisToNative(axis))[1];\n }\n return null;\n }\n /**\n * Disposes a physics constraint.\n *\n * @param constraint - The physics constraint to dispose.\n *\n * This method is useful for releasing the resources associated with a physics constraint, such as\n * the Havok constraint, when it is no longer needed. This is important for avoiding memory leaks.\n */\n disposeConstraint(constraint) {\n for (const jointId of constraint._pluginData) {\n this._hknp.HP_Constraint_SetEnabled(jointId, false);\n this._hknp.HP_Constraint_Release(jointId);\n }\n constraint._pluginData.length = 0;\n }\n _populateHitData(hitData, result) {\n const hitBody = this._bodies.get(hitData[0][0]);\n result.body = hitBody?.body;\n result.bodyIndex = hitBody?.index;\n const hitShape = this._shapes.get(hitData[1][0]);\n result.shape = hitShape;\n const hitPos = hitData[3];\n const hitNormal = hitData[4];\n const hitTriangle = hitData[5];\n result.setHitData({ x: hitNormal[0], y: hitNormal[1], z: hitNormal[2] }, { x: hitPos[0], y: hitPos[1], z: hitPos[2] }, hitTriangle);\n }\n /**\n * Performs a raycast from a given start point to a given end point and stores the result in a given PhysicsRaycastResult object.\n *\n * @param from - The start point of the raycast.\n * @param to - The end point of the raycast.\n * @param result - The PhysicsRaycastResult object to store the result of the raycast.\n * @param query - The raycast query options. See [[IRaycastQuery]] for more information.\n *\n * Performs a raycast. It takes in two points, from and to, and a PhysicsRaycastResult object to store the result of the raycast.\n * It then performs the raycast and stores the hit data in the PhysicsRaycastResult object.\n */\n raycast(from, to, result, query) {\n const queryMembership = query?.membership ?? ~0;\n const queryCollideWith = query?.collideWith ?? ~0;\n const shouldHitTriggers = query?.shouldHitTriggers ?? false;\n result.reset(from, to);\n const bodyToIgnore = [BigInt(0)];\n const hkQuery = [this._bVecToV3(from), this._bVecToV3(to), [queryMembership, queryCollideWith], shouldHitTriggers, bodyToIgnore];\n this._hknp.HP_World_CastRayWithCollector(this.world, this._queryCollector, hkQuery);\n if (this._hknp.HP_QueryCollector_GetNumHits(this._queryCollector)[1] > 0) {\n const [, hitData] = this._hknp.HP_QueryCollector_GetCastRayResult(this._queryCollector, 0)[1];\n this._populateHitData(hitData, result);\n result.calculateHitDistance();\n }\n }\n /**\n * Given a point, returns the closest physics\n * body to that point.\n * @param query the query to perform. @see IPhysicsPointProximityQuery\n * @param result contact point on the hit shape, in world space\n */\n pointProximity(query, result) {\n const queryMembership = query?.collisionFilter?.membership ?? ~0;\n const queryCollideWith = query?.collisionFilter?.collideWith ?? ~0;\n result.reset();\n const bodyToIgnore = query.ignoreBody ? [BigInt(query.ignoreBody._pluginData.hpBodyId[0])] : [BigInt(0)];\n const hkQuery = [this._bVecToV3(query.position), query.maxDistance, [queryMembership, queryCollideWith], query.shouldHitTriggers, bodyToIgnore];\n this._hknp.HP_World_PointProximityWithCollector(this.world, this._queryCollector, hkQuery);\n if (this._hknp.HP_QueryCollector_GetNumHits(this._queryCollector)[1] > 0) {\n const [distance, hitData] = this._hknp.HP_QueryCollector_GetPointProximityResult(this._queryCollector, 0)[1];\n this._populateHitData(hitData, result);\n result.setHitDistance(distance);\n }\n }\n /**\n * Given a shape in a specific position and orientation, returns the closest point to that shape.\n * @param query the query to perform. @see IPhysicsShapeProximityCastQuery\n * @param inputShapeResult contact point on input shape, in input shape space\n * @param hitShapeResult contact point on hit shape, in world space\n */\n shapeProximity(query, inputShapeResult, hitShapeResult) {\n inputShapeResult.reset();\n hitShapeResult.reset();\n const shapeId = query.shape._pluginData;\n const bodyToIgnore = query.ignoreBody ? [BigInt(query.ignoreBody._pluginData.hpBodyId[0])] : [BigInt(0)];\n const hkQuery = [shapeId, this._bVecToV3(query.position), this._bQuatToV4(query.rotation), query.maxDistance, query.shouldHitTriggers, bodyToIgnore];\n this._hknp.HP_World_ShapeProximityWithCollector(this.world, this._queryCollector, hkQuery);\n if (this._hknp.HP_QueryCollector_GetNumHits(this._queryCollector)[1] > 0) {\n const [distance, hitInputData, hitShapeData] = this._hknp.HP_QueryCollector_GetShapeProximityResult(this._queryCollector, 0)[1];\n this._populateHitData(hitInputData, inputShapeResult);\n this._populateHitData(hitShapeData, hitShapeResult);\n inputShapeResult.setHitDistance(distance);\n hitShapeResult.setHitDistance(distance);\n }\n }\n /**\n * Given a shape in a specific orientation, cast it from the start to end position specified by the query, and return the first hit.\n * @param query the query to perform. @see IPhysicsShapeCastQuery\n * @param inputShapeResult contact point on input shape, in input shape space\n * @param hitShapeResult contact point on hit shape, in world space\n */\n shapeCast(query, inputShapeResult, hitShapeResult) {\n inputShapeResult.reset();\n hitShapeResult.reset();\n const shapeId = query.shape._pluginData;\n const bodyToIgnore = query.ignoreBody ? [BigInt(query.ignoreBody._pluginData.hpBodyId[0])] : [BigInt(0)];\n const hkQuery = [shapeId, this._bQuatToV4(query.rotation), this._bVecToV3(query.startPosition), this._bVecToV3(query.endPosition), query.shouldHitTriggers, bodyToIgnore];\n this._hknp.HP_World_ShapeCastWithCollector(this.world, this._queryCollector, hkQuery);\n if (this._hknp.HP_QueryCollector_GetNumHits(this._queryCollector)[1] > 0) {\n const [fractionAlongRay, hitInputData, hitShapeData] = this._hknp.HP_QueryCollector_GetShapeCastResult(this._queryCollector, 0)[1];\n this._populateHitData(hitInputData, inputShapeResult);\n this._populateHitData(hitShapeData, hitShapeResult);\n inputShapeResult.setHitFraction(fractionAlongRay);\n hitShapeResult.setHitFraction(fractionAlongRay);\n }\n }\n /**\n * Return the collision observable for a particular physics body.\n * @param body the physics body\n * @returns the collision observable for the body\n */\n getCollisionObservable(body) {\n const bodyId = body._pluginData.hpBodyId[0];\n let observable = this._bodyCollisionObservable.get(bodyId);\n if (!observable) {\n observable = new Observable();\n this._bodyCollisionObservable.set(bodyId, observable);\n }\n return observable;\n }\n /**\n * Return the collision ended observable for a particular physics body.\n * @param body the physics body\n * @returns\n */\n getCollisionEndedObservable(body) {\n const bodyId = body._pluginData.hpBodyId[0];\n let observable = this._bodyCollisionEndedObservable.get(bodyId);\n if (!observable) {\n observable = new Observable();\n this._bodyCollisionEndedObservable.set(bodyId, observable);\n }\n return observable;\n }\n /**\n * Enable collision to be reported for a body when a callback is setup on the world\n * @param body the physics body\n * @param enabled whether to enable or disable collision events\n */\n setCollisionCallbackEnabled(body, enabled) {\n // Register for collide events by default\n const collideEvents = this._hknp.EventType.COLLISION_STARTED.value | this._hknp.EventType.COLLISION_CONTINUED.value | this._hknp.EventType.COLLISION_FINISHED.value;\n if (body._pluginDataInstances && body._pluginDataInstances.length) {\n body._pluginDataInstances.forEach((bodyId) => {\n this._hknp.HP_Body_SetEventMask(bodyId.hpBodyId, enabled ? collideEvents : 0);\n });\n }\n else if (body._pluginData) {\n this._hknp.HP_Body_SetEventMask(body._pluginData.hpBodyId, enabled ? collideEvents : 0);\n }\n }\n /**\n * Enable collision ended to be reported for a body when a callback is setup on the world\n * @param body the physics body\n * @param enabled whether to enable or disable collision ended events\n */\n setCollisionEndedCallbackEnabled(body, enabled) {\n // Register to collide ended events\n const pluginRef = this._getPluginReference(body);\n let currentCollideEvents = this._hknp.HP_Body_GetEventMask(pluginRef.hpBodyId)[1];\n // update with the ended mask\n currentCollideEvents = enabled\n ? currentCollideEvents | this._hknp.EventType.COLLISION_FINISHED.value\n : currentCollideEvents & ~this._hknp.EventType.COLLISION_FINISHED.value;\n if (body._pluginDataInstances && body._pluginDataInstances.length) {\n body._pluginDataInstances.forEach((bodyId) => {\n this._hknp.HP_Body_SetEventMask(bodyId.hpBodyId, currentCollideEvents);\n });\n }\n else if (body._pluginData) {\n this._hknp.HP_Body_SetEventMask(body._pluginData.hpBodyId, currentCollideEvents);\n }\n }\n _notifyTriggers() {\n let eventAddress = this._hknp.HP_World_GetTriggerEvents(this.world)[1];\n const event = new TriggerEvent();\n while (eventAddress) {\n TriggerEvent.readToRef(this._hknp.HEAPU8.buffer, eventAddress, event);\n const bodyInfoA = this._bodies.get(event.bodyIdA);\n const bodyInfoB = this._bodies.get(event.bodyIdB);\n // Bodies may have been disposed between events. Check both still exist.\n if (bodyInfoA && bodyInfoB) {\n const triggerCollisionInfo = {\n collider: bodyInfoA.body,\n colliderIndex: bodyInfoA.index,\n collidedAgainst: bodyInfoB.body,\n collidedAgainstIndex: bodyInfoB.index,\n type: this._nativeTriggerCollisionValueToCollisionType(event.type),\n };\n this.onTriggerCollisionObservable.notifyObservers(triggerCollisionInfo);\n }\n eventAddress = this._hknp.HP_World_GetNextTriggerEvent(this.world, eventAddress);\n }\n }\n /**\n * Runs thru all detected collisions and filter by body\n */\n _notifyCollisions() {\n let eventAddress = this._hknp.HP_World_GetCollisionEvents(this.world)[1];\n const event = new CollisionEvent();\n const worldAddr = Number(this.world);\n while (eventAddress) {\n CollisionEvent.readToRef(this._hknp.HEAPU8.buffer, eventAddress, event);\n const bodyInfoA = this._bodies.get(event.contactOnA.bodyId);\n const bodyInfoB = this._bodies.get(event.contactOnB.bodyId);\n // Bodies may have been disposed between events. Check both still exist.\n if (bodyInfoA && bodyInfoB) {\n const collisionInfo = {\n collider: bodyInfoA.body,\n colliderIndex: bodyInfoA.index,\n collidedAgainst: bodyInfoB.body,\n collidedAgainstIndex: bodyInfoB.index,\n type: this._nativeCollisionValueToCollisionType(event.type),\n };\n if (collisionInfo.type === \"COLLISION_FINISHED\" /* PhysicsEventType.COLLISION_FINISHED */) {\n this.onCollisionEndedObservable.notifyObservers(collisionInfo);\n }\n else {\n event.contactOnB.position.subtractToRef(event.contactOnA.position, this._tmpVec3[0]);\n const distance = Vector3.Dot(this._tmpVec3[0], event.contactOnA.normal);\n collisionInfo.point = event.contactOnA.position;\n collisionInfo.distance = distance;\n collisionInfo.impulse = event.impulseApplied;\n collisionInfo.normal = event.contactOnA.normal;\n this.onCollisionObservable.notifyObservers(collisionInfo);\n }\n if (this._bodyCollisionObservable.size && collisionInfo.type !== \"COLLISION_FINISHED\" /* PhysicsEventType.COLLISION_FINISHED */) {\n const observableA = this._bodyCollisionObservable.get(event.contactOnA.bodyId);\n const observableB = this._bodyCollisionObservable.get(event.contactOnB.bodyId);\n event.contactOnA.position.subtractToRef(event.contactOnB.position, this._tmpVec3[0]);\n const distance = Vector3.Dot(this._tmpVec3[0], event.contactOnB.normal);\n if (observableA) {\n observableA.notifyObservers(collisionInfo);\n }\n if (observableB) {\n const collisionInfoB = {\n collider: bodyInfoB.body,\n colliderIndex: bodyInfoB.index,\n collidedAgainst: bodyInfoA.body,\n collidedAgainstIndex: bodyInfoA.index,\n point: event.contactOnB.position,\n distance: distance,\n impulse: event.impulseApplied,\n normal: event.contactOnB.normal,\n type: this._nativeCollisionValueToCollisionType(event.type),\n };\n observableB.notifyObservers(collisionInfoB);\n }\n }\n else if (this._bodyCollisionEndedObservable.size) {\n const observableA = this._bodyCollisionEndedObservable.get(event.contactOnA.bodyId);\n const observableB = this._bodyCollisionEndedObservable.get(event.contactOnB.bodyId);\n event.contactOnA.position.subtractToRef(event.contactOnB.position, this._tmpVec3[0]);\n const distance = Vector3.Dot(this._tmpVec3[0], event.contactOnB.normal);\n if (observableA) {\n observableA.notifyObservers(collisionInfo);\n }\n if (observableB) {\n const collisionInfoB = {\n collider: bodyInfoB.body,\n colliderIndex: bodyInfoB.index,\n collidedAgainst: bodyInfoA.body,\n collidedAgainstIndex: bodyInfoA.index,\n point: event.contactOnB.position,\n distance: distance,\n impulse: event.impulseApplied,\n normal: event.contactOnB.normal,\n type: this._nativeCollisionValueToCollisionType(event.type),\n };\n observableB.notifyObservers(collisionInfoB);\n }\n }\n }\n eventAddress = this._hknp.HP_World_GetNextCollisionEvent(worldAddr, eventAddress);\n }\n }\n /**\n * Gets the number of bodies in the world\n */\n get numBodies() {\n return this._hknp.HP_World_GetNumBodies(this.world)[1];\n }\n /**\n * Dispose the world and free resources\n */\n dispose() {\n if (this._queryCollector) {\n this._hknp.HP_QueryCollector_Release(this._queryCollector);\n this._queryCollector = undefined;\n }\n if (this.world) {\n this._hknp.HP_World_Release(this.world);\n this.world = undefined;\n }\n }\n _v3ToBvecRef(v, vec3) {\n vec3.set(v[0], v[1], v[2]);\n }\n _bVecToV3(v) {\n return [v._x, v._y, v._z];\n }\n _bQuatToV4(q) {\n return [q._x, q._y, q._z, q._w];\n }\n _constraintMotorTypeToNative(motorType) {\n switch (motorType) {\n case 2 /* PhysicsConstraintMotorType.POSITION */:\n return this._hknp.ConstraintMotorType.POSITION;\n case 1 /* PhysicsConstraintMotorType.VELOCITY */:\n return this._hknp.ConstraintMotorType.VELOCITY;\n }\n return this._hknp.ConstraintMotorType.NONE;\n }\n _nativeToMotorType(motorType) {\n switch (motorType) {\n case this._hknp.ConstraintMotorType.POSITION:\n return 2 /* PhysicsConstraintMotorType.POSITION */;\n case this._hknp.ConstraintMotorType.VELOCITY:\n return 1 /* PhysicsConstraintMotorType.VELOCITY */;\n }\n return 0 /* PhysicsConstraintMotorType.NONE */;\n }\n _materialCombineToNative(mat) {\n switch (mat) {\n case 0 /* PhysicsMaterialCombineMode.GEOMETRIC_MEAN */:\n return this._hknp.MaterialCombine.GEOMETRIC_MEAN;\n case 1 /* PhysicsMaterialCombineMode.MINIMUM */:\n return this._hknp.MaterialCombine.MINIMUM;\n case 2 /* PhysicsMaterialCombineMode.MAXIMUM */:\n return this._hknp.MaterialCombine.MAXIMUM;\n case 3 /* PhysicsMaterialCombineMode.ARITHMETIC_MEAN */:\n return this._hknp.MaterialCombine.ARITHMETIC_MEAN;\n case 4 /* PhysicsMaterialCombineMode.MULTIPLY */:\n return this._hknp.MaterialCombine.MULTIPLY;\n }\n }\n _nativeToMaterialCombine(mat) {\n switch (mat) {\n case this._hknp.MaterialCombine.GEOMETRIC_MEAN:\n return 0 /* PhysicsMaterialCombineMode.GEOMETRIC_MEAN */;\n case this._hknp.MaterialCombine.MINIMUM:\n return 1 /* PhysicsMaterialCombineMode.MINIMUM */;\n case this._hknp.MaterialCombine.MAXIMUM:\n return 2 /* PhysicsMaterialCombineMode.MAXIMUM */;\n case this._hknp.MaterialCombine.ARITHMETIC_MEAN:\n return 3 /* PhysicsMaterialCombineMode.ARITHMETIC_MEAN */;\n case this._hknp.MaterialCombine.MULTIPLY:\n return 4 /* PhysicsMaterialCombineMode.MULTIPLY */;\n default:\n return undefined;\n }\n }\n _constraintAxisToNative(axId) {\n switch (axId) {\n case 0 /* PhysicsConstraintAxis.LINEAR_X */:\n return this._hknp.ConstraintAxis.LINEAR_X;\n case 1 /* PhysicsConstraintAxis.LINEAR_Y */:\n return this._hknp.ConstraintAxis.LINEAR_Y;\n case 2 /* PhysicsConstraintAxis.LINEAR_Z */:\n return this._hknp.ConstraintAxis.LINEAR_Z;\n case 3 /* PhysicsConstraintAxis.ANGULAR_X */:\n return this._hknp.ConstraintAxis.ANGULAR_X;\n case 4 /* PhysicsConstraintAxis.ANGULAR_Y */:\n return this._hknp.ConstraintAxis.ANGULAR_Y;\n case 5 /* PhysicsConstraintAxis.ANGULAR_Z */:\n return this._hknp.ConstraintAxis.ANGULAR_Z;\n case 6 /* PhysicsConstraintAxis.LINEAR_DISTANCE */:\n return this._hknp.ConstraintAxis.LINEAR_DISTANCE;\n }\n }\n _nativeToLimitMode(mode) {\n switch (mode) {\n case this._hknp.ConstraintAxisLimitMode.FREE:\n return 0 /* PhysicsConstraintAxisLimitMode.FREE */;\n case this._hknp.ConstraintAxisLimitMode.LIMITED:\n return 1 /* PhysicsConstraintAxisLimitMode.LIMITED */;\n case this._hknp.ConstraintAxisLimitMode.LOCKED:\n return 2 /* PhysicsConstraintAxisLimitMode.LOCKED */;\n }\n return 0 /* PhysicsConstraintAxisLimitMode.FREE */;\n }\n _limitModeToNative(mode) {\n switch (mode) {\n case 0 /* PhysicsConstraintAxisLimitMode.FREE */:\n return this._hknp.ConstraintAxisLimitMode.FREE;\n case 1 /* PhysicsConstraintAxisLimitMode.LIMITED */:\n return this._hknp.ConstraintAxisLimitMode.LIMITED;\n case 2 /* PhysicsConstraintAxisLimitMode.LOCKED */:\n return this._hknp.ConstraintAxisLimitMode.LOCKED;\n }\n }\n _nativeCollisionValueToCollisionType(type) {\n switch (type) {\n case this._hknp.EventType.COLLISION_STARTED.value:\n return \"COLLISION_STARTED\" /* PhysicsEventType.COLLISION_STARTED */;\n case this._hknp.EventType.COLLISION_FINISHED.value:\n return \"COLLISION_FINISHED\" /* PhysicsEventType.COLLISION_FINISHED */;\n case this._hknp.EventType.COLLISION_CONTINUED.value:\n return \"COLLISION_CONTINUED\" /* PhysicsEventType.COLLISION_CONTINUED */;\n }\n return \"COLLISION_STARTED\" /* PhysicsEventType.COLLISION_STARTED */;\n }\n _nativeTriggerCollisionValueToCollisionType(type) {\n switch (type) {\n case 8:\n return \"TRIGGER_ENTERED\" /* PhysicsEventType.TRIGGER_ENTERED */;\n case 16:\n return \"TRIGGER_EXITED\" /* PhysicsEventType.TRIGGER_EXITED */;\n }\n return \"TRIGGER_ENTERED\" /* PhysicsEventType.TRIGGER_ENTERED */;\n }\n}\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}