summaryrefslogtreecommitdiff
path: root/libs/ode-0.16.1/ode/src/collision_std.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ode-0.16.1/ode/src/collision_std.h')
-rw-r--r--libs/ode-0.16.1/ode/src/collision_std.h238
1 files changed, 238 insertions, 0 deletions
diff --git a/libs/ode-0.16.1/ode/src/collision_std.h b/libs/ode-0.16.1/ode/src/collision_std.h
new file mode 100644
index 0000000..710e580
--- /dev/null
+++ b/libs/ode-0.16.1/ode/src/collision_std.h
@@ -0,0 +1,238 @@
+/*************************************************************************
+ * *
+ * 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. *
+ * *
+ *************************************************************************/
+
+/*
+
+the standard ODE geometry primitives.
+
+*/
+
+#ifndef _ODE_COLLISION_STD_H_
+#define _ODE_COLLISION_STD_H_
+
+#include <ode/common.h>
+#include "collision_kernel.h"
+
+
+// primitive collision functions - these have the dColliderFn interface, i.e.
+// the same interface as dCollide(). the first and second geom arguments must
+// have the specified types.
+
+int dCollideSphereSphere (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideSphereBox (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideSpherePlane (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideBoxBox (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideBoxPlane (dxGeom *o1, dxGeom *o2,
+ int flags, dContactGeom *contact, int skip);
+int dCollideCapsuleSphere (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideCapsuleBox (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideCapsuleCapsule (dxGeom *o1, dxGeom *o2,
+ int flags, dContactGeom *contact, int skip);
+int dCollideCapsulePlane (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideRaySphere (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideRayBox (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideRayCapsule (dxGeom *o1, dxGeom *o2,
+ int flags, dContactGeom *contact, int skip);
+int dCollideRayPlane (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideRayCylinder (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+
+// Cylinder - Box/Sphere by (C) CroTeam
+// Ported by Nguyen Binh
+int dCollideCylinderBox(dxGeom *o1, dxGeom *o2,
+ int flags, dContactGeom *contact, int skip);
+int dCollideCylinderSphere(dxGeom *gCylinder, dxGeom *gSphere,
+ int flags, dContactGeom *contact, int skip);
+int dCollideCylinderPlane(dxGeom *gCylinder, dxGeom *gPlane,
+ int flags, dContactGeom *contact, int skip);
+
+//--> Convex Collision
+int dCollideConvexPlane (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideSphereConvex (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideConvexBox (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideConvexCapsule (dxGeom *o1, dxGeom *o2,
+ int flags, dContactGeom *contact, int skip);
+int dCollideConvexConvex (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+int dCollideRayConvex (dxGeom *o1, dxGeom *o2, int flags,
+ dContactGeom *contact, int skip);
+//<-- Convex Collision
+
+// dHeightfield
+int dCollideHeightfield( dxGeom *o1, dxGeom *o2,
+ int flags, dContactGeom *contact, int skip );
+
+//****************************************************************************
+// the basic geometry objects
+
+struct dxSphere : public dxGeom {
+ dReal radius; // sphere radius
+ dxSphere (dSpaceID space, dReal _radius);
+ void computeAABB();
+};
+
+
+struct dxBox : public dxGeom {
+ dVector3 side; // side lengths (x,y,z)
+ dxBox (dSpaceID space, dReal lx, dReal ly, dReal lz);
+ void computeAABB();
+};
+
+
+struct dxCapsule : public dxGeom {
+ dReal radius,lz; // radius, length along z axis
+ dxCapsule (dSpaceID space, dReal _radius, dReal _length);
+ void computeAABB();
+};
+
+
+struct dxCylinder : public dxGeom {
+ dReal radius,lz; // radius, length along z axis
+ dxCylinder (dSpaceID space, dReal _radius, dReal _length);
+ void computeAABB();
+};
+
+
+struct dxPlane : public dxGeom {
+ dReal p[4];
+ dxPlane (dSpaceID space, dReal a, dReal b, dReal c, dReal d);
+ void computeAABB();
+};
+
+
+struct dxRay : public dxGeom {
+ dReal length;
+ dxRay (dSpaceID space, dReal _length);
+ void computeAABB();
+};
+
+struct dxConvex : public dxGeom
+{
+ const dReal *planes; /*!< An array of planes in the form:
+ normal X, normal Y, normal Z,Distance
+ */
+ const dReal *points; /*!< An array of points X,Y,Z */
+ const unsigned int *polygons; /*! An array of indices to the points of each polygon, it should be the number of vertices followed by that amount of indices to "points" in counter clockwise order*/
+ unsigned int planecount; /*!< Amount of planes in planes */
+ unsigned int pointcount;/*!< Amount of points in points */
+ unsigned int edgecount;/*!< Amount of edges in convex */
+ dReal saabb[6];/*!< Static AABB */
+ dxConvex(dSpaceID space,
+ const dReal *planes,
+ unsigned int planecount,
+ const dReal *points,
+ unsigned int pointcount,
+ const unsigned int *polygons);
+ ~dxConvex()
+ {
+ if((edgecount!=0)&&(edges!=NULL)) delete[] edges;
+ }
+ void computeAABB();
+ struct edge
+ {
+ unsigned int first;
+ unsigned int second;
+ };
+ edge* edges;
+
+ /*! \brief A Support mapping function for convex shapes
+ \param dir [IN] direction to find the Support Point for
+ \return the index of the support vertex.
+ */
+ inline unsigned int SupportIndex(dVector3 dir)
+ {
+ dVector3 rdir;
+ unsigned int index=0;
+ dMultiply1_331 (rdir,final_posr->R,dir);
+ dReal max = dCalcVectorDot3(points,rdir);
+ dReal tmp;
+ for (unsigned int i = 1; i < pointcount; ++i)
+ {
+ tmp = dCalcVectorDot3(points+(i*3),rdir);
+ if (tmp > max)
+ {
+ index=i;
+ max = tmp;
+ }
+ }
+ return index;
+ }
+
+private:
+ // For Internal Use Only
+ /*! \brief Fills the edges dynamic array based on points and polygons.
+ */
+ void FillEdges();
+#if 0
+ /*
+ What this does is the same as the Support function by doing some preprocessing
+ for optimization. Not complete yet.
+ */
+ // Based on Eberly's Game Physics Book page 307
+ struct Arc
+ {
+ // indices of polyhedron normals that form the spherical arc
+ int normals[2];
+ // index of edge shared by polyhedron faces
+ int edge;
+ };
+ struct Polygon
+ {
+ // indices of polyhedron normals that form the spherical polygon
+ std::vector<int> normals;
+ // index of extreme vertex corresponding to this polygon
+ int vertex;
+ };
+ // This is for extrem feature query and not the usual level BSP structure (that comes later)
+ struct BSPNode
+ {
+ // Normal index (interior node), vertex index (leaf node)
+ int normal;
+ // if Dot (E,D)>=0, D gets propagated to this child
+ BSPNode* right;
+ // if Dot (E,D)<0, D gets propagated to this child
+ BSPNode* left;
+ };
+ void CreateTree();
+ BSPNode* CreateNode(std::vector<Arc> Arcs,std::vector<Polygon> Polygons);
+ void GetFacesSharedByVertex(int i, std::vector<int> f);
+ void GetFacesSharedByEdge(int i, int* f);
+ void GetFaceNormal(int i, dVector3 normal);
+ BSPNode* tree;
+#endif
+};
+
+
+#endif