@@ -13,8 +13,7 @@ using namespace godot;
13
13
#define B2_DEBUG true
14
14
15
15
struct Box2DHolder {
16
- HashMap<b2WorldId, ActiveBodyCallback> active_body_callbacks;
17
- HashMap<int , int > active_objects;
16
+ HashMap<int , ActiveBodyCallback> active_body_callbacks;
18
17
};
19
18
20
19
Box2DHolder holder;
@@ -470,7 +469,9 @@ void box2d::body_wake_up(b2BodyId body_handle) {
470
469
#ifdef B2_DEBUG
471
470
UtilityFunctions::print (" box2d::body_wake_up: " , rtos (body_handle.index ));
472
471
#endif
473
- b2Body_Wake (body_handle);
472
+ if (b2Body_GetType (body_handle) == b2BodyType::b2_kinematicBody) {
473
+ b2Body_Wake (body_handle);
474
+ }
474
475
}
475
476
476
477
b2ShapeId create_collider (b2BodyId body_handle, b2FixtureUserData *user_data, Material mat, ShapeData shape_data, bool isSensor) {
@@ -1352,13 +1353,6 @@ void box2d::world_destroy(b2WorldId world_handle) {
1352
1353
b2DestroyWorld (world_handle);
1353
1354
}
1354
1355
1355
- size_t box2d::world_get_active_objects_count (b2WorldId world_handle) {
1356
- #ifdef B2_DEBUG
1357
- UtilityFunctions::print (" box2d::world_get_active_objects_count" , rtos (world_handle.index ));
1358
- #endif
1359
- return holder.active_objects [handle_hash (world_handle)];
1360
- }
1361
-
1362
1356
void box2d::world_set_active_body_callback (b2WorldId world_handle, ActiveBodyCallback callback) {
1363
1357
#ifdef B2_DEBUG
1364
1358
UtilityFunctions::print (" box2d::world_set_active_body_callback" , rtos (world_handle.index ));
@@ -1380,38 +1374,39 @@ void box2d::world_set_collision_filter_callback(b2WorldId world_handle,
1380
1374
}
1381
1375
1382
1376
// TODO
1383
- void box2d::world_step (b2WorldId world_handle, SimulationSettings settings) {
1377
+ void box2d::world_step (b2WorldId world_handle, SimulationSettings settings, std::vector<b2BodyId> active_bodies ) {
1384
1378
#ifdef B2_DEBUG
1385
1379
UtilityFunctions::print (" box2d::world_step" , rtos (world_handle.index ));
1386
1380
#endif
1387
1381
// world_handle->SetGravity(settings->gravity);
1388
1382
// TODO set world gravity
1389
1383
b2World_Step (world_handle, settings.dt , settings.sub_step_count );
1390
- int active_objects = 0 ;
1391
- if (holder.active_body_callbacks .has (world_handle)) {
1392
- ActiveBodyCallback callback = holder.active_body_callbacks [world_handle];
1393
- for (b2BodyId body = world_handle->GetBodyList (); body != nullptr ; body = body->GetNext ()) {
1394
- if (body->GetType () == b2_kinematicBody) {
1395
- b2BodyUserData &userData = body->GetUserData ();
1396
- userData.old_angular_velocity = body->GetAngularVelocity ();
1397
- userData.old_linear_velocity = b2Vec2_to_Vector2 (body->GetLinearVelocity ());
1398
- body->SetLinearVelocity (b2Vec2_zero);
1399
- body->SetAngularVelocity (0 );
1384
+ if (holder.active_body_callbacks .has (handle_hash (world_handle))) {
1385
+ ActiveBodyCallback callback = holder.active_body_callbacks [handle_hash (world_handle)];
1386
+ b2BodyEvents bodyEvents = b2World_GetBodyEvents (world_handle);
1387
+ b2SensorEvents sensorEvents = b2World_GetSensorEvents (world_handle);
1388
+ // get bodies from active_bodies vector
1389
+ for (b2BodyId body_handle : active_bodies) {
1390
+ b2BodyType type = b2Body_GetType (body_handle);
1391
+ b2BodyUserData *userData = get_body_user_data (body_handle);
1392
+ if (type == b2_kinematicBody) {
1393
+ userData->old_angular_velocity = b2Body_GetAngularVelocity (body_handle);
1394
+ userData->old_linear_velocity = b2Vec2_to_Vector2 (b2Body_GetLinearVelocity (body_handle));
1395
+ b2Body_SetLinearVelocity (body_handle, b2Vec2_zero);
1396
+ b2Body_SetAngularVelocity (body_handle, 0.0 );
1400
1397
}
1401
- Vector2 constant_force = body-> GetUserData (). constant_force ;
1398
+ Vector2 constant_force = userData-> constant_force ;
1402
1399
if (constant_force != Vector2 ()) {
1403
- body-> ApplyForceToCenter ( Vector2_to_b2Vec2 (constant_force), true );
1400
+ b2Body_ApplyForceToCenter (body_handle, Vector2_to_b2Vec2 (constant_force), true );
1404
1401
}
1405
- real_t constant_torque = body-> GetUserData (). constant_torque ;
1402
+ real_t constant_torque = userData-> constant_torque ;
1406
1403
if (constant_torque != 0.0 ) {
1407
- body-> ApplyTorque ( constant_torque, true );
1404
+ b2Body_ApplyTorque (body_handle, constant_torque, true );
1408
1405
}
1409
- if (body->IsAwake () && body->GetUserData ().collision_object ->get_type () == Box2DCollisionObject2D::Type::TYPE_BODY) {
1410
- active_objects++;
1411
- ActiveBodyInfo info{ body, body->GetUserData () };
1406
+ if (userData->collision_object ->get_type () == Box2DCollisionObject2D::Type::TYPE_BODY) {
1407
+ ActiveBodyInfo info{ body_handle, *userData };
1412
1408
callback (info);
1413
1409
}
1414
1410
}
1415
1411
}
1416
- // holder.active_objects[world_handle] = active_objects;
1417
1412
}
0 commit comments