diff options
author | hwc487 | 2012-06-28 15:06:33 -0700 |
---|---|---|
committer | hwc487 | 2012-06-28 15:06:33 -0700 |
commit | 6cbeb36736e5a012fa1688db78d5981c2e61d95b (patch) | |
tree | 60e5444e9ff454a03ff64e4d8101132b3daacc59 | |
parent | 3ba9accb8e1887bfd6f1f912b6135073a3d9c70c (diff) | |
download | ninja-6cbeb36736e5a012fa1688db78d5981c2e61d95b.tar.gz |
Fixes for incorrect line/polygon intersections.
-rwxr-xr-x | js/helper-classes/3D/StageLine.js | 76 |
1 files changed, 43 insertions, 33 deletions
diff --git a/js/helper-classes/3D/StageLine.js b/js/helper-classes/3D/StageLine.js index 23e8cf5b..540109dc 100755 --- a/js/helper-classes/3D/StageLine.js +++ b/js/helper-classes/3D/StageLine.js | |||
@@ -222,49 +222,59 @@ var StageLine = exports.StageLine = Object.create(Object.prototype, { | |||
222 | if (s0 != s1) | 222 | if (s0 != s1) |
223 | { | 223 | { |
224 | var t = Math.abs(d0)/( Math.abs(d0) + Math.abs(d1) ); | 224 | var t = Math.abs(d0)/( Math.abs(d0) + Math.abs(d1) ); |
225 | if (t == 0) | 225 | if (MathUtils.fpSign(t) === 0) |
226 | { | 226 | { |
227 | if (s1 > 0) // entering the material from the beginning of the line that is to be drawn | 227 | // the first point of the line is on the (infinite) extension of a side of the boundary. |
228 | // Make sure the point (pt0) is within the range of the polygon edge | ||
229 | var vt0 = vecUtils.vecSubtract(3, pt0, bp0), | ||
230 | vt1 = vecUtils.vecSubtract(3, bp1, pt0); | ||
231 | var dt0 = vecUtils.vecDot(3, vec, vt0), | ||
232 | dt1 = vecUtils.vecDot(3, vec, vt1); | ||
233 | var st0 = MathUtils.fpSign(dt0), st1 = MathUtils.fpSign(dt1); | ||
234 | if ((st0 >= 0) && (st1 >= 0)) | ||
228 | { | 235 | { |
229 | // see if the start point of the line is at a corner of the bounded plane | 236 | if (s1 > 0) // entering the material from the beginning of the line that is to be drawn |
230 | var lineDir = vecUtils.vecSubtract(3, pt1, pt0); | ||
231 | vecUtils.vecNormalize(3, lineDir); | ||
232 | var dist = vecUtils.vecDist( 3, pt0, bp1 ); | ||
233 | var bp2, bv0, bv1, cross1, cross2, cross3; | ||
234 | if ( MathUtils.fpSign(dist) == 0) | ||
235 | { | 237 | { |
236 | bp2 = boundaryPts[(i+1) % 4]; | 238 | // see if the start point of the line is at a corner of the bounded plane |
237 | bv0 = vecUtils.vecSubtract(3, bp2, bp1); | 239 | var lineDir = vecUtils.vecSubtract(3, pt1, pt0); |
238 | bv1 = vecUtils.vecSubtract(3, bp0, bp1); | 240 | vecUtils.vecNormalize(3, lineDir); |
239 | cross1 = vecUtils.vecCross(3, bv0, lineDir); | 241 | var dist = vecUtils.vecDist( 3, pt0, bp1 ); |
240 | cross2 = vecUtils.vecCross(3, lineDir, bv1); | 242 | var bp2, bv0, bv1, cross1, cross2, cross3; |
241 | cross3 = vecUtils.vecCross(3, bv0, bv1); | 243 | if ( MathUtils.fpSign(dist) == 0) |
242 | if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) | ||
243 | { | 244 | { |
244 | gotEnter = true; | 245 | bp2 = boundaryPts[(i+1) % 4]; |
245 | this.addIntersection( plane, t, 1 ); | 246 | bv0 = vecUtils.vecSubtract(3, bp2, bp1); |
247 | bv1 = vecUtils.vecSubtract(3, bp0, bp1); | ||
248 | cross1 = vecUtils.vecCross(3, bv0, lineDir); | ||
249 | cross2 = vecUtils.vecCross(3, lineDir, bv1); | ||
250 | cross3 = vecUtils.vecCross(3, bv0, bv1); | ||
251 | if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) | ||
252 | { | ||
253 | gotEnter = true; | ||
254 | this.addIntersection( plane, t, 1 ); | ||
255 | } | ||
246 | } | 256 | } |
247 | } | 257 | else if (MathUtils.fpSign( vecUtils.vecDist(3, pt0, bp0)) === 0) |
248 | else if (MathUtils.fpSign( vecUtils.vecDist(3, pt0, bp0)) === 0) | ||
249 | { | ||
250 | bp2 = boundaryPts[(i+2) % 4]; | ||
251 | bv0 = vecUtils.vecSubtract(3, bp2, bp0); | ||
252 | bv1 = vecUtils.vecSubtract(3, bp1, bp0); | ||
253 | cross1 = vecUtils.vecCross(3, bv0, lineDir); | ||
254 | cross2 = vecUtils.vecCross(3, lineDir, bv1); | ||
255 | cross3 = vecUtils.vecCross(3, bv0, bv1); | ||
256 | if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) | ||
257 | { | 258 | { |
259 | bp2 = boundaryPts[(i+2) % 4]; | ||
260 | bv0 = vecUtils.vecSubtract(3, bp2, bp0); | ||
261 | bv1 = vecUtils.vecSubtract(3, bp1, bp0); | ||
262 | cross1 = vecUtils.vecCross(3, bv0, lineDir); | ||
263 | cross2 = vecUtils.vecCross(3, lineDir, bv1); | ||
264 | cross3 = vecUtils.vecCross(3, bv0, bv1); | ||
265 | if ( (MathUtils.fpSign(vecUtils.vecDot(3, cross1, cross3)) == 0) && (MathUtils.fpSign(vecUtils.vecDot(3, cross2, cross3)) == 0)) | ||
266 | { | ||
267 | gotEnter = true; | ||
268 | this.addIntersection( plane, t, 1 ); | ||
269 | } | ||
270 | } | ||
271 | else | ||
272 | { | ||
273 | // check if the line is on the edge of the boundary or goes to the interior | ||
258 | gotEnter = true; | 274 | gotEnter = true; |
259 | this.addIntersection( plane, t, 1 ); | 275 | this.addIntersection( plane, t, 1 ); |
260 | } | 276 | } |
261 | } | 277 | } |
262 | else | ||
263 | { | ||
264 | // check if the line is on the edge of the boundary or goes to the interior | ||
265 | gotEnter = true; | ||
266 | this.addIntersection( plane, t, 1 ); | ||
267 | } | ||
268 | } | 278 | } |
269 | } | 279 | } |
270 | else if ( (MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) | 280 | else if ( (MathUtils.fpSign(t) > 0) && (MathUtils.fpCmp(t,1.0) <= 0)) |