@babylonjs/core 5.0.0-beta.2 → 5.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/Culling/ray.js +2 -1
  2. package/Culling/ray.js.map +1 -1
  3. package/Debug/axesViewer.d.ts +1 -0
  4. package/Debug/axesViewer.js +1 -0
  5. package/Debug/axesViewer.js.map +1 -1
  6. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +4 -6
  7. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  8. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.d.ts +1 -1
  9. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js.map +1 -1
  10. package/Engines/WebGPU/webgpuCacheSampler.d.ts +2 -0
  11. package/Engines/WebGPU/webgpuCacheSampler.js +23 -2
  12. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  13. package/Engines/WebGPU/webgpuDrawContext.d.ts +1 -1
  14. package/Engines/WebGPU/webgpuDrawContext.js +3 -3
  15. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  16. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +0 -1
  17. package/Engines/WebGPU/webgpuHardwareTexture.js +0 -3
  18. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  19. package/Engines/WebGPU/webgpuPipelineContext.d.ts +0 -8
  20. package/Engines/WebGPU/webgpuPipelineContext.js.map +1 -1
  21. package/Engines/WebGPU/webgpuTextureHelper.d.ts +0 -1
  22. package/Engines/WebGPU/webgpuTextureHelper.js +4 -26
  23. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  24. package/Engines/engine.d.ts +1 -1
  25. package/Engines/engine.js +1 -1
  26. package/Engines/engine.js.map +1 -1
  27. package/Engines/thinEngine.d.ts +1 -1
  28. package/Engines/thinEngine.js +3 -3
  29. package/Engines/thinEngine.js.map +1 -1
  30. package/Engines/webgpuEngine.d.ts +3 -3
  31. package/Engines/webgpuEngine.js +5 -8
  32. package/Engines/webgpuEngine.js.map +1 -1
  33. package/Maths/math.path.d.ts +1 -0
  34. package/Maths/math.path.js +1 -0
  35. package/Maths/math.path.js.map +1 -1
  36. package/Maths/math.vector.d.ts +1 -0
  37. package/Maths/math.vector.js +1 -0
  38. package/Maths/math.vector.js.map +1 -1
  39. package/Meshes/Builders/geodesicBuilder.d.ts +1 -0
  40. package/Meshes/Builders/geodesicBuilder.js +1 -0
  41. package/Meshes/Builders/geodesicBuilder.js.map +1 -1
  42. package/Meshes/Builders/goldbergBuilder.d.ts +1 -0
  43. package/Meshes/Builders/goldbergBuilder.js +1 -0
  44. package/Meshes/Builders/goldbergBuilder.js.map +1 -1
  45. package/Meshes/Builders/tiledBoxBuilder.d.ts +30 -11
  46. package/Meshes/Builders/tiledBoxBuilder.js +30 -11
  47. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  48. package/Meshes/Builders/tiledPlaneBuilder.d.ts +21 -16
  49. package/Meshes/Builders/tiledPlaneBuilder.js +21 -16
  50. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  51. package/Misc/PerformanceViewer/performanceViewerCollector.js +31 -14
  52. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  53. package/package.json +1 -1
package/Culling/ray.js CHANGED
@@ -503,7 +503,8 @@ var Ray = /** @class */ (function () {
503
503
  nearScreenSource.x = (sourceX / viewportWidth) * 2 - 1;
504
504
  nearScreenSource.y = -((sourceY / viewportHeight) * 2 - 1);
505
505
  nearScreenSource.z = -1.0;
506
- var farScreenSource = TmpVectors.Vector3[1].copyFromFloats(nearScreenSource.x, nearScreenSource.y, 1.0);
506
+ // far Z need to be close but < to 1 or camera projection matrix with maxZ = 0 will NaN
507
+ var farScreenSource = TmpVectors.Vector3[1].copyFromFloats(nearScreenSource.x, nearScreenSource.y, 1.0 - 1e-8);
507
508
  var nearVec3 = TmpVectors.Vector3[2];
508
509
  var farVec3 = TmpVectors.Vector3[3];
509
510
  Vector3._UnprojectFromInvertedMatrixToRef(nearScreenSource, matrix, nearVec3);
@@ -1 +1 @@
1
- {"version":3,"file":"ray.js","sourceRoot":"","sources":["../../../sourceES6/core/Culling/ray.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAGlE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAK3C;;GAEG;AACH;IAII;;;;;OAKG;IACH;IACI,mBAAmB;IACZ,MAAe;IACtB,gBAAgB;IACT,SAAkB;IACzB,wBAAwB;IACjB,MAAiC;QAAjC,uBAAA,EAAA,SAAiB,MAAM,CAAC,SAAS;QAJjC,WAAM,GAAN,MAAM,CAAS;QAEf,cAAS,GAAT,SAAS,CAAS;QAElB,WAAM,GAAN,MAAM,CAA2B;IACxC,CAAC;IAEL,UAAU;IAEV;;;OAGG;IACI,mBAAK,GAAZ;QACI,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;;OAOG;IACI,iCAAmB,GAA1B,UAA2B,OAA+B,EAAE,OAA+B,EAAE,oBAAgC;QAAhC,qCAAA,EAAA,wBAAgC;QACzH,IAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,oBAAoB,EAAE,OAAO,CAAC,CAAC,GAAG,oBAAoB,EAAE,OAAO,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC;QAC3J,IAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,oBAAoB,EAAE,OAAO,CAAC,CAAC,GAAG,oBAAoB,EAAE,OAAO,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC;QAC3J,IAAI,CAAC,GAAG,GAAG,CAAC;QACZ,IAAI,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QAChC,IAAI,GAAW,CAAC;QAChB,IAAI,GAAW,CAAC;QAChB,IAAI,GAAW,CAAC;QAChB,IAAI,IAAY,CAAC;QACjB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE;YACxC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE;gBAC9D,OAAO,KAAK,CAAC;aAChB;SACJ;aAAM;YACH,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7B,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAC3C,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAC3C,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE;gBACnB,GAAG,GAAG,QAAQ,CAAC;aAClB;YAED,IAAI,GAAG,GAAG,GAAG,EAAE;gBACX,IAAI,GAAG,GAAG,CAAC;gBACX,GAAG,GAAG,GAAG,CAAC;gBACV,GAAG,GAAG,IAAI,CAAC;aACd;YAED,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAEnC,IAAI,CAAC,GAAG,QAAQ,EAAE;gBACd,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE;YACxC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE;gBAC9D,OAAO,KAAK,CAAC;aAChB;SACJ;aAAM;YACH,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7B,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAC3C,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAE3C,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE;gBACnB,GAAG,GAAG,QAAQ,CAAC;aAClB;YAED,IAAI,GAAG,GAAG,GAAG,EAAE;gBACX,IAAI,GAAG,GAAG,CAAC;gBACX,GAAG,GAAG,GAAG,CAAC;gBACV,GAAG,GAAG,IAAI,CAAC;aACd;YAED,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAEnC,IAAI,CAAC,GAAG,QAAQ,EAAE;gBACd,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE;YACxC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE;gBAC9D,OAAO,KAAK,CAAC;aAChB;SACJ;aAAM;YACH,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7B,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAC3C,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAE3C,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE;gBACnB,GAAG,GAAG,QAAQ,CAAC;aAClB;YAED,IAAI,GAAG,GAAG,GAAG,EAAE;gBACX,IAAI,GAAG,GAAG,CAAC;gBACX,GAAG,GAAG,GAAG,CAAC;gBACV,GAAG,GAAG,IAAI,CAAC;aACd;YAED,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAEnC,IAAI,CAAC,GAAG,QAAQ,EAAE;gBACd,OAAO,KAAK,CAAC;aAChB;SACJ;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACI,2BAAa,GAApB,UAAqB,GAA+B,EAAE,oBAAgC;QAAhC,qCAAA,EAAA,wBAAgC;QAClF,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IACpF,CAAC;IAED;;;;;OAKG;IACI,8BAAgB,GAAvB,UAAwB,MAAqC,EAAE,oBAAgC;QAAhC,qCAAA,EAAA,wBAAgC;QAC3F,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAM,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,oBAAoB,CAAC;QACpD,IAAI,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC;QAEzB,IAAI,IAAI,IAAI,EAAE,EAAE;YACZ,OAAO,IAAI,CAAC;SACf;QAED,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7E,IAAI,GAAG,GAAG,GAAG,EAAE;YACX,OAAO,KAAK,CAAC;SAChB;QAED,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;QAE5B,OAAO,IAAI,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;;;;;OAMG;IACI,gCAAkB,GAAzB,UAA0B,OAA+B,EAAE,OAA+B,EAAE,OAA+B;QACvH,IAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACjC,IAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACjC,IAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,IAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,IAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAEhC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEnC,IAAI,GAAG,KAAK,CAAC,EAAE;YACX,OAAO,IAAI,CAAC;SACf;QAED,IAAI,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC;QAErB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEzC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;QAE1C,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE;YACpB,OAAO,IAAI,CAAC;SACf;QAED,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAEtC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;QAEpD,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE;YACzB,OAAO,IAAI,CAAC;SACf;QAED,6DAA6D;QAC7D,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;QACjD,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE;YACxB,OAAO,IAAI,CAAC;SACf;QAED,OAAO,IAAI,gBAAgB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACI,6BAAe,GAAtB,UAAuB,KAA2B;QAC9C,IAAI,QAAgB,CAAC;QACrB,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,mBAAmB,EAAE;YACzC,OAAO,IAAI,CAAC;SACf;aAAM;YACH,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACrD,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC;YAC1C,IAAI,QAAQ,GAAG,GAAG,EAAE;gBAChB,IAAI,QAAQ,GAAG,CAAC,mBAAmB,EAAE;oBACjC,OAAO,IAAI,CAAC;iBACf;qBAAM;oBACH,OAAO,CAAC,CAAC;iBACZ;aACJ;YAED,OAAO,QAAQ,CAAC;SACnB;IACL,CAAC;IACD;;;;;OAKG;IACI,4BAAc,GAArB,UAAsB,IAAY,EAAE,MAAkB;QAAlB,uBAAA,EAAA,UAAkB;QAClD,QAAQ,IAAI,EAAE;YACV,KAAK,GAAG;gBACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,GAAG,CAAC,EAAE;oBACP,OAAO,IAAI,CAAC;iBACf;gBACD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7G,KAAK,GAAG;gBACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,GAAG,CAAC,EAAE;oBACP,OAAO,IAAI,CAAC;iBACf;gBACD,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC7G,KAAK,GAAG;gBACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,GAAG,CAAC,EAAE;oBACP,OAAO,IAAI,CAAC;iBACf;gBACD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7G;gBACI,OAAO,IAAI,CAAC;SACnB;IACL,CAAC;IAED;;;;;OAKG;IACI,4BAAc,GAArB,UAAsB,IAAiC,EAAE,SAAmB;QACxE,IAAI,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE9B,IAAI,CAAC,cAAc,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,OAAO,EAAE;YACd,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SAC9C;aAAM;YACH,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;SAC1C;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACI,8BAAgB,GAAvB,UAAwB,MAA0C,EAAE,SAAmB,EAAE,OAA4B;QACjH,IAAI,OAAO,EAAE;YACT,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;SACtB;aAAM;YACH,OAAO,GAAG,EAAE,CAAC;SAChB;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpC,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YAEzD,IAAI,QAAQ,CAAC,GAAG,EAAE;gBACd,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC1B;SACJ;QAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAEvC,OAAO,OAAO,CAAC;IACnB,CAAC;IAEO,iCAAmB,GAA3B,UAA4B,YAAwC,EAAE,YAAwC;QAC1G,IAAI,YAAY,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE;YAC/C,OAAO,CAAC,CAAC,CAAC;SACb;aAAM,IAAI,YAAY,CAAC,QAAQ,GAAG,YAAY,CAAC,QAAQ,EAAE;YACtD,OAAO,CAAC,CAAC;SACZ;aAAM;YACH,OAAO,CAAC,CAAC;SACZ;IACL,CAAC;IAKD;;;;;;OAMG;IACH,iCAAmB,GAAnB,UAAoB,IAA4B,EAAE,IAA4B,EAAE,SAAiB;QAC7F,IAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,IAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChC,IAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,IAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAChC,IAAM,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEhC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE5B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAErB,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAEzB,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc;QACzC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc;QACzC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc;QACrC,IAAI,EAAU,EACV,EAAU,EACV,EAAE,GAAG,CAAC,CAAC,CAAC,oCAAoC;QAChD,IAAI,EAAU,EACV,EAAU,EACV,EAAE,GAAG,CAAC,CAAC,CAAC,oCAAoC;QAEhD,wDAAwD;QACxD,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE;YAClB,gCAAgC;YAChC,EAAE,GAAG,GAAG,CAAC,CAAC,qCAAqC;YAC/C,EAAE,GAAG,GAAG,CAAC,CAAC,4CAA4C;YACtD,EAAE,GAAG,CAAC,CAAC;YACP,EAAE,GAAG,CAAC,CAAC;SACV;aAAM;YACH,+CAA+C;YAC/C,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,EAAE,GAAG,GAAG,EAAE;gBACV,oCAAoC;gBACpC,EAAE,GAAG,GAAG,CAAC;gBACT,EAAE,GAAG,CAAC,CAAC;gBACP,EAAE,GAAG,CAAC,CAAC;aACV;iBAAM,IAAI,EAAE,GAAG,EAAE,EAAE;gBAChB,oCAAoC;gBACpC,EAAE,GAAG,EAAE,CAAC;gBACR,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBACX,EAAE,GAAG,CAAC,CAAC;aACV;SACJ;QAED,IAAI,EAAE,GAAG,GAAG,EAAE;YACV,oCAAoC;YACpC,EAAE,GAAG,GAAG,CAAC;YACT,6BAA6B;YAC7B,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE;gBACV,EAAE,GAAG,GAAG,CAAC;aACZ;iBAAM,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE;gBACf,EAAE,GAAG,EAAE,CAAC;aACX;iBAAM;gBACH,EAAE,GAAG,CAAC,CAAC,CAAC;gBACR,EAAE,GAAG,CAAC,CAAC;aACV;SACJ;aAAM,IAAI,EAAE,GAAG,EAAE,EAAE;YAChB,oCAAoC;YACpC,EAAE,GAAG,EAAE,CAAC;YACR,6BAA6B;YAC7B,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE;gBACd,EAAE,GAAG,CAAC,CAAC;aACV;iBAAM,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACnB,EAAE,GAAG,EAAE,CAAC;aACX;iBAAM;gBACH,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBACZ,EAAE,GAAG,CAAC,CAAC;aACV;SACJ;QACD,2CAA2C;QAC3C,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACjD,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QAEjD,+CAA+C;QAC/C,IAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACtB,IAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACtB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAClB,IAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACjC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB;QAEhD,IAAI,aAAa,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,aAAa,EAAE,GAAG,SAAS,GAAG,SAAS,CAAC,CAAC,6BAA6B;QAE5H,IAAI,aAAa,EAAE;YACf,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;SACvB;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACI,oBAAM,GAAb,UAAc,CAAS,EAAE,CAAS,EAAE,aAAqB,EAAE,cAAsB,EAAE,KAA4B,EAAE,IAA2B,EAAE,UAAiC;QAC3K,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,UAAU;IACV;;;OAGG;IACW,QAAI,GAAlB;QACI,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;;;;;OAUG;IACW,aAAS,GAAvB,UAAwB,CAAS,EAAE,CAAS,EAAE,aAAqB,EAAE,cAAsB,EAAE,KAA4B,EAAE,IAA2B,EAAE,UAAiC;QACrL,IAAI,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAExB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACvF,CAAC;IAED;;;;;;;OAOG;IACW,mBAAe,GAA7B,UAA8B,MAAe,EAAE,GAAY,EAAE,KAAsD;QAAtD,sBAAA,EAAA,QAA+B,MAAM,CAAC,gBAAgB;QAC/G,IAAI,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1G,SAAS,CAAC,SAAS,EAAE,CAAC;QAEtB,OAAO,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IACpE,CAAC;IAED;;;;;OAKG;IACW,aAAS,GAAvB,UAAwB,GAAuB,EAAE,MAA6B;QAC1E,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAExC,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACW,kBAAc,GAA5B,UAA6B,GAAuB,EAAE,MAA6B,EAAE,MAAW;QAC5F,OAAO,CAAC,yBAAyB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACrE,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACtE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QAE3B,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3B,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QAEvB,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;YAC3B,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;YACpB,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;YACb,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;YACb,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;YACb,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;SACxB;IACL,CAAC;IAED;;;;;;;;;OASG;IACI,+BAAiB,GAAxB,UAAyB,OAAc,EAAE,OAAc,EAAE,aAAqB,EAAE,cAAsB,EAAE,KAA4B,EAAE,IAA2B,EAAE,UAAiC;QAChM,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,IAAI,gBAAgB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC7C,gBAAgB,CAAC,CAAC,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvD,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,gBAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1B,IAAI,eAAe,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxG,IAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvC,IAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO,CAAC,iCAAiC,CAAC,gBAAgB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9E,OAAO,CAAC,iCAAiC,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAE5E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IA7iBuB,eAAW,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAwU9D,YAAQ,GAAG,UAAU,CAAC;IACtB,QAAI,GAAG,IAAI,CAAC;IAqO/B,UAAC;CAAA,AA/iBD,IA+iBC;SA/iBY,GAAG;AA6kBhB,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,CAAS,EAAE,CAAS,EAAE,KAAuB,EAAE,MAAwB,EAAE,eAAuB;IAAvB,gCAAA,EAAA,uBAAuB;IACzI,IAAI,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAExB,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAEzE,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAAU,CAAS,EAAE,CAAS,EAAE,KAAuB,EAAE,MAAW,EAAE,MAAwB,EAAE,eAAuB;IAAvB,gCAAA,EAAA,uBAAuB;IAC3J,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE;QACT,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACpB,OAAO,IAAI,CAAC;SACf;QAED,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;KAC9B;IAED,IAAI,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrC,IAAI,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;IAE1F,6CAA6C;IAC7C,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,uBAAuB,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAErG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAChM,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,6BAA6B,GAAG,UAAU,CAAS,EAAE,CAAS,EAAE,MAAe;IAC3F,IAAI,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAExB,IAAI,CAAC,kCAAkC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9D,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,kCAAkC,GAAG,UAAU,CAAS,EAAE,CAAS,EAAE,MAAW,EAAE,MAAe;IAC7G,IAAI,CAAC,WAAW,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IAED,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAE9B,IAAI,CAAC,MAAM,EAAE;QACT,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;SAC5C;QAED,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;KAC9B;IAED,IAAI,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrC,IAAI,QAAQ,GAAG,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;IAC1F,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAEjC,6CAA6C;IAC7C,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,uBAAuB,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IACtD,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACvG,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,oBAAoB,GAAG,UAAU,WAAkC,EAAE,WAAmC,EAAE,IAAkB,EAAE,KAAa,EAAE,SAAmB,EAAE,gBAA0B,EAAE,iBAA4C,EAAE,gBAA0B;IAClR,IAAI,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAE7B,IAAI,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC3G,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE;QACxB,OAAO,IAAI,CAAC;KACf;IAED,IAAI,CAAC,SAAS,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,EAAE;QAC9E,OAAO,IAAI,CAAC;KACf;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,WAAmC,EAAE,SAA2C,EAAE,SAAmB,EAAE,gBAA0B,EAAE,iBAA4C;IACrN,IAAI,CAAC,WAAW,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IAED,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;QACjE,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAElC,IAAI,SAAS,EAAE;YACX,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBAClB,SAAS;aACZ;SACJ;aAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACjE,SAAS;SACZ;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAE9H,IAAI,IAAI,CAAC,gBAAgB,IAAK,IAAa,CAAC,yBAAyB,EAAE;YACnE,8EAA8E;YAC9E,IAAI,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAC7G,IAAI,MAAM,EAAE;gBACR,IAAI,gBAAgB,EAAE;oBAClB,iEAAiE;oBACjE,OAAO,WAAW,CAAC;iBACtB;gBACD,IAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvC,IAAI,YAAY,GAAI,IAAa,CAAC,4BAA4B,EAAE,CAAC;gBACjE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBACtD,IAAI,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;oBACrC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBAC3C,IAAI,QAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;oBAExI,IAAI,QAAM,EAAE;wBACR,WAAW,GAAG,QAAM,CAAC;wBACrB,WAAW,CAAC,iBAAiB,GAAG,KAAK,CAAC;wBAEtC,IAAI,SAAS,EAAE;4BACX,OAAO,WAAW,CAAC;yBACtB;qBACJ;iBACJ;aACJ;SACJ;aAAM;YACH,IAAI,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;YAE9H,IAAI,MAAM,EAAE;gBACR,WAAW,GAAG,MAAM,CAAC;gBAErB,IAAI,SAAS,EAAE;oBACX,OAAO,WAAW,CAAC;iBACtB;aACJ;SACJ;KACJ;IAED,OAAO,WAAW,IAAI,IAAI,WAAW,EAAE,CAAC;AAC5C,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,WAAmC,EAAE,SAA2C,EAAE,iBAA4C;IACzK,IAAI,CAAC,WAAW,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IACD,IAAI,YAAY,GAAG,IAAI,KAAK,EAAe,CAAC;IAE5C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;QACjE,IAAI,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAElC,IAAI,SAAS,EAAE;YACX,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;gBAClB,SAAS;aACZ;SACJ;aAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACjE,SAAS;SACZ;QAED,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAE9H,IAAI,IAAI,CAAC,gBAAgB,IAAK,IAAa,CAAC,yBAAyB,EAAE;YACnE,IAAI,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;YACtG,IAAI,MAAM,EAAE;gBACR,IAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvC,IAAI,YAAY,GAAI,IAAa,CAAC,4BAA4B,EAAE,CAAC;gBACjE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;oBACtD,IAAI,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;oBACrC,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBAC3C,IAAI,QAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC;oBAElH,IAAI,QAAM,EAAE;wBACR,QAAM,CAAC,iBAAiB,GAAG,KAAK,CAAC;wBACjC,YAAY,CAAC,IAAI,CAAC,QAAM,CAAC,CAAC;qBAC7B;iBACJ;aACJ;SACJ;aAAM;YACH,IAAI,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;YAExG,IAAI,MAAM,EAAE;gBACR,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAC7B;SACJ;KACJ;IAED,OAAO,YAAY,CAAC;AACxB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,oBAAoB,GAAG,UAAU,CAAS,EAAE,CAAS,EAAE,SAA2C,EAAE,SAAmB,EAAE,MAAyB;IAA3H,iBAqBtC;IApBG,IAAI,CAAC,WAAW,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IACD,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAC3B,UAAC,KAAK;QACF,IAAI,CAAC,KAAI,CAAC,eAAe,EAAE;YACvB,KAAI,CAAC,eAAe,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;SACrC;QAED,KAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAI,CAAC,eAAe,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;QAC9E,OAAO,KAAI,CAAC,eAAe,CAAC;IAChC,CAAC,EACD,SAAS,EACT,SAAS,EACT,IAAI,CACP,CAAC;IACF,IAAI,MAAM,EAAE;QACR,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;KAC/E;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,UAAU,CAAS,EAAE,CAAS,EAAE,SAA2C,EAAE,SAAmB,EAAE,MAAyB,EAAE,iBAA4C;IAAzK,iBAsBtB;IArBG,IAAI,CAAC,WAAW,EAAE;QACd,OAAO,IAAI,CAAC;KACf;IACD,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAC3B,UAAC,KAAK;QACF,IAAI,CAAC,KAAI,CAAC,eAAe,EAAE;YACvB,KAAI,CAAC,eAAe,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;SACrC;QAED,KAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAI,CAAC,eAAe,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;QAC9E,OAAO,KAAI,CAAC,eAAe,CAAC;IAChC,CAAC,EACD,SAAS,EACT,SAAS,EACT,KAAK,EACL,iBAAiB,CACpB,CAAC;IACF,IAAI,MAAM,EAAE;QACR,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;KAC/E;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,UAAU,GAAQ,EAAE,SAA2C,EAAE,SAAmB,EAAE,iBAA4C;IAAlI,iBAwB7B;IAvBG,IAAI,MAAM,GAAG,IAAI,CAAC,aAAa,CAC3B,UAAC,KAAK;QACF,IAAI,CAAC,KAAI,CAAC,yBAAyB,EAAE;YACjC,KAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;SACtD;QACD,KAAK,CAAC,WAAW,CAAC,KAAI,CAAC,yBAAyB,CAAC,CAAC;QAElD,IAAI,CAAC,KAAI,CAAC,sBAAsB,EAAE;YAC9B,KAAI,CAAC,sBAAsB,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;SAC5C;QAED,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,KAAI,CAAC,yBAAyB,EAAE,KAAI,CAAC,sBAAsB,CAAC,CAAC;QACrF,OAAO,KAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC,EACD,SAAS,EACT,SAAS,EACT,KAAK,EACL,iBAAiB,CACpB,CAAC;IACF,IAAI,MAAM,EAAE;QACR,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;KACpB;IACD,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,SAAS,GAAG,UAAU,CAAS,EAAE,CAAS,EAAE,SAA2C,EAAE,MAAe,EAAE,iBAA4C;IAA1I,iBAE3B;IADG,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAC,KAAK,IAAK,OAAA,KAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,EAAlD,CAAkD,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAChI,CAAC,CAAC;AAEF,KAAK,CAAC,SAAS,CAAC,gBAAgB,GAAG,UAAU,GAAQ,EAAE,SAA0C,EAAE,iBAA4C;IAA5G,iBAkBlC;IAjBG,OAAO,IAAI,CAAC,kBAAkB,CAC1B,UAAC,KAAK;QACF,IAAI,CAAC,KAAI,CAAC,yBAAyB,EAAE;YACjC,KAAI,CAAC,yBAAyB,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;SACtD;QACD,KAAK,CAAC,WAAW,CAAC,KAAI,CAAC,yBAAyB,CAAC,CAAC;QAElD,IAAI,CAAC,KAAI,CAAC,sBAAsB,EAAE;YAC9B,KAAI,CAAC,sBAAsB,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;SAC5C;QAED,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,KAAI,CAAC,yBAAyB,EAAE,KAAI,CAAC,sBAAsB,CAAC,CAAC;QACrF,OAAO,KAAI,CAAC,sBAAsB,CAAC;IACvC,CAAC,EACD,SAAS,EACT,iBAAiB,CACpB,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,MAAY,EAAE,SAAkB,EAAE,MAAgB;IAAlD,uBAAA,EAAA,YAAY;IACnD,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC/G,CAAC,CAAC;AAEF,MAAM,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAAU,MAAW,EAAE,MAAY,EAAE,SAAkB,EAAE,MAAgB;IAAlD,uBAAA,EAAA,YAAY;IACrE,IAAI,CAAC,SAAS,EAAE;QACZ,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;KACrC;IACD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IAEvB,IAAI,CAAC,MAAM,EAAE;QACT,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACzC;SAAM;QACH,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;KAClC;IACD,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEtF,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAEhE,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC","sourcesContent":["import { DeepImmutable, Nullable, float } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport { BoundingBox } from \"./boundingBox\";\r\nimport { BoundingSphere } from \"./boundingSphere\";\r\nimport { Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\n\r\ndeclare type Mesh = import(\"../Meshes/mesh\").Mesh;\r\n\r\n/**\r\n * Class representing a ray with position and direction\r\n */\r\nexport class Ray {\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(6, Vector3.Zero);\r\n private _tmpRay: Ray;\r\n\r\n /**\r\n * Creates a new ray\r\n * @param origin origin point\r\n * @param direction direction\r\n * @param length length of the ray\r\n */\r\n constructor(\r\n /** origin point */\r\n public origin: Vector3,\r\n /** direction */\r\n public direction: Vector3,\r\n /** length of the ray */\r\n public length: number = Number.MAX_VALUE\r\n ) { }\r\n\r\n // Methods\r\n\r\n /**\r\n * Clone the current ray\r\n * @returns a new ray\r\n */\r\n public clone(): Ray {\r\n return new Ray(this.origin.clone(), this.direction.clone(), this.length);\r\n }\r\n\r\n /**\r\n * Checks if the ray intersects a box\r\n * This does not account for the ray length by design to improve perfs.\r\n * @param minimum bound of the box\r\n * @param maximum bound of the box\r\n * @param intersectionTreshold extra extend to be added to the box in all direction\r\n * @returns if the box was hit\r\n */\r\n public intersectsBoxMinMax(minimum: DeepImmutable<Vector3>, maximum: DeepImmutable<Vector3>, intersectionTreshold: number = 0): boolean {\r\n const newMinimum = Ray._TmpVector3[0].copyFromFloats(minimum.x - intersectionTreshold, minimum.y - intersectionTreshold, minimum.z - intersectionTreshold);\r\n const newMaximum = Ray._TmpVector3[1].copyFromFloats(maximum.x + intersectionTreshold, maximum.y + intersectionTreshold, maximum.z + intersectionTreshold);\r\n var d = 0.0;\r\n var maxValue = Number.MAX_VALUE;\r\n var inv: number;\r\n var min: number;\r\n var max: number;\r\n var temp: number;\r\n if (Math.abs(this.direction.x) < 0.0000001) {\r\n if (this.origin.x < newMinimum.x || this.origin.x > newMaximum.x) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.x;\r\n min = (newMinimum.x - this.origin.x) * inv;\r\n max = (newMaximum.x - this.origin.x) * inv;\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Math.abs(this.direction.y) < 0.0000001) {\r\n if (this.origin.y < newMinimum.y || this.origin.y > newMaximum.y) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.y;\r\n min = (newMinimum.y - this.origin.y) * inv;\r\n max = (newMaximum.y - this.origin.y) * inv;\r\n\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Math.abs(this.direction.z) < 0.0000001) {\r\n if (this.origin.z < newMinimum.z || this.origin.z > newMaximum.z) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.z;\r\n min = (newMinimum.z - this.origin.z) * inv;\r\n max = (newMaximum.z - this.origin.z) * inv;\r\n\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks if the ray intersects a box\r\n * This does not account for the ray lenght by design to improve perfs.\r\n * @param box the bounding box to check\r\n * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction\r\n * @returns if the box was hit\r\n */\r\n public intersectsBox(box: DeepImmutable<BoundingBox>, intersectionTreshold: number = 0): boolean {\r\n return this.intersectsBoxMinMax(box.minimum, box.maximum, intersectionTreshold);\r\n }\r\n\r\n /**\r\n * If the ray hits a sphere\r\n * @param sphere the bounding sphere to check\r\n * @param intersectionTreshold extra extend to be added to the BoundingSphere in all direction\r\n * @returns true if it hits the sphere\r\n */\r\n public intersectsSphere(sphere: DeepImmutable<BoundingSphere>, intersectionTreshold: number = 0): boolean {\r\n var x = sphere.center.x - this.origin.x;\r\n var y = sphere.center.y - this.origin.y;\r\n var z = sphere.center.z - this.origin.z;\r\n var pyth = x * x + y * y + z * z;\r\n const radius = sphere.radius + intersectionTreshold;\r\n var rr = radius * radius;\r\n\r\n if (pyth <= rr) {\r\n return true;\r\n }\r\n\r\n var dot = x * this.direction.x + y * this.direction.y + z * this.direction.z;\r\n if (dot < 0.0) {\r\n return false;\r\n }\r\n\r\n var temp = pyth - dot * dot;\r\n\r\n return temp <= rr;\r\n }\r\n\r\n /**\r\n * If the ray hits a triange\r\n * @param vertex0 triangle vertex\r\n * @param vertex1 triangle vertex\r\n * @param vertex2 triangle vertex\r\n * @returns intersection information if hit\r\n */\r\n public intersectsTriangle(vertex0: DeepImmutable<Vector3>, vertex1: DeepImmutable<Vector3>, vertex2: DeepImmutable<Vector3>): Nullable<IntersectionInfo> {\r\n const edge1 = Ray._TmpVector3[0];\r\n const edge2 = Ray._TmpVector3[1];\r\n const pvec = Ray._TmpVector3[2];\r\n const tvec = Ray._TmpVector3[3];\r\n const qvec = Ray._TmpVector3[4];\r\n\r\n vertex1.subtractToRef(vertex0, edge1);\r\n vertex2.subtractToRef(vertex0, edge2);\r\n Vector3.CrossToRef(this.direction, edge2, pvec);\r\n var det = Vector3.Dot(edge1, pvec);\r\n\r\n if (det === 0) {\r\n return null;\r\n }\r\n\r\n var invdet = 1 / det;\r\n\r\n this.origin.subtractToRef(vertex0, tvec);\r\n\r\n var bv = Vector3.Dot(tvec, pvec) * invdet;\r\n\r\n if (bv < 0 || bv > 1.0) {\r\n return null;\r\n }\r\n\r\n Vector3.CrossToRef(tvec, edge1, qvec);\r\n\r\n var bw = Vector3.Dot(this.direction, qvec) * invdet;\r\n\r\n if (bw < 0 || bv + bw > 1.0) {\r\n return null;\r\n }\r\n\r\n //check if the distance is longer than the predefined length.\r\n var distance = Vector3.Dot(edge2, qvec) * invdet;\r\n if (distance > this.length) {\r\n return null;\r\n }\r\n\r\n return new IntersectionInfo(1 - bv - bw, bv, distance);\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a plane\r\n * @param plane the plane to check\r\n * @returns the distance away it was hit\r\n */\r\n public intersectsPlane(plane: DeepImmutable<Plane>): Nullable<number> {\r\n var distance: number;\r\n var result1 = Vector3.Dot(plane.normal, this.direction);\r\n if (Math.abs(result1) < 9.99999997475243e-7) {\r\n return null;\r\n } else {\r\n var result2 = Vector3.Dot(plane.normal, this.origin);\r\n distance = (-plane.d - result2) / result1;\r\n if (distance < 0.0) {\r\n if (distance < -9.99999997475243e-7) {\r\n return null;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n return distance;\r\n }\r\n }\r\n /**\r\n * Calculate the intercept of a ray on a given axis\r\n * @param axis to check 'x' | 'y' | 'z'\r\n * @param offset from axis interception (i.e. an offset of 1y is intercepted above ground)\r\n * @returns a vector containing the coordinates where 'axis' is equal to zero (else offset), or null if there is no intercept.\r\n */\r\n public intersectsAxis(axis: string, offset: number = 0): Nullable<Vector3> {\r\n switch (axis) {\r\n case \"y\":\r\n var t = (this.origin.y - offset) / this.direction.y;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(this.origin.x + this.direction.x * -t, offset, this.origin.z + this.direction.z * -t);\r\n case \"x\":\r\n var t = (this.origin.x - offset) / this.direction.x;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(offset, this.origin.y + this.direction.y * -t, this.origin.z + this.direction.z * -t);\r\n case \"z\":\r\n var t = (this.origin.z - offset) / this.direction.z;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(this.origin.x + this.direction.x * -t, this.origin.y + this.direction.y * -t, offset);\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a mesh\r\n * @param mesh the mesh to check\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @returns picking info of the intersection\r\n */\r\n public intersectsMesh(mesh: DeepImmutable<AbstractMesh>, fastCheck?: boolean): PickingInfo {\r\n var tm = TmpVectors.Matrix[0];\r\n\r\n mesh.getWorldMatrix().invertToRef(tm);\r\n\r\n if (this._tmpRay) {\r\n Ray.TransformToRef(this, tm, this._tmpRay);\r\n } else {\r\n this._tmpRay = Ray.Transform(this, tm);\r\n }\r\n\r\n return mesh.intersects(this._tmpRay, fastCheck);\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a mesh\r\n * @param meshes the meshes to check\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param results array to store result in\r\n * @returns Array of picking infos\r\n */\r\n public intersectsMeshes(meshes: Array<DeepImmutable<AbstractMesh>>, fastCheck?: boolean, results?: Array<PickingInfo>): Array<PickingInfo> {\r\n if (results) {\r\n results.length = 0;\r\n } else {\r\n results = [];\r\n }\r\n\r\n for (var i = 0; i < meshes.length; i++) {\r\n var pickInfo = this.intersectsMesh(meshes[i], fastCheck);\r\n\r\n if (pickInfo.hit) {\r\n results.push(pickInfo);\r\n }\r\n }\r\n\r\n results.sort(this._comparePickingInfo);\r\n\r\n return results;\r\n }\r\n\r\n private _comparePickingInfo(pickingInfoA: DeepImmutable<PickingInfo>, pickingInfoB: DeepImmutable<PickingInfo>): number {\r\n if (pickingInfoA.distance < pickingInfoB.distance) {\r\n return -1;\r\n } else if (pickingInfoA.distance > pickingInfoB.distance) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n private static smallnum = 0.00000001;\r\n private static rayl = 10e8;\r\n\r\n /**\r\n * Intersection test between the ray and a given segment within a given tolerance (threshold)\r\n * @param sega the first point of the segment to test the intersection against\r\n * @param segb the second point of the segment to test the intersection against\r\n * @param threshold the tolerance margin, if the ray doesn't intersect the segment but is close to the given threshold, the intersection is successful\r\n * @return the distance from the ray origin to the intersection point if there's intersection, or -1 if there's no intersection\r\n */\r\n intersectionSegment(sega: DeepImmutable<Vector3>, segb: DeepImmutable<Vector3>, threshold: number): number {\r\n const o = this.origin;\r\n const u = TmpVectors.Vector3[0];\r\n const rsegb = TmpVectors.Vector3[1];\r\n const v = TmpVectors.Vector3[2];\r\n const w = TmpVectors.Vector3[3];\r\n\r\n segb.subtractToRef(sega, u);\r\n\r\n this.direction.scaleToRef(Ray.rayl, v);\r\n o.addToRef(v, rsegb);\r\n\r\n sega.subtractToRef(o, w);\r\n\r\n var a = Vector3.Dot(u, u); // always >= 0\r\n var b = Vector3.Dot(u, v);\r\n var c = Vector3.Dot(v, v); // always >= 0\r\n var d = Vector3.Dot(u, w);\r\n var e = Vector3.Dot(v, w);\r\n var D = a * c - b * b; // always >= 0\r\n var sc: number,\r\n sN: number,\r\n sD = D; // sc = sN / sD, default sD = D >= 0\r\n var tc: number,\r\n tN: number,\r\n tD = D; // tc = tN / tD, default tD = D >= 0\r\n\r\n // compute the line parameters of the two closest points\r\n if (D < Ray.smallnum) {\r\n // the lines are almost parallel\r\n sN = 0.0; // force using point P0 on segment S1\r\n sD = 1.0; // to prevent possible division by 0.0 later\r\n tN = e;\r\n tD = c;\r\n } else {\r\n // get the closest points on the infinite lines\r\n sN = b * e - c * d;\r\n tN = a * e - b * d;\r\n if (sN < 0.0) {\r\n // sc < 0 => the s=0 edge is visible\r\n sN = 0.0;\r\n tN = e;\r\n tD = c;\r\n } else if (sN > sD) {\r\n // sc > 1 => the s=1 edge is visible\r\n sN = sD;\r\n tN = e + b;\r\n tD = c;\r\n }\r\n }\r\n\r\n if (tN < 0.0) {\r\n // tc < 0 => the t=0 edge is visible\r\n tN = 0.0;\r\n // recompute sc for this edge\r\n if (-d < 0.0) {\r\n sN = 0.0;\r\n } else if (-d > a) {\r\n sN = sD;\r\n } else {\r\n sN = -d;\r\n sD = a;\r\n }\r\n } else if (tN > tD) {\r\n // tc > 1 => the t=1 edge is visible\r\n tN = tD;\r\n // recompute sc for this edge\r\n if (-d + b < 0.0) {\r\n sN = 0;\r\n } else if (-d + b > a) {\r\n sN = sD;\r\n } else {\r\n sN = -d + b;\r\n sD = a;\r\n }\r\n }\r\n // finally do the division to get sc and tc\r\n sc = Math.abs(sN) < Ray.smallnum ? 0.0 : sN / sD;\r\n tc = Math.abs(tN) < Ray.smallnum ? 0.0 : tN / tD;\r\n\r\n // get the difference of the two closest points\r\n const qtc = TmpVectors.Vector3[4];\r\n v.scaleToRef(tc, qtc);\r\n const qsc = TmpVectors.Vector3[5];\r\n u.scaleToRef(sc, qsc);\r\n qsc.addInPlace(w);\r\n const dP = TmpVectors.Vector3[6];\r\n qsc.subtractToRef(qtc, dP); // = S1(sc) - S2(tc)\r\n\r\n var isIntersected = tc > 0 && tc <= this.length && dP.lengthSquared() < threshold * threshold; // return intersection result\r\n\r\n if (isIntersected) {\r\n return qsc.length();\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Update the ray from viewport position\r\n * @param x position\r\n * @param y y position\r\n * @param viewportWidth viewport width\r\n * @param viewportHeight viewport height\r\n * @param world world matrix\r\n * @param view view matrix\r\n * @param projection projection matrix\r\n * @returns this ray updated\r\n */\r\n public update(x: number, y: number, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>): Ray {\r\n this.unprojectRayToRef(x, y, viewportWidth, viewportHeight, world, view, projection);\r\n return this;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a ray with origin and direction of 0,0,0\r\n * @returns the new ray\r\n */\r\n public static Zero(): Ray {\r\n return new Ray(Vector3.Zero(), Vector3.Zero());\r\n }\r\n\r\n /**\r\n * Creates a new ray from screen space and viewport\r\n * @param x position\r\n * @param y y position\r\n * @param viewportWidth viewport width\r\n * @param viewportHeight viewport height\r\n * @param world world matrix\r\n * @param view view matrix\r\n * @param projection projection matrix\r\n * @returns new ray\r\n */\r\n public static CreateNew(x: number, y: number, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>): Ray {\r\n let result = Ray.Zero();\r\n\r\n return result.update(x, y, viewportWidth, viewportHeight, world, view, projection);\r\n }\r\n\r\n /**\r\n * Function will create a new transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\r\n * transformed to the given world matrix.\r\n * @param origin The origin point\r\n * @param end The end point\r\n * @param world a matrix to transform the ray to. Default is the identity matrix.\r\n * @returns the new ray\r\n */\r\n public static CreateNewFromTo(origin: Vector3, end: Vector3, world: DeepImmutable<Matrix> = Matrix.IdentityReadOnly): Ray {\r\n var direction = end.subtract(origin);\r\n var length = Math.sqrt(direction.x * direction.x + direction.y * direction.y + direction.z * direction.z);\r\n direction.normalize();\r\n\r\n return Ray.Transform(new Ray(origin, direction, length), world);\r\n }\r\n\r\n /**\r\n * Transforms a ray by a matrix\r\n * @param ray ray to transform\r\n * @param matrix matrix to apply\r\n * @returns the resulting new ray\r\n */\r\n public static Transform(ray: DeepImmutable<Ray>, matrix: DeepImmutable<Matrix>): Ray {\r\n var result = new Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\r\n Ray.TransformToRef(ray, matrix, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Transforms a ray by a matrix\r\n * @param ray ray to transform\r\n * @param matrix matrix to apply\r\n * @param result ray to store result in\r\n */\r\n public static TransformToRef(ray: DeepImmutable<Ray>, matrix: DeepImmutable<Matrix>, result: Ray): void {\r\n Vector3.TransformCoordinatesToRef(ray.origin, matrix, result.origin);\r\n Vector3.TransformNormalToRef(ray.direction, matrix, result.direction);\r\n result.length = ray.length;\r\n\r\n var dir = result.direction;\r\n var len = dir.length();\r\n\r\n if (!(len === 0 || len === 1)) {\r\n var num = 1.0 / len;\r\n dir.x *= num;\r\n dir.y *= num;\r\n dir.z *= num;\r\n result.length *= len;\r\n }\r\n }\r\n\r\n /**\r\n * Unproject a ray from screen space to object space\r\n * @param sourceX defines the screen space x coordinate to use\r\n * @param sourceY defines the screen space y coordinate to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n */\r\n public unprojectRayToRef(sourceX: float, sourceY: float, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>): void {\r\n var matrix = TmpVectors.Matrix[0];\r\n world.multiplyToRef(view, matrix);\r\n matrix.multiplyToRef(projection, matrix);\r\n matrix.invert();\r\n var nearScreenSource = TmpVectors.Vector3[0];\r\n nearScreenSource.x = (sourceX / viewportWidth) * 2 - 1;\r\n nearScreenSource.y = -((sourceY / viewportHeight) * 2 - 1);\r\n nearScreenSource.z = -1.0;\r\n var farScreenSource = TmpVectors.Vector3[1].copyFromFloats(nearScreenSource.x, nearScreenSource.y, 1.0);\r\n const nearVec3 = TmpVectors.Vector3[2];\r\n const farVec3 = TmpVectors.Vector3[3];\r\n Vector3._UnprojectFromInvertedMatrixToRef(nearScreenSource, matrix, nearVec3);\r\n Vector3._UnprojectFromInvertedMatrixToRef(farScreenSource, matrix, farVec3);\r\n\r\n this.origin.copyFrom(nearVec3);\r\n farVec3.subtractToRef(nearVec3, this.direction);\r\n this.direction.normalize();\r\n }\r\n}\r\n\r\n// Picking\r\n/**\r\n * Type used to define predicate used to select faces when a mesh intersection is detected\r\n */\r\nexport type TrianglePickingPredicate = (p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean;\r\n\r\ndeclare module \"../scene\" {\r\n export interface Scene {\r\n /** @hidden */\r\n _tempPickingRay: Nullable<Ray>;\r\n\r\n /** @hidden */\r\n _cachedRayForTransform: Ray;\r\n\r\n /** @hidden */\r\n _pickWithRayInverseMatrix: Matrix;\r\n\r\n /** @hidden */\r\n _internalPick(rayFunction: (world: Matrix) => Ray, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, onlyBoundingInfo?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo>;\r\n\r\n /** @hidden */\r\n _internalMultiPick(rayFunction: (world: Matrix) => Ray, predicate?: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]>;\r\n\r\n /** @hidden */\r\n _internalPickForMesh(pickingInfo: Nullable<PickingInfo>, rayFunction: (world: Matrix) => Ray, mesh: AbstractMesh, world: Matrix, fastCheck?: boolean, onlyBoundingInfo?: boolean, trianglePredicate?: TrianglePickingPredicate, skipBoundingInfo?: boolean): Nullable<PickingInfo>;\r\n }\r\n}\r\n\r\nScene.prototype.createPickingRay = function (x: number, y: number, world: Nullable<Matrix>, camera: Nullable<Camera>, cameraViewSpace = false): Ray {\r\n let result = Ray.Zero();\r\n\r\n this.createPickingRayToRef(x, y, world, result, camera, cameraViewSpace);\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype.createPickingRayToRef = function (x: number, y: number, world: Nullable<Matrix>, result: Ray, camera: Nullable<Camera>, cameraViewSpace = false): Scene {\r\n var engine = this.getEngine();\r\n\r\n if (!camera) {\r\n if (!this.activeCamera) {\r\n return this;\r\n }\r\n\r\n camera = this.activeCamera;\r\n }\r\n\r\n var cameraViewport = camera.viewport;\r\n var viewport = cameraViewport.toGlobal(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n // Moving coordinates to local viewport world\r\n x = x / engine.getHardwareScalingLevel() - viewport.x;\r\n y = y / engine.getHardwareScalingLevel() - (engine.getRenderHeight() - viewport.y - viewport.height);\r\n\r\n result.update(x, y, viewport.width, viewport.height, world ? world : Matrix.IdentityReadOnly, cameraViewSpace ? Matrix.IdentityReadOnly : camera.getViewMatrix(), camera.getProjectionMatrix());\r\n return this;\r\n};\r\n\r\nScene.prototype.createPickingRayInCameraSpace = function (x: number, y: number, camera?: Camera): Ray {\r\n let result = Ray.Zero();\r\n\r\n this.createPickingRayInCameraSpaceToRef(x, y, result, camera);\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype.createPickingRayInCameraSpaceToRef = function (x: number, y: number, result: Ray, camera?: Camera): Scene {\r\n if (!PickingInfo) {\r\n return this;\r\n }\r\n\r\n var engine = this.getEngine();\r\n\r\n if (!camera) {\r\n if (!this.activeCamera) {\r\n throw new Error(\"Active camera not set\");\r\n }\r\n\r\n camera = this.activeCamera;\r\n }\r\n\r\n var cameraViewport = camera.viewport;\r\n var viewport = cameraViewport.toGlobal(engine.getRenderWidth(), engine.getRenderHeight());\r\n var identity = Matrix.Identity();\r\n\r\n // Moving coordinates to local viewport world\r\n x = x / engine.getHardwareScalingLevel() - viewport.x;\r\n y = y / engine.getHardwareScalingLevel() - (engine.getRenderHeight() - viewport.y - viewport.height);\r\n result.update(x, y, viewport.width, viewport.height, identity, identity, camera.getProjectionMatrix());\r\n return this;\r\n};\r\n\r\nScene.prototype._internalPickForMesh = function (pickingInfo: Nullable<PickingInfo>, rayFunction: (world: Matrix) => Ray, mesh: AbstractMesh, world: Matrix, fastCheck?: boolean, onlyBoundingInfo?: boolean, trianglePredicate?: TrianglePickingPredicate, skipBoundingInfo?: boolean) {\r\n let ray = rayFunction(world);\r\n\r\n let result = mesh.intersects(ray, fastCheck, trianglePredicate, onlyBoundingInfo, world, skipBoundingInfo);\r\n if (!result || !result.hit) {\r\n return null;\r\n }\r\n\r\n if (!fastCheck && pickingInfo != null && result.distance >= pickingInfo.distance) {\r\n return null;\r\n }\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype._internalPick = function (rayFunction: (world: Matrix) => Ray, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, onlyBoundingInfo?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo> {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n\r\n let pickingInfo = null;\r\n\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n let mesh = this.meshes[meshIndex];\r\n\r\n if (predicate) {\r\n if (!predicate(mesh)) {\r\n continue;\r\n }\r\n } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) {\r\n continue;\r\n }\r\n\r\n let world = mesh.skeleton && mesh.skeleton.overrideMesh ? mesh.skeleton.overrideMesh.getWorldMatrix() : mesh.getWorldMatrix();\r\n\r\n if (mesh.hasThinInstances && (mesh as Mesh).thinInstanceEnablePicking) {\r\n // first check if the ray intersects the whole bounding box/sphere of the mesh\r\n let result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, true, true, trianglePredicate);\r\n if (result) {\r\n if (onlyBoundingInfo) {\r\n // the user only asked for a bounding info check so we can return\r\n return pickingInfo;\r\n }\r\n const tmpMatrix = TmpVectors.Matrix[1];\r\n let thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices();\r\n for (let index = 0; index < thinMatrices.length; index++) {\r\n let thinMatrix = thinMatrices[index];\r\n thinMatrix.multiplyToRef(world, tmpMatrix);\r\n let result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, tmpMatrix, fastCheck, onlyBoundingInfo, trianglePredicate, true);\r\n\r\n if (result) {\r\n pickingInfo = result;\r\n pickingInfo.thinInstanceIndex = index;\r\n\r\n if (fastCheck) {\r\n return pickingInfo;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n let result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, fastCheck, onlyBoundingInfo, trianglePredicate);\r\n\r\n if (result) {\r\n pickingInfo = result;\r\n\r\n if (fastCheck) {\r\n return pickingInfo;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return pickingInfo || new PickingInfo();\r\n};\r\n\r\nScene.prototype._internalMultiPick = function (rayFunction: (world: Matrix) => Ray, predicate?: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]> {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n let pickingInfos = new Array<PickingInfo>();\r\n\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n let mesh = this.meshes[meshIndex];\r\n\r\n if (predicate) {\r\n if (!predicate(mesh)) {\r\n continue;\r\n }\r\n } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) {\r\n continue;\r\n }\r\n\r\n let world = mesh.skeleton && mesh.skeleton.overrideMesh ? mesh.skeleton.overrideMesh.getWorldMatrix() : mesh.getWorldMatrix();\r\n\r\n if (mesh.hasThinInstances && (mesh as Mesh).thinInstanceEnablePicking) {\r\n let result = this._internalPickForMesh(null, rayFunction, mesh, world, true, true, trianglePredicate);\r\n if (result) {\r\n const tmpMatrix = TmpVectors.Matrix[1];\r\n let thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices();\r\n for (let index = 0; index < thinMatrices.length; index++) {\r\n let thinMatrix = thinMatrices[index];\r\n thinMatrix.multiplyToRef(world, tmpMatrix);\r\n let result = this._internalPickForMesh(null, rayFunction, mesh, tmpMatrix, false, false, trianglePredicate, true);\r\n\r\n if (result) {\r\n result.thinInstanceIndex = index;\r\n pickingInfos.push(result);\r\n }\r\n }\r\n }\r\n } else {\r\n let result = this._internalPickForMesh(null, rayFunction, mesh, world, false, false, trianglePredicate);\r\n\r\n if (result) {\r\n pickingInfos.push(result);\r\n }\r\n }\r\n }\r\n\r\n return pickingInfos;\r\n};\r\n\r\nScene.prototype.pickWithBoundingInfo = function (x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, camera?: Nullable<Camera>): Nullable<PickingInfo> {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n var result = this._internalPick(\r\n (world) => {\r\n if (!this._tempPickingRay) {\r\n this._tempPickingRay = Ray.Zero();\r\n }\r\n\r\n this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null);\r\n return this._tempPickingRay;\r\n },\r\n predicate,\r\n fastCheck,\r\n true\r\n );\r\n if (result) {\r\n result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null);\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.pick = function (x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, camera?: Nullable<Camera>, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo> {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n var result = this._internalPick(\r\n (world) => {\r\n if (!this._tempPickingRay) {\r\n this._tempPickingRay = Ray.Zero();\r\n }\r\n\r\n this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null);\r\n return this._tempPickingRay;\r\n },\r\n predicate,\r\n fastCheck,\r\n false,\r\n trianglePredicate\r\n );\r\n if (result) {\r\n result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null);\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.pickWithRay = function (ray: Ray, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo> {\r\n var result = this._internalPick(\r\n (world) => {\r\n if (!this._pickWithRayInverseMatrix) {\r\n this._pickWithRayInverseMatrix = Matrix.Identity();\r\n }\r\n world.invertToRef(this._pickWithRayInverseMatrix);\r\n\r\n if (!this._cachedRayForTransform) {\r\n this._cachedRayForTransform = Ray.Zero();\r\n }\r\n\r\n Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform);\r\n return this._cachedRayForTransform;\r\n },\r\n predicate,\r\n fastCheck,\r\n false,\r\n trianglePredicate\r\n );\r\n if (result) {\r\n result.ray = ray;\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.multiPick = function (x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, camera?: Camera, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]> {\r\n return this._internalMultiPick((world) => this.createPickingRay(x, y, world, camera || null), predicate, trianglePredicate);\r\n};\r\n\r\nScene.prototype.multiPickWithRay = function (ray: Ray, predicate: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]> {\r\n return this._internalMultiPick(\r\n (world) => {\r\n if (!this._pickWithRayInverseMatrix) {\r\n this._pickWithRayInverseMatrix = Matrix.Identity();\r\n }\r\n world.invertToRef(this._pickWithRayInverseMatrix);\r\n\r\n if (!this._cachedRayForTransform) {\r\n this._cachedRayForTransform = Ray.Zero();\r\n }\r\n\r\n Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform);\r\n return this._cachedRayForTransform;\r\n },\r\n predicate,\r\n trianglePredicate\r\n );\r\n};\r\n\r\nCamera.prototype.getForwardRay = function (length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n return this.getForwardRayToRef(new Ray(Vector3.Zero(), Vector3.Zero(), length), length, transform, origin);\r\n};\r\n\r\nCamera.prototype.getForwardRayToRef = function (refRay: Ray, length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n if (!transform) {\r\n transform = this.getWorldMatrix();\r\n }\r\n refRay.length = length;\r\n\r\n if (!origin) {\r\n refRay.origin.copyFrom(this.position);\r\n } else {\r\n refRay.origin.copyFrom(origin);\r\n }\r\n TmpVectors.Vector3[2].set(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(TmpVectors.Vector3[2], transform, TmpVectors.Vector3[3]);\r\n\r\n Vector3.NormalizeToRef(TmpVectors.Vector3[3], refRay.direction);\r\n\r\n return refRay;\r\n};\r\n"]}
1
+ {"version":3,"file":"ray.js","sourceRoot":"","sources":["../../../sourceES6/core/Culling/ray.ts"],"names":[],"mappings":"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","sourcesContent":["import { DeepImmutable, Nullable, float } from \"../types\";\r\nimport { ArrayTools } from \"../Misc/arrayTools\";\r\nimport { Matrix, Vector3, TmpVectors } from \"../Maths/math.vector\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { PickingInfo } from \"../Collisions/pickingInfo\";\r\nimport { IntersectionInfo } from \"../Collisions/intersectionInfo\";\r\nimport { BoundingBox } from \"./boundingBox\";\r\nimport { BoundingSphere } from \"./boundingSphere\";\r\nimport { Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { Plane } from \"../Maths/math.plane\";\r\n\r\ndeclare type Mesh = import(\"../Meshes/mesh\").Mesh;\r\n\r\n/**\r\n * Class representing a ray with position and direction\r\n */\r\nexport class Ray {\r\n private static readonly _TmpVector3 = ArrayTools.BuildArray(6, Vector3.Zero);\r\n private _tmpRay: Ray;\r\n\r\n /**\r\n * Creates a new ray\r\n * @param origin origin point\r\n * @param direction direction\r\n * @param length length of the ray\r\n */\r\n constructor(\r\n /** origin point */\r\n public origin: Vector3,\r\n /** direction */\r\n public direction: Vector3,\r\n /** length of the ray */\r\n public length: number = Number.MAX_VALUE\r\n ) { }\r\n\r\n // Methods\r\n\r\n /**\r\n * Clone the current ray\r\n * @returns a new ray\r\n */\r\n public clone(): Ray {\r\n return new Ray(this.origin.clone(), this.direction.clone(), this.length);\r\n }\r\n\r\n /**\r\n * Checks if the ray intersects a box\r\n * This does not account for the ray length by design to improve perfs.\r\n * @param minimum bound of the box\r\n * @param maximum bound of the box\r\n * @param intersectionTreshold extra extend to be added to the box in all direction\r\n * @returns if the box was hit\r\n */\r\n public intersectsBoxMinMax(minimum: DeepImmutable<Vector3>, maximum: DeepImmutable<Vector3>, intersectionTreshold: number = 0): boolean {\r\n const newMinimum = Ray._TmpVector3[0].copyFromFloats(minimum.x - intersectionTreshold, minimum.y - intersectionTreshold, minimum.z - intersectionTreshold);\r\n const newMaximum = Ray._TmpVector3[1].copyFromFloats(maximum.x + intersectionTreshold, maximum.y + intersectionTreshold, maximum.z + intersectionTreshold);\r\n var d = 0.0;\r\n var maxValue = Number.MAX_VALUE;\r\n var inv: number;\r\n var min: number;\r\n var max: number;\r\n var temp: number;\r\n if (Math.abs(this.direction.x) < 0.0000001) {\r\n if (this.origin.x < newMinimum.x || this.origin.x > newMaximum.x) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.x;\r\n min = (newMinimum.x - this.origin.x) * inv;\r\n max = (newMaximum.x - this.origin.x) * inv;\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Math.abs(this.direction.y) < 0.0000001) {\r\n if (this.origin.y < newMinimum.y || this.origin.y > newMaximum.y) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.y;\r\n min = (newMinimum.y - this.origin.y) * inv;\r\n max = (newMaximum.y - this.origin.y) * inv;\r\n\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n\r\n if (Math.abs(this.direction.z) < 0.0000001) {\r\n if (this.origin.z < newMinimum.z || this.origin.z > newMaximum.z) {\r\n return false;\r\n }\r\n } else {\r\n inv = 1.0 / this.direction.z;\r\n min = (newMinimum.z - this.origin.z) * inv;\r\n max = (newMaximum.z - this.origin.z) * inv;\r\n\r\n if (max === -Infinity) {\r\n max = Infinity;\r\n }\r\n\r\n if (min > max) {\r\n temp = min;\r\n min = max;\r\n max = temp;\r\n }\r\n\r\n d = Math.max(min, d);\r\n maxValue = Math.min(max, maxValue);\r\n\r\n if (d > maxValue) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Checks if the ray intersects a box\r\n * This does not account for the ray lenght by design to improve perfs.\r\n * @param box the bounding box to check\r\n * @param intersectionTreshold extra extend to be added to the BoundingBox in all direction\r\n * @returns if the box was hit\r\n */\r\n public intersectsBox(box: DeepImmutable<BoundingBox>, intersectionTreshold: number = 0): boolean {\r\n return this.intersectsBoxMinMax(box.minimum, box.maximum, intersectionTreshold);\r\n }\r\n\r\n /**\r\n * If the ray hits a sphere\r\n * @param sphere the bounding sphere to check\r\n * @param intersectionTreshold extra extend to be added to the BoundingSphere in all direction\r\n * @returns true if it hits the sphere\r\n */\r\n public intersectsSphere(sphere: DeepImmutable<BoundingSphere>, intersectionTreshold: number = 0): boolean {\r\n var x = sphere.center.x - this.origin.x;\r\n var y = sphere.center.y - this.origin.y;\r\n var z = sphere.center.z - this.origin.z;\r\n var pyth = x * x + y * y + z * z;\r\n const radius = sphere.radius + intersectionTreshold;\r\n var rr = radius * radius;\r\n\r\n if (pyth <= rr) {\r\n return true;\r\n }\r\n\r\n var dot = x * this.direction.x + y * this.direction.y + z * this.direction.z;\r\n if (dot < 0.0) {\r\n return false;\r\n }\r\n\r\n var temp = pyth - dot * dot;\r\n\r\n return temp <= rr;\r\n }\r\n\r\n /**\r\n * If the ray hits a triange\r\n * @param vertex0 triangle vertex\r\n * @param vertex1 triangle vertex\r\n * @param vertex2 triangle vertex\r\n * @returns intersection information if hit\r\n */\r\n public intersectsTriangle(vertex0: DeepImmutable<Vector3>, vertex1: DeepImmutable<Vector3>, vertex2: DeepImmutable<Vector3>): Nullable<IntersectionInfo> {\r\n const edge1 = Ray._TmpVector3[0];\r\n const edge2 = Ray._TmpVector3[1];\r\n const pvec = Ray._TmpVector3[2];\r\n const tvec = Ray._TmpVector3[3];\r\n const qvec = Ray._TmpVector3[4];\r\n\r\n vertex1.subtractToRef(vertex0, edge1);\r\n vertex2.subtractToRef(vertex0, edge2);\r\n Vector3.CrossToRef(this.direction, edge2, pvec);\r\n var det = Vector3.Dot(edge1, pvec);\r\n\r\n if (det === 0) {\r\n return null;\r\n }\r\n\r\n var invdet = 1 / det;\r\n\r\n this.origin.subtractToRef(vertex0, tvec);\r\n\r\n var bv = Vector3.Dot(tvec, pvec) * invdet;\r\n\r\n if (bv < 0 || bv > 1.0) {\r\n return null;\r\n }\r\n\r\n Vector3.CrossToRef(tvec, edge1, qvec);\r\n\r\n var bw = Vector3.Dot(this.direction, qvec) * invdet;\r\n\r\n if (bw < 0 || bv + bw > 1.0) {\r\n return null;\r\n }\r\n\r\n //check if the distance is longer than the predefined length.\r\n var distance = Vector3.Dot(edge2, qvec) * invdet;\r\n if (distance > this.length) {\r\n return null;\r\n }\r\n\r\n return new IntersectionInfo(1 - bv - bw, bv, distance);\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a plane\r\n * @param plane the plane to check\r\n * @returns the distance away it was hit\r\n */\r\n public intersectsPlane(plane: DeepImmutable<Plane>): Nullable<number> {\r\n var distance: number;\r\n var result1 = Vector3.Dot(plane.normal, this.direction);\r\n if (Math.abs(result1) < 9.99999997475243e-7) {\r\n return null;\r\n } else {\r\n var result2 = Vector3.Dot(plane.normal, this.origin);\r\n distance = (-plane.d - result2) / result1;\r\n if (distance < 0.0) {\r\n if (distance < -9.99999997475243e-7) {\r\n return null;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n return distance;\r\n }\r\n }\r\n /**\r\n * Calculate the intercept of a ray on a given axis\r\n * @param axis to check 'x' | 'y' | 'z'\r\n * @param offset from axis interception (i.e. an offset of 1y is intercepted above ground)\r\n * @returns a vector containing the coordinates where 'axis' is equal to zero (else offset), or null if there is no intercept.\r\n */\r\n public intersectsAxis(axis: string, offset: number = 0): Nullable<Vector3> {\r\n switch (axis) {\r\n case \"y\":\r\n var t = (this.origin.y - offset) / this.direction.y;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(this.origin.x + this.direction.x * -t, offset, this.origin.z + this.direction.z * -t);\r\n case \"x\":\r\n var t = (this.origin.x - offset) / this.direction.x;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(offset, this.origin.y + this.direction.y * -t, this.origin.z + this.direction.z * -t);\r\n case \"z\":\r\n var t = (this.origin.z - offset) / this.direction.z;\r\n if (t > 0) {\r\n return null;\r\n }\r\n return new Vector3(this.origin.x + this.direction.x * -t, this.origin.y + this.direction.y * -t, offset);\r\n default:\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a mesh\r\n * @param mesh the mesh to check\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @returns picking info of the intersection\r\n */\r\n public intersectsMesh(mesh: DeepImmutable<AbstractMesh>, fastCheck?: boolean): PickingInfo {\r\n var tm = TmpVectors.Matrix[0];\r\n\r\n mesh.getWorldMatrix().invertToRef(tm);\r\n\r\n if (this._tmpRay) {\r\n Ray.TransformToRef(this, tm, this._tmpRay);\r\n } else {\r\n this._tmpRay = Ray.Transform(this, tm);\r\n }\r\n\r\n return mesh.intersects(this._tmpRay, fastCheck);\r\n }\r\n\r\n /**\r\n * Checks if ray intersects a mesh\r\n * @param meshes the meshes to check\r\n * @param fastCheck defines if the first intersection will be used (and not the closest)\r\n * @param results array to store result in\r\n * @returns Array of picking infos\r\n */\r\n public intersectsMeshes(meshes: Array<DeepImmutable<AbstractMesh>>, fastCheck?: boolean, results?: Array<PickingInfo>): Array<PickingInfo> {\r\n if (results) {\r\n results.length = 0;\r\n } else {\r\n results = [];\r\n }\r\n\r\n for (var i = 0; i < meshes.length; i++) {\r\n var pickInfo = this.intersectsMesh(meshes[i], fastCheck);\r\n\r\n if (pickInfo.hit) {\r\n results.push(pickInfo);\r\n }\r\n }\r\n\r\n results.sort(this._comparePickingInfo);\r\n\r\n return results;\r\n }\r\n\r\n private _comparePickingInfo(pickingInfoA: DeepImmutable<PickingInfo>, pickingInfoB: DeepImmutable<PickingInfo>): number {\r\n if (pickingInfoA.distance < pickingInfoB.distance) {\r\n return -1;\r\n } else if (pickingInfoA.distance > pickingInfoB.distance) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n private static smallnum = 0.00000001;\r\n private static rayl = 10e8;\r\n\r\n /**\r\n * Intersection test between the ray and a given segment within a given tolerance (threshold)\r\n * @param sega the first point of the segment to test the intersection against\r\n * @param segb the second point of the segment to test the intersection against\r\n * @param threshold the tolerance margin, if the ray doesn't intersect the segment but is close to the given threshold, the intersection is successful\r\n * @return the distance from the ray origin to the intersection point if there's intersection, or -1 if there's no intersection\r\n */\r\n intersectionSegment(sega: DeepImmutable<Vector3>, segb: DeepImmutable<Vector3>, threshold: number): number {\r\n const o = this.origin;\r\n const u = TmpVectors.Vector3[0];\r\n const rsegb = TmpVectors.Vector3[1];\r\n const v = TmpVectors.Vector3[2];\r\n const w = TmpVectors.Vector3[3];\r\n\r\n segb.subtractToRef(sega, u);\r\n\r\n this.direction.scaleToRef(Ray.rayl, v);\r\n o.addToRef(v, rsegb);\r\n\r\n sega.subtractToRef(o, w);\r\n\r\n var a = Vector3.Dot(u, u); // always >= 0\r\n var b = Vector3.Dot(u, v);\r\n var c = Vector3.Dot(v, v); // always >= 0\r\n var d = Vector3.Dot(u, w);\r\n var e = Vector3.Dot(v, w);\r\n var D = a * c - b * b; // always >= 0\r\n var sc: number,\r\n sN: number,\r\n sD = D; // sc = sN / sD, default sD = D >= 0\r\n var tc: number,\r\n tN: number,\r\n tD = D; // tc = tN / tD, default tD = D >= 0\r\n\r\n // compute the line parameters of the two closest points\r\n if (D < Ray.smallnum) {\r\n // the lines are almost parallel\r\n sN = 0.0; // force using point P0 on segment S1\r\n sD = 1.0; // to prevent possible division by 0.0 later\r\n tN = e;\r\n tD = c;\r\n } else {\r\n // get the closest points on the infinite lines\r\n sN = b * e - c * d;\r\n tN = a * e - b * d;\r\n if (sN < 0.0) {\r\n // sc < 0 => the s=0 edge is visible\r\n sN = 0.0;\r\n tN = e;\r\n tD = c;\r\n } else if (sN > sD) {\r\n // sc > 1 => the s=1 edge is visible\r\n sN = sD;\r\n tN = e + b;\r\n tD = c;\r\n }\r\n }\r\n\r\n if (tN < 0.0) {\r\n // tc < 0 => the t=0 edge is visible\r\n tN = 0.0;\r\n // recompute sc for this edge\r\n if (-d < 0.0) {\r\n sN = 0.0;\r\n } else if (-d > a) {\r\n sN = sD;\r\n } else {\r\n sN = -d;\r\n sD = a;\r\n }\r\n } else if (tN > tD) {\r\n // tc > 1 => the t=1 edge is visible\r\n tN = tD;\r\n // recompute sc for this edge\r\n if (-d + b < 0.0) {\r\n sN = 0;\r\n } else if (-d + b > a) {\r\n sN = sD;\r\n } else {\r\n sN = -d + b;\r\n sD = a;\r\n }\r\n }\r\n // finally do the division to get sc and tc\r\n sc = Math.abs(sN) < Ray.smallnum ? 0.0 : sN / sD;\r\n tc = Math.abs(tN) < Ray.smallnum ? 0.0 : tN / tD;\r\n\r\n // get the difference of the two closest points\r\n const qtc = TmpVectors.Vector3[4];\r\n v.scaleToRef(tc, qtc);\r\n const qsc = TmpVectors.Vector3[5];\r\n u.scaleToRef(sc, qsc);\r\n qsc.addInPlace(w);\r\n const dP = TmpVectors.Vector3[6];\r\n qsc.subtractToRef(qtc, dP); // = S1(sc) - S2(tc)\r\n\r\n var isIntersected = tc > 0 && tc <= this.length && dP.lengthSquared() < threshold * threshold; // return intersection result\r\n\r\n if (isIntersected) {\r\n return qsc.length();\r\n }\r\n return -1;\r\n }\r\n\r\n /**\r\n * Update the ray from viewport position\r\n * @param x position\r\n * @param y y position\r\n * @param viewportWidth viewport width\r\n * @param viewportHeight viewport height\r\n * @param world world matrix\r\n * @param view view matrix\r\n * @param projection projection matrix\r\n * @returns this ray updated\r\n */\r\n public update(x: number, y: number, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>): Ray {\r\n this.unprojectRayToRef(x, y, viewportWidth, viewportHeight, world, view, projection);\r\n return this;\r\n }\r\n\r\n // Statics\r\n /**\r\n * Creates a ray with origin and direction of 0,0,0\r\n * @returns the new ray\r\n */\r\n public static Zero(): Ray {\r\n return new Ray(Vector3.Zero(), Vector3.Zero());\r\n }\r\n\r\n /**\r\n * Creates a new ray from screen space and viewport\r\n * @param x position\r\n * @param y y position\r\n * @param viewportWidth viewport width\r\n * @param viewportHeight viewport height\r\n * @param world world matrix\r\n * @param view view matrix\r\n * @param projection projection matrix\r\n * @returns new ray\r\n */\r\n public static CreateNew(x: number, y: number, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>): Ray {\r\n let result = Ray.Zero();\r\n\r\n return result.update(x, y, viewportWidth, viewportHeight, world, view, projection);\r\n }\r\n\r\n /**\r\n * Function will create a new transformed ray starting from origin and ending at the end point. Ray's length will be set, and ray will be\r\n * transformed to the given world matrix.\r\n * @param origin The origin point\r\n * @param end The end point\r\n * @param world a matrix to transform the ray to. Default is the identity matrix.\r\n * @returns the new ray\r\n */\r\n public static CreateNewFromTo(origin: Vector3, end: Vector3, world: DeepImmutable<Matrix> = Matrix.IdentityReadOnly): Ray {\r\n var direction = end.subtract(origin);\r\n var length = Math.sqrt(direction.x * direction.x + direction.y * direction.y + direction.z * direction.z);\r\n direction.normalize();\r\n\r\n return Ray.Transform(new Ray(origin, direction, length), world);\r\n }\r\n\r\n /**\r\n * Transforms a ray by a matrix\r\n * @param ray ray to transform\r\n * @param matrix matrix to apply\r\n * @returns the resulting new ray\r\n */\r\n public static Transform(ray: DeepImmutable<Ray>, matrix: DeepImmutable<Matrix>): Ray {\r\n var result = new Ray(new Vector3(0, 0, 0), new Vector3(0, 0, 0));\r\n Ray.TransformToRef(ray, matrix, result);\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Transforms a ray by a matrix\r\n * @param ray ray to transform\r\n * @param matrix matrix to apply\r\n * @param result ray to store result in\r\n */\r\n public static TransformToRef(ray: DeepImmutable<Ray>, matrix: DeepImmutable<Matrix>, result: Ray): void {\r\n Vector3.TransformCoordinatesToRef(ray.origin, matrix, result.origin);\r\n Vector3.TransformNormalToRef(ray.direction, matrix, result.direction);\r\n result.length = ray.length;\r\n\r\n var dir = result.direction;\r\n var len = dir.length();\r\n\r\n if (!(len === 0 || len === 1)) {\r\n var num = 1.0 / len;\r\n dir.x *= num;\r\n dir.y *= num;\r\n dir.z *= num;\r\n result.length *= len;\r\n }\r\n }\r\n\r\n /**\r\n * Unproject a ray from screen space to object space\r\n * @param sourceX defines the screen space x coordinate to use\r\n * @param sourceY defines the screen space y coordinate to use\r\n * @param viewportWidth defines the current width of the viewport\r\n * @param viewportHeight defines the current height of the viewport\r\n * @param world defines the world matrix to use (can be set to Identity to go to world space)\r\n * @param view defines the view matrix to use\r\n * @param projection defines the projection matrix to use\r\n */\r\n public unprojectRayToRef(sourceX: float, sourceY: float, viewportWidth: number, viewportHeight: number, world: DeepImmutable<Matrix>, view: DeepImmutable<Matrix>, projection: DeepImmutable<Matrix>): void {\r\n var matrix = TmpVectors.Matrix[0];\r\n world.multiplyToRef(view, matrix);\r\n matrix.multiplyToRef(projection, matrix);\r\n matrix.invert();\r\n var nearScreenSource = TmpVectors.Vector3[0];\r\n nearScreenSource.x = (sourceX / viewportWidth) * 2 - 1;\r\n nearScreenSource.y = -((sourceY / viewportHeight) * 2 - 1);\r\n nearScreenSource.z = -1.0;\r\n // far Z need to be close but < to 1 or camera projection matrix with maxZ = 0 will NaN\r\n var farScreenSource = TmpVectors.Vector3[1].copyFromFloats(nearScreenSource.x, nearScreenSource.y, 1.0 - 1e-8);\r\n const nearVec3 = TmpVectors.Vector3[2];\r\n const farVec3 = TmpVectors.Vector3[3];\r\n Vector3._UnprojectFromInvertedMatrixToRef(nearScreenSource, matrix, nearVec3);\r\n Vector3._UnprojectFromInvertedMatrixToRef(farScreenSource, matrix, farVec3);\r\n\r\n this.origin.copyFrom(nearVec3);\r\n farVec3.subtractToRef(nearVec3, this.direction);\r\n this.direction.normalize();\r\n }\r\n}\r\n\r\n// Picking\r\n/**\r\n * Type used to define predicate used to select faces when a mesh intersection is detected\r\n */\r\nexport type TrianglePickingPredicate = (p0: Vector3, p1: Vector3, p2: Vector3, ray: Ray) => boolean;\r\n\r\ndeclare module \"../scene\" {\r\n export interface Scene {\r\n /** @hidden */\r\n _tempPickingRay: Nullable<Ray>;\r\n\r\n /** @hidden */\r\n _cachedRayForTransform: Ray;\r\n\r\n /** @hidden */\r\n _pickWithRayInverseMatrix: Matrix;\r\n\r\n /** @hidden */\r\n _internalPick(rayFunction: (world: Matrix) => Ray, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, onlyBoundingInfo?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo>;\r\n\r\n /** @hidden */\r\n _internalMultiPick(rayFunction: (world: Matrix) => Ray, predicate?: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]>;\r\n\r\n /** @hidden */\r\n _internalPickForMesh(pickingInfo: Nullable<PickingInfo>, rayFunction: (world: Matrix) => Ray, mesh: AbstractMesh, world: Matrix, fastCheck?: boolean, onlyBoundingInfo?: boolean, trianglePredicate?: TrianglePickingPredicate, skipBoundingInfo?: boolean): Nullable<PickingInfo>;\r\n }\r\n}\r\n\r\nScene.prototype.createPickingRay = function (x: number, y: number, world: Nullable<Matrix>, camera: Nullable<Camera>, cameraViewSpace = false): Ray {\r\n let result = Ray.Zero();\r\n\r\n this.createPickingRayToRef(x, y, world, result, camera, cameraViewSpace);\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype.createPickingRayToRef = function (x: number, y: number, world: Nullable<Matrix>, result: Ray, camera: Nullable<Camera>, cameraViewSpace = false): Scene {\r\n var engine = this.getEngine();\r\n\r\n if (!camera) {\r\n if (!this.activeCamera) {\r\n return this;\r\n }\r\n\r\n camera = this.activeCamera;\r\n }\r\n\r\n var cameraViewport = camera.viewport;\r\n var viewport = cameraViewport.toGlobal(engine.getRenderWidth(), engine.getRenderHeight());\r\n\r\n // Moving coordinates to local viewport world\r\n x = x / engine.getHardwareScalingLevel() - viewport.x;\r\n y = y / engine.getHardwareScalingLevel() - (engine.getRenderHeight() - viewport.y - viewport.height);\r\n\r\n result.update(x, y, viewport.width, viewport.height, world ? world : Matrix.IdentityReadOnly, cameraViewSpace ? Matrix.IdentityReadOnly : camera.getViewMatrix(), camera.getProjectionMatrix());\r\n return this;\r\n};\r\n\r\nScene.prototype.createPickingRayInCameraSpace = function (x: number, y: number, camera?: Camera): Ray {\r\n let result = Ray.Zero();\r\n\r\n this.createPickingRayInCameraSpaceToRef(x, y, result, camera);\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype.createPickingRayInCameraSpaceToRef = function (x: number, y: number, result: Ray, camera?: Camera): Scene {\r\n if (!PickingInfo) {\r\n return this;\r\n }\r\n\r\n var engine = this.getEngine();\r\n\r\n if (!camera) {\r\n if (!this.activeCamera) {\r\n throw new Error(\"Active camera not set\");\r\n }\r\n\r\n camera = this.activeCamera;\r\n }\r\n\r\n var cameraViewport = camera.viewport;\r\n var viewport = cameraViewport.toGlobal(engine.getRenderWidth(), engine.getRenderHeight());\r\n var identity = Matrix.Identity();\r\n\r\n // Moving coordinates to local viewport world\r\n x = x / engine.getHardwareScalingLevel() - viewport.x;\r\n y = y / engine.getHardwareScalingLevel() - (engine.getRenderHeight() - viewport.y - viewport.height);\r\n result.update(x, y, viewport.width, viewport.height, identity, identity, camera.getProjectionMatrix());\r\n return this;\r\n};\r\n\r\nScene.prototype._internalPickForMesh = function (pickingInfo: Nullable<PickingInfo>, rayFunction: (world: Matrix) => Ray, mesh: AbstractMesh, world: Matrix, fastCheck?: boolean, onlyBoundingInfo?: boolean, trianglePredicate?: TrianglePickingPredicate, skipBoundingInfo?: boolean) {\r\n let ray = rayFunction(world);\r\n\r\n let result = mesh.intersects(ray, fastCheck, trianglePredicate, onlyBoundingInfo, world, skipBoundingInfo);\r\n if (!result || !result.hit) {\r\n return null;\r\n }\r\n\r\n if (!fastCheck && pickingInfo != null && result.distance >= pickingInfo.distance) {\r\n return null;\r\n }\r\n\r\n return result;\r\n};\r\n\r\nScene.prototype._internalPick = function (rayFunction: (world: Matrix) => Ray, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, onlyBoundingInfo?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo> {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n\r\n let pickingInfo = null;\r\n\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n let mesh = this.meshes[meshIndex];\r\n\r\n if (predicate) {\r\n if (!predicate(mesh)) {\r\n continue;\r\n }\r\n } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) {\r\n continue;\r\n }\r\n\r\n let world = mesh.skeleton && mesh.skeleton.overrideMesh ? mesh.skeleton.overrideMesh.getWorldMatrix() : mesh.getWorldMatrix();\r\n\r\n if (mesh.hasThinInstances && (mesh as Mesh).thinInstanceEnablePicking) {\r\n // first check if the ray intersects the whole bounding box/sphere of the mesh\r\n let result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, true, true, trianglePredicate);\r\n if (result) {\r\n if (onlyBoundingInfo) {\r\n // the user only asked for a bounding info check so we can return\r\n return pickingInfo;\r\n }\r\n const tmpMatrix = TmpVectors.Matrix[1];\r\n let thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices();\r\n for (let index = 0; index < thinMatrices.length; index++) {\r\n let thinMatrix = thinMatrices[index];\r\n thinMatrix.multiplyToRef(world, tmpMatrix);\r\n let result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, tmpMatrix, fastCheck, onlyBoundingInfo, trianglePredicate, true);\r\n\r\n if (result) {\r\n pickingInfo = result;\r\n pickingInfo.thinInstanceIndex = index;\r\n\r\n if (fastCheck) {\r\n return pickingInfo;\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n let result = this._internalPickForMesh(pickingInfo, rayFunction, mesh, world, fastCheck, onlyBoundingInfo, trianglePredicate);\r\n\r\n if (result) {\r\n pickingInfo = result;\r\n\r\n if (fastCheck) {\r\n return pickingInfo;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return pickingInfo || new PickingInfo();\r\n};\r\n\r\nScene.prototype._internalMultiPick = function (rayFunction: (world: Matrix) => Ray, predicate?: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]> {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n let pickingInfos = new Array<PickingInfo>();\r\n\r\n for (let meshIndex = 0; meshIndex < this.meshes.length; meshIndex++) {\r\n let mesh = this.meshes[meshIndex];\r\n\r\n if (predicate) {\r\n if (!predicate(mesh)) {\r\n continue;\r\n }\r\n } else if (!mesh.isEnabled() || !mesh.isVisible || !mesh.isPickable) {\r\n continue;\r\n }\r\n\r\n let world = mesh.skeleton && mesh.skeleton.overrideMesh ? mesh.skeleton.overrideMesh.getWorldMatrix() : mesh.getWorldMatrix();\r\n\r\n if (mesh.hasThinInstances && (mesh as Mesh).thinInstanceEnablePicking) {\r\n let result = this._internalPickForMesh(null, rayFunction, mesh, world, true, true, trianglePredicate);\r\n if (result) {\r\n const tmpMatrix = TmpVectors.Matrix[1];\r\n let thinMatrices = (mesh as Mesh).thinInstanceGetWorldMatrices();\r\n for (let index = 0; index < thinMatrices.length; index++) {\r\n let thinMatrix = thinMatrices[index];\r\n thinMatrix.multiplyToRef(world, tmpMatrix);\r\n let result = this._internalPickForMesh(null, rayFunction, mesh, tmpMatrix, false, false, trianglePredicate, true);\r\n\r\n if (result) {\r\n result.thinInstanceIndex = index;\r\n pickingInfos.push(result);\r\n }\r\n }\r\n }\r\n } else {\r\n let result = this._internalPickForMesh(null, rayFunction, mesh, world, false, false, trianglePredicate);\r\n\r\n if (result) {\r\n pickingInfos.push(result);\r\n }\r\n }\r\n }\r\n\r\n return pickingInfos;\r\n};\r\n\r\nScene.prototype.pickWithBoundingInfo = function (x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, camera?: Nullable<Camera>): Nullable<PickingInfo> {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n var result = this._internalPick(\r\n (world) => {\r\n if (!this._tempPickingRay) {\r\n this._tempPickingRay = Ray.Zero();\r\n }\r\n\r\n this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null);\r\n return this._tempPickingRay;\r\n },\r\n predicate,\r\n fastCheck,\r\n true\r\n );\r\n if (result) {\r\n result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null);\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.pick = function (x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, camera?: Nullable<Camera>, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo> {\r\n if (!PickingInfo) {\r\n return null;\r\n }\r\n var result = this._internalPick(\r\n (world) => {\r\n if (!this._tempPickingRay) {\r\n this._tempPickingRay = Ray.Zero();\r\n }\r\n\r\n this.createPickingRayToRef(x, y, world, this._tempPickingRay, camera || null);\r\n return this._tempPickingRay;\r\n },\r\n predicate,\r\n fastCheck,\r\n false,\r\n trianglePredicate\r\n );\r\n if (result) {\r\n result.ray = this.createPickingRay(x, y, Matrix.Identity(), camera || null);\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.pickWithRay = function (ray: Ray, predicate?: (mesh: AbstractMesh) => boolean, fastCheck?: boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo> {\r\n var result = this._internalPick(\r\n (world) => {\r\n if (!this._pickWithRayInverseMatrix) {\r\n this._pickWithRayInverseMatrix = Matrix.Identity();\r\n }\r\n world.invertToRef(this._pickWithRayInverseMatrix);\r\n\r\n if (!this._cachedRayForTransform) {\r\n this._cachedRayForTransform = Ray.Zero();\r\n }\r\n\r\n Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform);\r\n return this._cachedRayForTransform;\r\n },\r\n predicate,\r\n fastCheck,\r\n false,\r\n trianglePredicate\r\n );\r\n if (result) {\r\n result.ray = ray;\r\n }\r\n return result;\r\n};\r\n\r\nScene.prototype.multiPick = function (x: number, y: number, predicate?: (mesh: AbstractMesh) => boolean, camera?: Camera, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]> {\r\n return this._internalMultiPick((world) => this.createPickingRay(x, y, world, camera || null), predicate, trianglePredicate);\r\n};\r\n\r\nScene.prototype.multiPickWithRay = function (ray: Ray, predicate: (mesh: AbstractMesh) => boolean, trianglePredicate?: TrianglePickingPredicate): Nullable<PickingInfo[]> {\r\n return this._internalMultiPick(\r\n (world) => {\r\n if (!this._pickWithRayInverseMatrix) {\r\n this._pickWithRayInverseMatrix = Matrix.Identity();\r\n }\r\n world.invertToRef(this._pickWithRayInverseMatrix);\r\n\r\n if (!this._cachedRayForTransform) {\r\n this._cachedRayForTransform = Ray.Zero();\r\n }\r\n\r\n Ray.TransformToRef(ray, this._pickWithRayInverseMatrix, this._cachedRayForTransform);\r\n return this._cachedRayForTransform;\r\n },\r\n predicate,\r\n trianglePredicate\r\n );\r\n};\r\n\r\nCamera.prototype.getForwardRay = function (length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n return this.getForwardRayToRef(new Ray(Vector3.Zero(), Vector3.Zero(), length), length, transform, origin);\r\n};\r\n\r\nCamera.prototype.getForwardRayToRef = function (refRay: Ray, length = 100, transform?: Matrix, origin?: Vector3): Ray {\r\n if (!transform) {\r\n transform = this.getWorldMatrix();\r\n }\r\n refRay.length = length;\r\n\r\n if (!origin) {\r\n refRay.origin.copyFrom(this.position);\r\n } else {\r\n refRay.origin.copyFrom(origin);\r\n }\r\n TmpVectors.Vector3[2].set(0, 0, this._scene.useRightHandedSystem ? -1 : 1);\r\n Vector3.TransformNormalToRef(TmpVectors.Vector3[2], transform, TmpVectors.Vector3[3]);\r\n\r\n Vector3.NormalizeToRef(TmpVectors.Vector3[3], refRay.direction);\r\n\r\n return refRay;\r\n};\r\n"]}
@@ -4,6 +4,7 @@ import { Scene } from "../scene";
4
4
  import { TransformNode } from "../Meshes/transformNode";
5
5
  /**
6
6
  * The Axes viewer will show 3 axes in a specific point in space
7
+ * @see https://doc.babylonjs.com/toolsAndResources/utilities/World_Axes
7
8
  */
8
9
  export declare class AxesViewer {
9
10
  private _xAxis;
@@ -4,6 +4,7 @@ import { AxisDragGizmo } from "../Gizmos/axisDragGizmo.js";
4
4
  import { Color3 } from '../Maths/math.color.js';
5
5
  /**
6
6
  * The Axes viewer will show 3 axes in a specific point in space
7
+ * @see https://doc.babylonjs.com/toolsAndResources/utilities/World_Axes
7
8
  */
8
9
  var AxesViewer = /** @class */ (function () {
9
10
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"axesViewer.js","sourceRoot":"","sources":["../../../sourceES6/core/Debug/axesViewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../Maths/math.vector\";\r\nimport { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport { AxisDragGizmo } from \"../Gizmos/axisDragGizmo\";\r\nimport { Color3 } from '../Maths/math.color';\r\n\r\n/**\r\n * The Axes viewer will show 3 axes in a specific point in space\r\n */\r\nexport class AxesViewer {\r\n private _xAxis: TransformNode;\r\n private _yAxis: TransformNode;\r\n private _zAxis: TransformNode;\r\n private _scaleLinesFactor = 4;\r\n private _instanced = false;\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n public scene: Nullable<Scene> = null;\r\n\r\n /**\r\n * Gets or sets a number used to scale line length\r\n */\r\n public scaleLines = 1;\r\n\r\n /** Gets the node hierarchy used to render x-axis */\r\n public get xAxis(): TransformNode {\r\n return this._xAxis;\r\n }\r\n\r\n /** Gets the node hierarchy used to render y-axis */\r\n public get yAxis(): TransformNode {\r\n return this._yAxis;\r\n }\r\n\r\n /** Gets the node hierarchy used to render z-axis */\r\n public get zAxis(): TransformNode {\r\n return this._zAxis;\r\n }\r\n\r\n /**\r\n * Creates a new AxesViewer\r\n * @param scene defines the hosting scene\r\n * @param scaleLines defines a number used to scale line length (1 by default)\r\n * @param renderingGroupId defines a number used to set the renderingGroupId of the meshes (2 by default)\r\n * @param xAxis defines the node hierarchy used to render the x-axis\r\n * @param yAxis defines the node hierarchy used to render the y-axis\r\n * @param zAxis defines the node hierarchy used to render the z-axis\r\n */\r\n constructor(scene: Scene, scaleLines = 1, renderingGroupId: Nullable<number> = 2, xAxis?: TransformNode, yAxis?: TransformNode, zAxis?: TransformNode) {\r\n this.scaleLines = scaleLines;\r\n\r\n if (!xAxis) {\r\n var redColoredMaterial = new StandardMaterial(\"\", scene);\r\n redColoredMaterial.disableLighting = true;\r\n redColoredMaterial.emissiveColor = Color3.Red().scale(0.5);\r\n xAxis = AxisDragGizmo._CreateArrow(scene, redColoredMaterial);\r\n }\r\n\r\n if (!yAxis) {\r\n var greenColoredMaterial = new StandardMaterial(\"\", scene);\r\n greenColoredMaterial.disableLighting = true;\r\n greenColoredMaterial.emissiveColor = Color3.Green().scale(0.5);\r\n yAxis = AxisDragGizmo._CreateArrow(scene, greenColoredMaterial);\r\n }\r\n\r\n if (!zAxis) {\r\n var blueColoredMaterial = new StandardMaterial(\"\", scene);\r\n blueColoredMaterial.disableLighting = true;\r\n blueColoredMaterial.emissiveColor = Color3.Blue().scale(0.5);\r\n zAxis = AxisDragGizmo._CreateArrow(scene, blueColoredMaterial);\r\n }\r\n\r\n this._xAxis = xAxis;\r\n this._xAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n this._yAxis = yAxis;\r\n this._yAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n this._zAxis = zAxis;\r\n this._zAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n\r\n if (renderingGroupId != null) {\r\n AxesViewer._SetRenderingGroupId(this._xAxis, renderingGroupId);\r\n AxesViewer._SetRenderingGroupId(this._yAxis, renderingGroupId);\r\n AxesViewer._SetRenderingGroupId(this._zAxis, renderingGroupId);\r\n }\r\n\r\n this.scene = scene;\r\n this.update(new Vector3(), Vector3.Right(), Vector3.Up(), Vector3.Forward());\r\n }\r\n\r\n /**\r\n * Force the viewer to update\r\n * @param position defines the position of the viewer\r\n * @param xaxis defines the x axis of the viewer\r\n * @param yaxis defines the y axis of the viewer\r\n * @param zaxis defines the z axis of the viewer\r\n */\r\n public update(position: Vector3, xaxis: Vector3, yaxis: Vector3, zaxis: Vector3): void {\r\n this._xAxis.position.copyFrom(position);\r\n this._xAxis.setDirection(xaxis);\r\n this._xAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n\r\n this._yAxis.position.copyFrom(position);\r\n this._yAxis.setDirection(yaxis);\r\n this._yAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n\r\n this._zAxis.position.copyFrom(position);\r\n this._zAxis.setDirection(zaxis);\r\n this._zAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n }\r\n\r\n /**\r\n * Creates an instance of this axes viewer.\r\n * @returns a new axes viewer with instanced meshes\r\n */\r\n public createInstance(): AxesViewer {\r\n const xAxis = AxisDragGizmo._CreateArrowInstance(this.scene!, this._xAxis);\r\n const yAxis = AxisDragGizmo._CreateArrowInstance(this.scene!, this._yAxis);\r\n const zAxis = AxisDragGizmo._CreateArrowInstance(this.scene!, this._zAxis);\r\n const axesViewer = new AxesViewer(this.scene!, this.scaleLines, null, xAxis, yAxis, zAxis);\r\n axesViewer._instanced = true;\r\n return axesViewer;\r\n }\r\n\r\n /** Releases resources */\r\n public dispose() {\r\n if (this._xAxis) {\r\n this._xAxis.dispose(false, !this._instanced);\r\n }\r\n\r\n if (this._yAxis) {\r\n this._yAxis.dispose(false, !this._instanced);\r\n }\r\n\r\n if (this._zAxis) {\r\n this._zAxis.dispose(false, !this._instanced);\r\n }\r\n\r\n this.scene = null;\r\n }\r\n\r\n private static _SetRenderingGroupId(node: TransformNode, id: number) {\r\n node.getChildMeshes().forEach((mesh) => {\r\n mesh.renderingGroupId = id;\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"axesViewer.js","sourceRoot":"","sources":["../../../sourceES6/core/Debug/axesViewer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from \"../Maths/math.vector\";\r\nimport { Nullable } from \"../types\";\r\nimport { Scene } from \"../scene\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport { AxisDragGizmo } from \"../Gizmos/axisDragGizmo\";\r\nimport { Color3 } from '../Maths/math.color';\r\n\r\n/**\r\n * The Axes viewer will show 3 axes in a specific point in space\r\n * @see https://doc.babylonjs.com/toolsAndResources/utilities/World_Axes\r\n */\r\nexport class AxesViewer {\r\n private _xAxis: TransformNode;\r\n private _yAxis: TransformNode;\r\n private _zAxis: TransformNode;\r\n private _scaleLinesFactor = 4;\r\n private _instanced = false;\r\n\r\n /**\r\n * Gets the hosting scene\r\n */\r\n public scene: Nullable<Scene> = null;\r\n\r\n /**\r\n * Gets or sets a number used to scale line length\r\n */\r\n public scaleLines = 1;\r\n\r\n /** Gets the node hierarchy used to render x-axis */\r\n public get xAxis(): TransformNode {\r\n return this._xAxis;\r\n }\r\n\r\n /** Gets the node hierarchy used to render y-axis */\r\n public get yAxis(): TransformNode {\r\n return this._yAxis;\r\n }\r\n\r\n /** Gets the node hierarchy used to render z-axis */\r\n public get zAxis(): TransformNode {\r\n return this._zAxis;\r\n }\r\n\r\n /**\r\n * Creates a new AxesViewer\r\n * @param scene defines the hosting scene\r\n * @param scaleLines defines a number used to scale line length (1 by default)\r\n * @param renderingGroupId defines a number used to set the renderingGroupId of the meshes (2 by default)\r\n * @param xAxis defines the node hierarchy used to render the x-axis\r\n * @param yAxis defines the node hierarchy used to render the y-axis\r\n * @param zAxis defines the node hierarchy used to render the z-axis\r\n */\r\n constructor(scene: Scene, scaleLines = 1, renderingGroupId: Nullable<number> = 2, xAxis?: TransformNode, yAxis?: TransformNode, zAxis?: TransformNode) {\r\n this.scaleLines = scaleLines;\r\n\r\n if (!xAxis) {\r\n var redColoredMaterial = new StandardMaterial(\"\", scene);\r\n redColoredMaterial.disableLighting = true;\r\n redColoredMaterial.emissiveColor = Color3.Red().scale(0.5);\r\n xAxis = AxisDragGizmo._CreateArrow(scene, redColoredMaterial);\r\n }\r\n\r\n if (!yAxis) {\r\n var greenColoredMaterial = new StandardMaterial(\"\", scene);\r\n greenColoredMaterial.disableLighting = true;\r\n greenColoredMaterial.emissiveColor = Color3.Green().scale(0.5);\r\n yAxis = AxisDragGizmo._CreateArrow(scene, greenColoredMaterial);\r\n }\r\n\r\n if (!zAxis) {\r\n var blueColoredMaterial = new StandardMaterial(\"\", scene);\r\n blueColoredMaterial.disableLighting = true;\r\n blueColoredMaterial.emissiveColor = Color3.Blue().scale(0.5);\r\n zAxis = AxisDragGizmo._CreateArrow(scene, blueColoredMaterial);\r\n }\r\n\r\n this._xAxis = xAxis;\r\n this._xAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n this._yAxis = yAxis;\r\n this._yAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n this._zAxis = zAxis;\r\n this._zAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n\r\n if (renderingGroupId != null) {\r\n AxesViewer._SetRenderingGroupId(this._xAxis, renderingGroupId);\r\n AxesViewer._SetRenderingGroupId(this._yAxis, renderingGroupId);\r\n AxesViewer._SetRenderingGroupId(this._zAxis, renderingGroupId);\r\n }\r\n\r\n this.scene = scene;\r\n this.update(new Vector3(), Vector3.Right(), Vector3.Up(), Vector3.Forward());\r\n }\r\n\r\n /**\r\n * Force the viewer to update\r\n * @param position defines the position of the viewer\r\n * @param xaxis defines the x axis of the viewer\r\n * @param yaxis defines the y axis of the viewer\r\n * @param zaxis defines the z axis of the viewer\r\n */\r\n public update(position: Vector3, xaxis: Vector3, yaxis: Vector3, zaxis: Vector3): void {\r\n this._xAxis.position.copyFrom(position);\r\n this._xAxis.setDirection(xaxis);\r\n this._xAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n\r\n this._yAxis.position.copyFrom(position);\r\n this._yAxis.setDirection(yaxis);\r\n this._yAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n\r\n this._zAxis.position.copyFrom(position);\r\n this._zAxis.setDirection(zaxis);\r\n this._zAxis.scaling.setAll(this.scaleLines * this._scaleLinesFactor);\r\n }\r\n\r\n /**\r\n * Creates an instance of this axes viewer.\r\n * @returns a new axes viewer with instanced meshes\r\n */\r\n public createInstance(): AxesViewer {\r\n const xAxis = AxisDragGizmo._CreateArrowInstance(this.scene!, this._xAxis);\r\n const yAxis = AxisDragGizmo._CreateArrowInstance(this.scene!, this._yAxis);\r\n const zAxis = AxisDragGizmo._CreateArrowInstance(this.scene!, this._zAxis);\r\n const axesViewer = new AxesViewer(this.scene!, this.scaleLines, null, xAxis, yAxis, zAxis);\r\n axesViewer._instanced = true;\r\n return axesViewer;\r\n }\r\n\r\n /** Releases resources */\r\n public dispose() {\r\n if (this._xAxis) {\r\n this._xAxis.dispose(false, !this._instanced);\r\n }\r\n\r\n if (this._yAxis) {\r\n this._yAxis.dispose(false, !this._instanced);\r\n }\r\n\r\n if (this._zAxis) {\r\n this._zAxis.dispose(false, !this._instanced);\r\n }\r\n\r\n this.scene = null;\r\n }\r\n\r\n private static _SetRenderingGroupId(node: TransformNode, id: number) {\r\n node.getChildMeshes().forEach((mesh) => {\r\n mesh.renderingGroupId = id;\r\n });\r\n }\r\n}\r\n"]}
@@ -4,15 +4,14 @@ import { WebGPUShaderProcessor } from "./webgpuShaderProcessor.js";
4
4
  import { renderableTextureFormatToIndex, WebGPUTextureHelper } from "./webgpuTextureHelper.js";
5
5
  var StatePosition;
6
6
  (function (StatePosition) {
7
- //DepthBias = 0, // not used, so remove it to improve perf
8
- //DepthBiasClamp = 1, // not used, so remove it to improve perf
9
7
  StatePosition[StatePosition["StencilReadMask"] = 0] = "StencilReadMask";
10
8
  StatePosition[StatePosition["StencilWriteMask"] = 1] = "StencilWriteMask";
9
+ //DepthBiasClamp = 1, // not used, so remove it to improve perf
11
10
  StatePosition[StatePosition["DepthBias"] = 2] = "DepthBias";
12
11
  StatePosition[StatePosition["DepthBiasSlopeScale"] = 3] = "DepthBiasSlopeScale";
13
- StatePosition[StatePosition["MRTAttachments1"] = 4] = "MRTAttachments1";
14
- StatePosition[StatePosition["MRTAttachments2"] = 5] = "MRTAttachments2";
15
- StatePosition[StatePosition["DepthStencilState"] = 6] = "DepthStencilState";
12
+ StatePosition[StatePosition["DepthStencilState"] = 4] = "DepthStencilState";
13
+ StatePosition[StatePosition["MRTAttachments1"] = 5] = "MRTAttachments1";
14
+ StatePosition[StatePosition["MRTAttachments2"] = 6] = "MRTAttachments2";
16
15
  StatePosition[StatePosition["RasterizationState"] = 7] = "RasterizationState";
17
16
  StatePosition[StatePosition["ColorStates"] = 8] = "ColorStates";
18
17
  StatePosition[StatePosition["ShaderStage"] = 9] = "ShaderStage";
@@ -826,7 +825,6 @@ var WebGPUCacheRenderPipeline = /** @class */ (function () {
826
825
  depthBias: this._depthBias,
827
826
  depthBiasClamp: this._depthBiasClamp,
828
827
  depthBiasSlopeScale: this._depthBiasSlopeScale,
829
- /*clampDepth*/
830
828
  },
831
829
  });
832
830
  };