chipmunk 5.3.4.0-x86-mingw32 → 5.3.4.2-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- data/README +33 -13
- data/Rakefile +20 -7
- data/ext/chipmunk/extconf.rb +55 -12
- data/ext/chipmunk/rb_chipmunk.c +92 -98
- data/ext/chipmunk/rb_chipmunk.h +44 -34
- data/ext/chipmunk/rb_cpArbiter.c +135 -98
- data/ext/chipmunk/rb_cpBB.c +84 -101
- data/ext/chipmunk/rb_cpBody.c +219 -241
- data/ext/chipmunk/rb_cpConstraint.c +173 -185
- data/ext/chipmunk/rb_cpShape.c +347 -251
- data/ext/chipmunk/rb_cpSpace.c +376 -408
- data/ext/chipmunk/rb_cpVect.c +132 -170
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/chipmunk.h +163 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/chipmunk_ffi.h +59 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/chipmunk_private.h +49 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/chipmunk_types.h +151 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/chipmunk_unsafe.h +54 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpConstraint.h +105 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpDampedRotarySpring.h +46 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpDampedSpring.h +53 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpGearJoint.h +41 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpGrooveJoint.h +48 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpPinJoint.h +43 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpPivotJoint.h +42 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpRatchetJoint.h +40 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpRotaryLimitJoint.h +39 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpSimpleMotor.h +37 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/cpSlideJoint.h +44 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/constraints/util.h +134 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpArbiter.h +188 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpArray.h +49 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpBB.h +74 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpBody.h +219 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpCollision.h +28 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpHashSet.h +82 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpPolyShape.h +103 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpShape.h +177 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpSpace.h +206 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpSpaceHash.h +110 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/include/chipmunk/cpVect.h +207 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/chipmunk.c +151 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpConstraint.c +54 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpDampedRotarySpring.c +105 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpDampedSpring.c +115 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpGearJoint.c +113 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpGrooveJoint.c +161 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpPinJoint.c +116 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpPivotJoint.c +114 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpRatchetJoint.c +126 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpRotaryLimitJoint.c +120 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpSimpleMotor.c +97 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/constraints/cpSlideJoint.c +129 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpArbiter.c +280 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpArray.c +143 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpBB.c +47 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpBody.c +192 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpCollision.c +411 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpHashSet.c +253 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpPolyShape.c +240 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpShape.c +405 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpSpace.c +499 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpSpaceComponent.c +279 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpSpaceHash.c +534 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpSpaceQuery.c +246 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpSpaceStep.c +398 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/cpVect.c +71 -0
- data/ext/chipmunk/vendor/chipmunk-5.3.4/src/prime.h +68 -0
- data/lib/1.9/chipmunk.so +0 -0
- data/lib/chipmunk.rb +19 -8
- metadata +84 -42
- data/lib/1.8/chipmunk.so +0 -0
data/ext/chipmunk/rb_chipmunk.h
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
/* Copyright (c) 2007 Scott Lembcke
|
2
|
-
*
|
2
|
+
*
|
3
3
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
* of this software and associated documentation files (the "Software"), to deal
|
5
5
|
* in the Software without restriction, including without limitation the rights
|
6
6
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
7
|
* copies of the Software, and to permit persons to whom the Software is
|
8
8
|
* furnished to do so, subject to the following conditions:
|
9
|
-
*
|
9
|
+
*
|
10
10
|
* The above copyright notice and this permission notice shall be included in
|
11
11
|
* all copies or substantial portions of the Software.
|
12
|
-
*
|
12
|
+
*
|
13
13
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
14
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
15
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
@@ -18,7 +18,7 @@
|
|
18
18
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
19
|
* SOFTWARE.
|
20
20
|
*/
|
21
|
-
|
21
|
+
|
22
22
|
extern VALUE m_Chipmunk;
|
23
23
|
|
24
24
|
extern VALUE c_cpVect;
|
@@ -37,39 +37,37 @@ extern VALUE c_cpSegmentQueryInfo;
|
|
37
37
|
extern ID id_parent;
|
38
38
|
|
39
39
|
static inline VALUE
|
40
|
-
VNEW(cpVect v)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
return Data_Wrap_Struct(c_cpVect, NULL, free, ptr);
|
40
|
+
VNEW(cpVect v) {
|
41
|
+
cpVect *ptr = malloc(sizeof(cpVect));
|
42
|
+
*ptr = v;
|
43
|
+
return Data_Wrap_Struct(c_cpVect, NULL, free, ptr);
|
45
44
|
}
|
46
45
|
|
47
46
|
static inline VALUE
|
48
|
-
VWRAP(VALUE parent, cpVect *v)
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
return vec_obj;
|
47
|
+
VWRAP(VALUE parent, cpVect *v) {
|
48
|
+
VALUE vec_obj = Data_Wrap_Struct(c_cpVect, NULL, NULL, v);
|
49
|
+
rb_ivar_set(vec_obj, id_parent, parent);
|
50
|
+
|
51
|
+
return vec_obj;
|
54
52
|
}
|
55
53
|
|
56
|
-
#define GETTER_TEMPLATE(func_name, klass, type)\
|
57
|
-
static inline type
|
58
|
-
func_name(VALUE self)\
|
59
|
-
{\
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
}\
|
68
|
-
|
69
|
-
GETTER_TEMPLATE(VGET
|
70
|
-
GETTER_TEMPLATE(BBGET, c_cpBB
|
71
|
-
GETTER_TEMPLATE(BODY
|
72
|
-
GETTER_TEMPLATE(STATICBODY
|
54
|
+
#define GETTER_TEMPLATE(func_name, klass, type) \
|
55
|
+
static inline type * \
|
56
|
+
func_name(VALUE self) \
|
57
|
+
{ \
|
58
|
+
if(!rb_obj_is_kind_of(self, klass)) { \
|
59
|
+
VALUE klass_name = rb_funcall(klass, rb_intern("to_s"), 0); \
|
60
|
+
rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)", rb_obj_classname(self), StringValuePtr(klass_name)); \
|
61
|
+
} \
|
62
|
+
type *ptr = NULL; \
|
63
|
+
Data_Get_Struct(self, type, ptr); \
|
64
|
+
return ptr; \
|
65
|
+
} \
|
66
|
+
|
67
|
+
GETTER_TEMPLATE(VGET, c_cpVect, cpVect )
|
68
|
+
GETTER_TEMPLATE(BBGET, c_cpBB, cpBB )
|
69
|
+
GETTER_TEMPLATE(BODY, c_cpBody, cpBody )
|
70
|
+
GETTER_TEMPLATE(STATICBODY, c_cpStaticBody, cpBody)
|
73
71
|
GETTER_TEMPLATE(SHAPE, m_cpShape, cpShape)
|
74
72
|
GETTER_TEMPLATE(CONSTRAINT, m_cpConstraint, cpConstraint)
|
75
73
|
GETTER_TEMPLATE(SPACE, c_cpSpace, cpSpace)
|
@@ -79,9 +77,21 @@ GETTER_TEMPLATE(ARBITER, c_cpArbiter, cpArbiter)
|
|
79
77
|
// Helper to wrap cpArbter objects.
|
80
78
|
VALUE ARBWRAP(cpArbiter *arb);
|
81
79
|
|
80
|
+
// Like vget, but returns a zero vector if value is nil, and
|
81
|
+
// it also does not need to be dereferenced.
|
82
|
+
static inline cpVect
|
83
|
+
VGET_ZERO(VALUE value) {
|
84
|
+
if(NIL_P(value)) return cpvzero;
|
85
|
+
return *VGET(value);
|
86
|
+
}
|
87
|
+
|
82
88
|
//Helper that allocates and initializes a SegmenQueryInfo struct
|
83
89
|
VALUE rb_cpSegmentQueryInfoNew(VALUE shape, VALUE t, VALUE n);
|
84
90
|
|
91
|
+
// Helper that allocates and initializes a ContactPoint struct.
|
92
|
+
VALUE rb_cpContactPointNew(VALUE point, VALUE normal, VALUE dist);
|
93
|
+
|
94
|
+
|
85
95
|
void Init_chipmunk(void);
|
86
96
|
void Init_cpVect();
|
87
97
|
void Init_cpBB();
|
@@ -95,9 +105,9 @@ void Init_cpArbiter(void);
|
|
95
105
|
#define CP_BOOL_INT(VAL) (((VAL) == Qnil) || ((VAL) == Qfalse) ? 0 : 1)
|
96
106
|
|
97
107
|
// transforms a C value (pointer or int) to Qtrue of Qfalse
|
98
|
-
// For consistency with
|
108
|
+
// For consistency with CP_BOOL_INT.
|
99
109
|
#define CP_INT_BOOL(VAL) ((VAL) ? Qtrue : Qfalse)
|
100
|
-
|
110
|
+
|
101
111
|
|
102
112
|
|
103
113
|
|
data/ext/chipmunk/rb_cpArbiter.c
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
/* Copyright (c) 2010 Beoran (beoran@rubyforge.org)
|
2
|
-
*
|
2
|
+
*
|
3
3
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
4
|
* of this software and associated documentation files (the "Software"), to deal
|
5
5
|
* in the Software without restriction, including without limitation the rights
|
6
6
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
7
|
* copies of the Software, and to permit persons to whom the Software is
|
8
8
|
* furnished to do so, subject to the following conditions:
|
9
|
-
*
|
9
|
+
*
|
10
10
|
* The above copyright notice and this permission notice shall be included in
|
11
11
|
* all copies or substantial portions of the Software.
|
12
|
-
*
|
12
|
+
*
|
13
13
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
14
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
15
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
@@ -28,65 +28,64 @@
|
|
28
28
|
VALUE c_cpArbiter;
|
29
29
|
|
30
30
|
/*
|
31
|
-
* I quote the C docs on cpArbiter:
|
32
|
-
* Memory Management
|
33
|
-
* You should never need to create an arbiter, nor will you ever need to free
|
34
|
-
* one as they are handled by the space. More importantly, because they are
|
35
|
-
* handled by the space you should never hold onto a reference to an arbiter as
|
36
|
-
* you don't know when they will be destroyed. Use them within the callback
|
37
|
-
* where they are given to you and then forget about them or copy out the
|
38
|
-
* information you need from them.
|
39
|
-
*
|
40
|
-
* This means that Arbiter doesn't need an initialize, and also
|
41
|
-
* does NOT need any garbage collection.
|
42
|
-
*/
|
43
|
-
|
44
|
-
VALUE
|
45
|
-
{
|
31
|
+
* I quote the C docs on cpArbiter:
|
32
|
+
* Memory Management
|
33
|
+
* You should never need to create an arbiter, nor will you ever need to free
|
34
|
+
* one as they are handled by the space. More importantly, because they are
|
35
|
+
* handled by the space you should never hold onto a reference to an arbiter as
|
36
|
+
* you don't know when they will be destroyed. Use them within the callback
|
37
|
+
* where they are given to you and then forget about them or copy out the
|
38
|
+
* information you need from them.
|
39
|
+
*
|
40
|
+
* This means that Arbiter doesn't need an initialize, and also
|
41
|
+
* does NOT need any garbage collection.
|
42
|
+
*/
|
43
|
+
|
44
|
+
VALUE
|
45
|
+
ARBWRAP(cpArbiter *arb) {
|
46
46
|
return Data_Wrap_Struct(c_cpArbiter, NULL, NULL, arb);
|
47
47
|
}
|
48
48
|
|
49
49
|
|
50
50
|
/*
|
51
|
-
static VALUE
|
52
|
-
rb_cpArbiterAlloc(VALUE klass)
|
53
|
-
{
|
54
|
-
|
55
|
-
|
56
|
-
}
|
57
|
-
|
58
|
-
|
59
|
-
static VALUE
|
60
|
-
rb_cpArbiterInitialize(VALUE self, VALUE a, VALUE b, VALUE r, VALUE t)
|
61
|
-
{
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
}
|
68
|
-
*/
|
51
|
+
static VALUE
|
52
|
+
rb_cpArbiterAlloc(VALUE klass)
|
53
|
+
{
|
54
|
+
cpArbiter *arb = cpArbiterAlloc();
|
55
|
+
return Data_Wrap_Struct(klass, NULL, cpArbiterFree, arb);
|
56
|
+
}
|
57
|
+
|
58
|
+
|
59
|
+
static VALUE
|
60
|
+
rb_cpArbiterInitialize(VALUE self, VALUE a, VALUE b, VALUE r, VALUE t)
|
61
|
+
{
|
62
|
+
cpArbiter *arb = ARBITER(self);
|
63
|
+
cpShape *sa = SHAPE(a);
|
64
|
+
cpShape *sb = SHAPE(b);
|
65
|
+
cpArbiterInit(arb, sa, sb);
|
66
|
+
return self;
|
67
|
+
}
|
68
|
+
*/
|
69
69
|
|
70
70
|
static VALUE
|
71
71
|
rb_cpArbiterTotalImpulse(VALUE self) {
|
72
|
-
cpArbiter *arb = ARBITER(self);
|
72
|
+
cpArbiter *arb = ARBITER(self);
|
73
73
|
return VNEW(cpArbiterTotalImpulse(arb));
|
74
74
|
}
|
75
75
|
|
76
76
|
static VALUE
|
77
77
|
rb_cpArbiterTotalImpulseWithFriction(VALUE self) {
|
78
|
-
cpArbiter *arb = ARBITER(self);
|
78
|
+
cpArbiter *arb = ARBITER(self);
|
79
79
|
return VNEW(cpArbiterTotalImpulseWithFriction(arb));
|
80
80
|
}
|
81
81
|
|
82
82
|
static VALUE
|
83
|
-
rb_cpArbiterGetImpulse(int argc, VALUE *argv, VALUE self)
|
84
|
-
{
|
83
|
+
rb_cpArbiterGetImpulse(int argc, VALUE *argv, VALUE self) {
|
85
84
|
VALUE friction = Qnil;
|
86
85
|
rb_scan_args(argc, argv, "01", &friction);
|
87
86
|
if (NIL_P(friction) || friction == Qnil) {
|
88
87
|
return rb_cpArbiterTotalImpulse(self);
|
89
|
-
}
|
88
|
+
}
|
90
89
|
/* Here, it's with friction */
|
91
90
|
return rb_cpArbiterTotalImpulseWithFriction(self);
|
92
91
|
}
|
@@ -102,66 +101,75 @@ rb_cpArbiterIgnore(VALUE self) {
|
|
102
101
|
static VALUE
|
103
102
|
rb_cpArbiterGetShapes(VALUE self) {
|
104
103
|
cpArbiter *arb = ARBITER(self);
|
105
|
-
CP_ARBITER_GET_SHAPES(arb, a, b)
|
104
|
+
CP_ARBITER_GET_SHAPES(arb, a, b)
|
105
|
+
return rb_ary_new3(2, (VALUE)a->data, (VALUE)b->data);
|
106
|
+
}
|
107
|
+
|
108
|
+
static VALUE
|
109
|
+
rb_cpArbiterGetBodies(VALUE self) {
|
110
|
+
cpArbiter *arb = ARBITER(self);
|
111
|
+
CP_ARBITER_GET_BODIES(arb, a, b)
|
106
112
|
return rb_ary_new3(2, (VALUE)a->data, (VALUE)b->data);
|
107
113
|
}
|
108
114
|
|
115
|
+
|
109
116
|
static VALUE
|
110
117
|
rb_cpArbiterGetA(VALUE self) {
|
111
118
|
cpArbiter *arb = ARBITER(self);
|
112
|
-
CP_ARBITER_GET_SHAPES(arb, a, b)
|
119
|
+
CP_ARBITER_GET_SHAPES(arb, a, b)
|
113
120
|
return (VALUE)a->data;
|
114
121
|
}
|
115
122
|
|
116
123
|
static VALUE
|
117
124
|
rb_cpArbiterGetB(VALUE self) {
|
118
125
|
cpArbiter *arb = ARBITER(self);
|
119
|
-
CP_ARBITER_GET_SHAPES(arb, a, b)
|
126
|
+
CP_ARBITER_GET_SHAPES(arb, a, b)
|
120
127
|
return (VALUE)b->data;
|
121
128
|
}
|
122
129
|
|
123
|
-
static VALUE
|
130
|
+
static VALUE
|
124
131
|
rb_cpArbiterGetE(VALUE self) {
|
125
132
|
return rb_float_new(ARBITER(self)->e);
|
126
|
-
}
|
127
|
-
|
128
|
-
static VALUE
|
133
|
+
}
|
134
|
+
|
135
|
+
static VALUE
|
129
136
|
rb_cpArbiterSetE(VALUE self, VALUE e) {
|
130
137
|
ARBITER(self)->e = NUM2DBL(e);
|
131
138
|
return e;
|
132
|
-
}
|
139
|
+
}
|
133
140
|
|
134
|
-
static VALUE
|
141
|
+
static VALUE
|
135
142
|
rb_cpArbiterGetCount(VALUE self) {
|
136
143
|
return INT2NUM(cpArbiterGetCount(ARBITER(self)));
|
137
|
-
}
|
138
|
-
|
139
|
-
static VALUE
|
144
|
+
}
|
145
|
+
|
146
|
+
static VALUE
|
140
147
|
rb_cpArbiterGetU(VALUE self) {
|
141
148
|
return rb_float_new(ARBITER(self)->u);
|
142
|
-
}
|
149
|
+
}
|
143
150
|
|
144
|
-
static VALUE
|
151
|
+
static VALUE
|
145
152
|
rb_cpArbiterSetU(VALUE self, VALUE u) {
|
146
153
|
ARBITER(self)->u = NUM2DBL(u);
|
147
154
|
return u;
|
148
|
-
}
|
155
|
+
}
|
149
156
|
|
150
157
|
static VALUE
|
151
158
|
rb_cpArbiterIsFirstContact(VALUE self) {
|
152
|
-
int
|
153
|
-
return
|
159
|
+
int b = cpArbiterIsFirstContact(ARBITER(self));
|
160
|
+
return b ? Qtrue : Qfalse;
|
154
161
|
}
|
155
162
|
|
156
|
-
static int
|
157
|
-
|
158
|
-
|
163
|
+
static int
|
164
|
+
arbiterBadIndex(cpArbiter *arb, int i) {
|
165
|
+
return ((i < 0) || (i >= cpArbiterGetCount(arb)));
|
166
|
+
}
|
159
167
|
|
160
168
|
|
161
169
|
static VALUE
|
162
170
|
rb_cpArbiterGetNormal(VALUE self, VALUE index) {
|
163
171
|
cpArbiter *arb = ARBITER(self);
|
164
|
-
int i =
|
172
|
+
int i = NUM2INT(index);
|
165
173
|
if (arbiterBadIndex(arb, i)) {
|
166
174
|
rb_raise(rb_eIndexError, "No such normal.");
|
167
175
|
}
|
@@ -171,17 +179,17 @@ rb_cpArbiterGetNormal(VALUE self, VALUE index) {
|
|
171
179
|
static VALUE
|
172
180
|
rb_cpArbiterGetPoint(VALUE self, VALUE index) {
|
173
181
|
cpArbiter *arb = ARBITER(self);
|
174
|
-
int i =
|
182
|
+
int i = NUM2INT(index);
|
175
183
|
if (arbiterBadIndex(arb, i)) {
|
176
184
|
rb_raise(rb_eIndexError, "No such contact point.");
|
177
|
-
}
|
185
|
+
}
|
178
186
|
return VNEW(cpArbiterGetPoint(arb, i));
|
179
187
|
}
|
180
188
|
|
181
189
|
static VALUE
|
182
190
|
rb_cpArbiterGetDepth(VALUE self, VALUE index) {
|
183
191
|
cpArbiter *arb = ARBITER(self);
|
184
|
-
int i =
|
192
|
+
int i = NUM2INT(index);
|
185
193
|
if (arbiterBadIndex(arb, i)) {
|
186
194
|
rb_raise(rb_eIndexError, "No such depth.");
|
187
195
|
}
|
@@ -191,19 +199,17 @@ rb_cpArbiterGetDepth(VALUE self, VALUE index) {
|
|
191
199
|
|
192
200
|
|
193
201
|
static VALUE
|
194
|
-
rb_cpArbiterToString(VALUE self)
|
195
|
-
{
|
202
|
+
rb_cpArbiterToString(VALUE self) {
|
196
203
|
char str[256];
|
197
|
-
cpArbiter *arb = ARBITER(self);
|
198
|
-
sprintf(str, "#<CP::Arbiter:%p>", arb);
|
204
|
+
cpArbiter *arb = ARBITER(self);
|
205
|
+
sprintf(str, "#<CP::Arbiter:%p>", arb);
|
199
206
|
return rb_str_new2(str);
|
200
207
|
}
|
201
208
|
|
202
|
-
static VALUE
|
203
|
-
rb_cpArbiterEachContact(VALUE self)
|
204
|
-
{
|
209
|
+
static VALUE
|
210
|
+
rb_cpArbiterEachContact(VALUE self) {
|
205
211
|
cpArbiter *arb = ARBITER(self);
|
206
|
-
int i
|
212
|
+
int i = 0;
|
207
213
|
for( i = 0; i < cpArbiterGetCount(arb); i++) {
|
208
214
|
VALUE index = INT2NUM(i);
|
209
215
|
VALUE contact, normal;
|
@@ -211,43 +217,74 @@ rb_cpArbiterEachContact(VALUE self)
|
|
211
217
|
contact = rb_cpArbiterGetPoint(self, index);
|
212
218
|
/* Yield an array of contact and normal */
|
213
219
|
rb_yield(rb_ary_new3(2, contact, normal));
|
214
|
-
}
|
220
|
+
}
|
215
221
|
return self;
|
216
222
|
}
|
217
223
|
|
224
|
+
VALUE c_cpContactPoint;
|
225
|
+
|
226
|
+
// Helper that allocates and initializes a ContactPoint struct.
|
227
|
+
VALUE
|
228
|
+
rb_cpContactPointNew(VALUE point, VALUE normal, VALUE dist) {
|
229
|
+
return rb_struct_new(c_cpContactPoint, point, normal, dist);
|
230
|
+
}
|
231
|
+
|
232
|
+
VALUE
|
233
|
+
rb_cpArbiterGetContactPointSet(VALUE arbiter) {
|
234
|
+
cpArbiter * arb = ARBITER(arbiter);
|
235
|
+
cpContactPointSet set = cpArbiterGetContactPointSet(arb);
|
236
|
+
VALUE result = rb_ary_new();
|
237
|
+
for(int index = 0; index < set.count; index++) {
|
238
|
+
VALUE point = VNEW(set.points[index].point);
|
239
|
+
VALUE normal = VNEW(set.points[index].normal);
|
240
|
+
VALUE dist = DBL2NUM(set.points[index].dist);
|
241
|
+
VALUE contact = rb_cpContactPointNew(point, normal, dist);
|
242
|
+
rb_ary_push(result, contact);
|
243
|
+
}
|
244
|
+
return result;
|
245
|
+
}
|
246
|
+
|
218
247
|
|
219
248
|
|
220
249
|
void
|
221
|
-
Init_cpArbiter(void)
|
222
|
-
{
|
250
|
+
Init_cpArbiter(void) {
|
223
251
|
c_cpArbiter = rb_define_class_under(m_Chipmunk, "Arbiter", rb_cObject);
|
224
|
-
/*
|
225
|
-
|
226
|
-
|
227
|
-
|
252
|
+
/*
|
253
|
+
rb_define_alloc_func(c_cpArbiter, rb_cpArbiterAlloc);
|
254
|
+
rb_define_method(c_cpArbiter , "initialize", rb_cpArbiterInitialize, 2);
|
255
|
+
*/
|
228
256
|
rb_define_method(c_cpArbiter, "a", rb_cpArbiterGetA, 0);
|
229
|
-
rb_define_method(c_cpArbiter, "b", rb_cpArbiterGetB, 0);
|
230
|
-
rb_define_method(c_cpArbiter, "e"
|
231
|
-
rb_define_method(c_cpArbiter, "u"
|
257
|
+
rb_define_method(c_cpArbiter, "b", rb_cpArbiterGetB, 0);
|
258
|
+
rb_define_method(c_cpArbiter, "e", rb_cpArbiterGetE, 0);
|
259
|
+
rb_define_method(c_cpArbiter, "u", rb_cpArbiterGetU, 0);
|
232
260
|
rb_define_method(c_cpArbiter, "e=", rb_cpArbiterSetE, 1);
|
233
261
|
rb_define_method(c_cpArbiter, "u=", rb_cpArbiterSetU, 1);
|
234
262
|
|
235
|
-
rb_define_method(c_cpArbiter, "point"
|
236
|
-
rb_define_method(c_cpArbiter, "normal"
|
237
|
-
rb_define_method(c_cpArbiter, "
|
238
|
-
rb_define_method(c_cpArbiter, "impulse"
|
239
|
-
|
263
|
+
rb_define_method(c_cpArbiter, "point", rb_cpArbiterGetPoint, 1);
|
264
|
+
rb_define_method(c_cpArbiter, "normal", rb_cpArbiterGetNormal, 1);
|
265
|
+
rb_define_method(c_cpArbiter, "depth" , rb_cpArbiterGetDepth, 1);
|
266
|
+
rb_define_method(c_cpArbiter, "impulse", rb_cpArbiterGetImpulse, -1);
|
267
|
+
|
240
268
|
rb_define_method(c_cpArbiter, "to_s", rb_cpArbiterToString, 0);
|
241
|
-
|
269
|
+
|
242
270
|
rb_define_method(c_cpArbiter, "first_contact?", rb_cpArbiterIsFirstContact, 0);
|
243
|
-
rb_define_method(c_cpArbiter, "count"
|
244
|
-
rb_define_method(c_cpArbiter, "contacts"
|
245
|
-
rb_define_method(c_cpArbiter, "size"
|
246
|
-
rb_define_method(c_cpArbiter, "length"
|
247
|
-
rb_define_method(c_cpArbiter, "each_contact"
|
248
|
-
|
249
|
-
rb_define_method(c_cpArbiter, "shapes"
|
271
|
+
rb_define_method(c_cpArbiter, "count", rb_cpArbiterGetCount, 0);
|
272
|
+
rb_define_method(c_cpArbiter, "contacts", rb_cpArbiterGetCount, 0);
|
273
|
+
rb_define_method(c_cpArbiter, "size", rb_cpArbiterGetCount, 0);
|
274
|
+
rb_define_method(c_cpArbiter, "length", rb_cpArbiterGetCount, 0);
|
275
|
+
rb_define_method(c_cpArbiter, "each_contact", rb_cpArbiterEachContact, 0);
|
276
|
+
|
277
|
+
rb_define_method(c_cpArbiter, "shapes", rb_cpArbiterGetShapes, 0);
|
278
|
+
rb_define_method(c_cpArbiter, "bodies", rb_cpArbiterGetBodies, 0);
|
250
279
|
/* Ignore is new in the 5.x API, I think. */
|
251
|
-
rb_define_method(c_cpArbiter, "ignore"
|
252
|
-
|
280
|
+
rb_define_method(c_cpArbiter, "ignore", rb_cpArbiterIgnore, 0);
|
281
|
+
rb_define_method(c_cpArbiter, "points", rb_cpArbiterGetContactPointSet, 0);
|
282
|
+
|
283
|
+
|
284
|
+
/* Use a struct for this small class. More efficient. */
|
285
|
+
c_cpContactPoint = rb_struct_define("ContactPoint",
|
286
|
+
"point", "normal", "dist", NULL);
|
287
|
+
rb_define_const(m_Chipmunk, "ContactPoint", c_cpContactPoint);
|
288
|
+
|
289
|
+
|
253
290
|
}
|