@onerjs/core 8.28.10 → 8.29.2
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.d.ts +13 -1
- package/Engines/abstractEngine.js +6 -3
- package/Engines/abstractEngine.js.map +1 -1
- package/Materials/floatingOriginMatrixOverrides.d.ts +7 -1
- package/Materials/floatingOriginMatrixOverrides.js +21 -9
- package/Materials/floatingOriginMatrixOverrides.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +15 -12
- package/scene.js +27 -16
- package/scene.js.map +1 -1
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
import type { Scene } from "../scene.js";
|
|
2
|
+
/**
|
|
3
|
+
* When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions
|
|
4
|
+
*/
|
|
5
|
+
export declare const FloatingOriginCurrentScene: {
|
|
6
|
+
getScene: () => Scene | undefined;
|
|
7
|
+
};
|
|
2
8
|
export declare function ResetMatrixFunctions(): void;
|
|
3
|
-
export declare function OverrideMatrixFunctions(
|
|
9
|
+
export declare function OverrideMatrixFunctions(): void;
|
|
@@ -5,6 +5,12 @@ import { UniformBuffer } from "./uniformBuffer.js";
|
|
|
5
5
|
const TempFinalMat = new Matrix();
|
|
6
6
|
const TempMat1 = new Matrix();
|
|
7
7
|
const TempMat2 = new Matrix();
|
|
8
|
+
/**
|
|
9
|
+
* When rendering, each scene will reset this to ensure the correct floating origin offset is when overriding the below functions
|
|
10
|
+
*/
|
|
11
|
+
export const FloatingOriginCurrentScene = {
|
|
12
|
+
getScene: () => undefined,
|
|
13
|
+
};
|
|
8
14
|
function OffsetWorldToRef(offset, world, ref) {
|
|
9
15
|
const refArray = ref.asArray();
|
|
10
16
|
const worldArray = world.asArray();
|
|
@@ -54,19 +60,25 @@ function OffsetWorldViewProjectionToRef(offset, worldViewProjection, viewProject
|
|
|
54
60
|
MultiplyMatricesToRef(TempMat1, TempMat2, ref);
|
|
55
61
|
return ref;
|
|
56
62
|
}
|
|
57
|
-
function GetOffsetMatrix(uniformName, mat
|
|
63
|
+
function GetOffsetMatrix(uniformName, mat) {
|
|
58
64
|
TempFinalMat.updateFlag = mat.updateFlag;
|
|
65
|
+
const scene = FloatingOriginCurrentScene.getScene();
|
|
66
|
+
// Early out for scenes that don't have floatingOriginMode enabled
|
|
67
|
+
if (!scene) {
|
|
68
|
+
return mat;
|
|
69
|
+
}
|
|
70
|
+
const offset = scene.floatingOriginOffset;
|
|
59
71
|
switch (uniformName) {
|
|
60
72
|
case "world":
|
|
61
|
-
return OffsetWorldToRef(
|
|
73
|
+
return OffsetWorldToRef(offset, mat, TempFinalMat);
|
|
62
74
|
case "view":
|
|
63
75
|
return OffsetViewToRef(mat, TempFinalMat);
|
|
64
76
|
case "worldView":
|
|
65
|
-
return OffsetWorldViewToRef(
|
|
77
|
+
return OffsetWorldViewToRef(offset, mat, scene.getViewMatrix(), TempFinalMat);
|
|
66
78
|
case "viewProjection":
|
|
67
79
|
return OffsetViewProjectionToRef(scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);
|
|
68
80
|
case "worldViewProjection":
|
|
69
|
-
return OffsetWorldViewProjectionToRef(
|
|
81
|
+
return OffsetWorldViewProjectionToRef(offset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);
|
|
70
82
|
default:
|
|
71
83
|
return mat;
|
|
72
84
|
}
|
|
@@ -82,15 +94,15 @@ export function ResetMatrixFunctions() {
|
|
|
82
94
|
UniformBufferInternal.prototype._updateMatrixForUniform = OriginalUpdateMatrixForUniform;
|
|
83
95
|
UniformBufferInternal.prototype._updateMatrixForUniformOverride = undefined;
|
|
84
96
|
}
|
|
85
|
-
export function OverrideMatrixFunctions(
|
|
86
|
-
EffectInternal.prototype._setMatrixOverride =
|
|
97
|
+
export function OverrideMatrixFunctions() {
|
|
98
|
+
EffectInternal.prototype._setMatrixOverride = OriginalSetMatrix;
|
|
87
99
|
EffectInternal.prototype.setMatrix = function (uniformName, matrix) {
|
|
88
|
-
this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix
|
|
100
|
+
this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix));
|
|
89
101
|
return this;
|
|
90
102
|
};
|
|
91
|
-
UniformBufferInternal.prototype._updateMatrixForUniformOverride =
|
|
103
|
+
UniformBufferInternal.prototype._updateMatrixForUniformOverride = OriginalUpdateMatrixForUniform;
|
|
92
104
|
UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName, matrix) {
|
|
93
|
-
this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix
|
|
105
|
+
this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix));
|
|
94
106
|
};
|
|
95
107
|
}
|
|
96
108
|
//# sourceMappingURL=floatingOriginMatrixOverrides.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floatingOriginMatrixOverrides.js","sourceRoot":"","sources":["../../../../dev/core/src/Materials/floatingOriginMatrixOverrides.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAGxG,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,MAAM,YAAY,GAAW,IAAI,MAAM,EAAE,CAAC;AAC1C,MAAM,QAAQ,GAAW,IAAI,MAAM,EAAE,CAAC;AACtC,MAAM,QAAQ,GAAW,IAAI,MAAM,EAAE,CAAC;AAEtC,SAAS,gBAAgB,CAAC,MAAoB,EAAE,KAAiC,EAAE,GAAW;IAC1F,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,IAAgC,EAAE,GAAW;IAClE,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAgC,EAAE,UAAsC,EAAE,GAAW;IACpH,qBAAqB,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;IACnE,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAoB,EAAE,SAAqC,EAAE,IAAgC,EAAE,GAAW;IACpI,8CAA8C;IAC9C,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,yBAAyB;IAC5D,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,2CAA2C;IAEjG,iDAAiD;IACjD,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,yBAAyB;IACvE,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,wBAAwB;IACzD,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE/C,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,8BAA8B,CACnC,MAAoB,EACpB,mBAA+C,EAC/C,cAA0C,EAC1C,IAAgC,EAChC,UAAsC,EACtC,GAAgB;IAEhB,8EAA8E;IAC9E,sEAAsE;IACtE,iBAAiB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,yCAAyC;IACtF,qBAAqB,CAAC,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,2CAA2C;IAE3G,qEAAqE;IACrE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,yBAAyB;IACvE,yBAAyB,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,kCAAkC;IACzF,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAE/C,OAAO,GAAG,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,WAAmB,EAAE,GAAgB,EAAE,KAAY;IACxE,YAAY,CAAC,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IACzC,QAAQ,WAAW,EAAE,CAAC;QAClB,KAAK,OAAO;YACR,OAAO,gBAAgB,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3E,KAAK,MAAM;YACP,OAAO,eAAe,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC9C,KAAK,WAAW;YACZ,OAAO,oBAAoB,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;QACtG,KAAK,gBAAgB;YACjB,OAAO,yBAAyB,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;QACvG,KAAK,qBAAqB;YACtB,OAAO,8BAA8B,CAAC,KAAK,CAAC,oBAAoB,EAAE,GAAG,EAAE,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC,aAAa,EAAE,EAAE,KAAK,CAAC,mBAAmB,EAAE,EAAE,YAAY,CAAC,CAAC;QACzK;YACI,OAAO,GAAG,CAAC;IACnB,CAAC;AACL,CAAC;AAED,wFAAwF;AACxF,MAAM,qBAAqB,GAAG,aAAoB,CAAC;AACnD,MAAM,cAAc,GAAG,MAAa,CAAC;AACrC,MAAM,8BAA8B,GAAG,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,CAAC;AAC/F,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;AAErD,MAAM,UAAU,oBAAoB;IAChC,MAAM,CAAC,SAAS,CAAC,SAAS,GAAG,iBAAiB,CAAC;IAC/C,cAAc,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAC9C,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,GAAG,8BAA8B,CAAC;IACzF,qBAAqB,CAAC,SAAS,CAAC,+BAA+B,GAAG,SAAS,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAY;IAChD,cAAc,CAAC,SAAS,CAAC,kBAAkB,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC;IACzE,cAAc,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,WAAmB,EAAE,MAAmB;QACnF,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,qBAAqB,CAAC,SAAS,CAAC,+BAA+B,GAAG,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,CAAC;IAC1H,qBAAqB,CAAC,SAAS,CAAC,uBAAuB,GAAG,UAAU,WAAmB,EAAE,MAAmB;QACxG,IAAI,CAAC,+BAA+B,CAAC,WAAW,EAAE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACnG,CAAC,CAAC;AACN,CAAC","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\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, scene: Scene): IMatrixLike {\r\n TempFinalMat.updateFlag = mat.updateFlag;\r\n switch (uniformName) {\r\n case \"world\":\r\n return OffsetWorldToRef(scene.floatingOriginOffset, mat, TempFinalMat);\r\n case \"view\":\r\n return OffsetViewToRef(mat, TempFinalMat);\r\n case \"worldView\":\r\n return OffsetWorldViewToRef(scene.floatingOriginOffset, 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(scene.floatingOriginOffset, 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(scene: Scene) {\r\n EffectInternal.prototype._setMatrixOverride = Effect.prototype.setMatrix;\r\n EffectInternal.prototype.setMatrix = function (uniformName: string, matrix: IMatrixLike) {\r\n this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix, scene));\r\n return this;\r\n };\r\n UniformBufferInternal.prototype._updateMatrixForUniformOverride = UniformBufferInternal.prototype._updateMatrixForUniform;\r\n UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName: string, matrix: IMatrixLike) {\r\n this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix, scene));\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 * 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"]}
|
package/package.json
CHANGED
package/scene.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ import type { IAnimatable } from "./Animations/animatable.interface.js";
|
|
|
3
3
|
import { Observable } from "./Misc/observable.js";
|
|
4
4
|
import type { ISmartArrayLike } from "./Misc/smartArray.js";
|
|
5
5
|
import { SmartArrayNoDuplicate, SmartArray } from "./Misc/smartArray.js";
|
|
6
|
-
import type { Vector2
|
|
7
|
-
import { Vector3, Matrix } from "./Maths/math.vector.js";
|
|
6
|
+
import type { Vector2 } from "./Maths/math.vector.js";
|
|
7
|
+
import { Vector3, Vector4, Matrix } from "./Maths/math.vector.js";
|
|
8
8
|
import type { IParticleSystem } from "./Particles/IParticleSystem.js";
|
|
9
9
|
import { ImageProcessingConfiguration } from "./Materials/imageProcessingConfiguration.js";
|
|
10
10
|
import { UniformBuffer } from "./Materials/uniformBuffer.js";
|
|
@@ -88,15 +88,17 @@ export interface SceneOptions {
|
|
|
88
88
|
* It will improve performance when the number of mesh becomes important, but might consume a bit more memory
|
|
89
89
|
*/
|
|
90
90
|
useClonedMeshMap?: boolean;
|
|
91
|
-
/** Defines if the creation of the scene should impact the engine (Eg. UtilityLayer's scene) */
|
|
92
|
-
virtual?: boolean;
|
|
93
91
|
/**
|
|
94
92
|
* @experimental
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
93
|
+
* When enabled, the scene can handle large world coordinate rendering without jittering caused by floating point imprecision on the GPU.
|
|
94
|
+
* This mode offsets matrices and position-related attribute values before passing to shaders, centering camera at origin and offsetting other scene objects by camera active position.
|
|
95
|
+
*
|
|
96
|
+
* IMPORTANT: Only use this scene-level option if you intend to enable floating origin on a per-scene basis. Must use in conjunction with engine creation option 'useHighPrecisionMatrix' to fix CPU-side floating point imprecision.
|
|
97
|
+
* HOWEVER if you want largeWorldRendering on ALL scenes, set the useLargeWorldRendering flag on the engine instead of this scene-level flag. Doing so will automatically set useHighPrecisionMatrix on the engine as well.
|
|
98
98
|
*/
|
|
99
|
-
|
|
99
|
+
useFloatingOrigin?: boolean;
|
|
100
|
+
/** Defines if the creation of the scene should impact the engine (Eg. UtilityLayer's scene) */
|
|
101
|
+
virtual?: boolean;
|
|
100
102
|
}
|
|
101
103
|
/**
|
|
102
104
|
* Define how the scene should favor performance over ease of use
|
|
@@ -167,6 +169,7 @@ export declare class Scene implements IAnimatable, IClipPlanesHolder, IAssetCont
|
|
|
167
169
|
*/
|
|
168
170
|
autoClearDepthAndStencil: boolean;
|
|
169
171
|
private _clearColor;
|
|
172
|
+
private _tempVect4;
|
|
170
173
|
/**
|
|
171
174
|
* Observable triggered when the performance priority is changed
|
|
172
175
|
*/
|
|
@@ -1592,12 +1595,11 @@ export declare class Scene implements IAnimatable, IClipPlanesHolder, IAssetCont
|
|
|
1592
1595
|
* @param ubo the ubo to set for the scene
|
|
1593
1596
|
*/
|
|
1594
1597
|
setSceneUniformBuffer(ubo: UniformBuffer): void;
|
|
1595
|
-
private
|
|
1598
|
+
private _floatingOriginScene;
|
|
1596
1599
|
/**
|
|
1597
1600
|
* @experimental
|
|
1598
|
-
*
|
|
1599
|
-
*
|
|
1600
|
-
* 2. Offsetting uniform values before passing to shader so that camera is centered at origin and world is offset by camera position
|
|
1601
|
+
* True if floatingOriginMode was passed to engine or this scene creation otions.
|
|
1602
|
+
* This mode avoids floating point imprecision in huge coordinate system by offsetting uniform values before passing to shader, centering camera at origin and displacing rest of scene by camera position
|
|
1601
1603
|
*/
|
|
1602
1604
|
get floatingOriginMode(): boolean;
|
|
1603
1605
|
private _floatingOriginOffsetDefault;
|
|
@@ -2251,6 +2253,7 @@ export declare class Scene implements IAnimatable, IClipPlanesHolder, IAssetCont
|
|
|
2251
2253
|
* @internal
|
|
2252
2254
|
*/
|
|
2253
2255
|
_renderRenderTarget(renderTarget: RenderTargetTexture, activeCamera: Nullable<Camera>, useCameraPostProcess?: boolean, dumpForDebug?: boolean): void;
|
|
2256
|
+
private _getFloatingOriginScene;
|
|
2254
2257
|
/**
|
|
2255
2258
|
* Render the scene
|
|
2256
2259
|
* @param updateCameras defines a boolean indicating if cameras must update according to their inputs (true by default)
|
package/scene.js
CHANGED
|
@@ -4,13 +4,13 @@ import { Observable } from "./Misc/observable.js";
|
|
|
4
4
|
import { SmartArrayNoDuplicate, SmartArray } from "./Misc/smartArray.js";
|
|
5
5
|
import { StringDictionary } from "./Misc/stringDictionary.js";
|
|
6
6
|
import { Tags } from "./Misc/tags.js";
|
|
7
|
-
import { Vector3, Matrix, TmpVectors } from "./Maths/math.vector.js";
|
|
7
|
+
import { Vector3, Vector4, Matrix, TmpVectors } from "./Maths/math.vector.js";
|
|
8
8
|
import { ImageProcessingConfiguration } from "./Materials/imageProcessingConfiguration.js";
|
|
9
9
|
import { UniformBuffer } from "./Materials/uniformBuffer.js";
|
|
10
10
|
import { PickingInfo } from "./Collisions/pickingInfo.js";
|
|
11
11
|
import { ActionEvent } from "./Actions/actionEvent.js";
|
|
12
12
|
import { PostProcessManager } from "./PostProcesses/postProcessManager.js";
|
|
13
|
-
import { OverrideMatrixFunctions, ResetMatrixFunctions } from "./Materials/floatingOriginMatrixOverrides.js";
|
|
13
|
+
import { FloatingOriginCurrentScene, OverrideMatrixFunctions, ResetMatrixFunctions } from "./Materials/floatingOriginMatrixOverrides.js";
|
|
14
14
|
import { RenderingManager } from "./Rendering/renderingManager.js";
|
|
15
15
|
import { Stage } from "./sceneComponent.js";
|
|
16
16
|
|
|
@@ -377,16 +377,18 @@ export class Scene {
|
|
|
377
377
|
: (this.activeCamera?.globalPosition ?? Vector3.ZeroReadOnly);
|
|
378
378
|
const invertNormal = this.useRightHandedSystem === (this._mirroredCameraPosition != null);
|
|
379
379
|
const offset = this.floatingOriginOffset;
|
|
380
|
-
const
|
|
380
|
+
const eyePos = this._tempVect4.set(eyePosition.x, eyePosition.y, eyePosition.z, invertNormal ? -1 : 1);
|
|
381
|
+
const offsetEyePos = eyePos.subtractFromFloatsToRef(offset.x, offset.y, offset.z, 0, TmpVectors.Vector4[1]);
|
|
381
382
|
if (effect) {
|
|
382
383
|
if (isVector3) {
|
|
383
|
-
effect.setFloat3(variableName,
|
|
384
|
+
effect.setFloat3(variableName, offsetEyePos.x, offsetEyePos.y, offsetEyePos.z);
|
|
384
385
|
}
|
|
385
386
|
else {
|
|
386
|
-
effect.setVector4(variableName,
|
|
387
|
+
effect.setVector4(variableName, offsetEyePos);
|
|
387
388
|
}
|
|
388
389
|
}
|
|
389
|
-
|
|
390
|
+
// Return the non-offset position
|
|
391
|
+
return eyePos;
|
|
390
392
|
}
|
|
391
393
|
/**
|
|
392
394
|
* Update the scene ubo before it can be used in rendering processing
|
|
@@ -683,6 +685,7 @@ export class Scene {
|
|
|
683
685
|
*/
|
|
684
686
|
this.autoClearDepthAndStencil = true;
|
|
685
687
|
this._clearColor = new Color4(0.2, 0.2, 0.3, 1.0);
|
|
688
|
+
this._tempVect4 = new Vector4();
|
|
686
689
|
/**
|
|
687
690
|
* Observable triggered when the performance priority is changed
|
|
688
691
|
*/
|
|
@@ -1453,7 +1456,7 @@ export class Scene {
|
|
|
1453
1456
|
data: [],
|
|
1454
1457
|
length: 0,
|
|
1455
1458
|
};
|
|
1456
|
-
this.
|
|
1459
|
+
this._floatingOriginScene = undefined;
|
|
1457
1460
|
this._floatingOriginOffsetDefault = Vector3.Zero();
|
|
1458
1461
|
this._preventFreeActiveMeshesAndRenderingGroups = false;
|
|
1459
1462
|
/** @internal */
|
|
@@ -1473,6 +1476,9 @@ export class Scene {
|
|
|
1473
1476
|
this.getDeterministicFrameTime = () => {
|
|
1474
1477
|
return this._engine.getTimeStep();
|
|
1475
1478
|
};
|
|
1479
|
+
this._getFloatingOriginScene = () => {
|
|
1480
|
+
return this._floatingOriginScene;
|
|
1481
|
+
};
|
|
1476
1482
|
/** @internal */
|
|
1477
1483
|
this._registeredActions = 0;
|
|
1478
1484
|
this._blockMaterialDirtyMechanism = false;
|
|
@@ -1498,10 +1504,9 @@ export class Scene {
|
|
|
1498
1504
|
EngineStore._LastCreatedScene = this;
|
|
1499
1505
|
engine.scenes.push(this);
|
|
1500
1506
|
}
|
|
1501
|
-
if (options?.
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
this._floatingOriginMode = true;
|
|
1507
|
+
if (engine.getCreationOptions().useLargeWorldRendering || options?.useFloatingOrigin) {
|
|
1508
|
+
OverrideMatrixFunctions();
|
|
1509
|
+
this._floatingOriginScene = this;
|
|
1505
1510
|
}
|
|
1506
1511
|
this._uid = null;
|
|
1507
1512
|
this._renderingManager = new RenderingManager(this);
|
|
@@ -2148,12 +2153,11 @@ export class Scene {
|
|
|
2148
2153
|
}
|
|
2149
2154
|
/**
|
|
2150
2155
|
* @experimental
|
|
2151
|
-
*
|
|
2152
|
-
*
|
|
2153
|
-
* 2. Offsetting uniform values before passing to shader so that camera is centered at origin and world is offset by camera position
|
|
2156
|
+
* True if floatingOriginMode was passed to engine or this scene creation otions.
|
|
2157
|
+
* This mode avoids floating point imprecision in huge coordinate system by offsetting uniform values before passing to shader, centering camera at origin and displacing rest of scene by camera position
|
|
2154
2158
|
*/
|
|
2155
2159
|
get floatingOriginMode() {
|
|
2156
|
-
return this.
|
|
2160
|
+
return this._floatingOriginScene !== undefined;
|
|
2157
2161
|
}
|
|
2158
2162
|
/**
|
|
2159
2163
|
* @experimental
|
|
@@ -4322,6 +4326,8 @@ export class Scene {
|
|
|
4322
4326
|
if (this.onReadyObservable.hasObservers() && this._executeWhenReadyTimeoutId === null) {
|
|
4323
4327
|
this._checkIsReady();
|
|
4324
4328
|
}
|
|
4329
|
+
// Ensures that the floatingOriginOffset is grabbed from the correct scene
|
|
4330
|
+
FloatingOriginCurrentScene.getScene = this._getFloatingOriginScene;
|
|
4325
4331
|
this._frameId++;
|
|
4326
4332
|
this._defaultFrameBufferCleared = false;
|
|
4327
4333
|
this._checkCameraRenderTarget(this.activeCamera);
|
|
@@ -4596,6 +4602,12 @@ export class Scene {
|
|
|
4596
4602
|
if (index > -1) {
|
|
4597
4603
|
this._engine.scenes.splice(index, 1);
|
|
4598
4604
|
}
|
|
4605
|
+
this._floatingOriginScene = undefined;
|
|
4606
|
+
if (this._engine.scenes.length === 0) {
|
|
4607
|
+
// If this is the last scene to be disposed, reset matrix overrides
|
|
4608
|
+
// Cannot reset from within engine class due floatingOriginMatrixOverrides file import side effects
|
|
4609
|
+
ResetMatrixFunctions();
|
|
4610
|
+
}
|
|
4599
4611
|
if (EngineStore._LastCreatedScene === this) {
|
|
4600
4612
|
EngineStore._LastCreatedScene = null;
|
|
4601
4613
|
let engineIndex = EngineStore.Instances.length - 1;
|
|
@@ -4667,7 +4679,6 @@ export class Scene {
|
|
|
4667
4679
|
this.onClearColorChangedObservable.clear();
|
|
4668
4680
|
this.onEnvironmentTextureChangedObservable.clear();
|
|
4669
4681
|
this.onMeshUnderPointerUpdatedObservable.clear();
|
|
4670
|
-
ResetMatrixFunctions();
|
|
4671
4682
|
this._isDisposed = true;
|
|
4672
4683
|
}
|
|
4673
4684
|
_disposeList(items, callback) {
|