aboutsummaryrefslogtreecommitdiff
path: root/js/helper-classes/3D/StageLine.js
diff options
context:
space:
mode:
authorKris Kowal2012-07-06 11:52:06 -0700
committerKris Kowal2012-07-06 15:01:48 -0700
commit648ee61ae84216d0236e0dbc211addc13b2cfa3a (patch)
tree8f0f55557bd0c47a84e49c1977c950645d284607 /js/helper-classes/3D/StageLine.js
parentaedd14b18695d031f695d27dfbd94df5614495bb (diff)
downloadninja-648ee61ae84216d0236e0dbc211addc13b2cfa3a.tar.gz
Expand tabs
Diffstat (limited to 'js/helper-classes/3D/StageLine.js')
-rwxr-xr-xjs/helper-classes/3D/StageLine.js372
1 files changed, 186 insertions, 186 deletions
diff --git a/js/helper-classes/3D/StageLine.js b/js/helper-classes/3D/StageLine.js
index 787a4568..d6eea478 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,184 +207,184 @@ 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 (t == 0) 249 if (t == 0)
250 { 250 {
251 if (s1 > 0) // entering the material from the beginning of the line that is to be drawn 251 if (s1 > 0) // entering the material from the beginning of the line that is to be drawn
252 { 252 {
253 // see if the start point of the line is at a corner of the bounded plane 253 // see if the start point of the line is at a corner of the bounded plane
254 var lineDir = vecUtils.vecSubtract(3, pt1, pt0); 254 var lineDir = vecUtils.vecSubtract(3, pt1, pt0);
255 vecUtils.vecNormalize(3, lineDir); 255 vecUtils.vecNormalize(3, lineDir);
256 var dist = vecUtils.vecDist( 3, pt0, bp1 ); 256 var dist = vecUtils.vecDist( 3, pt0, bp1 );
257 var bp2, bv0, bv1, cross1, cross2, cross3; 257 var bp2, bv0, bv1, cross1, cross2, cross3;
258 if ( MathUtils.fpSign(dist) == 0) 258 if ( MathUtils.fpSign(dist) == 0)
259 { 259 {
260 bp2 = boundaryPts[(i+1) % 4]; 260 bp2 = boundaryPts[(i+1) % 4];
261 bv0 = vecUtils.vecSubtract(3, bp2, bp1); 261 bv0 = vecUtils.vecSubtract(3, bp2, bp1);
262 bv1 = vecUtils.vecSubtract(3, bp0, bp1); 262 bv1 = vecUtils.vecSubtract(3, bp0, bp1);
263 cross1 = vecUtils.vecCross(3, bv0, lineDir); 263 cross1 = vecUtils.vecCross(3, bv0, lineDir);
264 cross2 = vecUtils.vecCross(3, lineDir, bv1); 264 cross2 = vecUtils.vecCross(3, lineDir, bv1);
265 cross3 = vecUtils.vecCross(3, bv0, bv1); 265 cross3 = vecUtils.vecCross(3, bv0, bv1);
266 if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) 266 if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0))
267 { 267 {
268 gotEnter = true; 268 gotEnter = true;
269 this.addIntersection( plane, t, 1 ); 269 this.addIntersection( plane, t, 1 );
270 } 270 }
271 } 271 }
272 else if (MathUtils.fpSign( vecUtils.vecDist(3, pt0, bp0)) === 0) 272 else if (MathUtils.fpSign( vecUtils.vecDist(3, pt0, bp0)) === 0)
273 { 273 {
274 bp2 = boundaryPts[(i+2) % 4]; 274 bp2 = boundaryPts[(i+2) % 4];
275 bv0 = vecUtils.vecSubtract(3, bp2, bp0); 275 bv0 = vecUtils.vecSubtract(3, bp2, bp0);
276 bv1 = vecUtils.vecSubtract(3, bp1, bp0); 276 bv1 = vecUtils.vecSubtract(3, bp1, bp0);
277 cross1 = vecUtils.vecCross(3, bv0, lineDir); 277 cross1 = vecUtils.vecCross(3, bv0, lineDir);
278 cross2 = vecUtils.vecCross(3, lineDir, bv1); 278 cross2 = vecUtils.vecCross(3, lineDir, bv1);
279 cross3 = vecUtils.vecCross(3, bv0, bv1); 279 cross3 = vecUtils.vecCross(3, bv0, bv1);
280 if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) 280 if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0))
281 { 281 {
282 gotEnter = true; 282 gotEnter = true;
283 this.addIntersection( plane, t, 1 ); 283 this.addIntersection( plane, t, 1 );
284 } 284 }
285 } 285 }
286 else 286 else
287 { 287 {
288 // check if the line is on the edge of the boundary or goes to the interior 288 // check if the line is on the edge of the boundary or goes to the interior
289 gotEnter = true; 289 gotEnter = true;
290 this.addIntersection( plane, t, 1 ); 290 this.addIntersection( plane, t, 1 );
291 } 291 }
292 } 292 }
293 } 293 }
294 else if ( (MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) 294 else if ( (MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0))
295 { 295 {
296 // get the point where the line crosses the edge of the element plane 296 // get the point where the line crosses the edge of the element plane
297 var pt = MathUtils.interpolateLine3D(pt0, pt1, t ); 297 var pt = MathUtils.interpolateLine3D(pt0, pt1, t );
298 298
299 // we know that the line crosses the infinite extension of the edge. Determine 299 // we know that the line crosses the infinite extension of the edge. Determine
300 // if that crossing is within the bounds of the edge 300 // if that crossing is within the bounds of the edge
301 var dot0 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp0), vec), 301 var dot0 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp0), vec),
302 dot1 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp1), vec); 302 dot1 = vecUtils.vecDot(3, vecUtils.vecSubtract(3,pt, bp1), vec);
303 if ((MathUtils.fpSign(dot0) > 0) && (MathUtils.fpSign(dot1) < 0)) 303 if ((MathUtils.fpSign(dot0) > 0) && (MathUtils.fpSign(dot1) < 0))
304 { 304 {
305 // determine if the line is entering or exiting 305 // determine if the line is entering or exiting
306 if (s0 <= 0) // entering 306 if (s0 <= 0) // entering
307 { 307 {
308 if (!gotEnter) 308 if (!gotEnter)
309