@babylonjs/core 7.17.1 → 7.18.0

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.
@@ -84,6 +84,7 @@ export class MeshUVSpaceRenderer {
84
84
  uvEdgeBlending: false,
85
85
  ...options,
86
86
  };
87
+ this._createDiffuseRTT();
87
88
  }
88
89
  /**
89
90
  * Checks if the texture is ready to be used
@@ -1 +1 @@
1
- {"version":3,"file":"meshUVSpaceRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshUVSpaceRenderer.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,gCAA+B;AAChD,OAAO,EAAE,SAAS,EAAE,gCAA+B;AACnD,OAAO,EAAE,cAAc,EAAE,uCAAsC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,qDAAoD;AAClF,OAAO,EAAE,MAAM,EAAE,+BAA8B;AAC/C,OAAO,EAAE,WAAW,EAAE,wCAAuC;AAE7D,OAAO,uCAAuC,CAAC;AAC/C,OAAO,yCAAyC,CAAC;AAEjD,OAAO,6CAA6C,CAAC;AACrD,OAAO,+CAA+C,CAAC;AAEvD,OAAO,kDAAkD,CAAC;AAC1D,OAAO,gDAAgD,CAAC;AA2CxD;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IASpB,MAAM,CAAC,UAAU,CAAC,KAAY;QAClC,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,cAAc,CAC7B,2BAA2B,EAC3B,KAAK,EACL;gBACI,MAAM,EAAE,qBAAqB;gBAC7B,QAAQ,EAAE,qBAAqB;aAClC,EACD;gBACI,UAAU,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC;gBACxC,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;gBACjC,QAAQ,EAAE,CAAC,gBAAgB,CAAC;gBAC5B,iBAAiB,EAAE,IAAI;aAC1B,CACJ,CAAC;YACF,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;YAC/B,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC;YAE3C,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC/B,KAAK,CAAC,0BAA0B,EAAE,OAAO,EAAE,CAAC;gBAC5C,KAAK,CAAC,0BAA0B,GAAG,IAAI,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,0BAA0B,GAAG,MAAM,CAAC;SAC7C;QAED,OAAO,KAAK,CAAC,0BAA0B,CAAC;IAC5C,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,KAAY;QACtC,IAAI,CAAC,KAAK,CAAC,8BAA8B,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,cAAc,CAC7B,+BAA+B,EAC/B,KAAK,EACL;gBACI,MAAM,EAAE,2BAA2B;gBACnC,QAAQ,EAAE,2BAA2B;aACxC,EACD;gBACI,UAAU,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC;gBAC9B,QAAQ,EAAE,CAAC,qBAAqB,CAAC;aACpC,CACJ,CAAC;YACF,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC;YAC/B,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC;YAE3C,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC/B,KAAK,CAAC,8BAA8B,EAAE,OAAO,EAAE,CAAC;gBAChD,KAAK,CAAC,8BAA8B,GAAG,IAAI,CAAC;YAChD,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,8BAA8B,GAAG,MAAM,CAAC;SACjD;QACD,OAAO,KAAK,CAAC,8BAA8B,CAAC;IAChD,CAAC;IAEO,MAAM,CAAC,sBAAsB,CAAC,OAA0C;QAC5E,OAAQ,OAA+B,CAAC,UAAU,KAAK,SAAS,CAAC;IACrE,CAAC;IAcD;;;;;OAKG;IACH,YAAY,IAAkB,EAAE,KAAY,EAAE,OAAqC;QApF3E,8BAAyB,GAAG,KAAK,CAAC;QAClC,iCAA4B,GAAG,IAAI,CAAC;QACpC,iBAAY,GAAkC,IAAI,CAAC;QACnD,sBAAiB,GAA0B,IAAI,CAAC;QA+DxD;;WAEG;QACI,eAAU,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAgBvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG;YACZ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,SAAS,CAAC,yBAAyB;YAChD,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI;YAC1B,cAAc,EAAE,KAAK;YACrB,GAAG,OAAO;SACb,CAAC;IACN,CAAC;IAED;;;OAGG;IACI,OAAO;QACV,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC5B;QAED,MAAM,cAAc,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC9I,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,EAAE,IAAI,IAAI,CAAC;QACrE,MAAM,kBAAkB,GAAG,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC;QAErE,OAAO,cAAc,IAAI,WAAW,IAAI,kBAAkB,CAAC;IAC/D,CAAC;IAED;;;;;;;OAOG;IACI,aAAa,CAAC,OAAoB,EAAE,QAAiB,EAAE,MAAe,EAAE,IAAa,EAAE,KAAK,GAAG,CAAC;QACnG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YACf,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC5B;aAAM,IAAI,IAAI,CAAC,4BAA4B,EAAE;YAC1C,IAAI,CAAC,wBAAwB,EAAE,CAAC;SACnC;QAED,IAAI,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAE3D,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;YAC7C,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;SACzB;IACL,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YACvF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAEvC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;SACvD;QACD,IAAI,IAAI,CAAC,iBAAiB,EAAE,YAAY,EAAE;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAEvC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;YAC7D,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;SAClE;IACL,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,IAAI,CAAC,yBAAyB,EAAE;YAChC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;SAC1C;QACD,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAClC,CAAC;IAEO,wBAAwB;QAC5B,IAAI,CAAC,4BAA4B,GAAG,KAAK,CAAC;QAC1C,IAAI,mBAAmB,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC1D,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9F,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;gBAC9B,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAkB,CAAC,CAAC;aACxD;SACJ;IACL,CAAC;IAEO,iBAAiB;QACrB,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QAEtC,MAAM,OAAO,GAAG,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE3F,OAAO,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,4BAA4B,GAAG,KAAK,CAAC;QAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;YAC9B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAkB,CAAC,CAAC;SACnD;IACL,CAAC;IAEO,kBAAkB;QACtB,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,OAAO;SACV;QAED,IAAI,CAAC,YAAY,GAAG,IAAI,mBAAmB,CACvC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,cAAc,EAChC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAC5D,IAAI,CAAC,MAAM,EACX,KAAK,EAAE,kCAAkC;QACzC,IAAI,EACJ,SAAS,CAAC,yBAAyB,EACnC,KAAK,EACL,SAAS,CAAC,6BAA6B,EACvC,SAAS,EACT,SAAS,EACT,SAAS,EACT,SAAS,CAAC,eAAe,CAC5B,CAAC;QAEF,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtD,6DAA6D;QAC7D,IAAI,CAAC,YAAY,CAAC,UAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAE,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAEvG,qCAAqC;QACrC,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,mBAAmB,CAAC,uBAAuB,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5D,CAAC;IAEO,kBAAkB;QACtB,IAAI,IAAI,CAAC,iBAAiB,EAAE;YACxB,OAAO;SACV;QAED,IAAI,CAAC,iBAAiB,GAAG,IAAI,WAAW,CACpC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,sBAAsB,EACxC,8BAA8B,EAC9B,CAAC,aAAa,CAAC,EACf,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,EACxC,GAAG,EACH,IAAI,EACJ,SAAS,CAAC,4BAA4B,EACtC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EACvB,KAAK,EACL,IAAI,EACJ,IAAI,CAAC,QAAQ,CAAC,WAAW,CAC5B,CAAC;QAEF,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACpD,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3D,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,0BAA0B,CAAC,KAAa,EAAE,MAAc;QAC5D,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,iBAAiB,EACnC,EAAE,KAAK,EAAE,MAAM,EAAE,EACjB,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,QAAQ,CAAC,eAAe,EAC7B,IAAI,EACJ,IAAI,CAAC,QAAQ,CAAC,WAAW,EACzB,KAAK,EACL,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC,CAAC,SAAS,CAAC,6BAA6B,EAClH,KAAK,EACL,KAAK,EACL,KAAK,EACL,SAAS,CAAC,kBAAkB,CAC/B,CAAC;QAEF,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC;QAC5B,GAAG,CAAC,oBAAoB,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAEhE,GAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE;YAC/B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACjE,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,yDAAyD;QAClG,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE9B,OAAO,GAAG,CAAC;IACf,CAAC;IAEO,uBAAuB,CAAC,QAAiB,EAAE,MAAe,EAAE,IAAa,EAAE,KAAK,GAAG,CAAC;QACxF,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAExC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAEnD,MAAM,eAAe,GAAG,MAAM,CAAC,oBAAoB,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnH,MAAM,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAE9D,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEjH,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAElG,OAAO,sBAAsB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9E,CAAC;CACJ","sourcesContent":["import type { Texture } from \"core/Materials/Textures/texture\";\r\nimport type { Vector3 } from \"core/Maths/math.vector\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { AbstractMesh } from \"./abstractMesh\";\r\nimport type { ThinTexture } from \"core/Materials/Textures/thinTexture\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\n\r\nimport \"../Shaders/meshUVSpaceRenderer.vertex\";\r\nimport \"../Shaders/meshUVSpaceRenderer.fragment\";\r\n\r\nimport \"../Shaders/meshUVSpaceRendererMasker.vertex\";\r\nimport \"../Shaders/meshUVSpaceRendererMasker.fragment\";\r\n\r\nimport \"../Shaders/meshUVSpaceRendererFinaliser.fragment\";\r\nimport \"../Shaders/meshUVSpaceRendererFinaliser.vertex\";\r\n\r\ndeclare module \"../scene\" {\r\n export interface Scene {\r\n /** @internal */\r\n _meshUVSpaceRendererShader: Nullable<ShaderMaterial>;\r\n /** @internal */\r\n _meshUVSpaceRendererMaskShader: Nullable<ShaderMaterial>;\r\n }\r\n}\r\n\r\n/**\r\n * Options for the MeshUVSpaceRenderer\r\n * @since 5.49.1\r\n */\r\nexport interface IMeshUVSpaceRendererOptions {\r\n /**\r\n * Width of the texture. Default: 1024\r\n */\r\n width?: number;\r\n /**\r\n * Height of the texture. Default: 1024\r\n */\r\n height?: number;\r\n /**\r\n * Type of the texture. Default: Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n */\r\n textureType?: number;\r\n /**\r\n * Generate mip maps. Default: true\r\n */\r\n generateMipMaps?: boolean;\r\n /**\r\n * Optimize UV allocation. Default: true\r\n * If you plan to use the texture as a decal map and rotate / offset the texture, you should set this to false\r\n */\r\n optimizeUVAllocation?: boolean;\r\n /**\r\n * If true, a post processing effect will be applied to the texture to fix seams. Default: false\r\n */\r\n uvEdgeBlending?: boolean;\r\n}\r\n\r\n/**\r\n * Class used to render in the mesh UV space\r\n * @since 5.49.1\r\n */\r\nexport class MeshUVSpaceRenderer {\r\n private _mesh: AbstractMesh;\r\n private _scene: Scene;\r\n private _options: Required<IMeshUVSpaceRendererOptions>;\r\n private _textureCreatedInternally = false;\r\n private _configureUserCreatedTexture = true;\r\n private _maskTexture: Nullable<RenderTargetTexture> = null;\r\n private _finalPostProcess: Nullable<PostProcess> = null;\r\n\r\n private static _GetShader(scene: Scene): ShaderMaterial {\r\n if (!scene._meshUVSpaceRendererShader) {\r\n const shader = new ShaderMaterial(\r\n \"meshUVSpaceRendererShader\",\r\n scene,\r\n {\r\n vertex: \"meshUVSpaceRenderer\",\r\n fragment: \"meshUVSpaceRenderer\",\r\n },\r\n {\r\n attributes: [\"position\", \"normal\", \"uv\"],\r\n uniforms: [\"world\", \"projMatrix\"],\r\n samplers: [\"textureSampler\"],\r\n needAlphaBlending: true,\r\n }\r\n );\r\n shader.backFaceCulling = false;\r\n shader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n scene.onDisposeObservable.add(() => {\r\n scene._meshUVSpaceRendererShader?.dispose();\r\n scene._meshUVSpaceRendererShader = null;\r\n });\r\n\r\n scene._meshUVSpaceRendererShader = shader;\r\n }\r\n\r\n return scene._meshUVSpaceRendererShader;\r\n }\r\n\r\n private static _GetMaskShader(scene: Scene): ShaderMaterial {\r\n if (!scene._meshUVSpaceRendererMaskShader) {\r\n const shader = new ShaderMaterial(\r\n \"meshUVSpaceRendererMaskShader\",\r\n scene,\r\n {\r\n vertex: \"meshUVSpaceRendererMasker\",\r\n fragment: \"meshUVSpaceRendererMasker\",\r\n },\r\n {\r\n attributes: [\"position\", \"uv\"],\r\n uniforms: [\"worldViewProjection\"],\r\n }\r\n );\r\n shader.backFaceCulling = false;\r\n shader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n scene.onDisposeObservable.add(() => {\r\n scene._meshUVSpaceRendererMaskShader?.dispose();\r\n scene._meshUVSpaceRendererMaskShader = null;\r\n });\r\n\r\n scene._meshUVSpaceRendererMaskShader = shader;\r\n }\r\n return scene._meshUVSpaceRendererMaskShader;\r\n }\r\n\r\n private static _IsRenderTargetTexture(texture: ThinTexture | RenderTargetTexture): texture is RenderTargetTexture {\r\n return (texture as RenderTargetTexture).renderList !== undefined;\r\n }\r\n\r\n /**\r\n * Clear color of the texture\r\n */\r\n public clearColor = new Color4(0, 0, 0, 0);\r\n\r\n /**\r\n * Target texture used for rendering\r\n * If you don't set the property, a RenderTargetTexture will be created internally given the options provided to the constructor.\r\n * If you provide a RenderTargetTexture, it will be used directly.\r\n */\r\n public texture: Texture;\r\n\r\n /**\r\n * Creates a new MeshUVSpaceRenderer\r\n * @param mesh The mesh used for the source UV space\r\n * @param scene The scene the mesh belongs to\r\n * @param options The options to use when creating the texture\r\n */\r\n constructor(mesh: AbstractMesh, scene: Scene, options?: IMeshUVSpaceRendererOptions) {\r\n this._mesh = mesh;\r\n this._scene = scene;\r\n this._options = {\r\n width: 1024,\r\n height: 1024,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n generateMipMaps: true,\r\n optimizeUVAllocation: true,\r\n uvEdgeBlending: false,\r\n ...options,\r\n };\r\n }\r\n\r\n /**\r\n * Checks if the texture is ready to be used\r\n * @returns true if the texture is ready to be used\r\n */\r\n public isReady(): boolean {\r\n if (!this.texture) {\r\n this._createDiffuseRTT();\r\n }\r\n\r\n const textureIsReady = MeshUVSpaceRenderer._IsRenderTargetTexture(this.texture) ? this.texture.isReadyForRendering() : this.texture.isReady();\r\n const maskIsReady = this._maskTexture?.isReadyForRendering() ?? true;\r\n const postProcessIsReady = this._finalPostProcess?.isReady() ?? true;\r\n\r\n return textureIsReady && maskIsReady && postProcessIsReady;\r\n }\r\n\r\n /**\r\n * Projects and renders a texture in the mesh UV space\r\n * @param texture The texture\r\n * @param position The position of the center of projection (world space coordinates)\r\n * @param normal The direction of the projection (world space coordinates)\r\n * @param size The size of the projection\r\n * @param angle The rotation angle around the direction of the projection\r\n */\r\n public renderTexture(texture: BaseTexture, position: Vector3, normal: Vector3, size: Vector3, angle = 0): void {\r\n if (!this.texture) {\r\n this._createDiffuseRTT();\r\n } else if (this._configureUserCreatedTexture) {\r\n this._configureUserCreatedRTT();\r\n }\r\n\r\n if (MeshUVSpaceRenderer._IsRenderTargetTexture(this.texture)) {\r\n const matrix = this._createProjectionMatrix(position, normal, size, angle);\r\n const shader = MeshUVSpaceRenderer._GetShader(this._scene);\r\n\r\n shader.setTexture(\"textureSampler\", texture);\r\n shader.setMatrix(\"projMatrix\", matrix);\r\n\r\n this.texture.render();\r\n }\r\n }\r\n\r\n /**\r\n * Clears the texture map\r\n */\r\n public clear(): void {\r\n if (MeshUVSpaceRenderer._IsRenderTargetTexture(this.texture) && this.texture.renderTarget) {\r\n const engine = this._scene.getEngine();\r\n\r\n engine.bindFramebuffer(this.texture.renderTarget);\r\n engine.clear(this.clearColor, true, true, true);\r\n engine.unBindFramebuffer(this.texture.renderTarget);\r\n }\r\n if (this._finalPostProcess?.inputTexture) {\r\n const engine = this._scene.getEngine();\r\n\r\n engine.bindFramebuffer(this._finalPostProcess?.inputTexture);\r\n engine.clear(this.clearColor, true, true, true);\r\n engine.unBindFramebuffer(this._finalPostProcess?.inputTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the resources\r\n */\r\n public dispose() {\r\n if (this._textureCreatedInternally) {\r\n this.texture.dispose();\r\n this._textureCreatedInternally = false;\r\n }\r\n this._configureUserCreatedTexture = true;\r\n this._maskTexture?.dispose();\r\n this._maskTexture = null;\r\n this._finalPostProcess?.dispose();\r\n this._finalPostProcess = null;\r\n }\r\n\r\n private _configureUserCreatedRTT(): void {\r\n this._configureUserCreatedTexture = false;\r\n if (MeshUVSpaceRenderer._IsRenderTargetTexture(this.texture)) {\r\n this.texture.setMaterialForRendering(this._mesh, MeshUVSpaceRenderer._GetShader(this._scene));\r\n this.texture.onClearObservable.add(() => {});\r\n this.texture.renderList = [this._mesh];\r\n if (this._options.uvEdgeBlending) {\r\n this._createMaskTexture();\r\n this._createPostProcess();\r\n this.texture.addPostProcess(this._finalPostProcess!);\r\n }\r\n }\r\n }\r\n\r\n private _createDiffuseRTT(): void {\r\n this._textureCreatedInternally = true;\r\n\r\n const texture = this._createRenderTargetTexture(this._options.width, this._options.height);\r\n\r\n texture.setMaterialForRendering(this._mesh, MeshUVSpaceRenderer._GetShader(this._scene));\r\n\r\n this.texture = texture;\r\n this._configureUserCreatedTexture = false;\r\n if (this._options.uvEdgeBlending) {\r\n this._createMaskTexture();\r\n this._createPostProcess();\r\n texture.addPostProcess(this._finalPostProcess!);\r\n }\r\n }\r\n\r\n private _createMaskTexture(): void {\r\n if (this._maskTexture) {\r\n return;\r\n }\r\n\r\n this._maskTexture = new RenderTargetTexture(\r\n this._mesh.name + \"_maskTexture\",\r\n { width: this._options.width, height: this._options.height },\r\n this._scene,\r\n false, // No mipmaps for the mask texture\r\n true,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n false,\r\n Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_R\r\n );\r\n\r\n this._maskTexture.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n // Render the mesh with the mask material to the mask texture\r\n this._maskTexture.renderList!.push(this._mesh);\r\n this._maskTexture.setMaterialForRendering(this._mesh, MeshUVSpaceRenderer._GetMaskShader(this._scene));\r\n\r\n // Ensure the mask texture is updated\r\n this._maskTexture.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n this._scene.customRenderTargets.push(this._maskTexture);\r\n }\r\n\r\n private _createPostProcess(): void {\r\n if (this._finalPostProcess) {\r\n return;\r\n }\r\n\r\n this._finalPostProcess = new PostProcess(\r\n this._mesh.name + \"_fixSeamsPostProcess\",\r\n \"meshUVSpaceRendererFinaliser\",\r\n [\"textureSize\"],\r\n [\"textureSampler\", \"maskTextureSampler\"],\r\n 1.0,\r\n null,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n this._scene.getEngine(),\r\n false,\r\n null,\r\n this._options.textureType\r\n );\r\n\r\n this._finalPostProcess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\"maskTextureSampler\", this._maskTexture);\r\n effect.setFloat2(\"textureSize\", this._options.width, this._options.height);\r\n });\r\n }\r\n\r\n private _createRenderTargetTexture(width: number, height: number): RenderTargetTexture {\r\n const rtt = new RenderTargetTexture(\r\n this._mesh.name + \"_uvspaceTexture\",\r\n { width, height },\r\n this._scene,\r\n this._options.generateMipMaps,\r\n true,\r\n this._options.textureType,\r\n false,\r\n this._options.generateMipMaps ? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE : Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n false,\r\n false,\r\n false,\r\n Constants.TEXTUREFORMAT_RGBA\r\n );\r\n\r\n rtt.renderParticles = false;\r\n rtt.optimizeUVAllocation = !!this._options.optimizeUVAllocation;\r\n\r\n rtt.onClearObservable.addOnce(() => {\r\n this._scene.getEngine().clear(this.clearColor, true, true, true);\r\n rtt.onClearObservable.add(() => {}); // this disables clearing the texture for the next frames\r\n });\r\n\r\n rtt.renderList = [this._mesh];\r\n\r\n return rtt;\r\n }\r\n\r\n private _createProjectionMatrix(position: Vector3, normal: Vector3, size: Vector3, angle = 0): Matrix {\r\n const yaw = -Math.atan2(normal.z, normal.x) - Math.PI / 2;\r\n const len = Math.sqrt(normal.x * normal.x + normal.z * normal.z);\r\n const pitch = Math.atan2(normal.y, len);\r\n\r\n const p = position.add(normal.scale(size.z * 0.5));\r\n\r\n const projWorldMatrix = Matrix.RotationYawPitchRoll(yaw, pitch, angle).multiply(Matrix.Translation(p.x, p.y, p.z));\r\n const inverseProjWorldMatrix = Matrix.Invert(projWorldMatrix);\r\n\r\n const projMatrix = Matrix.FromArray([2 / size.x, 0, 0, 0, 0, 2 / size.y, 0, 0, 0, 0, 1 / size.z, 0, 0, 0, 0, 1]);\r\n\r\n const screenMatrix = Matrix.FromArray([0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 1, 0, 0.5, 0.5, 0.0, 1]);\r\n\r\n return inverseProjWorldMatrix.multiply(projMatrix).multiply(screenMatrix);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"meshUVSpaceRenderer.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/meshUVSpaceRenderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Texture } from \"core/Materials/Textures/texture\";\r\nimport type { Vector3 } from \"core/Maths/math.vector\";\r\nimport type { Scene } from \"core/scene\";\r\nimport type { AbstractMesh } from \"./abstractMesh\";\r\nimport type { ThinTexture } from \"core/Materials/Textures/thinTexture\";\r\nimport type { BaseTexture } from \"core/Materials/Textures/baseTexture\";\r\nimport type { Nullable } from \"core/types\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport { Constants } from \"core/Engines/constants\";\r\nimport { ShaderMaterial } from \"core/Materials/shaderMaterial\";\r\nimport { RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\r\nimport { Color4 } from \"core/Maths/math.color\";\r\nimport { PostProcess } from \"core/PostProcesses/postProcess\";\r\n\r\nimport \"../Shaders/meshUVSpaceRenderer.vertex\";\r\nimport \"../Shaders/meshUVSpaceRenderer.fragment\";\r\n\r\nimport \"../Shaders/meshUVSpaceRendererMasker.vertex\";\r\nimport \"../Shaders/meshUVSpaceRendererMasker.fragment\";\r\n\r\nimport \"../Shaders/meshUVSpaceRendererFinaliser.fragment\";\r\nimport \"../Shaders/meshUVSpaceRendererFinaliser.vertex\";\r\n\r\ndeclare module \"../scene\" {\r\n export interface Scene {\r\n /** @internal */\r\n _meshUVSpaceRendererShader: Nullable<ShaderMaterial>;\r\n /** @internal */\r\n _meshUVSpaceRendererMaskShader: Nullable<ShaderMaterial>;\r\n }\r\n}\r\n\r\n/**\r\n * Options for the MeshUVSpaceRenderer\r\n * @since 5.49.1\r\n */\r\nexport interface IMeshUVSpaceRendererOptions {\r\n /**\r\n * Width of the texture. Default: 1024\r\n */\r\n width?: number;\r\n /**\r\n * Height of the texture. Default: 1024\r\n */\r\n height?: number;\r\n /**\r\n * Type of the texture. Default: Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n */\r\n textureType?: number;\r\n /**\r\n * Generate mip maps. Default: true\r\n */\r\n generateMipMaps?: boolean;\r\n /**\r\n * Optimize UV allocation. Default: true\r\n * If you plan to use the texture as a decal map and rotate / offset the texture, you should set this to false\r\n */\r\n optimizeUVAllocation?: boolean;\r\n /**\r\n * If true, a post processing effect will be applied to the texture to fix seams. Default: false\r\n */\r\n uvEdgeBlending?: boolean;\r\n}\r\n\r\n/**\r\n * Class used to render in the mesh UV space\r\n * @since 5.49.1\r\n */\r\nexport class MeshUVSpaceRenderer {\r\n private _mesh: AbstractMesh;\r\n private _scene: Scene;\r\n private _options: Required<IMeshUVSpaceRendererOptions>;\r\n private _textureCreatedInternally = false;\r\n private _configureUserCreatedTexture = true;\r\n private _maskTexture: Nullable<RenderTargetTexture> = null;\r\n private _finalPostProcess: Nullable<PostProcess> = null;\r\n\r\n private static _GetShader(scene: Scene): ShaderMaterial {\r\n if (!scene._meshUVSpaceRendererShader) {\r\n const shader = new ShaderMaterial(\r\n \"meshUVSpaceRendererShader\",\r\n scene,\r\n {\r\n vertex: \"meshUVSpaceRenderer\",\r\n fragment: \"meshUVSpaceRenderer\",\r\n },\r\n {\r\n attributes: [\"position\", \"normal\", \"uv\"],\r\n uniforms: [\"world\", \"projMatrix\"],\r\n samplers: [\"textureSampler\"],\r\n needAlphaBlending: true,\r\n }\r\n );\r\n shader.backFaceCulling = false;\r\n shader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n scene.onDisposeObservable.add(() => {\r\n scene._meshUVSpaceRendererShader?.dispose();\r\n scene._meshUVSpaceRendererShader = null;\r\n });\r\n\r\n scene._meshUVSpaceRendererShader = shader;\r\n }\r\n\r\n return scene._meshUVSpaceRendererShader;\r\n }\r\n\r\n private static _GetMaskShader(scene: Scene): ShaderMaterial {\r\n if (!scene._meshUVSpaceRendererMaskShader) {\r\n const shader = new ShaderMaterial(\r\n \"meshUVSpaceRendererMaskShader\",\r\n scene,\r\n {\r\n vertex: \"meshUVSpaceRendererMasker\",\r\n fragment: \"meshUVSpaceRendererMasker\",\r\n },\r\n {\r\n attributes: [\"position\", \"uv\"],\r\n uniforms: [\"worldViewProjection\"],\r\n }\r\n );\r\n shader.backFaceCulling = false;\r\n shader.alphaMode = Constants.ALPHA_COMBINE;\r\n\r\n scene.onDisposeObservable.add(() => {\r\n scene._meshUVSpaceRendererMaskShader?.dispose();\r\n scene._meshUVSpaceRendererMaskShader = null;\r\n });\r\n\r\n scene._meshUVSpaceRendererMaskShader = shader;\r\n }\r\n return scene._meshUVSpaceRendererMaskShader;\r\n }\r\n\r\n private static _IsRenderTargetTexture(texture: ThinTexture | RenderTargetTexture): texture is RenderTargetTexture {\r\n return (texture as RenderTargetTexture).renderList !== undefined;\r\n }\r\n\r\n /**\r\n * Clear color of the texture\r\n */\r\n public clearColor = new Color4(0, 0, 0, 0);\r\n\r\n /**\r\n * Target texture used for rendering\r\n * If you don't set the property, a RenderTargetTexture will be created internally given the options provided to the constructor.\r\n * If you provide a RenderTargetTexture, it will be used directly.\r\n */\r\n public texture: Texture;\r\n\r\n /**\r\n * Creates a new MeshUVSpaceRenderer\r\n * @param mesh The mesh used for the source UV space\r\n * @param scene The scene the mesh belongs to\r\n * @param options The options to use when creating the texture\r\n */\r\n constructor(mesh: AbstractMesh, scene: Scene, options?: IMeshUVSpaceRendererOptions) {\r\n this._mesh = mesh;\r\n this._scene = scene;\r\n this._options = {\r\n width: 1024,\r\n height: 1024,\r\n textureType: Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n generateMipMaps: true,\r\n optimizeUVAllocation: true,\r\n uvEdgeBlending: false,\r\n ...options,\r\n };\r\n\r\n this._createDiffuseRTT();\r\n }\r\n\r\n /**\r\n * Checks if the texture is ready to be used\r\n * @returns true if the texture is ready to be used\r\n */\r\n public isReady(): boolean {\r\n if (!this.texture) {\r\n this._createDiffuseRTT();\r\n }\r\n\r\n const textureIsReady = MeshUVSpaceRenderer._IsRenderTargetTexture(this.texture) ? this.texture.isReadyForRendering() : this.texture.isReady();\r\n const maskIsReady = this._maskTexture?.isReadyForRendering() ?? true;\r\n const postProcessIsReady = this._finalPostProcess?.isReady() ?? true;\r\n\r\n return textureIsReady && maskIsReady && postProcessIsReady;\r\n }\r\n\r\n /**\r\n * Projects and renders a texture in the mesh UV space\r\n * @param texture The texture\r\n * @param position The position of the center of projection (world space coordinates)\r\n * @param normal The direction of the projection (world space coordinates)\r\n * @param size The size of the projection\r\n * @param angle The rotation angle around the direction of the projection\r\n */\r\n public renderTexture(texture: BaseTexture, position: Vector3, normal: Vector3, size: Vector3, angle = 0): void {\r\n if (!this.texture) {\r\n this._createDiffuseRTT();\r\n } else if (this._configureUserCreatedTexture) {\r\n this._configureUserCreatedRTT();\r\n }\r\n\r\n if (MeshUVSpaceRenderer._IsRenderTargetTexture(this.texture)) {\r\n const matrix = this._createProjectionMatrix(position, normal, size, angle);\r\n const shader = MeshUVSpaceRenderer._GetShader(this._scene);\r\n\r\n shader.setTexture(\"textureSampler\", texture);\r\n shader.setMatrix(\"projMatrix\", matrix);\r\n\r\n this.texture.render();\r\n }\r\n }\r\n\r\n /**\r\n * Clears the texture map\r\n */\r\n public clear(): void {\r\n if (MeshUVSpaceRenderer._IsRenderTargetTexture(this.texture) && this.texture.renderTarget) {\r\n const engine = this._scene.getEngine();\r\n\r\n engine.bindFramebuffer(this.texture.renderTarget);\r\n engine.clear(this.clearColor, true, true, true);\r\n engine.unBindFramebuffer(this.texture.renderTarget);\r\n }\r\n if (this._finalPostProcess?.inputTexture) {\r\n const engine = this._scene.getEngine();\r\n\r\n engine.bindFramebuffer(this._finalPostProcess?.inputTexture);\r\n engine.clear(this.clearColor, true, true, true);\r\n engine.unBindFramebuffer(this._finalPostProcess?.inputTexture);\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the resources\r\n */\r\n public dispose() {\r\n if (this._textureCreatedInternally) {\r\n this.texture.dispose();\r\n this._textureCreatedInternally = false;\r\n }\r\n this._configureUserCreatedTexture = true;\r\n this._maskTexture?.dispose();\r\n this._maskTexture = null;\r\n this._finalPostProcess?.dispose();\r\n this._finalPostProcess = null;\r\n }\r\n\r\n private _configureUserCreatedRTT(): void {\r\n this._configureUserCreatedTexture = false;\r\n if (MeshUVSpaceRenderer._IsRenderTargetTexture(this.texture)) {\r\n this.texture.setMaterialForRendering(this._mesh, MeshUVSpaceRenderer._GetShader(this._scene));\r\n this.texture.onClearObservable.add(() => {});\r\n this.texture.renderList = [this._mesh];\r\n if (this._options.uvEdgeBlending) {\r\n this._createMaskTexture();\r\n this._createPostProcess();\r\n this.texture.addPostProcess(this._finalPostProcess!);\r\n }\r\n }\r\n }\r\n\r\n private _createDiffuseRTT(): void {\r\n this._textureCreatedInternally = true;\r\n\r\n const texture = this._createRenderTargetTexture(this._options.width, this._options.height);\r\n\r\n texture.setMaterialForRendering(this._mesh, MeshUVSpaceRenderer._GetShader(this._scene));\r\n\r\n this.texture = texture;\r\n this._configureUserCreatedTexture = false;\r\n if (this._options.uvEdgeBlending) {\r\n this._createMaskTexture();\r\n this._createPostProcess();\r\n texture.addPostProcess(this._finalPostProcess!);\r\n }\r\n }\r\n\r\n private _createMaskTexture(): void {\r\n if (this._maskTexture) {\r\n return;\r\n }\r\n\r\n this._maskTexture = new RenderTargetTexture(\r\n this._mesh.name + \"_maskTexture\",\r\n { width: this._options.width, height: this._options.height },\r\n this._scene,\r\n false, // No mipmaps for the mask texture\r\n true,\r\n Constants.TEXTURETYPE_UNSIGNED_BYTE,\r\n false,\r\n Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n undefined,\r\n undefined,\r\n undefined,\r\n Constants.TEXTUREFORMAT_R\r\n );\r\n\r\n this._maskTexture.clearColor = new Color4(0, 0, 0, 0);\r\n\r\n // Render the mesh with the mask material to the mask texture\r\n this._maskTexture.renderList!.push(this._mesh);\r\n this._maskTexture.setMaterialForRendering(this._mesh, MeshUVSpaceRenderer._GetMaskShader(this._scene));\r\n\r\n // Ensure the mask texture is updated\r\n this._maskTexture.refreshRate = RenderTargetTexture.REFRESHRATE_RENDER_ONCE;\r\n this._scene.customRenderTargets.push(this._maskTexture);\r\n }\r\n\r\n private _createPostProcess(): void {\r\n if (this._finalPostProcess) {\r\n return;\r\n }\r\n\r\n this._finalPostProcess = new PostProcess(\r\n this._mesh.name + \"_fixSeamsPostProcess\",\r\n \"meshUVSpaceRendererFinaliser\",\r\n [\"textureSize\"],\r\n [\"textureSampler\", \"maskTextureSampler\"],\r\n 1.0,\r\n null,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n this._scene.getEngine(),\r\n false,\r\n null,\r\n this._options.textureType\r\n );\r\n\r\n this._finalPostProcess.onApplyObservable.add((effect) => {\r\n effect.setTexture(\"maskTextureSampler\", this._maskTexture);\r\n effect.setFloat2(\"textureSize\", this._options.width, this._options.height);\r\n });\r\n }\r\n\r\n private _createRenderTargetTexture(width: number, height: number): RenderTargetTexture {\r\n const rtt = new RenderTargetTexture(\r\n this._mesh.name + \"_uvspaceTexture\",\r\n { width, height },\r\n this._scene,\r\n this._options.generateMipMaps,\r\n true,\r\n this._options.textureType,\r\n false,\r\n this._options.generateMipMaps ? Constants.TEXTURE_TRILINEAR_SAMPLINGMODE : Constants.TEXTURE_BILINEAR_SAMPLINGMODE,\r\n false,\r\n false,\r\n false,\r\n Constants.TEXTUREFORMAT_RGBA\r\n );\r\n\r\n rtt.renderParticles = false;\r\n rtt.optimizeUVAllocation = !!this._options.optimizeUVAllocation;\r\n\r\n rtt.onClearObservable.addOnce(() => {\r\n this._scene.getEngine().clear(this.clearColor, true, true, true);\r\n rtt.onClearObservable.add(() => {}); // this disables clearing the texture for the next frames\r\n });\r\n\r\n rtt.renderList = [this._mesh];\r\n\r\n return rtt;\r\n }\r\n\r\n private _createProjectionMatrix(position: Vector3, normal: Vector3, size: Vector3, angle = 0): Matrix {\r\n const yaw = -Math.atan2(normal.z, normal.x) - Math.PI / 2;\r\n const len = Math.sqrt(normal.x * normal.x + normal.z * normal.z);\r\n const pitch = Math.atan2(normal.y, len);\r\n\r\n const p = position.add(normal.scale(size.z * 0.5));\r\n\r\n const projWorldMatrix = Matrix.RotationYawPitchRoll(yaw, pitch, angle).multiply(Matrix.Translation(p.x, p.y, p.z));\r\n const inverseProjWorldMatrix = Matrix.Invert(projWorldMatrix);\r\n\r\n const projMatrix = Matrix.FromArray([2 / size.x, 0, 0, 0, 0, 2 / size.y, 0, 0, 0, 0, 1 / size.z, 0, 0, 0, 0, 1]);\r\n\r\n const screenMatrix = Matrix.FromArray([0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 1, 0, 0.5, 0.5, 0.0, 1]);\r\n\r\n return inverseProjWorldMatrix.multiply(projMatrix).multiply(screenMatrix);\r\n }\r\n}\r\n"]}
@@ -6,9 +6,7 @@ const shader = `struct ambientOcclusionOutParams
6
6
  #if DEBUGMODE>0 && defined(AMBIENT)
7
7
  vec3 ambientOcclusionColorMap;
8
8
  #endif
9
- };
10
- #define pbr_inline
11
- ambientOcclusionOutParams ambientOcclusionBlock(
9
+ };ambientOcclusionOutParams ambientOcclusionBlock(
12
10
  #ifdef AMBIENT
13
11
  in vec3 ambientOcclusionColorMap_,
14
12
  in vec4 vAmbientInfos
@@ -1 +1 @@
1
- {"version":3,"file":"pbrBlockAmbientOcclusion.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBlockAmbientOcclusion.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;CAyBd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBlockAmbientOcclusion\";\nconst shader = `struct ambientOcclusionOutParams\n{vec3 ambientOcclusionColor;\n#if DEBUGMODE>0 && defined(AMBIENT)\nvec3 ambientOcclusionColorMap;\n#endif\n};\n#define pbr_inline\nambientOcclusionOutParams ambientOcclusionBlock(\n#ifdef AMBIENT\nin vec3 ambientOcclusionColorMap_,\nin vec4 vAmbientInfos\n#endif\n)\n{ambientOcclusionOutParams outParams;vec3 ambientOcclusionColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nvec3 ambientOcclusionColorMap=ambientOcclusionColorMap_*vAmbientInfos.y;\n#ifdef AMBIENTINGRAYSCALE\nambientOcclusionColorMap=vec3(ambientOcclusionColorMap.r,ambientOcclusionColorMap.r,ambientOcclusionColorMap.r);\n#endif\nambientOcclusionColor=mix(ambientOcclusionColor,ambientOcclusionColorMap,vAmbientInfos.z);\n#if DEBUGMODE>0\noutParams.ambientOcclusionColorMap=ambientOcclusionColorMap;\n#endif\n#endif\noutParams.ambientOcclusionColor=ambientOcclusionColor;return outParams;}\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const pbrBlockAmbientOcclusion = { name, shader };\n"]}
1
+ {"version":3,"file":"pbrBlockAmbientOcclusion.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/pbrBlockAmbientOcclusion.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,0BAA0B,CAAC;AACxC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"pbrBlockAmbientOcclusion\";\nconst shader = `struct ambientOcclusionOutParams\n{vec3 ambientOcclusionColor;\n#if DEBUGMODE>0 && defined(AMBIENT)\nvec3 ambientOcclusionColorMap;\n#endif\n};ambientOcclusionOutParams ambientOcclusionBlock(\n#ifdef AMBIENT\nin vec3 ambientOcclusionColorMap_,\nin vec4 vAmbientInfos\n#endif\n)\n{ambientOcclusionOutParams outParams;vec3 ambientOcclusionColor=vec3(1.,1.,1.);\n#ifdef AMBIENT\nvec3 ambientOcclusionColorMap=ambientOcclusionColorMap_*vAmbientInfos.y;\n#ifdef AMBIENTINGRAYSCALE\nambientOcclusionColorMap=vec3(ambientOcclusionColorMap.r,ambientOcclusionColorMap.r,ambientOcclusionColorMap.r);\n#endif\nambientOcclusionColor=mix(ambientOcclusionColor,ambientOcclusionColorMap,vAmbientInfos.z);\n#if DEBUGMODE>0\noutParams.ambientOcclusionColorMap=ambientOcclusionColorMap;\n#endif\n#endif\noutParams.ambientOcclusionColor=ambientOcclusionColor;return outParams;}\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const pbrBlockAmbientOcclusion = { name, shader };\n"]}
@@ -8,7 +8,7 @@ const shader = `#if SM_FLOAT==0
8
8
  #endif
9
9
  #if SM_SOFTTRANSPARENTSHADOW==1
10
10
  #include<bayerDitherFunctions>
11
- uniform float softTransparentShadowSM;
11
+ uniform vec2 softTransparentShadowSM;
12
12
  #endif
13
13
  varying float vDepthMetricSM;
14
14
  #if SM_USEDISTANCE==1
@@ -1 +1 @@
1
- {"version":3,"file":"shadowMapFragmentExtraDeclaration.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/shadowMapFragmentExtraDeclaration.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,oBAAoB,CAAC;AAC5B,OAAO,wBAAwB,CAAC;AAEhC,MAAM,IAAI,GAAG,mCAAmC,CAAC;AACjD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;CAed,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./packingFunctions\";\nimport \"./bayerDitherFunctions\";\n\nconst name = \"shadowMapFragmentExtraDeclaration\";\nconst shader = `#if SM_FLOAT==0\n#include<packingFunctions>\n#endif\n#if SM_SOFTTRANSPARENTSHADOW==1\n#include<bayerDitherFunctions>\nuniform float softTransparentShadowSM;\n#endif\nvarying float vDepthMetricSM;\n#if SM_USEDISTANCE==1\nuniform vec3 lightDataSM;varying vec3 vPositionWSM;\n#endif\nuniform vec3 biasAndScaleSM;uniform vec2 depthValuesSM;\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\nvarying float zSM;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const shadowMapFragmentExtraDeclaration = { name, shader };\n"]}
1
+ {"version":3,"file":"shadowMapFragmentExtraDeclaration.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/shadowMapFragmentExtraDeclaration.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,oBAAoB,CAAC;AAC5B,OAAO,wBAAwB,CAAC;AAEhC,MAAM,IAAI,GAAG,mCAAmC,CAAC;AACjD,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;CAed,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,iCAAiC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\nimport \"./packingFunctions\";\nimport \"./bayerDitherFunctions\";\n\nconst name = \"shadowMapFragmentExtraDeclaration\";\nconst shader = `#if SM_FLOAT==0\n#include<packingFunctions>\n#endif\n#if SM_SOFTTRANSPARENTSHADOW==1\n#include<bayerDitherFunctions>\nuniform vec2 softTransparentShadowSM;\n#endif\nvarying float vDepthMetricSM;\n#if SM_USEDISTANCE==1\nuniform vec3 lightDataSM;varying vec3 vPositionWSM;\n#endif\nuniform vec3 biasAndScaleSM;uniform vec2 depthValuesSM;\n#if defined(SM_DEPTHCLAMP) && SM_DEPTHCLAMP==1\nvarying float zSM;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const shadowMapFragmentExtraDeclaration = { name, shader };\n"]}
@@ -2,7 +2,7 @@
2
2
  import { ShaderStore } from "../../Engines/shaderStore.js";
3
3
  const name = "shadowMapFragmentSoftTransparentShadow";
4
4
  const shader = `#if SM_SOFTTRANSPARENTSHADOW==1
5
- if ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM*alpha) discard;
5
+ if ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM.x*alpha) discard;
6
6
  #endif
7
7
  `;
8
8
  // Sideeffect
@@ -1 +1 @@
1
- {"version":3,"file":"shadowMapFragmentSoftTransparentShadow.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/shadowMapFragmentSoftTransparentShadow.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,wCAAwC,CAAC;AACtD,MAAM,MAAM,GAAG;;;CAGd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"shadowMapFragmentSoftTransparentShadow\";\nconst shader = `#if SM_SOFTTRANSPARENTSHADOW==1\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM*alpha) discard;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const shadowMapFragmentSoftTransparentShadow = { name, shader };\n"]}
1
+ {"version":3,"file":"shadowMapFragmentSoftTransparentShadow.js","sourceRoot":"","sources":["../../../../../dev/core/src/Shaders/ShadersInclude/shadowMapFragmentSoftTransparentShadow.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAExD,MAAM,IAAI,GAAG,wCAAwC,CAAC;AACtD,MAAM,MAAM,GAAG;;;CAGd,CAAC;AACF,aAAa;AACb,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AAChD,gBAAgB;AAChB,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../../Engines/shaderStore\";\n\nconst name = \"shadowMapFragmentSoftTransparentShadow\";\nconst shader = `#if SM_SOFTTRANSPARENTSHADOW==1\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM.x*alpha) discard;\n#endif\n`;\n// Sideeffect\nShaderStore.IncludesShadersStore[name] = shader;\n/** @internal */\nexport const shadowMapFragmentSoftTransparentShadow = { name, shader };\n"]}
@@ -15,7 +15,10 @@ void main(void)
15
15
  {
16
16
  #include<clipPlaneFragment>
17
17
  #ifdef ALPHATEXTURE
18
- float alphaFromAlphaTexture=texture2D(diffuseSampler,vUV).a;
18
+ vec4 opacityMap=texture2D(diffuseSampler,vUV);float alphaFromAlphaTexture=opacityMap.a;
19
+ #if SM_SOFTTRANSPARENTSHADOW==1
20
+ if (softTransparentShadowSM.y==1.0) {opacityMap.rgb=opacityMap.rgb*vec3(0.3,0.59,0.11);alphaFromAlphaTexture=opacityMap.x+opacityMap.y+opacityMap.z;}
21
+ #endif
19
22
  #ifdef ALPHATESTVALUE
20
23
  if (alphaFromAlphaTexture<ALPHATESTVALUE)
21
24
  discard;
@@ -23,9 +26,9 @@ discard;
23
26
  #endif
24
27
  #if SM_SOFTTRANSPARENTSHADOW==1
25
28
  #ifdef ALPHATEXTURE
26
- if ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM*alphaFromAlphaTexture) discard;
29
+ if ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM.x*alphaFromAlphaTexture) discard;
27
30
  #else
28
- if ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM) discard;
31
+ if ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM.x) discard;
29
32
  #endif
30
33
  #endif
31
34
  #include<shadowMapFragment>
@@ -1 +1 @@
1
- {"version":3,"file":"shadowMap.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/shadowMap.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,oDAAoD,CAAC;AAC5D,OAAO,+CAA+C,CAAC;AACvD,OAAO,oCAAoC,CAAC;AAC5C,OAAO,oCAAoC,CAAC;AAE5C,MAAM,IAAI,GAAG,sBAAsB,CAAC;AACpC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;EAwBb,CAAC;AACH,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,gBAAgB;AAChB,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/shadowMapFragmentExtraDeclaration\";\nimport \"./ShadersInclude/clipPlaneFragmentDeclaration\";\nimport \"./ShadersInclude/clipPlaneFragment\";\nimport \"./ShadersInclude/shadowMapFragment\";\n\nconst name = \"shadowMapPixelShader\";\nconst shader = `#include<shadowMapFragmentExtraDeclaration>\n#ifdef ALPHATEXTURE\nvarying vec2 vUV;uniform sampler2D diffuseSampler;\n#endif\n#include<clipPlaneFragmentDeclaration>\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{\n#include<clipPlaneFragment>\n#ifdef ALPHATEXTURE\nfloat alphaFromAlphaTexture=texture2D(diffuseSampler,vUV).a;\n#ifdef ALPHATESTVALUE\nif (alphaFromAlphaTexture<ALPHATESTVALUE)\ndiscard;\n#endif\n#endif\n#if SM_SOFTTRANSPARENTSHADOW==1\n#ifdef ALPHATEXTURE\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM*alphaFromAlphaTexture) discard;\n#else\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM) discard;\n#endif\n#endif\n#include<shadowMapFragment>\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const shadowMapPixelShader = { name, shader };\n"]}
1
+ {"version":3,"file":"shadowMap.fragment.js","sourceRoot":"","sources":["../../../../dev/core/src/Shaders/shadowMap.fragment.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,oDAAoD,CAAC;AAC5D,OAAO,+CAA+C,CAAC;AACvD,OAAO,oCAAoC,CAAC;AAC5C,OAAO,oCAAoC,CAAC;AAE5C,MAAM,IAAI,GAAG,sBAAsB,CAAC;AACpC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2Bb,CAAC;AACH,aAAa;AACb,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;AACxC,gBAAgB;AAChB,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC","sourcesContent":["// Do not edit.\nimport { ShaderStore } from \"../Engines/shaderStore\";\nimport \"./ShadersInclude/shadowMapFragmentExtraDeclaration\";\nimport \"./ShadersInclude/clipPlaneFragmentDeclaration\";\nimport \"./ShadersInclude/clipPlaneFragment\";\nimport \"./ShadersInclude/shadowMapFragment\";\n\nconst name = \"shadowMapPixelShader\";\nconst shader = `#include<shadowMapFragmentExtraDeclaration>\n#ifdef ALPHATEXTURE\nvarying vec2 vUV;uniform sampler2D diffuseSampler;\n#endif\n#include<clipPlaneFragmentDeclaration>\n#define CUSTOM_FRAGMENT_DEFINITIONS\nvoid main(void)\n{\n#include<clipPlaneFragment>\n#ifdef ALPHATEXTURE\nvec4 opacityMap=texture2D(diffuseSampler,vUV);float alphaFromAlphaTexture=opacityMap.a;\n#if SM_SOFTTRANSPARENTSHADOW==1\nif (softTransparentShadowSM.y==1.0) {opacityMap.rgb=opacityMap.rgb*vec3(0.3,0.59,0.11);alphaFromAlphaTexture=opacityMap.x+opacityMap.y+opacityMap.z;}\n#endif\n#ifdef ALPHATESTVALUE\nif (alphaFromAlphaTexture<ALPHATESTVALUE)\ndiscard;\n#endif\n#endif\n#if SM_SOFTTRANSPARENTSHADOW==1\n#ifdef ALPHATEXTURE\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM.x*alphaFromAlphaTexture) discard;\n#else\nif ((bayerDither8(floor(mod(gl_FragCoord.xy,8.0))))/64.0>=softTransparentShadowSM.x) discard;\n#endif\n#endif\n#include<shadowMapFragment>\n}`;\n// Sideeffect\nShaderStore.ShadersStore[name] = shader;\n/** @internal */\nexport const shadowMapPixelShader = { name, shader };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@babylonjs/core",
3
- "version": "7.17.1",
3
+ "version": "7.18.0",
4
4
  "main": "index.js",
5
5
  "module": "index.js",
6
6
  "types": "index.d.ts",