@onerjs/core 8.29.1 → 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.
@@ -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(scene: Scene): void;
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, scene) {
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(scene.floatingOriginOffset, mat, TempFinalMat);
73
+ return OffsetWorldToRef(offset, mat, TempFinalMat);
62
74
  case "view":
63
75
  return OffsetViewToRef(mat, TempFinalMat);
64
76
  case "worldView":
65
- return OffsetWorldViewToRef(scene.floatingOriginOffset, mat, scene.getViewMatrix(), TempFinalMat);
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(scene.floatingOriginOffset, mat, scene.getTransformMatrix(), scene.getViewMatrix(), scene.getProjectionMatrix(), TempFinalMat);
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(scene) {
86
- EffectInternal.prototype._setMatrixOverride = Effect.prototype.setMatrix;
97
+ export function OverrideMatrixFunctions() {
98
+ EffectInternal.prototype._setMatrixOverride = OriginalSetMatrix;
87
99
  EffectInternal.prototype.setMatrix = function (uniformName, matrix) {
88
- this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix, scene));
100
+ this._setMatrixOverride(uniformName, GetOffsetMatrix(uniformName, matrix));
89
101
  return this;
90
102
  };
91
- UniformBufferInternal.prototype._updateMatrixForUniformOverride = UniformBufferInternal.prototype._updateMatrixForUniform;
103
+ UniformBufferInternal.prototype._updateMatrixForUniformOverride = OriginalUpdateMatrixForUniform;
92
104
  UniformBufferInternal.prototype._updateMatrixForUniform = function (uniformName, matrix) {
93
- this._updateMatrixForUniformOverride(uniformName, GetOffsetMatrix(uniformName, matrix, scene));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onerjs/core",
3
- "version": "8.29.1",
3
+ "version": "8.29.2",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",
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, Vector4 } from "./Maths/math.vector.js";
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
- * FloatingOriginMode helps avoid floating point imprecision of rendering large worlds by
96
- * 1. Forcing the engine to use doublePrecision mode
97
- * 2. Offsetting uniform values before passing to shader so that camera is centered at origin and world is offset by camera position
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
- floatingOriginMode?: boolean;
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 _floatingOriginMode;
1598
+ private _floatingOriginScene;
1596
1599
  /**
1597
1600
  * @experimental
1598
- * When true, enables floatingOriginMode which helps avoid floating point imprecision when using huge coordinate system by
1599
- * 1. Forcing the engine to use doublePrecision mode
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 finalEyePos = TmpVectors.Vector4[0].set(eyePosition.x - offset.x, eyePosition.y - offset.y, eyePosition.z - offset.z, invertNormal ? -1 : 1);
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, finalEyePos.x, finalEyePos.y, finalEyePos.z);
384
+ effect.setFloat3(variableName, offsetEyePos.x, offsetEyePos.y, offsetEyePos.z);
384
385
  }
385
386
  else {
386
- effect.setVector4(variableName, finalEyePos);
387
+ effect.setVector4(variableName, offsetEyePos);
387
388
  }
388
389
  }
389
- return TmpVectors.Vector4[0];
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._floatingOriginMode = false;
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?.floatingOriginMode) {
1502
- engine.getCreationOptions().useHighPrecisionMatrix = true;
1503
- OverrideMatrixFunctions(this);
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
- * When true, enables floatingOriginMode which helps avoid floating point imprecision when using huge coordinate system by
2152
- * 1. Forcing the engine to use doublePrecision mode
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._floatingOriginMode;
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) {