载入中...
搜索中...
未找到
Physics.cpp
浏览该文件的文档.
1#include "physics/Physics.h"
2#include "physics/Body.h"
3#include "physics/Body3D.h"
4#include "physics/Cloth.h"
5#include "physics/Fixture.h"
6#include "physics/Fluid.h"
8#include "physics/Shape3D.h"
9#include "physics/World.h"
10#include "physics/World3D.h"
11
12#include "common/Exception.h"
13
14#include <simplesquirrel/simplesquirrel.hpp>
15
16namespace eve::physics {
17
19
21
22void Physics::setMeter(float pixelsPerMeter) {
23 if (pixelsPerMeter <= 0.f)
24 throw Exception("Physics.setMeter: pixelsPerMeter must be > 0");
25 meter_ = pixelsPerMeter;
26}
27
28float Physics::getMeter() const { return meter_; }
29
30World *Physics::newWorld(float gravityX, float gravityY, bool sleep) {
31 return new World(gravityX, gravityY, sleep, meter_);
32}
33
34World3D *Physics::newWorld3D(float gravityX, float gravityY, float gravityZ, bool sleep) {
35 return new World3D(gravityX, gravityY, gravityZ, sleep);
36}
37
38Cloth *Physics::newCloth(int cols, int rows, float spacing, float originX, float originY) {
39 return new Cloth(cols, rows, spacing, originX, originY);
40}
41
42Fluid *Physics::newFluid(int capacity) { return new Fluid(capacity); }
43
44void Physics::expose(ssq::Table &table) {
45 auto cls = table.addClass(name, Physics::create, false);
46 expose(cls);
47
48 auto world = table.addClass<World>(
49 "World", std::function<World *()>([]() -> World * { return nullptr; }), true);
50 world.addFunc("update", &World::update);
51 world.addFunc("updateFull", &World::updateFull);
52 world.addFunc("setGravity", &World::setGravity);
53 world.addFunc("getGravityX", &World::getGravityX);
54 world.addFunc("getGravityY", &World::getGravityY);
55 world.addFunc("setMeter", &World::setMeter);
56 world.addFunc("getMeter", &World::getMeter);
57 world.addFunc("newBody", &World::newBody);
58 world.addFunc("destroyBody", &World::destroyBody);
59 world.addFunc("destroy", &World::destroy);
60 world.addFunc("drawDebug", &World::drawDebug);
61 world.addFunc("rayCast", &World::rayCast);
62 world.addFunc("hasRayHit", &World::hasRayHit);
63 world.addFunc("getRayHitBodyId", &World::getRayHitBodyId);
64 world.addFunc("getRayHitX", &World::getRayHitX);
65 world.addFunc("getRayHitY", &World::getRayHitY);
66 world.addFunc("getRayHitNormalX", &World::getRayHitNormalX);
67 world.addFunc("getRayHitNormalY", &World::getRayHitNormalY);
68 world.addFunc("getRayHitFraction", &World::getRayHitFraction);
69 world.addFunc("queryAABB", &World::queryAABB);
70 world.addFunc("getQueryCount", &World::getQueryCount);
71 world.addFunc("getQueryBodyId", &World::getQueryBodyId);
72 world.addFunc("getBeginContactCount", &World::getBeginContactCount);
73 world.addFunc("getBeginContactBodyAId", &World::getBeginContactBodyAId);
74 world.addFunc("getBeginContactBodyBId", &World::getBeginContactBodyBId);
75 world.addFunc("getBeginContactFixtureATag", &World::getBeginContactFixtureATag);
76 world.addFunc("getBeginContactFixtureBTag", &World::getBeginContactFixtureBTag);
77 world.addFunc("getEndContactCount", &World::getEndContactCount);
78 world.addFunc("getEndContactBodyAId", &World::getEndContactBodyAId);
79 world.addFunc("getEndContactBodyBId", &World::getEndContactBodyBId);
80 world.addFunc("getEndContactFixtureATag", &World::getEndContactFixtureATag);
81 world.addFunc("getEndContactFixtureBTag", &World::getEndContactFixtureBTag);
82 world.addFunc("getImpactCount", &World::getImpactCount);
83 world.addFunc("getImpactBodyAId", &World::getImpactBodyAId);
84 world.addFunc("getImpactBodyBId", &World::getImpactBodyBId);
85 world.addFunc("getImpactFixtureATag", &World::getImpactFixtureATag);
86 world.addFunc("getImpactFixtureBTag", &World::getImpactFixtureBTag);
87 world.addFunc("getImpactPointX", &World::getImpactPointX);
88 world.addFunc("getImpactPointY", &World::getImpactPointY);
89 world.addFunc("getImpactNormalX", &World::getImpactNormalX);
90 world.addFunc("getImpactNormalY", &World::getImpactNormalY);
91 world.addFunc("getImpactRelativeNormalSpeed", &World::getImpactRelativeNormalSpeed);
92 world.addFunc("getImpactNormalImpulse", &World::getImpactNormalImpulse);
93 world.addFunc("getImpactTangentImpulse", &World::getImpactTangentImpulse);
94 world.addFunc("clearContactEvents", &World::clearContactEvents);
95
96 auto world3 = table.addClass<World3D>(
97 "World3D", std::function<World3D *()>([]() -> World3D * { return nullptr; }), true);
98 world3.addFunc("update", &World3D::update);
99 world3.addFunc("updateFull", &World3D::updateFull);
100 world3.addFunc("setGravity", &World3D::setGravity);
101 world3.addFunc("getGravityX", &World3D::getGravityX);
102 world3.addFunc("getGravityY", &World3D::getGravityY);
103 world3.addFunc("getGravityZ", &World3D::getGravityZ);
104 world3.addFunc("newBody", &World3D::newBody);
105 world3.addFunc("destroyBody", &World3D::destroyBody);
106 world3.addFunc("destroy", &World3D::destroy);
107 world3.addFunc("rayCast", &World3D::rayCast);
108 world3.addFunc("hasRayHit", &World3D::hasRayHit);
109 world3.addFunc("getRayHitBodyId", &World3D::getRayHitBodyId);
110 world3.addFunc("getRayHitX", &World3D::getRayHitX);
111 world3.addFunc("getRayHitY", &World3D::getRayHitY);
112 world3.addFunc("getRayHitZ", &World3D::getRayHitZ);
113 world3.addFunc("getRayHitNormalX", &World3D::getRayHitNormalX);
114 world3.addFunc("getRayHitNormalY", &World3D::getRayHitNormalY);
115 world3.addFunc("getRayHitNormalZ", &World3D::getRayHitNormalZ);
116 world3.addFunc("getRayHitFraction", &World3D::getRayHitFraction);
117 world3.addFunc("queryAABB", &World3D::queryAABB);
118 world3.addFunc("getQueryCount", &World3D::getQueryCount);
119 world3.addFunc("getQueryBodyId", &World3D::getQueryBodyId);
120
121 auto body = table.addClass<Body>(
122 "Body", std::function<Body *()>([]() -> Body * { return nullptr; }), true);
123 body.addFunc("getId", &Body::getId);
124 body.addFunc("setPosition", &Body::setPosition);
125 body.addFunc("getX", &Body::getX);
126 body.addFunc("getY", &Body::getY);
127 body.addFunc("setAngle", &Body::setAngle);
128 body.addFunc("getAngle", &Body::getAngle);
129 body.addFunc("setLinearVelocity", &Body::setLinearVelocity);
130 body.addFunc("getLinearVelocityX", &Body::getLinearVelocityX);
131 body.addFunc("getLinearVelocityY", &Body::getLinearVelocityY);
132 body.addFunc("getLinearSpeed", &Body::getLinearSpeed);
133 body.addFunc("getMass", &Body::getMass);
134 body.addFunc("getWorldCenterX", &Body::getWorldCenterX);
135 body.addFunc("getWorldCenterY", &Body::getWorldCenterY);
136 body.addFunc("setAngularVelocity", &Body::setAngularVelocity);
137 body.addFunc("getAngularVelocity", &Body::getAngularVelocity);
138 body.addFunc("applyForce", &Body::applyForce);
139 body.addFunc("applyForceAt", &Body::applyForceAt);
140 body.addFunc("applyLinearImpulse", &Body::applyLinearImpulse);
141 body.addFunc("applyAngularImpulse", &Body::applyAngularImpulse);
142 body.addFunc("setType", &Body::setType);
143 body.addFunc("getType", &Body::getType);
144 body.addFunc("setFixedRotation", &Body::setFixedRotation);
145 body.addFunc("isFixedRotation", &Body::isFixedRotation);
146 body.addFunc("setActive", &Body::setActive);
147 body.addFunc("isActive", &Body::isActive);
148 body.addFunc("setBullet", &Body::setBullet);
149 body.addFunc("isBullet", &Body::isBullet);
150 body.addFunc("setAwake", &Body::setAwake);
151 body.addFunc("isAwake", &Body::isAwake);
152 body.addFunc("newRectangleFixture", &Body::newRectangleFixture);
153 body.addFunc("newRectangleFixtureAt", &Body::newRectangleFixtureAt);
154 body.addFunc("newCircleFixture", &Body::newCircleFixture);
155 body.addFunc("destroy", &Body::destroy);
156
157 auto body3 = table.addClass<Body3D>(
158 "Body3D", std::function<Body3D *()>([]() -> Body3D * { return nullptr; }), true);
159 body3.addFunc("getId", &Body3D::getId);
160 body3.addFunc("setPosition", &Body3D::setPosition);
161 body3.addFunc("getX", &Body3D::getX);
162 body3.addFunc("getY", &Body3D::getY);
163 body3.addFunc("getZ", &Body3D::getZ);
164 body3.addFunc("setRotation", &Body3D::setRotation);
165 body3.addFunc("getRotX", &Body3D::getRotX);
166 body3.addFunc("getRotY", &Body3D::getRotY);
167 body3.addFunc("getRotZ", &Body3D::getRotZ);
168 body3.addFunc("getRotW", &Body3D::getRotW);
169 body3.addFunc("setLinearVelocity", &Body3D::setLinearVelocity);
170 body3.addFunc("getLinearVelocityX", &Body3D::getLinearVelocityX);
171 body3.addFunc("getLinearVelocityY", &Body3D::getLinearVelocityY);
172 body3.addFunc("getLinearVelocityZ", &Body3D::getLinearVelocityZ);
173 body3.addFunc("setAngularVelocity", &Body3D::setAngularVelocity);
174 body3.addFunc("getAngularVelocityX", &Body3D::getAngularVelocityX);
175 body3.addFunc("getAngularVelocityY", &Body3D::getAngularVelocityY);
176 body3.addFunc("getAngularVelocityZ", &Body3D::getAngularVelocityZ);
177 body3.addFunc("applyForce", &Body3D::applyForce);
178 body3.addFunc("applyForceAt", &Body3D::applyForceAt);
179 body3.addFunc("applyLinearImpulse", &Body3D::applyLinearImpulse);
180 body3.addFunc("applyAngularImpulse", &Body3D::applyAngularImpulse);
181 body3.addFunc("setType", &Body3D::setType);
182 body3.addFunc("getType", &Body3D::getType);
183 body3.addFunc("setFixedRotation", &Body3D::setFixedRotation);
184 body3.addFunc("isFixedRotation", &Body3D::isFixedRotation);
185 body3.addFunc("setActive", &Body3D::setActive);
186 body3.addFunc("isActive", &Body3D::isActive);
187 body3.addFunc("setBullet", &Body3D::setBullet);
188 body3.addFunc("isBullet", &Body3D::isBullet);
189 body3.addFunc("setAwake", &Body3D::setAwake);
190 body3.addFunc("isAwake", &Body3D::isAwake);
191 body3.addFunc("newBoxShape", &Body3D::newBoxShape);
192 body3.addFunc("newSphereShape", &Body3D::newSphereShape);
193 body3.addFunc("newCapsuleShape", &Body3D::newCapsuleShape);
194 body3.addFunc("destroy", &Body3D::destroy);
195
196 auto fixture = table.addClass<Fixture>(
197 "Fixture", std::function<Fixture *()>([]() -> Fixture * { return nullptr; }), true);
198 fixture.addFunc("setSensor", &Fixture::setSensor);
199 fixture.addFunc("isSensor", &Fixture::isSensor);
200 fixture.addFunc("setFriction", &Fixture::setFriction);
201 fixture.addFunc("getFriction", &Fixture::getFriction);
202 fixture.addFunc("setRestitution", &Fixture::setRestitution);
203 fixture.addFunc("getRestitution", &Fixture::getRestitution);
204 fixture.addFunc("setDensity", &Fixture::setDensity);
205 fixture.addFunc("getDensity", &Fixture::getDensity);
206 fixture.addFunc("setTag", &Fixture::setTag);
207 fixture.addFunc("getTag", &Fixture::getTag);
208 fixture.addFunc("setCategoryBits", &Fixture::setCategoryBits);
209 fixture.addFunc("getCategoryBits", &Fixture::getCategoryBits);
210 fixture.addFunc("setMaskBits", &Fixture::setMaskBits);
211 fixture.addFunc("getMaskBits", &Fixture::getMaskBits);
212 fixture.addFunc("setGroupIndex", &Fixture::setGroupIndex);
213 fixture.addFunc("getGroupIndex", &Fixture::getGroupIndex);
214 fixture.addFunc("getBodyId", &Fixture::getBodyId);
215 fixture.addFunc("getBody", &Fixture::getBody);
216 fixture.addFunc("testPoint", &Fixture::testPoint);
217 fixture.addFunc("destroy", &Fixture::destroy);
218
219 auto shape3 = table.addClass<Shape3D>(
220 "Shape3D", std::function<Shape3D *()>([]() -> Shape3D * { return nullptr; }), true);
221 shape3.addFunc("setSensor", &Shape3D::setSensor);
222 shape3.addFunc("isSensor", &Shape3D::isSensor);
223 shape3.addFunc("setFriction", &Shape3D::setFriction);
224 shape3.addFunc("getFriction", &Shape3D::getFriction);
225 shape3.addFunc("setRestitution", &Shape3D::setRestitution);
226 shape3.addFunc("getRestitution", &Shape3D::getRestitution);
227 shape3.addFunc("setDensity", &Shape3D::setDensity);
228 shape3.addFunc("getDensity", &Shape3D::getDensity);
229 shape3.addFunc("getBody", &Shape3D::getBody);
230 shape3.addFunc("testPoint", &Shape3D::testPoint);
231 shape3.addFunc("destroy", &Shape3D::destroy);
232
233 auto cloth = table.addClass<Cloth>(
234 "Cloth", std::function<Cloth *()>([]() -> Cloth * { return nullptr; }), true);
235 cloth.addFunc("update", &Cloth::update);
236 cloth.addFunc("setGravity", &Cloth::setGravity);
237 cloth.addFunc("getGravityX", &Cloth::getGravityX);
238 cloth.addFunc("getGravityY", &Cloth::getGravityY);
239 cloth.addFunc("setStiffness", &Cloth::setStiffness);
240 cloth.addFunc("getStiffness", &Cloth::getStiffness);
241 cloth.addFunc("setIterations", &Cloth::setIterations);
242 cloth.addFunc("getIterations", &Cloth::getIterations);
243 cloth.addFunc("setDamping", &Cloth::setDamping);
244 cloth.addFunc("getDamping", &Cloth::getDamping);
245 cloth.addFunc("setBounds", &Cloth::setBounds);
246 cloth.addFunc("clearBounds", &Cloth::clearBounds);
247 cloth.addFunc("pin", &Cloth::pin);
248 cloth.addFunc("unpin", &Cloth::unpin);
249 cloth.addFunc("pinTopRow", &Cloth::pinTopRow);
250 cloth.addFunc("isPinned", &Cloth::isPinned);
251 cloth.addFunc("grabAt", &Cloth::grabAt);
252 cloth.addFunc("moveGrab", &Cloth::moveGrab);
253 cloth.addFunc("releaseGrab", &Cloth::releaseGrab);
254 cloth.addFunc("isGrabbing", &Cloth::isGrabbing);
255 cloth.addFunc("getGrabIndex", &Cloth::getGrabIndex);
256 cloth.addFunc("applyForce", &Cloth::applyForce);
257 cloth.addFunc("setColor", &Cloth::setColor);
258 cloth.addFunc("draw", &Cloth::draw);
259 cloth.addFunc("getCols", &Cloth::getCols);
260 cloth.addFunc("getRows", &Cloth::getRows);
261 cloth.addFunc("getParticleCount", &Cloth::getParticleCount);
262 cloth.addFunc("getParticleX", &Cloth::getParticleX);
263 cloth.addFunc("getParticleY", &Cloth::getParticleY);
264 cloth.addFunc("setParticlePosition", &Cloth::setParticlePosition);
265 cloth.addFunc("getSpacing", &Cloth::getSpacing);
266 cloth.addFunc("destroy", &Cloth::destroy);
267
268 auto fluid = table.addClass<Fluid>(
269 "Fluid", std::function<Fluid *()>([]() -> Fluid * { return nullptr; }), true);
270 fluid.addFunc("update", &Fluid::update);
271 fluid.addFunc("setGravity", &Fluid::setGravity);
272 fluid.addFunc("getGravityX", &Fluid::getGravityX);
273 fluid.addFunc("getGravityY", &Fluid::getGravityY);
274 fluid.addFunc("setSmoothingRadius", &Fluid::setSmoothingRadius);
275 fluid.addFunc("getSmoothingRadius", &Fluid::getSmoothingRadius);
276 fluid.addFunc("setRestDensity", &Fluid::setRestDensity);
277 fluid.addFunc("getRestDensity", &Fluid::getRestDensity);
278 fluid.addFunc("setPressureStiffness", &Fluid::setPressureStiffness);
279 fluid.addFunc("getPressureStiffness", &Fluid::getPressureStiffness);
280 fluid.addFunc("setNearPressureStiffness", &Fluid::setNearPressureStiffness);
281 fluid.addFunc("getNearPressureStiffness", &Fluid::getNearPressureStiffness);
282 fluid.addFunc("setViscosity", &Fluid::setViscosity);
283 fluid.addFunc("getViscosity", &Fluid::getViscosity);
284 fluid.addFunc("setIterations", &Fluid::setIterations);
285 fluid.addFunc("getIterations", &Fluid::getIterations);
286 fluid.addFunc("setBounds", &Fluid::setBounds);
287 fluid.addFunc("clearBounds", &Fluid::clearBounds);
288 fluid.addFunc("emit", &Fluid::emit);
289 fluid.addFunc("clear", &Fluid::clear);
290 fluid.addFunc("interactAt", &Fluid::interactAt);
291 fluid.addFunc("setColor", &Fluid::setColor);
292 fluid.addFunc("setParticleSize", &Fluid::setParticleSize);
293 fluid.addFunc("getParticleSize", &Fluid::getParticleSize);
294 fluid.addFunc("draw", &Fluid::draw);
295 fluid.addFunc("getCapacity", &Fluid::getCapacity);
296 fluid.addFunc("getParticleCount", &Fluid::getParticleCount);
297 fluid.addFunc("getParticleX", &Fluid::getParticleX);
298 fluid.addFunc("getParticleY", &Fluid::getParticleY);
299 fluid.addFunc("getParticleVx", &Fluid::getParticleVx);
300 fluid.addFunc("getParticleVy", &Fluid::getParticleVy);
301 fluid.addFunc("destroy", &Fluid::destroy);
302}
303
304void Physics::expose(ssq::Class &cls) {
305 cls.addFunc("getName", &Physics::getName);
306 cls.addFunc("setMeter", &Physics::setMeter);
307 cls.addFunc("getMeter", &Physics::getMeter);
308 cls.addFunc("newWorld", &Physics::newWorld);
309 cls.addFunc("newWorld3D", &Physics::newWorld3D);
310 cls.addFunc("newCloth", &Physics::newCloth);
311 cls.addFunc("newFluid", &Physics::newFluid);
312}
313
314} // namespace eve::physics
HSQOBJECT cls
Definition ECS.cpp:21
JobFunc body
#define Module_IMPL(ModuleName, newExpr)
Definition Module.h:24
const char * name
Definition RockMesh.cpp:21
int spacing
virtual std::string getName() const =0
void setActive(bool active)
Disables/enables the body and its shapes.
Definition Body3D.cpp:235
void setRotation(float qx, float qy, float qz, float qw)
Orientation as quaternion (x, y, z, w).
Definition Body3D.cpp:113
bool isBullet() const
Definition Body3D.cpp:250
bool isActive() const
Definition Body3D.cpp:243
void applyForce(float fx, float fy, float fz)
Force applied at the center of mass.
Definition Body3D.cpp:190
float getLinearVelocityY() const
Definition Body3D.cpp:160
void applyLinearImpulse(float ix, float iy, float iz)
Instantaneous linear impulse.
Definition Body3D.cpp:200
void setFixedRotation(bool fixed)
Lock all angular axes (Box3D motion locks).
Definition Body3D.cpp:220
void applyAngularImpulse(float ix, float iy, float iz)
Instantaneous angular impulse.
Definition Body3D.cpp:205
float getX() const
Definition Body3D.cpp:98
bool isFixedRotation() const
Definition Body3D.cpp:229
void setBullet(bool bullet)
CCD bullet mode.
Definition Body3D.cpp:245
Shape3D * newBoxShape(float width, float height, float depth, float density=1.f, float friction=0.2f, float restitution=0.f)
Box extents are full width/height/depth in meters (same convention as Body.newRectangleFixture)....
Definition Body3D.cpp:259
float getY() const
Definition Body3D.cpp:103
void setAwake(bool awake)
Wakes / sleeps the body manually.
Definition Body3D.cpp:252
void destroy()
Destroys the body inside its world.
Definition Body3D.cpp:72
float getRotZ() const
Definition Body3D.cpp:140
float getRotY() const
Definition Body3D.cpp:135
float getRotX() const
Definition Body3D.cpp:130
float getAngularVelocityZ() const
Definition Body3D.cpp:185
int getId() const
Stable id used by collision events.
Definition Body3D.h:26
float getAngularVelocityX() const
Definition Body3D.cpp:175
std::string getType() const
Definition Body3D.cpp:215
float getRotW() const
Definition Body3D.cpp:145
void applyForceAt(float fx, float fy, float fz, float x, float y, float z)
Force applied at a world position.
Definition Body3D.cpp:195
Shape3D * newCapsuleShape(float height, float radius, float density=1.f, float friction=0.2f, float restitution=0.f)
Capsule along local Y; height is distance between hemisphere centers.
Definition Body3D.cpp:296
void setLinearVelocity(float vx, float vy, float vz)
Linear velocity in m/s.
Definition Body3D.cpp:150
bool isAwake() const
Definition Body3D.cpp:257
void setPosition(float x, float y, float z)
Position in meters.
Definition Body3D.cpp:93
void setType(const std::string &bodyType)
"static" | "kinematic" | "dynamic".
Definition Body3D.cpp:210
float getLinearVelocityZ() const
Definition Body3D.cpp:165
void setAngularVelocity(float wx, float wy, float wz)
Angular velocity in rad/s.
Definition Body3D.cpp:170
float getAngularVelocityY() const
Definition Body3D.cpp:180
float getZ() const
Definition Body3D.cpp:108
Shape3D * newSphereShape(float radius, float density=1.f, float friction=0.2f, float restitution=0.f)
Definition Body3D.cpp:279
float getLinearVelocityX() const
Definition Body3D.cpp:155
Fixture * newRectangleFixture(float width, float height, float density=1.f, float friction=0.2f, float restitution=0.f)
width/height in pixels; density kg/m² (Box2D units).
Definition Body.cpp:211
float getLinearVelocityX() const
Definition Body.cpp:113
void applyForceAt(float fx, float fy, float x, float y)
Force applied at a world pixel position.
Definition Body.cpp:156
void setBullet(bool bullet)
CCD bullet mode (recommended for fast small bodies).
Definition Body.cpp:197
float getX() const
Definition Body.cpp:88
void setAwake(bool awake)
Wakes / sleeps the body manually.
Definition Body.cpp:204
void setType(const std::string &bodyType)
"static" | "kinematic" | "dynamic".
Definition Body.cpp:173
void setAngle(float radians)
Rotation in radians.
Definition Body.cpp:98
float getLinearVelocityY() const
Definition Body.cpp:118
bool isActive() const
Definition Body.cpp:195
void applyLinearImpulse(float ix, float iy)
Instantaneous linear impulse.
Definition Body.cpp:162
Fixture * newCircleFixture(float radius, float density=1.f, float friction=0.2f, float restitution=0.f)
Definition Body.cpp:239
void setFixedRotation(bool fixed)
Locks rotation so the body cannot spin.
Definition Body.cpp:183
void applyForce(float fx, float fy)
Force (pixels/s² * kg) applied at the center of mass.
Definition Body.cpp:150
bool isAwake() const
Definition Body.cpp:209
bool isFixedRotation() const
Definition Body.cpp:188
bool isBullet() const
Definition Body.cpp:202
void setAngularVelocity(float omega)
Angular velocity in radians/s.
Definition Body.cpp:140
float getAngularVelocity() const
Definition Body.cpp:145
void destroy()
Destroys the body inside its world.
Definition Body.cpp:61
void applyAngularImpulse(float impulse)
Instantaneous angular impulse.
Definition Body.cpp:168
float getWorldCenterY() const
Definition Body.cpp:135
float getLinearSpeed() const
Magnitude of the linear velocity.
Definition Body.cpp:123
float getAngle() const
Definition Body.cpp:103
std::string getType() const
Definition Body.cpp:178
int getId() const
Stable id used by contact/impact events.
Definition Body.h:26
void setPosition(float x, float y)
Position in pixels.
Definition Body.cpp:83
float getWorldCenterX() const
World center of mass in pixels.
Definition Body.cpp:130
Fixture * newRectangleFixtureAt(float width, float height, float offsetX, float offsetY, float density=1.f, float friction=0.2f, float restitution=0.f)
Rectangle fixture with a local pixel-space offset from the body origin.
Definition Body.cpp:216
float getMass() const
Mass in kilograms (Box2D units).
Definition Body.cpp:128
void setActive(bool active)
Disables/enables the body and its fixtures.
Definition Body.cpp:190
void setLinearVelocity(float vx, float vy)
Linear velocity in pixels/s.
Definition Body.cpp:108
float getY() const
Definition Body.cpp:93
Interactive 2D cloth — Verlet particles + distance constraints. Pixel space (same convention as Box2D...
Definition Cloth.h:17
void setParticlePosition(int index, float x, float y)
Definition Cloth.cpp:178
void setBounds(float x, float y, float w, float h)
Axis-aligned walls; particles bounce inside. Disabled if w/h <= 0.
Definition Cloth.cpp:91
int getGrabIndex() const
Definition Cloth.h:67
void setStiffness(float stiffness)
Constraint relaxation strength in [0,1] (default 0.85).
Definition Cloth.cpp:79
int getCols() const
Definition Cloth.h:80
float getDamping() const
Definition Cloth.h:48
void setDamping(float damping)
Damping applied to Verlet velocity [0,1] (default 0.01).
Definition Cloth.cpp:87
float getParticleX(int index) const
Definition Cloth.cpp:168
int getRows() const
Definition Cloth.h:81
bool isPinned(int index) const
Definition Cloth.cpp:120
float getParticleY(int index) const
Definition Cloth.cpp:173
void setGravity(float gx, float gy)
Definition Cloth.cpp:74
int getParticleCount() const
Definition Cloth.h:82
void moveGrab(float x, float y)
Definition Cloth.cpp:143
void update(float dt)
Definition Cloth.cpp:273
float getGravityX() const
Definition Cloth.h:35
float getStiffness() const
Definition Cloth.h:40
void setColor(float r, float g, float b, float a=1.f)
Definition Cloth.cpp:161
bool isGrabbing() const
Definition Cloth.h:66
void pin(int index)
Definition Cloth.cpp:105
float getGravityY() const
Definition Cloth.h:36
void applyForce(float fx, float fy)
Definition Cloth.cpp:156
void draw(graphics::Graphics *gfx)
Definition Cloth.cpp:296
void setIterations(int iterations)
Constraint solver iterations per substep (default 4).
Definition Cloth.cpp:83
int getIterations() const
Definition Cloth.h:44
int grabAt(float x, float y, float radius=24.f)
Grab nearest free particle within radius (pixels). Returns particle index, or -1 if none.
Definition Cloth.cpp:125
void unpin(int index)
Definition Cloth.cpp:110
float getSpacing() const
Definition Cloth.h:87
void destroy()
Destroys the fixture inside its world.
Definition Fixture.cpp:30
Body * getBody()
Owning body.
Definition Fixture.h:55
void setSensor(bool sensor)
Sensor fixtures report contacts but never collide.
Definition Fixture.cpp:43
bool testPoint(float x, float y) const
Pixel-space point-in-fixture test (uses World meter).
Definition Fixture.cpp:105
int getMaskBits() const
Definition Fixture.cpp:90
int getCategoryBits() const
Definition Fixture.cpp:79
void setMaskBits(int bits)
Definition Fixture.cpp:83
float getFriction() const
Definition Fixture.cpp:55
void setDensity(float density)
Definition Fixture.cpp:64
bool isSensor() const
Definition Fixture.cpp:48
void setFriction(float friction)
Material properties.
Definition Fixture.cpp:50
int getGroupIndex() const
Definition Fixture.cpp:99
int getBodyId() const
Id of the owning body.
Definition Fixture.cpp:103
void setCategoryBits(int bits)
Collision filtering (Box2D category/mask bits, group index).
Definition Fixture.cpp:72
void setGroupIndex(int index)
Definition Fixture.cpp:92
const std::string & getTag() const
Definition Fixture.h:41
float getDensity() const
Definition Fixture.cpp:70
void setRestitution(float restitution)
Definition Fixture.cpp:57
void setTag(const std::string &tag)
Arbitrary string tag surfaced in begin/end contact events.
Definition Fixture.h:40
float getRestitution() const
Definition Fixture.cpp:62
Interactive 2D particle fluid (double-density relaxation) in pixel space. Script-owned; independent o...
Definition Fluid.h:17
int emit(float x, float y, int count, float vx=0.f, float vy=0.f)
Spawn up to count particles at (x,y) with initial velocity. Returns number actually added.
Definition Fluid.cpp:65
float getViscosity() const
Definition Fluid.h:48
float getGravityY() const
Definition Fluid.h:29
float getParticleVx(int index) const
Definition Fluid.cpp:119
float getParticleVy(int index) const
Definition Fluid.cpp:124
float getRestDensity() const
Definition Fluid.h:37
void setRestDensity(float density)
Target rest density for the relaxation solver (default 4).
Definition Fluid.cpp:38
float getPressureStiffness() const
Definition Fluid.h:41
void setColor(float r, float g, float b, float a=1.f)
Definition Fluid.cpp:96
int getParticleCount() const
Definition Fluid.h:86
void setIterations(int iterations)
Solver iterations per frame (default 3).
Definition Fluid.cpp:49
int getIterations() const
Definition Fluid.h:52
void setParticleSize(float size)
Particle draw size in pixels (default 5).
Definition Fluid.cpp:103
void setBounds(float x, float y, float w, float h)
Axis-aligned container; particles bounce inside.
Definition Fluid.cpp:51
void setViscosity(float viscosity)
Definition Fluid.cpp:47
void update(float dt)
Definition Fluid.cpp:266
float getNearPressureStiffness() const
Definition Fluid.h:45
float getParticleY(int index) const
Definition Fluid.cpp:114
int getCapacity() const
Definition Fluid.h:85
void draw(graphics::Graphics *gfx)
Definition Fluid.cpp:329
float getSmoothingRadius() const
Definition Fluid.h:33
void setPressureStiffness(float k)
Pressure stiffness (default 0.5).
Definition Fluid.cpp:43
void setSmoothingRadius(float radius)
Interaction / neighbor radius in pixels (default 18).
Definition Fluid.cpp:33
float getGravityX() const
Definition Fluid.h:28
float getParticleSize() const
Definition Fluid.h:81
void clear()
Clear all particles.
Definition Fluid.cpp:84
void setNearPressureStiffness(float k)
Near-pressure (anti-clustering) stiffness (default 0.5).
Definition Fluid.cpp:45
void interactAt(float x, float y, float radius, float strength)
Mouse / pointer interaction: positive strength attracts, negative repels. Applied as acceleration wit...
Definition Fluid.cpp:89
float getParticleX(int index) const
Definition Fluid.cpp:109
void setGravity(float gx, float gy)
Definition Fluid.cpp:28
Physics module — Box2D (2D) + Box3D (3D) rigid bodies, plus interactive cloth / SPH fluid....
Definition Physics.h:17
World3D * newWorld3D(float gravityX, float gravityY, float gravityZ, bool sleep=true)
Create a 3D Box3D physics world. Coordinates are meters (Box3D native); +Y is up by convention.
Definition Physics.cpp:34
void setMeter(float pixelsPerMeter)
Pixels per meter for 2D Box2D worlds (default 30, same as LÖVE).
Definition Physics.cpp:22
Fluid * newFluid(int capacity=512)
Create an SPH fluid container with particle capacity.
Definition Physics.cpp:42
Cloth * newCloth(int cols, int rows, float spacing, float originX, float originY)
Create a Verlet cloth grid (top row pinned).
Definition Physics.cpp:38
float getMeter() const
Definition Physics.cpp:28
World * newWorld(float gravityX, float gravityY, bool sleep=true)
Create a 2D Box2D physics world.
Definition Physics.cpp:30
void setDensity(float density)
Definition Shape3D.cpp:126
bool testPoint(float x, float y, float z) const
Point-in-shape test in world meters.
Definition Shape3D.cpp:133
bool isSensor() const
Definition Shape3D.cpp:108
void setRestitution(float restitution)
Definition Shape3D.cpp:117
float getFriction() const
Definition Shape3D.cpp:115
float getRestitution() const
Definition Shape3D.cpp:122
void destroy()
Destroys the shape inside its world.
Definition Shape3D.cpp:49
float getDensity() const
Definition Shape3D.cpp:131
Body3D * getBody()
Owning body.
Definition Shape3D.h:42
void setSensor(bool sensor)
Sensor shapes report contacts but never collide.
Definition Shape3D.cpp:102
void setFriction(float friction)
Material properties.
Definition Shape3D.cpp:110
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Definition World3D.h:18
void setGravity(float gx, float gy, float gz)
Gravity in m/s².
Definition World3D.cpp:76
int getQueryBodyId(int index) const
Body id of the i-th query hit.
Definition World3D.cpp:204
bool hasRayHit() const
Definition World3D.h:50
void update(float dt)
Steps the simulation by dt seconds (default substep count).
Definition World3D.cpp:65
float getRayHitX() const
Definition World3D.h:52
float getRayHitY() const
Definition World3D.h:53
float getGravityX() const
Definition World3D.cpp:81
int getQueryCount() const
Number of bodies hit by the last queryAABB().
Definition World3D.h:66
float getRayHitNormalX() const
Definition World3D.h:55
float getRayHitNormalZ() const
Definition World3D.h:57
float getGravityY() const
Definition World3D.cpp:86
int rayCast(float x1, float y1, float z1, float x2, float y2, float z2)
Closest raycast from (x1,y1,z1) to (x2,y2,z2) in meters. Returns hit body id, or -1....
Definition World3D.cpp:146
int queryAABB(float minX, float minY, float minZ, float maxX, float maxY, float maxZ)
Query shapes overlapping an AABB in meters (min/max corners). Returns match count; read ids with getQ...
Definition World3D.cpp:177
void updateFull(float dt, int subStepCount)
Steps with an explicit substep count.
Definition World3D.cpp:67
void destroyBody(Body3D *body)
Destroys a body (null is ignored).
Definition World3D.cpp:113
float getGravityZ() const
Definition World3D.cpp:91
void destroy()
Destroys the world and invalidates all wrappers.
Definition World3D.cpp:43
float getRayHitZ() const
Definition World3D.h:54
int getRayHitBodyId() const
Definition World3D.h:51
Body3D * newBody(const std::string &bodyType, float x, float y, float z)
bodyType: "static" | "kinematic" | "dynamic". Position in meters.
Definition World3D.cpp:98
float getRayHitFraction() const
Definition World3D.h:58
float getRayHitNormalY() const
Definition World3D.h:56
Box2D world wrapper (2D physics) with pixel-space coordinates. Handles stepping, gravity,...
Definition World.h:31
void setMeter(float pixelsPerMeter)
Changes the pixels-per-meter conversion.
Definition World.cpp:219
float getRayHitX() const
Definition World.h:93
int getRayHitBodyId() const
Definition World.h:92
void update(float dt)
Steps the simulation by dt seconds (5 velocity / 2 position iterations).
Definition World.cpp:194
int queryAABB(float x, float y, float w, float h)
Query fixtures overlapping an axis-aligned box in pixel space (x,y,w,h). Returns match count; read id...
Definition World.cpp:484
float getImpactNormalY(int index) const
Definition World.cpp:412
void destroyBody(Body *body)
Destroys a body (null is ignored).
Definition World.cpp:244
std::string getBeginContactFixtureATag(int index) const
Definition World.cpp:373
float getRayHitY() const
Definition World.h:94
std::string getEndContactFixtureATag(int index) const
Definition World.cpp:385
float getImpactPointX(int index) const
Definition World.cpp:403
void drawDebug(graphics::Graphics *gfx)
Optional: draw fixture AABBs via Graphics::drawSolidRect.
Definition World.cpp:432
int getQueryBodyId(int index) const
Definition World.cpp:515
int getQueryCount() const
Definition World.h:105
int getEndContactBodyBId(int index) const
Definition World.cpp:382
int getBeginContactBodyBId(int index) const
Definition World.cpp:370
void destroy()
Destroys the underlying Box2D world and resets event buffers.
Definition World.cpp:159
void setGravity(float gx, float gy)
Sets the world gravity vector in pixels/s^2.
Definition World.cpp:204
int getEndContactBodyAId(int index) const
Definition World.cpp:379
int getImpactCount() const
Definition World.h:119
float getGravityX() const
Definition World.cpp:209
float getRayHitFraction() const
Fraction along the segment [0,1] of the closest hit.
Definition World.h:98
float getRayHitNormalY() const
Definition World.h:96
bool hasRayHit() const
Definition World.h:91
float getImpactNormalX(int index) const
Definition World.cpp:409
float getImpactRelativeNormalSpeed(int index) const
Definition World.cpp:415
Body * newBody(const std::string &bodyType, float x, float y)
bodyType: "static" | "kinematic" | "dynamic". x/y in pixels.
Definition World.cpp:230
int getBeginContactBodyAId(int index) const
Definition World.cpp:367
int getImpactBodyAId(int index) const
Definition World.cpp:391
int getBeginContactCount() const
Definition World.h:108
int getImpactBodyBId(int index) const
Definition World.cpp:394
float getRayHitNormalX() const
Definition World.h:95
int getEndContactCount() const
Definition World.h:113
float getImpactNormalImpulse(int index) const
Definition World.cpp:418
std::string getEndContactFixtureBTag(int index) const
Definition World.cpp:388
int rayCast(float x1, float y1, float x2, float y2)
Closest raycast in pixel space from (x1,y1) to (x2,y2). Returns hit body id, or -1....
Definition World.cpp:439
float getImpactTangentImpulse(int index) const
Definition World.cpp:421
float getGravityY() const
Definition World.cpp:214
std::string getBeginContactFixtureBTag(int index) const
Definition World.cpp:376
void updateFull(float dt, int velocityIterations, int positionIterations)
Steps with explicit iteration counts.
Definition World.cpp:196
void clearContactEvents()
Clears collected begin/end contact and impact event buffers.
Definition World.cpp:425
std::string getImpactFixtureATag(int index) const
Definition World.cpp:397
std::string getImpactFixtureBTag(int index) const
Definition World.cpp:400
float getMeter() const
Definition World.h:73
float getImpactPointY(int index) const
Definition World.cpp:406
void registerPhysicsCapabilities()