@babylonjs/core 7.8.2 → 7.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/Behaviors/Cameras/framingBehavior.d.ts +1 -1
  2. package/Behaviors/Cameras/framingBehavior.js +1 -1
  3. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  4. package/Behaviors/Meshes/baseSixDofDragBehavior.d.ts +5 -5
  5. package/Behaviors/Meshes/baseSixDofDragBehavior.js +4 -4
  6. package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
  7. package/Cameras/touchCamera.js +4 -2
  8. package/Cameras/touchCamera.js.map +1 -1
  9. package/Collisions/gpuPicker.d.ts +38 -0
  10. package/Collisions/gpuPicker.js +256 -0
  11. package/Collisions/gpuPicker.js.map +1 -0
  12. package/Collisions/index.d.ts +1 -0
  13. package/Collisions/index.js +1 -0
  14. package/Collisions/index.js.map +1 -1
  15. package/Debug/physicsViewer.d.ts +4 -2
  16. package/Debug/physicsViewer.js +16 -4
  17. package/Debug/physicsViewer.js.map +1 -1
  18. package/Engines/Extensions/engine.views.d.ts +1 -0
  19. package/Engines/Extensions/engine.views.js +3 -0
  20. package/Engines/Extensions/engine.views.js.map +1 -0
  21. package/Engines/abstractEngine.js +3 -2
  22. package/Engines/abstractEngine.js.map +1 -1
  23. package/Engines/thinEngine.js +8 -7
  24. package/Engines/thinEngine.js.map +1 -1
  25. package/Gizmos/boundingBoxGizmo.d.ts +6 -5
  26. package/Gizmos/boundingBoxGizmo.js +5 -5
  27. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  28. package/Gizmos/lightGizmo.js +1 -2
  29. package/Gizmos/lightGizmo.js.map +1 -1
  30. package/Helpers/environmentHelper.js +2 -0
  31. package/Helpers/environmentHelper.js.map +1 -1
  32. package/LensFlares/lensFlareSystem.js +2 -2
  33. package/LensFlares/lensFlareSystem.js.map +1 -1
  34. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +2 -2
  35. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  36. package/Materials/Node/nodeMaterial.d.ts +2 -2
  37. package/Materials/Node/nodeMaterial.js +6 -6
  38. package/Materials/Node/nodeMaterial.js.map +1 -1
  39. package/Materials/Textures/Procedurals/proceduralTexture.js +20 -8
  40. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  41. package/Materials/material.d.ts +1 -1
  42. package/Materials/material.js.map +1 -1
  43. package/Materials/pushMaterial.d.ts +1 -1
  44. package/Materials/pushMaterial.js.map +1 -1
  45. package/Materials/shaderMaterial.d.ts +6 -1
  46. package/Materials/shaderMaterial.js +8 -1
  47. package/Materials/shaderMaterial.js.map +1 -1
  48. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +0 -2
  49. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  50. package/Meshes/Node/Blocks/mergeGeometryBlock.js +15 -11
  51. package/Meshes/Node/Blocks/mergeGeometryBlock.js.map +1 -1
  52. package/Meshes/abstractMesh.d.ts +6 -16
  53. package/Meshes/abstractMesh.js +5 -21
  54. package/Meshes/abstractMesh.js.map +1 -1
  55. package/Meshes/mesh.vertexData.js +19 -1
  56. package/Meshes/mesh.vertexData.js.map +1 -1
  57. package/Meshes/trailMesh.d.ts +40 -1
  58. package/Meshes/trailMesh.js +50 -21
  59. package/Meshes/trailMesh.js.map +1 -1
  60. package/Meshes/transformNode.d.ts +14 -0
  61. package/Meshes/transformNode.js +20 -0
  62. package/Meshes/transformNode.js.map +1 -1
  63. package/Misc/dumpTools.js +3 -2
  64. package/Misc/dumpTools.js.map +1 -1
  65. package/Particles/EmitterTypes/coneParticleEmitter.d.ts +60 -0
  66. package/Particles/EmitterTypes/coneParticleEmitter.js +88 -0
  67. package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
  68. package/Particles/IParticleSystem.d.ts +4 -2
  69. package/Particles/IParticleSystem.js.map +1 -1
  70. package/Particles/baseParticleSystem.d.ts +2 -1
  71. package/Particles/baseParticleSystem.js +3 -0
  72. package/Particles/baseParticleSystem.js.map +1 -1
  73. package/Particles/gpuParticleSystem.d.ts +4 -2
  74. package/Particles/gpuParticleSystem.js +9 -3
  75. package/Particles/gpuParticleSystem.js.map +1 -1
  76. package/Particles/particleSystem.d.ts +2 -1
  77. package/Particles/particleSystem.functions.d.ts +2 -1
  78. package/Particles/particleSystem.functions.js +4 -1
  79. package/Particles/particleSystem.functions.js.map +1 -1
  80. package/Particles/particleSystem.js +10 -2
  81. package/Particles/particleSystem.js.map +1 -1
  82. package/Particles/thinParticleSystem.d.ts +2 -1
  83. package/Particles/thinParticleSystem.js +3 -2
  84. package/Particles/thinParticleSystem.js.map +1 -1
  85. package/Physics/v2/IPhysicsEnginePlugin.d.ts +3 -0
  86. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  87. package/Physics/v2/Plugins/havokPlugin.d.ts +14 -0
  88. package/Physics/v2/Plugins/havokPlugin.js +42 -18
  89. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  90. package/Physics/v2/physicsEngine.d.ts +14 -0
  91. package/Physics/v2/physicsEngine.js +20 -0
  92. package/Physics/v2/physicsEngine.js.map +1 -1
  93. package/Rendering/edgesRenderer.js +2 -1
  94. package/Rendering/edgesRenderer.js.map +1 -1
  95. package/Shaders/ShadersInclude/lineUboDeclaration.d.ts +7 -0
  96. package/Shaders/ShadersInclude/lineUboDeclaration.js +14 -0
  97. package/Shaders/ShadersInclude/lineUboDeclaration.js.map +1 -0
  98. package/Shaders/ShadersInclude/lineVertexDeclaration.d.ts +5 -0
  99. package/Shaders/ShadersInclude/lineVertexDeclaration.js +11 -0
  100. package/Shaders/ShadersInclude/lineVertexDeclaration.js.map +1 -0
  101. package/Shaders/gpuUpdateParticles.vertex.js +12 -2
  102. package/Shaders/gpuUpdateParticles.vertex.js.map +1 -1
  103. package/Shaders/line.vertex.d.ts +2 -0
  104. package/Shaders/line.vertex.js +5 -2
  105. package/Shaders/line.vertex.js.map +1 -1
  106. package/ShadersWGSL/gpuUpdateParticles.compute.js +11 -1
  107. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  108. package/XR/features/WebXRControllerMovement.d.ts +14 -1
  109. package/XR/features/WebXRControllerMovement.js +21 -3
  110. package/XR/features/WebXRControllerMovement.js.map +1 -1
  111. package/XR/webXRInputSource.d.ts +1 -1
  112. package/XR/webXRInputSource.js +3 -3
  113. package/XR/webXRInputSource.js.map +1 -1
  114. package/package.json +1 -1
@@ -1,6 +1,35 @@
1
1
  import { Mesh } from "../Meshes/mesh";
2
2
  import type { Scene } from "../scene";
3
3
  import type { TransformNode } from "../Meshes/transformNode";
4
+ /**
5
+ * Options to be used when creating a trail mesh
6
+ */
7
+ export interface ITrailMeshOptions {
8
+ /**
9
+ * diameter of trailing mesh (default: 1)
10
+ */
11
+ diameter?: number;
12
+ /**
13
+ * length of trailing mesh (default: 60)
14
+ */
15
+ length?: number;
16
+ /**
17
+ * segments of trailing mesh (default: length)
18
+ */
19
+ segments?: number;
20
+ /**
21
+ * sections of trailing mesh (default: 4)
22
+ */
23
+ sections?: number;
24
+ /**
25
+ * tapers the trailing mesh (default: false)
26
+ */
27
+ doNotTaper?: boolean;
28
+ /**
29
+ * automatically start trailing mesh. (default: true)
30
+ */
31
+ autoStart?: boolean;
32
+ }
4
33
  /**
5
34
  * Class used to create a trail following a mesh
6
35
  */
@@ -12,13 +41,15 @@ export declare class TrailMesh extends Mesh {
12
41
  private _generator;
13
42
  private _autoStart;
14
43
  private _running;
44
+ private _doNotTaper;
15
45
  private _length;
46
+ private _segments;
16
47
  private _sectionPolygonPointsCount;
17
48
  private _sectionVectors;
18
49
  private _sectionNormalVectors;
19
50
  private _beforeRenderObserver;
20
51
  /**
21
- * Creates a new TrailMesh.
52
+ * Constructor
22
53
  * @param name The value used by scene.getMeshByName() to do a lookup.
23
54
  * @param generator The mesh or transform node to generate a trail.
24
55
  * @param scene The scene to add this mesh to.
@@ -27,6 +58,14 @@ export declare class TrailMesh extends Mesh {
27
58
  * @param autoStart Automatically start trailing mesh. Default true.
28
59
  */
29
60
  constructor(name: string, generator: TransformNode, scene?: Scene, diameter?: number, length?: number, autoStart?: boolean);
61
+ /**
62
+ * Constructor
63
+ * @param name The value used by scene.getMeshByName() to do a lookup.
64
+ * @param generator The mesh or transform node to generate a trail.
65
+ * @param scene The scene to add this mesh to.
66
+ * @param options defines the options used to create the mesh.
67
+ */
68
+ constructor(name: string, generator: TransformNode, scene?: Scene, options?: ITrailMeshOptions);
30
69
  /**
31
70
  * "TrailMesh"
32
71
  * @returns "TrailMesh"
@@ -3,6 +3,7 @@ import { Mesh } from "../Meshes/mesh.js";
3
3
  import { Vector3 } from "../Maths/math.vector.js";
4
4
  import { VertexBuffer } from "../Buffers/buffer.js";
5
5
  import { VertexData } from "../Meshes/mesh.vertexData.js";
6
+ import { Scalar } from "../Maths/math.scalar.js";
6
7
  Mesh._TrailMeshParser = (parsedMesh, scene) => {
7
8
  return TrailMesh.Parse(parsedMesh, scene);
8
9
  };
@@ -10,23 +11,27 @@ Mesh._TrailMeshParser = (parsedMesh, scene) => {
10
11
  * Class used to create a trail following a mesh
11
12
  */
12
13
  export class TrailMesh extends Mesh {
13
- /**
14
- * Creates a new TrailMesh.
15
- * @param name The value used by scene.getMeshByName() to do a lookup.
16
- * @param generator The mesh or transform node to generate a trail.
17
- * @param scene The scene to add this mesh to.
18
- * @param diameter Diameter of trailing mesh. Default is 1.
19
- * @param length Length of trailing mesh. Default is 60.
20
- * @param autoStart Automatically start trailing mesh. Default true.
21
- */
22
- constructor(name, generator, scene, diameter = 1, length = 60, autoStart = true) {
14
+ /** @internal */
15
+ constructor(name, generator, scene, diameterOrOptions, length = 60, autoStart = true) {
23
16
  super(name, scene);
24
17
  this._sectionPolygonPointsCount = 4;
25
18
  this._running = false;
26
- this._autoStart = autoStart;
27
19
  this._generator = generator;
28
- this.diameter = diameter;
29
- this._length = length;
20
+ if (typeof diameterOrOptions === "object" && diameterOrOptions !== null) {
21
+ this.diameter = diameterOrOptions.diameter || 1;
22
+ this._length = diameterOrOptions.length || 60;
23
+ this._segments = diameterOrOptions.segments ? (diameterOrOptions.segments > this._length ? this._length : diameterOrOptions.segments) : this._length;
24
+ this._sectionPolygonPointsCount = diameterOrOptions.sections || 4;
25
+ this._doNotTaper = diameterOrOptions.doNotTaper || false;
26
+ this._autoStart = diameterOrOptions.autoStart || true;
27
+ }
28
+ else {
29
+ this.diameter = diameterOrOptions || 1;
30
+ this._length = length;
31
+ this._segments = this._length;
32
+ this._doNotTaper = false;
33
+ this._autoStart = autoStart;
34
+ }
30
35
  this._sectionVectors = [];
31
36
  this._sectionNormalVectors = [];
32
37
  for (let i = 0; i <= this._sectionPolygonPointsCount; i++) {
@@ -61,11 +66,11 @@ export class TrailMesh extends Mesh {
61
66
  positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);
62
67
  uvs.push(i / this._sectionPolygonPointsCount, 0);
63
68
  }
64
- for (let i = 1; i <= this._length; i++) {
69
+ for (let i = 1; i <= this._segments; i++) {
65
70
  for (let j = 0; j <= this._sectionPolygonPointsCount; j++) {
66
71
  const angle = j !== this._sectionPolygonPointsCount ? j * alpha : 0;
67
72
  positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);
68
- uvs.push(j / this._sectionPolygonPointsCount, i / this._length);
73
+ uvs.push(j / this._sectionPolygonPointsCount, i / this._segments);
69
74
  }
70
75
  const l = positions.length / 3 - 2 * (this._sectionPolygonPointsCount + 1);
71
76
  for (let j = 0; j <= this._sectionPolygonPointsCount; j++) {
@@ -110,12 +115,20 @@ export class TrailMesh extends Mesh {
110
115
  const positions = this.getVerticesData(VertexBuffer.PositionKind);
111
116
  const normals = this.getVerticesData(VertexBuffer.NormalKind);
112
117
  const wm = this._generator.getWorldMatrix();
118
+ const index = 3 * (this._sectionPolygonPointsCount + 1);
113
119
  if (positions && normals) {
114
- for (let i = 3 * (this._sectionPolygonPointsCount + 1); i < positions.length; i++) {
115
- positions[i - 3 * (this._sectionPolygonPointsCount + 1)] = positions[i] - (normals[i] / this._length) * this.diameter;
120
+ if (this._doNotTaper) {
121
+ for (let i = index; i < positions.length; i++) {
122
+ positions[i - index] = Scalar.Lerp(positions[i - index], positions[i], this._segments / this._length);
123
+ }
124
+ }
125
+ else {
126
+ for (let i = index; i < positions.length; i++) {
127
+ positions[i - index] = Scalar.Lerp(positions[i - index], positions[i], this._segments / this._length) - (normals[i] / this._length) * this.diameter;
128
+ }
116
129
  }
117
- for (let i = 3 * (this._sectionPolygonPointsCount + 1); i < normals.length; i++) {
118
- normals[i - 3 * (this._sectionPolygonPointsCount + 1)] = normals[i];
130
+ for (let i = index; i < normals.length; i++) {
131
+ normals[i - index] = Scalar.Lerp(normals[i - index], normals[i], this._segments / this._length);
119
132
  }
120
133
  const l = positions.length - 3 * (this._sectionPolygonPointsCount + 1);
121
134
  const alpha = (2 * Math.PI) / this._sectionPolygonPointsCount;
@@ -145,7 +158,15 @@ export class TrailMesh extends Mesh {
145
158
  * @returns a new mesh
146
159
  */
147
160
  clone(name = "", newGenerator) {
148
- return new TrailMesh(name, newGenerator ?? this._generator, this.getScene(), this.diameter, this._length, this._autoStart);
161
+ const options = {
162
+ diameter: this.diameter,
163
+ length: this._length,
164
+ segments: this._segments,
165
+ sections: this._sectionPolygonPointsCount,
166
+ doNotTaper: this._doNotTaper,
167
+ autoStart: this._autoStart,
168
+ };
169
+ return new TrailMesh(name, newGenerator ?? this._generator, this.getScene(), options);
149
170
  }
150
171
  /**
151
172
  * Serializes this trail mesh
@@ -166,7 +187,15 @@ export class TrailMesh extends Mesh {
166
187
  if (!generator) {
167
188
  throw new Error("TrailMesh: generator not found with ID " + parsedMesh.generatorId);
168
189
  }
169
- return new TrailMesh(parsedMesh.name, generator, scene, parsedMesh.diameter ?? parsedMesh._diameter, parsedMesh._length, parsedMesh._autoStart);
190
+ const options = {
191
+ diameter: parsedMesh.diameter ?? parsedMesh._diameter,
192
+ length: parsedMesh._length,
193
+ segments: parsedMesh._segments,
194
+ sections: parsedMesh._sectionPolygonPointsCount,
195
+ doNotTaper: parsedMesh._doNotTaper,
196
+ autoStart: parsedMesh._autoStart,
197
+ };
198
+ return new TrailMesh(parsedMesh.name, generator, scene, options);
170
199
  }
171
200
  }
172
201
  //# sourceMappingURL=trailMesh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"trailMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/trailMesh.ts"],"names":[],"mappings":"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","sourcesContent":["import { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\nMesh._TrailMeshParser = (parsedMesh: any, scene: Scene) => {\r\n return TrailMesh.Parse(parsedMesh, scene);\r\n};\r\n\r\n/**\r\n * Class used to create a trail following a mesh\r\n */\r\nexport class TrailMesh extends Mesh {\r\n /**\r\n * The diameter of the trail, i.e. the width of the ribbon.\r\n */\r\n public diameter: number;\r\n\r\n private _generator: TransformNode;\r\n private _autoStart: boolean;\r\n private _running: boolean;\r\n private _length: number;\r\n private _sectionPolygonPointsCount: number = 4;\r\n private _sectionVectors: Array<Vector3>;\r\n private _sectionNormalVectors: Array<Vector3>;\r\n private _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n\r\n /**\r\n * Creates a new TrailMesh.\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param generator The mesh or transform node to generate a trail.\r\n * @param scene The scene to add this mesh to.\r\n * @param diameter Diameter of trailing mesh. Default is 1.\r\n * @param length Length of trailing mesh. Default is 60.\r\n * @param autoStart Automatically start trailing mesh. Default true.\r\n */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, diameter: number = 1, length: number = 60, autoStart: boolean = true) {\r\n super(name, scene);\r\n\r\n this._running = false;\r\n this._autoStart = autoStart;\r\n this._generator = generator;\r\n this.diameter = diameter;\r\n this._length = length;\r\n this._sectionVectors = [];\r\n this._sectionNormalVectors = [];\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n this._sectionVectors[i] = Vector3.Zero();\r\n this._sectionNormalVectors[i] = Vector3.Zero();\r\n }\r\n this._createMesh();\r\n }\r\n\r\n /**\r\n * \"TrailMesh\"\r\n * @returns \"TrailMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"TrailMesh\";\r\n }\r\n\r\n private _createMesh(): void {\r\n const data: VertexData = new VertexData();\r\n const positions: Array<number> = [];\r\n const normals: Array<number> = [];\r\n const indices: Array<number> = [];\r\n const uvs: Array<number> = [];\r\n let meshCenter = Vector3.Zero();\r\n if (this._generator instanceof AbstractMesh && this._generator.hasBoundingInfo) {\r\n meshCenter = this._generator.getBoundingInfo().boundingBox.centerWorld;\r\n } else {\r\n meshCenter = this._generator.absolutePosition;\r\n }\r\n const alpha: number = (2 * Math.PI) / this._sectionPolygonPointsCount;\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n const angle = i !== this._sectionPolygonPointsCount ? i * alpha : 0;\r\n positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);\r\n uvs.push(i / this._sectionPolygonPointsCount, 0);\r\n }\r\n for (let i: number = 1; i <= this._length; i++) {\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n const angle = j !== this._sectionPolygonPointsCount ? j * alpha : 0;\r\n positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);\r\n uvs.push(j / this._sectionPolygonPointsCount, i / this._length);\r\n }\r\n const l: number = positions.length / 3 - 2 * (this._sectionPolygonPointsCount + 1);\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n indices.push(l + j, l + j + this._sectionPolygonPointsCount, l + j + this._sectionPolygonPointsCount + 1);\r\n indices.push(l + j, l + j + this._sectionPolygonPointsCount + 1, l + j + 1);\r\n }\r\n }\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n data.positions = positions;\r\n data.normals = normals;\r\n data.indices = indices;\r\n data.uvs = uvs;\r\n data.applyToMesh(this, true);\r\n if (this._autoStart) {\r\n this.start();\r\n }\r\n }\r\n\r\n /**\r\n * Start trailing mesh.\r\n */\r\n public start(): void {\r\n if (!this._running) {\r\n this._running = true;\r\n this._beforeRenderObserver = this.getScene().onBeforeRenderObservable.add(() => {\r\n this.update();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Stop trailing mesh.\r\n */\r\n public stop(): void {\r\n if (this._beforeRenderObserver && this._running) {\r\n this._running = false;\r\n this.getScene().onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n\r\n /**\r\n * Update trailing mesh geometry.\r\n */\r\n public update(): void {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const wm = this._generator.getWorldMatrix();\r\n if (positions && normals) {\r\n for (let i: number = 3 * (this._sectionPolygonPointsCount + 1); i < positions.length; i++) {\r\n positions[i - 3 * (this._sectionPolygonPointsCount + 1)] = positions[i] - (normals[i] / this._length) * this.diameter;\r\n }\r\n for (let i: number = 3 * (this._sectionPolygonPointsCount + 1); i < normals.length; i++) {\r\n normals[i - 3 * (this._sectionPolygonPointsCount + 1)] = normals[i];\r\n }\r\n const l: number = positions.length - 3 * (this._sectionPolygonPointsCount + 1);\r\n const alpha: number = (2 * Math.PI) / this._sectionPolygonPointsCount;\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n const angle = i !== this._sectionPolygonPointsCount ? i * alpha : 0;\r\n this._sectionVectors[i].copyFromFloats(Math.cos(angle) * this.diameter, Math.sin(angle) * this.diameter, 0);\r\n this._sectionNormalVectors[i].copyFromFloats(Math.cos(angle), Math.sin(angle), 0);\r\n Vector3.TransformCoordinatesToRef(this._sectionVectors[i], wm, this._sectionVectors[i]);\r\n Vector3.TransformNormalToRef(this._sectionNormalVectors[i], wm, this._sectionNormalVectors[i]);\r\n }\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n positions[l + 3 * i] = this._sectionVectors[i].x;\r\n positions[l + 3 * i + 1] = this._sectionVectors[i].y;\r\n positions[l + 3 * i + 2] = this._sectionVectors[i].z;\r\n normals[l + 3 * i] = this._sectionNormalVectors[i].x;\r\n normals[l + 3 * i + 1] = this._sectionNormalVectors[i].y;\r\n normals[l + 3 * i + 2] = this._sectionNormalVectors[i].z;\r\n }\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions, true, false);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals, true, false);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a new TrailMesh object.\r\n * @param name is a string, the name given to the new mesh\r\n * @param newGenerator use new generator object for cloned trail mesh\r\n * @returns a new mesh\r\n */\r\n public override clone(name: string = \"\", newGenerator: TransformNode): TrailMesh {\r\n return new TrailMesh(name, newGenerator ?? this._generator, this.getScene(), this.diameter, this._length, this._autoStart);\r\n }\r\n\r\n /**\r\n * Serializes this trail mesh\r\n * @param serializationObject object to write serialization to\r\n */\r\n public override serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n\r\n serializationObject.generatorId = this._generator.id;\r\n }\r\n\r\n /**\r\n * Parses a serialized trail mesh\r\n * @param parsedMesh the serialized mesh\r\n * @param scene the scene to create the trail mesh in\r\n * @returns the created trail mesh\r\n */\r\n public static override Parse(parsedMesh: any, scene: Scene): TrailMesh {\r\n const generator = scene.getLastMeshById(parsedMesh.generatorId) ?? scene.getLastTransformNodeById(parsedMesh.generatorId);\r\n\r\n if (!generator) {\r\n throw new Error(\"TrailMesh: generator not found with ID \" + parsedMesh.generatorId);\r\n }\r\n\r\n return new TrailMesh(parsedMesh.name, generator, scene, parsedMesh.diameter ?? parsedMesh._diameter, parsedMesh._length, parsedMesh._autoStart);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"trailMesh.js","sourceRoot":"","sources":["../../../../dev/core/src/Meshes/trailMesh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAItC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,IAAI,CAAC,gBAAgB,GAAG,CAAC,UAAe,EAAE,KAAY,EAAE,EAAE;IACtD,OAAO,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAC9C,CAAC,CAAC;AAgCF;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,IAAI;IAqC/B,gBAAgB;IAChB,YAAY,IAAY,EAAE,SAAwB,EAAE,KAAa,EAAE,iBAA8C,EAAE,SAAiB,EAAE,EAAE,YAAqB,IAAI;QAC7J,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QA3Bf,+BAA0B,GAAW,CAAC,CAAC;QA6B3C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAE5B,IAAI,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,KAAK,IAAI,EAAE;YACrE,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,IAAI,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,MAAM,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACrJ,IAAI,CAAC,0BAA0B,GAAG,iBAAiB,CAAC,QAAQ,IAAI,CAAC,CAAC;YAClE,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,UAAU,IAAI,KAAK,CAAC;YACzD,IAAI,CAAC,UAAU,GAAG,iBAAiB,CAAC,SAAS,IAAI,IAAI,CAAC;SACzD;aAAM;YACH,IAAI,CAAC,QAAQ,GAAG,iBAAiB,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;SAC/B;QAED,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE;YAC/D,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;SAClD;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACa,YAAY;QACxB,OAAO,WAAW,CAAC;IACvB,CAAC;IAEO,WAAW;QACf,MAAM,IAAI,GAAe,IAAI,UAAU,EAAE,CAAC;QAC1C,MAAM,SAAS,GAAkB,EAAE,CAAC;QACpC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,MAAM,GAAG,GAAkB,EAAE,CAAC;QAC9B,IAAI,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,UAAU,YAAY,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;YAC5E,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC;SAC1E;aAAM;YACH,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;SACjD;QACD,MAAM,KAAK,GAAW,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,0BAA0B,CAAC;QACtE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE;YAC/D,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;YAC7H,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAC;SACpD;QACD,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;YAC9C,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE;gBAC/D,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC7H,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;aACrE;YACD,MAAM,CAAC,GAAW,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC;YACnF,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE;gBAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC;gBAC1G,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,0BAA0B,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;aAC/E;SACJ;QACD,UAAU,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE;YACjB,IAAI,CAAC,KAAK,EAAE,CAAC;SAChB;IACL,CAAC;IAED;;OAEG;IACI,KAAK;QACR,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;YAClB,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAED;;OAEG;IACI,IAAI;QACP,IAAI,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,QAAQ,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;SAC/E;IACL,CAAC;IAED;;OAEG;IACI,MAAM;QACT,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC;QACxD,IAAI,SAAS,IAAI,OAAO,EAAE;YACtB,IAAI,IAAI,CAAC,WAAW,EAAE;gBAClB,KAAK,IAAI,CAAC,GAAW,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnD,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;iBACzG;aACJ;iBAAM;gBACH,KAAK,IAAI,CAAC,GAAW,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnD,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;iBACvJ;aACJ;YACD,KAAK,IAAI,CAAC,GAAW,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACjD,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;aACnG;YACD,MAAM,CAAC,GAAW,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC;YAC/E,MAAM,KAAK,GAAW,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,0BAA0B,CAAC;YACtE,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE;gBAC/D,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC5G,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;gBAClF,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxF,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;aAClG;YACD,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC,EAAE,EAAE;gBAC/D,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjD,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC5D;YACD,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC3E,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;SAC1E;IACL,CAAC;IAED;;;;;OAKG;IACa,KAAK,CAAC,OAAe,EAAE,EAAE,YAA2B;QAChE,MAAM,OAAO,GAAG;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,QAAQ,EAAE,IAAI,CAAC,0BAA0B;YACzC,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,SAAS,EAAE,IAAI,CAAC,UAAU;SAC7B,CAAC;QACF,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;IAC1F,CAAC;IAED;;;OAGG;IACa,SAAS,CAAC,mBAAwB;QAC9C,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAErC,mBAAmB,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAU,KAAK,CAAC,UAAe,EAAE,KAAY;QACtD,MAAM,SAAS,GAAG,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,wBAAwB,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAE1H,IAAI,CAAC,SAAS,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,yCAAyC,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;SACvF;QAED,MAAM,OAAO,GAAG;YACZ,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,SAAS;YACrD,MAAM,EAAE,UAAU,CAAC,OAAO;YAC1B,QAAQ,EAAE,UAAU,CAAC,SAAS;YAC9B,QAAQ,EAAE,UAAU,CAAC,0BAA0B;YAC/C,UAAU,EAAE,UAAU,CAAC,WAAW;YAClC,SAAS,EAAE,UAAU,CAAC,UAAU;SACnC,CAAC;QACF,OAAO,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;CACJ","sourcesContent":["import { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { VertexBuffer } from \"../Buffers/buffer\";\r\nimport { VertexData } from \"../Meshes/mesh.vertexData\";\r\nimport { Scalar } from \"../Maths/math.scalar\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\nMesh._TrailMeshParser = (parsedMesh: any, scene: Scene) => {\r\n return TrailMesh.Parse(parsedMesh, scene);\r\n};\r\n\r\n/**\r\n * Options to be used when creating a trail mesh\r\n */\r\nexport interface ITrailMeshOptions {\r\n /**\r\n * diameter of trailing mesh (default: 1)\r\n */\r\n diameter?: number;\r\n /**\r\n * length of trailing mesh (default: 60)\r\n */\r\n length?: number;\r\n /**\r\n * segments of trailing mesh (default: length)\r\n */\r\n segments?: number;\r\n /**\r\n * sections of trailing mesh (default: 4)\r\n */\r\n sections?: number;\r\n /**\r\n * tapers the trailing mesh (default: false)\r\n */\r\n doNotTaper?: boolean;\r\n /**\r\n * automatically start trailing mesh. (default: true)\r\n */\r\n autoStart?: boolean;\r\n}\r\n\r\n/**\r\n * Class used to create a trail following a mesh\r\n */\r\nexport class TrailMesh extends Mesh {\r\n /**\r\n * The diameter of the trail, i.e. the width of the ribbon.\r\n */\r\n public diameter: number;\r\n\r\n private _generator: TransformNode;\r\n private _autoStart: boolean;\r\n private _running: boolean;\r\n private _doNotTaper: boolean;\r\n private _length: number;\r\n private _segments: number;\r\n private _sectionPolygonPointsCount: number = 4;\r\n private _sectionVectors: Array<Vector3>;\r\n private _sectionNormalVectors: Array<Vector3>;\r\n private _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n\r\n /**\r\n * Constructor\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param generator The mesh or transform node to generate a trail.\r\n * @param scene The scene to add this mesh to.\r\n * @param diameter Diameter of trailing mesh. Default is 1.\r\n * @param length Length of trailing mesh. Default is 60.\r\n * @param autoStart Automatically start trailing mesh. Default true.\r\n */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, diameter?: number, length?: number, autoStart?: boolean);\r\n\r\n /**\r\n * Constructor\r\n * @param name The value used by scene.getMeshByName() to do a lookup.\r\n * @param generator The mesh or transform node to generate a trail.\r\n * @param scene The scene to add this mesh to.\r\n * @param options defines the options used to create the mesh.\r\n */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, options?: ITrailMeshOptions);\r\n\r\n /** @internal */\r\n constructor(name: string, generator: TransformNode, scene?: Scene, diameterOrOptions?: number | ITrailMeshOptions, length: number = 60, autoStart: boolean = true) {\r\n super(name, scene);\r\n\r\n this._running = false;\r\n this._generator = generator;\r\n\r\n if (typeof diameterOrOptions === \"object\" && diameterOrOptions !== null) {\r\n this.diameter = diameterOrOptions.diameter || 1;\r\n this._length = diameterOrOptions.length || 60;\r\n this._segments = diameterOrOptions.segments ? (diameterOrOptions.segments > this._length ? this._length : diameterOrOptions.segments) : this._length;\r\n this._sectionPolygonPointsCount = diameterOrOptions.sections || 4;\r\n this._doNotTaper = diameterOrOptions.doNotTaper || false;\r\n this._autoStart = diameterOrOptions.autoStart || true;\r\n } else {\r\n this.diameter = diameterOrOptions || 1;\r\n this._length = length;\r\n this._segments = this._length;\r\n this._doNotTaper = false;\r\n this._autoStart = autoStart;\r\n }\r\n\r\n this._sectionVectors = [];\r\n this._sectionNormalVectors = [];\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n this._sectionVectors[i] = Vector3.Zero();\r\n this._sectionNormalVectors[i] = Vector3.Zero();\r\n }\r\n this._createMesh();\r\n }\r\n\r\n /**\r\n * \"TrailMesh\"\r\n * @returns \"TrailMesh\"\r\n */\r\n public override getClassName(): string {\r\n return \"TrailMesh\";\r\n }\r\n\r\n private _createMesh(): void {\r\n const data: VertexData = new VertexData();\r\n const positions: Array<number> = [];\r\n const normals: Array<number> = [];\r\n const indices: Array<number> = [];\r\n const uvs: Array<number> = [];\r\n let meshCenter = Vector3.Zero();\r\n if (this._generator instanceof AbstractMesh && this._generator.hasBoundingInfo) {\r\n meshCenter = this._generator.getBoundingInfo().boundingBox.centerWorld;\r\n } else {\r\n meshCenter = this._generator.absolutePosition;\r\n }\r\n const alpha: number = (2 * Math.PI) / this._sectionPolygonPointsCount;\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n const angle = i !== this._sectionPolygonPointsCount ? i * alpha : 0;\r\n positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);\r\n uvs.push(i / this._sectionPolygonPointsCount, 0);\r\n }\r\n for (let i: number = 1; i <= this._segments; i++) {\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n const angle = j !== this._sectionPolygonPointsCount ? j * alpha : 0;\r\n positions.push(meshCenter.x + Math.cos(angle) * this.diameter, meshCenter.y + Math.sin(angle) * this.diameter, meshCenter.z);\r\n uvs.push(j / this._sectionPolygonPointsCount, i / this._segments);\r\n }\r\n const l: number = positions.length / 3 - 2 * (this._sectionPolygonPointsCount + 1);\r\n for (let j: number = 0; j <= this._sectionPolygonPointsCount; j++) {\r\n indices.push(l + j, l + j + this._sectionPolygonPointsCount, l + j + this._sectionPolygonPointsCount + 1);\r\n indices.push(l + j, l + j + this._sectionPolygonPointsCount + 1, l + j + 1);\r\n }\r\n }\r\n VertexData.ComputeNormals(positions, indices, normals);\r\n data.positions = positions;\r\n data.normals = normals;\r\n data.indices = indices;\r\n data.uvs = uvs;\r\n data.applyToMesh(this, true);\r\n if (this._autoStart) {\r\n this.start();\r\n }\r\n }\r\n\r\n /**\r\n * Start trailing mesh.\r\n */\r\n public start(): void {\r\n if (!this._running) {\r\n this._running = true;\r\n this._beforeRenderObserver = this.getScene().onBeforeRenderObservable.add(() => {\r\n this.update();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Stop trailing mesh.\r\n */\r\n public stop(): void {\r\n if (this._beforeRenderObserver && this._running) {\r\n this._running = false;\r\n this.getScene().onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n\r\n /**\r\n * Update trailing mesh geometry.\r\n */\r\n public update(): void {\r\n const positions = this.getVerticesData(VertexBuffer.PositionKind);\r\n const normals = this.getVerticesData(VertexBuffer.NormalKind);\r\n const wm = this._generator.getWorldMatrix();\r\n const index = 3 * (this._sectionPolygonPointsCount + 1);\r\n if (positions && normals) {\r\n if (this._doNotTaper) {\r\n for (let i: number = index; i < positions.length; i++) {\r\n positions[i - index] = Scalar.Lerp(positions[i - index], positions[i], this._segments / this._length);\r\n }\r\n } else {\r\n for (let i: number = index; i < positions.length; i++) {\r\n positions[i - index] = Scalar.Lerp(positions[i - index], positions[i], this._segments / this._length) - (normals[i] / this._length) * this.diameter;\r\n }\r\n }\r\n for (let i: number = index; i < normals.length; i++) {\r\n normals[i - index] = Scalar.Lerp(normals[i - index], normals[i], this._segments / this._length);\r\n }\r\n const l: number = positions.length - 3 * (this._sectionPolygonPointsCount + 1);\r\n const alpha: number = (2 * Math.PI) / this._sectionPolygonPointsCount;\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n const angle = i !== this._sectionPolygonPointsCount ? i * alpha : 0;\r\n this._sectionVectors[i].copyFromFloats(Math.cos(angle) * this.diameter, Math.sin(angle) * this.diameter, 0);\r\n this._sectionNormalVectors[i].copyFromFloats(Math.cos(angle), Math.sin(angle), 0);\r\n Vector3.TransformCoordinatesToRef(this._sectionVectors[i], wm, this._sectionVectors[i]);\r\n Vector3.TransformNormalToRef(this._sectionNormalVectors[i], wm, this._sectionNormalVectors[i]);\r\n }\r\n for (let i: number = 0; i <= this._sectionPolygonPointsCount; i++) {\r\n positions[l + 3 * i] = this._sectionVectors[i].x;\r\n positions[l + 3 * i + 1] = this._sectionVectors[i].y;\r\n positions[l + 3 * i + 2] = this._sectionVectors[i].z;\r\n normals[l + 3 * i] = this._sectionNormalVectors[i].x;\r\n normals[l + 3 * i + 1] = this._sectionNormalVectors[i].y;\r\n normals[l + 3 * i + 2] = this._sectionNormalVectors[i].z;\r\n }\r\n this.updateVerticesData(VertexBuffer.PositionKind, positions, true, false);\r\n this.updateVerticesData(VertexBuffer.NormalKind, normals, true, false);\r\n }\r\n }\r\n\r\n /**\r\n * Returns a new TrailMesh object.\r\n * @param name is a string, the name given to the new mesh\r\n * @param newGenerator use new generator object for cloned trail mesh\r\n * @returns a new mesh\r\n */\r\n public override clone(name: string = \"\", newGenerator: TransformNode): TrailMesh {\r\n const options = {\r\n diameter: this.diameter,\r\n length: this._length,\r\n segments: this._segments,\r\n sections: this._sectionPolygonPointsCount,\r\n doNotTaper: this._doNotTaper,\r\n autoStart: this._autoStart,\r\n };\r\n return new TrailMesh(name, newGenerator ?? this._generator, this.getScene(), options);\r\n }\r\n\r\n /**\r\n * Serializes this trail mesh\r\n * @param serializationObject object to write serialization to\r\n */\r\n public override serialize(serializationObject: any): void {\r\n super.serialize(serializationObject);\r\n\r\n serializationObject.generatorId = this._generator.id;\r\n }\r\n\r\n /**\r\n * Parses a serialized trail mesh\r\n * @param parsedMesh the serialized mesh\r\n * @param scene the scene to create the trail mesh in\r\n * @returns the created trail mesh\r\n */\r\n public static override Parse(parsedMesh: any, scene: Scene): TrailMesh {\r\n const generator = scene.getLastMeshById(parsedMesh.generatorId) ?? scene.getLastTransformNodeById(parsedMesh.generatorId);\r\n\r\n if (!generator) {\r\n throw new Error(\"TrailMesh: generator not found with ID \" + parsedMesh.generatorId);\r\n }\r\n\r\n const options = {\r\n diameter: parsedMesh.diameter ?? parsedMesh._diameter,\r\n length: parsedMesh._length,\r\n segments: parsedMesh._segments,\r\n sections: parsedMesh._sectionPolygonPointsCount,\r\n doNotTaper: parsedMesh._doNotTaper,\r\n autoStart: parsedMesh._autoStart,\r\n };\r\n return new TrailMesh(parsedMesh.name, generator, scene, options);\r\n }\r\n}\r\n"]}
@@ -351,6 +351,20 @@ export declare class TransformNode extends Node {
351
351
  * @returns this TransformNode.
352
352
  */
353
353
  setParent(node: Nullable<Node>, preserveScalingSign?: boolean, updatePivot?: boolean): TransformNode;
354
+ /**
355
+ * Adds the passed mesh as a child to the current mesh
356
+ * @param mesh defines the child mesh
357
+ * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.
358
+ * @returns the current mesh
359
+ */
360
+ addChild(mesh: TransformNode, preserveScalingSign?: boolean): this;
361
+ /**
362
+ * Removes the passed mesh from the current mesh children list
363
+ * @param mesh defines the child mesh
364
+ * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.
365
+ * @returns the current mesh
366
+ */
367
+ removeChild(mesh: TransformNode, preserveScalingSign?: boolean): this;
354
368
  private _nonUniformScaling;
355
369
  /**
356
370
  * True if the scaling property of this object is non uniform eg. (1,2,1)
@@ -676,6 +676,26 @@ export class TransformNode extends Node {
676
676
  }
677
677
  return this;
678
678
  }
679
+ /**
680
+ * Adds the passed mesh as a child to the current mesh
681
+ * @param mesh defines the child mesh
682
+ * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.
683
+ * @returns the current mesh
684
+ */
685
+ addChild(mesh, preserveScalingSign = false) {
686
+ mesh.setParent(this, preserveScalingSign);
687
+ return this;
688
+ }
689
+ /**
690
+ * Removes the passed mesh from the current mesh children list
691
+ * @param mesh defines the child mesh
692
+ * @param preserveScalingSign if true, keep scaling sign of child. Otherwise, scaling sign might change.
693
+ * @returns the current mesh
694
+ */
695
+ removeChild(mesh, preserveScalingSign = false) {
696
+ mesh.setParent(null, preserveScalingSign);
697
+ return this;
698
+ }
679
699
  /**
680
700
  * True if the scaling property of this object is non uniform eg. (1,2,1)
681
701
  */