int main(int argc, char **argv) { const int NUM_OF_BODIES_DEFAULT = 1000; const int NUM_OF_TIME_STEPS_DEFAULT = 10; const int num_of_bodies = (argc > 1) ? atoi(argv[1]) : NUM_OF_BODIES_DEFAULT; const int num_of_time_steps = (argc > 2) ? atoi(argv[2]) : NUM_OF_TIME_STEPS_DEFAULT; const double delta_t = 0.01; const double theta = 1.0; printf("Bodies: %d, time steps: %d\n", num_of_bodies, num_of_time_steps); Body *bodies = new Body[num_of_bodies]; clock_t c_beg = clock(); Domain2D domain(-10.0, 10.0, -10.0, 10.0); initBodies(bodies, num_of_bodies, domain); for (int t = 0; t < num_of_time_steps; t++) { QuadTree tree(bodies, num_of_bodies, domain); computeForces(bodies, num_of_bodies, tree, theta); updateBodies(bodies, num_of_bodies, delta_t); //printf("%d %d\n", tree.getHeight(), tree.getSize()); } clock_t c_end = clock(); printf("Time to compute: %.5f seconds\n", float(c_end - c_beg)/CLOCKS_PER_SEC); delete[] bodies; return 0; }
void PhysicsWorld::update(float delta, bool userCall/* = false*/) { if(!_delayAddBodies.empty()) { updateBodies(); } else if (!_delayRemoveBodies.empty()) { updateBodies(); } auto sceneToWorldTransform = _scene->getNodeToParentTransform(); beforeSimulation(_scene, sceneToWorldTransform, 1.f, 1.f, 0.f); if (!_delayAddJoints.empty() || !_delayRemoveJoints.empty()) { updateJoints(); } if (delta < FLT_EPSILON) { return; } if (userCall) { #if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 cpSpaceStep(_cpSpace, delta); #else cpHastySpaceStep(_cpSpace, delta); #endif } else { _updateTime += delta; if(_fixedRate) { const float step = 1.0f / _fixedRate; const float dt = step * _speed; while(_updateTime>step) { _updateTime-=step; #if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 cpSpaceStep(_cpSpace, dt); #else cpHastySpaceStep(_cpSpace, dt); #endif } } else { if (++_updateRateCount >= _updateRate) { const float dt = _updateTime * _speed / _substeps; for (int i = 0; i < _substeps; ++i) { #if CC_TARGET_PLATFORM == CC_PLATFORM_WINRT || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32 cpSpaceStep(_cpSpace, dt); #else cpHastySpaceStep(_cpSpace, dt); #endif for (auto& body : _bodies) { body->update(dt); } } _updateRateCount = 0; _updateTime = 0.0f; } } } if (_debugDrawMask != DEBUGDRAW_NONE) { debugDraw(); } // Update physics position, should loop as the same sequence as node tree. // PhysicsWorld::afterSimulation() will depend on the sequence. afterSimulation(_scene, sceneToWorldTransform, 0.f); }