@babylonjs/core 5.0.0 → 5.0.1

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.
@@ -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"]}
@@ -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 };
@@ -1 +1 @@
1
- {"version":3,"file":"webgpuShaderProcessorsWGSL.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Engines/WebGPU/webgpuShaderProcessorsWGSL.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\nimport type { WebGPUBufferDescription } from \"./webgpuShaderProcessingContext\";\r\nimport { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor\";\r\nimport { RemoveComments } from \"../../Misc/codeStringParsingTools\";\r\n\r\nimport \"../../ShadersWGSL/ShadersInclude/bonesDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bonesVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimation\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/instancesDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/instancesVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/meshUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobal\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobalDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/sceneUboDeclaration\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\nconst builtInName_vertex_index = \"gl_VertexID\";\r\nconst builtInName_instance_index = \"gl_InstanceID\";\r\nconst builtInName_position = \"gl_Position\";\r\n\r\nconst builtInName_position_frag = \"gl_FragCoord\";\r\nconst builtInName_front_facing = \"gl_FrontFacing\";\r\nconst builtInName_frag_depth = \"gl_FragDepth\";\r\nconst builtInName_FragColor = \"gl_FragColor\";\r\n\r\nconst leftOverVarName = \"uniforms\";\r\nconst internalsVarName = \"internals\";\r\n\r\nconst gpuTextureViewDimensionByWebGPUTextureFunction: { [key: string]: Nullable<GPUTextureViewDimension> } = {\r\n texture_1d: WebGPUConstants.TextureViewDimension.E1d,\r\n texture_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_3d: WebGPUConstants.TextureViewDimension.E3d,\r\n texture_cube: WebGPUConstants.TextureViewDimension.Cube,\r\n texture_cube_array: WebGPUConstants.TextureViewDimension.CubeArray,\r\n texture_multisampled_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_depth_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_depth_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_depth_cube: WebGPUConstants.TextureViewDimension.Cube,\r\n texture_depth_cube_array: WebGPUConstants.TextureViewDimension.CubeArray,\r\n texture_depth_multisampled_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_storage_1d: WebGPUConstants.TextureViewDimension.E1d,\r\n texture_storage_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_storage_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_storage_3d: WebGPUConstants.TextureViewDimension.E3d,\r\n texture_external: null,\r\n};\r\n\r\n/** @hidden */\r\nexport class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {\r\n protected _attributesWGSL: string[];\r\n protected _attributesDeclWGSL: string[];\r\n protected _attributeNamesWGSL: string[];\r\n protected _varyingsWGSL: string[];\r\n protected _varyingsDeclWGSL: string[];\r\n protected _varyingNamesWGSL: string[];\r\n\r\n public shaderLanguage = ShaderLanguage.WGSL;\r\n public uniformRegexp = /uniform\\s+(\\w+)\\s*:\\s*(.+)\\s*;/;\r\n public textureRegexp = /var\\s+(\\w+)\\s*:\\s*((array<\\s*)?(texture_\\w+)\\s*(<\\s*(.+)\\s*>)?\\s*(,\\s*\\w+\\s*>\\s*)?);/;\r\n public noPrecision = true;\r\n\r\n protected _getArraySize(name: string, uniformType: string, preProcessors: { [key: string]: string }): [string, string, number] {\r\n let length = 0;\r\n\r\n const endArray = uniformType.lastIndexOf(\">\");\r\n if (uniformType.indexOf(\"array\") >= 0 && endArray > 0) {\r\n let startArray = endArray;\r\n while (startArray > 0 && uniformType.charAt(startArray) !== \" \" && uniformType.charAt(startArray) !== \",\") {\r\n startArray--;\r\n }\r\n const lengthInString = uniformType.substring(startArray + 1, endArray);\r\n length = +lengthInString;\r\n if (isNaN(length)) {\r\n length = +preProcessors[lengthInString.trim()];\r\n }\r\n while (startArray > 0 && (uniformType.charAt(startArray) === \" \" || uniformType.charAt(startArray) === \",\")) {\r\n startArray--;\r\n }\r\n uniformType = uniformType.substring(uniformType.indexOf(\"<\") + 1, startArray + 1);\r\n }\r\n\r\n return [name, uniformType, length];\r\n }\r\n\r\n public initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void {\r\n this._webgpuProcessingContext = processingContext as WebGPUShaderProcessingContext;\r\n\r\n this._attributesWGSL = [];\r\n this._attributesDeclWGSL = [];\r\n this._attributeNamesWGSL = [];\r\n this._varyingsWGSL = [];\r\n this._varyingsDeclWGSL = [];\r\n this._varyingNamesWGSL = [];\r\n }\r\n\r\n public preProcessShaderCode(code: string): string {\r\n return (\r\n `struct ${WebGPUShaderProcessor.InternalsUBOName} {\\nyFactor__: f32;\\ntextureOutputHeight__: f32;\\n};\\nvar<uniform> ${internalsVarName} : ${WebGPUShaderProcessor.InternalsUBOName};\\n` +\r\n RemoveComments(code)\r\n );\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean, preProcessors: { [key: string]: string }) {\r\n const varyingRegex = /\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s*:\\s*(.+)\\s*;/gm;\r\n const match = varyingRegex.exec(varying);\r\n if (match !== null) {\r\n const varyingType = match[2];\r\n const name = match[1];\r\n let location: number;\r\n if (isFragment) {\r\n location = this._webgpuProcessingContext.availableVaryings[name];\r\n if (location === undefined) {\r\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\r\n }\r\n } else {\r\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\r\n this._webgpuProcessingContext.availableVaryings[name] = location;\r\n this._varyingsWGSL.push(`@location(${location}) ${name} : ${varyingType};`);\r\n this._varyingsDeclWGSL.push(`var<private> ${name} : ${varyingType};`);\r\n this._varyingNamesWGSL.push(name);\r\n }\r\n\r\n varying = \"\";\r\n }\r\n return varying;\r\n }\r\n\r\n public attributeProcessor(attribute: string, preProcessors: { [key: string]: string }) {\r\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s*:\\s*(.+)\\s*;/gm;\r\n const match = attribRegex.exec(attribute);\r\n if (match !== null) {\r\n const attributeType = match[2];\r\n const name = match[1];\r\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\r\n\r\n this._webgpuProcessingContext.availableAttributes[name] = location;\r\n this._webgpuProcessingContext.orderedAttributes[location] = name;\r\n\r\n this._attributesWGSL.push(`@location(${location}) ${name} : ${attributeType};`);\r\n this._attributesDeclWGSL.push(`var<private> ${name} : ${attributeType};`);\r\n this._attributeNamesWGSL.push(name);\r\n attribute = \"\";\r\n }\r\n return attribute;\r\n }\r\n\r\n public uniformProcessor(uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n const match = this.uniformRegexp.exec(uniform);\r\n if (match !== null) {\r\n const uniformType = match[2];\r\n const name = match[1];\r\n\r\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\r\n\r\n uniform = \"\";\r\n }\r\n return uniform;\r\n }\r\n\r\n public textureProcessor(texture: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n const match = this.textureRegexp.exec(texture);\r\n if (match !== null) {\r\n const name = match[1]; // name of the variable\r\n const type = match[2]; // texture_2d<f32> or array<texture_2d_array<f32>, 5> for eg\r\n const isArrayOfTexture = !!match[3];\r\n const textureFunc = match[4]; // texture_2d, texture_depth_2d, etc\r\n const isStorageTexture = textureFunc.indexOf(\"storage\") > 0;\r\n const componentType = match[6]; // f32 or i32 or u32 or undefined\r\n const storageTextureFormat = isStorageTexture ? (componentType.substring(0, componentType.indexOf(\",\")).trim() as GPUTextureFormat) : null;\r\n\r\n let arraySize = isArrayOfTexture ? this._getArraySize(name, type, preProcessors)[2] : 0;\r\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\r\n if (!textureInfo) {\r\n textureInfo = {\r\n isTextureArray: arraySize > 0,\r\n isStorageTexture,\r\n textures: [],\r\n sampleType: WebGPUConstants.TextureSampleType.Float,\r\n };\r\n arraySize = arraySize || 1;\r\n for (let i = 0; i < arraySize; ++i) {\r\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\r\n }\r\n } else {\r\n arraySize = textureInfo.textures.length;\r\n }\r\n\r\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\r\n\r\n const isDepthTexture = textureFunc.indexOf(\"depth\") > 0;\r\n const textureDimension = gpuTextureViewDimensionByWebGPUTextureFunction[textureFunc];\r\n const sampleType = isDepthTexture\r\n ? WebGPUConstants.TextureSampleType.Depth\r\n : componentType === \"u32\"\r\n ? WebGPUConstants.TextureSampleType.Uint\r\n : componentType === \"i32\"\r\n ? WebGPUConstants.TextureSampleType.Sint\r\n : WebGPUConstants.TextureSampleType.Float;\r\n\r\n textureInfo.sampleType = sampleType;\r\n\r\n if (textureDimension === undefined) {\r\n throw `Can't get the texture dimension corresponding to the texture function \"${textureFunc}\"!`;\r\n }\r\n\r\n for (let i = 0; i < arraySize; ++i) {\r\n const { groupIndex, bindingIndex } = textureInfo.textures[i];\r\n\r\n if (i === 0) {\r\n texture = `@group(${groupIndex}) @binding(${bindingIndex}) ${texture}`;\r\n }\r\n\r\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, storageTextureFormat, !isFragment);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n public postProcessor(code: string) {\r\n return code;\r\n }\r\n\r\n public finalizeShaders(vertexCode: string, fragmentCode: string): { vertexCode: string; fragmentCode: string } {\r\n const fragCoordCode =\r\n fragmentCode.indexOf(\"gl_FragCoord\") >= 0\r\n ? `\r\n if (internals.yFactor__ == 1.) {\r\n gl_FragCoord.y = internals.textureOutputHeight__ - gl_FragCoord.y;\r\n }\r\n `\r\n : \"\";\r\n\r\n // Add the group/binding info to the sampler declaration (var xxx: sampler|sampler_comparison)\r\n vertexCode = this._processSamplers(vertexCode, true);\r\n fragmentCode = this._processSamplers(fragmentCode, false);\r\n\r\n // Add the group/binding info to the uniform/storage buffer declarations (var<uniform> XXX:YYY or var<storage(,read_write|read)> XXX:YYY)\r\n vertexCode = this._processCustomBuffers(vertexCode, true);\r\n fragmentCode = this._processCustomBuffers(fragmentCode, false);\r\n\r\n // Builds the leftover UBOs.\r\n const leftOverUBO = this._buildLeftOverUBO();\r\n\r\n vertexCode = leftOverUBO + vertexCode;\r\n fragmentCode = leftOverUBO + fragmentCode;\r\n\r\n // Vertex code\r\n vertexCode = vertexCode.replace(/#define /g, \"//#define \");\r\n\r\n const varyingsDecl = this._varyingsDeclWGSL.join(\"\\n\") + \"\\n\";\r\n\r\n const vertexBuiltinDecl = `var<private> ${builtInName_vertex_index} : u32;\\nvar<private> ${builtInName_instance_index} : u32;\\nvar<private> ${builtInName_position} : vec4<f32>;\\n`;\r\n\r\n const vertexAttributesDecl = this._attributesDeclWGSL.join(\"\\n\") + \"\\n\";\r\n\r\n let vertexInputs = \"struct VertexInputs {\\n @builtin(vertex_index) vertexIndex : u32;\\n @builtin(instance_index) instanceIndex : u32;\\n\";\r\n if (this._attributesWGSL.length > 0) {\r\n vertexInputs += this._attributesWGSL.join(\"\\n\");\r\n }\r\n vertexInputs += \"\\n};\\n\";\r\n\r\n let vertexFragmentInputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>;\\n\";\r\n if (this._varyingsWGSL.length > 0) {\r\n vertexFragmentInputs += this._varyingsWGSL.join(\"\\n\");\r\n }\r\n vertexFragmentInputs += \"\\n};\\n\";\r\n\r\n vertexCode = vertexBuiltinDecl + vertexInputs + vertexAttributesDecl + vertexFragmentInputs + varyingsDecl + vertexCode;\r\n\r\n let vertexStartingCode = ` var output : FragmentInputs;\\n ${builtInName_vertex_index} = input.vertexIndex;\\n ${builtInName_instance_index} = input.instanceIndex;\\n`;\r\n\r\n for (let i = 0; i < this._attributeNamesWGSL.length; ++i) {\r\n const name = this._attributeNamesWGSL[i];\r\n vertexStartingCode += ` ${name} = input.${name};\\n`;\r\n }\r\n\r\n let vertexEndingCode = ` output.position = ${builtInName_position};\\n output.position.y = output.position.y * internals.yFactor__;\\n`;\r\n\r\n for (let i = 0; i < this._varyingNamesWGSL.length; ++i) {\r\n const name = this._varyingNamesWGSL[i];\r\n vertexEndingCode += ` output.${name} = ${name};\\n`;\r\n }\r\n\r\n vertexEndingCode += \" return output;\";\r\n\r\n vertexCode = this._injectStartingAndEndingCode(vertexCode, \"fn main\", vertexStartingCode, vertexEndingCode);\r\n\r\n // fragment code\r\n fragmentCode = fragmentCode.replace(/#define /g, \"//#define \");\r\n fragmentCode = fragmentCode.replace(/dpdy/g, \"(-internals.yFactor__)*dpdy\"); // will also handle dpdyCoarse and dpdyFine\r\n\r\n const fragmentBuiltinDecl = `var<private> ${builtInName_position_frag} : vec4<f32>;\\nvar<private> ${builtInName_front_facing} : bool;\\nvar<private> ${builtInName_FragColor} : vec4<f32>;\\nvar<private> ${builtInName_frag_depth} : f32;\\n`;\r\n\r\n let fragmentFragmentInputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>;\\n @builtin(front_facing) frontFacing : bool;\\n\";\r\n if (this._varyingsWGSL.length > 0) {\r\n fragmentFragmentInputs += this._varyingsWGSL.join(\"\\n\");\r\n }\r\n fragmentFragmentInputs += \"\\n};\\n\";\r\n\r\n let fragmentOutputs = \"struct FragmentOutputs {\\n @location(0) color : vec4<f32>;\\n\";\r\n\r\n let hasFragDepth = false;\r\n let idx = 0;\r\n while (!hasFragDepth) {\r\n idx = fragmentCode.indexOf(builtInName_frag_depth, idx);\r\n if (idx < 0) {\r\n break;\r\n }\r\n const saveIndex = idx;\r\n hasFragDepth = true;\r\n while (idx > 1 && fragmentCode.charAt(idx) !== \"\\n\") {\r\n if (fragmentCode.charAt(idx) === \"/\" && fragmentCode.charAt(idx - 1) === \"/\") {\r\n hasFragDepth = false;\r\n break;\r\n }\r\n idx--;\r\n }\r\n idx = saveIndex + builtInName_frag_depth.length;\r\n }\r\n\r\n if (hasFragDepth) {\r\n fragmentOutputs += \" @builtin(frag_depth) fragDepth: f32;\\n\";\r\n }\r\n\r\n fragmentOutputs += \"};\\n\";\r\n\r\n fragmentCode = fragmentBuiltinDecl + fragmentFragmentInputs + varyingsDecl + fragmentOutputs + fragmentCode;\r\n\r\n let fragmentStartingCode =\r\n ` var output : FragmentOutputs;\\n ${builtInName_position_frag} = input.position;\\n ${builtInName_front_facing} = input.frontFacing;\\n` + fragCoordCode;\r\n\r\n for (let i = 0; i < this._varyingNamesWGSL.length; ++i) {\r\n const name = this._varyingNamesWGSL[i];\r\n fragmentStartingCode += ` ${name} = input.${name};\\n`;\r\n }\r\n\r\n let fragmentEndingCode = ` output.color = ${builtInName_FragColor};\\n`;\r\n\r\n if (hasFragDepth) {\r\n fragmentEndingCode += ` output.fragDepth = ${builtInName_frag_depth};\\n`;\r\n }\r\n\r\n fragmentEndingCode += \" return output;\";\r\n\r\n fragmentCode = this._injectStartingAndEndingCode(fragmentCode, \"fn main\", fragmentStartingCode, fragmentEndingCode);\r\n\r\n this._collectBindingNames();\r\n this._preCreateBindGroupEntries();\r\n\r\n return { vertexCode, fragmentCode };\r\n }\r\n\r\n protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string {\r\n let ubo = `struct ${name} {\\n`;\r\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\r\n const type = leftOverUniform.type.replace(/^(.*?)(<.*>)?$/, \"$1\");\r\n const size = WebGPUShaderProcessor.UniformSizes[type];\r\n\r\n if (leftOverUniform.length > 0) {\r\n if (size <= 2) {\r\n ubo += ` @align(16) ${leftOverUniform.name} : @stride(16) array<${leftOverUniform.type}, ${leftOverUniform.length}>;\\n`;\r\n } else {\r\n ubo += ` ${leftOverUniform.name} : array<${leftOverUniform.type}, ${leftOverUniform.length}>;\\n`;\r\n }\r\n } else {\r\n ubo += ` ${leftOverUniform.name} : ${leftOverUniform.type};\\n`;\r\n }\r\n }\r\n ubo += \"};\\n\";\r\n\r\n ubo += `@group(${uniformBufferDescription.binding.groupIndex}) @binding(${uniformBufferDescription.binding.bindingIndex}) var<uniform> ${leftOverVarName} : ${name};\\n`;\r\n\r\n return ubo;\r\n }\r\n\r\n private _processSamplers(code: string, isVertex: boolean): string {\r\n const samplerRegexp = /var\\s+(\\w+Sampler)\\s*:\\s*(sampler|sampler_comparison)\\s*;/gm;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const match = samplerRegexp.exec(code);\r\n if (match === null) {\r\n break;\r\n }\r\n\r\n const name = match[1]; // name of the variable\r\n const samplerType = match[2]; // sampler or sampler_comparison\r\n const textureName =\r\n name.indexOf(WebGPUShaderProcessor.AutoSamplerSuffix) === name.length - WebGPUShaderProcessor.AutoSamplerSuffix.length\r\n ? name.substring(0, name.indexOf(WebGPUShaderProcessor.AutoSamplerSuffix))\r\n : null;\r\n const samplerBindingType = samplerType === \"sampler_comparison\" ? WebGPUConstants.SamplerBindingType.Comparison : WebGPUConstants.SamplerBindingType.Filtering;\r\n\r\n if (textureName) {\r\n const textureInfo = this._webgpuProcessingContext.availableTextures[textureName];\r\n if (textureInfo) {\r\n textureInfo.autoBindSampler = true;\r\n }\r\n }\r\n\r\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[name];\r\n if (!samplerInfo) {\r\n samplerInfo = {\r\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\r\n type: samplerBindingType,\r\n };\r\n this._webgpuProcessingContext.availableSamplers[name] = samplerInfo;\r\n }\r\n\r\n this._addSamplerBindingDescription(name, samplerInfo, isVertex);\r\n\r\n const part1 = code.substring(0, match.index);\r\n const insertPart = `@group(${samplerInfo.binding.groupIndex}) @binding(${samplerInfo.binding.bindingIndex}) `;\r\n const part2 = code.substring(match.index);\r\n\r\n code = part1 + insertPart + part2;\r\n\r\n samplerRegexp.lastIndex += insertPart.length;\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _processCustomBuffers(code: string, isVertex: boolean): string {\r\n const instantiateBufferRegexp = /var<\\s*(uniform|storage)\\s*(,\\s*(read|read_write)\\s*)?>\\s+(\\S+)\\s*:\\s*(\\S+)\\s*;/gm;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const match = instantiateBufferRegexp.exec(code);\r\n if (match === null) {\r\n break;\r\n }\r\n\r\n const type = match[1];\r\n const decoration = match[3];\r\n let name = match[4];\r\n const structName = match[5];\r\n\r\n let bufferInfo = this._webgpuProcessingContext.availableBuffers[name];\r\n if (!bufferInfo) {\r\n const knownUBO = type === \"uniform\" ? WebGPUShaderProcessingContext.KnownUBOs[structName] : null;\r\n\r\n let binding;\r\n if (knownUBO) {\r\n name = structName;\r\n binding = knownUBO.binding;\r\n if (binding.groupIndex === -1) {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n } else {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n\r\n bufferInfo = { binding };\r\n this._webgpuProcessingContext.availableBuffers[name] = bufferInfo;\r\n }\r\n\r\n this._addBufferBindingDescription(\r\n name,\r\n this._webgpuProcessingContext.availableBuffers[name],\r\n decoration === \"read_write\"\r\n ? WebGPUConstants.BufferBindingType.Storage\r\n : type === \"storage\"\r\n ? WebGPUConstants.BufferBindingType.ReadOnlyStorage\r\n : WebGPUConstants.BufferBindingType.Uniform,\r\n isVertex\r\n );\r\n\r\n const groupIndex = bufferInfo.binding.groupIndex;\r\n const bindingIndex = bufferInfo.binding.bindingIndex;\r\n\r\n const part1 = code.substring(0, match.index);\r\n const insertPart = `@group(${groupIndex}) @binding(${bindingIndex}) `;\r\n const part2 = code.substring(match.index);\r\n\r\n code = part1 + insertPart + part2;\r\n\r\n instantiateBufferRegexp.lastIndex += insertPart.length;\r\n }\r\n\r\n return code;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webgpuShaderProcessorsWGSL.js","sourceRoot":"","sources":["../../../../../../lts/core/generated/Engines/WebGPU/webgpuShaderProcessorsWGSL.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\r\nimport type { Nullable } from \"../../types\";\r\nimport type { ShaderProcessingContext } from \"../Processors/shaderProcessingOptions\";\r\nimport type { WebGPUBufferDescription } from \"./webgpuShaderProcessingContext\";\r\nimport { WebGPUShaderProcessingContext } from \"./webgpuShaderProcessingContext\";\r\nimport * as WebGPUConstants from \"./webgpuConstants\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { WebGPUShaderProcessor } from \"./webgpuShaderProcessor\";\r\nimport { RemoveComments } from \"../../Misc/codeStringParsingTools\";\r\n\r\nimport \"../../ShadersWGSL/ShadersInclude/bonesDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bonesVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimationDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/bakedVertexAnimation\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneFragment\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneFragmentDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/clipPlaneVertexDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/instancesDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/instancesVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/meshUboDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertex\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobal\";\r\nimport \"../../ShadersWGSL/ShadersInclude/morphTargetsVertexGlobalDeclaration\";\r\nimport \"../../ShadersWGSL/ShadersInclude/sceneUboDeclaration\";\r\nimport { ShaderLanguage } from \"../../Materials/shaderLanguage\";\r\n\r\nconst builtInName_vertex_index = \"gl_VertexID\";\r\nconst builtInName_instance_index = \"gl_InstanceID\";\r\nconst builtInName_position = \"gl_Position\";\r\n\r\nconst builtInName_position_frag = \"gl_FragCoord\";\r\nconst builtInName_front_facing = \"gl_FrontFacing\";\r\nconst builtInName_frag_depth = \"gl_FragDepth\";\r\nconst builtInName_FragColor = \"gl_FragColor\";\r\n\r\nconst leftOverVarName = \"uniforms\";\r\nconst internalsVarName = \"internals\";\r\n\r\nconst gpuTextureViewDimensionByWebGPUTextureFunction: { [key: string]: Nullable<GPUTextureViewDimension> } = {\r\n texture_1d: WebGPUConstants.TextureViewDimension.E1d,\r\n texture_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_3d: WebGPUConstants.TextureViewDimension.E3d,\r\n texture_cube: WebGPUConstants.TextureViewDimension.Cube,\r\n texture_cube_array: WebGPUConstants.TextureViewDimension.CubeArray,\r\n texture_multisampled_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_depth_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_depth_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_depth_cube: WebGPUConstants.TextureViewDimension.Cube,\r\n texture_depth_cube_array: WebGPUConstants.TextureViewDimension.CubeArray,\r\n texture_depth_multisampled_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_storage_1d: WebGPUConstants.TextureViewDimension.E1d,\r\n texture_storage_2d: WebGPUConstants.TextureViewDimension.E2d,\r\n texture_storage_2d_array: WebGPUConstants.TextureViewDimension.E2dArray,\r\n texture_storage_3d: WebGPUConstants.TextureViewDimension.E3d,\r\n texture_external: null,\r\n};\r\n\r\n/** @hidden */\r\nexport class WebGPUShaderProcessorWGSL extends WebGPUShaderProcessor {\r\n protected _attributesWGSL: string[];\r\n protected _attributesDeclWGSL: string[];\r\n protected _attributeNamesWGSL: string[];\r\n protected _varyingsWGSL: string[];\r\n protected _varyingsDeclWGSL: string[];\r\n protected _varyingNamesWGSL: string[];\r\n protected _stridedUniformArrays: string[];\r\n\r\n public shaderLanguage = ShaderLanguage.WGSL;\r\n public uniformRegexp = /uniform\\s+(\\w+)\\s*:\\s*(.+)\\s*;/;\r\n public textureRegexp = /var\\s+(\\w+)\\s*:\\s*((array<\\s*)?(texture_\\w+)\\s*(<\\s*(.+)\\s*>)?\\s*(,\\s*\\w+\\s*>\\s*)?);/;\r\n public noPrecision = true;\r\n\r\n protected _getArraySize(name: string, uniformType: string, preProcessors: { [key: string]: string }): [string, string, number] {\r\n let length = 0;\r\n\r\n const endArray = uniformType.lastIndexOf(\">\");\r\n if (uniformType.indexOf(\"array\") >= 0 && endArray > 0) {\r\n let startArray = endArray;\r\n while (startArray > 0 && uniformType.charAt(startArray) !== \" \" && uniformType.charAt(startArray) !== \",\") {\r\n startArray--;\r\n }\r\n const lengthInString = uniformType.substring(startArray + 1, endArray);\r\n length = +lengthInString;\r\n if (isNaN(length)) {\r\n length = +preProcessors[lengthInString.trim()];\r\n }\r\n while (startArray > 0 && (uniformType.charAt(startArray) === \" \" || uniformType.charAt(startArray) === \",\")) {\r\n startArray--;\r\n }\r\n uniformType = uniformType.substring(uniformType.indexOf(\"<\") + 1, startArray + 1);\r\n }\r\n\r\n return [name, uniformType, length];\r\n }\r\n\r\n public initializeShaders(processingContext: Nullable<ShaderProcessingContext>): void {\r\n this._webgpuProcessingContext = processingContext as WebGPUShaderProcessingContext;\r\n\r\n this._attributesWGSL = [];\r\n this._attributesDeclWGSL = [];\r\n this._attributeNamesWGSL = [];\r\n this._varyingsWGSL = [];\r\n this._varyingsDeclWGSL = [];\r\n this._varyingNamesWGSL = [];\r\n this._stridedUniformArrays = [];\r\n }\r\n\r\n public preProcessShaderCode(code: string): string {\r\n return (\r\n `struct ${WebGPUShaderProcessor.InternalsUBOName} {\\nyFactor__: f32,\\ntextureOutputHeight__: f32,\\n};\\nvar<uniform> ${internalsVarName} : ${WebGPUShaderProcessor.InternalsUBOName};\\n` +\r\n RemoveComments(code)\r\n );\r\n }\r\n\r\n public varyingProcessor(varying: string, isFragment: boolean, preProcessors: { [key: string]: string }) {\r\n const varyingRegex = /\\s*varying\\s+(?:(?:highp)?|(?:lowp)?)\\s*(\\S+)\\s*:\\s*(.+)\\s*;/gm;\r\n const match = varyingRegex.exec(varying);\r\n if (match !== null) {\r\n const varyingType = match[2];\r\n const name = match[1];\r\n let location: number;\r\n if (isFragment) {\r\n location = this._webgpuProcessingContext.availableVaryings[name];\r\n if (location === undefined) {\r\n Logger.Warn(`Invalid fragment shader: The varying named \"${name}\" is not declared in the vertex shader! This declaration will be ignored.`);\r\n }\r\n } else {\r\n location = this._webgpuProcessingContext.getVaryingNextLocation(varyingType, this._getArraySize(name, varyingType, preProcessors)[2]);\r\n this._webgpuProcessingContext.availableVaryings[name] = location;\r\n this._varyingsWGSL.push(`@location(${location}) ${name} : ${varyingType},`);\r\n this._varyingsDeclWGSL.push(`var<private> ${name} : ${varyingType};`);\r\n this._varyingNamesWGSL.push(name);\r\n }\r\n\r\n varying = \"\";\r\n }\r\n return varying;\r\n }\r\n\r\n public attributeProcessor(attribute: string, preProcessors: { [key: string]: string }) {\r\n const attribRegex = /\\s*attribute\\s+(\\S+)\\s*:\\s*(.+)\\s*;/gm;\r\n const match = attribRegex.exec(attribute);\r\n if (match !== null) {\r\n const attributeType = match[2];\r\n const name = match[1];\r\n const location = this._webgpuProcessingContext.getAttributeNextLocation(attributeType, this._getArraySize(name, attributeType, preProcessors)[2]);\r\n\r\n this._webgpuProcessingContext.availableAttributes[name] = location;\r\n this._webgpuProcessingContext.orderedAttributes[location] = name;\r\n\r\n this._attributesWGSL.push(`@location(${location}) ${name} : ${attributeType},`);\r\n this._attributesDeclWGSL.push(`var<private> ${name} : ${attributeType};`);\r\n this._attributeNamesWGSL.push(name);\r\n attribute = \"\";\r\n }\r\n return attribute;\r\n }\r\n\r\n public uniformProcessor(uniform: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n const match = this.uniformRegexp.exec(uniform);\r\n if (match !== null) {\r\n const uniformType = match[2];\r\n const name = match[1];\r\n\r\n this._addUniformToLeftOverUBO(name, uniformType, preProcessors);\r\n\r\n uniform = \"\";\r\n }\r\n return uniform;\r\n }\r\n\r\n public textureProcessor(texture: string, isFragment: boolean, preProcessors: { [key: string]: string }): string {\r\n const match = this.textureRegexp.exec(texture);\r\n if (match !== null) {\r\n const name = match[1]; // name of the variable\r\n const type = match[2]; // texture_2d<f32> or array<texture_2d_array<f32>, 5> for eg\r\n const isArrayOfTexture = !!match[3];\r\n const textureFunc = match[4]; // texture_2d, texture_depth_2d, etc\r\n const isStorageTexture = textureFunc.indexOf(\"storage\") > 0;\r\n const componentType = match[6]; // f32 or i32 or u32 or undefined\r\n const storageTextureFormat = isStorageTexture ? (componentType.substring(0, componentType.indexOf(\",\")).trim() as GPUTextureFormat) : null;\r\n\r\n let arraySize = isArrayOfTexture ? this._getArraySize(name, type, preProcessors)[2] : 0;\r\n let textureInfo = this._webgpuProcessingContext.availableTextures[name];\r\n if (!textureInfo) {\r\n textureInfo = {\r\n isTextureArray: arraySize > 0,\r\n isStorageTexture,\r\n textures: [],\r\n sampleType: WebGPUConstants.TextureSampleType.Float,\r\n };\r\n arraySize = arraySize || 1;\r\n for (let i = 0; i < arraySize; ++i) {\r\n textureInfo.textures.push(this._webgpuProcessingContext.getNextFreeUBOBinding());\r\n }\r\n } else {\r\n arraySize = textureInfo.textures.length;\r\n }\r\n\r\n this._webgpuProcessingContext.availableTextures[name] = textureInfo;\r\n\r\n const isDepthTexture = textureFunc.indexOf(\"depth\") > 0;\r\n const textureDimension = gpuTextureViewDimensionByWebGPUTextureFunction[textureFunc];\r\n const sampleType = isDepthTexture\r\n ? WebGPUConstants.TextureSampleType.Depth\r\n : componentType === \"u32\"\r\n ? WebGPUConstants.TextureSampleType.Uint\r\n : componentType === \"i32\"\r\n ? WebGPUConstants.TextureSampleType.Sint\r\n : WebGPUConstants.TextureSampleType.Float;\r\n\r\n textureInfo.sampleType = sampleType;\r\n\r\n if (textureDimension === undefined) {\r\n throw `Can't get the texture dimension corresponding to the texture function \"${textureFunc}\"!`;\r\n }\r\n\r\n for (let i = 0; i < arraySize; ++i) {\r\n const { groupIndex, bindingIndex } = textureInfo.textures[i];\r\n\r\n if (i === 0) {\r\n texture = `@group(${groupIndex}) @binding(${bindingIndex}) ${texture}`;\r\n }\r\n\r\n this._addTextureBindingDescription(name, textureInfo, i, textureDimension, storageTextureFormat, !isFragment);\r\n }\r\n }\r\n\r\n return texture;\r\n }\r\n\r\n public postProcessor(code: string) {\r\n return code;\r\n }\r\n\r\n public finalizeShaders(vertexCode: string, fragmentCode: string): { vertexCode: string; fragmentCode: string } {\r\n const fragCoordCode =\r\n fragmentCode.indexOf(\"gl_FragCoord\") >= 0\r\n ? `\r\n if (internals.yFactor__ == 1.) {\r\n gl_FragCoord.y = internals.textureOutputHeight__ - gl_FragCoord.y;\r\n }\r\n `\r\n : \"\";\r\n\r\n // Add the group/binding info to the sampler declaration (var xxx: sampler|sampler_comparison)\r\n vertexCode = this._processSamplers(vertexCode, true);\r\n fragmentCode = this._processSamplers(fragmentCode, false);\r\n\r\n // Add the group/binding info to the uniform/storage buffer declarations (var<uniform> XXX:YYY or var<storage(,read_write|read)> XXX:YYY)\r\n vertexCode = this._processCustomBuffers(vertexCode, true);\r\n fragmentCode = this._processCustomBuffers(fragmentCode, false);\r\n\r\n // Builds the leftover UBOs.\r\n const leftOverUBO = this._buildLeftOverUBO();\r\n\r\n vertexCode = leftOverUBO + vertexCode;\r\n fragmentCode = leftOverUBO + fragmentCode;\r\n\r\n // Vertex code\r\n vertexCode = vertexCode.replace(/#define /g, \"//#define \");\r\n vertexCode = this._processStridedUniformArrays(vertexCode);\r\n\r\n const varyingsDecl = this._varyingsDeclWGSL.join(\"\\n\") + \"\\n\";\r\n\r\n const vertexBuiltinDecl = `var<private> ${builtInName_vertex_index} : u32;\\nvar<private> ${builtInName_instance_index} : u32;\\nvar<private> ${builtInName_position} : vec4<f32>;\\n`;\r\n\r\n const vertexAttributesDecl = this._attributesDeclWGSL.join(\"\\n\") + \"\\n\";\r\n\r\n let vertexInputs = \"struct VertexInputs {\\n @builtin(vertex_index) vertexIndex : u32,\\n @builtin(instance_index) instanceIndex : u32,\\n\";\r\n if (this._attributesWGSL.length > 0) {\r\n vertexInputs += this._attributesWGSL.join(\"\\n\");\r\n }\r\n vertexInputs += \"\\n};\\n\";\r\n\r\n let vertexFragmentInputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n\";\r\n if (this._varyingsWGSL.length > 0) {\r\n vertexFragmentInputs += this._varyingsWGSL.join(\"\\n\");\r\n }\r\n vertexFragmentInputs += \"\\n};\\n\";\r\n\r\n vertexCode = vertexBuiltinDecl + vertexInputs + vertexAttributesDecl + vertexFragmentInputs + varyingsDecl + vertexCode;\r\n\r\n let vertexStartingCode = ` var output : FragmentInputs;\\n ${builtInName_vertex_index} = input.vertexIndex;\\n ${builtInName_instance_index} = input.instanceIndex;\\n`;\r\n\r\n for (let i = 0; i < this._attributeNamesWGSL.length; ++i) {\r\n const name = this._attributeNamesWGSL[i];\r\n vertexStartingCode += ` ${name} = input.${name};\\n`;\r\n }\r\n\r\n let vertexEndingCode = ` output.position = ${builtInName_position};\\n output.position.y = output.position.y * internals.yFactor__;\\n`;\r\n\r\n for (let i = 0; i < this._varyingNamesWGSL.length; ++i) {\r\n const name = this._varyingNamesWGSL[i];\r\n vertexEndingCode += ` output.${name} = ${name};\\n`;\r\n }\r\n\r\n vertexEndingCode += \" return output;\";\r\n\r\n vertexCode = this._injectStartingAndEndingCode(vertexCode, \"fn main\", vertexStartingCode, vertexEndingCode);\r\n\r\n // fragment code\r\n fragmentCode = fragmentCode.replace(/#define /g, \"//#define \");\r\n fragmentCode = this._processStridedUniformArrays(fragmentCode);\r\n fragmentCode = fragmentCode.replace(/dpdy/g, \"(-internals.yFactor__)*dpdy\"); // will also handle dpdyCoarse and dpdyFine\r\n\r\n const fragmentBuiltinDecl = `var<private> ${builtInName_position_frag} : vec4<f32>;\\nvar<private> ${builtInName_front_facing} : bool;\\nvar<private> ${builtInName_FragColor} : vec4<f32>;\\nvar<private> ${builtInName_frag_depth} : f32;\\n`;\r\n\r\n let fragmentFragmentInputs = \"struct FragmentInputs {\\n @builtin(position) position : vec4<f32>,\\n @builtin(front_facing) frontFacing : bool,\\n\";\r\n if (this._varyingsWGSL.length > 0) {\r\n fragmentFragmentInputs += this._varyingsWGSL.join(\"\\n\");\r\n }\r\n fragmentFragmentInputs += \"\\n};\\n\";\r\n\r\n let fragmentOutputs = \"struct FragmentOutputs {\\n @location(0) color : vec4<f32>,\\n\";\r\n\r\n let hasFragDepth = false;\r\n let idx = 0;\r\n while (!hasFragDepth) {\r\n idx = fragmentCode.indexOf(builtInName_frag_depth, idx);\r\n if (idx < 0) {\r\n break;\r\n }\r\n const saveIndex = idx;\r\n hasFragDepth = true;\r\n while (idx > 1 && fragmentCode.charAt(idx) !== \"\\n\") {\r\n if (fragmentCode.charAt(idx) === \"/\" && fragmentCode.charAt(idx - 1) === \"/\") {\r\n hasFragDepth = false;\r\n break;\r\n }\r\n idx--;\r\n }\r\n idx = saveIndex + builtInName_frag_depth.length;\r\n }\r\n\r\n if (hasFragDepth) {\r\n fragmentOutputs += \" @builtin(frag_depth) fragDepth: f32;\\n\";\r\n }\r\n\r\n fragmentOutputs += \"};\\n\";\r\n\r\n fragmentCode = fragmentBuiltinDecl + fragmentFragmentInputs + varyingsDecl + fragmentOutputs + fragmentCode;\r\n\r\n let fragmentStartingCode =\r\n ` var output : FragmentOutputs;\\n ${builtInName_position_frag} = input.position;\\n ${builtInName_front_facing} = input.frontFacing;\\n` + fragCoordCode;\r\n\r\n for (let i = 0; i < this._varyingNamesWGSL.length; ++i) {\r\n const name = this._varyingNamesWGSL[i];\r\n fragmentStartingCode += ` ${name} = input.${name};\\n`;\r\n }\r\n\r\n let fragmentEndingCode = ` output.color = ${builtInName_FragColor};\\n`;\r\n\r\n if (hasFragDepth) {\r\n fragmentEndingCode += ` output.fragDepth = ${builtInName_frag_depth};\\n`;\r\n }\r\n\r\n fragmentEndingCode += \" return output;\";\r\n\r\n fragmentCode = this._injectStartingAndEndingCode(fragmentCode, \"fn main\", fragmentStartingCode, fragmentEndingCode);\r\n\r\n this._collectBindingNames();\r\n this._preCreateBindGroupEntries();\r\n\r\n return { vertexCode, fragmentCode };\r\n }\r\n\r\n protected _generateLeftOverUBOCode(name: string, uniformBufferDescription: WebGPUBufferDescription): string {\r\n let stridedArrays = \"\";\r\n let ubo = `struct ${name} {\\n`;\r\n for (const leftOverUniform of this._webgpuProcessingContext.leftOverUniforms) {\r\n const type = leftOverUniform.type.replace(/^(.*?)(<.*>)?$/, \"$1\");\r\n const size = WebGPUShaderProcessor.UniformSizes[type];\r\n\r\n if (leftOverUniform.length > 0) {\r\n if (size <= 2) {\r\n const stridedArrayType = `${name}_${this._stridedUniformArrays.length}_strided_arr`;\r\n stridedArrays += `struct ${stridedArrayType} {\r\n @size(16)\r\n el: ${type},\r\n }`;\r\n this._stridedUniformArrays.push(leftOverUniform.name);\r\n\r\n ubo += ` @align(16) ${leftOverUniform.name} : array<${stridedArrayType}, ${leftOverUniform.length}>,\\n`;\r\n } else {\r\n ubo += ` ${leftOverUniform.name} : array<${leftOverUniform.type}, ${leftOverUniform.length}>,\\n`;\r\n }\r\n } else {\r\n ubo += ` ${leftOverUniform.name} : ${leftOverUniform.type},\\n`;\r\n }\r\n }\r\n ubo += \"};\\n\";\r\n ubo = `${stridedArrays}\\n${ubo}`;\r\n ubo += `@group(${uniformBufferDescription.binding.groupIndex}) @binding(${uniformBufferDescription.binding.bindingIndex}) var<uniform> ${leftOverVarName} : ${name};\\n`;\r\n\r\n return ubo;\r\n }\r\n\r\n private _processSamplers(code: string, isVertex: boolean): string {\r\n const samplerRegexp = /var\\s+(\\w+Sampler)\\s*:\\s*(sampler|sampler_comparison)\\s*;/gm;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const match = samplerRegexp.exec(code);\r\n if (match === null) {\r\n break;\r\n }\r\n\r\n const name = match[1]; // name of the variable\r\n const samplerType = match[2]; // sampler or sampler_comparison\r\n const textureName =\r\n name.indexOf(WebGPUShaderProcessor.AutoSamplerSuffix) === name.length - WebGPUShaderProcessor.AutoSamplerSuffix.length\r\n ? name.substring(0, name.indexOf(WebGPUShaderProcessor.AutoSamplerSuffix))\r\n : null;\r\n const samplerBindingType = samplerType === \"sampler_comparison\" ? WebGPUConstants.SamplerBindingType.Comparison : WebGPUConstants.SamplerBindingType.Filtering;\r\n\r\n if (textureName) {\r\n const textureInfo = this._webgpuProcessingContext.availableTextures[textureName];\r\n if (textureInfo) {\r\n textureInfo.autoBindSampler = true;\r\n }\r\n }\r\n\r\n let samplerInfo = this._webgpuProcessingContext.availableSamplers[name];\r\n if (!samplerInfo) {\r\n samplerInfo = {\r\n binding: this._webgpuProcessingContext.getNextFreeUBOBinding(),\r\n type: samplerBindingType,\r\n };\r\n this._webgpuProcessingContext.availableSamplers[name] = samplerInfo;\r\n }\r\n\r\n this._addSamplerBindingDescription(name, samplerInfo, isVertex);\r\n\r\n const part1 = code.substring(0, match.index);\r\n const insertPart = `@group(${samplerInfo.binding.groupIndex}) @binding(${samplerInfo.binding.bindingIndex}) `;\r\n const part2 = code.substring(match.index);\r\n\r\n code = part1 + insertPart + part2;\r\n\r\n samplerRegexp.lastIndex += insertPart.length;\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _processCustomBuffers(code: string, isVertex: boolean): string {\r\n const instantiateBufferRegexp = /var<\\s*(uniform|storage)\\s*(,\\s*(read|read_write)\\s*)?>\\s+(\\S+)\\s*:\\s*(\\S+)\\s*;/gm;\r\n\r\n // eslint-disable-next-line no-constant-condition\r\n while (true) {\r\n const match = instantiateBufferRegexp.exec(code);\r\n if (match === null) {\r\n break;\r\n }\r\n\r\n const type = match[1];\r\n const decoration = match[3];\r\n let name = match[4];\r\n const structName = match[5];\r\n\r\n let bufferInfo = this._webgpuProcessingContext.availableBuffers[name];\r\n if (!bufferInfo) {\r\n const knownUBO = type === \"uniform\" ? WebGPUShaderProcessingContext.KnownUBOs[structName] : null;\r\n\r\n let binding;\r\n if (knownUBO) {\r\n name = structName;\r\n binding = knownUBO.binding;\r\n if (binding.groupIndex === -1) {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n } else {\r\n binding = this._webgpuProcessingContext.getNextFreeUBOBinding();\r\n }\r\n\r\n bufferInfo = { binding };\r\n this._webgpuProcessingContext.availableBuffers[name] = bufferInfo;\r\n }\r\n\r\n this._addBufferBindingDescription(\r\n name,\r\n this._webgpuProcessingContext.availableBuffers[name],\r\n decoration === \"read_write\"\r\n ? WebGPUConstants.BufferBindingType.Storage\r\n : type === \"storage\"\r\n ? WebGPUConstants.BufferBindingType.ReadOnlyStorage\r\n : WebGPUConstants.BufferBindingType.Uniform,\r\n isVertex\r\n );\r\n\r\n const groupIndex = bufferInfo.binding.groupIndex;\r\n const bindingIndex = bufferInfo.binding.bindingIndex;\r\n\r\n const part1 = code.substring(0, match.index);\r\n const insertPart = `@group(${groupIndex}) @binding(${bindingIndex}) `;\r\n const part2 = code.substring(match.index);\r\n\r\n code = part1 + insertPart + part2;\r\n\r\n instantiateBufferRegexp.lastIndex += insertPart.length;\r\n }\r\n\r\n return code;\r\n }\r\n\r\n private _processStridedUniformArrays(code: string): string {\r\n for (const uniformArrayName of this._stridedUniformArrays) {\r\n code = code.replace(new RegExp(`${uniformArrayName}\\\\s*\\\\[(.*)\\\\]`, \"g\"), `${uniformArrayName}[$1].el`);\r\n }\r\n return code;\r\n }\r\n}\r\n"]}
@@ -496,6 +496,7 @@ export declare class NullEngine extends Engine {
496
496
  releaseEffects(): void;
497
497
  displayLoadingUI(): void;
498
498
  hideLoadingUI(): void;
499
+ set loadingUIText(_: string);
499
500
  /**
500
501
  * @param texture
501
502
  * @param internalFormat
@@ -844,6 +844,11 @@ var NullEngine = /** @class */ (function (_super) {
844
844
  NullEngine.prototype.releaseEffects = function () { };
845
845
  NullEngine.prototype.displayLoadingUI = function () { };
846
846
  NullEngine.prototype.hideLoadingUI = function () { };
847
+ Object.defineProperty(NullEngine.prototype, "loadingUIText", {
848
+ set: function (_) { },
849
+ enumerable: false,
850
+ configurable: true
851
+ });
847
852
  /**
848
853
  * @param texture
849
854
  * @param internalFormat