[ODE] plane class with half space aabb - version with use of gflags

Erwin de Vries erwin at vo.com
Wed Jul 2 13:48:01 2003


Looks great. Havent tested if it works, but if it does (which i guess we can
assume) we should get this code inside ODE.

Erwin

----- Original Message -----
From: "Tim Schmidt" <tisch@uni-paderborn.de>
To: <ode@q12.org>
Sent: Wednesday, July 02, 2003 21:34
Subject: [ODE] plane class with half space aabb - version with use of gflags


> Hi!
>
> Here is my announced second version of axis alignment detection in the
> plane geom. I now use the gflags member instead of an additional integer
> member. What do you think?
> If everything is ok with this version and there are no objections to use
> the gflags for such things in the future (Russ?), then somebody with CVS
> access may eventually add these modified functions to the CVS
> (->collision_std.cpp).
>
> -Tim
>
> ------------
>
> #define AXIS_ALIGNMENT_MASK (7<<29)
> // results in 11100000 00000000 00000000 00000000
>
> static void detectAxisAlignment (dxPlane *g)
> {
>    if (g->p[0] == -1)
>    {
>      // set three most significant bits to 0=000
>      g->gflags = (g->gflags & ~AXIS_ALIGNMENT_MASK) | 0<<29;
>    }
>    else if (g->p[0] == 1)
>    {
>      // set three most significant bits to 1=100
>      g->gflags = (g->gflags & ~AXIS_ALIGNMENT_MASK) | 1<<29;
>    }
>    else if (g->p[1] == -1)
>    {
>      // set three most significant bits to 2=010
>      g->gflags = (g->gflags & ~AXIS_ALIGNMENT_MASK) | 2<<29;
>    }
>    else if (g->p[1] == 1)
>    {
>      // set three most significant bits to 3=110
>      g->gflags = (g->gflags & ~AXIS_ALIGNMENT_MASK) | 3<<29;
>    }
>    else if (g->p[2] == -1)
>    {
>      // set three most significant bits to 4=001
>      g->gflags = (g->gflags & ~AXIS_ALIGNMENT_MASK) | 4<<29;
>    }
>    else if (g->p[2] == 1)
>    {
>      // set three most significant bits to 5=101
>      g->gflags = (g->gflags & ~AXIS_ALIGNMENT_MASK) | 5<<29;
>    }
>    else    // ==> not aligned
>    {
>      // set three most significant bits to -1=111 (2's complement!!)
>      g->gflags = (g->gflags & ~AXIS_ALIGNMENT_MASK) | -1<<29;
>    }
> }
>
> dxPlane::dxPlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d) :
>    dxGeom (space,0)
> {
>    type = dPlaneClass;
>    p[0] = a;
>    p[1] = b;
>    p[2] = c;
>    p[3] = d;
>    make_sure_plane_normal_has_unit_length (this);
>    detectAxisAlignment(this);
> }
>
> void dxPlane::computeAABB()
> {
>    aabb[0] = -dInfinity;
>    aabb[1] = dInfinity;
>    aabb[2] = -dInfinity;
>    aabb[3] = dInfinity;
>    aabb[4] = -dInfinity;
>    aabb[5] = dInfinity;
>    if ((gflags>>29) >= 0) // if three most significant bits are >0
>    {
>      aabb[(gflags>>29)] = p[3];
>    }
> }
>
> void dGeomPlaneSetParams (dGeomID g, dReal a, dReal b, dReal c, dReal d)
> {
>    dUASSERT (g && g->type == dPlaneClass,"argument not a plane");
>    dxPlane *p = (dxPlane*) g;
>    p->p[0] = a;
>    p->p[1] = b;
>    p->p[2] = c;
>    p->p[3] = d;
>    make_sure_plane_normal_has_unit_length (p);
>    detectAxisAlignment(p);
>    dGeomMoved (g);
> }
>
>
> _______________________________________________
> ODE mailing list
> ODE@q12.org
> http://q12.org/mailman/listinfo/ode
>
>