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,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Box2D
4
+ class Handle
5
+ attr_reader :world, :id
6
+
7
+ def initialize(world, id)
8
+ @world = world
9
+ @id = ValueConversion.copy_struct(self.class::ID_CLASS, id)
10
+ @key = ValueConversion.id_key(@id)
11
+ @destroyed = false
12
+ end
13
+
14
+ def valid?
15
+ !@destroyed && @world.valid? && native_valid?
16
+ end
17
+
18
+ def destroyed?
19
+ !valid?
20
+ end
21
+
22
+ def hash
23
+ [self.class, @world.object_id, @key].hash
24
+ end
25
+
26
+ def eql?(other)
27
+ other.instance_of?(self.class) && other.world.equal?(@world) && other.key == @key
28
+ end
29
+ alias == eql?
30
+
31
+ protected
32
+
33
+ attr_reader :key
34
+
35
+ def ensure_valid!
36
+ @world.ensure_access!
37
+ return if !@destroyed && native_valid?
38
+
39
+ raise UseAfterDestroyError, "#{self.class.name} has been destroyed"
40
+ end
41
+
42
+ def invalidate!
43
+ @destroyed = true
44
+ end
45
+ end
46
+ end
data/lib/box2d/hit.rb ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Box2D
4
+ Hit = Data.define(:shape, :point, :normal, :fraction)
5
+ end
@@ -0,0 +1,197 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Box2D
4
+ class Joint < Handle
5
+ ID_CLASS = Native::JointId
6
+
7
+ attr_reader :body_a, :body_b
8
+
9
+ def initialize(world, id, body_a:, body_b:, user_data: nil)
10
+ super(world, id)
11
+ @body_a = body_a
12
+ @body_b = body_b
13
+ @user_data = user_data
14
+ end
15
+
16
+ def user_data
17
+ ensure_valid!
18
+ @user_data
19
+ end
20
+
21
+ def user_data=(value)
22
+ ensure_valid!
23
+ @user_data = value
24
+ end
25
+
26
+ def destroy
27
+ ensure_valid!
28
+ Native.b2DestroyJoint(@id)
29
+ invalidate_and_unregister
30
+ true
31
+ end
32
+
33
+ def collide_connected?
34
+ ensure_valid!
35
+ Native.b2Joint_GetCollideConnected(@id)
36
+ end
37
+
38
+ def collide_connected=(value)
39
+ ensure_valid!
40
+ Native.b2Joint_SetCollideConnected(@id, !!value)
41
+ end
42
+
43
+ def constraint_force
44
+ ensure_valid!
45
+ ValueConversion.vec2(Native.b2Joint_GetConstraintForce(@id))
46
+ end
47
+
48
+ def constraint_torque
49
+ ensure_valid!
50
+ Native.b2Joint_GetConstraintTorque(@id)
51
+ end
52
+
53
+ def invalidate_from_body!
54
+ invalidate_and_unregister
55
+ end
56
+
57
+ protected
58
+
59
+ def native_valid?
60
+ Native.b2Joint_IsValid(@id)
61
+ end
62
+
63
+ private
64
+
65
+ def invalidate_and_unregister
66
+ invalidate!
67
+ @world.unregister_joint(self)
68
+ @body_a.unregister_joint(self)
69
+ @body_b.unregister_joint(self)
70
+ end
71
+ end
72
+
73
+ class RevoluteJoint < Joint
74
+ def angle
75
+ ensure_valid!
76
+ Native.b2RevoluteJoint_GetAngle(@id)
77
+ end
78
+
79
+ def motor_speed
80
+ ensure_valid!
81
+ Native.b2RevoluteJoint_GetMotorSpeed(@id)
82
+ end
83
+
84
+ def motor_speed=(value)
85
+ ensure_valid!
86
+ Native.b2RevoluteJoint_SetMotorSpeed(@id, ValueConversion.finite_float(value, label: "motor_speed"))
87
+ end
88
+
89
+ def motor_enabled?
90
+ ensure_valid!
91
+ Native.b2RevoluteJoint_IsMotorEnabled(@id)
92
+ end
93
+
94
+ def motor_enabled=(value)
95
+ ensure_valid!
96
+ Native.b2RevoluteJoint_EnableMotor(@id, !!value)
97
+ end
98
+
99
+ def limits
100
+ ensure_valid!
101
+ Native.b2RevoluteJoint_GetLowerLimit(@id)..Native.b2RevoluteJoint_GetUpperLimit(@id)
102
+ end
103
+
104
+ def limits=(range)
105
+ ensure_valid!
106
+ Native.b2RevoluteJoint_SetLimits(
107
+ @id,
108
+ ValueConversion.finite_float(range.begin, label: "lower_limit"),
109
+ ValueConversion.finite_float(range.end, label: "upper_limit")
110
+ )
111
+ Native.b2RevoluteJoint_EnableLimit(@id, true)
112
+ end
113
+ end
114
+
115
+ class PrismaticJoint < Joint
116
+ def translation
117
+ ensure_valid!
118
+ Native.b2PrismaticJoint_GetTranslation(@id)
119
+ end
120
+
121
+ def speed
122
+ ensure_valid!
123
+ Native.b2PrismaticJoint_GetSpeed(@id)
124
+ end
125
+
126
+ def motor_speed
127
+ ensure_valid!
128
+ Native.b2PrismaticJoint_GetMotorSpeed(@id)
129
+ end
130
+
131
+ def motor_speed=(value)
132
+ ensure_valid!
133
+ Native.b2PrismaticJoint_SetMotorSpeed(@id, ValueConversion.finite_float(value, label: "motor_speed"))
134
+ end
135
+
136
+ def limits=(range)
137
+ ensure_valid!
138
+ Native.b2PrismaticJoint_SetLimits(
139
+ @id,
140
+ ValueConversion.finite_float(range.begin, label: "lower_limit"),
141
+ ValueConversion.finite_float(range.end, label: "upper_limit")
142
+ )
143
+ Native.b2PrismaticJoint_EnableLimit(@id, true)
144
+ end
145
+ end
146
+
147
+ class DistanceJoint < Joint
148
+ def length
149
+ ensure_valid!
150
+ Native.b2DistanceJoint_GetLength(@id)
151
+ end
152
+
153
+ def length=(value)
154
+ ensure_valid!
155
+ Native.b2DistanceJoint_SetLength(@id, ValueConversion.positive_float(value, label: "length"))
156
+ end
157
+
158
+ def current_length
159
+ ensure_valid!
160
+ Native.b2DistanceJoint_GetCurrentLength(@id)
161
+ end
162
+
163
+ def motor_speed
164
+ ensure_valid!
165
+ Native.b2DistanceJoint_GetMotorSpeed(@id)
166
+ end
167
+
168
+ def motor_speed=(value)
169
+ ensure_valid!
170
+ Native.b2DistanceJoint_SetMotorSpeed(@id, ValueConversion.finite_float(value, label: "motor_speed"))
171
+ end
172
+ end
173
+
174
+ class MouseJoint < Joint
175
+ def target
176
+ ensure_valid!
177
+ ValueConversion.vec2(Native.b2MouseJoint_GetTarget(@id))
178
+ end
179
+
180
+ def target=(value)
181
+ ensure_valid!
182
+ Native.b2MouseJoint_SetTarget(@id, ValueConversion.native_vec2(value, label: "target"))
183
+ end
184
+ end
185
+
186
+ class WeldJoint < Joint
187
+ def reference_angle
188
+ ensure_valid!
189
+ Native.b2WeldJoint_GetReferenceAngle(@id)
190
+ end
191
+
192
+ def reference_angle=(value)
193
+ ensure_valid!
194
+ Native.b2WeldJoint_SetReferenceAngle(@id, ValueConversion.finite_float(value, label: "reference_angle"))
195
+ end
196
+ end
197
+ end