box2d-ruby 1.0.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 (109) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +336 -0
  4. data/examples/contact_events.rb +22 -0
  5. data/examples/debug_draw.rb +15 -0
  6. data/examples/falling_ball.rb +19 -0
  7. data/examples/rugl_debug_draw.rb +68 -0
  8. data/examples/stagecraft_debug_draw.rb +64 -0
  9. data/examples/support/box2d_debug_lines.rb +125 -0
  10. data/ext/box2d/CMakeLists.txt +35 -0
  11. data/ext/box2d/extconf.rb +42 -0
  12. data/ext/box2d/native.c +9 -0
  13. data/ext/box2d/vendor/box2d/LICENSE +21 -0
  14. data/ext/box2d/vendor/box2d/VERSION +1 -0
  15. data/ext/box2d/vendor/box2d/include/box2d/base.h +131 -0
  16. data/ext/box2d/vendor/box2d/include/box2d/box2d.h +1222 -0
  17. data/ext/box2d/vendor/box2d/include/box2d/collision.h +830 -0
  18. data/ext/box2d/vendor/box2d/include/box2d/id.h +144 -0
  19. data/ext/box2d/vendor/box2d/include/box2d/math_functions.h +761 -0
  20. data/ext/box2d/vendor/box2d/include/box2d/types.h +1457 -0
  21. data/ext/box2d/vendor/box2d/src/CMakeLists.txt +223 -0
  22. data/ext/box2d/vendor/box2d/src/aabb.c +132 -0
  23. data/ext/box2d/vendor/box2d/src/aabb.h +56 -0
  24. data/ext/box2d/vendor/box2d/src/arena_allocator.c +112 -0
  25. data/ext/box2d/vendor/box2d/src/arena_allocator.h +48 -0
  26. data/ext/box2d/vendor/box2d/src/array.c +8 -0
  27. data/ext/box2d/vendor/box2d/src/array.h +179 -0
  28. data/ext/box2d/vendor/box2d/src/atomic.h +79 -0
  29. data/ext/box2d/vendor/box2d/src/bitset.c +67 -0
  30. data/ext/box2d/vendor/box2d/src/bitset.h +65 -0
  31. data/ext/box2d/vendor/box2d/src/body.c +1884 -0
  32. data/ext/box2d/vendor/box2d/src/body.h +194 -0
  33. data/ext/box2d/vendor/box2d/src/box2d.natvis +41 -0
  34. data/ext/box2d/vendor/box2d/src/broad_phase.c +524 -0
  35. data/ext/box2d/vendor/box2d/src/broad_phase.h +83 -0
  36. data/ext/box2d/vendor/box2d/src/constants.h +54 -0
  37. data/ext/box2d/vendor/box2d/src/constraint_graph.c +322 -0
  38. data/ext/box2d/vendor/box2d/src/constraint_graph.h +58 -0
  39. data/ext/box2d/vendor/box2d/src/contact.c +650 -0
  40. data/ext/box2d/vendor/box2d/src/contact.h +148 -0
  41. data/ext/box2d/vendor/box2d/src/contact_solver.c +2120 -0
  42. data/ext/box2d/vendor/box2d/src/contact_solver.h +54 -0
  43. data/ext/box2d/vendor/box2d/src/core.c +178 -0
  44. data/ext/box2d/vendor/box2d/src/core.h +149 -0
  45. data/ext/box2d/vendor/box2d/src/ctz.h +112 -0
  46. data/ext/box2d/vendor/box2d/src/distance.c +1415 -0
  47. data/ext/box2d/vendor/box2d/src/distance_joint.c +556 -0
  48. data/ext/box2d/vendor/box2d/src/dynamic_tree.c +1989 -0
  49. data/ext/box2d/vendor/box2d/src/geometry.c +1028 -0
  50. data/ext/box2d/vendor/box2d/src/hull.c +328 -0
  51. data/ext/box2d/vendor/box2d/src/id_pool.c +79 -0
  52. data/ext/box2d/vendor/box2d/src/id_pool.h +35 -0
  53. data/ext/box2d/vendor/box2d/src/island.c +977 -0
  54. data/ext/box2d/vendor/box2d/src/island.h +89 -0
  55. data/ext/box2d/vendor/box2d/src/joint.c +1272 -0
  56. data/ext/box2d/vendor/box2d/src/joint.h +335 -0
  57. data/ext/box2d/vendor/box2d/src/manifold.c +1726 -0
  58. data/ext/box2d/vendor/box2d/src/math_functions.c +159 -0
  59. data/ext/box2d/vendor/box2d/src/motor_joint.c +283 -0
  60. data/ext/box2d/vendor/box2d/src/mouse_joint.c +214 -0
  61. data/ext/box2d/vendor/box2d/src/mover.c +73 -0
  62. data/ext/box2d/vendor/box2d/src/prismatic_joint.c +656 -0
  63. data/ext/box2d/vendor/box2d/src/revolute_joint.c +534 -0
  64. data/ext/box2d/vendor/box2d/src/sensor.c +389 -0
  65. data/ext/box2d/vendor/box2d/src/sensor.h +36 -0
  66. data/ext/box2d/vendor/box2d/src/shape.c +1714 -0
  67. data/ext/box2d/vendor/box2d/src/shape.h +123 -0
  68. data/ext/box2d/vendor/box2d/src/solver.c +2038 -0
  69. data/ext/box2d/vendor/box2d/src/solver.h +155 -0
  70. data/ext/box2d/vendor/box2d/src/solver_set.c +613 -0
  71. data/ext/box2d/vendor/box2d/src/solver_set.h +57 -0
  72. data/ext/box2d/vendor/box2d/src/table.c +238 -0
  73. data/ext/box2d/vendor/box2d/src/table.h +37 -0
  74. data/ext/box2d/vendor/box2d/src/timer.c +185 -0
  75. data/ext/box2d/vendor/box2d/src/types.c +151 -0
  76. data/ext/box2d/vendor/box2d/src/weld_joint.c +310 -0
  77. data/ext/box2d/vendor/box2d/src/wheel_joint.c +551 -0
  78. data/ext/box2d/vendor/box2d/src/world.c +3301 -0
  79. data/ext/box2d/vendor/box2d/src/world.h +192 -0
  80. data/generator/generate.rb +316 -0
  81. data/generator/layout_probe.c +507 -0
  82. data/generator/verify_layouts.rb +32 -0
  83. data/lib/box2d/body.rb +172 -0
  84. data/lib/box2d/body_definition.rb +38 -0
  85. data/lib/box2d/body_shapes.rb +135 -0
  86. data/lib/box2d/chain.rb +61 -0
  87. data/lib/box2d/debug_draw.rb +118 -0
  88. data/lib/box2d/events.rb +103 -0
  89. data/lib/box2d/fixed_stepper.rb +39 -0
  90. data/lib/box2d/handle.rb +46 -0
  91. data/lib/box2d/hit.rb +5 -0
  92. data/lib/box2d/joint.rb +197 -0
  93. data/lib/box2d/native.rb +1462 -0
  94. data/lib/box2d/native_loader.rb +45 -0
  95. data/lib/box2d/pixel_scale.rb +29 -0
  96. data/lib/box2d/shape.rb +109 -0
  97. data/lib/box2d/shape_definition.rb +44 -0
  98. data/lib/box2d/value_conversion.rb +80 -0
  99. data/lib/box2d/version.rb +7 -0
  100. data/lib/box2d/world.rb +135 -0
  101. data/lib/box2d/world_joints.rb +156 -0
  102. data/lib/box2d/world_queries.rb +122 -0
  103. data/lib/box2d/world_registry.rb +95 -0
  104. data/lib/box2d.rb +31 -0
  105. data/script/build_platform_gem.rb +24 -0
  106. data/script/deterministic_scene.rb +56 -0
  107. data/script/update_deterministic_snapshot.rb +11 -0
  108. data/script/verify_platform_gem.rb +24 -0
  109. metadata +164 -0
@@ -0,0 +1,335 @@
1
+ // SPDX-FileCopyrightText: 2023 Erin Catto
2
+ // SPDX-License-Identifier: MIT
3
+ #pragma once
4
+
5
+ #include "array.h"
6
+ #include "solver.h"
7
+
8
+ #include "box2d/types.h"
9
+
10
+ typedef struct b2DebugDraw b2DebugDraw;
11
+ typedef struct b2StepContext b2StepContext;
12
+ typedef struct b2World b2World;
13
+
14
+ /// A joint edge is used to connect bodies and joints together
15
+ /// in a joint graph where each body is a node and each joint
16
+ /// is an edge. A joint edge belongs to a doubly linked list
17
+ /// maintained in each attached body. Each joint has two joint
18
+ /// nodes, one for each attached body.
19
+ typedef struct b2JointEdge
20
+ {
21
+ int bodyId;
22
+ int prevKey;
23
+ int nextKey;
24
+ } b2JointEdge;
25
+
26
+ // Map from b2JointId to b2Joint in the solver sets
27
+ typedef struct b2Joint
28
+ {
29
+ void* userData;
30
+
31
+ // index of simulation set stored in b2World
32
+ // B2_NULL_INDEX when slot is free
33
+ int setIndex;
34
+
35
+ // index into the constraint graph color array, may be B2_NULL_INDEX for sleeping/disabled joints
36
+ // B2_NULL_INDEX when slot is free
37
+ int colorIndex;
38
+
39
+ // joint index within set or graph color
40
+ // B2_NULL_INDEX when slot is free
41
+ int localIndex;
42
+
43
+ b2JointEdge edges[2];
44
+
45
+ int jointId;
46
+ int islandId;
47
+ int islandPrev;
48
+ int islandNext;
49
+
50
+ float drawSize;
51
+
52
+ b2JointType type;
53
+
54
+ // This is monotonically advanced when a body is allocated in this slot
55
+ // Used to check for invalid b2JointId
56
+ uint16_t generation;
57
+
58
+ bool isMarked;
59
+ bool collideConnected;
60
+
61
+ } b2Joint;
62
+
63
+ typedef struct b2DistanceJoint
64
+ {
65
+ float length;
66
+ float hertz;
67
+ float dampingRatio;
68
+ float minLength;
69
+ float maxLength;
70
+
71
+ float maxMotorForce;
72
+ float motorSpeed;
73
+
74
+ float impulse;
75
+ float lowerImpulse;
76
+ float upperImpulse;
77
+ float motorImpulse;
78
+
79
+ int indexA;
80
+ int indexB;
81
+ b2Vec2 anchorA;
82
+ b2Vec2 anchorB;
83
+ b2Vec2 deltaCenter;
84
+ b2Softness distanceSoftness;
85
+ float axialMass;
86
+
87
+ bool enableSpring;
88
+ bool enableLimit;
89
+ bool enableMotor;
90
+ } b2DistanceJoint;
91
+
92
+ typedef struct b2MotorJoint
93
+ {
94
+ b2Vec2 linearOffset;
95
+ float angularOffset;
96
+ b2Vec2 linearImpulse;
97
+ float angularImpulse;
98
+ float maxForce;
99
+ float maxTorque;
100
+ float correctionFactor;
101
+
102
+ int indexA;
103
+ int indexB;
104
+ b2Vec2 anchorA;
105
+ b2Vec2 anchorB;
106
+ b2Vec2 deltaCenter;
107
+ float deltaAngle;
108
+ b2Mat22 linearMass;
109
+ float angularMass;
110
+ } b2MotorJoint;
111
+
112
+ typedef struct b2MouseJoint
113
+ {
114
+ b2Vec2 targetA;
115
+ float hertz;
116
+ float dampingRatio;
117
+ float maxForce;
118
+
119
+ b2Vec2 linearImpulse;
120
+ float angularImpulse;
121
+
122
+ b2Softness linearSoftness;
123
+ b2Softness angularSoftness;
124
+ int indexB;
125
+ b2Vec2 anchorB;
126
+ b2Vec2 deltaCenter;
127
+ b2Mat22 linearMass;
128
+ } b2MouseJoint;
129
+
130
+ typedef struct b2PrismaticJoint
131
+ {
132
+ b2Vec2 localAxisA;
133
+ b2Vec2 impulse;
134
+ float springImpulse;
135
+ float motorImpulse;
136
+ float lowerImpulse;
137
+ float upperImpulse;
138
+ float hertz;
139
+ float dampingRatio;
140
+ float maxMotorForce;
141
+ float motorSpeed;
142
+ float referenceAngle;
143
+ float lowerTranslation;
144
+ float upperTranslation;
145
+
146
+ int indexA;
147
+ int indexB;
148
+ b2Vec2 anchorA;
149
+ b2Vec2 anchorB;
150
+ b2Vec2 axisA;
151
+ b2Vec2 deltaCenter;
152
+ float deltaAngle;
153
+ float axialMass;
154
+ b2Softness springSoftness;
155
+
156
+ bool enableSpring;
157
+ bool enableLimit;
158
+ bool enableMotor;
159
+ } b2PrismaticJoint;
160
+
161
+ typedef struct b2RevoluteJoint
162
+ {
163
+ b2Vec2 linearImpulse;
164
+ float springImpulse;
165
+ float motorImpulse;
166
+ float lowerImpulse;
167
+ float upperImpulse;
168
+ float hertz;
169
+ float dampingRatio;
170
+ float maxMotorTorque;
171
+ float motorSpeed;
172
+ float referenceAngle;
173
+ float lowerAngle;
174
+ float upperAngle;
175
+
176
+ int indexA;
177
+ int indexB;
178
+ b2Vec2 anchorA;
179
+ b2Vec2 anchorB;
180
+ b2Vec2 deltaCenter;
181
+ float deltaAngle;
182
+ float axialMass;
183
+ b2Softness springSoftness;
184
+
185
+ bool enableSpring;
186
+ bool enableMotor;
187
+ bool enableLimit;
188
+ } b2RevoluteJoint;
189
+
190
+ typedef struct b2WeldJoint
191
+ {
192
+ float referenceAngle;
193
+ float linearHertz;
194
+ float linearDampingRatio;
195
+ float angularHertz;
196
+ float angularDampingRatio;
197
+
198
+ b2Softness linearSoftness;
199
+ b2Softness angularSoftness;
200
+ b2Vec2 linearImpulse;
201
+ float angularImpulse;
202
+
203
+ int indexA;
204
+ int indexB;
205
+ b2Vec2 anchorA;
206
+ b2Vec2 anchorB;
207
+ b2Vec2 deltaCenter;
208
+ float deltaAngle;
209
+ float axialMass;
210
+ } b2WeldJoint;
211
+
212
+ typedef struct b2WheelJoint
213
+ {
214
+ b2Vec2 localAxisA;
215
+ float perpImpulse;
216
+ float motorImpulse;
217
+ float springImpulse;
218
+ float lowerImpulse;
219
+ float upperImpulse;
220
+ float maxMotorTorque;
221
+ float motorSpeed;
222
+ float lowerTranslation;
223
+ float upperTranslation;
224
+ float hertz;
225
+ float dampingRatio;
226
+
227
+ int indexA;
228
+ int indexB;
229
+ b2Vec2 anchorA;
230
+ b2Vec2 anchorB;
231
+ b2Vec2 axisA;
232
+ b2Vec2 deltaCenter;
233
+ float perpMass;
234
+ float motorMass;
235
+ float axialMass;
236
+ b2Softness springSoftness;
237
+
238
+ bool enableSpring;
239
+ bool enableMotor;
240
+ bool enableLimit;
241
+ } b2WheelJoint;
242
+
243
+ /// The base joint class. Joints are used to constraint two bodies together in
244
+ /// various fashions. Some joints also feature limits and motors.
245
+ typedef struct b2JointSim
246
+ {
247
+ int jointId;
248
+
249
+ int bodyIdA;
250
+ int bodyIdB;
251
+
252
+ b2JointType type;
253
+
254
+ // Anchors relative to body origin
255
+ b2Vec2 localOriginAnchorA;
256
+ b2Vec2 localOriginAnchorB;
257
+
258
+ float invMassA, invMassB;
259
+ float invIA, invIB;
260
+
261
+ union
262
+ {
263
+ b2DistanceJoint distanceJoint;
264
+ b2MotorJoint motorJoint;
265
+ b2MouseJoint mouseJoint;
266
+ b2RevoluteJoint revoluteJoint;
267
+ b2PrismaticJoint prismaticJoint;
268
+ b2WeldJoint weldJoint;
269
+ b2WheelJoint wheelJoint;
270
+ };
271
+ } b2JointSim;
272
+
273
+ void b2DestroyJointInternal( b2World* world, b2Joint* joint, bool wakeBodies );
274
+
275
+ b2Joint* b2GetJointFullId( b2World* world, b2JointId jointId );
276
+ b2JointSim* b2GetJointSim( b2World* world, b2Joint* joint );
277
+ b2JointSim* b2GetJointSimCheckType( b2JointId jointId, b2JointType type );
278
+
279
+ void b2PrepareJoint( b2JointSim* joint, b2StepContext* context );
280
+ void b2WarmStartJoint( b2JointSim* joint, b2StepContext* context );
281
+ void b2SolveJoint( b2JointSim* joint, b2StepContext* context, bool useBias );
282
+
283
+ void b2PrepareOverflowJoints( b2StepContext* context );
284
+ void b2WarmStartOverflowJoints( b2StepContext* context );
285
+ void b2SolveOverflowJoints( b2StepContext* context, bool useBias );
286
+
287
+ void b2DrawJoint( b2DebugDraw* draw, b2World* world, b2Joint* joint );
288
+
289
+ b2Vec2 b2GetDistanceJointForce( b2World* world, b2JointSim* base );
290
+ b2Vec2 b2GetMotorJointForce( b2World* world, b2JointSim* base );
291
+ b2Vec2 b2GetMouseJointForce( b2World* world, b2JointSim* base );
292
+ b2Vec2 b2GetPrismaticJointForce( b2World* world, b2JointSim* base );
293
+ b2Vec2 b2GetRevoluteJointForce( b2World* world, b2JointSim* base );
294
+ b2Vec2 b2GetWeldJointForce( b2World* world, b2JointSim* base );
295
+ b2Vec2 b2GetWheelJointForce( b2World* world, b2JointSim* base );
296
+
297
+ float b2GetMotorJointTorque( b2World* world, b2JointSim* base );
298
+ float b2GetMouseJointTorque( b2World* world, b2JointSim* base );
299
+ float b2GetPrismaticJointTorque( b2World* world, b2JointSim* base );
300
+ float b2GetRevoluteJointTorque( b2World* world, b2JointSim* base );
301
+ float b2GetWeldJointTorque( b2World* world, b2JointSim* base );
302
+ float b2GetWheelJointTorque( b2World* world, b2JointSim* base );
303
+
304
+ void b2PrepareDistanceJoint( b2JointSim* base, b2StepContext* context );
305
+ void b2PrepareMotorJoint( b2JointSim* base, b2StepContext* context );
306
+ void b2PrepareMouseJoint( b2JointSim* base, b2StepContext* context );
307
+ void b2PreparePrismaticJoint( b2JointSim* base, b2StepContext* context );
308
+ void b2PrepareRevoluteJoint( b2JointSim* base, b2StepContext* context );
309
+ void b2PrepareWeldJoint( b2JointSim* base, b2StepContext* context );
310
+ void b2PrepareWheelJoint( b2JointSim* base, b2StepContext* context );
311
+
312
+ void b2WarmStartDistanceJoint( b2JointSim* base, b2StepContext* context );
313
+ void b2WarmStartMotorJoint( b2JointSim* base, b2StepContext* context );
314
+ void b2WarmStartMouseJoint( b2JointSim* base, b2StepContext* context );
315
+ void b2WarmStartPrismaticJoint( b2JointSim* base, b2StepContext* context );
316
+ void b2WarmStartRevoluteJoint( b2JointSim* base, b2StepContext* context );
317
+ void b2WarmStartWeldJoint( b2JointSim* base, b2StepContext* context );
318
+ void b2WarmStartWheelJoint( b2JointSim* base, b2StepContext* context );
319
+
320
+ void b2SolveDistanceJoint( b2JointSim* base, b2StepContext* context, bool useBias );
321
+ void b2SolveMotorJoint( b2JointSim* base, b2StepContext* context, bool useBias );
322
+ void b2SolveMouseJoint( b2JointSim* base, b2StepContext* context );
323
+ void b2SolvePrismaticJoint( b2JointSim* base, b2StepContext* context, bool useBias );
324
+ void b2SolveRevoluteJoint( b2JointSim* base, b2StepContext* context, bool useBias );
325
+ void b2SolveWeldJoint( b2JointSim* base, b2StepContext* context, bool useBias );
326
+ void b2SolveWheelJoint( b2JointSim* base, b2StepContext* context, bool useBias );
327
+
328
+ void b2DrawDistanceJoint( b2DebugDraw* draw, b2JointSim* base, b2Transform transformA, b2Transform transformB );
329
+ void b2DrawPrismaticJoint( b2DebugDraw* draw, b2JointSim* base, b2Transform transformA, b2Transform transformB );
330
+ void b2DrawRevoluteJoint( b2DebugDraw* draw, b2JointSim* base, b2Transform transformA, b2Transform transformB, float drawSize );
331
+ void b2DrawWheelJoint( b2DebugDraw* draw, b2JointSim* base, b2Transform transformA, b2Transform transformB );
332
+
333
+ // Define inline functions for arrays
334
+ B2_ARRAY_INLINE( b2Joint, b2Joint )
335
+ B2_ARRAY_INLINE( b2JointSim, b2JointSim )