@woosh/meep-engine 3.0.0 → 3.0.1

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 (122) hide show
  1. package/editor/particles/rebuildParticleEmitter.js +8 -26
  2. package/editor/process/symbolic/CameraSymbolicDisplay.js +146 -146
  3. package/editor/tools/SelectionTool.js +1 -2
  4. package/editor/tools/TransformToolV2.js +2 -3
  5. package/editor/tools/v2/BlenderCameraOrientationGizmo.js +501 -501
  6. package/editor/tools/v2/TransformControls.js +1 -1
  7. package/package.json +95 -96
  8. package/src/core/geom/3d/mat4/m4_look_at.d.ts +25 -0
  9. package/src/core/geom/3d/mat4/m4_look_at.d.ts.map +1 -0
  10. package/src/core/geom/3d/mat4/m4_look_at.js +96 -0
  11. package/src/core/geom/3d/mat4/m4_make_rotation_x.d.ts +18 -0
  12. package/src/core/geom/3d/mat4/m4_make_rotation_x.d.ts.map +1 -0
  13. package/src/core/geom/3d/mat4/m4_make_rotation_x.js +47 -0
  14. package/src/core/geom/3d/mat4/m4_make_rotation_y.d.ts +18 -0
  15. package/src/core/geom/3d/mat4/m4_make_rotation_y.d.ts.map +1 -0
  16. package/src/core/geom/3d/mat4/m4_make_rotation_y.js +47 -0
  17. package/src/core/geom/3d/mat4/m4_make_rotation_z.d.ts +18 -0
  18. package/src/core/geom/3d/mat4/m4_make_rotation_z.d.ts.map +1 -0
  19. package/src/core/geom/3d/mat4/m4_make_rotation_z.js +47 -0
  20. package/src/core/geom/3d/mat4/m4_perspective.d.ts +25 -0
  21. package/src/core/geom/3d/mat4/m4_perspective.d.ts.map +1 -0
  22. package/src/core/geom/3d/mat4/m4_perspective.js +66 -0
  23. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  24. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +2045 -2052
  25. package/src/engine/ecs/gui/hud/testHudEdgeStick.js +2 -2
  26. package/src/engine/ecs/terrain/ecs/TerrainSystem.d.ts.map +1 -1
  27. package/src/engine/ecs/terrain/ecs/TerrainSystem.js +14 -27
  28. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.d.ts.map +1 -1
  29. package/src/engine/ecs/terrain/util/loadVisibleTerrainTiles.js +129 -126
  30. package/src/engine/graphics/ecs/camera/Camera.d.ts +36 -48
  31. package/src/engine/graphics/ecs/camera/Camera.d.ts.map +1 -1
  32. package/src/engine/graphics/ecs/camera/Camera.js +165 -303
  33. package/src/engine/graphics/ecs/camera/camera_active_frustum.d.ts +14 -0
  34. package/src/engine/graphics/ecs/camera/camera_active_frustum.d.ts.map +1 -0
  35. package/src/engine/graphics/ecs/camera/camera_active_frustum.js +25 -0
  36. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts +16 -0
  37. package/src/engine/graphics/ecs/camera/camera_find_active.d.ts.map +1 -0
  38. package/src/engine/graphics/ecs/camera/camera_find_active.js +28 -0
  39. package/src/engine/graphics/ecs/camera/camera_traverse_active.d.ts +12 -0
  40. package/src/engine/graphics/ecs/camera/camera_traverse_active.d.ts.map +1 -0
  41. package/src/engine/graphics/ecs/camera/camera_traverse_active.js +18 -0
  42. package/src/engine/graphics/ecs/camera/pp/PerfectPanner.js +170 -170
  43. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts +5 -1
  44. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.d.ts.map +1 -1
  45. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraController.js +296 -281
  46. package/src/engine/graphics/ecs/render_layers_compute_depth_range.d.ts +1 -1
  47. package/src/engine/graphics/ecs/render_layers_compute_depth_range.js +1 -1
  48. package/src/engine/graphics/geometry/AttributeData.d.ts +52 -0
  49. package/src/engine/graphics/geometry/AttributeData.d.ts.map +1 -0
  50. package/src/engine/graphics/geometry/AttributeData.js +84 -0
  51. package/src/engine/graphics/particles/particular/engine/ParticularEngine.d.ts +1 -14
  52. package/src/engine/graphics/particles/particular/engine/ParticularEngine.d.ts.map +1 -1
  53. package/src/engine/graphics/particles/particular/engine/ParticularEngine.js +229 -253
  54. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts +25 -12
  55. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.d.ts.map +1 -1
  56. package/src/engine/graphics/particles/particular/engine/emitter/ParticleEmitter.js +1149 -1194
  57. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts +4 -8
  58. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.d.ts.map +1 -1
  59. package/src/engine/graphics/particles/particular/engine/emitter/ParticlePool.js +472 -540
  60. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.d.ts +19 -90
  61. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.d.ts.map +1 -1
  62. package/src/engine/graphics/particles/particular/engine/shader/ShaderManager.js +135 -514
  63. package/src/engine/graphics3/CameraSystem3.d.ts.map +1 -1
  64. package/src/engine/graphics3/CameraSystem3.js +10 -1
  65. package/src/engine/graphics3/GraphicsEngine3.d.ts +3 -3
  66. package/src/engine/graphics3/GraphicsEngine3.js +3 -3
  67. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts +11 -0
  68. package/src/engine/graphics3/ParticleEmitterSystem3.d.ts.map +1 -1
  69. package/src/engine/graphics3/ParticleEmitterSystem3.js +289 -265
  70. package/src/engine/graphics3/ShadeCameraAdapter.d.ts +3 -3
  71. package/src/engine/graphics3/ShadeCameraAdapter.js +3 -3
  72. package/src/engine/graphics3/camera_sync_from_transform.d.ts +2 -2
  73. package/src/engine/graphics3/camera_sync_from_transform.js +2 -2
  74. package/src/engine/graphics3/shade_camera_projection_ray.js +2 -2
  75. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  76. package/src/shade/renderer/camera/Camera.d.ts +3 -5
  77. package/src/shade/renderer/camera/Camera.d.ts.map +1 -1
  78. package/src/shade/renderer/camera/Camera.js +281 -280
  79. package/src/shade/renderer/camera/GPUCameraContext.js +233 -233
  80. package/src/shade/renderer/loader/usd/parse_usda.js +1 -1
  81. package/src/shade/renderer/loader/usd/usd_build_scene.d.ts.map +1 -1
  82. package/src/shade/renderer/loader/usd/usd_build_scene.js +658 -652
  83. package/src/shade/renderer/loader/usd/usd_compose_transform.d.ts.map +1 -1
  84. package/src/shade/renderer/loader/usd/usd_compose_transform.js +58 -23
  85. package/src/shade/renderer/particles/prototypeParticleSystem.js +450 -443
  86. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.d.ts.map +1 -1
  87. package/src/shade/renderer/shadow/map/DirectionalLightShadowmap.js +7 -3
  88. package/src/view/minimap/dom/MinimapCameraView.d.ts +2 -2
  89. package/src/view/minimap/dom/MinimapCameraView.js +206 -206
  90. package/src/engine/graphics/ecs/camera/CameraSystem.d.ts +0 -74
  91. package/src/engine/graphics/ecs/camera/CameraSystem.d.ts.map +0 -1
  92. package/src/engine/graphics/ecs/camera/CameraSystem.js +0 -331
  93. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.d.ts +0 -10
  94. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.d.ts.map +0 -1
  95. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.js +0 -105
  96. package/src/engine/graphics/ecs/camera/build_three_camera_object.d.ts +0 -7
  97. package/src/engine/graphics/ecs/camera/build_three_camera_object.d.ts.map +0 -1
  98. package/src/engine/graphics/ecs/camera/build_three_camera_object.js +0 -29
  99. package/src/engine/graphics/ecs/camera/frustum_from_camera.d.ts +0 -8
  100. package/src/engine/graphics/ecs/camera/frustum_from_camera.d.ts.map +0 -1
  101. package/src/engine/graphics/ecs/camera/frustum_from_camera.js +0 -20
  102. package/src/engine/graphics/ecs/camera/set_camera_aspect_ratio.d.ts +0 -9
  103. package/src/engine/graphics/ecs/camera/set_camera_aspect_ratio.d.ts.map +0 -1
  104. package/src/engine/graphics/ecs/camera/set_camera_aspect_ratio.js +0 -46
  105. package/src/engine/graphics/ecs/camera/unprojectPoint.d.ts +0 -9
  106. package/src/engine/graphics/ecs/camera/unprojectPoint.d.ts.map +0 -1
  107. package/src/engine/graphics/ecs/camera/unprojectPoint.js +0 -14
  108. package/src/engine/graphics/ecs/camera/update_camera_transform.d.ts +0 -6
  109. package/src/engine/graphics/ecs/camera/update_camera_transform.d.ts.map +0 -1
  110. package/src/engine/graphics/ecs/camera/update_camera_transform.js +0 -17
  111. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts +0 -67
  112. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts.map +0 -1
  113. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.js +0 -291
  114. package/src/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.d.ts +0 -11
  115. package/src/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.d.ts.map +0 -1
  116. package/src/engine/graphics/particles/particular/engine/renderers/billboard/ParticleBillboardMaterial.js +0 -497
  117. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.d.ts +0 -40
  118. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.d.ts.map +0 -1
  119. package/src/engine/graphics/particles/particular/engine/shader/MaterialRecord.js +0 -47
  120. package/src/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.d.ts +0 -7
  121. package/src/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.d.ts.map +0 -1
  122. package/src/engine/graphics/texture/sampler/writeSampler2DDataToDataTexture.js +0 -40
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttributeData.d.ts","sourceRoot":"","sources":["../../../../../src/engine/graphics/geometry/AttributeData.js"],"names":[],"mappings":"AAKA;;;;;;;GAOG;AACH;IAuDI;;;;;;OAMG;IACH,4CAHW,MAAM,GACJ,aAAa,CASzB;IAxDD;;;OAGG;IACH,wCAFW,YAAY,GAAC,YAAY,GAAC,UAAU,GAAC,WAAW,GAAC,WAAW,GAAC,SAAS,GAAC,UAAU,GAAC,UAAU,EAQtG;IAtBD;;OAEG;IACH,oBAAK;IAEL;;;;OAIG;IACH,OAFU,YAAY,GAAC,YAAY,GAAC,UAAU,GAAC,WAAW,GAAC,WAAW,GAAC,SAAS,GAAC,UAAU,GAAC,UAAU,CAEhG;IAcN;;OAEG;IACH,mBAEC;IAED;;OAEG;IACH,uBAEC;IAED;;OAEG;IACH,0BAEC;IAED;;;;OAIG;IACH,oBAEC;CAiBJ"}
@@ -0,0 +1,84 @@
1
+ import { assert } from "../../../core/assert.js";
2
+ import {
3
+ compute_typed_array_constructor_from_data_type
4
+ } from "../../../core/binary/type/DataType2TypedArrayConstructorMapping.js";
5
+
6
+ /**
7
+ * An {@link AttributeSpec} and the elements stored under it.
8
+ *
9
+ * The spec says what one item is — how many components, in what type, whether integer values are
10
+ * read back normalized — and the array holds `count` of them end to end. Nothing here knows about a
11
+ * renderer: uploading is the business of whoever is drawing, and a consumer that re-reads the array
12
+ * every frame has nothing to be told.
13
+ */
14
+ export class AttributeData {
15
+ /**
16
+ * @type {AttributeSpec}
17
+ */
18
+ spec;
19
+
20
+ /**
21
+ * `count * spec.itemSize` elements, item-major.
22
+ *
23
+ * @type {Float32Array|Float64Array|Uint8Array|Uint16Array|Uint32Array|Int8Array|Int16Array|Int32Array}
24
+ */
25
+ array;
26
+
27
+ /**
28
+ * @param {AttributeSpec} spec
29
+ * @param {Float32Array|Float64Array|Uint8Array|Uint16Array|Uint32Array|Int8Array|Int16Array|Int32Array} array
30
+ */
31
+ constructor(spec, array) {
32
+ assert.defined(spec, 'spec');
33
+ assert.defined(array, 'array');
34
+
35
+ this.spec = spec;
36
+ this.array = array;
37
+ }
38
+
39
+ /**
40
+ * @returns {string}
41
+ */
42
+ get name() {
43
+ return this.spec.name;
44
+ }
45
+
46
+ /**
47
+ * @returns {number}
48
+ */
49
+ get itemSize() {
50
+ return this.spec.itemSize;
51
+ }
52
+
53
+ /**
54
+ * @returns {boolean}
55
+ */
56
+ get normalized() {
57
+ return this.spec.normalized;
58
+ }
59
+
60
+ /**
61
+ * How many items the array has room for.
62
+ *
63
+ * @returns {number}
64
+ */
65
+ get count() {
66
+ return this.array.length / this.spec.itemSize;
67
+ }
68
+
69
+ /**
70
+ * Allocate storage for `count` items of `spec`.
71
+ *
72
+ * @param {AttributeSpec} spec
73
+ * @param {number} count
74
+ * @returns {AttributeData}
75
+ */
76
+ static allocate(spec, count) {
77
+ assert.defined(spec, 'spec');
78
+ assert.isNonNegativeInteger(count, 'count');
79
+
80
+ const TypedArray = compute_typed_array_constructor_from_data_type(spec.type);
81
+
82
+ return new AttributeData(spec, new TypedArray(spec.itemSize * count));
83
+ }
84
+ }
@@ -2,15 +2,9 @@ export class ParticularEngine {
2
2
  /**
3
3
  *
4
4
  * @param {AssetManager} assetManager
5
- * @param {MaterialManager} material_manager
6
5
  * @constructor
7
6
  */
8
- constructor(assetManager: AssetManager, material_manager: MaterialManager);
9
- /**
10
- *
11
- * @type {THREE.Camera|null}
12
- */
13
- camera: THREE.Camera | null;
7
+ constructor(assetManager: AssetManager);
14
8
  /**
15
9
  * Managed emitters
16
10
  * @type {List.<ParticleEmitter>}
@@ -38,13 +32,6 @@ export class ParticularEngine {
38
32
  * @returns {boolean}
39
33
  */
40
34
  remove(emitter: ParticleEmitter): boolean;
41
- /**
42
- *
43
- * @param {THREE.Camera} camera
44
- */
45
- setCamera(camera: THREE.Camera): void;
46
- setDepthTexture(texture: any): void;
47
- setViewportSize(x: any, y: any): void;
48
35
  /**
49
36
  * Hand back the resources held on behalf of the managed emitters. Emitters themselves are owned by
50
37
  * their components and are disposed by {@link ParticleEmitter#dispose} as they are removed.
@@ -1 +1 @@
1
- {"version":3,"file":"ParticularEngine.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/particles/particular/engine/ParticularEngine.js"],"names":[],"mappings":"AAUA;IA+BI;;;;;OAKG;IACH,2EAEC;IAtCD;;;OAGG;IACH,QAFU,MAAM,MAAM,GAAC,IAAI,CAEb;IAEd;;;OAGG;IACH,UAFU,qBAAsB,CAEV;IAEtB;;;OAGG;IACH,cAFU,GAAG,CAEG;IAGhB;;;OAGG;IACH,OAFU,wBAAwB,CAOhC;IASE,6BAAsE;IAG1E;;;OAGG;IACH,oCAaC;IAED;;;;OAIG;IACH,kCAFa,OAAO,CAenB;IAED;;;OAGG;IACH,kBAFW,MAAM,MAAM,QAKtB;IAED,oCAEC;IAED,sCAEC;IAED;;;OAGG;IACH,gBAEC;IAED;;;;OAIG;IACH,uBAsEC;IAED;;;;OAIG;IACH,sBAuCC;IAED;;;OAGG;IACH,mBAFW,MAAM,QAWhB;CACJ;iBA3PgB,6CAA6C;oBAD1C,sCAAsC;8BAG5B,2BAA2B"}
1
+ {"version":3,"file":"ParticularEngine.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/particles/particular/engine/ParticularEngine.js"],"names":[],"mappings":"AAUA;IAyBI;;;;OAIG;IACH,wCAEC;IA/BD;;;OAGG;IACH,UAFU,qBAAsB,CAEV;IAEtB;;;OAGG;IACH,cAFU,GAAG,CAEG;IAGhB;;;OAGG;IACH,OAFU,wBAAwB,CAOhC;IAQE,6BAAoD;IAGxD;;;OAGG;IACH,oCAaC;IAED;;;;OAIG;IACH,kCAFa,OAAO,CAenB;IAED;;;OAGG;IACH,gBAEC;IAED;;;;OAIG;IACH,uBAsEC;IAED;;;;OAIG;IACH,sBAuCC;IAED;;;OAGG;IACH,mBAFW,MAAM,QAWhB;CACJ;iBAnOgB,6CAA6C;oBAD1C,sCAAsC;8BAG5B,2BAA2B"}
@@ -1,253 +1,229 @@
1
- import { BVH } from "../../../../../core/bvh2/bvh3/BVH.js";
2
- import List from "../../../../../core/collection/list/List.js";
3
- import { ParticleEmitterFlag } from "./emitter/ParticleEmitterFlag.js";
4
- import { ShaderManager } from "./shader/ShaderManager.js";
5
- import { SimulationStepApplyForce } from "./simulator/SimulationStepApplyForce.js";
6
- import { SimulationStepCurlNoiseAcceleration } from "./simulator/SimulationStepCurlNoiseAcceleration.js";
7
- import { SimulationStepCurlNoiseVelocity } from "./simulator/SimulationStepCurlNoiseVelocity.js";
8
- import { SimulationStepFixedPhysics } from "./simulator/SimulationStepFixedPhysics.js";
9
-
10
-
11
- export class ParticularEngine {
12
- /**
13
- *
14
- * @type {THREE.Camera|null}
15
- */
16
- camera = null;
17
-
18
- /**
19
- * Managed emitters
20
- * @type {List.<ParticleEmitter>}
21
- */
22
- emitters = new List();
23
-
24
- /**
25
- * @readonly
26
- * @type {BVH}
27
- */
28
- bvh = new BVH();
29
-
30
-
31
- /**
32
- *
33
- * @type {AbstractSimulationStep[]}
34
- */
35
- steps = [
36
- new SimulationStepFixedPhysics(),
37
- new SimulationStepCurlNoiseAcceleration(),
38
- new SimulationStepCurlNoiseVelocity(),
39
- new SimulationStepApplyForce()
40
- ];
41
-
42
- /**
43
- *
44
- * @param {AssetManager} assetManager
45
- * @param {MaterialManager} material_manager
46
- * @constructor
47
- */
48
- constructor(assetManager, material_manager) {
49
- this.shaderManager = new ShaderManager(assetManager, material_manager);
50
- }
51
-
52
- /**
53
- *
54
- * @param {ParticleEmitter} emitter
55
- */
56
- add(emitter) {
57
- if (!emitter.getFlag(ParticleEmitterFlag.Built)) {
58
- emitter.build();
59
- }
60
-
61
- //mark sprites for update as their UVs might have changed since last usage
62
- emitter.setFlag(ParticleEmitterFlag.SpritesNeedUpdate);
63
-
64
- this.emitters.add(emitter);
65
-
66
- this.shaderManager.register(emitter);
67
-
68
- emitter.bvh_leaf.link(this.bvh, emitter.id);
69
- }
70
-
71
- /**
72
- *
73
- * @param {ParticleEmitter} emitter
74
- * @returns {boolean}
75
- */
76
- remove(emitter) {
77
-
78
- const removed = this.emitters.removeOneOf(emitter);
79
-
80
- if (!removed) {
81
- return false;
82
- }
83
-
84
- this.shaderManager.deregister(emitter);
85
-
86
- emitter.bvh_leaf.unlink();
87
-
88
- return true;
89
- }
90
-
91
- /**
92
- *
93
- * @param {THREE.Camera} camera
94
- */
95
- setCamera(camera) {
96
- this.camera = camera;
97
- this.shaderManager.setCamera(camera);
98
- }
99
-
100
- setDepthTexture(texture) {
101
- this.shaderManager.setDepthTexture(texture);
102
- }
103
-
104
- setViewportSize(x, y) {
105
- this.shaderManager.setViewportSize(x, y);
106
- }
107
-
108
- /**
109
- * Hand back the resources held on behalf of the managed emitters. Emitters themselves are owned by
110
- * their components and are disposed by {@link ParticleEmitter#dispose} as they are removed.
111
- */
112
- dispose() {
113
- this.shaderManager.dispose();
114
- }
115
-
116
- /**
117
- * @private
118
- * @param {ParticleEmitter} emitter
119
- * @param {number} timeDelta
120
- */
121
- advanceEmitter(emitter, timeDelta) {
122
- let i, j;
123
-
124
-
125
- /**
126
- *
127
- * @type {List<ParticleLayer>}
128
- */
129
- const layers = emitter.layers;
130
-
131
- const layer_count = layers.length;
132
-
133
- let step_mask = 0;
134
-
135
- const steps = this.steps;
136
-
137
- for (j = 0; j < layer_count; j++) {
138
- const particleLayer = layers.get(j);
139
-
140
- const simulationStepDefinitions = particleLayer.steps;
141
-
142
- const n = simulationStepDefinitions.length;
143
-
144
- for (i = 0; i < n; i++) {
145
- /**
146
- *
147
- * @type {SimulationStepDefinition}
148
- */
149
- const stepDefinition = simulationStepDefinitions.get(i);
150
-
151
- const type = stepDefinition.type;
152
-
153
- step_mask |= 1 << type;
154
-
155
- const step = steps[type];
156
-
157
- if (step === undefined) {
158
- // no step definition
159
- continue;
160
- }
161
-
162
- step.emitter = emitter;
163
- step.timeDelta = timeDelta;
164
- step.particles = emitter.particles;
165
- step.layer_parameters[j] = stepDefinition.parameters;
166
- step.includeLayer(j);
167
-
168
- }
169
- }
170
-
171
- // apply simulation steps
172
- const step_index_limit = steps.length;
173
-
174
- for (i = 0; i < step_index_limit; i++) {
175
- const m = 1 << i;
176
- const is_used = (step_mask & m) !== 0;
177
-
178
- if (is_used) {
179
- const step = steps[i];
180
-
181
- step.layer_count = layer_count;
182
-
183
- step.execute();
184
-
185
- step.clear();
186
- }
187
- }
188
-
189
- emitter.advance(timeDelta);
190
-
191
- }
192
-
193
- /**
194
- * @private
195
- * @param {ParticleEmitter} emitter
196
- * @param {number} timeDelta
197
- */
198
- updateEmitter(emitter, timeDelta) {
199
- if (emitter.getFlag(ParticleEmitterFlag.Sleeping)) {
200
- emitter.sleepTime += timeDelta;
201
- } else {
202
-
203
- if (!emitter.getFlag(ParticleEmitterFlag.Initialized)) {
204
- emitter.initialize();
205
- }
206
-
207
- if (emitter.sleepTime > 0) {
208
- //emitter was sleeping, need to catch up the simulation
209
- const maxParticleLife = emitter.computeMaxEmittingParticleLife();
210
-
211
- let wakingTime = Math.min(emitter.sleepTime, maxParticleLife - timeDelta);
212
-
213
- const minWakingIncrement = 0.15;
214
-
215
- const maxWakingSteps = 10;
216
-
217
- const wakingIncrement = Math.max(wakingTime / maxWakingSteps, minWakingIncrement);
218
-
219
- while (wakingTime > 0) {
220
- const wakingStep = Math.min(wakingIncrement, wakingTime);
221
-
222
- this.advanceEmitter(emitter, wakingStep);
223
-
224
- wakingTime -= wakingStep;
225
- }
226
-
227
- //consume the sleep time
228
- emitter.sleepTime = 0;
229
- }
230
-
231
- //advance simulation
232
- this.advanceEmitter(emitter, timeDelta);
233
-
234
- //update bounding box
235
- emitter.computeBoundingBox();
236
- }
237
- }
238
-
239
- /**
240
- *
241
- * @param {number} timeDelta
242
- */
243
- advance(timeDelta) {
244
- const emitters = this.emitters;
245
-
246
- const numEmitters = emitters.length;
247
-
248
- for (let i = 0; i < numEmitters; i++) {
249
- const emitter = emitters.get(i);
250
- this.updateEmitter(emitter, timeDelta);
251
- }
252
- }
253
- }
1
+ import { BVH } from "../../../../../core/bvh2/bvh3/BVH.js";
2
+ import List from "../../../../../core/collection/list/List.js";
3
+ import { ParticleEmitterFlag } from "./emitter/ParticleEmitterFlag.js";
4
+ import { ShaderManager } from "./shader/ShaderManager.js";
5
+ import { SimulationStepApplyForce } from "./simulator/SimulationStepApplyForce.js";
6
+ import { SimulationStepCurlNoiseAcceleration } from "./simulator/SimulationStepCurlNoiseAcceleration.js";
7
+ import { SimulationStepCurlNoiseVelocity } from "./simulator/SimulationStepCurlNoiseVelocity.js";
8
+ import { SimulationStepFixedPhysics } from "./simulator/SimulationStepFixedPhysics.js";
9
+
10
+
11
+ export class ParticularEngine {
12
+ /**
13
+ * Managed emitters
14
+ * @type {List.<ParticleEmitter>}
15
+ */
16
+ emitters = new List();
17
+
18
+ /**
19
+ * @readonly
20
+ * @type {BVH}
21
+ */
22
+ bvh = new BVH();
23
+
24
+
25
+ /**
26
+ *
27
+ * @type {AbstractSimulationStep[]}
28
+ */
29
+ steps = [
30
+ new SimulationStepFixedPhysics(),
31
+ new SimulationStepCurlNoiseAcceleration(),
32
+ new SimulationStepCurlNoiseVelocity(),
33
+ new SimulationStepApplyForce()
34
+ ];
35
+
36
+ /**
37
+ *
38
+ * @param {AssetManager} assetManager
39
+ * @constructor
40
+ */
41
+ constructor(assetManager) {
42
+ this.shaderManager = new ShaderManager(assetManager);
43
+ }
44
+
45
+ /**
46
+ *
47
+ * @param {ParticleEmitter} emitter
48
+ */
49
+ add(emitter) {
50
+ if (!emitter.getFlag(ParticleEmitterFlag.Built)) {
51
+ emitter.build();
52
+ }
53
+
54
+ //mark sprites for update as their UVs might have changed since last usage
55
+ emitter.setFlag(ParticleEmitterFlag.SpritesNeedUpdate);
56
+
57
+ this.emitters.add(emitter);
58
+
59
+ this.shaderManager.register(emitter);
60
+
61
+ emitter.bvh_leaf.link(this.bvh, emitter.id);
62
+ }
63
+
64
+ /**
65
+ *
66
+ * @param {ParticleEmitter} emitter
67
+ * @returns {boolean}
68
+ */
69
+ remove(emitter) {
70
+
71
+ const removed = this.emitters.removeOneOf(emitter);
72
+
73
+ if (!removed) {
74
+ return false;
75
+ }
76
+
77
+ this.shaderManager.deregister(emitter);
78
+
79
+ emitter.bvh_leaf.unlink();
80
+
81
+ return true;
82
+ }
83
+
84
+ /**
85
+ * Hand back the resources held on behalf of the managed emitters. Emitters themselves are owned by
86
+ * their components and are disposed by {@link ParticleEmitter#dispose} as they are removed.
87
+ */
88
+ dispose() {
89
+ this.shaderManager.dispose();
90
+ }
91
+
92
+ /**
93
+ * @private
94
+ * @param {ParticleEmitter} emitter
95
+ * @param {number} timeDelta
96
+ */
97
+ advanceEmitter(emitter, timeDelta) {
98
+ let i, j;
99
+
100
+
101
+ /**
102
+ *
103
+ * @type {List<ParticleLayer>}
104
+ */
105
+ const layers = emitter.layers;
106
+
107
+ const layer_count = layers.length;
108
+
109
+ let step_mask = 0;
110
+
111
+ const steps = this.steps;
112
+
113
+ for (j = 0; j < layer_count; j++) {
114
+ const particleLayer = layers.get(j);
115
+
116
+ const simulationStepDefinitions = particleLayer.steps;
117
+
118
+ const n = simulationStepDefinitions.length;
119
+
120
+ for (i = 0; i < n; i++) {
121
+ /**
122
+ *
123
+ * @type {SimulationStepDefinition}
124
+ */
125
+ const stepDefinition = simulationStepDefinitions.get(i);
126
+
127
+ const type = stepDefinition.type;
128
+
129
+ step_mask |= 1 << type;
130
+
131
+ const step = steps[type];
132
+
133
+ if (step === undefined) {
134
+ // no step definition
135
+ continue;
136
+ }
137
+
138
+ step.emitter = emitter;
139
+ step.timeDelta = timeDelta;
140
+ step.particles = emitter.particles;
141
+ step.layer_parameters[j] = stepDefinition.parameters;
142
+ step.includeLayer(j);
143
+
144
+ }
145
+ }
146
+
147
+ // apply simulation steps
148
+ const step_index_limit = steps.length;
149
+
150
+ for (i = 0; i < step_index_limit; i++) {
151
+ const m = 1 << i;
152
+ const is_used = (step_mask & m) !== 0;
153
+
154
+ if (is_used) {
155
+ const step = steps[i];
156
+
157
+ step.layer_count = layer_count;
158
+
159
+ step.execute();
160
+
161
+ step.clear();
162
+ }
163
+ }
164
+
165
+ emitter.advance(timeDelta);
166
+
167
+ }
168
+
169
+ /**
170
+ * @private
171
+ * @param {ParticleEmitter} emitter
172
+ * @param {number} timeDelta
173
+ */
174
+ updateEmitter(emitter, timeDelta) {
175
+ if (emitter.getFlag(ParticleEmitterFlag.Sleeping)) {
176
+ emitter.sleepTime += timeDelta;
177
+ } else {
178
+
179
+ if (!emitter.getFlag(ParticleEmitterFlag.Initialized)) {
180
+ emitter.initialize();
181
+ }
182
+
183
+ if (emitter.sleepTime > 0) {
184
+ //emitter was sleeping, need to catch up the simulation
185
+ const maxParticleLife = emitter.computeMaxEmittingParticleLife();
186
+
187
+ let wakingTime = Math.min(emitter.sleepTime, maxParticleLife - timeDelta);
188
+
189
+ const minWakingIncrement = 0.15;
190
+
191
+ const maxWakingSteps = 10;
192
+
193
+ const wakingIncrement = Math.max(wakingTime / maxWakingSteps, minWakingIncrement);
194
+
195
+ while (wakingTime > 0) {
196
+ const wakingStep = Math.min(wakingIncrement, wakingTime);
197
+
198
+ this.advanceEmitter(emitter, wakingStep);
199
+
200
+ wakingTime -= wakingStep;
201
+ }
202
+
203
+ //consume the sleep time
204
+ emitter.sleepTime = 0;
205
+ }
206
+
207
+ //advance simulation
208
+ this.advanceEmitter(emitter, timeDelta);
209
+
210
+ //update bounding box
211
+ emitter.computeBoundingBox();
212
+ }
213
+ }
214
+
215
+ /**
216
+ *
217
+ * @param {number} timeDelta
218
+ */
219
+ advance(timeDelta) {
220
+ const emitters = this.emitters;
221
+
222
+ const numEmitters = emitters.length;
223
+
224
+ for (let i = 0; i < numEmitters; i++) {
225
+ const emitter = emitters.get(i);
226
+ this.updateEmitter(emitter, timeDelta);
227
+ }
228
+ }
229
+ }