@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.
- package/Collisions/collider.d.ts +4 -0
- package/Collisions/collider.js +9 -0
- package/Collisions/collider.js.map +1 -1
- package/Engines/Extensions/engine.readTexture.d.ts +2 -2
- package/Engines/Extensions/engine.readTexture.js +8 -4
- package/Engines/Extensions/engine.readTexture.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.readTexture.js +4 -2
- package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +2 -0
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +25 -10
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
- package/Engines/engine.d.ts +7 -1
- package/Engines/engine.js +14 -0
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +24 -0
- package/Engines/nativeEngine.js +39 -0
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/nullEngine.d.ts +1 -0
- package/Engines/nullEngine.js +5 -0
- package/Engines/nullEngine.js.map +1 -1
- package/Engines/thinEngine.d.ts +2 -1
- package/Engines/thinEngine.js +16 -6
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +13 -1
- package/Engines/webgpuEngine.js +25 -1
- package/Engines/webgpuEngine.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.js +3 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/Textures/baseTexture.d.ts +5 -1
- package/Materials/Textures/baseTexture.js +21 -11
- package/Materials/Textures/baseTexture.js.map +1 -1
- package/Materials/Textures/texture.d.ts +3 -0
- package/Materials/Textures/texture.js +4 -2
- package/Materials/Textures/texture.js.map +1 -1
- package/Meshes/mesh.js +0 -1
- package/Meshes/mesh.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/meshUboDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/meshUboDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +1 -1
- package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
- package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
- package/package.json +1 -1
package/Collisions/collider.d.ts
CHANGED
|
@@ -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;
|
package/Collisions/collider.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
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,
|
|
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;
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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, "
|
|
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, "
|
|
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 };
|