@babylonjs/core 8.33.3 → 8.33.4
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/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.d.ts +1 -0
- package/Lights/Shadows/cascadedShadowGenerator.js +9 -1
- package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +10 -3
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Materials/floatingOriginMatrixOverrides.d.ts +6 -0
- package/Materials/floatingOriginMatrixOverrides.js +32 -9
- package/Materials/floatingOriginMatrixOverrides.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
import { Matrix } from "../Maths/math.vector.js";
|
|
2
|
+
import type { IMatrixLike, IVector3Like } from "../Maths/math.like.js";
|
|
1
3
|
import type { Scene } from "../scene.js";
|
|
4
|
+
import type { DeepImmutable } from "../types.js";
|
|
2
5
|
/**
|
|
3
6
|
* When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions
|
|
4
7
|
*/
|
|
5
8
|
export declare const FloatingOriginCurrentScene: {
|
|
6
9
|
getScene: () => Scene | undefined;
|
|
10
|
+
eyeAtCamera: boolean;
|
|
7
11
|
};
|
|
12
|
+
export declare function GetOffsetTransformMatrices(offset: IVector3Like, viewMatrices: Array<Matrix>, projectionMatrices: Array<Matrix>, length: number, resultArray: Float32Array): Float32Array;
|
|
13
|
+
export declare function GetFullOffsetViewProjectionToRef(offset: IVector3Like, viewMatrix: DeepImmutable<IMatrixLike>, projectionMatrix: DeepImmutable<IMatrixLike>, ref: IMatrixLike): DeepImmutable<IMatrixLike>;
|
|
8
14
|
export declare function ResetMatrixFunctions(): void;
|
|
9
15
|
export declare function OverrideMatrixFunctions(): void;
|
|
@@ -10,6 +10,7 @@ const TempMat2 = new Matrix();
|
|
|
10
10
|
*/
|
|
11
11
|
export const FloatingOriginCurrentScene = {
|
|
12
12
|
getScene: () => undefined,
|
|
13
|
+
eyeAtCamera: true, // When true, we can assume viewMatrix translation is at origin. Otherwise, we must do full offset calculations
|
|
13
14
|
};
|
|
14
15
|
function OffsetWorldToRef(offset, world, ref) {
|
|
15
16
|
const refArray = ref.asArray();
|
|
@@ -20,10 +21,20 @@ function OffsetWorldToRef(offset, world, ref) {
|
|
|
20
21
|
refArray[12] -= offset.x;
|
|
21
22
|
refArray[13] -= offset.y;
|
|
22
23
|
refArray[14] -= offset.z;
|
|
23
|
-
|
|
24
|
+
ref.markAsUpdated();
|
|
24
25
|
return ref;
|
|
25
26
|
}
|
|
26
|
-
function
|
|
27
|
+
function GetFullOffsetView(offset, viewMatrix, ref) {
|
|
28
|
+
InvertMatrixToRef(viewMatrix, TempMat1); // TempMat1 = light world matrix (inverse of view)
|
|
29
|
+
OffsetWorldToRef(offset, TempMat1, TempMat2); // TempMat2 = offset light world matrix
|
|
30
|
+
InvertMatrixToRef(TempMat2, ref); // TempMat1 = offset view matrix
|
|
31
|
+
return ref;
|
|
32
|
+
}
|
|
33
|
+
function OffsetViewToRef(offset, view, ref) {
|
|
34
|
+
// When eye is not at camera, we cannot assume the translation of view matrix is at origin, so we perform full offset calculation
|
|
35
|
+
if (!FloatingOriginCurrentScene.eyeAtCamera) {
|
|
36
|
+
return GetFullOffsetView(offset, view, ref);
|
|
37
|
+
}
|
|
27
38
|
const refArray = ref.asArray();
|
|
28
39
|
const viewArray = view.asArray();
|
|
29
40
|
for (let i = 0; i < 16; i++) {
|
|
@@ -32,23 +43,35 @@ function OffsetViewToRef(view, ref) {
|
|
|
32
43
|
refArray[12] = 0;
|
|
33
44
|
refArray[13] = 0;
|
|
34
45
|
refArray[14] = 0;
|
|
35
|
-
|
|
46
|
+
ref.markAsUpdated();
|
|
36
47
|
return ref;
|
|
37
48
|
}
|
|
38
|
-
function OffsetViewProjectionToRef(view, projection, ref) {
|
|
39
|
-
MultiplyMatricesToRef(OffsetViewToRef(view, ref), projection, ref);
|
|
49
|
+
function OffsetViewProjectionToRef(offset, view, projection, ref) {
|
|
50
|
+
MultiplyMatricesToRef(OffsetViewToRef(offset, view, ref), projection, ref);
|
|
40
51
|
return ref;
|
|
41
52
|
}
|
|
53
|
+
export function GetOffsetTransformMatrices(offset, viewMatrices, projectionMatrices, length, resultArray) {
|
|
54
|
+
for (let cascadeIndex = 0; cascadeIndex < length; ++cascadeIndex) {
|
|
55
|
+
GetFullOffsetViewProjectionToRef(offset, viewMatrices[cascadeIndex], projectionMatrices[cascadeIndex], TempMat1);
|
|
56
|
+
TempMat1.copyToArray(resultArray, cascadeIndex * 16);
|
|
57
|
+
}
|
|
58
|
+
return resultArray;
|
|
59
|
+
}
|
|
42
60
|
function OffsetWorldViewToRef(offset, worldView, view, ref) {
|
|
43
61
|
// ( world * view ) * inverse ( view ) = world
|
|
44
62
|
InvertMatrixToRef(view, TempMat1); // TempMat1 = inverseView
|
|
45
63
|
MultiplyMatricesToRef(worldView, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused
|
|
46
64
|
// ( offsetWorld * offsetView ) = offsetWorldView
|
|
47
65
|
OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld
|
|
48
|
-
OffsetViewToRef(view, TempMat2); // TempMat2 = offsetView
|
|
66
|
+
OffsetViewToRef(offset, view, TempMat2); // TempMat2 = offsetView
|
|
49
67
|
MultiplyMatricesToRef(TempMat1, TempMat2, ref);
|
|
50
68
|
return ref;
|
|
51
69
|
}
|
|
70
|
+
export function GetFullOffsetViewProjectionToRef(offset, viewMatrix, projectionMatrix, ref) {
|
|
71
|
+
GetFullOffsetView(offset, viewMatrix, TempMat2);
|
|
72
|
+
MultiplyMatricesToRef(TempMat2, projectionMatrix, ref);
|
|
73
|
+
return ref;
|
|
74
|
+
}
|
|
52
75
|
function OffsetWorldViewProjectionToRef(offset, worldViewProjection, viewProjection, view, projection, ref) {
|
|
53
76
|
// ( world * view * projection ) * inverse(projection) * inverse(view) = world
|
|
54
77
|
// ( world * view * projection ) * inverse (view * projection) = world
|
|
@@ -56,7 +79,7 @@ function OffsetWorldViewProjectionToRef(offset, worldViewProjection, viewProject
|
|
|
56
79
|
MultiplyMatricesToRef(worldViewProjection, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused
|
|
57
80
|
// ( offsetWorld * offsetViewProjection) = offsetWorldViewProjection
|
|
58
81
|
OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld
|
|
59
|
-
OffsetViewProjectionToRef(view, projection, TempMat2); // TempMat2 = offsetViewProjection
|
|
82
|
+
OffsetViewProjectionToRef(offset, view, projection, TempMat2); // TempMat2 = offsetViewProjection
|
|
60
83
|
MultiplyMatricesToRef(TempMat1, TempMat2, ref);
|
|
61
84
|
return ref;
|
|
62
85
|
}
|
|
@@ -72,11 +95,11 @@ function GetOffsetMatrix(uniformName, mat) {
|
|
|
72
95
|
case "world":
|
|
73
96
|
return OffsetWorldToRef(offset, mat, TempFinalMat);
|
|
74
97
|
case "view":
|
|
75
|
-
return OffsetViewToRef(mat, TempFinalMat);
|
|
98
|
+
return OffsetViewToRef(offset, mat, TempFinalMat);
|
|
76
99
|
case "worldView":
|
|
77
100
|
return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);
|
|
78
101
|
case "viewProjection":
|
|
79
|
-
return OffsetViewProjectionToRef(scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);
|
|
102
|
+
return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);
|
|
80
103
|
case "worldViewProjection":
|
|
81
104
|
return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);
|
|
82
105
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floatingOriginMatrixOverrides.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/floatingOriginMatrixOverrides.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"../Materials/effect\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport type { IMatrixLike, IVector3Like } from \"../Maths/math.like\";\r\nimport { InvertMatrixToRef, MultiplyMatricesToRef } from \"../Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { DeepImmutable } from \"../types\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\n\r\nconst TempFinalMat: Matrix = new Matrix();\r\nconst TempMat1: Matrix = new Matrix();\r\nconst TempMat2: Matrix = new Matrix();\r\n/**\r\n * When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions\r\n */\r\nexport const FloatingOriginCurrentScene = {\r\n getScene: () => undefined as Scene | undefined,\r\n};\r\n\r\nfunction OffsetWorldToRef(offset: IVector3Like, world: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n const refArray = ref.asArray();\r\n const worldArray = world.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = worldArray[i];\r\n }\r\n refArray[12] -= offset.x;\r\n refArray[13] -= offset.y;\r\n refArray[14] -= offset.z;\r\n Matrix.FromArrayToRef(refArray, 0, ref);\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewToRef(view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n const refArray = ref.asArray();\r\n const viewArray = view.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = viewArray[i];\r\n }\r\n refArray[12] = 0;\r\n refArray[13] = 0;\r\n refArray[14] = 0;\r\n Matrix.FromArrayToRef(refArray, 0, ref);\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewProjectionToRef(view: DeepImmutable<IMatrixLike>, projection: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n MultiplyMatricesToRef(OffsetViewToRef(view, ref), projection, ref);\r\n return ref;\r\n}\r\n\r\nfunction OffsetWorldViewToRef(offset: IVector3Like, worldView: DeepImmutable<IMatrixLike>, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // ( world * view ) * inverse ( view ) = world\r\n InvertMatrixToRef(view, TempMat1); // TempMat1 = inverseView\r\n MultiplyMatricesToRef(worldView, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetView ) = offsetWorldView\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewToRef(view, TempMat2); // TempMat2 = offsetView\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nfunction OffsetWorldViewProjectionToRef(\r\n offset: IVector3Like,\r\n worldViewProjection: DeepImmutable<IMatrixLike>,\r\n viewProjection: DeepImmutable<IMatrixLike>,\r\n view: DeepImmutable<IMatrixLike>,\r\n projection: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n // ( world * view * projection ) * inverse(projection) * inverse(view) = world\r\n // ( world * view * projection ) * inverse (view * projection) = world\r\n InvertMatrixToRef(viewProjection, TempMat1); // TempMat1 = inverse (view * projection)\r\n MultiplyMatricesToRef(worldViewProjection, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetViewProjection) = offsetWorldViewProjection\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewProjectionToRef(view, projection, TempMat2); // TempMat2 = offsetViewProjection\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nfunction GetOffsetMatrix(uniformName: string, mat: IMatrixLike): IMatrixLike {\r\n TempFinalMat.updateFlag = mat.updateFlag;\r\n const scene = FloatingOriginCurrentScene.getScene();\r\n // Early out for scenes that don't have floatingOriginMode enabled\r\n if (!scene) {\r\n return mat;\r\n }\r\n const offset = scene.floatingOriginOffset;\r\n switch (uniformName) {\r\n case \"world\":\r\n return OffsetWorldToRef(offset, mat, TempFinalMat);\r\n case \"view\":\r\n return OffsetViewToRef(mat, TempFinalMat);\r\n case \"worldView\":\r\n return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);\r\n case \"viewProjection\":\r\n return OffsetViewProjectionToRef(scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n case \"worldViewProjection\":\r\n return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n default:\r\n return mat;\r\n }\r\n}\r\n\r\n// ---- Overriding the prototypes of effect and uniformBuffer's setMatrix functions ----\r\nconst UniformBufferInternal = UniformBuffer as any;\r\nconst EffectInternal = Effect as any;\r\nconst OriginalUpdateMatrixForUniform = UniformBufferInternal.prototype._updateMatrixForUniform;\r\nconst OriginalSetMatrix = Effect.prototype.setMatrix;\r\n\r\nexport function ResetMatrixFunctions() {\r\n Effect.prototype.setMatrix = OriginalSetMatrix;\r\n EffectInternal._setMatrixOverride = undefined;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = undefined;\r\n}\r\n\r\nexport function OverrideMatrixFunctions() {\r\n EffectInternal.prototype._setMatrixOverride = OriginalSetMatrix;\r\n EffectInternal.prototype.setMatrix = function (uniformName: string, matrix: IMatrixLike) {\r\n this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n return this;\r\n };\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName: string, matrix: IMatrixLike) {\r\n this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"floatingOriginMatrixOverrides.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/floatingOriginMatrixOverrides.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"../Materials/effect\";\r\nimport { Matrix } from \"../Maths/math.vector\";\r\nimport type { IMatrixLike, IVector3Like } from \"../Maths/math.like\";\r\nimport { InvertMatrixToRef, MultiplyMatricesToRef } from \"../Maths/ThinMaths/thinMath.matrix.functions\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { DeepImmutable } from \"../types\";\r\nimport { UniformBuffer } from \"./uniformBuffer\";\r\n\r\nconst TempFinalMat: Matrix = new Matrix();\r\nconst TempMat1: Matrix = new Matrix();\r\nconst TempMat2: Matrix = new Matrix();\r\n\r\n/**\r\n * When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions\r\n */\r\nexport const FloatingOriginCurrentScene = {\r\n getScene: () => undefined as Scene | undefined,\r\n eyeAtCamera: true, // When true, we can assume viewMatrix translation is at origin. Otherwise, we must do full offset calculations\r\n};\r\n\r\nfunction OffsetWorldToRef(offset: IVector3Like, world: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n const refArray = ref.asArray();\r\n const worldArray = world.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = worldArray[i];\r\n }\r\n refArray[12] -= offset.x;\r\n refArray[13] -= offset.y;\r\n refArray[14] -= offset.z;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction GetFullOffsetView(offset: IVector3Like, viewMatrix: DeepImmutable<IMatrixLike>, ref: IMatrixLike) {\r\n InvertMatrixToRef(viewMatrix, TempMat1); // TempMat1 = light world matrix (inverse of view)\r\n OffsetWorldToRef(offset, TempMat1, TempMat2); // TempMat2 = offset light world matrix\r\n InvertMatrixToRef(TempMat2, ref); // TempMat1 = offset view matrix\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // When eye is not at camera, we cannot assume the translation of view matrix is at origin, so we perform full offset calculation\r\n if (!FloatingOriginCurrentScene.eyeAtCamera) {\r\n return GetFullOffsetView(offset, view, ref);\r\n }\r\n const refArray = ref.asArray();\r\n const viewArray = view.asArray();\r\n for (let i = 0; i < 16; i++) {\r\n refArray[i] = viewArray[i];\r\n }\r\n refArray[12] = 0;\r\n refArray[13] = 0;\r\n refArray[14] = 0;\r\n ref.markAsUpdated();\r\n return ref;\r\n}\r\n\r\nfunction OffsetViewProjectionToRef(offset: IVector3Like, view: DeepImmutable<IMatrixLike>, projection: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n MultiplyMatricesToRef(OffsetViewToRef(offset, view, ref), projection, ref);\r\n return ref;\r\n}\r\n\r\nexport function GetOffsetTransformMatrices(\r\n offset: IVector3Like,\r\n viewMatrices: Array<Matrix>,\r\n projectionMatrices: Array<Matrix>,\r\n length: number,\r\n resultArray: Float32Array\r\n): Float32Array {\r\n for (let cascadeIndex = 0; cascadeIndex < length; ++cascadeIndex) {\r\n GetFullOffsetViewProjectionToRef(offset, viewMatrices[cascadeIndex], projectionMatrices[cascadeIndex], TempMat1);\r\n TempMat1.copyToArray(resultArray, cascadeIndex * 16);\r\n }\r\n return resultArray;\r\n}\r\n\r\nfunction OffsetWorldViewToRef(offset: IVector3Like, worldView: DeepImmutable<IMatrixLike>, view: DeepImmutable<IMatrixLike>, ref: Matrix): DeepImmutable<IMatrixLike> {\r\n // ( world * view ) * inverse ( view ) = world\r\n InvertMatrixToRef(view, TempMat1); // TempMat1 = inverseView\r\n MultiplyMatricesToRef(worldView, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetView ) = offsetWorldView\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewToRef(offset, view, TempMat2); // TempMat2 = offsetView\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nexport function GetFullOffsetViewProjectionToRef(\r\n offset: IVector3Like,\r\n viewMatrix: DeepImmutable<IMatrixLike>,\r\n projectionMatrix: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n GetFullOffsetView(offset, viewMatrix, TempMat2);\r\n MultiplyMatricesToRef(TempMat2, projectionMatrix, ref);\r\n return ref;\r\n}\r\n\r\nfunction OffsetWorldViewProjectionToRef(\r\n offset: IVector3Like,\r\n worldViewProjection: DeepImmutable<IMatrixLike>,\r\n viewProjection: DeepImmutable<IMatrixLike>,\r\n view: DeepImmutable<IMatrixLike>,\r\n projection: DeepImmutable<IMatrixLike>,\r\n ref: IMatrixLike\r\n): DeepImmutable<IMatrixLike> {\r\n // ( world * view * projection ) * inverse(projection) * inverse(view) = world\r\n // ( world * view * projection ) * inverse (view * projection) = world\r\n InvertMatrixToRef(viewProjection, TempMat1); // TempMat1 = inverse (view * projection)\r\n MultiplyMatricesToRef(worldViewProjection, TempMat1, TempMat2); // TempMat2 = world, TempMat1 can be reused\r\n\r\n // ( offsetWorld * offsetViewProjection) = offsetWorldViewProjection\r\n OffsetWorldToRef(offset, TempMat2, TempMat1); // TempMat1 = offsetWorld\r\n OffsetViewProjectionToRef(offset, view, projection, TempMat2); // TempMat2 = offsetViewProjection\r\n MultiplyMatricesToRef(TempMat1, TempMat2, ref);\r\n\r\n return ref;\r\n}\r\n\r\nfunction GetOffsetMatrix(uniformName: string, mat: IMatrixLike): IMatrixLike {\r\n TempFinalMat.updateFlag = mat.updateFlag;\r\n const scene = FloatingOriginCurrentScene.getScene();\r\n // Early out for scenes that don't have floatingOriginMode enabled\r\n if (!scene) {\r\n return mat;\r\n }\r\n const offset = scene.floatingOriginOffset;\r\n switch (uniformName) {\r\n case \"world\":\r\n return OffsetWorldToRef(offset, mat, TempFinalMat);\r\n case \"view\":\r\n return OffsetViewToRef(offset, mat, TempFinalMat);\r\n case \"worldView\":\r\n return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);\r\n case \"viewProjection\":\r\n return OffsetViewProjectionToRef(offset, scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n case \"worldViewProjection\":\r\n return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);\r\n default:\r\n return mat;\r\n }\r\n}\r\n\r\n// ---- Overriding the prototypes of effect and uniformBuffer's setMatrix functions ----\r\nconst UniformBufferInternal = UniformBuffer as any;\r\nconst EffectInternal = Effect as any;\r\nconst OriginalUpdateMatrixForUniform = UniformBufferInternal.prototype._updateMatrixForUniform;\r\nconst OriginalSetMatrix = Effect.prototype.setMatrix;\r\n\r\nexport function ResetMatrixFunctions() {\r\n Effect.prototype.setMatrix = OriginalSetMatrix;\r\n EffectInternal._setMatrixOverride = undefined;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = undefined;\r\n}\r\n\r\nexport function OverrideMatrixFunctions() {\r\n EffectInternal.prototype._setMatrixOverride = OriginalSetMatrix;\r\n EffectInternal.prototype.setMatrix = function (uniformName: string, matrix: IMatrixLike) {\r\n this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n return this;\r\n };\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = OriginalUpdateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName: string, matrix: IMatrixLike) {\r\n this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix));\r\n };\r\n}\r\n"]}
|