/*************************************************************************
 *                                                                       *
 * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith.       *
 * All rights reserved.  Email: russ@q12.org   Web: www.q12.org          *
 *                                                                       *
 * This library is free software; you can redistribute it and/or         *
 * modify it under the terms of EITHER:                                  *
 *   (1) The GNU Lesser General Public License as published by the Free  *
 *       Software Foundation; either version 2.1 of the License, or (at  *
 *       your option) any later version. The text of the GNU Lesser      *
 *       General Public License is included with this library in the     *
 *       file LICENSE.TXT.                                               *
 *   (2) The BSD-style license that is included with this library in     *
 *       the file LICENSE-BSD.TXT.                                       *
 *                                                                       *
 * This library is distributed in the hope that it will be useful,       *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files    *
 * LICENSE.TXT and LICENSE-BSD.TXT for more details.                     *
 *                                                                       *
 *************************************************************************/

#ifndef _ODE_GEOM_INTERNAL_H_
#define _ODE_GEOM_INTERNAL_H_


// mask for the number-of-contacts field in the dCollide() flags parameter
#define NUMC_MASK (0xffff)


// internal info for geometry class

struct dxGeomClass {
  dGetColliderFnFn *collider;
  dGetAABBFn *aabb;
  dAABBTestFn *aabb_test;
  dGeomDtorFn *dtor;
  int num;		// class number
  int size;		// total size of object, including extra data area
};


// position vector and rotation matrix for geometry objects that are not
// connected to bodies.

struct dxPosR {
  dVector3 pos;
  dMatrix3 R;
};


// common data for all geometry objects. the class-specific data area follows
// this structure. pos and R will either point to a separately allocated
// buffer (if body is 0 - pos points to the dxPosR object) or to the pos and
// R of the body (if body nonzero).

struct dxGeom {		// a dGeomID is a pointer to this
  dxGeomClass *_class;	// class of this object
  void *data;		// user data pointer
  dBodyID body;		// dynamics body associated with this object (if any)
  dReal *pos;		// pointer to object's position vector
  dReal *R;		// pointer to object's rotation matrix
  dSpaceID spaceid;	// the space this object is in
  dGeomSpaceData space;	// reserved for use by space this object is in
  dReal *space_aabb;	// ptr to aabb array held by dSpaceCollide() fn
  // class-specific data follows here, with proper alignment.
};


// this is the size of the dxGeom structure rounded up to a multiple of 16
// bytes. any class specific data that comes after this will have the correct
// alignment.

#define SIZEOF_DXGEOM dEFFICIENT_SIZE(sizeof(dxGeom))


// given a pointer to a dxGeom, return a pointer to the class data that
// follows it.

#define CLASSDATA(geomptr) (((char*)geomptr) + SIZEOF_DXGEOM)

#endif

