chipmunk 4.1.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README +60 -0
- data/Rakefile +47 -40
- data/ext/chipmunk/chipmunk.c +39 -3
- data/ext/chipmunk/cpArbiter.c +91 -80
- data/ext/chipmunk/cpArray.c +24 -10
- data/ext/chipmunk/cpBB.c +5 -4
- data/ext/chipmunk/cpBody.c +30 -22
- data/ext/chipmunk/cpCollision.c +54 -53
- data/ext/chipmunk/cpConstraint.c +54 -0
- data/ext/chipmunk/cpDampedRotarySpring.c +106 -0
- data/ext/chipmunk/cpDampedSpring.c +117 -0
- data/ext/chipmunk/cpGearJoint.c +114 -0
- data/ext/chipmunk/cpGrooveJoint.c +138 -0
- data/ext/chipmunk/cpHashSet.c +74 -40
- data/ext/chipmunk/cpPinJoint.c +117 -0
- data/ext/chipmunk/cpPivotJoint.c +114 -0
- data/ext/chipmunk/cpPolyShape.c +117 -15
- data/ext/chipmunk/cpRatchetJoint.c +128 -0
- data/ext/chipmunk/cpRotaryLimitJoint.c +122 -0
- data/ext/chipmunk/cpShape.c +174 -18
- data/ext/chipmunk/cpSimpleMotor.c +99 -0
- data/ext/chipmunk/cpSlideJoint.c +131 -0
- data/ext/chipmunk/cpSpace.c +584 -215
- data/ext/chipmunk/cpSpaceHash.c +191 -105
- data/ext/chipmunk/cpVect.c +18 -10
- data/ext/chipmunk/extconf.rb +34 -4
- data/ext/chipmunk/{chipmunk.h → include/chipmunk/chipmunk.h} +63 -6
- data/ext/chipmunk/include/chipmunk/chipmunk_ffi.h +42 -0
- data/ext/chipmunk/include/chipmunk/chipmunk_types.h +80 -0
- data/ext/chipmunk/include/chipmunk/chipmunk_unsafe.h +54 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpConstraint.h +92 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpDampedRotarySpring.h +46 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpDampedSpring.h +53 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpGearJoint.h +41 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpGrooveJoint.h +44 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpPinJoint.h +43 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpPivotJoint.h +42 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpRatchetJoint.h +40 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpRotaryLimitJoint.h +39 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpSimpleMotor.h +37 -0
- data/ext/chipmunk/include/chipmunk/constraints/cpSlideJoint.h +44 -0
- data/ext/chipmunk/include/chipmunk/constraints/util.h +116 -0
- data/ext/chipmunk/{cpArbiter.h → include/chipmunk/cpArbiter.h} +66 -15
- data/ext/chipmunk/{cpArray.h → include/chipmunk/cpArray.h} +2 -1
- data/ext/chipmunk/{cpBB.h → include/chipmunk/cpBB.h} +21 -0
- data/ext/chipmunk/{cpBody.h → include/chipmunk/cpBody.h} +37 -9
- data/ext/chipmunk/{cpCollision.h → include/chipmunk/cpCollision.h} +1 -1
- data/ext/chipmunk/{cpHashSet.h → include/chipmunk/cpHashSet.h} +12 -9
- data/ext/chipmunk/{cpPolyShape.h → include/chipmunk/cpPolyShape.h} +13 -2
- data/ext/chipmunk/{cpShape.h → include/chipmunk/cpShape.h} +51 -18
- data/ext/chipmunk/include/chipmunk/cpSpace.h +180 -0
- data/ext/chipmunk/{cpSpaceHash.h → include/chipmunk/cpSpaceHash.h} +18 -9
- data/ext/chipmunk/{cpVect.h → include/chipmunk/cpVect.h} +61 -10
- data/ext/chipmunk/prime.h +32 -32
- data/ext/chipmunk/rb_chipmunk.c +125 -109
- data/ext/chipmunk/rb_chipmunk.h +96 -77
- data/ext/chipmunk/rb_cpArbiter.c +225 -0
- data/ext/chipmunk/rb_cpBB.c +174 -154
- data/ext/chipmunk/rb_cpBody.c +347 -239
- data/ext/chipmunk/rb_cpConstraint.c +346 -0
- data/ext/chipmunk/rb_cpShape.c +455 -292
- data/ext/chipmunk/rb_cpSpace.c +544 -330
- data/ext/chipmunk/rb_cpVect.c +321 -250
- data/lib/chipmunk.rb +28 -15
- data/lib/chipmunk/version.rb +3 -0
- metadata +74 -34
- data/ext/chipmunk/cpJoint.c +0 -553
- data/ext/chipmunk/cpJoint.h +0 -122
- data/ext/chipmunk/cpSpace.h +0 -120
- data/ext/chipmunk/rb_cpJoint.c +0 -136
@@ -0,0 +1,180 @@
|
|
1
|
+
/* Copyright (c) 2007 Scott Lembcke
|
2
|
+
*
|
3
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
* of this software and associated documentation files (the "Software"), to deal
|
5
|
+
* in the Software without restriction, including without limitation the rights
|
6
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
* copies of the Software, and to permit persons to whom the Software is
|
8
|
+
* furnished to do so, subject to the following conditions:
|
9
|
+
*
|
10
|
+
* The above copyright notice and this permission notice shall be included in
|
11
|
+
* all copies or substantial portions of the Software.
|
12
|
+
*
|
13
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
* SOFTWARE.
|
20
|
+
*/
|
21
|
+
|
22
|
+
struct cpSpace;
|
23
|
+
|
24
|
+
// Number of frames that contact information should persist.
|
25
|
+
extern int cp_contact_persistence;
|
26
|
+
|
27
|
+
// User collision handler function types.
|
28
|
+
typedef int (*cpCollisionBeginFunc)(cpArbiter *arb, struct cpSpace *space, void *data);
|
29
|
+
typedef int (*cpCollisionPreSolveFunc)(cpArbiter *arb, struct cpSpace *space, void *data);
|
30
|
+
typedef void (*cpCollisionPostSolveFunc)(cpArbiter *arb, struct cpSpace *space, void *data);
|
31
|
+
typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, struct cpSpace *space, void *data);
|
32
|
+
|
33
|
+
// Structure for holding collision pair function information.
|
34
|
+
// Used internally.
|
35
|
+
typedef struct cpCollisionHandler {
|
36
|
+
cpCollisionType a;
|
37
|
+
cpCollisionType b;
|
38
|
+
cpCollisionBeginFunc begin;
|
39
|
+
cpCollisionPreSolveFunc preSolve;
|
40
|
+
cpCollisionPostSolveFunc postSolve;
|
41
|
+
cpCollisionSeparateFunc separate;
|
42
|
+
void *data;
|
43
|
+
} cpCollisionHandler;
|
44
|
+
|
45
|
+
#define CP_MAX_CONTACTS_PER_ARBITER 6
|
46
|
+
typedef struct cpContactBufferHeader {
|
47
|
+
int stamp;
|
48
|
+
struct cpContactBufferHeader *next;
|
49
|
+
unsigned int numContacts;
|
50
|
+
} cpContactBufferHeader;
|
51
|
+
|
52
|
+
typedef struct cpSpace{
|
53
|
+
// *** User definable fields
|
54
|
+
|
55
|
+
// Number of iterations to use in the impulse solver to solve contacts.
|
56
|
+
int iterations;
|
57
|
+
|
58
|
+
// Number of iterations to use in the impulse solver to solve elastic collisions.
|
59
|
+
int elasticIterations;
|
60
|
+
|
61
|
+
// Default gravity to supply when integrating rigid body motions.
|
62
|
+
cpVect gravity;
|
63
|
+
|
64
|
+
// Default damping to supply when integrating rigid body motions.
|
65
|
+
cpFloat damping;
|
66
|
+
|
67
|
+
// *** Internally Used Fields
|
68
|
+
|
69
|
+
// When the space is locked, you should not add or remove objects;
|
70
|
+
int locked;
|
71
|
+
|
72
|
+
// Time stamp. Is incremented on every call to cpSpaceStep().
|
73
|
+
int stamp;
|
74
|
+
|
75
|
+
// The static and active shape spatial hashes.
|
76
|
+
cpSpaceHash *staticShapes;
|
77
|
+
cpSpaceHash *activeShapes;
|
78
|
+
|
79
|
+
// List of bodies in the system.
|
80
|
+
cpArray *bodies;
|
81
|
+
|
82
|
+
// List of active arbiters for the impulse solver.
|
83
|
+
cpArray *arbiters, *pooledArbiters;
|
84
|
+
|
85
|
+
// Linked list ring of contact buffers.
|
86
|
+
// Head is the current buffer. Tail is the oldest buffer.
|
87
|
+
// The list points in the direction of tail->head.
|
88
|
+
cpContactBufferHeader *contactBuffersHead, *contactBuffersTail;
|
89
|
+
|
90
|
+
// List of buffers to be free()ed when destroying the space.
|
91
|
+
cpArray *allocatedBuffers;
|
92
|
+
|
93
|
+
// Persistant contact set.
|
94
|
+
cpHashSet *contactSet;
|
95
|
+
|
96
|
+
// List of constraints in the system.
|
97
|
+
cpArray *constraints;
|
98
|
+
|
99
|
+
// Set of collisionpair functions.
|
100
|
+
cpHashSet *collFuncSet;
|
101
|
+
// Default collision handler.
|
102
|
+
cpCollisionHandler defaultHandler;
|
103
|
+
|
104
|
+
cpHashSet *postStepCallbacks;
|
105
|
+
} cpSpace;
|
106
|
+
|
107
|
+
// Basic allocation/destruction functions.
|
108
|
+
cpSpace* cpSpaceAlloc(void);
|
109
|
+
cpSpace* cpSpaceInit(cpSpace *space);
|
110
|
+
cpSpace* cpSpaceNew(void);
|
111
|
+
|
112
|
+
void cpSpaceDestroy(cpSpace *space);
|
113
|
+
void cpSpaceFree(cpSpace *space);
|
114
|
+
|
115
|
+
// Convenience function. Frees all referenced entities. (bodies, shapes and constraints)
|
116
|
+
void cpSpaceFreeChildren(cpSpace *space);
|
117
|
+
|
118
|
+
// Collision handler management functions.
|
119
|
+
void cpSpaceSetDefaultCollisionHandler(
|
120
|
+
cpSpace *space,
|
121
|
+
cpCollisionBeginFunc begin,
|
122
|
+
cpCollisionPreSolveFunc preSolve,
|
123
|
+
cpCollisionPostSolveFunc postSolve,
|
124
|
+
cpCollisionSeparateFunc separate,
|
125
|
+
void *data
|
126
|
+
);
|
127
|
+
void cpSpaceAddCollisionHandler(
|
128
|
+
cpSpace *space,
|
129
|
+
cpCollisionType a, cpCollisionType b,
|
130
|
+
cpCollisionBeginFunc begin,
|
131
|
+
cpCollisionPreSolveFunc preSolve,
|
132
|
+
cpCollisionPostSolveFunc postSolve,
|
133
|
+
cpCollisionSeparateFunc separate,
|
134
|
+
void *data
|
135
|
+
);
|
136
|
+
void cpSpaceRemoveCollisionHandler(cpSpace *space, cpCollisionType a, cpCollisionType b);
|
137
|
+
|
138
|
+
// Add and remove entities from the system.
|
139
|
+
cpShape *cpSpaceAddShape(cpSpace *space, cpShape *shape);
|
140
|
+
cpShape *cpSpaceAddStaticShape(cpSpace *space, cpShape *shape);
|
141
|
+
cpBody *cpSpaceAddBody(cpSpace *space, cpBody *body);
|
142
|
+
cpConstraint *cpSpaceAddConstraint(cpSpace *space, cpConstraint *constraint);
|
143
|
+
|
144
|
+
void cpSpaceRemoveShape(cpSpace *space, cpShape *shape);
|
145
|
+
void cpSpaceRemoveStaticShape(cpSpace *space, cpShape *shape);
|
146
|
+
void cpSpaceRemoveBody(cpSpace *space, cpBody *body);
|
147
|
+
void cpSpaceRemoveConstraint(cpSpace *space, cpConstraint *constraint);
|
148
|
+
|
149
|
+
// Post Step function definition
|
150
|
+
typedef void (*cpPostStepFunc)(cpSpace *space, void *obj, void *data);
|
151
|
+
// Register a post step function to be called after cpSpaceStep() has finished.
|
152
|
+
// obj is used a key, you can only register one callback per unique value for obj
|
153
|
+
void cpSpaceAddPostStepCallback(cpSpace *space, cpPostStepFunc func, void *obj, void *data);
|
154
|
+
|
155
|
+
// Point query callback function
|
156
|
+
typedef void (*cpSpacePointQueryFunc)(cpShape *shape, void *data);
|
157
|
+
void cpSpacePointQuery(cpSpace *space, cpVect point, cpLayers layers, cpGroup group, cpSpacePointQueryFunc func, void *data);
|
158
|
+
cpShape *cpSpacePointQueryFirst(cpSpace *space, cpVect point, cpLayers layers, cpGroup group);
|
159
|
+
|
160
|
+
// Segment query callback function
|
161
|
+
typedef void (*cpSpaceSegmentQueryFunc)(cpShape *shape, cpFloat t, cpVect n, void *data);
|
162
|
+
int cpSpaceSegmentQuery(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, cpSpaceSegmentQueryFunc func, void *data);
|
163
|
+
cpShape *cpSpaceSegmentQueryFirst(cpSpace *space, cpVect start, cpVect end, cpLayers layers, cpGroup group, cpSegmentQueryInfo *out);
|
164
|
+
|
165
|
+
// BB query callback function
|
166
|
+
typedef void (*cpSpaceBBQueryFunc)(cpShape *shape, void *data);
|
167
|
+
void cpSpaceBBQuery(cpSpace *space, cpBB bb, cpLayers layers, cpGroup group, cpSpaceBBQueryFunc func, void *data);
|
168
|
+
|
169
|
+
|
170
|
+
// Iterator function for iterating the bodies in a space.
|
171
|
+
typedef void (*cpSpaceBodyIterator)(cpBody *body, void *data);
|
172
|
+
void cpSpaceEachBody(cpSpace *space, cpSpaceBodyIterator func, void *data);
|
173
|
+
|
174
|
+
// Spatial hash management functions.
|
175
|
+
void cpSpaceResizeStaticHash(cpSpace *space, cpFloat dim, int count);
|
176
|
+
void cpSpaceResizeActiveHash(cpSpace *space, cpFloat dim, int count);
|
177
|
+
void cpSpaceRehashStatic(cpSpace *space);
|
178
|
+
|
179
|
+
// Update the space.
|
180
|
+
void cpSpaceStep(cpSpace *space, cpFloat dt);
|
@@ -51,13 +51,16 @@ typedef struct cpSpaceHash{
|
|
51
51
|
// BBox callback.
|
52
52
|
cpSpaceHashBBFunc bbfunc;
|
53
53
|
|
54
|
-
// Hashset of
|
54
|
+
// Hashset of the handles and the recycled ones.
|
55
55
|
cpHashSet *handleSet;
|
56
|
+
cpArray *pooledHandles;
|
57
|
+
|
58
|
+
// The table and the recycled bins.
|
59
|
+
cpSpaceHashBin **table, *pooledBins;
|
60
|
+
|
61
|
+
// list of buffers to free on destruction.
|
62
|
+
cpArray *allocatedBuffers;
|
56
63
|
|
57
|
-
cpSpaceHashBin **table;
|
58
|
-
// List of recycled bins.
|
59
|
-
cpSpaceHashBin *bins;
|
60
|
-
|
61
64
|
// Incremented on each query. See cpHandle.stamp.
|
62
65
|
int stamp;
|
63
66
|
} cpSpaceHash;
|
@@ -74,9 +77,9 @@ void cpSpaceHashFree(cpSpaceHash *hash);
|
|
74
77
|
void cpSpaceHashResize(cpSpaceHash *hash, cpFloat celldim, int numcells);
|
75
78
|
|
76
79
|
// Add an object to the hash.
|
77
|
-
void cpSpaceHashInsert(cpSpaceHash *hash, void *obj,
|
80
|
+
void cpSpaceHashInsert(cpSpaceHash *hash, void *obj, cpHashValue id, cpBB bb);
|
78
81
|
// Remove an object from the hash.
|
79
|
-
void cpSpaceHashRemove(cpSpaceHash *hash, void *obj,
|
82
|
+
void cpSpaceHashRemove(cpSpaceHash *hash, void *obj, cpHashValue id);
|
80
83
|
|
81
84
|
// Iterator function
|
82
85
|
typedef void (*cpSpaceHashIterator)(void *obj, void *data);
|
@@ -86,10 +89,10 @@ void cpSpaceHashEach(cpSpaceHash *hash, cpSpaceHashIterator func, void *data);
|
|
86
89
|
// Rehash the contents of the hash.
|
87
90
|
void cpSpaceHashRehash(cpSpaceHash *hash);
|
88
91
|
// Rehash only a specific object.
|
89
|
-
void cpSpaceHashRehashObject(cpSpaceHash *hash, void *obj,
|
92
|
+
void cpSpaceHashRehashObject(cpSpaceHash *hash, void *obj, cpHashValue id);
|
90
93
|
|
91
94
|
// Query callback.
|
92
|
-
typedef
|
95
|
+
typedef void (*cpSpaceHashQueryFunc)(void *obj1, void *obj2, void *data);
|
93
96
|
// Point query the hash. A reference to the query point is passed as obj1 to the query callback.
|
94
97
|
void cpSpaceHashPointQuery(cpSpaceHash *hash, cpVect point, cpSpaceHashQueryFunc func, void *data);
|
95
98
|
// Query the hash for a given BBox.
|
@@ -98,3 +101,9 @@ void cpSpaceHashQuery(cpSpaceHash *hash, void *obj, cpBB bb, cpSpaceHashQueryFun
|
|
98
101
|
void cpSpaceHashQueryInsert(cpSpaceHash *hash, void *obj, cpBB bb, cpSpaceHashQueryFunc func, void *data);
|
99
102
|
// Rehashes while querying for each object. (Optimized case)
|
100
103
|
void cpSpaceHashQueryRehash(cpSpaceHash *hash, cpSpaceHashQueryFunc func, void *data);
|
104
|
+
|
105
|
+
// Segment Query callback.
|
106
|
+
// Return value is uesd for early exits of the query.
|
107
|
+
// If while traversing the grid, the raytrace function detects that an entire grid cell is beyond the hit point, it will stop the trace.
|
108
|
+
typedef cpFloat (*cpSpaceHashSegmentQueryFunc)(void *obj1, void *obj2, void *data);
|
109
|
+
void cpSpaceHashSegmentQuery(cpSpaceHash *hash, void *obj, cpVect a, cpVect b, cpFloat t_exit, cpSpaceHashSegmentQueryFunc func, void *data);
|
@@ -18,10 +18,6 @@
|
|
18
18
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
19
|
* SOFTWARE.
|
20
20
|
*/
|
21
|
-
|
22
|
-
typedef struct cpVect{
|
23
|
-
cpFloat x,y;
|
24
|
-
} cpVect;
|
25
21
|
|
26
22
|
static const cpVect cpvzero={0.0f,0.0f};
|
27
23
|
|
@@ -32,6 +28,14 @@ cpv(const cpFloat x, const cpFloat y)
|
|
32
28
|
return v;
|
33
29
|
}
|
34
30
|
|
31
|
+
// non-inlined functions
|
32
|
+
cpFloat cpvlength(const cpVect v);
|
33
|
+
cpVect cpvslerp(const cpVect v1, const cpVect v2, const cpFloat t);
|
34
|
+
cpVect cpvslerpconst(const cpVect v1, const cpVect v2, const cpFloat a);
|
35
|
+
cpVect cpvforangle(const cpFloat a); // convert radians to a normalized vector
|
36
|
+
cpFloat cpvtoangle(const cpVect v); // convert a vector to radians
|
37
|
+
char *cpvstr(const cpVect v); // get a string representation of a vector
|
38
|
+
|
35
39
|
static inline cpVect
|
36
40
|
cpvadd(const cpVect v1, const cpVect v2)
|
37
41
|
{
|
@@ -98,9 +102,56 @@ cpvunrotate(const cpVect v1, const cpVect v2)
|
|
98
102
|
return cpv(v1.x*v2.x + v1.y*v2.y, v1.y*v2.x - v1.x*v2.y);
|
99
103
|
}
|
100
104
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
105
|
+
static inline cpFloat
|
106
|
+
cpvlengthsq(const cpVect v)
|
107
|
+
{
|
108
|
+
return cpvdot(v, v);
|
109
|
+
}
|
110
|
+
|
111
|
+
static inline cpVect
|
112
|
+
cpvlerp(const cpVect v1, const cpVect v2, const cpFloat t)
|
113
|
+
{
|
114
|
+
return cpvadd(cpvmult(v1, 1.0f - t), cpvmult(v2, t));
|
115
|
+
}
|
116
|
+
|
117
|
+
static inline cpVect
|
118
|
+
cpvnormalize(const cpVect v)
|
119
|
+
{
|
120
|
+
return cpvmult(v, 1.0f/cpvlength(v));
|
121
|
+
}
|
122
|
+
|
123
|
+
static inline cpVect
|
124
|
+
cpvnormalize_safe(const cpVect v)
|
125
|
+
{
|
126
|
+
return (v.x == 0.0f && v.y == 0.0f ? cpvzero : cpvnormalize(v));
|
127
|
+
}
|
128
|
+
|
129
|
+
static inline cpVect
|
130
|
+
cpvclamp(const cpVect v, const cpFloat len)
|
131
|
+
{
|
132
|
+
return (cpvdot(v,v) > len*len) ? cpvmult(cpvnormalize(v), len) : v;
|
133
|
+
}
|
134
|
+
|
135
|
+
static inline cpVect
|
136
|
+
cpvlerpconst(cpVect v1, cpVect v2, cpFloat d)
|
137
|
+
{
|
138
|
+
return cpvadd(v1, cpvclamp(cpvsub(v2, v1), d));
|
139
|
+
}
|
140
|
+
|
141
|
+
static inline cpFloat
|
142
|
+
cpvdist(const cpVect v1, const cpVect v2)
|
143
|
+
{
|
144
|
+
return cpvlength(cpvsub(v1, v2));
|
145
|
+
}
|
146
|
+
|
147
|
+
static inline cpFloat
|
148
|
+
cpvdistsq(const cpVect v1, const cpVect v2)
|
149
|
+
{
|
150
|
+
return cpvlengthsq(cpvsub(v1, v2));
|
151
|
+
}
|
152
|
+
|
153
|
+
static inline int
|
154
|
+
cpvnear(const cpVect v1, const cpVect v2, const cpFloat dist)
|
155
|
+
{
|
156
|
+
return cpvdistsq(v1, v2) < dist*dist;
|
157
|
+
}
|
data/ext/chipmunk/prime.h
CHANGED
@@ -21,47 +21,47 @@
|
|
21
21
|
|
22
22
|
// Used for resizing hash tables.
|
23
23
|
// Values approximately double.
|
24
|
-
|
24
|
+
// http://planetmath.org/encyclopedia/GoodHashTablePrimes.html
|
25
25
|
static int primes[] = {
|
26
|
-
5,
|
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
|
-
|
26
|
+
5,
|
27
|
+
13,
|
28
|
+
23,
|
29
|
+
47,
|
30
|
+
97,
|
31
|
+
193,
|
32
|
+
389,
|
33
|
+
769,
|
34
|
+
1543,
|
35
|
+
3079,
|
36
|
+
6151,
|
37
|
+
12289,
|
38
|
+
24593,
|
39
|
+
49157,
|
40
|
+
98317,
|
41
|
+
196613,
|
42
|
+
393241,
|
43
|
+
786433,
|
44
|
+
1572869,
|
45
|
+
3145739,
|
46
|
+
6291469,
|
47
|
+
12582917,
|
48
|
+
25165843,
|
49
|
+
50331653,
|
50
|
+
100663319,
|
51
|
+
201326611,
|
52
|
+
402653189,
|
53
|
+
805306457,
|
54
|
+
1610612741,
|
55
55
|
0,
|
56
56
|
};
|
57
57
|
|
58
|
-
static int
|
58
|
+
static inline int
|
59
59
|
next_prime(int n)
|
60
60
|
{
|
61
61
|
int i = 0;
|
62
62
|
while(n > primes[i]){
|
63
63
|
i++;
|
64
|
-
|
64
|
+
cpAssert(primes[i], "Tried to resize a hash table to a size greater than 1610612741 O_o"); // realistically this should never happen
|
65
65
|
}
|
66
66
|
|
67
67
|
return primes[i];
|
data/ext/chipmunk/rb_chipmunk.c
CHANGED
@@ -1,109 +1,125 @@
|
|
1
|
-
/* Copyright (c) 2007 Scott Lembcke
|
2
|
-
*
|
3
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
-
* of this software and associated documentation files (the "Software"), to deal
|
5
|
-
* in the Software without restriction, including without limitation the rights
|
6
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
-
* copies of the Software, and to permit persons to whom the Software is
|
8
|
-
* furnished to do so, subject to the following conditions:
|
9
|
-
*
|
10
|
-
* The above copyright notice and this permission notice shall be included in
|
11
|
-
* all copies or substantial portions of the Software.
|
12
|
-
*
|
13
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
-
* SOFTWARE.
|
20
|
-
*/
|
21
|
-
|
22
|
-
#include
|
23
|
-
|
24
|
-
#include "
|
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
|
-
|
1
|
+
/* Copyright (c) 2007 Scott Lembcke
|
2
|
+
*
|
3
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
* of this software and associated documentation files (the "Software"), to deal
|
5
|
+
* in the Software without restriction, including without limitation the rights
|
6
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
* copies of the Software, and to permit persons to whom the Software is
|
8
|
+
* furnished to do so, subject to the following conditions:
|
9
|
+
*
|
10
|
+
* The above copyright notice and this permission notice shall be included in
|
11
|
+
* all copies or substantial portions of the Software.
|
12
|
+
*
|
13
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
* SOFTWARE.
|
20
|
+
*/
|
21
|
+
|
22
|
+
#include <stdlib.h>
|
23
|
+
|
24
|
+
#include "chipmunk.h"
|
25
|
+
|
26
|
+
#include "ruby.h"
|
27
|
+
#include "rb_chipmunk.h"
|
28
|
+
|
29
|
+
VALUE m_Chipmunk;
|
30
|
+
|
31
|
+
ID id_parent;
|
32
|
+
|
33
|
+
static VALUE
|
34
|
+
rb_get_cp_bias_coef(VALUE self)
|
35
|
+
{
|
36
|
+
return rb_float_new(cp_bias_coef);
|
37
|
+
}
|
38
|
+
|
39
|
+
static VALUE
|
40
|
+
rb_set_cp_bias_coef(VALUE self, VALUE num)
|
41
|
+
{
|
42
|
+
cp_bias_coef = NUM2DBL(num);
|
43
|
+
return num;
|
44
|
+
}
|
45
|
+
|
46
|
+
static VALUE
|
47
|
+
rb_get_cp_collision_slop(VALUE self)
|
48
|
+
{
|
49
|
+
return rb_float_new(cp_collision_slop);
|
50
|
+
}
|
51
|
+
|
52
|
+
static VALUE
|
53
|
+
rb_set_cp_collision_slop(VALUE self, VALUE num)
|
54
|
+
{
|
55
|
+
cp_collision_slop = NUM2DBL(num);
|
56
|
+
return num;
|
57
|
+
}
|
58
|
+
|
59
|
+
static VALUE
|
60
|
+
rb_momentForCircle(VALUE self, VALUE m, VALUE r1, VALUE r2, VALUE offset)
|
61
|
+
{
|
62
|
+
cpFloat i = cpMomentForCircle(NUM2DBL(m), NUM2DBL(r1), NUM2DBL(r2), *VGET(offset));
|
63
|
+
return rb_float_new(i);
|
64
|
+
}
|
65
|
+
|
66
|
+
static VALUE
|
67
|
+
rb_momentForPoly(VALUE self, VALUE m, VALUE arr, VALUE offset)
|
68
|
+
{
|
69
|
+
Check_Type(arr, T_ARRAY);
|
70
|
+
int numVerts = RARRAY_LEN(arr);
|
71
|
+
VALUE *ary_ptr = RARRAY_PTR(arr);
|
72
|
+
cpVect verts[numVerts];
|
73
|
+
|
74
|
+
for(int i=0; i<numVerts; i++)
|
75
|
+
verts[i] = *VGET(ary_ptr[i]);
|
76
|
+
|
77
|
+
cpFloat inertia = cpMomentForPoly(NUM2DBL(m), numVerts, verts, *VGET(offset));
|
78
|
+
return rb_float_new(inertia);
|
79
|
+
}
|
80
|
+
|
81
|
+
static VALUE
|
82
|
+
rb_momentForSegment(VALUE self, VALUE m, VALUE a, VALUE b)
|
83
|
+
{
|
84
|
+
cpFloat i = cpMomentForSegment(NUM2DBL(m), *VGET(a), *VGET(b));
|
85
|
+
return rb_float_new(i);
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
void
|
90
|
+
Init_chipmunk(void)
|
91
|
+
{
|
92
|
+
id_parent = rb_intern("parent");
|
93
|
+
|
94
|
+
cpInitChipmunk();
|
95
|
+
|
96
|
+
rb_eval_string("Float::INFINITY = 1.0/0.0");
|
97
|
+
|
98
|
+
m_Chipmunk = rb_define_module("CP");
|
99
|
+
rb_define_module_function(m_Chipmunk, "bias_coef",
|
100
|
+
rb_get_cp_bias_coef, 0);
|
101
|
+
rb_define_module_function(m_Chipmunk, "bias_coef=",
|
102
|
+
rb_set_cp_bias_coef, 1);
|
103
|
+
rb_define_module_function(m_Chipmunk, "collision_slop",
|
104
|
+
rb_get_cp_collision_slop, 0);
|
105
|
+
rb_define_module_function(m_Chipmunk, "collision_slop=",
|
106
|
+
rb_set_cp_collision_slop, 1);
|
107
|
+
rb_define_module_function(m_Chipmunk, "moment_for_circle",
|
108
|
+
rb_momentForCircle, 4);
|
109
|
+
rb_define_module_function(m_Chipmunk, "moment_for_poly",
|
110
|
+
rb_momentForPoly, 3);
|
111
|
+
rb_define_module_function(m_Chipmunk, "moment_for_segment",
|
112
|
+
rb_momentForSegment, 3);
|
113
|
+
rb_define_const(m_Chipmunk, "INFINITY", rb_float_new(INFINITY));
|
114
|
+
rb_define_const(m_Chipmunk, "VERSION" ,
|
115
|
+
rb_str_new2(cpVersionString));
|
116
|
+
|
117
|
+
Init_cpVect();
|
118
|
+
Init_cpArbiter();
|
119
|
+
Init_cpBB();
|
120
|
+
Init_cpBody();
|
121
|
+
Init_cpShape();
|
122
|
+
Init_cpConstraint();
|
123
|
+
Init_cpSpace();
|
124
|
+
|
125
|
+
}
|