@woosh/meep-engine 2.75.3 → 2.75.5

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 (48) hide show
  1. package/editor/ecs/component/editors/ecs/ParameterLookupTableEditor.js +35 -21
  2. package/package.json +2 -2
  3. package/src/core/collection/array/array_compute_min_max.js +20 -0
  4. package/src/core/collection/map/HashMap.js +16 -14
  5. package/src/core/geom/2d/convex-hull/fixed_convex_hull_humus.js +23 -13
  6. package/src/core/geom/2d/intersect_ray_2d.js +7 -14
  7. package/src/core/geom/3d/aabb/AABB3.js +13 -0
  8. package/src/core/geom/3d/topology/samples/sampleFloodFill.js +21 -21
  9. package/src/core/geom/3d/topology/tm_face_area.js +1 -1
  10. package/src/core/geom/3d/triangle/computeTriangleSurfaceArea.js +39 -0
  11. package/src/core/process/task/util/countTask.js +1 -2
  12. package/src/engine/EngineBootstrapper.js +15 -7
  13. package/src/engine/animation/curve/AnimationCurve.js +50 -31
  14. package/src/engine/animation/curve/AnimationCurve.spec.js +9 -1
  15. package/src/engine/animation/curve/compression/prototypeCurveCompression.js +20 -11
  16. package/src/engine/animation/curve/compute_curve_aabb.js +26 -0
  17. package/src/engine/animation/curve/draw/build_curve_editor.js +82 -42
  18. package/src/engine/animation/curve/draw/build_plot_entity_from_array.js +5 -5
  19. package/src/engine/animation/curve/preset/CURVE_EASE_IN.js +8 -0
  20. package/src/engine/animation/curve/preset/CURVE_EASE_IN_OUT.js +7 -0
  21. package/src/engine/animation/curve/preset/CURVE_EASE_OUT.js +7 -0
  22. package/src/engine/asset/loaders/image/png/PNGReader.js +119 -1
  23. package/src/engine/graphics/GraphicsEngine.d.ts +6 -3
  24. package/src/engine/graphics/canvas/canvas2d_draw_grid.js +42 -0
  25. package/src/engine/{animation/curve/draw/draw_label.js → graphics/canvas/canvas2d_draw_label.js} +6 -1
  26. package/src/engine/graphics/canvas/canvas2d_draw_linear_scale.js +64 -0
  27. package/src/engine/graphics/canvas/canvas2d_draw_path.js +60 -0
  28. package/src/engine/graphics/canvas/canvas2d_plot_data_line.js +84 -0
  29. package/src/engine/{animation/curve/draw/plot_array.js → graphics/canvas/canvas2d_plot_line_array.js} +8 -25
  30. package/src/engine/graphics/geometry/VertexDataSpec.d.ts +10 -0
  31. package/src/engine/graphics/geometry/VertexDataSpec.js +20 -21
  32. package/src/engine/graphics/geometry/computeMeshSurfaceArea.js +2 -37
  33. package/src/engine/graphics/impostors/octahedral/bake/prepare_bake_material.js +8 -26
  34. package/src/engine/graphics/material/manager/MaterialManager.d.ts +6 -0
  35. package/src/engine/graphics/sh3/LightProbeVolume.js +38 -17
  36. package/src/engine/graphics/sh3/path_tracer/prototypePathTracer.js +26 -35
  37. package/src/engine/graphics/sh3/prototypeSH3Probe.js +166 -100
  38. package/src/engine/graphics/texture/makeOnePixelTexture.js +19 -0
  39. package/src/engine/graphics/texture/sprite/prototypeSpriteCutoutGeometry.js +5 -68
  40. package/src/engine/graphics/texture/virtual/v2/VirtualTexturePage.js +1 -1
  41. package/src/engine/input/devices/PointerDevice.js +6 -3
  42. package/src/engine/makeSimpleTaskProgressView.js +33 -0
  43. package/src/engine/scene/transitionToScene.js +9 -10
  44. package/src/view/task/TaskLoadingScreen.js +5 -12
  45. package/src/view/task/TaskProgressView.js +9 -9
  46. package/src/engine/animation/curve/draw/draw_grid.js +0 -27
  47. package/src/engine/animation/curve/draw/plot_data.js +0 -49
  48. package/src/engine/graphics/geometry/QuadGeometry.js +0 -13
@@ -1,6 +1,4 @@
1
- import EmptyView from "../../../../view/elements/EmptyView.js";
2
- import { CanvasView } from "../../../../view/elements/CanvasView.js";
3
- import { PathTracer } from "./PathTracer.js";
1
+ import { mat4, vec3 } from "gl-matrix";
4
2
  import {
5
3
  Box3,
6
4
  MeshStandardMaterial,
@@ -9,35 +7,37 @@ import {
9
7
  PlaneBufferGeometry,
10
8
  Sphere
11
9
  } from "three";
12
- import { Sampler2D } from "../../texture/sampler/Sampler2D.js";
13
- import sampler2D2Canvas from "../../texture/sampler/Sampler2D2Canvas.js";
14
- import { ray3_array_compose } from "../../../../core/geom/3d/ray/ray3_array_compose.js";
15
- import { Transform } from "../../../ecs/transform/Transform.js";
16
- import { float2uint8 } from "../../../../core/binary/float2uint8.js";
17
10
  import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
18
- import { Camera } from "../../ecs/camera/Camera.js";
11
+ import { PLYLoader } from "three/examples/jsm/loaders/PLYLoader.js";
12
+
13
+ import '../../../../../../../../css/game.scss';
14
+ import { float2uint8 } from "../../../../core/binary/float2uint8.js";
15
+ import { Color } from "../../../../core/color/Color.js";
16
+ import { kelvin_to_rgb } from "../../../../core/color/kelvin/kelvin_to_rgb.js";
17
+ import { noop } from "../../../../core/function/Functions.js";
18
+ import { ray3_array_compose } from "../../../../core/geom/3d/ray/ray3_array_compose.js";
19
+ import Quaternion from "../../../../core/geom/Quaternion.js";
20
+ import { v3_distance } from "../../../../core/geom/vec3/v3_distance.js";
19
21
  import Vector3 from "../../../../core/geom/Vector3.js";
20
- import { sampler2d_scale } from "../../texture/sampler/resize/sampler2d_scale.js";
22
+ import { Localization } from "../../../../core/localization/Localization.js";
23
+ import { min2 } from "../../../../core/math/min2.js";
21
24
  import { seededRandom } from "../../../../core/math/random/seededRandom.js";
22
- import { mat4, vec3 } from "gl-matrix";
23
- import { v3_distance } from "../../../../core/geom/vec3/v3_distance.js";
25
+ import { number_pretty_print } from "../../../../core/primitives/numbers/number_pretty_print.js";
24
26
  import ConcurrentExecutor from "../../../../core/process/executor/ConcurrentExecutor.js";
25
27
  import Task from "../../../../core/process/task/Task.js";
26
28
  import { TaskSignal } from "../../../../core/process/task/TaskSignal.js";
27
- import Quaternion from "../../../../core/geom/Quaternion.js";
28
- import TaskProgressView from "../../../../view/task/TaskProgressView.js";
29
- import { Localization } from "../../../../core/localization/Localization.js";
30
-
31
- import '../../../../../../../../css/game.scss';
29
+ import { CanvasView } from "../../../../view/elements/CanvasView.js";
30
+ import EmptyView from "../../../../view/elements/EmptyView.js";
31
+ import { Transform } from "../../../ecs/transform/Transform.js";
32
32
  import { MouseEvents } from "../../../input/devices/events/MouseEvents.js";
33
- import { PLYLoader } from "three/examples/jsm/loaders/PLYLoader.js";
34
- import { noop } from "../../../../core/function/Functions.js";
35
- import { Color } from "../../../../core/color/Color.js";
36
- import { min2 } from "../../../../core/math/min2.js";
33
+ import { makeSimpleTaskProgressView } from "../../../makeSimpleTaskProgressView.js";
34
+ import { Camera } from "../../ecs/camera/Camera.js";
37
35
  import { makeGeometryIndexed } from "../../geometry/buffered/makeGeometryIndexed.js";
38
36
  import { DirectionalLight } from "../../render/forward_plus/model/DirectionalLight.js";
39
- import { kelvin_to_rgb } from "../../../../core/color/kelvin/kelvin_to_rgb.js";
40
- import { number_pretty_print } from "../../../../core/primitives/numbers/number_pretty_print.js";
37
+ import { sampler2d_scale } from "../../texture/sampler/resize/sampler2d_scale.js";
38
+ import { Sampler2D } from "../../texture/sampler/Sampler2D.js";
39
+ import sampler2D2Canvas from "../../texture/sampler/Sampler2D2Canvas.js";
40
+ import { PathTracer } from "./PathTracer.js";
41
41
 
42
42
  document.body.style.margin = 0;
43
43
  document.body.style.overflow = "hidden";
@@ -569,20 +569,11 @@ async function start_renderer(camera) {
569
569
  const t = make_render_task();
570
570
 
571
571
 
572
- const vProgress = new TaskProgressView({
572
+ const vProgress =makeSimpleTaskProgressView({
573
573
  task: t,
574
+ size:vContainer.size,
574
575
  localization: loc
575
- });
576
-
577
- vProgress.size.set(vContainer.size.x, vContainer.size.y);
578
- vProgress.css({
579
- position: 'absolute',
580
- top: 0,
581
- left: 0,
582
- pointerEvents: "none"
583
- });
584
- vProgress.el.querySelector('.fill').style.background = 'rgb(255,220,94)';
585
- vProgress.el.querySelector('.progress-bar').style.height = '8px';
576
+ })
586
577
 
587
578
  vContainer.addChild(vProgress);
588
579
 
@@ -1,10 +1,3 @@
1
- import { EngineHarness } from "../../EngineHarness.js";
2
- import { seededRandom } from "../../../core/math/random/seededRandom.js";
3
- import { ShadedGeometrySystem } from "../ecs/mesh-v2/ShadedGeometrySystem.js";
4
- import { GizmoRenderingPlugin } from "../render/gizmo/GizmoRenderingPlugin.js";
5
- import { LightProbeVolume } from "./LightProbeVolume.js";
6
- import Entity from "../../ecs/Entity.js";
7
- import { ShadedGeometry } from "../ecs/mesh-v2/ShadedGeometry.js";
8
1
  import {
9
2
  ClampToEdgeWrapping,
10
3
  DataTexture,
@@ -15,23 +8,38 @@ import {
15
8
  RGBAFormat,
16
9
  UnsignedByteType
17
10
  } from "three";
18
- import { Transform } from "../../ecs/transform/Transform.js";
19
- import Vector3 from "../../../core/geom/Vector3.js";
11
+ import '../../../../../../../css/game.scss';
20
12
  import { BinaryBuffer } from "../../../core/binary/BinaryBuffer.js";
21
- import { is_typed_array_equals } from "../../../core/collection/array/typed/is_typed_array_equals.js";
22
13
  import { array_copy } from "../../../core/collection/array/array_copy.js";
14
+ import { is_typed_array_equals } from "../../../core/collection/array/typed/is_typed_array_equals.js";
15
+ import { AABB3 } from "../../../core/geom/3d/aabb/AABB3.js";
16
+ import { make_justified_point_grid } from "../../../core/geom/3d/util/make_justified_point_grid.js";
17
+ import Vector2 from "../../../core/geom/Vector2.js";
18
+ import Vector3 from "../../../core/geom/Vector3.js";
23
19
  import { randomFloatBetween } from "../../../core/math/random/randomFloatBetween.js";
20
+ import { seededRandom } from "../../../core/math/random/seededRandom.js";
21
+ import { delay } from "../../../core/process/delay.js";
24
22
  import { GLTFAssetLoader } from "../../asset/loaders/GLTFAssetLoader.js";
25
- import { three_object_to_entity_composition } from "../ecs/mesh-v2/three_object_to_entity_composition.js";
23
+ import Entity from "../../ecs/Entity.js";
24
+ import GUIElement from "../../ecs/gui/GUIElement.js";
25
+ import GUIElementSystem from "../../ecs/gui/GUIElementSystem.js";
26
+ import ViewportPosition from "../../ecs/gui/position/ViewportPosition.js";
27
+ import ViewportPositionSystem from "../../ecs/gui/position/ViewportPositionSystem.js";
26
28
  import { TransformAttachmentSystem } from "../../ecs/transform-attachment/TransformAttachmentSystem.js";
27
- import { ShadedGeometryFlags } from "../ecs/mesh-v2/ShadedGeometryFlags.js";
28
- import { AABB3 } from "../../../core/geom/3d/aabb/AABB3.js";
29
- import { delay } from "../../../core/process/delay.js";
30
- import { make_justified_point_grid } from "../../../core/geom/3d/util/make_justified_point_grid.js";
31
- import LightSystem from "../ecs/light/LightSystem.js";
29
+ import { Transform } from "../../ecs/transform/Transform.js";
30
+ import { EngineHarness } from "../../EngineHarness.js";
31
+ import { makeSimpleTaskProgressView } from "../../makeSimpleTaskProgressView.js";
32
32
  import { Light } from "../ecs/light/Light.js";
33
+ import LightSystem from "../ecs/light/LightSystem.js";
33
34
  import { LightType } from "../ecs/light/LightType.js";
34
- import { load_and_set_cubemap_v0 } from "../load_and_set_cubemap_v0.js";
35
+ import { SGMesh } from "../ecs/mesh-v2/aggregate/SGMesh.js";
36
+ import { SGMeshSystem } from "../ecs/mesh-v2/aggregate/SGMeshSystem.js";
37
+ import { ShadedGeometry } from "../ecs/mesh-v2/ShadedGeometry.js";
38
+ import { ShadedGeometryFlags } from "../ecs/mesh-v2/ShadedGeometryFlags.js";
39
+ import { ShadedGeometrySystem } from "../ecs/mesh-v2/ShadedGeometrySystem.js";
40
+ import { three_object_to_entity_composition } from "../ecs/mesh-v2/three_object_to_entity_composition.js";
41
+ import { GizmoRenderingPlugin } from "../render/gizmo/GizmoRenderingPlugin.js";
42
+ import { LightProbeVolume } from "./LightProbeVolume.js";
35
43
 
36
44
  /**
37
45
  *
@@ -174,6 +182,118 @@ function make_test_texture(t = 1) {
174
182
  return tex;
175
183
  }
176
184
 
185
+ /**
186
+ *
187
+ * @param {Engine} engine
188
+ * @param {EntityComponentDataset} ecd
189
+ * @param {AABB3} bounds
190
+ */
191
+ async function build_probes(engine, ecd, bounds) {
192
+
193
+ const lpv = new LightProbeVolume();
194
+
195
+ // lpv.add_point(10, 5, 10);
196
+
197
+ const desired_density = 10;
198
+
199
+
200
+ // const light_volume_bounds = new AABB3(-10, 0.5, -10, 10, 11, 10);
201
+ const probe_grid_spacing_dense = Math.min(bounds.getExtentsX(), bounds.getExtentsY(), bounds.getExtentsZ()) / desired_density;
202
+ const probe_grid_spacing_sparse = Math.max(bounds.getExtentsX(), bounds.getExtentsY(), bounds.getExtentsZ()) / desired_density;
203
+
204
+ const probe_grid_spacing = (probe_grid_spacing_sparse / probe_grid_spacing_dense) < 2 ? probe_grid_spacing_dense : probe_grid_spacing_sparse * 0.5;
205
+ //
206
+ // const probe_grid_spacing =desired_density/ (mesh_asset.boundingBox.getExtentsX()* mesh_asset.boundingBox.getExtentsY()* mesh_asset.boundingBox.getExtentsZ());
207
+
208
+ const model_bounds = new AABB3(-10, 0.5, -10, 10, 11, 10);
209
+ model_bounds.copy(bounds);
210
+ // model_bounds._translate(composition.transform.position.x, composition.transform.position.y, composition.transform.position.z);
211
+ model_bounds.grow(probe_grid_spacing * 1.1);
212
+
213
+
214
+ // sg_hierarchy_compute_bounding_box_via_parent_entity(light_volume_bounds, composition.entity.entity, ecd);
215
+
216
+ // for (let i = 0; i < 100; i++) {
217
+ // lpv.add_point(
218
+ // randomFloatBetween(random, light_volume_bounds.x0, light_volume_bounds.x1),
219
+ // randomFloatBetween(random, light_volume_bounds.y0, light_volume_bounds.y1),
220
+ // randomFloatBetween(random, light_volume_bounds.z0, light_volume_bounds.z1),
221
+ // );
222
+ // }
223
+
224
+ make_justified_point_grid(model_bounds, probe_grid_spacing, (x, y, z) => {
225
+ lpv.add_point(x, y, z);
226
+ });
227
+
228
+ // lpv.add_point(10, 1, -10);
229
+
230
+ await delay(2000);
231
+
232
+ //
233
+ // console.profile('lpv build');
234
+ //
235
+ const task = lpv.build(engine);
236
+ // console.profileEnd('lpv build');
237
+
238
+ const progress = makeSimpleTaskProgressView({
239
+ task,
240
+ localization: engine.localization,
241
+ size: new Vector2(512, 64)
242
+ });
243
+
244
+ const progress_entity = new Entity();
245
+ progress_entity
246
+ .add(GUIElement.fromView(progress))
247
+ .add(ViewportPosition.fromJSON({
248
+ position: new Vector2(0, 1),
249
+ anchor: new Vector2(0, 1),
250
+ offset: new Vector2(16, -16)
251
+ }))
252
+ .build(ecd);
253
+
254
+ task.promise().finally(() => progress_entity.destroy())
255
+
256
+ engine.executor.runGroup(task);
257
+
258
+ // fill probes with random data
259
+ // for (let i = 0; i < lpv.__length * 27; i++) {
260
+ // lpv.__probe_data[i] = random();
261
+ // }
262
+
263
+ // for (let i = 0; i < lpv.__length; i++) {
264
+ //
265
+ // for (let j = 0; j < 9; j++) {
266
+ // lpv.__probe_data[(i * 9 + j) * 3] = max2(0, (lpv.__positions[i * 3] + 10) / 20);
267
+ // lpv.__probe_data[(i * 9 + j) * 3 + 1] = max2(0, (lpv.__positions[i * 3 + 1] - 0.5) / 10.5);
268
+ // lpv.__probe_data[(i * 9 + j) * 3 + 2] = max2(0, (lpv.__positions[i * 3 + 2] + 10) / 20);
269
+ // }
270
+ // }
271
+
272
+ // lpv.white_probe(0, [
273
+ // 0.7953949, 0.4405923, 0.5459412,
274
+ // 0.3981450, 0.3526911, 0.6097158,
275
+ // -0.3424573, -0.1838151, -0.2715583,
276
+ //
277
+ // -0.2944621, -0.0560606, 0.0095193,
278
+ // -0.1123051, -0.0513088, -0.1232869,
279
+ // -0.2645007, -0.2257996, -0.4785847,
280
+ //
281
+ // -0.1569444, -0.0954703, -0.1485053,
282
+ // 0.5646247, 0.2161586, 0.1402643,
283
+ // 0.2137442, -0.0547578, -0.3061700], 0);
284
+
285
+
286
+ // lpv.visualize_mesh({ ecd: ecd });
287
+
288
+ task.promise().then(() => {
289
+
290
+ lpv.visualize_probes({ ecd: ecd, size: probe_grid_spacing * 0.08 });
291
+
292
+ })
293
+
294
+ console.log(lpv);
295
+ }
296
+
177
297
  /**
178
298
  *
179
299
  * @param {Engine} engine
@@ -184,30 +304,41 @@ async function main(engine) {
184
304
  engine,
185
305
  enableWater: false,
186
306
  enableTerrain: false,
187
- enableLights: false,
188
- // enableLights: true,
307
+ // enableLights: false,
308
+ enableLights: true,
189
309
  cameraFarDistance: 200,
190
310
  focus: { x: 0, y: 0, z: 0 },
191
311
  pitch: 1,
192
312
  yaw: -1.54,
193
313
  distance: 54,
194
- shadowmapResolution: 4096
314
+ // shadowmapResolution: 4096
195
315
  });
196
- load_and_set_cubemap_v0(engine.graphics, 'data/textures/cubemaps/hip_miramar/32/', '.png');
316
+
317
+ engine.graphics.getRenderer().setClearColor('#1e3441', 1);
318
+
319
+ // load_and_set_cubemap_v0(engine.graphics, 'data/textures/cubemaps/hip_miramar/32/', '.png');
197
320
 
198
321
  const ecd = engine.entityManager.dataset;
199
322
 
200
323
 
201
324
  // const path = 'data/models/LowPolyTownshipSet/Small_house/Small_house.gltf';
202
- const path = 'data/models/sibenik/model.gltf';
325
+ // const path = 'data/models/sibenik/2/model.gltf';
326
+ const path = 'data/models/vokselia_spawn/model.gltf';
203
327
  // const path = 'data/models/sponza-pbr/gltf/sponza.glb';
204
328
  // const path = 'data/models/LowPolyTownshipSet/Town_Hall/model.gltf';
205
329
  // const path = 'data/models/Slaughter Mech/Slaugter Mech.gltf';
206
330
 
207
- const mesh_asset = await engine.assetManager.promise(path, 'gltf');
331
+ const mesh_asset = await engine.assetManager.promise(path, 'model/gltf+json');
208
332
  const gltf = mesh_asset.gltf;
209
333
 
210
334
 
335
+ const mesh_entity = new Entity();
336
+ mesh_entity
337
+ .add(new Transform())
338
+ .add(SGMesh.fromURL(path))
339
+ ;
340
+
341
+
211
342
  const composition = three_object_to_entity_composition(gltf.scene);
212
343
 
213
344
  composition.traverse(n => {
@@ -241,7 +372,7 @@ async function main(engine) {
241
372
  // })
242
373
 
243
374
  composition.transform.scale.setScalar(1);
244
- composition.transform.position.set(0, -mesh_asset.boundingBox.y0, 0);
375
+ // composition.transform.position.set(0, -mesh_asset.boundingBox.y0, 0);
245
376
 
246
377
  composition.build(ecd);
247
378
 
@@ -318,7 +449,7 @@ async function main(engine) {
318
449
 
319
450
  const random = seededRandom();
320
451
 
321
- for (let i = 0; i < 16; i++) {
452
+ for (let i = 0; i < 0; i++) {
322
453
 
323
454
  new Entity()
324
455
  .add(Transform.fromJSON({
@@ -337,84 +468,16 @@ async function main(engine) {
337
468
  .build(ecd);
338
469
  }
339
470
 
471
+ function build() {
340
472
 
341
- const lpv = new LightProbeVolume();
342
-
343
- // lpv.add_point(10, 5, 10);
344
-
345
- const desired_density = 10;
346
-
347
-
348
- // const light_volume_bounds = new AABB3(-10, 0.5, -10, 10, 11, 10);
349
- const probe_grid_spacing_dense = Math.min(mesh_asset.boundingBox.getExtentsX(), mesh_asset.boundingBox.getExtentsY(), mesh_asset.boundingBox.getExtentsZ()) / desired_density;
350
- const probe_grid_spacing_sparse = Math.max(mesh_asset.boundingBox.getExtentsX(), mesh_asset.boundingBox.getExtentsY(), mesh_asset.boundingBox.getExtentsZ()) / desired_density;
351
-
352
- const probe_grid_spacing = (probe_grid_spacing_sparse / probe_grid_spacing_dense) < 2 ? probe_grid_spacing_dense : probe_grid_spacing_sparse * 0.5;
353
- //
354
- // const probe_grid_spacing =desired_density/ (mesh_asset.boundingBox.getExtentsX()* mesh_asset.boundingBox.getExtentsY()* mesh_asset.boundingBox.getExtentsZ());
355
-
356
- const model_bounds = new AABB3(-10, 0.5, -10, 10, 11, 10);
357
- model_bounds.copy(mesh_asset.boundingBox);
358
- model_bounds.grow(probe_grid_spacing * 1.1);
359
-
360
-
361
- // sg_hierarchy_compute_bounding_box_via_parent_entity(light_volume_bounds, composition.entity.entity, ecd);
362
-
363
- // for (let i = 0; i < 100; i++) {
364
- // lpv.add_point(
365
- // randomFloatBetween(random, light_volume_bounds.x0, light_volume_bounds.x1),
366
- // randomFloatBetween(random, light_volume_bounds.y0, light_volume_bounds.y1),
367
- // randomFloatBetween(random, light_volume_bounds.z0, light_volume_bounds.z1),
368
- // );
369
- // }
370
-
371
- make_justified_point_grid(model_bounds, probe_grid_spacing, (x, y, z) => {
372
- lpv.add_point(x, y, z);
373
- });
374
-
375
- // lpv.add_point(10, 1, -10);
376
-
377
- await delay(2000);
378
-
379
- //
380
- // console.profile('lpv build');
381
- //
382
- lpv.build(engine);
383
- // console.profileEnd('lpv build');
384
-
385
- // fill probes with random data
386
- // for (let i = 0; i < lpv.__length * 27; i++) {
387
- // lpv.__probe_data[i] = random();
388
- // }
473
+ build_probes(engine, ecd, mesh_asset.boundingBox);
474
+ }
389
475
 
390
- // for (let i = 0; i < lpv.__length; i++) {
391
- //
392
- // for (let j = 0; j < 9; j++) {
393
- // lpv.__probe_data[(i * 9 + j) * 3] = max2(0, (lpv.__positions[i * 3] + 10) / 20);
394
- // lpv.__probe_data[(i * 9 + j) * 3 + 1] = max2(0, (lpv.__positions[i * 3 + 1] - 0.5) / 10.5);
395
- // lpv.__probe_data[(i * 9 + j) * 3 + 2] = max2(0, (lpv.__positions[i * 3 + 2] + 10) / 20);
396
- // }
397
- // }
476
+ build();
398
477
 
399
- // lpv.white_probe(0, [
400
- // 0.7953949, 0.4405923, 0.5459412,
401
- // 0.3981450, 0.3526911, 0.6097158,
402
- // -0.3424573, -0.1838151, -0.2715583,
403
- //
404
- // -0.2944621, -0.0560606, 0.0095193,
405
- // -0.1123051, -0.0513088, -0.1232869,
406
- // -0.2645007, -0.2257996, -0.4785847,
478
+ // mesh_entity.addEventListener(SGMeshEvents.AssetLoaded, build);
407
479
  //
408
- // -0.1569444, -0.0954703, -0.1485053,
409
- // 0.5646247, 0.2161586, 0.1402643,
410
- // 0.2137442, -0.0547578, -0.3061700], 0);
411
-
412
-
413
- // lpv.visualize_mesh({ ecd: ecd });
414
- lpv.visualize_probes({ ecd: ecd, size: probe_grid_spacing * 0.08 });
415
-
416
-
417
- console.log(lpv);
480
+ // mesh_entity.build(ecd);
418
481
  }
419
482
 
420
483
  new EngineHarness().initialize({
@@ -424,8 +487,11 @@ new EngineHarness().initialize({
424
487
  config.addSystem(new LightSystem(engine, {
425
488
  shadowResolution: 2048
426
489
  }));
490
+ config.addSystem(new SGMeshSystem(engine));
491
+ config.addSystem(new GUIElementSystem(engine.gui.view, engine));
492
+ config.addSystem(new ViewportPositionSystem(engine.gui.view.size));
427
493
 
428
- config.addLoader('gltf', new GLTFAssetLoader());
494
+ config.addLoader('model/gltf+json', new GLTFAssetLoader());
429
495
 
430
496
  config.addPlugin(GizmoRenderingPlugin);
431
497
  }
@@ -0,0 +1,19 @@
1
+ import { DataTexture, UnsignedByteType } from "three";
2
+
3
+ /**
4
+ *
5
+ * @param {ArrayLike<number>|Uint8Array} contents
6
+ * @param {Signal} cleanup_signal can be called to dispose of the texture
7
+ * @returns {DataTexture}
8
+ */
9
+ export function makeOnePixelTexture(contents, cleanup_signal) {
10
+ const t = new DataTexture(new Uint8Array(contents), 1, 1);
11
+
12
+ t.generateMipmaps = false;
13
+ t.needsUpdate = true;
14
+ t.type = UnsignedByteType;
15
+
16
+ cleanup_signal.addOne(t.dispose, t);
17
+
18
+ return t;
19
+ }
@@ -11,14 +11,12 @@ import GUIElementSystem from "../../../ecs/gui/GUIElementSystem.js";
11
11
  import ViewportPosition from "../../../ecs/gui/position/ViewportPosition.js";
12
12
  import ViewportPositionSystem from "../../../ecs/gui/position/ViewportPositionSystem.js";
13
13
  import { EngineHarness } from "../../../EngineHarness.js";
14
+ import { canvas2d_draw_path } from "../../canvas/canvas2d_draw_path.js";
14
15
  import { Sampler2D } from "../sampler/Sampler2D.js";
15
16
  import sampler2D2Canvas from "../sampler/Sampler2D2Canvas.js";
16
17
  import { make_edge_condition_channel_threshold } from "../sampler/search/make_edge_condition_channel_threshold.js";
17
18
  import { sampler2d_find_pixels } from "../sampler/search/sampler2d_find_pixels.js";
18
19
 
19
- const edge_condition_alpha0 = make_edge_condition_channel_threshold(3, 0);
20
-
21
-
22
20
  function sampler_as_view(sampler) {
23
21
 
24
22
  const vSpriteSource = new CanvasView();
@@ -33,67 +31,6 @@ function sampler_as_view(sampler) {
33
31
  return vSpriteSource;
34
32
  }
35
33
 
36
- /**
37
- *
38
- * @param {number[]} vertices
39
- * @param {CanvasRenderingContext2D} ctx
40
- * @param [fillColor]
41
- * @param [strokeColor]
42
- * @param [highlight_vertices]
43
- * @param [vertex_draw_size]
44
- * @param {number} [offset] in pixels
45
- */
46
- function drawPath({
47
- vertices,
48
- ctx,
49
- fillColor = 'transparent',
50
- strokeColor = 'red',
51
- highlight_vertices = true,
52
- vertex_draw_size = 8,
53
- offset = [0, 0]
54
- }) {
55
-
56
- function draw_point(x, y) {
57
- ctx.fillStyle = 'rgba(255,255,255,0.8)';
58
- ctx.strokeStyle = 'black';
59
- ctx.lineWidth = "1px";
60
-
61
- const x1 = x - vertex_draw_size / 2 + offset[0];
62
- const y1 = y - vertex_draw_size / 2 + offset[1];
63
-
64
- ctx.fillRect(x1, y1, vertex_draw_size, vertex_draw_size);
65
-
66
- ctx.strokeRect(x1, y1, vertex_draw_size, vertex_draw_size);
67
- }
68
-
69
- if (highlight_vertices) {
70
- for (let i = 0; i < vertices.length / 2; i++) {
71
- draw_point(vertices[i * 2], vertices[i * 2 + 1]);
72
- }
73
- }
74
-
75
- ctx.fillStyle = fillColor;
76
- ctx.strokeStyle = strokeColor;
77
- ctx.lineWidth = "1px";
78
-
79
- ctx.beginPath();
80
-
81
- ctx.moveTo(vertices[0] + offset[0], vertices[1] + offset[1]);
82
- // drawPoint(jarvis_vertices[0].x, jarvis_vertices[0].y, jarvis_vertices[0].z, 'red');
83
-
84
- for (let i = 1; i < vertices.length / 2; i++) {
85
-
86
- ctx.lineTo(vertices[i * 2] + offset[0], vertices[i * 2 + 1] + offset[1]);
87
-
88
- // drawPoint(last.x, last.y, last.z, 'red');
89
- }
90
-
91
- ctx.closePath();
92
- ctx.stroke();
93
- ctx.fill();
94
-
95
- }
96
-
97
34
  /**
98
35
  *
99
36
  * @param {Engine} engine
@@ -104,10 +41,10 @@ async function main(engine) {
104
41
  // const path = "data/textures/particle/UETools/Bones_01.png";
105
42
  // const path = "data/textures/particle/UETools/x64/Bones_01.png";
106
43
  // const path = "data/textures/particle/KriptoFX/x256/SmokeTile2.png";
107
- const path = "data/textures/particle/KriptoFX/CloudMask.png";
44
+ // const path = "data/textures/particle/KriptoFX/CloudMask.png";
108
45
  // const path = "data/textures/particle/travnik/arrow_2_64.png";
109
46
  // const path = "data/textures/particle/travnik/leaf_01.png";
110
- // const path = "data/textures/particle/travnik/portal_2_blue_64.png";
47
+ const path = "data/textures/particle/travnik/portal_2_blue_64.png";
111
48
  // const path = "data/textures/particle/travnik/flake.png";
112
49
 
113
50
  const asset = await engine.assetManager.promise(path, 'image')
@@ -147,7 +84,7 @@ async function main(engine) {
147
84
  // we make it a bit larger to fit markers drawn at the edges of the image
148
85
  vHull.size.set(sampler.width + 32, sampler.height + 32);
149
86
 
150
- drawPath({
87
+ canvas2d_draw_path({
151
88
  vertices: convex_hull_vertices,
152
89
  ctx: vHull.context2d,
153
90
  offset: [16, 16]
@@ -184,7 +121,7 @@ async function main(engine) {
184
121
 
185
122
  vOptimalPoly.size.set(sampler.width + 100, sampler.height + 100);
186
123
 
187
- drawPath({
124
+ canvas2d_draw_path({
188
125
  vertices: optimal_poly,
189
126
  ctx: vOptimalPoly.context2d,
190
127
  strokeColor: '#30c0ff',
@@ -159,7 +159,7 @@ export class VirtualTexturePage {
159
159
  texture.minFilter = NearestFilter;
160
160
  texture.magFilter = LinearFilter;
161
161
  // texture.magFilter = NearestFilter;
162
- texture.anisotropy = this.#tile_margin;
162
+ texture.anisotropy = this.#tile_margin*2;
163
163
 
164
164
  this.#tile_copy_texture.wrapT = ClampToEdgeWrapping;
165
165
  this.#tile_copy_texture.wrapS = ClampToEdgeWrapping;
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Created by Alex on 29/01/2015.
3
3
  */
4
- import Vector2 from "../../../core/geom/Vector2.js";
4
+ import { assert } from "../../../core/assert.js";
5
5
  import Signal from "../../../core/events/signal/Signal.js";
6
+ import Vector2 from "../../../core/geom/Vector2.js";
6
7
  import Vector3 from "../../../core/geom/Vector3.js";
7
- import { assert } from "../../../core/assert.js";
8
+ import { sign } from "../../../core/math/sign.js";
8
9
  import { MouseEvents } from "./events/MouseEvents.js";
9
10
  import { TouchEvents } from "./events/TouchEvents.js";
10
- import { sign } from "../../../core/math/sign.js";
11
11
  import { InputDeviceSwitch } from "./InputDeviceSwitch.js";
12
12
 
13
13
  /**
@@ -353,6 +353,9 @@ export class PointerDevice {
353
353
  down: new Signal(),
354
354
  up: new Signal(),
355
355
  move: new Signal(),
356
+ /**
357
+ * @type {Signal<Vector2, (MouseEvent|TouchEvent)>}
358
+ */
356
359
  tap: new Signal(),
357
360
  drag: new Signal(),
358
361
  dragStart: new Signal(),
@@ -0,0 +1,33 @@
1
+ import Vector2 from "../core/geom/Vector2.js";
2
+ import TaskProgressView from "../view/task/TaskProgressView.js";
3
+
4
+ /**
5
+ *
6
+ * @param {Task|TaskGroup} task
7
+ * @param {Localization} localization
8
+ * @param {Vector2} [size]
9
+ * @returns {TaskProgressView}
10
+ */
11
+ export function makeSimpleTaskProgressView({
12
+ task,
13
+ localization,
14
+ size = new Vector2(256, 32)
15
+ }) {
16
+
17
+ const vProgress = new TaskProgressView({
18
+ task,
19
+ localization
20
+ });
21
+
22
+ vProgress.size.copy(size);
23
+ vProgress.css({
24
+ position: 'absolute',
25
+ top: 0,
26
+ left: 0,
27
+ pointerEvents: "none"
28
+ });
29
+ vProgress.el.querySelector('.fill').style.background = 'rgb(255,220,94)';
30
+ vProgress.el.querySelector('.progress-bar').style.height = '8px';
31
+
32
+ return vProgress;
33
+ }