| author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> | 
| Thu, 15 Jul 2010 18:56:19 +0300 | |
| branch | RCL_3 | 
| changeset 17 | a1caeb42b3a3 | 
| parent 0 | 2f259fa3e83a | 
| permissions | -rw-r--r-- | 
| 0 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 1 | /************************************************************************* | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 2 | * * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 3 | * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 4 | * All rights reserved. Email: russ@q12.org Web: www.q12.org * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 5 | * * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 6 | * This library is free software; you can redistribute it and/or * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 7 | * modify it under the terms of EITHER: * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 8 | * (1) The GNU Lesser General Public License as published by the Free * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 9 | * Software Foundation; either version 2.1 of the License, or (at * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 10 | * your option) any later version. The text of the GNU Lesser * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 11 | * General Public License is included with this library in the * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 12 | * file LICENSE.TXT. * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 13 | * (2) The BSD-style license that is included with this library in * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 14 | * the file LICENSE-BSD.TXT. * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 15 | * * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 16 | * This library is distributed in the hope that it will be useful, * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 19 | * LICENSE.TXT and LICENSE-BSD.TXT for more details. * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 20 | * * | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 21 | *************************************************************************/ | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 22 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 23 | /* | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 24 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 25 | some useful collision utility stuff. this includes some API utility | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 26 | functions that are defined in the public header files. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 27 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 28 | */ | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 29 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 30 | #include <ode/common.h> | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 31 | #include <ode/collision.h> | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 32 | #include <ode/odemath.h> | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 33 | #include "collision_util.h" | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 34 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 35 | //**************************************************************************** | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 36 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 37 | int dCollideSpheres (dVector3 p1, dReal r1, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 38 | dVector3 p2, dReal r2, dContactGeom *c) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 39 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 40 |   // printf ("d=%.2f  (%.2f %.2f %.2f) (%.2f %.2f %.2f) r1=%.2f r2=%.2f\n",
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 41 | // d,p1[0],p1[1],p1[2],p2[0],p2[1],p2[2],r1,r2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 42 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 43 | dReal d = dDISTANCE (p1,p2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 44 | if (d > (r1 + r2)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 45 |   if (d <= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 46 | c->pos[0] = p1[0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 47 | c->pos[1] = p1[1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 48 | c->pos[2] = p1[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 49 | c->normal[0] = 1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 50 | c->normal[1] = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 51 | c->normal[2] = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 52 | c->depth = r1 + r2; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 53 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 54 |   else {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 55 | dReal d1 = dRecip (d); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 56 | c->normal[0] = dMUL((p1[0]-p2[0]),d1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 57 | c->normal[1] = dMUL((p1[1]-p2[1]),d1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 58 | c->normal[2] = dMUL((p1[2]-p2[2]),d1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 59 | dReal k = dMUL(REAL(0.5),(r2 - r1 - d)); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 60 | c->pos[0] = p1[0] + dMUL(c->normal[0],k); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 61 | c->pos[1] = p1[1] + dMUL(c->normal[1],k); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 62 | c->pos[2] = p1[2] + dMUL(c->normal[2],k); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 63 | c->depth = r1 + r2 - d; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 64 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 65 | return 1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 66 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 67 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 68 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 69 | void dLineClosestApproach (const dVector3 pa, const dVector3 ua, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 70 | const dVector3 pb, const dVector3 ub, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 71 | dReal *alpha, dReal *beta) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 72 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 73 | dVector3 p; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 74 | p[0] = pb[0] - pa[0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 75 | p[1] = pb[1] - pa[1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 76 | p[2] = pb[2] - pa[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 77 | dReal uaub = dDOT(ua,ub); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 78 | dReal q1 = dDOT(ua,p); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 79 | dReal q2 = -dDOT(ub,p); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 80 | dReal d = 1-dMUL(uaub,uaub); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 81 |   if (d <= REAL(0.0001)) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 82 | // @@@ this needs to be made more robust | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 83 | *alpha = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 84 | *beta = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 85 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 86 |   else {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 87 | d = dRecip(d); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 88 | *alpha = dMUL((q1 + dMUL(uaub,q2)),d); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 89 | *beta = dMUL((dMUL(uaub,q1) + q2),d); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 90 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 91 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 92 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 93 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 94 | // given two line segments A and B with endpoints a1-a2 and b1-b2, return the | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 95 | // points on A and B that are closest to each other (in cp1 and cp2). | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 96 | // in the case of parallel lines where there are multiple solutions, a | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 97 | // solution involving the endpoint of at least one line will be returned. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 98 | // this will work correctly for zero length lines, e.g. if a1==a2 and/or | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 99 | // b1==b2. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 100 | // | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 101 | // the algorithm works by applying the voronoi clipping rule to the features | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 102 | // of the line segments. the three features of each line segment are the two | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 103 | // endpoints and the line between them. the voronoi clipping rule states that, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 104 | // for feature X on line A and feature Y on line B, the closest points PA and | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 105 | // PB between X and Y are globally the closest points if PA is in V(Y) and | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 106 | // PB is in V(X), where V(X) is the voronoi region of X. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 107 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 108 | EXPORT_C void dClosestLineSegmentPoints (const dVector3 a1, const dVector3 a2, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 109 | const dVector3 b1, const dVector3 b2, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 110 | dVector3 cp1, dVector3 cp2) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 111 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 112 | dVector3 a1a2,b1b2,a1b1,a1b2,a2b1,a2b2,n; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 113 | dReal la,lb,k,da1,da2,da3,da4,db1,db2,db3,db4,det; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 114 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 115 | #define SET2(a,b) a[0]=b[0]; a[1]=b[1]; a[2]=b[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 116 | #define SET3(a,b,op,c) a[0]=b[0] op c[0]; a[1]=b[1] op c[1]; a[2]=b[2] op c[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 117 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 118 | // check vertex-vertex features | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 119 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 120 | SET3 (a1a2,a2,-,a1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 121 | SET3 (b1b2,b2,-,b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 122 | SET3 (a1b1,b1,-,a1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 123 | da1 = dDOT(a1a2,a1b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 124 | db1 = dDOT(b1b2,a1b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 125 |   if (da1 <= 0 && db1 >= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 126 | SET2 (cp1,a1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 127 | SET2 (cp2,b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 128 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 129 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 130 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 131 | SET3 (a1b2,b2,-,a1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 132 | da2 = dDOT(a1a2,a1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 133 | db2 = dDOT(b1b2,a1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 134 |   if (da2 <= 0 && db2 <= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 135 | SET2 (cp1,a1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 136 | SET2 (cp2,b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 137 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 138 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 139 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 140 | SET3 (a2b1,b1,-,a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 141 | da3 = dDOT(a1a2,a2b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 142 | db3 = dDOT(b1b2,a2b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 143 |   if (da3 >= 0 && db3 >= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 144 | SET2 (cp1,a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 145 | SET2 (cp2,b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 146 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 147 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 148 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 149 | SET3 (a2b2,b2,-,a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 150 | da4 = dDOT(a1a2,a2b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 151 | db4 = dDOT(b1b2,a2b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 152 |   if (da4 >= 0 && db4 <= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 153 | SET2 (cp1,a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 154 | SET2 (cp2,b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 155 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 156 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 157 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 158 | // check edge-vertex features. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 159 | // if one or both of the lines has zero length, we will never get to here, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 160 | // so we do not have to worry about the following divisions by zero. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 161 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 162 | la = dDOT(a1a2,a1a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 163 |   if (da1 >= 0 && da3 <= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 164 | k = dDIV(da1,la); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 165 | a1a2[0] = dMUL(k,a1a2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 166 | a1a2[1] = dMUL(k,a1a2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 167 | a1a2[2] = dMUL(k,a1a2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 168 | SET3 (n,a1b1,-,a1a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 169 |     if (dDOT(b1b2,n) >= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 170 | a1a2[0] = dMUL(k,a1a2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 171 | a1a2[1] = dMUL(k,a1a2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 172 | a1a2[2] = dMUL(k,a1a2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 173 | SET3 (cp1,a1,+,a1a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 174 | SET2 (cp2,b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 175 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 176 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 177 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 178 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 179 |   if (da2 >= 0 && da4 <= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 180 | k = dDIV(da2,la); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 181 | a1a2[0] = dMUL(k,a1a2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 182 | a1a2[1] = dMUL(k,a1a2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 183 | a1a2[2] = dMUL(k,a1a2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 184 | SET3 (n,a1b2,-,a1a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 185 |     if (dDOT(b1b2,n) <= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 186 | a1a2[0] = dMUL(k,a1a2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 187 | a1a2[1] = dMUL(k,a1a2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 188 | a1a2[2] = dMUL(k,a1a2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 189 | SET3 (cp1,a1,+,a1a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 190 | SET2 (cp2,b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 191 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 192 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 193 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 194 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 195 | lb = dDOT(b1b2,b1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 196 |   if (db1 <= 0 && db2 >= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 197 | k = -dDIV(db1,lb); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 198 | b1b2[0] = dMUL(k,b1b2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 199 | b1b2[1] = dMUL(k,b1b2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 200 | b1b2[2] = dMUL(k,b1b2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 201 | SET3 (n,-a1b1,-,b1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 202 |     if (dDOT(a1a2,n) >= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 203 | b1b2[0] = dMUL(k,b1b2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 204 | b1b2[1] = dMUL(k,b1b2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 205 | b1b2[2] = dMUL(k,b1b2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 206 | SET2 (cp1,a1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 207 | SET3 (cp2,b1,+,b1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 208 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 209 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 210 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 211 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 212 |   if (db3 <= 0 && db4 >= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 213 | k = -dDIV(db3,lb); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 214 | b1b2[0] = dMUL(k,b1b2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 215 | b1b2[1] = dMUL(k,b1b2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 216 | b1b2[2] = dMUL(k,b1b2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 217 | SET3 (n,-a2b1,-,b1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 218 |     if (dDOT(a1a2,n) <= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 219 | b1b2[0] = dMUL(k,b1b2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 220 | b1b2[1] = dMUL(k,b1b2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 221 | b1b2[2] = dMUL(k,b1b2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 222 | SET2 (cp1,a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 223 | SET3 (cp2,b1,+,b1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 224 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 225 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 226 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 227 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 228 | // it must be edge-edge | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 229 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 230 | k = dDOT(a1a2,b1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 231 | det = dMUL(la,lb) - dMUL(k,k); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 232 |   if (det <= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 233 | // this should never happen, but just in case... | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 234 | SET2(cp1,a1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 235 | SET2(cp2,b1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 236 | return; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 237 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 238 | det = dRecip (det); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 239 | dReal alpha = dMUL((dMUL(lb,da1) - dMUL(k,db1)),det); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 240 | a1a2[0] = dMUL(alpha,a1a2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 241 | a1a2[1] = dMUL(alpha,a1a2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 242 | a1a2[2] = dMUL(alpha,a1a2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 243 | dReal beta = dMUL(( dMUL(k,da1) - dMUL(la,db1)),det); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 244 | b1b2[0] = dMUL(beta,b1b2[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 245 | b1b2[1] = dMUL(beta,b1b2[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 246 | b1b2[2] = dMUL(beta,b1b2[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 247 | SET3 (cp1,a1,+,a1a2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 248 | SET3 (cp2,b1,+,b1b2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 249 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 250 | # undef SET2 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 251 | # undef SET3 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 252 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 253 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 254 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 255 | // a simple root finding algorithm is used to find the value of 't' that | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 256 | // satisfies: | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 257 | // d|D(t)|^2/dt = 0 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 258 | // where: | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 259 | // |D(t)| = |p(t)-b(t)| | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 260 | // where p(t) is a point on the line parameterized by t: | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 261 | // p(t) = p1 + t*(p2-p1) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 262 | // and b(t) is that same point clipped to the boundary of the box. in box- | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 263 | // relative coordinates d|D(t)|^2/dt is the sum of three x,y,z components | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 264 | // each of which looks like this: | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 265 | // | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 266 | // t_lo / | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 267 | // ______/ -->t | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 268 | // / t_hi | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 269 | // / | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 270 | // | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 271 | // t_lo and t_hi are the t values where the line passes through the planes | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 272 | // corresponding to the sides of the box. the algorithm computes d|D(t)|^2/dt | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 273 | // in a piecewise fashion from t=0 to t=1, stopping at the point where | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 274 | // d|D(t)|^2/dt crosses from negative to positive. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 275 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 276 | void dClosestLineBoxPoints (const dVector3 p1, const dVector3 p2, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 277 | const dVector3 c, const dMatrix3 R, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 278 | const dVector3 side, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 279 | dVector3 lret, dVector3 bret) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 280 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 281 | int i; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 282 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 283 | // compute the start and delta of the line p1-p2 relative to the box. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 284 | // we will do all subsequent computations in this box-relative coordinate | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 285 | // system. we have to do a translation and rotation for each point. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 286 | dVector3 tmp,s,v; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 287 | tmp[0] = p1[0] - c[0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 288 | tmp[1] = p1[1] - c[1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 289 | tmp[2] = p1[2] - c[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 290 | dMULTIPLY1_331 (s,R,tmp); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 291 | tmp[0] = p2[0] - p1[0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 292 | tmp[1] = p2[1] - p1[1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 293 | tmp[2] = p2[2] - p1[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 294 | dMULTIPLY1_331 (v,R,tmp); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 295 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 296 | // mirror the line so that v has all components >= 0 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 297 | dVector3 sign; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 298 |   for (i=0; i<3; i++) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 299 |     if (v[i] < 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 300 | s[i] = -s[i]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 301 | v[i] = -v[i]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 302 | sign[i] = REAL(-1.0); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 303 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 304 | else sign[i] = REAL(1.0); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 305 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 306 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 307 | // compute v^2 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 308 | dVector3 v2; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 309 | v2[0] = dMUL(v[0],v[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 310 | v2[1] = dMUL(v[1],v[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 311 | v2[2] = dMUL(v[2],v[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 312 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 313 | // compute the half-sides of the box | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 314 | dReal h[3]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 315 | h[0] = dMUL(REAL(0.5),side[0]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 316 | h[1] = dMUL(REAL(0.5),side[1]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 317 | h[2] = dMUL(REAL(0.5),side[2]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 318 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 319 | // region is -1,0,+1 depending on which side of the box planes each | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 320 | // coordinate is on. tanchor is the next t value at which there is a | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 321 | // transition, or the last one if there are no more. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 322 | int region[3]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 323 | dReal tanchor[3]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 324 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 325 | // Denormals are a problem, because we divide by v[i], and then | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 326 | // multiply that by 0. Alas, infinity times 0 is infinity (!) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 327 | // We also use v2[i], which is v[i] squared. Here's how the epsilons | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 328 | // are chosen: | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 329 | // float epsilon = 1.175494e-038 (smallest non-denormal number) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 330 | // double epsilon = 2.225074e-308 (smallest non-denormal number) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 331 | // For single precision, choose an epsilon such that v[i] squared is | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 332 | // not a denormal; this is for performance. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 333 | // For double precision, choose an epsilon such that v[i] is not a | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 334 | // denormal; this is for correctness. (Jon Watte on mailinglist) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 335 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 336 | const dReal tanchor_eps = REAL(2e-5f); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 337 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 338 | // find the region and tanchor values for p1 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 339 |   for (i=0; i<3; i++) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 340 |     if (v[i] > tanchor_eps) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 341 |       if (s[i] < -h[i]) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 342 | region[i] = -1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 343 | tanchor[i] = dDIV((-h[i]-s[i]),v[i]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 344 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 345 |       else {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 346 | region[i] = (s[i] > h[i]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 347 | tanchor[i] = dDIV((h[i]-s[i]),v[i]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 348 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 349 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 350 |     else {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 351 | region[i] = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 352 | tanchor[i] = REAL(2.0); // this will never be a valid tanchor | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 353 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 354 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 355 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 356 | // compute d|d|^2/dt for t=0. if it's >= 0 then p1 is the closest point | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 357 | dReal t = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 358 | dReal dd2dt = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 359 | for (i=0; i<3; i++) dd2dt -= dMUL((region[i] ? v2[i] : 0),tanchor[i]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 360 | if (dd2dt >= 0) goto got_answer; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 361 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 362 |   do {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 363 | // find the point on the line that is at the next clip plane boundary | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 364 | dReal next_t = REAL(1.0); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 365 |     for (i=0; i<3; i++) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 366 | if (tanchor[i] > t && tanchor[i] < 1 && tanchor[i] < next_t) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 367 | next_t = tanchor[i]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 368 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 369 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 370 | // compute d|d|^2/dt for the next t | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 371 | dReal next_dd2dt = REAL(0.0); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 372 |     for (i=0; i<3; i++) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 373 | next_dd2dt += dMUL((region[i] ? v2[i] : 0),(next_t - tanchor[i])); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 374 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 375 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 376 | // if the sign of d|d|^2/dt has changed, solution = the crossover point | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 377 |     if (next_dd2dt >= 0) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 378 | dReal m = dDIV((next_dd2dt-dd2dt),(next_t - t)); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 379 | t -= dDIV(dd2dt,m); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 380 | goto got_answer; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 381 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 382 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 383 | // advance to the next anchor point / region | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 384 |     for (i=0; i<3; i++) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 385 |       if (tanchor[i] == next_t) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 386 | tanchor[i] = dDIV((h[i]-s[i]),v[i]); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 387 | region[i]++; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 388 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 389 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 390 | t = next_t; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 391 | dd2dt = next_dd2dt; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 392 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 393 | while (t < REAL(1.0)); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 394 | t = REAL(1.0); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 395 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 396 | got_answer: | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 397 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 398 | // compute closest point on the line | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 399 | for (i=0; i<3; i++) lret[i] = p1[i] + dMUL(t,tmp[i]); // note: tmp=p2-p1 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 400 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 401 | // compute closest point on the box | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 402 |   for (i=0; i<3; i++) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 403 | tmp[i] = dMUL(sign[i],(s[i] + dMUL(t,v[i]))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 404 | if (tmp[i] < -h[i]) tmp[i] = -h[i]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 405 | else if (tmp[i] > h[i]) tmp[i] = h[i]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 406 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 407 | dMULTIPLY0_331 (s,R,tmp); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 408 | for (i=0; i<3; i++) bret[i] = s[i] + c[i]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 409 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 410 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 411 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 412 | // given boxes (p1,R1,side1) and (p1,R1,side1), return 1 if they intersect | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 413 | // or 0 if not. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 414 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 415 | EXPORT_C int dBoxTouchesBox (const dVector3 p1, const dMatrix3 R1, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 416 | const dVector3 side1, const dVector3 p2, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 417 | const dMatrix3 R2, const dVector3 side2) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 418 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 419 | // two boxes are disjoint if (and only if) there is a separating axis | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 420 | // perpendicular to a face from one box or perpendicular to an edge from | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 421 | // either box. the following tests are derived from: | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 422 | // "OBB Tree: A Hierarchical Structure for Rapid Interference Detection", | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 423 | // S.Gottschalk, M.C.Lin, D.Manocha., Proc of ACM Siggraph 1996. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 424 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 425 | // Rij is R1'*R2, i.e. the relative rotation between R1 and R2. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 426 | // Qij is abs(Rij) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 427 | dVector3 p,pp; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 428 | dReal A1,A2,A3,B1,B2,B3,R11,R12,R13,R21,R22,R23,R31,R32,R33, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 429 | Q11,Q12,Q13,Q21,Q22,Q23,Q31,Q32,Q33; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 430 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 431 | // get vector from centers of box 1 to box 2, relative to box 1 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 432 | p[0] = p2[0] - p1[0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 433 | p[1] = p2[1] - p1[1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 434 | p[2] = p2[2] - p1[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 435 | dMULTIPLY1_331 (pp,R1,p); // get pp = p relative to body 1 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 436 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 437 | // get side lengths / 2 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 438 | A1 = dMUL(side1[0],REAL(0.5)); A2 = dMUL(side1[1],REAL(0.5)); A3 = dMUL(side1[2],REAL(0.5)); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 439 | B1 = dMUL(side2[0],REAL(0.5)); B2 = dMUL(side2[1],REAL(0.5)); B3 = dMUL(side2[2],REAL(0.5)); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 440 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 441 | // for the following tests, excluding computation of Rij, in the worst case, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 442 | // 15 compares, 60 adds, 81 multiplies, and 24 absolutes. | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 443 | // notation: R1=[u1 u2 u3], R2=[v1 v2 v3] | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 444 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 445 | // separating axis = u1,u2,u3 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 446 | R11 = dDOT44(R1+0,R2+0); R12 = dDOT44(R1+0,R2+1); R13 = dDOT44(R1+0,R2+2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 447 | Q11 = dFabs(R11); Q12 = dFabs(R12); Q13 = dFabs(R13); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 448 | if (dFabs(pp[0]) > (A1 + dMUL(B1,Q11) + dMUL(B2,Q12) + dMUL(B3,Q13))) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 449 | R21 = dDOT44(R1+1,R2+0); R22 = dDOT44(R1+1,R2+1); R23 = dDOT44(R1+1,R2+2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 450 | Q21 = dFabs(R21); Q22 = dFabs(R22); Q23 = dFabs(R23); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 451 | if (dFabs(pp[1]) > (A2 + dMUL(B1,Q21) + dMUL(B2,Q22) + dMUL(B3,Q23))) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 452 | R31 = dDOT44(R1+2,R2+0); R32 = dDOT44(R1+2,R2+1); R33 = dDOT44(R1+2,R2+2); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 453 | Q31 = dFabs(R31); Q32 = dFabs(R32); Q33 = dFabs(R33); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 454 | if (dFabs(pp[2]) > (A3 + dMUL(B1,Q31) + dMUL(B2,Q32) + dMUL(B3,Q33))) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 455 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 456 | // separating axis = v1,v2,v3 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 457 | if (dFabs(dDOT41(R2+0,p)) > (dMUL(A1,Q11) + dMUL(A2,Q21) + dMUL(A3,Q31) + B1)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 458 | if (dFabs(dDOT41(R2+1,p)) > (dMUL(A1,Q12) + dMUL(A2,Q22) + dMUL(A3,Q32) + B2)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 459 | if (dFabs(dDOT41(R2+2,p)) > (dMUL(A1,Q13) + dMUL(A2,Q23) + dMUL(A3,Q33) + B3)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 460 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 461 | // separating axis = u1 x (v1,v2,v3) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 462 | if (dFabs(dMUL(pp[2],R21)-dMUL(pp[1],R31)) > dMUL(A2,Q31) + dMUL(A3,Q21) + dMUL(B2,Q13) + dMUL(B3,Q12)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 463 | if (dFabs(dMUL(pp[2],R22)-dMUL(pp[1],R32)) > dMUL(A2,Q32) + dMUL(A3,Q22) + dMUL(B1,Q13) + dMUL(B3,Q11)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 464 | if (dFabs(dMUL(pp[2],R23)-dMUL(pp[1],R33)) > dMUL(A2,Q33) + dMUL(A3,Q23) + dMUL(B1,Q12) + dMUL(B2,Q11)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 465 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 466 | // separating axis = u2 x (v1,v2,v3) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 467 | if (dFabs(dMUL(pp[0],R31)-dMUL(pp[2],R11)) > dMUL(A1,Q31) + dMUL(A3,Q11) + dMUL(B2,Q23) + dMUL(B3,Q22)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 468 | if (dFabs(dMUL(pp[0],R32)-dMUL(pp[2],R12)) > dMUL(A1,Q32) + dMUL(A3,Q12) + dMUL(B1,Q23) + dMUL(B3,Q21)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 469 | if (dFabs(pp[0]*R33-pp[2]*R13) > A1*Q33 + A3*Q13 + B1*Q22 + B2*Q21) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 470 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 471 | // separating axis = u3 x (v1,v2,v3) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 472 | if (dFabs(dMUL(pp[1],R11)-dMUL(pp[0],R21)) > dMUL(A1,Q21) + dMUL(A2,Q11) + dMUL(B2,Q33) + dMUL(B3,Q32)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 473 | if (dFabs(dMUL(pp[1],R12)-dMUL(pp[0],R22)) > dMUL(A1,Q22) + dMUL(A2,Q12) + dMUL(B1,Q33) + dMUL(B3,Q31)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 474 | if (dFabs(dMUL(pp[1],R13)-dMUL(pp[0],R23)) > dMUL(A1,Q23) + dMUL(A2,Q13) + dMUL(B1,Q32) + dMUL(B2,Q31)) return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 475 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 476 | return 1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 477 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 478 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 479 | //**************************************************************************** | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 480 | // other utility functions | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 481 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 482 | EXPORT_C void dInfiniteAABB (dxGeom */*geom*/, dReal aabb[6]) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 483 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 484 | aabb[0] = -dInfinity; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 485 | aabb[1] = dInfinity; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 486 | aabb[2] = -dInfinity; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 487 | aabb[3] = dInfinity; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 488 | aabb[4] = -dInfinity; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 489 | aabb[5] = dInfinity; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 490 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 491 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 492 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 493 | //**************************************************************************** | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 494 | // Helpers for Croteam's collider - by Nguyen Binh | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 495 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 496 | int dClipEdgeToPlane( dVector3 &vEpnt0, dVector3 &vEpnt1, const dVector4& plPlane) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 497 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 498 | // calculate distance of edge points to plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 499 | dReal fDistance0 = dPointPlaneDistance( vEpnt0 ,plPlane ); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 500 | dReal fDistance1 = dPointPlaneDistance( vEpnt1 ,plPlane ); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 501 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 502 | // if both points are behind the plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 503 | if ( fDistance0 < 0 && fDistance1 < 0 ) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 504 | 	{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 505 | // do nothing | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 506 | return 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 507 | // if both points in front of the plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 508 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 509 | else if ( fDistance0 > 0 && fDistance1 > 0 ) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 510 | 	{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 511 | // accept them | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 512 | return 1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 513 | // if we have edge/plane intersection | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 514 | } else if ((fDistance0 > 0 && fDistance1 < 0) || ( fDistance0 < 0 && fDistance1 > 0)) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 515 | 	{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 516 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 517 | // find intersection point of edge and plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 518 | dVector3 vIntersectionPoint; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 519 | vIntersectionPoint[0]= vEpnt0[0]-dMUL((vEpnt0[0]-vEpnt1[0]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 520 | vIntersectionPoint[1]= vEpnt0[1]-dMUL((vEpnt0[1]-vEpnt1[1]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 521 | vIntersectionPoint[2]= vEpnt0[2]-dMUL((vEpnt0[2]-vEpnt1[2]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 522 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 523 | // clamp correct edge to intersection point | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 524 | if ( fDistance0 < REAL(0.0) ) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 525 | 		{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 526 | dVector3Copy(vIntersectionPoint,vEpnt0); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 527 | } else | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 528 | 		{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 529 | dVector3Copy(vIntersectionPoint,vEpnt1); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 530 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 531 | return 1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 532 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 533 | return 1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 534 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 535 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 536 | // clip polygon with plane and generate new polygon points | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 537 | void dClipPolyToPlane( const dVector3 avArrayIn[], const int ctIn, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 538 | dVector3 avArrayOut[], int &ctOut, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 539 | const dVector4 &plPlane ) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 540 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 541 | // start with no output points | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 542 | ctOut = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 543 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 544 | int i0 = ctIn-1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 545 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 546 | // for each edge in input polygon | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 547 | 	for (int i1=0; i1<ctIn; i0=i1, i1++) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 548 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 549 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 550 | // calculate distance of edge points to plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 551 | dReal fDistance0 = dPointPlaneDistance( avArrayIn[i0],plPlane ); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 552 | dReal fDistance1 = dPointPlaneDistance( avArrayIn[i1],plPlane ); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 553 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 554 | // if first point is in front of plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 555 | 		if( fDistance0 >= 0 ) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 556 | // emit point | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 557 | avArrayOut[ctOut][0] = avArrayIn[i0][0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 558 | avArrayOut[ctOut][1] = avArrayIn[i0][1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 559 | avArrayOut[ctOut][2] = avArrayIn[i0][2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 560 | ctOut++; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 561 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 562 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 563 | // if points are on different sides | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 564 | 		if( (fDistance0 > 0 && fDistance1 < 0) || ( fDistance0 < 0 && fDistance1 > 0) ) {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 565 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 566 | // find intersection point of edge and plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 567 | dVector3 vIntersectionPoint; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 568 | vIntersectionPoint[0]= avArrayIn[i0][0] - | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 569 | dMUL((avArrayIn[i0][0]-avArrayIn[i1][0]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 570 | vIntersectionPoint[1]= avArrayIn[i0][1] - | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 571 | dMUL((avArrayIn[i0][1]-avArrayIn[i1][1]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 572 | vIntersectionPoint[2]= avArrayIn[i0][2] - | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 573 | dMUL((avArrayIn[i0][2]-avArrayIn[i1][2]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 574 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 575 | // emit intersection point | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 576 | avArrayOut[ctOut][0] = vIntersectionPoint[0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 577 | avArrayOut[ctOut][1] = vIntersectionPoint[1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 578 | avArrayOut[ctOut][2] = vIntersectionPoint[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 579 | ctOut++; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 580 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 581 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 582 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 583 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 584 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 585 | void dClipPolyToCircle(const dVector3 avArrayIn[], const int ctIn, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 586 | dVector3 avArrayOut[], int &ctOut, | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 587 | const dVector4 &plPlane ,dReal fRadius) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 588 | {
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 589 | // start with no output points | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 590 | ctOut = 0; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 591 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 592 | int i0 = ctIn-1; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 593 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 594 | // for each edge in input polygon | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 595 | for (int i1=0; i1<ctIn; i0=i1, i1++) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 596 | 	{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 597 | // calculate distance of edge points to plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 598 | dReal fDistance0 = dPointPlaneDistance( avArrayIn[i0],plPlane ); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 599 | dReal fDistance1 = dPointPlaneDistance( avArrayIn[i1],plPlane ); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 600 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 601 | // if first point is in front of plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 602 | if( fDistance0 >= 0 ) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 603 | 		{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 604 | // emit point | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 605 | if (dVector3Length2(avArrayIn[i0]) <= dMUL(fRadius,fRadius)) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 606 | 			{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 607 | avArrayOut[ctOut][0] = avArrayIn[i0][0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 608 | avArrayOut[ctOut][1] = avArrayIn[i0][1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 609 | avArrayOut[ctOut][2] = avArrayIn[i0][2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 610 | ctOut++; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 611 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 612 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 613 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 614 | // if points are on different sides | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 615 | if( (fDistance0 > 0 && fDistance1 < 0) || ( fDistance0 < 0 && fDistance1 > 0) ) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 616 | 		{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 617 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 618 | // find intersection point of edge and plane | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 619 | dVector3 vIntersectionPoint; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 620 | vIntersectionPoint[0]= avArrayIn[i0][0] - | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 621 | dMUL((avArrayIn[i0][0]-avArrayIn[i1][0]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 622 | vIntersectionPoint[1]= avArrayIn[i0][1] - | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 623 | dMUL((avArrayIn[i0][1]-avArrayIn[i1][1]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 624 | vIntersectionPoint[2]= avArrayIn[i0][2] - | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 625 | dMUL((avArrayIn[i0][2]-avArrayIn[i1][2]),dDIV(fDistance0,(fDistance0-fDistance1))); | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 626 | |
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 627 | // emit intersection point | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 628 | if (dVector3Length2(avArrayIn[i0]) <= dMUL(fRadius,fRadius)) | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 629 | 			{
 | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 630 | avArrayOut[ctOut][0] = vIntersectionPoint[0]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 631 | avArrayOut[ctOut][1] = vIntersectionPoint[1]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 632 | avArrayOut[ctOut][2] = vIntersectionPoint[2]; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 633 | ctOut++; | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 634 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 635 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 636 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 637 | } | 
| 
2f259fa3e83a
Revision: 201003
 Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> parents: diff
changeset | 638 |