| 39 | | # |
| 40 | | _scenes.lock() |
| 41 | | _maxstep = 0 |
| 42 | | for i from 0 <= i < _scenes.current : |
| 43 | | _scene = <soy.scenes.Scene> _scenes.list[i] |
| 44 | | _scene._updateTime() |
| 45 | | # Clear outdated lists |
| 46 | | _callfields._empty() |
| 47 | | _givefields._empty() |
| 48 | | _scene._bodies.lock() |
| 49 | | for j from 0 <= j < _scene._bodies.current : |
| 50 | | if isinstance(<soy.bodies._bodies.Body> _scene._bodies.list[j], |
| 51 | | soy.bodies.fields.Field) : |
| 52 | | # Make sure every field is in givefields & _give each one |
| 53 | | if not _givefields._has_key(<void*> _scene._bodies.list[j]) : |
| 54 | | (<soy.bodies.fields.Field> _scene._bodies.list[j])._give(0) |
| 55 | | _givefields._insert(<void*> _scene._bodies.list[j]) |
| 56 | | |
| 57 | | for j from 0 <= j < _scene._bodies.current : |
| 58 | | if isinstance(<soy.bodies._bodies.Body> _scene._bodies.list[j], |
| 59 | | soy.bodies.fields.Field) : |
| 60 | | # Apply fields; add incompletly applied fiels to the list |
| 61 | | if not (<soy.bodies.fields.Field> _scene._bodies.list[j])._apply() : |
| 62 | | _callfields._insert(_scene._bodies.list[j]) |
| 63 | | # Apply any outstanding fields |
| 64 | | _callfields._foreach(_runField, NULL) |
| 65 | | _step = _scene._steps() |
| 66 | | if _step > _maxstep : |
| 67 | | _maxstep = _step |
| 68 | | _scene._stepLock() |
| 69 | | for j from 0 <= j < _step : |
| 70 | | _scene._updateTime() |
| 71 | | _givefields._foreach(_prerunField, NULL) |
| 72 | | _callfields._empty() |
| 73 | | ode.dSpaceCollide(_scene._spaceID, NULL, _callback) |
| 74 | | ode.dWorldQuickStep(_scene._worldID, _scene._stepSize) |
| 75 | | ode.dJointGroupEmpty(_contactgroup) |
| 76 | | if j != 0 : |
| 77 | | _callfields._foreach(_runField, NULL) |
| 78 | | _scene._stepUnLock() |
| 79 | | _scene._bodies.unlock() |
| 80 | | _scenes.unlock() |
| 81 | | if _maxstep == 0 : |
| 82 | | soy._internals._sleep(10) |
| 83 | | else : |
| 84 | | soy._internals._sleep(1) |
| | 32 | soy._internals._sleep(1) |