chipmunk 5.3.4.5 → 6.1.3.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|