def Step(self, settings): """ The main physics step. Takes care of physics drawing (callbacks are executed after the world.Step() ) and drawing additional information. """ # Update the settings based on the GUI self.gui_table.updateSettings(settings) # Don't do anything if the setting's Hz are <= 0 if settings.hz > 0.0: timeStep = 1.0 / settings.hz else: timeStep = 0.0 # If paused, display so if settings.pause: if settings.singleStep: settings.singleStep=False else: timeStep = 0.0 self.DrawString(5, self.textLine, "****PAUSED****") self.textLine += 15 # Set the flags based on what the settings show (uses a bitwise or mask) flags = 0 if settings.drawShapes: flags |= box2d.b2DebugDraw.e_shapeBit if settings.drawJoints: flags |= box2d.b2DebugDraw.e_jointBit if settings.drawCoreShapes: flags |= box2d.b2DebugDraw.e_coreShapeBit if settings.drawAABBs: flags |= box2d.b2DebugDraw.e_aabbBit if settings.drawOBBs: flags |= box2d.b2DebugDraw.e_obbBit if settings.drawPairs: flags |= box2d.b2DebugDraw.e_pairBit if settings.drawCOMs: flags |= box2d.b2DebugDraw.e_centerOfMassBit self.debugDraw.SetFlags(flags) # Set the other settings that aren't contained in the flags self.world.SetWarmStarting(settings.enableWarmStarting) self.world.SetPositionCorrection(settings.enablePositionCorrection) self.world.SetContinuousPhysics(settings.enableTOI) # Reset the collision points self.points = [] # Tell Box2D to step self.world.Step(timeStep, settings.iterationCount) self.world.Validate() # If the bomb is frozen, get rid of it. if self.bomb and self.bomb.IsFrozen(): self.world.DestroyBody(self.bomb) self.bomb = None if settings.drawStats: self.DrawString(5, self.textLine, "proxies(max) = %d(%d), pairs(max) = %d(%d)" % ( self.world.GetProxyCount(), box2d.b2_maxProxies, self.world.GetPairCount(), box2d.b2_maxPairs) ) self.textLine += 15 self.DrawString(5, self.textLine, "bodies/contacts/joints = %d/%d/%d" % (self.world.GetBodyCount(), self.world.GetContactCount(), self.world.GetJointCount())) self.textLine += 15 self.DrawString(5, self.textLine, "hz %d iterations %d" % (settings.hz, settings.iterationCount)) self.textLine += 15 #self.DrawString(5, self.textLine, "heap bytes = %d" % box2d.b2_byteCount) # not wrapped? #self.textLine += 15 if settings.drawFPS: #python version only self.DrawString(5, self.textLine, "FPS %d" % self.fps) self.textLine += 15 # If there's a mouse joint, draw the connection between the object and the current pointer position. if self.mouseJoint: body = self.mouseJoint.GetBody2() p1 = body.GetWorldPoint(self.mouseJoint.m_localAnchor) p2 = self.mouseJoint.m_target self.debugDraw.DrawPoint(p1, settings.pointSize, box2d.b2Color(0,1.0,0)) self.debugDraw.DrawPoint(p2, settings.pointSize, box2d.b2Color(0,1.0,0)) self.debugDraw.DrawSegment(p1, p2, box2d.b2Color(0.8,0.8,0.8)) # Draw each of the contact points in different colors. if self.settings.drawContactPoints: #k_impulseScale = 0.1 k_axisScale = 0.3 for point in self.points: if point.state == fwContactTypes.contactAdded: self.debugDraw.DrawPoint(point.position, settings.pointSize, box2d.b2Color(0.3, 0.95, 0.3)) elif point.state == fwContactTypes.contactPersisted: self.debugDraw.DrawPoint(point.position, settings.pointSize, box2d.b2Color(0.3, 0.3, 0.95)) else: #elif point.state == fwContactTypes.contactRemoved: self.debugDraw.DrawPoint(point.position, settings.pointSize, box2d.b2Color(0.95, 0.3, 0.3)) if settings.drawContactNormals: p1 = point.position p2 = p1 + k_axisScale * point.normal self.debugDraw.DrawSegment(p1, p2, box2d.b2Color(0.4, 0.9, 0.4))