chipmunk 4.1.0 → 5.2.0

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.
Files changed (71) hide show
  1. data/LICENSE +20 -0
  2. data/README +60 -0
  3. data/Rakefile +47 -40
  4. data/ext/chipmunk/chipmunk.c +39 -3
  5. data/ext/chipmunk/cpArbiter.c +91 -80
  6. data/ext/chipmunk/cpArray.c +24 -10
  7. data/ext/chipmunk/cpBB.c +5 -4
  8. data/ext/chipmunk/cpBody.c +30 -22
  9. data/ext/chipmunk/cpCollision.c +54 -53
  10. data/ext/chipmunk/cpConstraint.c +54 -0
  11. data/ext/chipmunk/cpDampedRotarySpring.c +106 -0
  12. data/ext/chipmunk/cpDampedSpring.c +117 -0
  13. data/ext/chipmunk/cpGearJoint.c +114 -0
  14. data/ext/chipmunk/cpGrooveJoint.c +138 -0
  15. data/ext/chipmunk/cpHashSet.c +74 -40
  16. data/ext/chipmunk/cpPinJoint.c +117 -0
  17. data/ext/chipmunk/cpPivotJoint.c +114 -0
  18. data/ext/chipmunk/cpPolyShape.c +117 -15
  19. data/ext/chipmunk/cpRatchetJoint.c +128 -0
  20. data/ext/chipmunk/cpRotaryLimitJoint.c +122 -0
  21. data/ext/chipmunk/cpShape.c +174 -18
  22. data/ext/chipmunk/cpSimpleMotor.c +99 -0
  23. data/ext/chipmunk/cpSlideJoint.c +131 -0
  24. data/ext/chipmunk/cpSpace.c +584 -215
  25. data/ext/chipmunk/cpSpaceHash.c +191 -105
  26. data/ext/chipmunk/cpVect.c +18 -10
  27. data/ext/chipmunk/extconf.rb +34 -4
  28. data/ext/chipmunk/{chipmunk.h → include/chipmunk/chipmunk.h} +63 -6
  29. data/ext/chipmunk/include/chipmunk/chipmunk_ffi.h +42 -0
  30. data/ext/chipmunk/include/chipmunk/chipmunk_types.h +80 -0
  31. data/ext/chipmunk/include/chipmunk/chipmunk_unsafe.h +54 -0
  32. data/ext/chipmunk/include/chipmunk/constraints/cpConstraint.h +92 -0
  33. data/ext/chipmunk/include/chipmunk/constraints/cpDampedRotarySpring.h +46 -0
  34. data/ext/chipmunk/include/chipmunk/constraints/cpDampedSpring.h +53 -0
  35. data/ext/chipmunk/include/chipmunk/constraints/cpGearJoint.h +41 -0
  36. data/ext/chipmunk/include/chipmunk/constraints/cpGrooveJoint.h +44 -0
  37. data/ext/chipmunk/include/chipmunk/constraints/cpPinJoint.h +43 -0
  38. data/ext/chipmunk/include/chipmunk/constraints/cpPivotJoint.h +42 -0
  39. data/ext/chipmunk/include/chipmunk/constraints/cpRatchetJoint.h +40 -0
  40. data/ext/chipmunk/include/chipmunk/constraints/cpRotaryLimitJoint.h +39 -0
  41. data/ext/chipmunk/include/chipmunk/constraints/cpSimpleMotor.h +37 -0
  42. data/ext/chipmunk/include/chipmunk/constraints/cpSlideJoint.h +44 -0
  43. data/ext/chipmunk/include/chipmunk/constraints/util.h +116 -0
  44. data/ext/chipmunk/{cpArbiter.h → include/chipmunk/cpArbiter.h} +66 -15
  45. data/ext/chipmunk/{cpArray.h → include/chipmunk/cpArray.h} +2 -1
  46. data/ext/chipmunk/{cpBB.h → include/chipmunk/cpBB.h} +21 -0
  47. data/ext/chipmunk/{cpBody.h → include/chipmunk/cpBody.h} +37 -9
  48. data/ext/chipmunk/{cpCollision.h → include/chipmunk/cpCollision.h} +1 -1
  49. data/ext/chipmunk/{cpHashSet.h → include/chipmunk/cpHashSet.h} +12 -9
  50. data/ext/chipmunk/{cpPolyShape.h → include/chipmunk/cpPolyShape.h} +13 -2
  51. data/ext/chipmunk/{cpShape.h → include/chipmunk/cpShape.h} +51 -18
  52. data/ext/chipmunk/include/chipmunk/cpSpace.h +180 -0
  53. data/ext/chipmunk/{cpSpaceHash.h → include/chipmunk/cpSpaceHash.h} +18 -9
  54. data/ext/chipmunk/{cpVect.h → include/chipmunk/cpVect.h} +61 -10
  55. data/ext/chipmunk/prime.h +32 -32
  56. data/ext/chipmunk/rb_chipmunk.c +125 -109
  57. data/ext/chipmunk/rb_chipmunk.h +96 -77
  58. data/ext/chipmunk/rb_cpArbiter.c +225 -0
  59. data/ext/chipmunk/rb_cpBB.c +174 -154
  60. data/ext/chipmunk/rb_cpBody.c +347 -239
  61. data/ext/chipmunk/rb_cpConstraint.c +346 -0
  62. data/ext/chipmunk/rb_cpShape.c +455 -292
  63. data/ext/chipmunk/rb_cpSpace.c +544 -330
  64. data/ext/chipmunk/rb_cpVect.c +321 -250
  65. data/lib/chipmunk.rb +28 -15
  66. data/lib/chipmunk/version.rb +3 -0
  67. metadata +74 -34
  68. data/ext/chipmunk/cpJoint.c +0 -553
  69. data/ext/chipmunk/cpJoint.h +0 -122
  70. data/ext/chipmunk/cpSpace.h +0 -120
  71. data/ext/chipmunk/rb_cpJoint.c +0 -136
@@ -19,39 +19,47 @@
19
19
  * SOFTWARE.
20
20
  */
21
21
 
22
- #include "stdio.h"
23
- #include "math.h"
22
+ #include <stdio.h>
23
+ #include <math.h>
24
24
 
25
25
  #include "chipmunk.h"
26
26
 
27
27
  cpFloat
28
28
  cpvlength(const cpVect v)
29
29
  {
30
- return sqrtf( cpvdot(v, v) );
30
+ return cpfsqrt( cpvdot(v, v) );
31
31
  }
32
32
 
33
- cpFloat
34
- cpvlengthsq(const cpVect v)
33
+ inline cpVect
34
+ cpvslerp(const cpVect v1, const cpVect v2, const cpFloat t)
35
35
  {
36
- return cpvdot(v, v);
36
+ cpFloat omega = cpfacos(cpvdot(v1, v2));
37
+
38
+ if(omega){
39
+ cpFloat denom = 1.0f/cpfsin(omega);
40
+ return cpvadd(cpvmult(v1, cpfsin((1.0f - t)*omega)*denom), cpvmult(v2, cpfsin(t*omega)*denom));
41
+ } else {
42
+ return v1;
43
+ }
37
44
  }
38
45
 
39
46
  cpVect
40
- cpvnormalize(const cpVect v)
47
+ cpvslerpconst(const cpVect v1, const cpVect v2, const cpFloat a)
41
48
  {
42
- return cpvmult( v, 1.0f/cpvlength(v) );
49
+ cpFloat angle = cpfacos(cpvdot(v1, v2));
50
+ return cpvslerp(v1, v2, cpfmin(a, angle)/angle);
43
51
  }
44
52
 
45
53
  cpVect
46
54
  cpvforangle(const cpFloat a)
47
55
  {
48
- return cpv(cos(a), sin(a));
56
+ return cpv(cpfcos(a), cpfsin(a));
49
57
  }
50
58
 
51
59
  cpFloat
52
60
  cpvtoangle(const cpVect v)
53
61
  {
54
- return atan2(v.y, v.x);
62
+ return cpfatan2(v.y, v.x);
55
63
  }
56
64
 
57
65
  char*
@@ -1,4 +1,34 @@
1
- require 'mkmf'
2
-
3
- $CFLAGS += ' -std=gnu99 -ffast-math'
4
- create_makefile('chipmunk')
1
+ require 'mkmf'
2
+
3
+ #dir_config('chipmunk')
4
+
5
+ # CHIPMUNK_HEADER = 'chipmunk.h'
6
+ # CHIPMUNK_NAME = 'chipmunk'
7
+ # CHIPMUNK_FUNCTION = 'cpMomentForPoly'
8
+ # CHIPMUNK_INCLUDE = ['/usr/include',
9
+ # '/usr/local/include',
10
+ # '/usr/include/chipmunk',
11
+ # '/usr/local/include/chipmunk'
12
+ # ]
13
+ # CHIPMUNK_LIBDIR = ['/usr/lib', '/usr/local/lib']
14
+
15
+ # find_header(CHIPMUNK_HEADER, *CHIPMUNK_INCLUDE)
16
+ # find_library(CHIPMUNK_NAME, CHIPMUNK_FUNCTION, *CHIPMUNK_LIBDIR)
17
+
18
+ =begin
19
+ unless have_library('chipmunk', 'cpMomentForPoly')
20
+ raise "Could not link to Chipmunk library!"
21
+ end
22
+
23
+ have_header('chipmunk.h', include_dirs)
24
+ =end
25
+
26
+ if ARGV[0] == "macosx"
27
+ $CFLAGS += ' -arch ppc -arch i386 -arch x86_64'
28
+ $LDFLAGS += ' -arch x86_64 -arch i386 -arch ppc'
29
+ end
30
+
31
+ $CFLAGS += ' -std=gnu99 -ffast-math'
32
+ $CFLAGS += ' -Iinclude/chipmunk/'
33
+ create_makefile('chipmunk')
34
+
@@ -25,8 +25,21 @@
25
25
  #ifdef __cplusplus
26
26
  extern "C" {
27
27
  #endif
28
-
29
- typedef double cpFloat;
28
+
29
+ void cpMessage(char *message, char *condition, char *file, int line, int isError);
30
+ #ifdef NDEBUG
31
+ #define cpAssertWarn(condition, message)
32
+ #else
33
+ #define cpAssertWarn(condition, message) if(!(condition)) cpMessage(message, #condition, __FILE__, __LINE__, 0)
34
+ #endif
35
+
36
+ #ifdef NDEBUG
37
+ #define cpAssert(condition, message)
38
+ #else
39
+ #define cpAssert(condition, message) if(!(condition)) cpMessage(message, #condition, __FILE__, __LINE__, 1)
40
+ #endif
41
+
42
+ #include "chipmunk_types.h"
30
43
 
31
44
  static inline cpFloat
32
45
  cpfmax(cpFloat a, cpFloat b)
@@ -41,10 +54,29 @@ cpfmin(cpFloat a, cpFloat b)
41
54
  }
42
55
 
43
56
  static inline cpFloat
44
- cpfclamp(cpFloat f, cpFloat min, cpFloat max){
57
+ cpfabs(cpFloat n)
58
+ {
59
+ return (n < 0) ? -n : n;
60
+ }
61
+
62
+ static inline cpFloat
63
+ cpfclamp(cpFloat f, cpFloat min, cpFloat max)
64
+ {
45
65
  return cpfmin(cpfmax(f, min), max);
46
66
  }
47
67
 
68
+ static inline cpFloat
69
+ cpflerp(cpFloat f1, cpFloat f2, cpFloat t)
70
+ {
71
+ return f1*(1.0f - t) + f2*t;
72
+ }
73
+
74
+ static inline cpFloat
75
+ cpflerpconst(cpFloat f1, cpFloat f2, cpFloat d)
76
+ {
77
+ return f1 + cpfclamp(f2 - f1, -d, d);
78
+ }
79
+
48
80
  #ifndef INFINITY
49
81
  #ifdef _MSC_VER
50
82
  union MSVC_EVIL_FLOAT_HACK
@@ -54,11 +86,25 @@ cpfclamp(cpFloat f, cpFloat min, cpFloat max){
54
86
  };
55
87
  static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}};
56
88
  #define INFINITY (INFINITY_HACK.Value)
57
- #else
89
+ #endif
90
+
91
+ #ifdef __GNUC__
92
+ #define INFINITY (__builtin_inf())
93
+ #endif
94
+
95
+ #ifndef INFINITY
58
96
  #define INFINITY (1e1000)
59
97
  #endif
60
98
  #endif
61
99
 
100
+ // Maximum allocated size for various Chipmunk buffer sizes
101
+ #define CP_BUFFER_BYTES (32*1024)
102
+
103
+ #define cpmalloc malloc
104
+ #define cpcalloc calloc
105
+ #define cprealloc realloc
106
+ #define cpfree free
107
+
62
108
  #include "cpVect.h"
63
109
  #include "cpBB.h"
64
110
  #include "cpBody.h"
@@ -72,18 +118,29 @@ cpfclamp(cpFloat f, cpFloat min, cpFloat max){
72
118
  #include "cpArbiter.h"
73
119
  #include "cpCollision.h"
74
120
 
75
- #include "cpJoint.h"
121
+ #include "constraints/cpConstraint.h"
76
122
 
77
123
  #include "cpSpace.h"
78
124
 
79
125
  #define CP_HASH_COEF (3344921057ul)
80
- #define CP_HASH_PAIR(A, B) ((unsigned int)(A)*CP_HASH_COEF ^ (unsigned int)(B)*CP_HASH_COEF)
126
+ #define CP_HASH_PAIR(A, B) ((cpHashValue)(A)*CP_HASH_COEF ^ (cpHashValue)(B)*CP_HASH_COEF)
81
127
 
128
+ extern char *cpVersionString;
82
129
  void cpInitChipmunk(void);
83
130
 
131
+ // Calculate the moment of inertia for a circle, r1 and r2 are the inner and outer diameters.
132
+ // (A solid circle has an inner diameter of 0)
84
133
  cpFloat cpMomentForCircle(cpFloat m, cpFloat r1, cpFloat r2, cpVect offset);
134
+
135
+ // Calculate the moment of inertia for a line segment. (beveling radius not supported)
136
+ cpFloat cpMomentForSegment(cpFloat m, cpVect a, cpVect b);
137
+
138
+ // Calculate the moment of inertia for a solid polygon shape.
85
139
  cpFloat cpMomentForPoly(cpFloat m, int numVerts, cpVect *verts, cpVect offset);
86
140
 
141
+ // Calculate the moment of inertia for a solid box.
142
+ cpFloat cpMomentForBox(cpFloat m, cpFloat width, cpFloat height);
143
+
87
144
  #ifdef __cplusplus
88
145
  }
89
146
  #endif
@@ -0,0 +1,42 @@
1
+ // Create non static inlined copies of Chipmunk functions, useful for working with dynamic FFIs
2
+ // This file should only be included in chipmunk.c
3
+
4
+ #define MAKE_REF(name) __typeof__(name) *_##name = name
5
+
6
+ MAKE_REF(cpv); // makes a variable named _cpv that contains the function pointer for cpv()
7
+ MAKE_REF(cpvadd);
8
+ MAKE_REF(cpvneg);
9
+ MAKE_REF(cpvsub);
10
+ MAKE_REF(cpvmult);
11
+ MAKE_REF(cpvdot);
12
+ MAKE_REF(cpvcross);
13
+ MAKE_REF(cpvperp);
14
+ MAKE_REF(cpvrperp);
15
+ MAKE_REF(cpvproject);
16
+ MAKE_REF(cpvrotate);
17
+ MAKE_REF(cpvunrotate);
18
+ MAKE_REF(cpvlengthsq);
19
+ MAKE_REF(cpvlerp);
20
+ MAKE_REF(cpvnormalize);
21
+ MAKE_REF(cpvnormalize_safe);
22
+ MAKE_REF(cpvclamp);
23
+ MAKE_REF(cpvlerpconst);
24
+ MAKE_REF(cpvdist);
25
+ MAKE_REF(cpvnear);
26
+ MAKE_REF(cpvdistsq);
27
+
28
+ MAKE_REF(cpBBNew);
29
+ MAKE_REF(cpBBintersects);
30
+ MAKE_REF(cpBBcontainsBB);
31
+ MAKE_REF(cpBBcontainsVect);
32
+ MAKE_REF(cpBBmerge);
33
+ MAKE_REF(cpBBexpand);
34
+
35
+ MAKE_REF(cpBodyWorld2Local);
36
+ MAKE_REF(cpBodyLocal2World);
37
+ MAKE_REF(cpBodyApplyImpulse);
38
+
39
+ MAKE_REF(cpArbiterIsFirstContact);
40
+ MAKE_REF(cpArbiterGetShapes);
41
+ MAKE_REF(cpArbiterGetNormal);
42
+ MAKE_REF(cpArbiterGetPoint);
@@ -0,0 +1,80 @@
1
+ #ifdef __APPLE__
2
+ #import "TargetConditionals.h"
3
+ #endif
4
+
5
+ // Use single precision floats on the iPhone.
6
+ #if TARGET_OS_IPHONE==1
7
+ #define CP_USE_DOUBLES 0
8
+ #else
9
+ // use doubles by default for higher precision
10
+ #define CP_USE_DOUBLES 1
11
+ #endif
12
+
13
+ #if CP_USE_DOUBLES
14
+ typedef double cpFloat;
15
+ #define cpfsqrt sqrt
16
+ #define cpfsin sin
17
+ #define cpfcos cos
18
+ #define cpfacos acos
19
+ #define cpfatan2 atan2
20
+ #define cpfmod fmod
21
+ #define cpfexp exp
22
+ #define cpfpow pow
23
+ #define cpffloor floor
24
+ #define cpfceil ceil
25
+ #else
26
+ typedef float cpFloat;
27
+ #define cpfsqrt sqrtf
28
+ #define cpfsin sinf
29
+ #define cpfcos cosf
30
+ #define cpfacos acosf
31
+ #define cpfatan2 atan2f
32
+ #define cpfmod fmodf
33
+ #define cpfexp expf
34
+ #define cpfpow powf
35
+ #define cpffloor floorf
36
+ #define cpfceil ceilf
37
+ #endif
38
+
39
+ #if TARGET_OS_IPHONE
40
+ // CGPoints are structurally the same, and allow
41
+ // easy interoperability with other iPhone libraries
42
+ #import <CoreGraphics/CGGeometry.h>
43
+ typedef CGPoint cpVect;
44
+ #else
45
+ typedef struct cpVect{cpFloat x,y;} cpVect;
46
+ #endif
47
+
48
+ typedef unsigned int cpHashValue;
49
+
50
+ #ifdef CP_DATA_POINTER_TYPE
51
+ typedef CP_DATA_POINTER_TYPE cpDataPointer;
52
+ #else
53
+ typedef void * cpDataPointer;
54
+ #endif
55
+
56
+ #ifdef CP_COLLISION_TYPE_TYPE
57
+ typedef CP_COLLISION_TYPE_TYPE cpCollisionType;
58
+ #else
59
+ typedef unsigned int cpCollisionType;
60
+ #endif
61
+
62
+ #ifdef CP_GROUP_TYPE
63
+ typedef CP_GROUP_TYPE cpGroup;
64
+ #else
65
+ typedef unsigned int cpGroup;
66
+ #endif
67
+
68
+ #ifdef CP_LAYERS_TYPE
69
+ typedef CP_GROUP_TYPE cpLayers;
70
+ #else
71
+ typedef unsigned int cpLayers;
72
+ #endif
73
+
74
+ #ifndef CP_NO_GROUP
75
+ #define CP_NO_GROUP ((cpGroup)0)
76
+ #endif
77
+
78
+ #ifndef CP_ALL_LAYERS
79
+ #define CP_ALL_LAYERS (~(cpLayers)0)
80
+ #endif
@@ -0,0 +1,54 @@
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
+
23
+
24
+ /* This header defines a number of "unsafe" operations on Chipmunk objects.
25
+ * In this case "unsafe" is referring to operations which may reduce the
26
+ * physical accuracy or numerical stability of the simulation, but will not
27
+ * cause crashes.
28
+ *
29
+ * The prime example is mutating collision shapes. Chipmunk does not support
30
+ * this directly. Mutating shapes using this API will caused objects in contact
31
+ * to be pushed apart using Chipmunk's overlap solver, but not using real
32
+ * persistent velocities. Probably not what you meant, but perhaps close enough.
33
+ */
34
+
35
+ #ifndef CHIPMUNK_UNSAFE_HEADER
36
+ #define CHIPMUNK_UNSAFE_HEADER
37
+
38
+ #ifdef __cplusplus
39
+ extern "C" {
40
+ #endif
41
+
42
+ void cpCircleShapeSetRadius(cpShape *shape, cpFloat radius);
43
+ void cpCircleShapeSetOffset(cpShape *shape, cpVect offset);
44
+
45
+ void cpSegmentShapeSetEndpoints(cpShape *shape, cpVect a, cpVect b);
46
+ void cpSegmentShapeSetRadius(cpShape *shape, cpFloat radius);
47
+
48
+ void cpPolyShapeSetVerts(cpShape *shape, int numVerts, cpVect *verts, cpVect offset);
49
+
50
+ #ifdef __cplusplus
51
+ }
52
+ #endif
53
+
54
+ #endif
@@ -0,0 +1,92 @@
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
+ // TODO: Comment me!
23
+
24
+ extern cpFloat cp_constraint_bias_coef;
25
+
26
+ struct cpConstraintClass;
27
+ struct cpConstraint;
28
+
29
+ typedef void (*cpConstraintPreStepFunction)(struct cpConstraint *constraint, cpFloat dt, cpFloat dt_inv);
30
+ typedef void (*cpConstraintApplyImpulseFunction)(struct cpConstraint *constraint);
31
+ typedef cpFloat (*cpConstraintGetImpulseFunction)(struct cpConstraint *constraint);
32
+
33
+ typedef struct cpConstraintClass {
34
+ cpConstraintPreStepFunction preStep;
35
+ cpConstraintApplyImpulseFunction applyImpulse;
36
+ cpConstraintGetImpulseFunction getImpulse;
37
+ } cpConstraintClass;
38
+
39
+
40
+
41
+ typedef struct cpConstraint {
42
+ const cpConstraintClass *klass;
43
+
44
+ cpBody *a, *b;
45
+ cpFloat maxForce;
46
+ cpFloat biasCoef;
47
+ cpFloat maxBias;
48
+
49
+ cpDataPointer data;
50
+ } cpConstraint;
51
+
52
+ #ifdef CP_USE_DEPRECATED_API_4
53
+ typedef cpConstraint cpJoint;
54
+ #endif
55
+
56
+ void cpConstraintDestroy(cpConstraint *constraint);
57
+ void cpConstraintFree(cpConstraint *constraint);
58
+
59
+
60
+ #define cpConstraintCheckCast(constraint, struct) \
61
+ cpAssert(constraint->klass == struct##GetClass(), "Constraint is not a "#struct);
62
+
63
+
64
+ #define CP_DefineConstraintGetter(struct, type, member, name) \
65
+ static inline type \
66
+ struct##Get##name(cpConstraint *constraint){ \
67
+ cpConstraintCheckCast(constraint, struct); \
68
+ return ((struct *)constraint)->member; \
69
+ } \
70
+
71
+ #define CP_DefineConstraintSetter(struct, type, member, name) \
72
+ static inline void \
73
+ struct##Set##name(cpConstraint *constraint, type value){ \
74
+ cpConstraintCheckCast(constraint, struct); \
75
+ ((struct *)constraint)->member = value; \
76
+ } \
77
+
78
+ #define CP_DefineConstraintProperty(struct, type, member, name) \
79
+ CP_DefineConstraintGetter(struct, type, member, name) \
80
+ CP_DefineConstraintSetter(struct, type, member, name)
81
+
82
+ // Built in Joint types
83
+ #include "cpPinJoint.h"
84
+ #include "cpSlideJoint.h"
85
+ #include "cpPivotJoint.h"
86
+ #include "cpGrooveJoint.h"
87
+ #include "cpDampedSpring.h"
88
+ #include "cpDampedRotarySpring.h"
89
+ #include "cpRotaryLimitJoint.h"
90
+ #include "cpRatchetJoint.h"
91
+ #include "cpGearJoint.h"
92
+ #include "cpSimpleMotor.h"