chipmunk 5.3.4.5 → 6.1.3.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/chipmunk/chipmunk.c +199 -28
- data/ext/chipmunk/chipmunk.h +123 -68
- data/ext/chipmunk/chipmunk_ffi.h +129 -11
- data/ext/chipmunk/chipmunk_private.h +232 -16
- data/ext/chipmunk/chipmunk_types.h +94 -30
- data/ext/chipmunk/chipmunk_unsafe.h +12 -3
- data/ext/chipmunk/constraints/cpConstraint.h +90 -34
- data/ext/chipmunk/{cpDampedRotarySpring.h → constraints/cpDampedRotarySpring.h} +18 -8
- data/ext/chipmunk/{cpDampedSpring.h → constraints/cpDampedSpring.h} +27 -16
- data/ext/chipmunk/constraints/cpGearJoint.h +17 -7
- data/ext/chipmunk/constraints/cpGrooveJoint.h +19 -10
- data/ext/chipmunk/constraints/cpPinJoint.h +17 -8
- data/ext/chipmunk/constraints/cpPivotJoint.h +18 -9
- data/ext/chipmunk/constraints/cpRatchetJoint.h +17 -8
- data/ext/chipmunk/constraints/cpRotaryLimitJoint.h +16 -7
- data/ext/chipmunk/{cpSimpleMotor.h → constraints/cpSimpleMotor.h} +15 -6
- data/ext/chipmunk/constraints/cpSlideJoint.h +18 -9
- data/ext/chipmunk/constraints/util.h +36 -44
- data/ext/chipmunk/cpArbiter.c +159 -94
- data/ext/chipmunk/cpArbiter.h +135 -129
- data/ext/chipmunk/cpArray.c +37 -56
- data/ext/chipmunk/cpBB.c +1 -12
- data/ext/chipmunk/cpBB.h +80 -18
- data/ext/chipmunk/cpBBTree.c +891 -0
- data/ext/chipmunk/cpBody.c +185 -47
- data/ext/chipmunk/cpBody.h +156 -124
- data/ext/chipmunk/cpCollision.c +126 -115
- data/ext/chipmunk/cpConstraint.c +10 -6
- data/ext/chipmunk/cpDampedRotarySpring.c +26 -17
- data/ext/chipmunk/cpDampedSpring.c +25 -18
- data/ext/chipmunk/cpGearJoint.c +23 -17
- data/ext/chipmunk/cpGrooveJoint.c +26 -22
- data/ext/chipmunk/cpHashSet.c +51 -51
- data/ext/chipmunk/cpPinJoint.c +26 -19
- data/ext/chipmunk/cpPivotJoint.c +23 -19
- data/ext/chipmunk/cpPolyShape.c +93 -69
- data/ext/chipmunk/cpPolyShape.h +33 -69
- data/ext/chipmunk/cpRatchetJoint.c +26 -21
- data/ext/chipmunk/cpRotaryLimitJoint.c +28 -22
- data/ext/chipmunk/cpShape.c +122 -133
- data/ext/chipmunk/cpShape.h +146 -95
- data/ext/chipmunk/cpSimpleMotor.c +24 -17
- data/ext/chipmunk/cpSlideJoint.c +28 -26
- data/ext/chipmunk/cpSpace.c +251 -196
- data/ext/chipmunk/cpSpace.h +173 -103
- data/ext/chipmunk/cpSpaceComponent.c +236 -159
- data/ext/chipmunk/cpSpaceHash.c +259 -159
- data/ext/chipmunk/cpSpaceQuery.c +127 -59
- data/ext/chipmunk/cpSpaceStep.c +235 -197
- data/ext/chipmunk/cpSpatialIndex.c +69 -0
- data/ext/chipmunk/cpSpatialIndex.h +227 -0
- data/ext/chipmunk/cpSweep1D.c +254 -0
- data/ext/chipmunk/cpVect.c +11 -26
- data/ext/chipmunk/cpVect.h +76 -71
- data/ext/chipmunk/extconf.rb +4 -31
- data/ext/chipmunk/prime.h +1 -1
- data/ext/chipmunk/rb_chipmunk.c +36 -45
- data/ext/chipmunk/rb_chipmunk.h +6 -3
- data/ext/chipmunk/rb_cpArbiter.c +2 -2
- data/ext/chipmunk/rb_cpBB.c +116 -35
- data/ext/chipmunk/rb_cpBody.c +5 -12
- data/ext/chipmunk/rb_cpConstraint.c +144 -9
- data/ext/chipmunk/rb_cpShape.c +69 -78
- data/ext/chipmunk/rb_cpSpace.c +81 -76
- metadata +61 -61
- data/LICENSE +0 -22
- data/README +0 -110
- data/Rakefile +0 -102
- data/ext/chipmunk/cpArray.h +0 -49
- data/ext/chipmunk/cpCollision.h +0 -28
- data/ext/chipmunk/cpHashSet.h +0 -82
- data/ext/chipmunk/cpSpaceHash.h +0 -110
- data/lib/chipmunk.rb +0 -194
data/ext/chipmunk/cpArbiter.h
CHANGED
@@ -18,101 +18,128 @@
|
|
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
|
-
struct cpArbiter;
|
23
|
-
struct cpSpace;
|
24
|
-
struct cpCollisionHandler;
|
25
|
-
|
26
|
-
// Determines how fast penetrations resolve themselves.
|
27
|
-
extern cpFloat cp_bias_coef;
|
28
|
-
// Amount of allowed penetration. Used to reduce vibrating contacts.
|
29
|
-
extern cpFloat cp_collision_slop;
|
30
|
-
|
31
|
-
// Data structure for contact points.
|
32
|
-
typedef struct cpContact {
|
33
|
-
// Contact point and normal.
|
34
|
-
cpVect CP_PRIVATE(p), CP_PRIVATE(n);
|
35
|
-
// Penetration distance.
|
36
|
-
CP_PRIVATE(cpFloat dist);
|
37
|
-
|
38
|
-
// Calculated by cpArbiterPreStep().
|
39
|
-
cpVect CP_PRIVATE(r1), CP_PRIVATE(r2);
|
40
|
-
cpFloat CP_PRIVATE(nMass), CP_PRIVATE(tMass), CP_PRIVATE(bounce);
|
41
|
-
|
42
|
-
// Persistant contact information.
|
43
|
-
cpFloat CP_PRIVATE(jnAcc), CP_PRIVATE(jtAcc), CP_PRIVATE(jBias);
|
44
|
-
CP_PRIVATE(cpFloat bias);
|
45
|
-
|
46
|
-
// Hash value used to (mostly) uniquely identify a contact.
|
47
|
-
CP_PRIVATE(cpHashValue hash);
|
48
|
-
} cpContact;
|
49
|
-
|
50
|
-
// Contacts are always allocated in groups.
|
51
|
-
cpContact* cpContactInit(cpContact *con, cpVect p, cpVect n, cpFloat dist, cpHashValue hash);
|
52
|
-
|
53
|
-
// Sum the contact impulses. (Can be used after cpSpaceStep() returns)
|
54
|
-
cpVect CP_PRIVATE(cpContactsSumImpulses)(cpContact *contacts, int numContacts);
|
55
|
-
cpVect CP_PRIVATE(cpContactsSumImpulsesWithFriction)(cpContact *contacts, int numContacts);
|
56
|
-
|
57
|
-
#define CP_MAX_CONTACTS_PER_ARBITER 6
|
58
21
|
|
22
|
+
/// @defgroup cpArbiter cpArbiter
|
23
|
+
/// The cpArbiter struct controls pairs of colliding shapes.
|
24
|
+
/// They are also used in conjuction with collision handler callbacks
|
25
|
+
/// allowing you to retrieve information on the collision and control it.
|
26
|
+
/// @{
|
27
|
+
|
28
|
+
/// Collision begin event function callback type.
|
29
|
+
/// Returning false from a begin callback causes the collision to be ignored until
|
30
|
+
/// the the separate callback is called when the objects stop colliding.
|
31
|
+
typedef cpBool (*cpCollisionBeginFunc)(cpArbiter *arb, cpSpace *space, void *data);
|
32
|
+
/// Collision pre-solve event function callback type.
|
33
|
+
/// Returning false from a pre-step callback causes the collision to be ignored until the next step.
|
34
|
+
typedef cpBool (*cpCollisionPreSolveFunc)(cpArbiter *arb, cpSpace *space, void *data);
|
35
|
+
/// Collision post-solve event function callback type.
|
36
|
+
typedef void (*cpCollisionPostSolveFunc)(cpArbiter *arb, cpSpace *space, void *data);
|
37
|
+
/// Collision separate event function callback type.
|
38
|
+
typedef void (*cpCollisionSeparateFunc)(cpArbiter *arb, cpSpace *space, void *data);
|
39
|
+
|
40
|
+
/// @private
|
41
|
+
struct cpCollisionHandler {
|
42
|
+
cpCollisionType a;
|
43
|
+
cpCollisionType b;
|
44
|
+
cpCollisionBeginFunc begin;
|
45
|
+
cpCollisionPreSolveFunc preSolve;
|
46
|
+
cpCollisionPostSolveFunc postSolve;
|
47
|
+
cpCollisionSeparateFunc separate;
|
48
|
+
void *data;
|
49
|
+
};
|
50
|
+
|
51
|
+
typedef struct cpContact cpContact;
|
52
|
+
|
53
|
+
#define CP_MAX_CONTACTS_PER_ARBITER 4
|
54
|
+
|
55
|
+
/// @private
|
59
56
|
typedef enum cpArbiterState {
|
60
|
-
|
57
|
+
// Arbiter is active and its the first collision.
|
61
58
|
cpArbiterStateFirstColl,
|
59
|
+
// Arbiter is active and its not the first collision.
|
60
|
+
cpArbiterStateNormal,
|
61
|
+
// Collision has been explicitly ignored.
|
62
|
+
// Either by returning false from a begin collision handler or calling cpArbiterIgnore().
|
62
63
|
cpArbiterStateIgnore,
|
63
|
-
|
64
|
+
// Collison is no longer active. A space will cache an arbiter for up to cpSpace.collisionPersistence more steps.
|
64
65
|
cpArbiterStateCached,
|
65
66
|
} cpArbiterState;
|
66
67
|
|
67
|
-
|
68
|
-
|
69
|
-
//
|
70
|
-
|
71
|
-
|
68
|
+
/// @private
|
69
|
+
struct cpArbiterThread {
|
70
|
+
// Links to next and previous arbiters in the contact graph.
|
71
|
+
struct cpArbiter *next, *prev;
|
72
|
+
};
|
73
|
+
|
74
|
+
/// A colliding pair of shapes.
|
75
|
+
struct cpArbiter {
|
76
|
+
/// Calculated value to use for the elasticity coefficient.
|
77
|
+
/// Override in a pre-solve collision handler for custom behavior.
|
78
|
+
cpFloat e;
|
79
|
+
/// Calculated value to use for the friction coefficient.
|
80
|
+
/// Override in a pre-solve collision handler for custom behavior.
|
81
|
+
cpFloat u;
|
82
|
+
/// Calculated value to use for applying surface velocities.
|
83
|
+
/// Override in a pre-solve collision handler for custom behavior.
|
84
|
+
cpVect surface_vr;
|
72
85
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
cpShape CP_PRIVATE(*a), CP_PRIVATE(*b);
|
86
|
+
/// User definable data pointer.
|
87
|
+
/// The value will persist for the pair of shapes until the separate() callback is called.
|
88
|
+
/// NOTE: If you need to clean up this pointer, you should implement the separate() callback to do it.
|
89
|
+
cpDataPointer data;
|
78
90
|
|
79
|
-
|
80
|
-
|
81
|
-
CP_PRIVATE(
|
82
|
-
CP_PRIVATE(
|
83
|
-
// Used for surface_v calculations, implementation may change
|
84
|
-
CP_PRIVATE(cpVect surface_vr);
|
91
|
+
CP_PRIVATE(cpShape *a);
|
92
|
+
CP_PRIVATE(cpShape *b);
|
93
|
+
CP_PRIVATE(cpBody *body_a);
|
94
|
+
CP_PRIVATE(cpBody *body_b);
|
85
95
|
|
86
|
-
|
87
|
-
CP_PRIVATE(
|
96
|
+
CP_PRIVATE(struct cpArbiterThread thread_a);
|
97
|
+
CP_PRIVATE(struct cpArbiterThread thread_b);
|
88
98
|
|
89
|
-
CP_PRIVATE(
|
99
|
+
CP_PRIVATE(int numContacts);
|
100
|
+
CP_PRIVATE(cpContact *contacts);
|
90
101
|
|
91
|
-
|
102
|
+
CP_PRIVATE(cpTimestamp stamp);
|
103
|
+
CP_PRIVATE(cpCollisionHandler *handler);
|
92
104
|
CP_PRIVATE(cpBool swappedColl);
|
93
105
|
CP_PRIVATE(cpArbiterState state);
|
94
|
-
}
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
void CP_PRIVATE(cpArbiterUpdate)(cpArbiter *arb, cpContact *contacts, int numContacts, struct cpCollisionHandler *handler, cpShape *a, cpShape *b);
|
102
|
-
// Precalculate values used by the solver.
|
103
|
-
void CP_PRIVATE(cpArbiterPreStep)(cpArbiter *arb, cpFloat dt_inv);
|
104
|
-
void CP_PRIVATE(cpArbiterApplyCachedImpulse)(cpArbiter *arb);
|
105
|
-
// Run an iteration of the solver on the arbiter.
|
106
|
-
void CP_PRIVATE(cpArbiterApplyImpulse)(cpArbiter *arb, cpFloat eCoef);
|
107
|
-
|
108
|
-
// Arbiter Helper Functions
|
109
|
-
cpVect cpArbiterTotalImpulse(cpArbiter *arb);
|
110
|
-
cpVect cpArbiterTotalImpulseWithFriction(cpArbiter *arb);
|
111
|
-
void cpArbiterIgnore(cpArbiter *arb);
|
106
|
+
};
|
107
|
+
|
108
|
+
#define CP_DefineArbiterStructGetter(type, member, name) \
|
109
|
+
static inline type cpArbiterGet##name(const cpArbiter *arb){return arb->member;}
|
110
|
+
|
111
|
+
#define CP_DefineArbiterStructSetter(type, member, name) \
|
112
|
+
static inline void cpArbiterSet##name(cpArbiter *arb, type value){arb->member = value;}
|
112
113
|
|
114
|
+
#define CP_DefineArbiterStructProperty(type, member, name) \
|
115
|
+
CP_DefineArbiterStructGetter(type, member, name) \
|
116
|
+
CP_DefineArbiterStructSetter(type, member, name)
|
117
|
+
|
118
|
+
CP_DefineArbiterStructProperty(cpFloat, e, Elasticity)
|
119
|
+
CP_DefineArbiterStructProperty(cpFloat, u, Friction)
|
120
|
+
CP_DefineArbiterStructProperty(cpVect, surface_vr, SurfaceVelocity)
|
121
|
+
CP_DefineArbiterStructProperty(cpDataPointer, data, UserData)
|
122
|
+
|
123
|
+
/// Calculate the total impulse that was applied by this arbiter.
|
124
|
+
/// This function should only be called from a post-solve, post-step or cpBodyEachArbiter callback.
|
125
|
+
cpVect cpArbiterTotalImpulse(const cpArbiter *arb);
|
126
|
+
/// Calculate the total impulse including the friction that was applied by this arbiter.
|
127
|
+
/// This function should only be called from a post-solve, post-step or cpBodyEachArbiter callback.
|
128
|
+
cpVect cpArbiterTotalImpulseWithFriction(const cpArbiter *arb);
|
129
|
+
/// Calculate the amount of energy lost in a collision including static, but not dynamic friction.
|
130
|
+
/// This function should only be called from a post-solve, post-step or cpBodyEachArbiter callback.
|
131
|
+
cpFloat cpArbiterTotalKE(const cpArbiter *arb);
|
132
|
+
|
133
|
+
|
134
|
+
/// Causes a collision pair to be ignored as if you returned false from a begin callback.
|
135
|
+
/// If called from a pre-step callback, you will still need to return false
|
136
|
+
/// if you want it to be ignored in the current step.
|
137
|
+
void cpArbiterIgnore(cpArbiter *arb);
|
113
138
|
|
114
|
-
|
115
|
-
|
139
|
+
/// Return the colliding shapes involved for this arbiter.
|
140
|
+
/// The order of their cpSpace.collision_type values will match
|
141
|
+
/// the order set when the collision handler was registered.
|
142
|
+
static inline void cpArbiterGetShapes(const cpArbiter *arb, cpShape **a, cpShape **b)
|
116
143
|
{
|
117
144
|
if(arb->CP_PRIVATE(swappedColl)){
|
118
145
|
(*a) = arb->CP_PRIVATE(b), (*b) = arb->CP_PRIVATE(a);
|
@@ -120,69 +147,48 @@ cpArbiterGetShapes(const cpArbiter *arb, cpShape **a, cpShape **b)
|
|
120
147
|
(*a) = arb->CP_PRIVATE(a), (*b) = arb->CP_PRIVATE(b);
|
121
148
|
}
|
122
149
|
}
|
150
|
+
/// A macro shortcut for defining and retrieving the shapes from an arbiter.
|
123
151
|
#define CP_ARBITER_GET_SHAPES(arb, a, b) cpShape *a, *b; cpArbiterGetShapes(arb, &a, &b);
|
124
152
|
|
125
|
-
|
126
|
-
|
153
|
+
/// Return the colliding bodies involved for this arbiter.
|
154
|
+
/// The order of the cpSpace.collision_type the bodies are associated with values will match
|
155
|
+
/// the order set when the collision handler was registered.
|
156
|
+
static inline void cpArbiterGetBodies(const cpArbiter *arb, cpBody **a, cpBody **b)
|
127
157
|
{
|
128
158
|
CP_ARBITER_GET_SHAPES(arb, shape_a, shape_b);
|
129
159
|
(*a) = shape_a->body;
|
130
160
|
(*b) = shape_b->body;
|
131
161
|
}
|
162
|
+
/// A macro shortcut for defining and retrieving the bodies from an arbiter.
|
132
163
|
#define CP_ARBITER_GET_BODIES(arb, a, b) cpBody *a, *b; cpArbiterGetBodies(arb, &a, &b);
|
133
164
|
|
134
|
-
|
135
|
-
cpArbiterIsFirstContact(const cpArbiter *arb)
|
136
|
-
{
|
137
|
-
return arb->CP_PRIVATE(state) == cpArbiterStateFirstColl;
|
138
|
-
}
|
139
|
-
|
140
|
-
static inline int
|
141
|
-
cpArbiterGetCount(const cpArbiter *arb)
|
142
|
-
{
|
143
|
-
return arb->CP_PRIVATE(numContacts);
|
144
|
-
}
|
145
|
-
|
146
|
-
static inline cpVect
|
147
|
-
cpArbiterGetNormal(const cpArbiter *arb, int i)
|
148
|
-
{
|
149
|
-
cpVect n = arb->CP_PRIVATE(contacts)[i].CP_PRIVATE(n);
|
150
|
-
return arb->CP_PRIVATE(swappedColl) ? cpvneg(n) : n;
|
151
|
-
}
|
152
|
-
|
153
|
-
static inline cpVect
|
154
|
-
cpArbiterGetPoint(const cpArbiter *arb, int i)
|
155
|
-
{
|
156
|
-
return arb->CP_PRIVATE(contacts)[i].CP_PRIVATE(p);
|
157
|
-
}
|
158
|
-
|
159
|
-
static inline cpFloat
|
160
|
-
cpArbiteGetDepth(const cpArbiter *arb, int i)
|
161
|
-
{
|
162
|
-
return arb->CP_PRIVATE(contacts)[i].CP_PRIVATE(dist);
|
163
|
-
}
|
164
|
-
|
165
|
+
/// A struct that wraps up the important collision data for an arbiter.
|
165
166
|
typedef struct cpContactPointSet {
|
167
|
+
/// The number of contact points in the set.
|
166
168
|
int count;
|
167
169
|
|
170
|
+
/// The array of contact points.
|
168
171
|
struct {
|
169
|
-
|
172
|
+
/// The position of the contact point.
|
173
|
+
cpVect point;
|
174
|
+
/// The normal of the contact point.
|
175
|
+
cpVect normal;
|
176
|
+
/// The depth of the contact point.
|
170
177
|
cpFloat dist;
|
171
178
|
} points[CP_MAX_CONTACTS_PER_ARBITER];
|
172
179
|
} cpContactPointSet;
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
}
|
180
|
+
/// Return a contact set from an arbiter.
|
181
|
+
cpContactPointSet cpArbiterGetContactPointSet(const cpArbiter *arb);
|
182
|
+
|
183
|
+
/// Returns true if this is the first step a pair of objects started colliding.
|
184
|
+
cpBool cpArbiterIsFirstContact(const cpArbiter *arb);
|
185
|
+
/// Get the number of contact points for this arbiter.
|
186
|
+
int cpArbiterGetCount(const cpArbiter *arb);
|
187
|
+
/// Get the normal of the @c ith contact point.
|
188
|
+
cpVect cpArbiterGetNormal(const cpArbiter *arb, int i);
|
189
|
+
/// Get the position of the @c ith contact point.
|
190
|
+
cpVect cpArbiterGetPoint(const cpArbiter *arb, int i);
|
191
|
+
/// Get the depth of the @c ith contact point.
|
192
|
+
cpFloat cpArbiterGetDepth(const cpArbiter *arb, int i);
|
193
|
+
|
194
|
+
/// @}
|
data/ext/chipmunk/cpArray.c
CHANGED
@@ -19,52 +19,30 @@
|
|
19
19
|
* SOFTWARE.
|
20
20
|
*/
|
21
21
|
|
22
|
-
#include <stdlib.h>
|
23
22
|
#include <string.h>
|
24
23
|
|
25
24
|
#include "chipmunk_private.h"
|
26
25
|
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
// NOTE: cpArray is rarely used and will probably go away.
|
31
|
-
|
32
|
-
cpArray*
|
33
|
-
cpArrayAlloc(void)
|
34
|
-
{
|
35
|
-
return (cpArray *)cpcalloc(1, sizeof(cpArray));
|
36
|
-
}
|
37
|
-
|
38
|
-
cpArray*
|
39
|
-
cpArrayInit(cpArray *arr, int size)
|
27
|
+
cpArray *
|
28
|
+
cpArrayNew(int size)
|
40
29
|
{
|
41
|
-
arr
|
30
|
+
cpArray *arr = (cpArray *)cpcalloc(1, sizeof(cpArray));
|
42
31
|
|
43
|
-
|
44
|
-
arr->max = size;
|
45
|
-
arr->arr = (void **)
|
32
|
+
arr->num = 0;
|
33
|
+
arr->max = (size ? size : 4);
|
34
|
+
arr->arr = (void **)cpcalloc(arr->max, sizeof(void**));
|
46
35
|
|
47
36
|
return arr;
|
48
37
|
}
|
49
38
|
|
50
|
-
cpArray*
|
51
|
-
cpArrayNew(int size)
|
52
|
-
{
|
53
|
-
return cpArrayInit(cpArrayAlloc(), size);
|
54
|
-
}
|
55
|
-
|
56
|
-
void
|
57
|
-
cpArrayDestroy(cpArray *arr)
|
58
|
-
{
|
59
|
-
cpfree(arr->arr);
|
60
|
-
arr->arr = NULL;
|
61
|
-
}
|
62
|
-
|
63
39
|
void
|
64
40
|
cpArrayFree(cpArray *arr)
|
65
41
|
{
|
66
42
|
if(arr){
|
67
|
-
|
43
|
+
cpfree(arr->arr);
|
44
|
+
arr->arr = NULL;
|
45
|
+
|
68
46
|
cpfree(arr);
|
69
47
|
}
|
70
48
|
}
|
@@ -92,45 +70,48 @@ cpArrayPop(cpArray *arr)
|
|
92
70
|
return value;
|
93
71
|
}
|
94
72
|
|
95
|
-
void
|
96
|
-
cpArrayDeleteIndex(cpArray *arr, int idx)
|
97
|
-
{
|
98
|
-
arr->num--;
|
99
|
-
|
100
|
-
arr->arr[idx] = arr->arr[arr->num];
|
101
|
-
arr->arr[arr->num] = NULL;
|
102
|
-
}
|
73
|
+
//static void
|
74
|
+
//cpArrayDeleteIndex(cpArray *arr, int idx)
|
75
|
+
//{
|
76
|
+
// arr->num--;
|
77
|
+
//
|
78
|
+
// arr->arr[idx] = arr->arr[arr->num];
|
79
|
+
// arr->arr[arr->num] = NULL;
|
80
|
+
//}
|
103
81
|
|
104
82
|
void
|
105
83
|
cpArrayDeleteObj(cpArray *arr, void *obj)
|
106
84
|
{
|
107
85
|
for(int i=0; i<arr->num; i++){
|
108
86
|
if(arr->arr[i] == obj){
|
109
|
-
|
87
|
+
arr->num--;
|
88
|
+
|
89
|
+
arr->arr[i] = arr->arr[arr->num];
|
90
|
+
arr->arr[arr->num] = NULL;
|
91
|
+
|
110
92
|
return;
|
111
93
|
}
|
112
94
|
}
|
113
95
|
}
|
114
96
|
|
115
|
-
void
|
116
|
-
cpArrayAppend(cpArray *arr, cpArray *other)
|
117
|
-
{
|
118
|
-
void *tail = &arr->arr[arr->num];
|
119
|
-
|
120
|
-
arr->num += other->num;
|
121
|
-
if(arr->num >= arr->max){
|
122
|
-
arr->max = arr->num;
|
123
|
-
arr->arr = (void **)cprealloc(arr->arr, arr->max*sizeof(void**));
|
124
|
-
}
|
125
|
-
|
126
|
-
memcpy(tail, other->arr, other->num*sizeof(void**));
|
127
|
-
}
|
97
|
+
//void
|
98
|
+
//cpArrayAppend(cpArray *arr, cpArray *other)
|
99
|
+
//{
|
100
|
+
// void *tail = &arr->arr[arr->num];
|
101
|
+
//
|
102
|
+
// arr->num += other->num;
|
103
|
+
// if(arr->num >= arr->max){
|
104
|
+
// arr->max = arr->num;
|
105
|
+
// arr->arr = (void **)cprealloc(arr->arr, arr->max*sizeof(void**));
|
106
|
+
// }
|
107
|
+
//
|
108
|
+
// memcpy(tail, other->arr, other->num*sizeof(void**));
|
109
|
+
//}
|
128
110
|
|
129
111
|
void
|
130
|
-
|
112
|
+
cpArrayFreeEach(cpArray *arr, void (freeFunc)(void*))
|
131
113
|
{
|
132
|
-
for(int i=0; i<arr->num; i++)
|
133
|
-
iterFunc(arr->arr[i], data);
|
114
|
+
for(int i=0; i<arr->num; i++) freeFunc(arr->arr[i]);
|
134
115
|
}
|
135
116
|
|
136
117
|
cpBool
|
data/ext/chipmunk/cpBB.c
CHANGED
@@ -19,18 +19,7 @@
|
|
19
19
|
* SOFTWARE.
|
20
20
|
*/
|
21
21
|
|
22
|
-
#include
|
23
|
-
#include <stdlib.h>
|
24
|
-
|
25
|
-
#include "chipmunk.h"
|
26
|
-
|
27
|
-
cpVect
|
28
|
-
cpBBClampVect(const cpBB bb, const cpVect v)
|
29
|
-
{
|
30
|
-
cpFloat x = cpfmin(cpfmax(bb.l, v.x), bb.r);
|
31
|
-
cpFloat y = cpfmin(cpfmax(bb.b, v.y), bb.t);
|
32
|
-
return cpv(x, y);
|
33
|
-
}
|
22
|
+
#include "chipmunk_private.h"
|
34
23
|
|
35
24
|
cpVect
|
36
25
|
cpBBWrapVect(const cpBB bb, const cpVect v)
|