@woosh/meep-engine 2.43.31 → 2.43.33

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.
@@ -0,0 +1,36 @@
1
+ import { v3_dot } from "../../v3_dot.js";
2
+ import { clamp01 } from "../../../math/clamp01.js";
3
+
4
+ export function line3_compute_nearest_point_to_point(
5
+ result, result_offset,
6
+ ax, ay, az,
7
+ bx, by, bz,
8
+ ref_x, ref_y, ref_z
9
+ ) {
10
+
11
+ const direction_x = bx - ax;
12
+ const direction_y = by - ay;
13
+ const direction_z = bz - az;
14
+
15
+ // find closest point
16
+ const sp0_x = ref_x - ax;
17
+ const sp0_y = ref_y - ay;
18
+ const sp0_z = ref_z - az;
19
+
20
+ //
21
+ const d2 = v3_dot(direction_x, direction_y, direction_z, direction_x, direction_y, direction_z);
22
+ const d3 = v3_dot(direction_x, direction_y, direction_z, sp0_x, sp0_y, sp0_z);
23
+
24
+ const t = d3 / d2;
25
+
26
+ const t_clamped = clamp01(t);
27
+
28
+ // compute point on the line
29
+ const lp_x = direction_x * t_clamped + ax;
30
+ const lp_y = direction_y * t_clamped + ay;
31
+ const lp_z = direction_z * t_clamped + az;
32
+
33
+ result[result_offset + 0] = lp_x;
34
+ result[result_offset + 1] = lp_y;
35
+ result[result_offset + 2] = lp_z;
36
+ }
@@ -37,7 +37,7 @@ export default class Quaternion {
37
37
 
38
38
  decodeFromUint32(uint: number): void
39
39
 
40
- _lookRotation(forward_x: number, forward_y: number, forward_z: number, up_x: number, up_y: number, up_z: number): void;
40
+ _lookRotation(forward_x: number, forward_y: number, forward_z: number, up_x: number, up_y: number, up_z: number): void
41
41
 
42
42
  lookRotation(v3: Vector3Like, up?: Vector3Like): void
43
43
 
@@ -53,6 +53,8 @@ export default class Quaternion {
53
53
 
54
54
  multiplyQuaternions(a: Quaternion, b: Quaternion): void
55
55
 
56
+ angleTo(other: Quaternion): number
57
+
56
58
  toJSON(): any
57
59
 
58
60
  fromJSON(j: any): void
@@ -282,9 +282,9 @@ class Quaternion {
282
282
  }
283
283
 
284
284
  /**
285
- *
285
+ * Returns angle between this orientation and another
286
286
  * @param {Quaternion} other
287
- * @return {number}
287
+ * @return {number} angle in radians
288
288
  */
289
289
  angleTo(other) {
290
290
  //compute inverse
@@ -451,12 +451,22 @@ class Quaternion {
451
451
  this.set(0, 0, 0, 1);
452
452
  } else {
453
453
  const m = 1 / l;
454
- this.multiplyScalar(m, m, m, m);
454
+ this.multiplyScalar(m);
455
455
  }
456
456
  }
457
457
 
458
+ /**
459
+ *
460
+ * @param {number} val
461
+ * @return {Quaternion}
462
+ */
458
463
  multiplyScalar(val) {
459
- return this.set(this.x * val, this.y * val, this.z * val, this.w * val);
464
+ return this.set(
465
+ this.x * val,
466
+ this.y * val,
467
+ this.z * val,
468
+ this.w * val
469
+ );
460
470
  }
461
471
 
462
472
  /**
@@ -0,0 +1,122 @@
1
+ import { DynamicDrawUsage, LineBasicMaterial, LineSegments } from "three";
2
+ import { array_copy } from "../../../core/collection/array/copyArray.js";
3
+ import { BufferGeometry } from "three/src/core/BufferGeometry.js";
4
+ import { Float32BufferAttribute } from "three/src/core/BufferAttribute.js";
5
+
6
+ function buildGeometry(capacity) {
7
+ const geometry = new BufferGeometry();
8
+
9
+ geometry.dynamic = true;
10
+ // no index
11
+
12
+ const attribute_position = new Float32BufferAttribute(capacity * 3 * 2, 3, false);
13
+ const attribute_color = new Float32BufferAttribute(capacity * 4 * 2, 4, false);
14
+
15
+ attribute_position.setUsage(DynamicDrawUsage);
16
+ attribute_color.setUsage(DynamicDrawUsage);
17
+
18
+ geometry.setAttribute('position', attribute_position);
19
+ geometry.setAttribute('color', attribute_color);
20
+
21
+ return geometry;
22
+ }
23
+
24
+ export class Lines {
25
+
26
+ constructor() {
27
+ this.count = 0;
28
+ this.capacity = 64;
29
+
30
+ /**
31
+ *
32
+ * @type {BufferGeometry|null}
33
+ */
34
+ this.geometry = buildGeometry(this.capacity);
35
+
36
+ this.mesh = new LineSegments(this.geometry, new LineBasicMaterial());
37
+
38
+ // disable automatic culling/updates
39
+ this.mesh.matrixAutoUpdate = false;
40
+ this.mesh.frustumCulled = false;
41
+ this.mesh.matrixWorldNeedsUpdate = false;
42
+
43
+ }
44
+
45
+ /**
46
+ *
47
+ * @param {number} x
48
+ */
49
+ setCount(x) {
50
+ this.ensure_capacity(x);
51
+
52
+ this.count = x;
53
+ this.geometry.drawRange.count = x * 6;
54
+ }
55
+
56
+ /**
57
+ *
58
+ * @param {number} x
59
+ */
60
+ ensure_capacity(x) {
61
+ if (this.capacity >= x) {
62
+ // enough capacity
63
+ return;
64
+ }
65
+
66
+ this.capacity = x;
67
+
68
+ this.build();
69
+ }
70
+
71
+ /**
72
+ *
73
+ * @param {vec3} from
74
+ * @param {vec3} to
75
+ * @param {vec4} color
76
+ */
77
+ add_line(from, to, color) {
78
+ const index = this.count;
79
+
80
+ this.setCount(index + 1);
81
+
82
+
83
+ const position_attribute = this.geometry.getAttribute('position');
84
+ const color_attribute = this.geometry.getAttribute('color');
85
+
86
+ const position_array = position_attribute.array;
87
+
88
+ array_copy(from, 0, position_array, index * 6, 3);
89
+ array_copy(to, 0, position_array, index * 6 + 3, 3);
90
+
91
+ const color_array = color_attribute.array;
92
+
93
+ array_copy(color, 0, color_array, index * 8, 4);
94
+ array_copy(color, 0, color_array, index * 8 + 4, 4);
95
+
96
+
97
+ this.geometry.drawRange.count = this.count;
98
+
99
+ //
100
+ position_attribute.needsUpdate = true;
101
+ color_attribute.needsUpdate = true;
102
+
103
+ console.warn('feature not fully implemented');
104
+ }
105
+
106
+ build() {
107
+
108
+ const geometry = buildGeometry(this.capacity);
109
+
110
+ // TODO copy existing attribute values
111
+
112
+ this.geometry = geometry;
113
+
114
+ this.mesh.geometry = geometry;
115
+
116
+ }
117
+
118
+ dispose() {
119
+ this.geometry.dispose();
120
+
121
+ }
122
+ }
@@ -8,6 +8,7 @@ import Quaternion from "../../../../core/geom/Quaternion.js";
8
8
  import { makeHelperBoxGeometry } from "../../../../editor/process/symbolic/makeHelperBoxGeometry.js";
9
9
  import { DrawMode } from "../../ecs/mesh-v2/DrawMode.js";
10
10
  import { makeHelperSphereGeometry } from "../../../../editor/process/symbolic/makeHelperSphereGeometry.js";
11
+ import { Lines } from "../Lines.js";
11
12
 
12
13
  /**
13
14
  *
@@ -55,6 +56,9 @@ export class GizmoShapeRenderingInterface {
55
56
  this.__sphere_wire = InstancedMeshGroup.from(makeHelperSphereGeometry(), new LineBasicMaterial());
56
57
 
57
58
  this.__sphere_wire.draw_mode = DrawMode.Lines;
59
+
60
+ // lines are handles different because they are relatively simple and require 2 archor points
61
+ this.__lines = new Lines();
58
62
  }
59
63
 
60
64
  __get_groups() {
@@ -62,7 +66,8 @@ export class GizmoShapeRenderingInterface {
62
66
  this.__boxes_wire,
63
67
  this.__boxes_solid,
64
68
  this.__sphere_wire,
65
- this.__sphere_solid
69
+ this.__sphere_solid,
70
+ this.__lines
66
71
  ];
67
72
  }
68
73
 
@@ -131,7 +136,7 @@ export class GizmoShapeRenderingInterface {
131
136
  * @param {number[]} to
132
137
  */
133
138
  draw_line(from, to) {
134
- throw new Error('Not Implemented');
139
+ this.__lines.add_line(from, to, this.__color);
135
140
  }
136
141
 
137
142
 
@@ -0,0 +1,29 @@
1
+ import { EngineHarness } from "../../../EngineHarness.js";
2
+ import { GizmoRenderingPlugin } from "./GizmoRenderingPlugin.js";
3
+ import { Gizmo } from "./Gizmo.js";
4
+
5
+ const harness = new EngineHarness();
6
+
7
+ /**
8
+ *
9
+ * @param {Engine} engine
10
+ * @return {Promise<void>}
11
+ */
12
+ async function main(engine) {
13
+ await EngineHarness.buildBasics({
14
+ engine
15
+ });
16
+
17
+
18
+ engine.graphics.on.preRender.add(()=>{
19
+ Gizmo.draw_line([0,0,0],[10,10,10]);
20
+
21
+ Gizmo.draw_wire_sphere([1,1,1],2);
22
+ });
23
+ }
24
+
25
+ harness.initialize({
26
+ configuration(config, engine) {
27
+ config.addPlugin(GizmoRenderingPlugin);
28
+ }
29
+ }).then(main);
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "productName": "Meep",
6
6
  "description": "production-ready JavaScript game engine based on Entity Component System Architecture",
7
7
  "author": "Alexander Goldring",
8
- "version": "2.43.31",
8
+ "version": "2.43.33",
9
9
  "dependencies": {
10
10
  "gl-matrix": "3.4.3",
11
11
  "fast-levenshtein": "2.0.6",