@woosh/meep-engine 2.119.38 → 2.119.40
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.
- package/package.json +1 -1
- package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.d.ts.map +1 -1
- package/src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js +46 -26
- package/src/engine/graphics/geometry/buffered/query/query_bvh_geometry_nearest.d.ts.map +1 -1
- package/src/engine/graphics/geometry/buffered/query/query_bvh_geometry_nearest.js +16 -12
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computeTriangleClosestPointToPointBarycentric.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,sEAhBW,MAAM,EAAE,iBACR,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,IAAI,
|
|
1
|
+
{"version":3,"file":"computeTriangleClosestPointToPointBarycentric.d.ts","sourceRoot":"","sources":["../../../../../../src/core/geom/3d/triangle/computeTriangleClosestPointToPointBarycentric.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,sEAhBW,MAAM,EAAE,iBACR,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,GACJ,IAAI,CAoJhB"}
|
|
@@ -24,7 +24,8 @@ export function computeTriangleClosestPointToPointBarycentric(
|
|
|
24
24
|
ax, ay, az,
|
|
25
25
|
bx, by, bz,
|
|
26
26
|
cx, cy, cz
|
|
27
|
-
){
|
|
27
|
+
) {
|
|
28
|
+
// adapted from https://github.com/mrdoob/three.js/blob/676e85dc7cd5971a6565c4152e9e6d8bdd20a2b7/src/math/Triangle.js#L222
|
|
28
29
|
|
|
29
30
|
let v, w;
|
|
30
31
|
|
|
@@ -47,15 +48,15 @@ export function computeTriangleClosestPointToPointBarycentric(
|
|
|
47
48
|
const _vap_y = py - ay;
|
|
48
49
|
const _vap_z = pz - az;
|
|
49
50
|
|
|
50
|
-
const d1 = v3_dot(_vab_x, _vab_y, _vab_z,
|
|
51
|
-
const d2 = v3_dot(_vac_x, _vac_y, _vac_z,
|
|
51
|
+
const d1 = v3_dot(_vab_x, _vab_y, _vab_z, _vap_x, _vap_y, _vap_z);
|
|
52
|
+
const d2 = v3_dot(_vac_x, _vac_y, _vac_z, _vap_x, _vap_y, _vap_z);
|
|
52
53
|
|
|
53
|
-
if (
|
|
54
|
+
if (d1 <= 0 && d2 <= 0) {
|
|
54
55
|
|
|
55
56
|
// vertex region of A; barycentric coords (1, 0, 0)
|
|
56
57
|
|
|
57
58
|
result[result_offset] = 1;
|
|
58
|
-
result[result_offset+1] = 0;
|
|
59
|
+
result[result_offset + 1] = 0;
|
|
59
60
|
|
|
60
61
|
return;
|
|
61
62
|
|
|
@@ -65,28 +66,34 @@ export function computeTriangleClosestPointToPointBarycentric(
|
|
|
65
66
|
const _vbp_y = py - by;
|
|
66
67
|
const _vbp_z = pz - bz;
|
|
67
68
|
|
|
68
|
-
const d3 = v3_dot(_vab_x, _vab_y, _vab_z,
|
|
69
|
-
const d4 = v3_dot(_vac_x, _vac_y, _vac_z,
|
|
69
|
+
const d3 = v3_dot(_vab_x, _vab_y, _vab_z, _vbp_x, _vbp_y, _vbp_z);
|
|
70
|
+
const d4 = v3_dot(_vac_x, _vac_y, _vac_z, _vbp_x, _vbp_y, _vbp_z);
|
|
70
71
|
|
|
71
|
-
if (
|
|
72
|
+
if (d3 >= 0 && d4 <= d3) {
|
|
72
73
|
|
|
73
74
|
// vertex region of B; barycentric coords (0, 1, 0)
|
|
74
75
|
|
|
75
76
|
result[result_offset] = 0;
|
|
76
|
-
result[result_offset+1] = 1;
|
|
77
|
+
result[result_offset + 1] = 1;
|
|
77
78
|
|
|
78
79
|
return;
|
|
79
80
|
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
const vc = d1 * d4 - d3 * d2;
|
|
83
|
-
if (
|
|
84
|
+
if (vc <= 0 && d1 >= 0 && d3 <= 0) {
|
|
84
85
|
|
|
85
|
-
|
|
86
|
+
const s = d1 - d3;
|
|
87
|
+
|
|
88
|
+
if (s !== 0) {
|
|
89
|
+
v = d1 / s;
|
|
90
|
+
} else {
|
|
91
|
+
v = 0;
|
|
92
|
+
}
|
|
86
93
|
// edge region of AB; barycentric coords (1-v, v, 0)
|
|
87
94
|
|
|
88
|
-
result[result_offset] = 1-v;
|
|
89
|
-
result[result_offset+1] = v;
|
|
95
|
+
result[result_offset] = 1 - v;
|
|
96
|
+
result[result_offset + 1] = v;
|
|
90
97
|
|
|
91
98
|
return;
|
|
92
99
|
|
|
@@ -96,52 +103,65 @@ export function computeTriangleClosestPointToPointBarycentric(
|
|
|
96
103
|
const _vcp_y = py - cy;
|
|
97
104
|
const _vcp_z = pz - cz;
|
|
98
105
|
|
|
99
|
-
const d5 = v3_dot(_vab_x, _vab_y, _vab_z,
|
|
100
|
-
const d6 = v3_dot(_vac_x, _vac_y, _vac_z,
|
|
106
|
+
const d5 = v3_dot(_vab_x, _vab_y, _vab_z, _vcp_x, _vcp_y, _vcp_z);
|
|
107
|
+
const d6 = v3_dot(_vac_x, _vac_y, _vac_z, _vcp_x, _vcp_y, _vcp_z);
|
|
101
108
|
|
|
102
|
-
if (
|
|
109
|
+
if (d6 >= 0 && d5 <= d6) {
|
|
103
110
|
|
|
104
111
|
// vertex region of C; barycentric coords (0, 0, 1)
|
|
105
112
|
|
|
106
113
|
result[result_offset] = 0;
|
|
107
|
-
result[result_offset+1] = 0;
|
|
114
|
+
result[result_offset + 1] = 0;
|
|
108
115
|
|
|
109
116
|
return;
|
|
110
117
|
|
|
111
118
|
}
|
|
112
119
|
|
|
113
120
|
const vb = d5 * d2 - d1 * d6;
|
|
114
|
-
if (
|
|
121
|
+
if (vb <= 0 && d2 >= 0 && d6 <= 0) {
|
|
122
|
+
|
|
123
|
+
const s = d2 - d6;
|
|
115
124
|
|
|
116
|
-
|
|
125
|
+
if (s !== 0) {
|
|
126
|
+
w = d2 / s;
|
|
127
|
+
} else {
|
|
128
|
+
w = 0;
|
|
129
|
+
}
|
|
117
130
|
|
|
118
131
|
// edge region of AC; barycentric coords (1-w, 0, w)
|
|
119
132
|
|
|
120
|
-
result[result_offset] = 1-w;
|
|
121
|
-
result[result_offset+1] = 0;
|
|
133
|
+
result[result_offset] = 1 - w;
|
|
134
|
+
result[result_offset + 1] = 0;
|
|
122
135
|
|
|
123
136
|
return;
|
|
124
137
|
|
|
125
138
|
}
|
|
126
139
|
|
|
127
140
|
const va = d3 * d6 - d5 * d4;
|
|
128
|
-
if (
|
|
141
|
+
if (va <= 0 && (d4 - d3) >= 0 && (d5 - d6) >= 0) {
|
|
142
|
+
|
|
143
|
+
const s = (d4 - d3) + (d5 - d6);
|
|
144
|
+
|
|
145
|
+
if(s !== 0) {
|
|
146
|
+
w = (d4 - d3) / s;
|
|
147
|
+
}else{
|
|
148
|
+
w = 1;
|
|
149
|
+
}
|
|
129
150
|
|
|
130
|
-
w = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );
|
|
131
151
|
// edge region of BC; barycentric coords (0, 1-w, w)
|
|
132
152
|
|
|
133
153
|
result[result_offset] = 0;
|
|
134
|
-
result[result_offset+1] = 1-w;
|
|
154
|
+
result[result_offset + 1] = 1 - w;
|
|
135
155
|
|
|
136
156
|
return;
|
|
137
157
|
|
|
138
158
|
}
|
|
139
159
|
|
|
140
160
|
// face region
|
|
141
|
-
const denom = 1 / (
|
|
161
|
+
const denom = 1 / (va + vb + vc);
|
|
142
162
|
const u = va * denom
|
|
143
163
|
v = vb * denom;
|
|
144
164
|
|
|
145
165
|
result[result_offset] = u;
|
|
146
|
-
result[result_offset+1] = v;
|
|
166
|
+
result[result_offset + 1] = v;
|
|
147
167
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query_bvh_geometry_nearest.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/geometry/buffered/query/query_bvh_geometry_nearest.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;GAWG;AACH,uFARW,MAAM,EAAE,GAAC,YAAY,WACrB,MAAM,EAAE,GAAC,WAAW,GAAC,WAAW,KAChC,MAAM,KACN,MAAM,KACN,MAAM,gBACN,MAAM,GACL,OAAO,
|
|
1
|
+
{"version":3,"file":"query_bvh_geometry_nearest.d.ts","sourceRoot":"","sources":["../../../../../../../src/engine/graphics/geometry/buffered/query/query_bvh_geometry_nearest.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;GAWG;AACH,uFARW,MAAM,EAAE,GAAC,YAAY,WACrB,MAAM,EAAE,GAAC,WAAW,GAAC,WAAW,KAChC,MAAM,KACN,MAAM,KACN,MAAM,gBACN,MAAM,GACL,OAAO,CA8KlB"}
|
|
@@ -115,23 +115,23 @@ export function query_bvh_geometry_nearest(
|
|
|
115
115
|
|
|
116
116
|
if (distance_sqr_to_child1 < distance_sqr_to_child2) {
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
if (distance_sqr_to_child2 < nearest_distance_sqr) {
|
|
119
119
|
stack[pointer++] = child_2;
|
|
120
|
-
|
|
120
|
+
}
|
|
121
121
|
|
|
122
|
-
|
|
122
|
+
if (distance_sqr_to_child1 < nearest_distance_sqr) {
|
|
123
123
|
stack[pointer++] = child_1;
|
|
124
|
-
|
|
124
|
+
}
|
|
125
125
|
|
|
126
126
|
} else {
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
if (distance_sqr_to_child1 < nearest_distance_sqr) {
|
|
129
129
|
stack[pointer++] = child_1;
|
|
130
|
-
|
|
130
|
+
}
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
if (distance_sqr_to_child2 < nearest_distance_sqr) {
|
|
133
133
|
stack[pointer++] = child_2;
|
|
134
|
-
|
|
134
|
+
}
|
|
135
135
|
|
|
136
136
|
}
|
|
137
137
|
|
|
@@ -172,14 +172,18 @@ export function query_bvh_geometry_nearest(
|
|
|
172
172
|
|
|
173
173
|
const u = v3_scratch_0[0];
|
|
174
174
|
const v = v3_scratch_0[1];
|
|
175
|
+
const w = 1 - u - v;
|
|
175
176
|
|
|
176
177
|
// construct edge
|
|
177
178
|
|
|
178
|
-
const contact_x = (bx - ax) *
|
|
179
|
-
const contact_y = (by - ay) *
|
|
180
|
-
const contact_z = (bz - az) *
|
|
179
|
+
const contact_x = (bx - ax) * v + (cx - ax) * w + ax;
|
|
180
|
+
const contact_y = (by - ay) * v + (cy - ay) * w + ay;
|
|
181
|
+
const contact_z = (bz - az) * v + (cz - az) * w + az;
|
|
181
182
|
|
|
182
|
-
const distance_to_triangle_sqr = v3_distance_sqr(
|
|
183
|
+
const distance_to_triangle_sqr = v3_distance_sqr(
|
|
184
|
+
contact_x, contact_y, contact_z,
|
|
185
|
+
x, y, z
|
|
186
|
+
);
|
|
183
187
|
|
|
184
188
|
if (distance_to_triangle_sqr >= nearest_distance_sqr) {
|
|
185
189
|
continue;
|