aboutsummaryrefslogtreecommitdiff
path: root/js/helper-classes/3D/StageLine.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/helper-classes/3D/StageLine.js')
-rwxr-xr-xjs/helper-classes/3D/StageLine.js370
1 files changed, 185 insertions, 185 deletions
diff --git a/js/helper-classes/3D/StageLine.js b/js/helper-classes/3D/StageLine.js
index aaa9f95d..b869fb17 100755
--- a/js/helper-classes/3D/StageLine.js
+++ b/js/helper-classes/3D/StageLine.js
@@ -120,7 +120,7 @@ var StageLine = exports.StageLine = Object.create(Object.prototype, {
120 // add the intersection 120 // add the intersection
121 var dot = MathUtils.dot3( pt0, planeEq ) + planeEq[3]; 121 var dot = MathUtils.dot3( pt0, planeEq ) + planeEq[3];
122 var deltaVis = (dot > 0) ? 1 : -1; 122 var deltaVis = (dot > 0) ? 1 : -1;
123// if (plane.isBackFacing()) 123// if (plane.isBackFacing())
124// deltaVis = (dot < 0) ? 1 : -1; 124// deltaVis = (dot < 0) ? 1 : -1;
125 125
126 this.addIntersection( plane, t, deltaVis ); 126 this.addIntersection( plane, t, deltaVis );
@@ -175,14 +175,14 @@ var StageLine = exports.StageLine = Object.create(Object.prototype, {
175 MathUtils.negate( vec ); 175 MathUtils.negate( vec );
176 planeEq = [-vec[1], vec[0], 0]; 176 planeEq = [-vec[1], vec[0], 0];
177 var normal = [planeEq[0], planeEq[1], planeEq[2]]; 177 var normal = [planeEq[0], planeEq[1], planeEq[2]];
178// var d = -planeEq.dot(bPt0); 178// var d = -planeEq.dot(bPt0);
179 var d = -vecUtils.vecDot(3, planeEq, bPt0); 179 var d = -vecUtils.vecDot(3, planeEq, bPt0);
180 planeEq[3] = d; 180 planeEq[3] = d;
181 181
182 t = MathUtils.vecIntersectPlaneForParam( pt0, lineDir, planeEq ); 182 t = MathUtils.vecIntersectPlaneForParam( pt0, lineDir, planeEq );
183 if (t) 183 if (t)
184 { 184 {
185 if ((MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) // the strict vs not-strict inequality comparisons are IMPORTANT! 185 if ((MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) // the strict vs not-strict inequality comparisons are IMPORTANT!
186 { 186 {
187 // get the intersection point 187 // get the intersection point
188 var pt = MathUtils.interpolateLine3D( pt0, pt1, t ); 188 var pt = MathUtils.interpolateLine3D( pt0, pt1, t );
@@ -207,47 +207,47 @@ var StageLine = exports.StageLine = Object.create(Object.prototype, {
207 } 207 }
208 }, 208 },
209 209
210 doCoplanarIntersection: { 210 doCoplanarIntersection: {
211 value: function( plane ) 211 value: function( plane )
212 { 212 {
213 // get the boundary points for the plane 213 // get the boundary points for the plane
214 var boundaryPts = plane.getBoundaryPoints(); 214 var boundaryPts = plane.getBoundaryPoints();
215 var planeEq = plane.getPlaneEq(); 215 var planeEq = plane.getPlaneEq();
216 216
217 if (plane.isBackFacing()) 217 if (plane.isBackFacing())
218 { 218 {
219 var tmp; 219 var tmp;
220 tmp = boundaryPts[0]; boundaryPts[0] = boundaryPts[3]; boundaryPts[3] = tmp; 220 tmp = boundaryPts[0]; boundaryPts[0] = boundaryPts[3]; boundaryPts[3] = tmp;
221 tmp = boundaryPts[1]; boundaryPts[1] = boundaryPts[2]; boundaryPts[2] = tmp; 221 tmp = boundaryPts[1]; boundaryPts[1] = boundaryPts[2]; boundaryPts[2] = tmp;
222 } 222 }
223 223
224 var pt0 = this.getPoint0(), 224 var pt0 = this.getPoint0(),
225 pt1 = this.getPoint1(); 225 pt1 = this.getPoint1();
226 226
227 // keep a couple flags to prevent counting crossings twice in edge cases 227 // keep a couple flags to prevent counting crossings twice in edge cases
228 var gotEnter = false, 228 var gotEnter = false,
229 gotExit = false; 229 gotExit = false;
230 230
231 var bp1 = boundaryPts[3]; 231 var bp1 = boundaryPts[3];
232 for (var i=0; i<4; i++) 232 for (var i=0; i<4; i++)
233 { 233 {
234 var bp0 = bp1; 234 var bp0 = bp1;
235 bp1 = boundaryPts[i]; 235 bp1 = boundaryPts[i];
236 var vec = vecUtils.vecSubtract(3, bp1, bp0); 236 var vec = vecUtils.vecSubtract(3, bp1, bp0);
237 var nrm = vecUtils.vecCross(3, vec, planeEq); 237 var nrm = vecUtils.vecCross(3, vec, planeEq);
238 nrm[3] = -vecUtils.vecDot(3, bp0, nrm); 238 nrm[3] = -vecUtils.vecDot(3, bp0, nrm);
239 239
240 var d0 = vecUtils.vecDot(3, nrm, pt0) + nrm[3], 240 var d0 = vecUtils.vecDot(3, nrm, pt0) + nrm[3],
241 d1 = vecUtils.vecDot(3, nrm, pt1) + nrm[3]; 241 d1 = vecUtils.vecDot(3, nrm, pt1) + nrm[3];
242 242
243 var s0 = MathUtils.fpSign(d0), 243 var s0 = MathUtils.fpSign(d0),
244 s1 = MathUtils.fpSign(d1); 244 s1 = MathUtils.fpSign(d1);
245 245
246 if (s0 != s1) 246 if (s0 != s1)
247 { 247 {
248 var t = Math.abs(d0)/( Math.abs(d0) + Math.abs(d1) ); 248 var t = Math.abs(d0)/( Math.abs(d0) + Math.abs(d1) );
249 if (MathUtils.fpSign(t) === 0) 249 if (MathUtils.fpSign(t) === 0)
250 { 250 {
251 // the first point of the line is on the (infinite) extension of a side of the boundary. 251 // the first point of the line is on the (infinite) extension of a side of the boundary.
252 // Make sure the point (pt0) is within the range of the polygon edge 252 // Make sure the point (pt0) is within the range of the polygon edge
253 var vt0 = vecUtils.vecSubtract(3, pt0, bp0), 253 var vt0 = vecUtils.vecSubtract(3, pt0, bp0),
@@ -257,144 +257,144 @@ var StageLine = exports.StageLine = Object.create(Object.prototype, {
257 var st0 = MathUtils.fpSign(dt0), st1 = MathUtils.fpSign(dt1); 257 var st0 = MathUtils.fpSign(dt0), st1 = MathUtils.fpSign(dt1);
258 if ((st0 >= 0) && (st1 >= 0)) 258 if ((st0 >= 0) && (st1 >= 0))
259 { 259 {
260 if (s1 > 0) // entering the material from the beginning of the line that is to be drawn 260 if (s1 > 0) // entering the material from the beginning of the line that is to be drawn
261 { 261 {
262 // see if the start point of the line is at a corner of the bounded plane 262 // see if the start point of the line is at a corner of the bounded plane
263 var lineDir = vecUtils.vecSubtract(3, pt1, pt0); 263 var lineDir = vecUtils.vecSubtract(3, pt1, pt0);
264 vecUtils.vecNormalize(3, lineDir); 264 vecUtils.vecNormalize(3, lineDir);
265 var dist = vecUtils.vecDist( 3, pt0, bp1 ); 265 var dist = vecUtils.vecDist( 3, pt0, bp1 );
266 var bp2, bv0, bv1, cross1, cross2, cross3; 266 var bp2, bv0, bv1, cross1, cross2, cross3;
267 if ( MathUtils.fpSign(dist) == 0) 267 if ( MathUtils.fpSign(dist) == 0)
268 { 268 {
269 bp2 = boundaryPts[(i+1) % 4]; 269 bp2 = boundaryPts[(i+1) % 4];
270 bv0 = vecUtils.vecSubtract(3, bp2, bp1); 270 bv0 = vecUtils.vecSubtract(3, bp2, bp1);
271 bv1 = vecUtils.vecSubtract(3, bp0, bp1); 271 bv1 = vecUtils.vecSubtract(3, bp0, bp1);
272 cross1 = vecUtils.vecCross(3, bv0, lineDir); 272 cross1 = vecUtils.vecCross(3, bv0, lineDir);
273 cross2 = vecUtils.vecCross(3, lineDir, bv1); 273 cross2 = vecUtils.vecCross(3, lineDir, bv1);
274 cross3 = vecUtils.vecCross(3, bv0, bv1); 274 cross3 = vecUtils.vecCross(3, bv0, bv1);
275 if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) 275 if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0))
276 { 276 {
277 gotEnter = true; 277 gotEnter = true;
278 this.addIntersection( plane, t, 1 ); 278 this.addIntersection( plane, t, 1 );
279 } 279 }
280 } 280 }
281 else if (MathUtils.fpSign( vecUtils.vecDist(3, pt0, bp0)) === 0) 281 else if (MathUtils.fpSign( vecUtils.vecDist(3, pt0, bp0)) === 0)
282 { 282 {
283 bp2 = boundaryPts[(i+2) % 4]; 283 bp2 = boundaryPts[(i+2) % 4];
284 bv0 = vecUtils.vecSubtract(3, bp2, bp0); 284 bv0 = vecUtils.vecSubtract(3, bp2, bp0);
285 bv1 = vecUtils.vecSubtract(3, bp1, bp0); 285 bv1 = vecUtils.vecSubtract(3, bp1, bp0);
286 cross1 = vecUtils.vecCross(3, bv0, lineDir); 286 cross1 = vecUtils.vecCross(3, bv0, lineDir);
287 cross2 = vecUtils.vecCross(3, lineDir, bv1); 287 cross2 = vecUtils.vecCross(3, lineDir, bv1);
288 cross3 = vecUtils.vecCross(3, bv0, bv1); 288 cross3 = vecUtils.vecCross(3, bv0, bv1);
289 if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) 289 if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0))
290 { 290 {
291 gotEnter = true; 291 gotEnter = true;
292 this.addIntersection( plane, t, 1 ); 292 this.addIntersection( plane, t, 1 );
293 } 293 }
294 } 294 }
295 else 295 else
296 { 296 {
297 // check if the line is on the edge of the boundary or goes to the interior 297 // check if the line is on the edge of the boundary or goes to the interior
298 gotEnter = true; 298 gotEnter = true;
299 this.addIntersection( plane, t, 1 ); 299 this.addIntersection( plane, t, 1 );
300 } 300 }
301 } 301 }
302 } 302 }
303 }
304 else if ( (MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0))
305 {
306 // get the point where the line crosses the edge of the element plane
307 var pt = MathUtils.interpolateLine3D(pt0, pt1, t );
308
309 // we know that the line crosses the infinite extension of the edge. Determine
310 // if that crossing is within the bounds of the edge
311 var dot0 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp0), vec),
312 dot1 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp1), vec);
313 if ((MathUtils.fpSign(dot0) > 0) && (MathUtils.fpSign(dot1) < 0))
314 {
315 // determine if the line is entering or exiting
316 if (s0 <= 0) // entering
317 {
318 if (!gotEnter)
319 {
320 gotEnter = true;
321 this.addIntersection( plane, t, 1 );
322 }
323