/usr/include/tuxcap/Physics.h is in libtuxcap-dev 1.4.0.dfsg2-2.2build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 | /* Sexy Chipmunk, a physics engine for the PopCap Games Framework using Scott Lembcke's excellent chipmunk physics library */
/* Copyright (c) 2007-2008 W.P. van Paassen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef __SEXYPHYSICS_H__
#define __SEXYPHYSICS_H__
#include <stdlib.h>
#include <vector>
#include <set>
#include <utility>
#include <algorithm>
#include "chipmunk.h"
#include "PhysicsListener.h"
#include "SexyVector.h"
#if defined(linux)
#include <linux/types.h>
typedef __u32 uint32_t;
#endif
namespace Sexy
{
class CollisionPoint;
class PhysicsObject;
class Joint;
class Physics {
friend class PhysicsObject;
public:
Physics();
~Physics();
void Init();
bool IsInitialized(){return space != 0;}
void SetGravity(const SexyVector2& gravity);
void SetDamping(cpFloat damping);
void SetIterations(int iter);
void ResizeStaticHash(float dimension, int count);
void ResizeActiveHash(float dimension, int count);
void Update();
void Draw(Graphics* g);
void Clear();
void SetSteps(int steps);
void SetDelta(float delta) { this->delta = delta; }
PhysicsObject* CreateObject(cpFloat mass, cpFloat inertia);
PhysicsObject* CreateStaticObject();
void DestroyObject(PhysicsObject* object);
bool IsValidObject(PhysicsObject* object) const;
void SetPhysicsListener(PhysicsListener* p) { listener = p; }
void RegisterCollisionType(uint32_t type_a, uint32_t type_b = 0);
void UnregisterCollisionType(uint32_t type_a, uint32_t type_b = 0);
std::vector<PhysicsObject*>& GetPhysicsObjects() { return objects;}
//help functions
void ApplySpringForce(PhysicsObject* obj1, PhysicsObject* obj2, const SexyVector2& anchor1,
const SexyVector2& anchor2, float rest_length, float spring, float damping);
Joint CreatePinJoint(const PhysicsObject* obj1, const PhysicsObject* obj2, const SexyVector2& anchor1, const SexyVector2& anchor2);
Joint CreateSlideJoint(const PhysicsObject* obj1, const PhysicsObject* obj2, const SexyVector2& anchor1, const SexyVector2& anchor2, float min, float max);
Joint CreatePivotJoint(const PhysicsObject* obj1, const PhysicsObject* obj2, const SexyVector2& pivot);
void RemoveJoint(const Joint& joint);
void RemoveJoint(const PhysicsObject* obj1, const PhysicsObject* obj2);
void RemoveJoints(const PhysicsObject* obj);
bool IsJoined(const PhysicsObject* obj1, const PhysicsObject* obj2) const;
std::vector<std::pair<SexyVector2, SexyVector2> > GetJoints(const PhysicsObject* obj1, const PhysicsObject* obj2) const;
std::vector<std::pair<SexyVector2, SexyVector2> > GetJoints(const PhysicsObject* obj1) const;
std::vector<std::pair<SexyVector2, SexyVector2> > GetJoints() const;
std::set<PhysicsObject*> GetJoinedPhysicsObjects(const PhysicsObject* obj1) const;
static cpFloat ComputeMomentForPoly(cpFloat moment, int numVerts, SexyVector2* vectors, const SexyVector2& offset) {
return cpMomentForPoly(moment, numVerts, (cpVect*)vectors, cpv(offset.x, offset.y));
}
static cpFloat ComputeMomentForCircle(cpFloat moment, cpFloat r1, cpFloat r2, const SexyVector2& offset) {
return cpMomentForCircle(moment, r1, r2, cpv(offset.x, offset.y));
}
static SexyVector2 RotateVector(const SexyVector2& v1, const SexyVector2& v2) {
cpVect r = cpvrotate(cpv(v1.x,v1.y), cpv(v2.x,v2.y));
return SexyVector2(r.x,r.y);
}
static SexyVector2 SumCollisionImpulses(int numContacts, CollisionPoint* contacts);
static SexyVector2 SumCollisionImpulsesWithFriction(int numContacts, CollisionPoint* contacts);
private:
cpSpace* space;
int steps;
cpFloat delta;
std::vector<PhysicsObject*> objects;
std::vector<cpJoint*> joints;
PhysicsListener* listener;
void AddUniqueJoint(std::vector<std::pair<SexyVector2, SexyVector2> >* v, const SexyVector2& start, const SexyVector2& end) const;
const std::vector<cpJoint*> GetJointsOfObject(const PhysicsObject* obj) const;
void RemoveJoint(const cpJoint* joint);
static void AllCollisions(void* ptr, void* data);
static void HashQuery(void* ptr, void* data);
static int CollFunc(cpShape *a, cpShape *b, cpContact *contacts, int numContacts, cpFloat normal_coef, void *data);
static PhysicsObject* FindObject(std::vector<PhysicsObject*>* objects, cpBody* body, cpShape* shape);
static PhysicsObject* FindObject(std::vector<PhysicsObject*>* objects, cpShape* shape);
typedef struct typed_data {
Graphics* graphics;
std::vector<PhysicsObject*>* objects;
PhysicsListener* listener;
} TypedData;
};
class PhysicsObject {
private:
PhysicsObject():body(NULL), physics(NULL), is_static(false){}
PhysicsObject(cpFloat mass, cpFloat inertia, Physics* physics, bool is_static=false);
~PhysicsObject();
friend class Physics;
friend class CollisionObject;
cpBody* body;
std::vector<cpShape*> shapes;
Physics* physics;
int colliding_shape_index;
public:
bool is_static;
//body functions
void SetMass(cpFloat m) { cpBodySetMass(body, m); }
void SetMoment(cpFloat i) { cpBodySetMoment(body, i); }
void SetAngle(cpFloat a) { cpBodySetAngle(body, a); }
void ResetForces() { cpBodyResetForces(body);}
void SetAngularVelocity(cpFloat w);
void SetVelocity(const SexyVector2& v);
void SetPosition(const SexyVector2&p) { body->p = cpv(p.x,p.y);}
void UpdatePosition();
void UpdateVelocity();
void ApplyImpulse(const SexyVector2& j, const SexyVector2& r) { cpBodyApplyImpulse(body, cpv(j.x,j.y), cpv(r.x,r.y)); }
void ApplyForce(const SexyVector2& f, const SexyVector2& r) { cpBodyApplyForce(body, cpv(f.x,f.y), cpv(r.x,r.y)); }
float GetAngle() const;
SexyVector2 GetRotation() const;
SexyVector2 GetPosition() const;
SexyVector2 GetVelocity() const;
//shape functions
void AddCircleShape(cpFloat radius, const SexyVector2& offset, cpFloat elasticity, cpFloat friction);
void AddSegmentShape(const SexyVector2& begin, const SexyVector2& end, cpFloat radius, cpFloat elasticity, cpFloat friction);
void AddPolyShape(int numVerts, SexyVector2* vectors, const SexyVector2& offset, cpFloat elasticity, cpFloat friction);
void SetCollisionType(unsigned int type, int shape_index=0);
void SetGroup(unsigned int group, int shape_index=0);
void SetLayers(unsigned int layers, int shape_index=0);
void SetData(void* data, int shape_index=0);
unsigned int GetCollisionType(int shape_index=0) const;
unsigned int GetGroup(int shape_index=0) const;
unsigned int GetLayers(int shape_index=0) const;
void* GetData(int shape_index=0) const;
int GetNumberVertices(int shape_index=0) const;
SexyVector2 GetVertex(int vertex_index, int shape_index=0) const;
SexyVector2 GetSegmentShapeBegin(int shape_index=0) const;
SexyVector2 GetSegmentShapeEnd(int shape_index=0) const;
float GetSegmentShapeRadius(int shape_index=0) const;
float GetCircleShapeRadius(int shape_index=0) const;
SexyVector2 GetCircleShapeCenter(int shape_index=0) const;
int GetShapeType(int shape_index=0) const;
int GetNumberOfShapes() const;
int GetCollidingShapeIndex() const;
enum SHAPE_TYPE {
CIRCLE_SHAPE = CP_CIRCLE_SHAPE,
SEGMENT_SHAPE,
POLY_SHAPE,
NR_SHAPE_TYPES
};
};
class CollisionPoint {
public:
CollisionPoint(const SexyVector2& point,const SexyVector2& normal, float distance):
point(point),normal(normal), distance(distance){}
~CollisionPoint(){}
SexyVector2 point;
SexyVector2 normal;
float distance;
// Calculated by cpArbiterPreStep().
SexyVector2 r1, r2;
float nMass, tMass, bounce;
// Persistant contact information.
float jnAcc, jtAcc, jBias;
float bias;
// Hash value used to (mostly) uniquely identify a contact.
uint32_t hash;
};
class CollisionObject {
public:
CollisionObject(PhysicsObject* object1, PhysicsObject* object2, const CollisionPoint* points, int num_points, float normal_coef = 1.0f):
object1(object1), object2(object2), points(points), num_points(num_points), normal_coef(normal_coef){}
~CollisionObject(){}
PhysicsObject* object1;
PhysicsObject* object2;
const CollisionPoint* points;
int num_points;
float normal_coef;
};
class Joint {
private:
Joint(cpJoint* joint, PhysicsObject* obj1, PhysicsObject* obj2, const SexyVector2& anchor1, const SexyVector2& anchor2):
joint(joint), object1(obj1), object2(obj2), anchor1(anchor1), anchor2(anchor2){}
Joint(cpJoint* joint, PhysicsObject* obj1, PhysicsObject* obj2, const SexyVector2& pivot):
joint(joint), object1(obj1), object2(obj2), pivot(pivot){}
friend class Physics;
cpJoint* joint;
PhysicsObject* object1;
PhysicsObject* object2;
SexyVector2 anchor1;
SexyVector2 anchor2;
SexyVector2 pivot;
public:
~Joint(){}
const PhysicsObject* GetPhysicsObject1() { return object1; }
const PhysicsObject* GetPhysicsObject2() { return object2; }
const SexyVector2* GetAnchor1() { if (joint->type == CP_PIN_JOINT || joint->type == CP_SLIDE_JOINT) return &anchor1; return NULL; }
const SexyVector2* GetAnchor2() { if (joint->type == CP_PIN_JOINT || joint->type == CP_SLIDE_JOINT) return &anchor2; return NULL; }
const SexyVector2* GetPivot() { if (joint->type == CP_PIVOT_JOINT) return &pivot; return NULL; }
};
};
#endif
|