@babylonjs/core 5.0.0 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/Collisions/collider.d.ts +4 -0
  2. package/Collisions/collider.js +9 -0
  3. package/Collisions/collider.js.map +1 -1
  4. package/Engines/Extensions/engine.readTexture.d.ts +2 -2
  5. package/Engines/Extensions/engine.readTexture.js +8 -4
  6. package/Engines/Extensions/engine.readTexture.js.map +1 -1
  7. package/Engines/WebGPU/Extensions/engine.readTexture.js +4 -2
  8. package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
  9. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +2 -0
  10. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +25 -10
  11. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  12. package/Engines/engine.d.ts +7 -1
  13. package/Engines/engine.js +14 -0
  14. package/Engines/engine.js.map +1 -1
  15. package/Engines/nativeEngine.d.ts +24 -0
  16. package/Engines/nativeEngine.js +39 -0
  17. package/Engines/nativeEngine.js.map +1 -1
  18. package/Engines/nullEngine.d.ts +1 -0
  19. package/Engines/nullEngine.js +5 -0
  20. package/Engines/nullEngine.js.map +1 -1
  21. package/Engines/thinEngine.d.ts +2 -1
  22. package/Engines/thinEngine.js +16 -6
  23. package/Engines/thinEngine.js.map +1 -1
  24. package/Engines/webgpuEngine.d.ts +13 -1
  25. package/Engines/webgpuEngine.js +25 -1
  26. package/Engines/webgpuEngine.js.map +1 -1
  27. package/Materials/PBR/pbrBaseMaterial.js +3 -0
  28. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  29. package/Materials/Textures/baseTexture.d.ts +5 -1
  30. package/Materials/Textures/baseTexture.js +21 -11
  31. package/Materials/Textures/baseTexture.js.map +1 -1
  32. package/Materials/Textures/texture.d.ts +3 -0
  33. package/Materials/Textures/texture.js +4 -2
  34. package/Materials/Textures/texture.js.map +1 -1
  35. package/Meshes/mesh.js +0 -1
  36. package/Meshes/mesh.js.map +1 -1
  37. package/ShadersWGSL/ShadersInclude/meshUboDeclaration.js +1 -1
  38. package/ShadersWGSL/ShadersInclude/meshUboDeclaration.js.map +1 -1
  39. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +1 -1
  40. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
  41. package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
  42. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  43. package/package.json +1 -1
@@ -14,6 +14,10 @@ export declare class Collider {
14
14
  * Define last collided mesh
15
15
  */
16
16
  collidedMesh: Nullable<AbstractMesh>;
17
+ /**
18
+ * If true, it check for double sided faces and only returns 1 collision instead of 2
19
+ */
20
+ static DoubleSidedCheck: boolean;
17
21
  private _collisionPoint;
18
22
  private _planeIntersectionPoint;
19
23
  private _tempVector;
@@ -192,6 +192,11 @@ var Collider = /** @class */ (function () {
192
192
  }
193
193
  var signedDistToTrianglePlane = trianglePlane.signedDistanceTo(this._basePoint);
194
194
  var normalDotVelocity = Vector3.Dot(trianglePlane.normal, this._velocity);
195
+ // if DoubleSidedCheck is false(default), a double sided face will be consided 2 times.
196
+ // if true, it discard the faces having normal not facing velocity
197
+ if (Collider.DoubleSidedCheck && normalDotVelocity > 0.0001) {
198
+ return;
199
+ }
195
200
  if (normalDotVelocity == 0) {
196
201
  if (Math.abs(signedDistToTrianglePlane) >= 1.0) {
197
202
  return;
@@ -440,6 +445,10 @@ var Collider = /** @class */ (function () {
440
445
  this._destinationPoint.subtractInPlace(this._slidePlaneNormal);
441
446
  this._destinationPoint.subtractToRef(this.intersectionPoint, vel);
442
447
  };
448
+ /**
449
+ * If true, it check for double sided faces and only returns 1 collision instead of 2
450
+ */
451
+ Collider.DoubleSidedCheck = false;
443
452
  return Collider;
444
453
  }());
445
454
  export { Collider };
@@ -1 +1 @@
1
- {"version":3,"file":"collider.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Collisions/collider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, IndicesArray } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\n\r\nconst intersectBoxAASphere = (boxMin: Vector3, boxMax: Vector3, sphereCenter: Vector3, sphereRadius: number): boolean => {\r\n if (boxMin.x > sphereCenter.x + sphereRadius) {\r\n return false;\r\n }\r\n\r\n if (sphereCenter.x - sphereRadius > boxMax.x) {\r\n return false;\r\n }\r\n\r\n if (boxMin.y > sphereCenter.y + sphereRadius) {\r\n return false;\r\n }\r\n\r\n if (sphereCenter.y - sphereRadius > boxMax.y) {\r\n return false;\r\n }\r\n\r\n if (boxMin.z > sphereCenter.z + sphereRadius) {\r\n return false;\r\n }\r\n\r\n if (sphereCenter.z - sphereRadius > boxMax.z) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst getLowestRoot: (a: number, b: number, c: number, maxR: number) => { root: number; found: boolean } = (function () {\r\n const result = { root: 0, found: false };\r\n return function (a: number, b: number, c: number, maxR: number) {\r\n result.root = 0;\r\n result.found = false;\r\n const determinant = b * b - 4.0 * a * c;\r\n if (determinant < 0) {\r\n return result;\r\n }\r\n\r\n const sqrtD = Math.sqrt(determinant);\r\n let r1 = (-b - sqrtD) / (2.0 * a);\r\n let r2 = (-b + sqrtD) / (2.0 * a);\r\n\r\n if (r1 > r2) {\r\n const temp = r2;\r\n r2 = r1;\r\n r1 = temp;\r\n }\r\n\r\n if (r1 > 0 && r1 < maxR) {\r\n result.root = r1;\r\n result.found = true;\r\n return result;\r\n }\r\n\r\n if (r2 > 0 && r2 < maxR) {\r\n result.root = r2;\r\n result.found = true;\r\n return result;\r\n }\r\n\r\n return result;\r\n };\r\n})();\r\n\r\n/** @hidden */\r\nexport class Collider {\r\n // Implementation of the \"Improved Collision detection and Response\" algorithm proposed by Kasper Fauerby\r\n // https://www.peroxide.dk/papers/collision/collision.pdf\r\n\r\n /** Define if a collision was found */\r\n public collisionFound: boolean;\r\n\r\n /**\r\n * Define last intersection point in local space\r\n */\r\n public intersectionPoint: Vector3;\r\n\r\n /**\r\n * Define last collided mesh\r\n */\r\n public collidedMesh: Nullable<AbstractMesh>;\r\n\r\n private _collisionPoint = Vector3.Zero();\r\n private _planeIntersectionPoint = Vector3.Zero();\r\n private _tempVector = Vector3.Zero();\r\n private _tempVector2 = Vector3.Zero();\r\n private _tempVector3 = Vector3.Zero();\r\n private _tempVector4 = Vector3.Zero();\r\n private _edge = Vector3.Zero();\r\n private _baseToVertex = Vector3.Zero();\r\n private _destinationPoint = Vector3.Zero();\r\n private _slidePlaneNormal = Vector3.Zero();\r\n private _displacementVector = Vector3.Zero();\r\n\r\n /** @hidden */\r\n public _radius = Vector3.One();\r\n /** @hidden */\r\n public _retry = 0;\r\n private _velocity: Vector3;\r\n private _basePoint: Vector3;\r\n private _epsilon: number;\r\n /** @hidden */\r\n public _velocityWorldLength: number;\r\n /** @hidden */\r\n public _basePointWorld = Vector3.Zero();\r\n private _velocityWorld = Vector3.Zero();\r\n private _normalizedVelocity = Vector3.Zero();\r\n /** @hidden */\r\n public _initialVelocity: Vector3;\r\n /** @hidden */\r\n public _initialPosition: Vector3;\r\n private _nearestDistance: number;\r\n\r\n private _collisionMask = -1;\r\n private _velocitySquaredLength: number;\r\n private _nearestDistanceSquared: number;\r\n\r\n public get collisionMask(): number {\r\n return this._collisionMask;\r\n }\r\n\r\n public set collisionMask(mask: number) {\r\n this._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets the plane normal used to compute the sliding response (in local space)\r\n */\r\n public get slidePlaneNormal(): Vector3 {\r\n return this._slidePlaneNormal;\r\n }\r\n\r\n // Methods\r\n /**\r\n * @param source\r\n * @param dir\r\n * @param e\r\n * @hidden\r\n */\r\n public _initialize(source: Vector3, dir: Vector3, e: number): void {\r\n this._velocity = dir;\r\n this._velocitySquaredLength = this._velocity.lengthSquared();\r\n const len = Math.sqrt(this._velocitySquaredLength);\r\n if (len === 0 || len === 1.0) {\r\n this._normalizedVelocity.copyFromFloats(dir._x, dir._y, dir._z);\r\n } else {\r\n dir.scaleToRef(1.0 / len, this._normalizedVelocity);\r\n }\r\n this._basePoint = source;\r\n\r\n source.multiplyToRef(this._radius, this._basePointWorld);\r\n dir.multiplyToRef(this._radius, this._velocityWorld);\r\n\r\n this._velocityWorldLength = this._velocityWorld.length();\r\n\r\n this._epsilon = e;\r\n this.collisionFound = false;\r\n }\r\n\r\n /**\r\n * @param point\r\n * @param pa\r\n * @param pb\r\n * @param pc\r\n * @param n\r\n * @hidden\r\n */\r\n public _checkPointInTriangle(point: Vector3, pa: Vector3, pb: Vector3, pc: Vector3, n: Vector3): boolean {\r\n pa.subtractToRef(point, this._tempVector);\r\n pb.subtractToRef(point, this._tempVector2);\r\n\r\n Vector3.CrossToRef(this._tempVector, this._tempVector2, this._tempVector4);\r\n let d = Vector3.Dot(this._tempVector4, n);\r\n if (d < 0) {\r\n return false;\r\n }\r\n\r\n pc.subtractToRef(point, this._tempVector3);\r\n Vector3.CrossToRef(this._tempVector2, this._tempVector3, this._tempVector4);\r\n d = Vector3.Dot(this._tempVector4, n);\r\n if (d < 0) {\r\n return false;\r\n }\r\n\r\n Vector3.CrossToRef(this._tempVector3, this._tempVector, this._tempVector4);\r\n d = Vector3.Dot(this._tempVector4, n);\r\n return d >= 0;\r\n }\r\n\r\n /**\r\n * @param sphereCenter\r\n * @param sphereRadius\r\n * @param vecMin\r\n * @param vecMax\r\n * @hidden\r\n */\r\n public _canDoCollision(sphereCenter: Vector3, sphereRadius: number, vecMin: Vector3, vecMax: Vector3): boolean {\r\n const distance = Vector3.Distance(this._basePointWorld, sphereCenter);\r\n\r\n const max = Math.max(this._radius.x, this._radius.y, this._radius.z);\r\n\r\n if (distance > this._velocityWorldLength + max + sphereRadius) {\r\n return false;\r\n }\r\n\r\n if (!intersectBoxAASphere(vecMin, vecMax, this._basePointWorld, this._velocityWorldLength + max)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @param faceIndex\r\n * @param trianglePlaneArray\r\n * @param p1\r\n * @param p2\r\n * @param p3\r\n * @param hasMaterial\r\n * @param hostMesh\r\n * @hidden\r\n */\r\n public _testTriangle(faceIndex: number, trianglePlaneArray: Array<Plane>, p1: Vector3, p2: Vector3, p3: Vector3, hasMaterial: boolean, hostMesh: AbstractMesh): void {\r\n let t0;\r\n let embeddedInPlane = false;\r\n\r\n //defensive programming, actually not needed.\r\n if (!trianglePlaneArray) {\r\n trianglePlaneArray = [];\r\n }\r\n\r\n if (!trianglePlaneArray[faceIndex]) {\r\n trianglePlaneArray[faceIndex] = new Plane(0, 0, 0, 0);\r\n trianglePlaneArray[faceIndex].copyFromPoints(p1, p2, p3);\r\n }\r\n\r\n const trianglePlane = trianglePlaneArray[faceIndex];\r\n\r\n if (!hasMaterial && !trianglePlane.isFrontFacingTo(this._normalizedVelocity, 0)) {\r\n return;\r\n }\r\n\r\n const signedDistToTrianglePlane = trianglePlane.signedDistanceTo(this._basePoint);\r\n const normalDotVelocity = Vector3.Dot(trianglePlane.normal, this._velocity);\r\n\r\n if (normalDotVelocity == 0) {\r\n if (Math.abs(signedDistToTrianglePlane) >= 1.0) {\r\n return;\r\n }\r\n embeddedInPlane = true;\r\n t0 = 0;\r\n } else {\r\n t0 = (-1.0 - signedDistToTrianglePlane) / normalDotVelocity;\r\n let t1 = (1.0 - signedDistToTrianglePlane) / normalDotVelocity;\r\n\r\n if (t0 > t1) {\r\n const temp = t1;\r\n t1 = t0;\r\n t0 = temp;\r\n }\r\n\r\n if (t0 > 1.0 || t1 < 0.0) {\r\n return;\r\n }\r\n\r\n if (t0 < 0) {\r\n t0 = 0;\r\n }\r\n if (t0 > 1.0) {\r\n t0 = 1.0;\r\n }\r\n }\r\n\r\n this._collisionPoint.copyFromFloats(0, 0, 0);\r\n\r\n let found = false;\r\n let t = 1.0;\r\n\r\n if (!embeddedInPlane) {\r\n this._basePoint.subtractToRef(trianglePlane.normal, this._planeIntersectionPoint);\r\n this._velocity.scaleToRef(t0, this._tempVector);\r\n this._planeIntersectionPoint.addInPlace(this._tempVector);\r\n\r\n if (this._checkPointInTriangle(this._planeIntersectionPoint, p1, p2, p3, trianglePlane.normal)) {\r\n found = true;\r\n t = t0;\r\n this._collisionPoint.copyFrom(this._planeIntersectionPoint);\r\n }\r\n }\r\n\r\n if (!found) {\r\n let a = this._velocitySquaredLength;\r\n\r\n this._basePoint.subtractToRef(p1, this._tempVector);\r\n let b = 2.0 * Vector3.Dot(this._velocity, this._tempVector);\r\n let c = this._tempVector.lengthSquared() - 1.0;\r\n\r\n let lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._collisionPoint.copyFrom(p1);\r\n }\r\n\r\n this._basePoint.subtractToRef(p2, this._tempVector);\r\n b = 2.0 * Vector3.Dot(this._velocity, this._tempVector);\r\n c = this._tempVector.lengthSquared() - 1.0;\r\n\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._collisionPoint.copyFrom(p2);\r\n }\r\n\r\n this._basePoint.subtractToRef(p3, this._tempVector);\r\n b = 2.0 * Vector3.Dot(this._velocity, this._tempVector);\r\n c = this._tempVector.lengthSquared() - 1.0;\r\n\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._collisionPoint.copyFrom(p3);\r\n }\r\n\r\n p2.subtractToRef(p1, this._edge);\r\n p1.subtractToRef(this._basePoint, this._baseToVertex);\r\n let edgeSquaredLength = this._edge.lengthSquared();\r\n let edgeDotVelocity = Vector3.Dot(this._edge, this._velocity);\r\n let edgeDotBaseToVertex = Vector3.Dot(this._edge, this._baseToVertex);\r\n\r\n a = edgeSquaredLength * -this._velocitySquaredLength + edgeDotVelocity * edgeDotVelocity;\r\n b = 2 * (edgeSquaredLength * Vector3.Dot(this._velocity, this._baseToVertex) - edgeDotVelocity * edgeDotBaseToVertex);\r\n c = edgeSquaredLength * (1.0 - this._baseToVertex.lengthSquared()) + edgeDotBaseToVertex * edgeDotBaseToVertex;\r\n\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n const f = (edgeDotVelocity * lowestRoot.root - edgeDotBaseToVertex) / edgeSquaredLength;\r\n\r\n if (f >= 0.0 && f <= 1.0) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._edge.scaleInPlace(f);\r\n p1.addToRef(this._edge, this._collisionPoint);\r\n }\r\n }\r\n\r\n p3.subtractToRef(p2, this._edge);\r\n p2.subtractToRef(this._basePoint, this._baseToVertex);\r\n edgeSquaredLength = this._edge.lengthSquared();\r\n edgeDotVelocity = Vector3.Dot(this._edge, this._velocity);\r\n edgeDotBaseToVertex = Vector3.Dot(this._edge, this._baseToVertex);\r\n\r\n a = edgeSquaredLength * -this._velocitySquaredLength + edgeDotVelocity * edgeDotVelocity;\r\n b = 2 * (edgeSquaredLength * Vector3.Dot(this._velocity, this._baseToVertex) - edgeDotVelocity * edgeDotBaseToVertex);\r\n c = edgeSquaredLength * (1.0 - this._baseToVertex.lengthSquared()) + edgeDotBaseToVertex * edgeDotBaseToVertex;\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n const f = (edgeDotVelocity * lowestRoot.root - edgeDotBaseToVertex) / edgeSquaredLength;\r\n\r\n if (f >= 0.0 && f <= 1.0) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._edge.scaleInPlace(f);\r\n p2.addToRef(this._edge, this._collisionPoint);\r\n }\r\n }\r\n\r\n p1.subtractToRef(p3, this._edge);\r\n p3.subtractToRef(this._basePoint, this._baseToVertex);\r\n edgeSquaredLength = this._edge.lengthSquared();\r\n edgeDotVelocity = Vector3.Dot(this._edge, this._velocity);\r\n edgeDotBaseToVertex = Vector3.Dot(this._edge, this._baseToVertex);\r\n\r\n a = edgeSquaredLength * -this._velocitySquaredLength + edgeDotVelocity * edgeDotVelocity;\r\n b = 2 * (edgeSquaredLength * Vector3.Dot(this._velocity, this._baseToVertex) - edgeDotVelocity * edgeDotBaseToVertex);\r\n c = edgeSquaredLength * (1.0 - this._baseToVertex.lengthSquared()) + edgeDotBaseToVertex * edgeDotBaseToVertex;\r\n\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n const f = (edgeDotVelocity * lowestRoot.root - edgeDotBaseToVertex) / edgeSquaredLength;\r\n\r\n if (f >= 0.0 && f <= 1.0) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._edge.scaleInPlace(f);\r\n p3.addToRef(this._edge, this._collisionPoint);\r\n }\r\n }\r\n }\r\n\r\n if (found) {\r\n const distToCollisionSquared = t * t * this._velocitySquaredLength;\r\n\r\n if (!this.collisionFound || distToCollisionSquared < this._nearestDistanceSquared) {\r\n // if collisionResponse is false, collision is not found but the collidedMesh is set anyway.\r\n // onCollide observable are triggered if collideMesh is set\r\n // this allow trigger volumes to be created.\r\n if (hostMesh.collisionResponse) {\r\n if (!this.intersectionPoint) {\r\n this.intersectionPoint = this._collisionPoint.clone();\r\n } else {\r\n this.intersectionPoint.copyFrom(this._collisionPoint);\r\n }\r\n this._nearestDistanceSquared = distToCollisionSquared;\r\n this._nearestDistance = Math.sqrt(distToCollisionSquared);\r\n this.collisionFound = true;\r\n }\r\n this.collidedMesh = hostMesh;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param trianglePlaneArray\r\n * @param pts\r\n * @param indices\r\n * @param indexStart\r\n * @param indexEnd\r\n * @param decal\r\n * @param hasMaterial\r\n * @param hostMesh\r\n * @param invertTriangles\r\n * @param triangleStrip\r\n * @hidden\r\n */\r\n public _collide(\r\n trianglePlaneArray: Array<Plane>,\r\n pts: Vector3[],\r\n indices: IndicesArray,\r\n indexStart: number,\r\n indexEnd: number,\r\n decal: number,\r\n hasMaterial: boolean,\r\n hostMesh: AbstractMesh,\r\n invertTriangles?: boolean,\r\n triangleStrip: boolean = false\r\n ): void {\r\n if (triangleStrip) {\r\n if (!indices || indices.length === 0) {\r\n for (let i = 0; i < pts.length - 2; i += 1) {\r\n const p1 = pts[i];\r\n const p2 = pts[i + 1];\r\n const p3 = pts[i + 2];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p1 || !p2 || !p3) {\r\n continue;\r\n }\r\n // Handles strip faces one on two is reversed\r\n if ((invertTriangles ? 1 : 0) ^ i % 2) {\r\n this._testTriangle(i, trianglePlaneArray, p1, p2, p3, hasMaterial, hostMesh);\r\n } else {\r\n this._testTriangle(i, trianglePlaneArray, p2, p1, p3, hasMaterial, hostMesh);\r\n }\r\n }\r\n } else {\r\n for (let i = indexStart; i < indexEnd - 2; i += 1) {\r\n const indexA = indices[i];\r\n const indexB = indices[i + 1];\r\n const indexC = indices[i + 2];\r\n\r\n if (indexC === 0xffffffff) {\r\n i += 2;\r\n continue;\r\n }\r\n\r\n const p1 = pts[indexA];\r\n const p2 = pts[indexB];\r\n const p3 = pts[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p1 || !p2 || !p3) {\r\n continue;\r\n }\r\n\r\n // Handles strip faces one on two is reversed\r\n if ((invertTriangles ? 1 : 0) ^ i % 2) {\r\n this._testTriangle(i, trianglePlaneArray, p1, p2, p3, hasMaterial, hostMesh);\r\n } else {\r\n this._testTriangle(i, trianglePlaneArray, p2, p1, p3, hasMaterial, hostMesh);\r\n }\r\n }\r\n }\r\n } else if (!indices || indices.length === 0) {\r\n for (let i = 0; i < pts.length; i += 3) {\r\n const p1 = pts[i];\r\n const p2 = pts[i + 1];\r\n const p3 = pts[i + 2];\r\n\r\n if (invertTriangles) {\r\n this._testTriangle(i, trianglePlaneArray, p1, p2, p3, hasMaterial, hostMesh);\r\n } else {\r\n this._testTriangle(i, trianglePlaneArray, p3, p2, p1, hasMaterial, hostMesh);\r\n }\r\n }\r\n } else {\r\n for (let i = indexStart; i < indexEnd; i += 3) {\r\n const p1 = pts[indices[i] - decal];\r\n const p2 = pts[indices[i + 1] - decal];\r\n const p3 = pts[indices[i + 2] - decal];\r\n\r\n if (invertTriangles) {\r\n this._testTriangle(i, trianglePlaneArray, p1, p2, p3, hasMaterial, hostMesh);\r\n } else {\r\n this._testTriangle(i, trianglePlaneArray, p3, p2, p1, hasMaterial, hostMesh);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param pos\r\n * @param vel\r\n * @hidden\r\n */\r\n public _getResponse(pos: Vector3, vel: Vector3): void {\r\n pos.addToRef(vel, this._destinationPoint);\r\n vel.scaleInPlace(this._nearestDistance / vel.length());\r\n\r\n this._basePoint.addToRef(vel, pos);\r\n pos.subtractToRef(this.intersectionPoint, this._slidePlaneNormal);\r\n this._slidePlaneNormal.normalize();\r\n this._slidePlaneNormal.scaleToRef(this._epsilon, this._displacementVector);\r\n\r\n pos.addInPlace(this._displacementVector);\r\n this.intersectionPoint.addInPlace(this._displacementVector);\r\n\r\n this._slidePlaneNormal.scaleInPlace(Plane.SignedDistanceToPlaneFromPositionAndNormal(this.intersectionPoint, this._slidePlaneNormal, this._destinationPoint));\r\n this._destinationPoint.subtractInPlace(this._slidePlaneNormal);\r\n\r\n this._destinationPoint.subtractToRef(this.intersectionPoint, vel);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"collider.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Collisions/collider.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable, IndicesArray } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\n\r\nconst intersectBoxAASphere = (boxMin: Vector3, boxMax: Vector3, sphereCenter: Vector3, sphereRadius: number): boolean => {\r\n if (boxMin.x > sphereCenter.x + sphereRadius) {\r\n return false;\r\n }\r\n\r\n if (sphereCenter.x - sphereRadius > boxMax.x) {\r\n return false;\r\n }\r\n\r\n if (boxMin.y > sphereCenter.y + sphereRadius) {\r\n return false;\r\n }\r\n\r\n if (sphereCenter.y - sphereRadius > boxMax.y) {\r\n return false;\r\n }\r\n\r\n if (boxMin.z > sphereCenter.z + sphereRadius) {\r\n return false;\r\n }\r\n\r\n if (sphereCenter.z - sphereRadius > boxMax.z) {\r\n return false;\r\n }\r\n\r\n return true;\r\n};\r\n\r\nconst getLowestRoot: (a: number, b: number, c: number, maxR: number) => { root: number; found: boolean } = (function () {\r\n const result = { root: 0, found: false };\r\n return function (a: number, b: number, c: number, maxR: number) {\r\n result.root = 0;\r\n result.found = false;\r\n const determinant = b * b - 4.0 * a * c;\r\n if (determinant < 0) {\r\n return result;\r\n }\r\n\r\n const sqrtD = Math.sqrt(determinant);\r\n let r1 = (-b - sqrtD) / (2.0 * a);\r\n let r2 = (-b + sqrtD) / (2.0 * a);\r\n\r\n if (r1 > r2) {\r\n const temp = r2;\r\n r2 = r1;\r\n r1 = temp;\r\n }\r\n\r\n if (r1 > 0 && r1 < maxR) {\r\n result.root = r1;\r\n result.found = true;\r\n return result;\r\n }\r\n\r\n if (r2 > 0 && r2 < maxR) {\r\n result.root = r2;\r\n result.found = true;\r\n return result;\r\n }\r\n\r\n return result;\r\n };\r\n})();\r\n\r\n/** @hidden */\r\nexport class Collider {\r\n // Implementation of the \"Improved Collision detection and Response\" algorithm proposed by Kasper Fauerby\r\n // https://www.peroxide.dk/papers/collision/collision.pdf\r\n\r\n /** Define if a collision was found */\r\n public collisionFound: boolean;\r\n\r\n /**\r\n * Define last intersection point in local space\r\n */\r\n public intersectionPoint: Vector3;\r\n\r\n /**\r\n * Define last collided mesh\r\n */\r\n public collidedMesh: Nullable<AbstractMesh>;\r\n\r\n /**\r\n * If true, it check for double sided faces and only returns 1 collision instead of 2\r\n */\r\n public static DoubleSidedCheck = false;\r\n\r\n private _collisionPoint = Vector3.Zero();\r\n private _planeIntersectionPoint = Vector3.Zero();\r\n private _tempVector = Vector3.Zero();\r\n private _tempVector2 = Vector3.Zero();\r\n private _tempVector3 = Vector3.Zero();\r\n private _tempVector4 = Vector3.Zero();\r\n private _edge = Vector3.Zero();\r\n private _baseToVertex = Vector3.Zero();\r\n private _destinationPoint = Vector3.Zero();\r\n private _slidePlaneNormal = Vector3.Zero();\r\n private _displacementVector = Vector3.Zero();\r\n\r\n /** @hidden */\r\n public _radius = Vector3.One();\r\n /** @hidden */\r\n public _retry = 0;\r\n private _velocity: Vector3;\r\n private _basePoint: Vector3;\r\n private _epsilon: number;\r\n /** @hidden */\r\n public _velocityWorldLength: number;\r\n /** @hidden */\r\n public _basePointWorld = Vector3.Zero();\r\n private _velocityWorld = Vector3.Zero();\r\n private _normalizedVelocity = Vector3.Zero();\r\n /** @hidden */\r\n public _initialVelocity: Vector3;\r\n /** @hidden */\r\n public _initialPosition: Vector3;\r\n private _nearestDistance: number;\r\n\r\n private _collisionMask = -1;\r\n private _velocitySquaredLength: number;\r\n private _nearestDistanceSquared: number;\r\n\r\n public get collisionMask(): number {\r\n return this._collisionMask;\r\n }\r\n\r\n public set collisionMask(mask: number) {\r\n this._collisionMask = !isNaN(mask) ? mask : -1;\r\n }\r\n\r\n /**\r\n * Gets the plane normal used to compute the sliding response (in local space)\r\n */\r\n public get slidePlaneNormal(): Vector3 {\r\n return this._slidePlaneNormal;\r\n }\r\n\r\n // Methods\r\n /**\r\n * @param source\r\n * @param dir\r\n * @param e\r\n * @hidden\r\n */\r\n public _initialize(source: Vector3, dir: Vector3, e: number): void {\r\n this._velocity = dir;\r\n this._velocitySquaredLength = this._velocity.lengthSquared();\r\n const len = Math.sqrt(this._velocitySquaredLength);\r\n if (len === 0 || len === 1.0) {\r\n this._normalizedVelocity.copyFromFloats(dir._x, dir._y, dir._z);\r\n } else {\r\n dir.scaleToRef(1.0 / len, this._normalizedVelocity);\r\n }\r\n this._basePoint = source;\r\n\r\n source.multiplyToRef(this._radius, this._basePointWorld);\r\n dir.multiplyToRef(this._radius, this._velocityWorld);\r\n\r\n this._velocityWorldLength = this._velocityWorld.length();\r\n\r\n this._epsilon = e;\r\n this.collisionFound = false;\r\n }\r\n\r\n /**\r\n * @param point\r\n * @param pa\r\n * @param pb\r\n * @param pc\r\n * @param n\r\n * @hidden\r\n */\r\n public _checkPointInTriangle(point: Vector3, pa: Vector3, pb: Vector3, pc: Vector3, n: Vector3): boolean {\r\n pa.subtractToRef(point, this._tempVector);\r\n pb.subtractToRef(point, this._tempVector2);\r\n\r\n Vector3.CrossToRef(this._tempVector, this._tempVector2, this._tempVector4);\r\n let d = Vector3.Dot(this._tempVector4, n);\r\n if (d < 0) {\r\n return false;\r\n }\r\n\r\n pc.subtractToRef(point, this._tempVector3);\r\n Vector3.CrossToRef(this._tempVector2, this._tempVector3, this._tempVector4);\r\n d = Vector3.Dot(this._tempVector4, n);\r\n if (d < 0) {\r\n return false;\r\n }\r\n\r\n Vector3.CrossToRef(this._tempVector3, this._tempVector, this._tempVector4);\r\n d = Vector3.Dot(this._tempVector4, n);\r\n return d >= 0;\r\n }\r\n\r\n /**\r\n * @param sphereCenter\r\n * @param sphereRadius\r\n * @param vecMin\r\n * @param vecMax\r\n * @hidden\r\n */\r\n public _canDoCollision(sphereCenter: Vector3, sphereRadius: number, vecMin: Vector3, vecMax: Vector3): boolean {\r\n const distance = Vector3.Distance(this._basePointWorld, sphereCenter);\r\n\r\n const max = Math.max(this._radius.x, this._radius.y, this._radius.z);\r\n\r\n if (distance > this._velocityWorldLength + max + sphereRadius) {\r\n return false;\r\n }\r\n\r\n if (!intersectBoxAASphere(vecMin, vecMax, this._basePointWorld, this._velocityWorldLength + max)) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @param faceIndex\r\n * @param trianglePlaneArray\r\n * @param p1\r\n * @param p2\r\n * @param p3\r\n * @param hasMaterial\r\n * @param hostMesh\r\n * @hidden\r\n */\r\n public _testTriangle(faceIndex: number, trianglePlaneArray: Array<Plane>, p1: Vector3, p2: Vector3, p3: Vector3, hasMaterial: boolean, hostMesh: AbstractMesh): void {\r\n let t0;\r\n let embeddedInPlane = false;\r\n\r\n //defensive programming, actually not needed.\r\n if (!trianglePlaneArray) {\r\n trianglePlaneArray = [];\r\n }\r\n\r\n if (!trianglePlaneArray[faceIndex]) {\r\n trianglePlaneArray[faceIndex] = new Plane(0, 0, 0, 0);\r\n trianglePlaneArray[faceIndex].copyFromPoints(p1, p2, p3);\r\n }\r\n\r\n const trianglePlane = trianglePlaneArray[faceIndex];\r\n\r\n if (!hasMaterial && !trianglePlane.isFrontFacingTo(this._normalizedVelocity, 0)) {\r\n return;\r\n }\r\n\r\n const signedDistToTrianglePlane = trianglePlane.signedDistanceTo(this._basePoint);\r\n const normalDotVelocity = Vector3.Dot(trianglePlane.normal, this._velocity);\r\n\r\n // if DoubleSidedCheck is false(default), a double sided face will be consided 2 times.\r\n // if true, it discard the faces having normal not facing velocity\r\n if (Collider.DoubleSidedCheck && normalDotVelocity > 0.0001) {\r\n return;\r\n }\r\n\r\n if (normalDotVelocity == 0) {\r\n if (Math.abs(signedDistToTrianglePlane) >= 1.0) {\r\n return;\r\n }\r\n embeddedInPlane = true;\r\n t0 = 0;\r\n } else {\r\n t0 = (-1.0 - signedDistToTrianglePlane) / normalDotVelocity;\r\n let t1 = (1.0 - signedDistToTrianglePlane) / normalDotVelocity;\r\n\r\n if (t0 > t1) {\r\n const temp = t1;\r\n t1 = t0;\r\n t0 = temp;\r\n }\r\n\r\n if (t0 > 1.0 || t1 < 0.0) {\r\n return;\r\n }\r\n\r\n if (t0 < 0) {\r\n t0 = 0;\r\n }\r\n if (t0 > 1.0) {\r\n t0 = 1.0;\r\n }\r\n }\r\n\r\n this._collisionPoint.copyFromFloats(0, 0, 0);\r\n\r\n let found = false;\r\n let t = 1.0;\r\n\r\n if (!embeddedInPlane) {\r\n this._basePoint.subtractToRef(trianglePlane.normal, this._planeIntersectionPoint);\r\n this._velocity.scaleToRef(t0, this._tempVector);\r\n this._planeIntersectionPoint.addInPlace(this._tempVector);\r\n\r\n if (this._checkPointInTriangle(this._planeIntersectionPoint, p1, p2, p3, trianglePlane.normal)) {\r\n found = true;\r\n t = t0;\r\n this._collisionPoint.copyFrom(this._planeIntersectionPoint);\r\n }\r\n }\r\n\r\n if (!found) {\r\n let a = this._velocitySquaredLength;\r\n\r\n this._basePoint.subtractToRef(p1, this._tempVector);\r\n let b = 2.0 * Vector3.Dot(this._velocity, this._tempVector);\r\n let c = this._tempVector.lengthSquared() - 1.0;\r\n\r\n let lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._collisionPoint.copyFrom(p1);\r\n }\r\n\r\n this._basePoint.subtractToRef(p2, this._tempVector);\r\n b = 2.0 * Vector3.Dot(this._velocity, this._tempVector);\r\n c = this._tempVector.lengthSquared() - 1.0;\r\n\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._collisionPoint.copyFrom(p2);\r\n }\r\n\r\n this._basePoint.subtractToRef(p3, this._tempVector);\r\n b = 2.0 * Vector3.Dot(this._velocity, this._tempVector);\r\n c = this._tempVector.lengthSquared() - 1.0;\r\n\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._collisionPoint.copyFrom(p3);\r\n }\r\n\r\n p2.subtractToRef(p1, this._edge);\r\n p1.subtractToRef(this._basePoint, this._baseToVertex);\r\n let edgeSquaredLength = this._edge.lengthSquared();\r\n let edgeDotVelocity = Vector3.Dot(this._edge, this._velocity);\r\n let edgeDotBaseToVertex = Vector3.Dot(this._edge, this._baseToVertex);\r\n\r\n a = edgeSquaredLength * -this._velocitySquaredLength + edgeDotVelocity * edgeDotVelocity;\r\n b = 2 * (edgeSquaredLength * Vector3.Dot(this._velocity, this._baseToVertex) - edgeDotVelocity * edgeDotBaseToVertex);\r\n c = edgeSquaredLength * (1.0 - this._baseToVertex.lengthSquared()) + edgeDotBaseToVertex * edgeDotBaseToVertex;\r\n\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n const f = (edgeDotVelocity * lowestRoot.root - edgeDotBaseToVertex) / edgeSquaredLength;\r\n\r\n if (f >= 0.0 && f <= 1.0) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._edge.scaleInPlace(f);\r\n p1.addToRef(this._edge, this._collisionPoint);\r\n }\r\n }\r\n\r\n p3.subtractToRef(p2, this._edge);\r\n p2.subtractToRef(this._basePoint, this._baseToVertex);\r\n edgeSquaredLength = this._edge.lengthSquared();\r\n edgeDotVelocity = Vector3.Dot(this._edge, this._velocity);\r\n edgeDotBaseToVertex = Vector3.Dot(this._edge, this._baseToVertex);\r\n\r\n a = edgeSquaredLength * -this._velocitySquaredLength + edgeDotVelocity * edgeDotVelocity;\r\n b = 2 * (edgeSquaredLength * Vector3.Dot(this._velocity, this._baseToVertex) - edgeDotVelocity * edgeDotBaseToVertex);\r\n c = edgeSquaredLength * (1.0 - this._baseToVertex.lengthSquared()) + edgeDotBaseToVertex * edgeDotBaseToVertex;\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n const f = (edgeDotVelocity * lowestRoot.root - edgeDotBaseToVertex) / edgeSquaredLength;\r\n\r\n if (f >= 0.0 && f <= 1.0) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._edge.scaleInPlace(f);\r\n p2.addToRef(this._edge, this._collisionPoint);\r\n }\r\n }\r\n\r\n p1.subtractToRef(p3, this._edge);\r\n p3.subtractToRef(this._basePoint, this._baseToVertex);\r\n edgeSquaredLength = this._edge.lengthSquared();\r\n edgeDotVelocity = Vector3.Dot(this._edge, this._velocity);\r\n edgeDotBaseToVertex = Vector3.Dot(this._edge, this._baseToVertex);\r\n\r\n a = edgeSquaredLength * -this._velocitySquaredLength + edgeDotVelocity * edgeDotVelocity;\r\n b = 2 * (edgeSquaredLength * Vector3.Dot(this._velocity, this._baseToVertex) - edgeDotVelocity * edgeDotBaseToVertex);\r\n c = edgeSquaredLength * (1.0 - this._baseToVertex.lengthSquared()) + edgeDotBaseToVertex * edgeDotBaseToVertex;\r\n\r\n lowestRoot = getLowestRoot(a, b, c, t);\r\n if (lowestRoot.found) {\r\n const f = (edgeDotVelocity * lowestRoot.root - edgeDotBaseToVertex) / edgeSquaredLength;\r\n\r\n if (f >= 0.0 && f <= 1.0) {\r\n t = lowestRoot.root;\r\n found = true;\r\n this._edge.scaleInPlace(f);\r\n p3.addToRef(this._edge, this._collisionPoint);\r\n }\r\n }\r\n }\r\n\r\n if (found) {\r\n const distToCollisionSquared = t * t * this._velocitySquaredLength;\r\n\r\n if (!this.collisionFound || distToCollisionSquared < this._nearestDistanceSquared) {\r\n // if collisionResponse is false, collision is not found but the collidedMesh is set anyway.\r\n // onCollide observable are triggered if collideMesh is set\r\n // this allow trigger volumes to be created.\r\n if (hostMesh.collisionResponse) {\r\n if (!this.intersectionPoint) {\r\n this.intersectionPoint = this._collisionPoint.clone();\r\n } else {\r\n this.intersectionPoint.copyFrom(this._collisionPoint);\r\n }\r\n this._nearestDistanceSquared = distToCollisionSquared;\r\n this._nearestDistance = Math.sqrt(distToCollisionSquared);\r\n this.collisionFound = true;\r\n }\r\n this.collidedMesh = hostMesh;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param trianglePlaneArray\r\n * @param pts\r\n * @param indices\r\n * @param indexStart\r\n * @param indexEnd\r\n * @param decal\r\n * @param hasMaterial\r\n * @param hostMesh\r\n * @param invertTriangles\r\n * @param triangleStrip\r\n * @hidden\r\n */\r\n public _collide(\r\n trianglePlaneArray: Array<Plane>,\r\n pts: Vector3[],\r\n indices: IndicesArray,\r\n indexStart: number,\r\n indexEnd: number,\r\n decal: number,\r\n hasMaterial: boolean,\r\n hostMesh: AbstractMesh,\r\n invertTriangles?: boolean,\r\n triangleStrip: boolean = false\r\n ): void {\r\n if (triangleStrip) {\r\n if (!indices || indices.length === 0) {\r\n for (let i = 0; i < pts.length - 2; i += 1) {\r\n const p1 = pts[i];\r\n const p2 = pts[i + 1];\r\n const p3 = pts[i + 2];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p1 || !p2 || !p3) {\r\n continue;\r\n }\r\n // Handles strip faces one on two is reversed\r\n if ((invertTriangles ? 1 : 0) ^ i % 2) {\r\n this._testTriangle(i, trianglePlaneArray, p1, p2, p3, hasMaterial, hostMesh);\r\n } else {\r\n this._testTriangle(i, trianglePlaneArray, p2, p1, p3, hasMaterial, hostMesh);\r\n }\r\n }\r\n } else {\r\n for (let i = indexStart; i < indexEnd - 2; i += 1) {\r\n const indexA = indices[i];\r\n const indexB = indices[i + 1];\r\n const indexC = indices[i + 2];\r\n\r\n if (indexC === 0xffffffff) {\r\n i += 2;\r\n continue;\r\n }\r\n\r\n const p1 = pts[indexA];\r\n const p2 = pts[indexB];\r\n const p3 = pts[indexC];\r\n\r\n // stay defensive and don't check against undefined positions.\r\n if (!p1 || !p2 || !p3) {\r\n continue;\r\n }\r\n\r\n // Handles strip faces one on two is reversed\r\n if ((invertTriangles ? 1 : 0) ^ i % 2) {\r\n this._testTriangle(i, trianglePlaneArray, p1, p2, p3, hasMaterial, hostMesh);\r\n } else {\r\n this._testTriangle(i, trianglePlaneArray, p2, p1, p3, hasMaterial, hostMesh);\r\n }\r\n }\r\n }\r\n } else if (!indices || indices.length === 0) {\r\n for (let i = 0; i < pts.length; i += 3) {\r\n const p1 = pts[i];\r\n const p2 = pts[i + 1];\r\n const p3 = pts[i + 2];\r\n\r\n if (invertTriangles) {\r\n this._testTriangle(i, trianglePlaneArray, p1, p2, p3, hasMaterial, hostMesh);\r\n } else {\r\n this._testTriangle(i, trianglePlaneArray, p3, p2, p1, hasMaterial, hostMesh);\r\n }\r\n }\r\n } else {\r\n for (let i = indexStart; i < indexEnd; i += 3) {\r\n const p1 = pts[indices[i] - decal];\r\n const p2 = pts[indices[i + 1] - decal];\r\n const p3 = pts[indices[i + 2] - decal];\r\n\r\n if (invertTriangles) {\r\n this._testTriangle(i, trianglePlaneArray, p1, p2, p3, hasMaterial, hostMesh);\r\n } else {\r\n this._testTriangle(i, trianglePlaneArray, p3, p2, p1, hasMaterial, hostMesh);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param pos\r\n * @param vel\r\n * @hidden\r\n */\r\n public _getResponse(pos: Vector3, vel: Vector3): void {\r\n pos.addToRef(vel, this._destinationPoint);\r\n vel.scaleInPlace(this._nearestDistance / vel.length());\r\n\r\n this._basePoint.addToRef(vel, pos);\r\n pos.subtractToRef(this.intersectionPoint, this._slidePlaneNormal);\r\n this._slidePlaneNormal.normalize();\r\n this._slidePlaneNormal.scaleToRef(this._epsilon, this._displacementVector);\r\n\r\n pos.addInPlace(this._displacementVector);\r\n this.intersectionPoint.addInPlace(this._displacementVector);\r\n\r\n this._slidePlaneNormal.scaleInPlace(Plane.SignedDistanceToPlaneFromPositionAndNormal(this.intersectionPoint, this._slidePlaneNormal, this._destinationPoint));\r\n this._destinationPoint.subtractInPlace(this._slidePlaneNormal);\r\n\r\n this._destinationPoint.subtractToRef(this.intersectionPoint, vel);\r\n }\r\n}\r\n"]}
@@ -3,9 +3,9 @@ import type { Nullable } from "../../types";
3
3
  declare module "../../Engines/thinEngine" {
4
4
  interface ThinEngine {
5
5
  /** @hidden */
6
- _readTexturePixels(texture: InternalTexture, width: number, height: number, faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean): Promise<ArrayBufferView>;
6
+ _readTexturePixels(texture: InternalTexture, width: number, height: number, faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean, x?: number, y?: number): Promise<ArrayBufferView>;
7
7
  /** @hidden */
8
- _readTexturePixelsSync(texture: InternalTexture, width: number, height: number, faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean): ArrayBufferView;
8
+ _readTexturePixelsSync(texture: InternalTexture, width: number, height: number, faceIndex?: number, level?: number, buffer?: Nullable<ArrayBufferView>, flushRenderer?: boolean, noDataConversion?: boolean, x?: number, y?: number): ArrayBufferView;
9
9
  }
10
10
  }
11
11
  /**
@@ -76,13 +76,15 @@ export function allocateAndCopyTypedBuffer(type, sizeOrDstBuffer, sizeInBytes, c
76
76
  }
77
77
  return buffer;
78
78
  }
79
- ThinEngine.prototype._readTexturePixelsSync = function (texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion) {
79
+ ThinEngine.prototype._readTexturePixelsSync = function (texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y) {
80
80
  var _a, _b;
81
81
  if (faceIndex === void 0) { faceIndex = -1; }
82
82
  if (level === void 0) { level = 0; }
83
83
  if (buffer === void 0) { buffer = null; }
84
84
  if (flushRenderer === void 0) { flushRenderer = true; }
85
85
  if (noDataConversion === void 0) { noDataConversion = false; }
86
+ if (x === void 0) { x = 0; }
87
+ if (y === void 0) { y = 0; }
86
88
  var gl = this._gl;
87
89
  if (!gl) {
88
90
  throw new Error("Engine does not have gl rendering context.");
@@ -124,16 +126,18 @@ ThinEngine.prototype._readTexturePixelsSync = function (texture, width, height,
124
126
  if (flushRenderer) {
125
127
  this.flushFramebuffer();
126
128
  }
127
- gl.readPixels(0, 0, width, height, gl.RGBA, readType, buffer);
129
+ gl.readPixels(x, y, width, height, gl.RGBA, readType, buffer);
128
130
  gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer);
129
131
  return buffer;
130
132
  };
131
- ThinEngine.prototype._readTexturePixels = function (texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion) {
133
+ ThinEngine.prototype._readTexturePixels = function (texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y) {
132
134
  if (faceIndex === void 0) { faceIndex = -1; }
133
135
  if (level === void 0) { level = 0; }
134
136
  if (buffer === void 0) { buffer = null; }
135
137
  if (flushRenderer === void 0) { flushRenderer = true; }
136
138
  if (noDataConversion === void 0) { noDataConversion = false; }
137
- return Promise.resolve(this._readTexturePixelsSync(texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion));
139
+ if (x === void 0) { x = 0; }
140
+ if (y === void 0) { y = 0; }
141
+ return Promise.resolve(this._readTexturePixelsSync(texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y));
138
142
  };
139
143
  //# sourceMappingURL=engine.readTexture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"engine.readTexture.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Engines/Extensions/engine.readTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /** @hidden */\r\n _readTexturePixels(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable<ArrayBufferView>,\r\n flushRenderer?: boolean,\r\n noDataConversion?: boolean\r\n ): Promise<ArrayBufferView>;\r\n\r\n /** @hidden */\r\n _readTexturePixelsSync(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable<ArrayBufferView>,\r\n flushRenderer?: boolean,\r\n noDataConversion?: boolean\r\n ): ArrayBufferView;\r\n }\r\n}\r\n\r\n/**\r\n * Allocate a typed array depending on a texture type. Optionally can copy existing data in the buffer.\r\n * @param type type of the texture\r\n * @param sizeOrDstBuffer size of the array OR an existing buffer that will be used as the destination of the copy (if copyBuffer is provided)\r\n * @param sizeInBytes true if the size of the array is given in bytes, false if it is the number of elements of the array\r\n * @param copyBuffer if provided, buffer to copy into the destination buffer (either a newly allocated buffer if sizeOrDstBuffer is a number or use sizeOrDstBuffer as the destination buffer otherwise)\r\n * @returns the allocated buffer or sizeOrDstBuffer if the latter is an ArrayBuffer\r\n */\r\nexport function allocateAndCopyTypedBuffer(type: number, sizeOrDstBuffer: number | ArrayBuffer, sizeInBytes = false, copyBuffer?: ArrayBuffer): ArrayBufferView {\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int8Array(sizeOrDstBuffer) : new Int8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int8Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint8Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_SHORT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int16Array(sizeOrDstBuffer) : new Int16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int16Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n case Constants.TEXTURETYPE_HALF_FLOAT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint16Array(sizeOrDstBuffer) : new Uint16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint16Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_INT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int32Array(sizeOrDstBuffer) : new Int32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_24_8:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n case Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint32Array(sizeOrDstBuffer) : new Uint32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_FLOAT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Float32Array(sizeOrDstBuffer) : new Float32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Float32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n }\r\n\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint8Array(copyBuffer));\r\n }\r\n return buffer;\r\n}\r\n\r\nThinEngine.prototype._readTexturePixelsSync = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n flushRenderer = true,\r\n noDataConversion = false\r\n): ArrayBufferView {\r\n const gl = this._gl;\r\n if (!gl) {\r\n throw new Error(\"Engine does not have gl rendering context.\");\r\n }\r\n if (!this._dummyFramebuffer) {\r\n const dummy = gl.createFramebuffer();\r\n\r\n if (!dummy) {\r\n throw new Error(\"Unable to create dummy framebuffer\");\r\n }\r\n\r\n this._dummyFramebuffer = dummy;\r\n }\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFramebuffer);\r\n\r\n if (faceIndex > -1) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, texture._hardwareTexture?.underlyingResource, level);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._hardwareTexture?.underlyingResource, level);\r\n }\r\n\r\n let readType = texture.type !== undefined ? this._getWebGLTextureType(texture.type) : gl.UNSIGNED_BYTE;\r\n\r\n if (!noDataConversion) {\r\n switch (readType) {\r\n case gl.UNSIGNED_BYTE:\r\n if (!buffer) {\r\n buffer = new Uint8Array(4 * width * height);\r\n }\r\n readType = gl.UNSIGNED_BYTE;\r\n break;\r\n default:\r\n if (!buffer) {\r\n buffer = new Float32Array(4 * width * height);\r\n }\r\n readType = gl.FLOAT;\r\n break;\r\n }\r\n } else if (!buffer) {\r\n buffer = allocateAndCopyTypedBuffer(texture.type, 4 * width * height);\r\n }\r\n\r\n if (flushRenderer) {\r\n this.flushFramebuffer();\r\n }\r\n\r\n gl.readPixels(0, 0, width, height, gl.RGBA, readType, <DataView>buffer);\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer);\r\n\r\n return buffer;\r\n};\r\n\r\nThinEngine.prototype._readTexturePixels = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n flushRenderer = true,\r\n noDataConversion = false\r\n): Promise<ArrayBufferView> {\r\n return Promise.resolve(this._readTexturePixelsSync(texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion));\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.readTexture.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Engines/Extensions/engine.readTexture.ts"],"names":[],"mappings":"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","sourcesContent":["import { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../constants\";\r\n\r\ndeclare module \"../../Engines/thinEngine\" {\r\n export interface ThinEngine {\r\n /** @hidden */\r\n _readTexturePixels(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable<ArrayBufferView>,\r\n flushRenderer?: boolean,\r\n noDataConversion?: boolean,\r\n x?: number,\r\n y?: number\r\n ): Promise<ArrayBufferView>;\r\n\r\n /** @hidden */\r\n _readTexturePixelsSync(\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex?: number,\r\n level?: number,\r\n buffer?: Nullable<ArrayBufferView>,\r\n flushRenderer?: boolean,\r\n noDataConversion?: boolean,\r\n x?: number,\r\n y?: number\r\n ): ArrayBufferView;\r\n }\r\n}\r\n\r\n/**\r\n * Allocate a typed array depending on a texture type. Optionally can copy existing data in the buffer.\r\n * @param type type of the texture\r\n * @param sizeOrDstBuffer size of the array OR an existing buffer that will be used as the destination of the copy (if copyBuffer is provided)\r\n * @param sizeInBytes true if the size of the array is given in bytes, false if it is the number of elements of the array\r\n * @param copyBuffer if provided, buffer to copy into the destination buffer (either a newly allocated buffer if sizeOrDstBuffer is a number or use sizeOrDstBuffer as the destination buffer otherwise)\r\n * @returns the allocated buffer or sizeOrDstBuffer if the latter is an ArrayBuffer\r\n */\r\nexport function allocateAndCopyTypedBuffer(type: number, sizeOrDstBuffer: number | ArrayBuffer, sizeInBytes = false, copyBuffer?: ArrayBuffer): ArrayBufferView {\r\n switch (type) {\r\n case Constants.TEXTURETYPE_BYTE: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int8Array(sizeOrDstBuffer) : new Int8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int8Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_BYTE: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint8Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_SHORT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int16Array(sizeOrDstBuffer) : new Int16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int16Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_4_4_4_4:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_5_5_1:\r\n case Constants.TEXTURETYPE_UNSIGNED_SHORT_5_6_5:\r\n case Constants.TEXTURETYPE_HALF_FLOAT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint16Array(sizeOrDstBuffer) : new Uint16Array(sizeInBytes ? sizeOrDstBuffer / 2 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint16Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_INT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Int32Array(sizeOrDstBuffer) : new Int32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Int32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_UNSIGNED_INTEGER:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_2_10_10_10_REV:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_24_8:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_10F_11F_11F_REV:\r\n case Constants.TEXTURETYPE_UNSIGNED_INT_5_9_9_9_REV:\r\n case Constants.TEXTURETYPE_FLOAT_32_UNSIGNED_INT_24_8_REV: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint32Array(sizeOrDstBuffer) : new Uint32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n case Constants.TEXTURETYPE_FLOAT: {\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Float32Array(sizeOrDstBuffer) : new Float32Array(sizeInBytes ? sizeOrDstBuffer / 4 : sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Float32Array(copyBuffer));\r\n }\r\n return buffer;\r\n }\r\n }\r\n\r\n const buffer = sizeOrDstBuffer instanceof ArrayBuffer ? new Uint8Array(sizeOrDstBuffer) : new Uint8Array(sizeOrDstBuffer);\r\n if (copyBuffer) {\r\n buffer.set(new Uint8Array(copyBuffer));\r\n }\r\n return buffer;\r\n}\r\n\r\nThinEngine.prototype._readTexturePixelsSync = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0\r\n): ArrayBufferView {\r\n const gl = this._gl;\r\n if (!gl) {\r\n throw new Error(\"Engine does not have gl rendering context.\");\r\n }\r\n if (!this._dummyFramebuffer) {\r\n const dummy = gl.createFramebuffer();\r\n\r\n if (!dummy) {\r\n throw new Error(\"Unable to create dummy framebuffer\");\r\n }\r\n\r\n this._dummyFramebuffer = dummy;\r\n }\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._dummyFramebuffer);\r\n\r\n if (faceIndex > -1) {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex, texture._hardwareTexture?.underlyingResource, level);\r\n } else {\r\n gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture._hardwareTexture?.underlyingResource, level);\r\n }\r\n\r\n let readType = texture.type !== undefined ? this._getWebGLTextureType(texture.type) : gl.UNSIGNED_BYTE;\r\n\r\n if (!noDataConversion) {\r\n switch (readType) {\r\n case gl.UNSIGNED_BYTE:\r\n if (!buffer) {\r\n buffer = new Uint8Array(4 * width * height);\r\n }\r\n readType = gl.UNSIGNED_BYTE;\r\n break;\r\n default:\r\n if (!buffer) {\r\n buffer = new Float32Array(4 * width * height);\r\n }\r\n readType = gl.FLOAT;\r\n break;\r\n }\r\n } else if (!buffer) {\r\n buffer = allocateAndCopyTypedBuffer(texture.type, 4 * width * height);\r\n }\r\n\r\n if (flushRenderer) {\r\n this.flushFramebuffer();\r\n }\r\n\r\n gl.readPixels(x, y, width, height, gl.RGBA, readType, <DataView>buffer);\r\n gl.bindFramebuffer(gl.FRAMEBUFFER, this._currentFramebuffer);\r\n\r\n return buffer;\r\n};\r\n\r\nThinEngine.prototype._readTexturePixels = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0\r\n): Promise<ArrayBufferView> {\r\n return Promise.resolve(this._readTexturePixelsSync(texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y));\r\n};\r\n"]}
@@ -1,15 +1,17 @@
1
1
  import { WebGPUEngine } from "../../webgpuEngine.js";
2
- WebGPUEngine.prototype._readTexturePixels = function (texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion) {
2
+ WebGPUEngine.prototype._readTexturePixels = function (texture, width, height, faceIndex, level, buffer, flushRenderer, noDataConversion, x, y) {
3
3
  if (faceIndex === void 0) { faceIndex = -1; }
4
4
  if (level === void 0) { level = 0; }
5
5
  if (buffer === void 0) { buffer = null; }
6
6
  if (flushRenderer === void 0) { flushRenderer = true; }
7
7
  if (noDataConversion === void 0) { noDataConversion = false; }
8
+ if (x === void 0) { x = 0; }
9
+ if (y === void 0) { y = 0; }
8
10
  var gpuTextureWrapper = texture._hardwareTexture;
9
11
  if (flushRenderer) {
10
12
  this.flushFramebuffer();
11
13
  }
12
- return this._textureHelper.readPixels(gpuTextureWrapper.underlyingResource, 0, 0, width, height, gpuTextureWrapper.format, faceIndex, level, buffer, noDataConversion);
14
+ return this._textureHelper.readPixels(gpuTextureWrapper.underlyingResource, x, y, width, height, gpuTextureWrapper.format, faceIndex, level, buffer, noDataConversion);
13
15
  };
14
16
  WebGPUEngine.prototype._readTexturePixelsSync = function () {
15
17
  throw "_readTexturePixelsSync is unsupported in WebGPU!";
@@ -1 +1 @@
1
- {"version":3,"file":"engine.readTexture.js","sourceRoot":"","sources":["../../../../../../../lts/core/generated/Engines/WebGPU/Extensions/engine.readTexture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,CAAC,SAAS,CAAC,kBAAkB,GAAG,UACxC,OAAwB,EACxB,KAAa,EACb,MAAc,EACd,SAAc,EACd,KAAS,EACT,MAAwC,EACxC,aAAoB,EACpB,gBAAwB;IAJxB,0BAAA,EAAA,aAAa,CAAC;IACd,sBAAA,EAAA,SAAS;IACT,uBAAA,EAAA,aAAwC;IACxC,8BAAA,EAAA,oBAAoB;IACpB,iCAAA,EAAA,wBAAwB;IAExB,IAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAyC,CAAC;IAE5E,IAAI,aAAa,EAAE;QACf,IAAI,CAAC,gBAAgB,EAAE,CAAC;KAC3B;IAED,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,iBAAiB,CAAC,kBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAC5K,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,sBAAsB,GAAG;IAC5C,MAAM,kDAAkD,CAAC;AAC7D,CAAC,CAAC","sourcesContent":["import type { InternalTexture } from \"../../../Materials/Textures/internalTexture\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport type { WebGPUHardwareTexture } from \"../webgpuHardwareTexture\";\r\n\r\nWebGPUEngine.prototype._readTexturePixels = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n flushRenderer = true,\r\n noDataConversion = false\r\n): Promise<ArrayBufferView> {\r\n const gpuTextureWrapper = texture._hardwareTexture as WebGPUHardwareTexture;\r\n\r\n if (flushRenderer) {\r\n this.flushFramebuffer();\r\n }\r\n\r\n return this._textureHelper.readPixels(gpuTextureWrapper.underlyingResource!, 0, 0, width, height, gpuTextureWrapper.format, faceIndex, level, buffer, noDataConversion);\r\n};\r\n\r\nWebGPUEngine.prototype._readTexturePixelsSync = function (): ArrayBufferView {\r\n throw \"_readTexturePixelsSync is unsupported in WebGPU!\";\r\n};\r\n"]}
1
+ {"version":3,"file":"engine.readTexture.js","sourceRoot":"","sources":["../../../../../../../lts/core/generated/Engines/WebGPU/Extensions/engine.readTexture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,YAAY,CAAC,SAAS,CAAC,kBAAkB,GAAG,UACxC,OAAwB,EACxB,KAAa,EACb,MAAc,EACd,SAAc,EACd,KAAS,EACT,MAAwC,EACxC,aAAoB,EACpB,gBAAwB,EACxB,CAAK,EACL,CAAK;IANL,0BAAA,EAAA,aAAa,CAAC;IACd,sBAAA,EAAA,SAAS;IACT,uBAAA,EAAA,aAAwC;IACxC,8BAAA,EAAA,oBAAoB;IACpB,iCAAA,EAAA,wBAAwB;IACxB,kBAAA,EAAA,KAAK;IACL,kBAAA,EAAA,KAAK;IAEL,IAAM,iBAAiB,GAAG,OAAO,CAAC,gBAAyC,CAAC;IAE5E,IAAI,aAAa,EAAE;QACf,IAAI,CAAC,gBAAgB,EAAE,CAAC;KAC3B;IAED,OAAO,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,iBAAiB,CAAC,kBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAC5K,CAAC,CAAC;AAEF,YAAY,CAAC,SAAS,CAAC,sBAAsB,GAAG;IAC5C,MAAM,kDAAkD,CAAC;AAC7D,CAAC,CAAC","sourcesContent":["import type { InternalTexture } from \"../../../Materials/Textures/internalTexture\";\r\nimport type { Nullable } from \"../../../types\";\r\nimport { WebGPUEngine } from \"../../webgpuEngine\";\r\nimport type { WebGPUHardwareTexture } from \"../webgpuHardwareTexture\";\r\n\r\nWebGPUEngine.prototype._readTexturePixels = function (\r\n texture: InternalTexture,\r\n width: number,\r\n height: number,\r\n faceIndex = -1,\r\n level = 0,\r\n buffer: Nullable<ArrayBufferView> = null,\r\n flushRenderer = true,\r\n noDataConversion = false,\r\n x = 0,\r\n y = 0\r\n): Promise<ArrayBufferView> {\r\n const gpuTextureWrapper = texture._hardwareTexture as WebGPUHardwareTexture;\r\n\r\n if (flushRenderer) {\r\n this.flushFramebuffer();\r\n }\r\n\r\n return this._textureHelper.readPixels(gpuTextureWrapper.underlyingResource!, x, y, width, height, gpuTextureWrapper.format, faceIndex, level, buffer, noDataConversion);\r\n};\r\n\r\nWebGPUEngine.prototype._readTexturePixelsSync = function (): ArrayBufferView {\r\n throw \"_readTexturePixelsSync is unsupported in WebGPU!\";\r\n};\r\n"]}
@@ -27,6 +27,7 @@ export declare class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {
27
27
  protected _varyingsWGSL: string[];
28
28
  protected _varyingsDeclWGSL: string[];
29
29
  protected _varyingNamesWGSL: string[];
30
+ protected _stridedUniformArrays: string[];
30
31
  shaderLanguage: ShaderLanguage;
31
32
  uniformRegexp: RegExp;
32
33
  textureRegexp: RegExp;
@@ -56,4 +57,5 @@ export declare class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {
56
57
  protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string;
57
58
  private _processSamplers;
58
59
  private _processCustomBuffers;
60
+ private _processStridedUniformArrays;
59
61
  }
@@ -88,9 +88,10 @@ var WebGPUShaderProcessorWGSL = /** @class */ (function (_super) {
88
88
  this._varyingsWGSL = [];
89
89
  this._varyingsDeclWGSL = [];
90
90
  this._varyingNamesWGSL = [];
91
+ this._stridedUniformArrays = [];
91
92
  };
92
93
  WebGPUShaderProcessorWGSL.prototype.preProcessShaderCode = function (code) {
93
- return ("struct ".concat(WebGPUShaderProcessor.InternalsUBOName, " {\nyFactor__: f32;\ntextureOutputHeight__: f32;\n};\nvar<uniform> ").concat(internalsVarName, " : ").concat(WebGPUShaderProcessor.InternalsUBOName, ";\n") +
94
+ return ("struct ".concat(WebGPUShaderProcessor.InternalsUBOName, " {\nyFactor__: f32,\ntextureOutputHeight__: f32,\n};\nvar<uniform> ").concat(internalsVarName, " : ").concat(WebGPUShaderProcessor.InternalsUBOName, ";\n") +
94
95
  RemoveComments(code));
95
96
  };
96
97
  WebGPUShaderProcessorWGSL.prototype.varyingProcessor = function (varying, isFragment, preProcessors) {
@@ -109,7 +110,7 @@ var WebGPUShaderProcessorWGSL = /** @class */ (function (_super) {
109
110
  else {
110
111
  location_1 = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name_1, varyingType, preProcessors)[2]);
111
112
  this._webgpuProcessingContext.availableVaryings[name_1] = location_1;
112
- this._varyingsWGSL.push("@location(".concat(location_1, ") ").concat(name_1, " : ").concat(varyingType, ";"));
113
+ this._varyingsWGSL.push("@location(".concat(location_1, ") ").concat(name_1, " : ").concat(varyingType, ","));
113
114
  this._varyingsDeclWGSL.push("var<private> ".concat(name_1, " : ").concat(varyingType, ";"));
114
115
  this._varyingNamesWGSL.push(name_1);
115
116
  }
@@ -126,7 +127,7 @@ var WebGPUShaderProcessorWGSL = /** @class */ (function (_super) {
126
127
  var location_2 = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name_2, attributeType, preProcessors)[2]);
127
128
  this._webgpuProcessingContext.availableAttributes[name_2] = location_2;
128
129
  this._webgpuProcessingContext.orderedAttributes[location_2] = name_2;
129
- this._attributesWGSL.push("@location(".concat(location_2, ") ").concat(name_2, " : ").concat(attributeType, ";"));
130
+ this._attributesWGSL.push("@location(".concat(location_2, ") ").concat(name_2, " : ").concat(attributeType, ","));
130
131
  this._attributesDeclWGSL.push("var<private> ".concat(name_2, " : ").concat(attributeType, ";"));
131
132
  this._attributeNamesWGSL.push(name_2);
132
133
  attribute = "";
@@ -213,15 +214,16 @@ var WebGPUShaderProcessorWGSL = /** @class */ (function (_super) {
213
214
  fragmentCode = leftOverUBO + fragmentCode;
214
215
  // Vertex code
215
216
  vertexCode = vertexCode.replace(/#define /g, "//#define ");
217
+ vertexCode = this._processStridedUniformArrays(vertexCode);
216
218
  var varyingsDecl = this._varyingsDeclWGSL.join("\n") + "\n";
217
219
  var vertexBuiltinDecl = "var<private> ".concat(builtInName_vertex_index, " : u32;\nvar<private> ").concat(builtInName_instance_index, " : u32;\nvar<private> ").concat(builtInName_position, " : vec4<f32>;\n");
218
220
  var vertexAttributesDecl = this._attributesDeclWGSL.join("\n") + "\n";
219
- var vertexInputs = "struct VertexInputs {\n @builtin(vertex_index) vertexIndex : u32;\n @builtin(instance_index) instanceIndex : u32;\n";
221
+ var vertexInputs = "struct VertexInputs {\n @builtin(vertex_index) vertexIndex : u32,\n @builtin(instance_index) instanceIndex : u32,\n";
220
222
  if (this._attributesWGSL.length > 0) {
221
223
  vertexInputs += this._attributesWGSL.join("\n");
222
224
  }
223
225
  vertexInputs += "\n};\n";
224
- var vertexFragmentInputs = "struct FragmentInputs {\n @builtin(position) position : vec4<f32>;\n";
226
+ var vertexFragmentInputs = "struct FragmentInputs {\n @builtin(position) position : vec4<f32>,\n";
225
227
  if (this._varyingsWGSL.length > 0) {
226
228
  vertexFragmentInputs += this._varyingsWGSL.join("\n");
227
229
  }
@@ -241,14 +243,15 @@ var WebGPUShaderProcessorWGSL = /** @class */ (function (_super) {
241
243
  vertexCode = this._injectStartingAndEndingCode(vertexCode, "fn main", vertexStartingCode, vertexEndingCode);
242
244
  // fragment code
243
245
  fragmentCode = fragmentCode.replace(/#define /g, "//#define ");
246
+ fragmentCode = this._processStridedUniformArrays(fragmentCode);
244
247
  fragmentCode = fragmentCode.replace(/dpdy/g, "(-internals.yFactor__)*dpdy"); // will also handle dpdyCoarse and dpdyFine
245
248
  var fragmentBuiltinDecl = "var<private> ".concat(builtInName_position_frag, " : vec4<f32>;\nvar<private> ").concat(builtInName_front_facing, " : bool;\nvar<private> ").concat(builtInName_FragColor, " : vec4<f32>;\nvar<private> ").concat(builtInName_frag_depth, " : f32;\n");
246
- var fragmentFragmentInputs = "struct FragmentInputs {\n @builtin(position) position : vec4<f32>;\n @builtin(front_facing) frontFacing : bool;\n";
249
+ var fragmentFragmentInputs = "struct FragmentInputs {\n @builtin(position) position : vec4<f32>,\n @builtin(front_facing) frontFacing : bool,\n";
247
250
  if (this._varyingsWGSL.length > 0) {
248
251
  fragmentFragmentInputs += this._varyingsWGSL.join("\n");
249
252
  }
250
253
  fragmentFragmentInputs += "\n};\n";
251
- var fragmentOutputs = "struct FragmentOutputs {\n @location(0) color : vec4<f32>;\n";
254
+ var fragmentOutputs = "struct FragmentOutputs {\n @location(0) color : vec4<f32>,\n";
252
255
  var hasFragDepth = false;
253
256
  var idx = 0;
254
257
  while (!hasFragDepth) {
@@ -288,6 +291,7 @@ var WebGPUShaderProcessorWGSL = /** @class */ (function (_super) {
288
291
  return { vertexCode: vertexCode, fragmentCode: fragmentCode };
289
292
  };
290
293
  WebGPUShaderProcessorWGSL.prototype._generateLeftOverUBOCode = function (name, uniformBufferDescription) {
294
+ var stridedArrays = "";
291
295
  var ubo = "struct ".concat(name, " {\n");
292
296
  for (var _i = 0, _a = this._webgpuProcessingContext.leftOverUniforms; _i < _a.length; _i++) {
293
297
  var leftOverUniform = _a[_i];
@@ -295,17 +299,21 @@ var WebGPUShaderProcessorWGSL = /** @class */ (function (_super) {
295
299
  var size = WebGPUShaderProcessor.UniformSizes[type];
296
300
  if (leftOverUniform.length > 0) {
297
301
  if (size <= 2) {
298
- ubo += " @align(16) ".concat(leftOverUniform.name, " : @stride(16) array<").concat(leftOverUniform.type, ", ").concat(leftOverUniform.length, ">;\n");
302
+ var stridedArrayType = "".concat(name, "_").concat(this._stridedUniformArrays.length, "_strided_arr");
303
+ stridedArrays += "struct ".concat(stridedArrayType, " {\n @size(16)\n el: ").concat(type, ",\n }");
304
+ this._stridedUniformArrays.push(leftOverUniform.name);
305
+ ubo += " @align(16) ".concat(leftOverUniform.name, " : array<").concat(stridedArrayType, ", ").concat(leftOverUniform.length, ">,\n");
299
306
  }
300
307
  else {
301
- ubo += " ".concat(leftOverUniform.name, " : array<").concat(leftOverUniform.type, ", ").concat(leftOverUniform.length, ">;\n");
308
+ ubo += " ".concat(leftOverUniform.name, " : array<").concat(leftOverUniform.type, ", ").concat(leftOverUniform.length, ">,\n");
302
309
  }
303
310
  }
304
311
  else {
305
- ubo += " ".concat(leftOverUniform.name, " : ").concat(leftOverUniform.type, ";\n");
312
+ ubo += " ".concat(leftOverUniform.name, " : ").concat(leftOverUniform.type, ",\n");
306
313
  }
307
314
  }
308
315
  ubo += "};\n";
316
+ ubo = "".concat(stridedArrays, "\n").concat(ubo);
309
317
  ubo += "@group(".concat(uniformBufferDescription.binding.groupIndex, ") @binding(").concat(uniformBufferDescription.binding.bindingIndex, ") var<uniform> ").concat(leftOverVarName, " : ").concat(name, ";\n");
310
318
  return ubo;
311
319
  };
@@ -390,6 +398,13 @@ var WebGPUShaderProcessorWGSL = /** @class */ (function (_super) {
390
398
  }
391
399
  return code;
392
400
  };
401
+ WebGPUShaderProcessorWGSL.prototype._processStridedUniformArrays = function (code) {
402
+ for (var _i = 0, _a = this._stridedUniformArrays; _i < _a.length; _i++) {
403
+ var uniformArrayName = _a[_i];
404
+ code = code.replace(new RegExp("".concat(uniformArrayName, "\\s*\\[(.*)\\]"), "g"), "".concat(uniformArrayName, "[$1].el"));
405
+ }
406
+ return code;
407
+ };
393
408
  return WebGPUShaderProcessorWGSL;
394
409
  }(WebGPUShaderProcessor));
395
410
  export { WebGPUShaderProcessorWGSL };