From: dsc Date: Thu, 5 May 2011 06:46:43 +0000 (-0700) Subject: Rolls back update to Box2D SVN trunk. X-Git-Tag: box2d-testbed~8 X-Git-Url: http://git.less.ly:3516/?a=commitdiff_plain;h=7195dae657073b0f12205fb40b292b319a28593b;p=tanks-ios.git Rolls back update to Box2D SVN trunk. --- diff --git a/libs/box2d/box2d-ios.xcodeproj/project.pbxproj b/libs/box2d/box2d-ios.xcodeproj/project.pbxproj index edca52a..7a456a4 100644 --- a/libs/box2d/box2d-ios.xcodeproj/project.pbxproj +++ b/libs/box2d/box2d-ios.xcodeproj/project.pbxproj @@ -7,156 +7,156 @@ objects = { /* Begin PBXBuildFile section */ - 491330C81372616300DFB46D /* Box2D.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913307B1372616300DFB46D /* Box2D.h */; }; - 491330C91372616300DFB46D /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913307D1372616300DFB46D /* b2BroadPhase.cpp */; }; - 491330CA1372616300DFB46D /* b2BroadPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913307E1372616300DFB46D /* b2BroadPhase.h */; }; - 491330CB1372616300DFB46D /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913307F1372616300DFB46D /* b2CollideCircle.cpp */; }; - 491330CC1372616300DFB46D /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330801372616300DFB46D /* b2CollidePolygon.cpp */; }; - 491330CD1372616300DFB46D /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330811372616300DFB46D /* b2Collision.cpp */; }; - 491330CE1372616300DFB46D /* b2Collision.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330821372616300DFB46D /* b2Collision.h */; }; - 491330CF1372616300DFB46D /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330831372616300DFB46D /* b2Distance.cpp */; }; - 491330D01372616300DFB46D /* b2Distance.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330841372616300DFB46D /* b2Distance.h */; }; - 491330D11372616300DFB46D /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330851372616300DFB46D /* b2DynamicTree.cpp */; }; - 491330D21372616300DFB46D /* b2DynamicTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330861372616300DFB46D /* b2DynamicTree.h */; }; - 491330D31372616300DFB46D /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330871372616300DFB46D /* b2TimeOfImpact.cpp */; }; - 491330D41372616300DFB46D /* b2TimeOfImpact.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330881372616300DFB46D /* b2TimeOfImpact.h */; }; - 491330D51372616300DFB46D /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913308A1372616300DFB46D /* b2CircleShape.cpp */; }; - 491330D61372616300DFB46D /* b2CircleShape.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913308B1372616300DFB46D /* b2CircleShape.h */; }; - 491330D71372616300DFB46D /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913308C1372616300DFB46D /* b2PolygonShape.cpp */; }; - 491330D81372616300DFB46D /* b2PolygonShape.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913308D1372616300DFB46D /* b2PolygonShape.h */; }; - 491330D91372616300DFB46D /* b2Shape.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913308E1372616300DFB46D /* b2Shape.h */; }; - 491330DA1372616300DFB46D /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330901372616300DFB46D /* b2BlockAllocator.cpp */; }; - 491330DB1372616300DFB46D /* b2BlockAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330911372616300DFB46D /* b2BlockAllocator.h */; }; - 491330DC1372616300DFB46D /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330921372616300DFB46D /* b2Math.cpp */; }; - 491330DD1372616300DFB46D /* b2Math.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330931372616300DFB46D /* b2Math.h */; }; - 491330DE1372616300DFB46D /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330941372616300DFB46D /* b2Settings.cpp */; }; - 491330DF1372616300DFB46D /* b2Settings.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330951372616300DFB46D /* b2Settings.h */; }; - 491330E01372616300DFB46D /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330961372616300DFB46D /* b2StackAllocator.cpp */; }; - 491330E11372616300DFB46D /* b2StackAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330971372616300DFB46D /* b2StackAllocator.h */; }; - 491330E21372616300DFB46D /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330991372616300DFB46D /* b2Body.cpp */; }; - 491330E31372616300DFB46D /* b2Body.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913309A1372616300DFB46D /* b2Body.h */; }; - 491330E41372616300DFB46D /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913309B1372616300DFB46D /* b2ContactManager.cpp */; }; - 491330E51372616300DFB46D /* b2ContactManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913309C1372616300DFB46D /* b2ContactManager.h */; }; - 491330E61372616300DFB46D /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913309D1372616300DFB46D /* b2Fixture.cpp */; }; - 491330E71372616300DFB46D /* b2Fixture.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913309E1372616300DFB46D /* b2Fixture.h */; }; - 491330E81372616300DFB46D /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913309F1372616300DFB46D /* b2Island.cpp */; }; - 491330E91372616300DFB46D /* b2Island.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330A01372616300DFB46D /* b2Island.h */; }; - 491330EA1372616300DFB46D /* b2TimeStep.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330A11372616300DFB46D /* b2TimeStep.h */; }; - 491330EB1372616300DFB46D /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330A21372616300DFB46D /* b2World.cpp */; }; - 491330EC1372616300DFB46D /* b2World.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330A31372616300DFB46D /* b2World.h */; }; - 491330ED1372616300DFB46D /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330A41372616300DFB46D /* b2WorldCallbacks.cpp */; }; - 491330EE1372616300DFB46D /* b2WorldCallbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330A51372616300DFB46D /* b2WorldCallbacks.h */; }; - 491330EF1372616300DFB46D /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330A71372616300DFB46D /* b2CircleContact.cpp */; }; - 491330F01372616300DFB46D /* b2CircleContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330A81372616300DFB46D /* b2CircleContact.h */; }; - 491330F11372616300DFB46D /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330A91372616300DFB46D /* b2Contact.cpp */; }; - 491330F21372616300DFB46D /* b2Contact.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330AA1372616300DFB46D /* b2Contact.h */; }; - 491330F31372616300DFB46D /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330AB1372616300DFB46D /* b2ContactSolver.cpp */; }; - 491330F41372616300DFB46D /* b2ContactSolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330AC1372616300DFB46D /* b2ContactSolver.h */; }; - 491330F51372616300DFB46D /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330AD1372616300DFB46D /* b2PolygonAndCircleContact.cpp */; }; - 491330F61372616300DFB46D /* b2PolygonAndCircleContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330AE1372616300DFB46D /* b2PolygonAndCircleContact.h */; }; - 491330F71372616300DFB46D /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330AF1372616300DFB46D /* b2PolygonContact.cpp */; }; - 491330F81372616300DFB46D /* b2PolygonContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330B01372616300DFB46D /* b2PolygonContact.h */; }; - 491330F91372616300DFB46D /* b2TOISolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330B11372616300DFB46D /* b2TOISolver.cpp */; }; - 491330FA1372616300DFB46D /* b2TOISolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330B21372616300DFB46D /* b2TOISolver.h */; }; - 491330FB1372616300DFB46D /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330B41372616300DFB46D /* b2DistanceJoint.cpp */; }; - 491330FC1372616300DFB46D /* b2DistanceJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330B51372616300DFB46D /* b2DistanceJoint.h */; }; - 491330FD1372616300DFB46D /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330B61372616300DFB46D /* b2FrictionJoint.cpp */; }; - 491330FE1372616300DFB46D /* b2FrictionJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330B71372616300DFB46D /* b2FrictionJoint.h */; }; - 491330FF1372616300DFB46D /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330B81372616300DFB46D /* b2GearJoint.cpp */; }; - 491331001372616300DFB46D /* b2GearJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330B91372616300DFB46D /* b2GearJoint.h */; }; - 491331011372616300DFB46D /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330BA1372616300DFB46D /* b2Joint.cpp */; }; - 491331021372616300DFB46D /* b2Joint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330BB1372616300DFB46D /* b2Joint.h */; }; - 491331031372616300DFB46D /* b2LineJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330BC1372616300DFB46D /* b2LineJoint.cpp */; }; - 491331041372616300DFB46D /* b2LineJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330BD1372616300DFB46D /* b2LineJoint.h */; }; - 491331051372616300DFB46D /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330BE1372616300DFB46D /* b2MouseJoint.cpp */; }; - 491331061372616300DFB46D /* b2MouseJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330BF1372616300DFB46D /* b2MouseJoint.h */; }; - 491331071372616300DFB46D /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330C01372616300DFB46D /* b2PrismaticJoint.cpp */; }; - 491331081372616300DFB46D /* b2PrismaticJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330C11372616300DFB46D /* b2PrismaticJoint.h */; }; - 491331091372616300DFB46D /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330C21372616300DFB46D /* b2PulleyJoint.cpp */; }; - 4913310A1372616300DFB46D /* b2PulleyJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330C31372616300DFB46D /* b2PulleyJoint.h */; }; - 4913310B1372616300DFB46D /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330C41372616300DFB46D /* b2RevoluteJoint.cpp */; }; - 4913310C1372616300DFB46D /* b2RevoluteJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330C51372616300DFB46D /* b2RevoluteJoint.h */; }; - 4913310D1372616300DFB46D /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491330C61372616300DFB46D /* b2WeldJoint.cpp */; }; - 4913310E1372616300DFB46D /* b2WeldJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 491330C71372616300DFB46D /* b2WeldJoint.h */; }; 49133123137262F200DFB46D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49133122137262F200DFB46D /* Foundation.framework */; }; 491331281372630700DFB46D /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 491331271372630700DFB46D /* UIKit.framework */; }; + 4913344213727CB100DFB46D /* Box2D.h in Headers */ = {isa = PBXBuildFile; fileRef = 491333F513727CB100DFB46D /* Box2D.h */; }; + 4913344313727CB100DFB46D /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491333F713727CB100DFB46D /* b2BroadPhase.cpp */; }; + 4913344413727CB100DFB46D /* b2BroadPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 491333F813727CB100DFB46D /* b2BroadPhase.h */; }; + 4913344513727CB100DFB46D /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491333F913727CB100DFB46D /* b2CollideCircle.cpp */; }; + 4913344613727CB100DFB46D /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491333FA13727CB100DFB46D /* b2CollidePolygon.cpp */; }; + 4913344713727CB100DFB46D /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491333FB13727CB100DFB46D /* b2Collision.cpp */; }; + 4913344813727CB100DFB46D /* b2Collision.h in Headers */ = {isa = PBXBuildFile; fileRef = 491333FC13727CB100DFB46D /* b2Collision.h */; }; + 4913344913727CB100DFB46D /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491333FD13727CB100DFB46D /* b2Distance.cpp */; }; + 4913344A13727CB100DFB46D /* b2Distance.h in Headers */ = {isa = PBXBuildFile; fileRef = 491333FE13727CB100DFB46D /* b2Distance.h */; }; + 4913344B13727CB100DFB46D /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 491333FF13727CB100DFB46D /* b2DynamicTree.cpp */; }; + 4913344C13727CB100DFB46D /* b2DynamicTree.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913340013727CB100DFB46D /* b2DynamicTree.h */; }; + 4913344D13727CB100DFB46D /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913340113727CB100DFB46D /* b2TimeOfImpact.cpp */; }; + 4913344E13727CB100DFB46D /* b2TimeOfImpact.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913340213727CB100DFB46D /* b2TimeOfImpact.h */; }; + 4913344F13727CB100DFB46D /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913340413727CB100DFB46D /* b2CircleShape.cpp */; }; + 4913345013727CB100DFB46D /* b2CircleShape.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913340513727CB100DFB46D /* b2CircleShape.h */; }; + 4913345113727CB100DFB46D /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913340613727CB100DFB46D /* b2PolygonShape.cpp */; }; + 4913345213727CB100DFB46D /* b2PolygonShape.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913340713727CB100DFB46D /* b2PolygonShape.h */; }; + 4913345313727CB100DFB46D /* b2Shape.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913340813727CB100DFB46D /* b2Shape.h */; }; + 4913345413727CB100DFB46D /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913340A13727CB100DFB46D /* b2BlockAllocator.cpp */; }; + 4913345513727CB100DFB46D /* b2BlockAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913340B13727CB100DFB46D /* b2BlockAllocator.h */; }; + 4913345613727CB100DFB46D /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913340C13727CB100DFB46D /* b2Math.cpp */; }; + 4913345713727CB100DFB46D /* b2Math.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913340D13727CB100DFB46D /* b2Math.h */; }; + 4913345813727CB100DFB46D /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913340E13727CB100DFB46D /* b2Settings.cpp */; }; + 4913345913727CB100DFB46D /* b2Settings.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913340F13727CB100DFB46D /* b2Settings.h */; }; + 4913345A13727CB100DFB46D /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913341013727CB100DFB46D /* b2StackAllocator.cpp */; }; + 4913345B13727CB100DFB46D /* b2StackAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913341113727CB100DFB46D /* b2StackAllocator.h */; }; + 4913345C13727CB100DFB46D /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913341313727CB100DFB46D /* b2Body.cpp */; }; + 4913345D13727CB100DFB46D /* b2Body.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913341413727CB100DFB46D /* b2Body.h */; }; + 4913345E13727CB100DFB46D /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913341513727CB100DFB46D /* b2ContactManager.cpp */; }; + 4913345F13727CB100DFB46D /* b2ContactManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913341613727CB100DFB46D /* b2ContactManager.h */; }; + 4913346013727CB100DFB46D /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913341713727CB100DFB46D /* b2Fixture.cpp */; }; + 4913346113727CB100DFB46D /* b2Fixture.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913341813727CB100DFB46D /* b2Fixture.h */; }; + 4913346213727CB100DFB46D /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913341913727CB100DFB46D /* b2Island.cpp */; }; + 4913346313727CB100DFB46D /* b2Island.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913341A13727CB100DFB46D /* b2Island.h */; }; + 4913346413727CB100DFB46D /* b2TimeStep.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913341B13727CB100DFB46D /* b2TimeStep.h */; }; + 4913346513727CB100DFB46D /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913341C13727CB100DFB46D /* b2World.cpp */; }; + 4913346613727CB100DFB46D /* b2World.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913341D13727CB100DFB46D /* b2World.h */; }; + 4913346713727CB100DFB46D /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913341E13727CB100DFB46D /* b2WorldCallbacks.cpp */; }; + 4913346813727CB100DFB46D /* b2WorldCallbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913341F13727CB100DFB46D /* b2WorldCallbacks.h */; }; + 4913346913727CB100DFB46D /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913342113727CB100DFB46D /* b2CircleContact.cpp */; }; + 4913346A13727CB100DFB46D /* b2CircleContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913342213727CB100DFB46D /* b2CircleContact.h */; }; + 4913346B13727CB100DFB46D /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913342313727CB100DFB46D /* b2Contact.cpp */; }; + 4913346C13727CB100DFB46D /* b2Contact.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913342413727CB100DFB46D /* b2Contact.h */; }; + 4913346D13727CB100DFB46D /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913342513727CB100DFB46D /* b2ContactSolver.cpp */; }; + 4913346E13727CB100DFB46D /* b2ContactSolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913342613727CB100DFB46D /* b2ContactSolver.h */; }; + 4913346F13727CB100DFB46D /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913342713727CB100DFB46D /* b2PolygonAndCircleContact.cpp */; }; + 4913347013727CB100DFB46D /* b2PolygonAndCircleContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913342813727CB100DFB46D /* b2PolygonAndCircleContact.h */; }; + 4913347113727CB100DFB46D /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913342913727CB100DFB46D /* b2PolygonContact.cpp */; }; + 4913347213727CB100DFB46D /* b2PolygonContact.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913342A13727CB100DFB46D /* b2PolygonContact.h */; }; + 4913347313727CB100DFB46D /* b2TOISolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913342B13727CB100DFB46D /* b2TOISolver.cpp */; }; + 4913347413727CB100DFB46D /* b2TOISolver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913342C13727CB100DFB46D /* b2TOISolver.h */; }; + 4913347513727CB100DFB46D /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913342E13727CB100DFB46D /* b2DistanceJoint.cpp */; }; + 4913347613727CB100DFB46D /* b2DistanceJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913342F13727CB100DFB46D /* b2DistanceJoint.h */; }; + 4913347713727CB100DFB46D /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913343013727CB100DFB46D /* b2FrictionJoint.cpp */; }; + 4913347813727CB100DFB46D /* b2FrictionJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913343113727CB100DFB46D /* b2FrictionJoint.h */; }; + 4913347913727CB100DFB46D /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913343213727CB100DFB46D /* b2GearJoint.cpp */; }; + 4913347A13727CB100DFB46D /* b2GearJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913343313727CB100DFB46D /* b2GearJoint.h */; }; + 4913347B13727CB100DFB46D /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913343413727CB100DFB46D /* b2Joint.cpp */; }; + 4913347C13727CB100DFB46D /* b2Joint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913343513727CB100DFB46D /* b2Joint.h */; }; + 4913347D13727CB100DFB46D /* b2LineJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913343613727CB100DFB46D /* b2LineJoint.cpp */; }; + 4913347E13727CB100DFB46D /* b2LineJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913343713727CB100DFB46D /* b2LineJoint.h */; }; + 4913347F13727CB100DFB46D /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913343813727CB100DFB46D /* b2MouseJoint.cpp */; }; + 4913348013727CB100DFB46D /* b2MouseJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913343913727CB100DFB46D /* b2MouseJoint.h */; }; + 4913348113727CB100DFB46D /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913343A13727CB100DFB46D /* b2PrismaticJoint.cpp */; }; + 4913348213727CB100DFB46D /* b2PrismaticJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913343B13727CB100DFB46D /* b2PrismaticJoint.h */; }; + 4913348313727CB100DFB46D /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913343C13727CB100DFB46D /* b2PulleyJoint.cpp */; }; + 4913348413727CB100DFB46D /* b2PulleyJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913343D13727CB100DFB46D /* b2PulleyJoint.h */; }; + 4913348513727CB100DFB46D /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913343E13727CB100DFB46D /* b2RevoluteJoint.cpp */; }; + 4913348613727CB100DFB46D /* b2RevoluteJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913343F13727CB100DFB46D /* b2RevoluteJoint.h */; }; + 4913348713727CB100DFB46D /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4913344013727CB100DFB46D /* b2WeldJoint.cpp */; }; + 4913348813727CB100DFB46D /* b2WeldJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913344113727CB100DFB46D /* b2WeldJoint.h */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 4913305F1372610400DFB46D /* libBox2D.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBox2D.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 4913307B1372616300DFB46D /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; - 4913307D1372616300DFB46D /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; - 4913307E1372616300DFB46D /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; - 4913307F1372616300DFB46D /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; - 491330801372616300DFB46D /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = ""; }; - 491330811372616300DFB46D /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; - 491330821372616300DFB46D /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; - 491330831372616300DFB46D /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; - 491330841372616300DFB46D /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = ""; }; - 491330851372616300DFB46D /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = ""; }; - 491330861372616300DFB46D /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = ""; }; - 491330871372616300DFB46D /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; - 491330881372616300DFB46D /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = ""; }; - 4913308A1372616300DFB46D /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; - 4913308B1372616300DFB46D /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; - 4913308C1372616300DFB46D /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; - 4913308D1372616300DFB46D /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; - 4913308E1372616300DFB46D /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; - 491330901372616300DFB46D /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; - 491330911372616300DFB46D /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; - 491330921372616300DFB46D /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; - 491330931372616300DFB46D /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; - 491330941372616300DFB46D /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; - 491330951372616300DFB46D /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; - 491330961372616300DFB46D /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; - 491330971372616300DFB46D /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; - 491330991372616300DFB46D /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; - 4913309A1372616300DFB46D /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; - 4913309B1372616300DFB46D /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; - 4913309C1372616300DFB46D /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; - 4913309D1372616300DFB46D /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = ""; }; - 4913309E1372616300DFB46D /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = ""; }; - 4913309F1372616300DFB46D /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; - 491330A01372616300DFB46D /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; - 491330A11372616300DFB46D /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = ""; }; - 491330A21372616300DFB46D /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; - 491330A31372616300DFB46D /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; - 491330A41372616300DFB46D /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; - 491330A51372616300DFB46D /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; - 491330A71372616300DFB46D /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; - 491330A81372616300DFB46D /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; - 491330A91372616300DFB46D /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; - 491330AA1372616300DFB46D /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; - 491330AB1372616300DFB46D /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; - 491330AC1372616300DFB46D /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; - 491330AD1372616300DFB46D /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = ""; }; - 491330AE1372616300DFB46D /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; - 491330AF1372616300DFB46D /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; - 491330B01372616300DFB46D /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; - 491330B11372616300DFB46D /* b2TOISolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TOISolver.cpp; sourceTree = ""; }; - 491330B21372616300DFB46D /* b2TOISolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TOISolver.h; sourceTree = ""; }; - 491330B41372616300DFB46D /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; - 491330B51372616300DFB46D /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; - 491330B61372616300DFB46D /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = ""; }; - 491330B71372616300DFB46D /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = ""; }; - 491330B81372616300DFB46D /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; - 491330B91372616300DFB46D /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; - 491330BA1372616300DFB46D /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; - 491330BB1372616300DFB46D /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; - 491330BC1372616300DFB46D /* b2LineJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LineJoint.cpp; sourceTree = ""; }; - 491330BD1372616300DFB46D /* b2LineJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LineJoint.h; sourceTree = ""; }; - 491330BE1372616300DFB46D /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; - 491330BF1372616300DFB46D /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; - 491330C01372616300DFB46D /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; - 491330C11372616300DFB46D /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; - 491330C21372616300DFB46D /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; - 491330C31372616300DFB46D /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; - 491330C41372616300DFB46D /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; - 491330C51372616300DFB46D /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; - 491330C61372616300DFB46D /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = ""; }; - 491330C71372616300DFB46D /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = ""; }; 49133122137262F200DFB46D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 491331271372630700DFB46D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 491333F513727CB100DFB46D /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = ""; }; + 491333F713727CB100DFB46D /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = ""; }; + 491333F813727CB100DFB46D /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = ""; }; + 491333F913727CB100DFB46D /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = ""; }; + 491333FA13727CB100DFB46D /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = ""; }; + 491333FB13727CB100DFB46D /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = ""; }; + 491333FC13727CB100DFB46D /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = ""; }; + 491333FD13727CB100DFB46D /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = ""; }; + 491333FE13727CB100DFB46D /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = ""; }; + 491333FF13727CB100DFB46D /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = ""; }; + 4913340013727CB100DFB46D /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = ""; }; + 4913340113727CB100DFB46D /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = ""; }; + 4913340213727CB100DFB46D /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = ""; }; + 4913340413727CB100DFB46D /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = ""; }; + 4913340513727CB100DFB46D /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = ""; }; + 4913340613727CB100DFB46D /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = ""; }; + 4913340713727CB100DFB46D /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = ""; }; + 4913340813727CB100DFB46D /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = ""; }; + 4913340A13727CB100DFB46D /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = ""; }; + 4913340B13727CB100DFB46D /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = ""; }; + 4913340C13727CB100DFB46D /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = ""; }; + 4913340D13727CB100DFB46D /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = ""; }; + 4913340E13727CB100DFB46D /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = ""; }; + 4913340F13727CB100DFB46D /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = ""; }; + 4913341013727CB100DFB46D /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = ""; }; + 4913341113727CB100DFB46D /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = ""; }; + 4913341313727CB100DFB46D /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = ""; }; + 4913341413727CB100DFB46D /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = ""; }; + 4913341513727CB100DFB46D /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = ""; }; + 4913341613727CB100DFB46D /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = ""; }; + 4913341713727CB100DFB46D /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = ""; }; + 4913341813727CB100DFB46D /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = ""; }; + 4913341913727CB100DFB46D /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = ""; }; + 4913341A13727CB100DFB46D /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = ""; }; + 4913341B13727CB100DFB46D /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = ""; }; + 4913341C13727CB100DFB46D /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = ""; }; + 4913341D13727CB100DFB46D /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = ""; }; + 4913341E13727CB100DFB46D /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = ""; }; + 4913341F13727CB100DFB46D /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = ""; }; + 4913342113727CB100DFB46D /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = ""; }; + 4913342213727CB100DFB46D /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = ""; }; + 4913342313727CB100DFB46D /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = ""; }; + 4913342413727CB100DFB46D /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = ""; }; + 4913342513727CB100DFB46D /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = ""; }; + 4913342613727CB100DFB46D /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = ""; }; + 4913342713727CB100DFB46D /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = ""; }; + 4913342813727CB100DFB46D /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = ""; }; + 4913342913727CB100DFB46D /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = ""; }; + 4913342A13727CB100DFB46D /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = ""; }; + 4913342B13727CB100DFB46D /* b2TOISolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TOISolver.cpp; sourceTree = ""; }; + 4913342C13727CB100DFB46D /* b2TOISolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TOISolver.h; sourceTree = ""; }; + 4913342E13727CB100DFB46D /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = ""; }; + 4913342F13727CB100DFB46D /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = ""; }; + 4913343013727CB100DFB46D /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = ""; }; + 4913343113727CB100DFB46D /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = ""; }; + 4913343213727CB100DFB46D /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = ""; }; + 4913343313727CB100DFB46D /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = ""; }; + 4913343413727CB100DFB46D /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = ""; }; + 4913343513727CB100DFB46D /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = ""; }; + 4913343613727CB100DFB46D /* b2LineJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LineJoint.cpp; sourceTree = ""; }; + 4913343713727CB100DFB46D /* b2LineJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LineJoint.h; sourceTree = ""; }; + 4913343813727CB100DFB46D /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = ""; }; + 4913343913727CB100DFB46D /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = ""; }; + 4913343A13727CB100DFB46D /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = ""; }; + 4913343B13727CB100DFB46D /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = ""; }; + 4913343C13727CB100DFB46D /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = ""; }; + 4913343D13727CB100DFB46D /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = ""; }; + 4913343E13727CB100DFB46D /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = ""; }; + 4913343F13727CB100DFB46D /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = ""; }; + 4913344013727CB100DFB46D /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = ""; }; + 4913344113727CB100DFB46D /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -175,7 +175,7 @@ 491330541372610400DFB46D = { isa = PBXGroup; children = ( - 4913307A1372616300DFB46D /* Box2D */, + 491333F413727CB100DFB46D /* Box2D */, 491331291372630F00DFB46D /* Frameworks */, 491330601372610400DFB46D /* Products */, ); @@ -189,142 +189,142 @@ name = Products; sourceTree = ""; }; - 4913307A1372616300DFB46D /* Box2D */ = { + 491331291372630F00DFB46D /* Frameworks */ = { + isa = PBXGroup; + children = ( + 491331271372630700DFB46D /* UIKit.framework */, + 49133122137262F200DFB46D /* Foundation.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 491333F413727CB100DFB46D /* Box2D */ = { isa = PBXGroup; children = ( - 4913307B1372616300DFB46D /* Box2D.h */, - 4913307C1372616300DFB46D /* Collision */, - 4913308F1372616300DFB46D /* Common */, - 491330981372616300DFB46D /* Dynamics */, + 491333F513727CB100DFB46D /* Box2D.h */, + 491333F613727CB100DFB46D /* Collision */, + 4913340913727CB100DFB46D /* Common */, + 4913341213727CB100DFB46D /* Dynamics */, ); name = Box2D; - path = src/Box2D; + path = "../../../../tanks-ios/libs/box2d/src/Box2D"; sourceTree = ""; }; - 4913307C1372616300DFB46D /* Collision */ = { + 491333F613727CB100DFB46D /* Collision */ = { isa = PBXGroup; children = ( - 4913307D1372616300DFB46D /* b2BroadPhase.cpp */, - 4913307E1372616300DFB46D /* b2BroadPhase.h */, - 4913307F1372616300DFB46D /* b2CollideCircle.cpp */, - 491330801372616300DFB46D /* b2CollidePolygon.cpp */, - 491330811372616300DFB46D /* b2Collision.cpp */, - 491330821372616300DFB46D /* b2Collision.h */, - 491330831372616300DFB46D /* b2Distance.cpp */, - 491330841372616300DFB46D /* b2Distance.h */, - 491330851372616300DFB46D /* b2DynamicTree.cpp */, - 491330861372616300DFB46D /* b2DynamicTree.h */, - 491330871372616300DFB46D /* b2TimeOfImpact.cpp */, - 491330881372616300DFB46D /* b2TimeOfImpact.h */, - 491330891372616300DFB46D /* Shapes */, + 491333F713727CB100DFB46D /* b2BroadPhase.cpp */, + 491333F813727CB100DFB46D /* b2BroadPhase.h */, + 491333F913727CB100DFB46D /* b2CollideCircle.cpp */, + 491333FA13727CB100DFB46D /* b2CollidePolygon.cpp */, + 491333FB13727CB100DFB46D /* b2Collision.cpp */, + 491333FC13727CB100DFB46D /* b2Collision.h */, + 491333FD13727CB100DFB46D /* b2Distance.cpp */, + 491333FE13727CB100DFB46D /* b2Distance.h */, + 491333FF13727CB100DFB46D /* b2DynamicTree.cpp */, + 4913340013727CB100DFB46D /* b2DynamicTree.h */, + 4913340113727CB100DFB46D /* b2TimeOfImpact.cpp */, + 4913340213727CB100DFB46D /* b2TimeOfImpact.h */, + 4913340313727CB100DFB46D /* Shapes */, ); path = Collision; sourceTree = ""; }; - 491330891372616300DFB46D /* Shapes */ = { + 4913340313727CB100DFB46D /* Shapes */ = { isa = PBXGroup; children = ( - 4913308A1372616300DFB46D /* b2CircleShape.cpp */, - 4913308B1372616300DFB46D /* b2CircleShape.h */, - 4913308C1372616300DFB46D /* b2PolygonShape.cpp */, - 4913308D1372616300DFB46D /* b2PolygonShape.h */, - 4913308E1372616300DFB46D /* b2Shape.h */, + 4913340413727CB100DFB46D /* b2CircleShape.cpp */, + 4913340513727CB100DFB46D /* b2CircleShape.h */, + 4913340613727CB100DFB46D /* b2PolygonShape.cpp */, + 4913340713727CB100DFB46D /* b2PolygonShape.h */, + 4913340813727CB100DFB46D /* b2Shape.h */, ); path = Shapes; sourceTree = ""; }; - 4913308F1372616300DFB46D /* Common */ = { + 4913340913727CB100DFB46D /* Common */ = { isa = PBXGroup; children = ( - 491330901372616300DFB46D /* b2BlockAllocator.cpp */, - 491330911372616300DFB46D /* b2BlockAllocator.h */, - 491330921372616300DFB46D /* b2Math.cpp */, - 491330931372616300DFB46D /* b2Math.h */, - 491330941372616300DFB46D /* b2Settings.cpp */, - 491330951372616300DFB46D /* b2Settings.h */, - 491330961372616300DFB46D /* b2StackAllocator.cpp */, - 491330971372616300DFB46D /* b2StackAllocator.h */, + 4913340A13727CB100DFB46D /* b2BlockAllocator.cpp */, + 4913340B13727CB100DFB46D /* b2BlockAllocator.h */, + 4913340C13727CB100DFB46D /* b2Math.cpp */, + 4913340D13727CB100DFB46D /* b2Math.h */, + 4913340E13727CB100DFB46D /* b2Settings.cpp */, + 4913340F13727CB100DFB46D /* b2Settings.h */, + 4913341013727CB100DFB46D /* b2StackAllocator.cpp */, + 4913341113727CB100DFB46D /* b2StackAllocator.h */, ); path = Common; sourceTree = ""; }; - 491330981372616300DFB46D /* Dynamics */ = { + 4913341213727CB100DFB46D /* Dynamics */ = { isa = PBXGroup; children = ( - 491330991372616300DFB46D /* b2Body.cpp */, - 4913309A1372616300DFB46D /* b2Body.h */, - 4913309B1372616300DFB46D /* b2ContactManager.cpp */, - 4913309C1372616300DFB46D /* b2ContactManager.h */, - 4913309D1372616300DFB46D /* b2Fixture.cpp */, - 4913309E1372616300DFB46D /* b2Fixture.h */, - 4913309F1372616300DFB46D /* b2Island.cpp */, - 491330A01372616300DFB46D /* b2Island.h */, - 491330A11372616300DFB46D /* b2TimeStep.h */, - 491330A21372616300DFB46D /* b2World.cpp */, - 491330A31372616300DFB46D /* b2World.h */, - 491330A41372616300DFB46D /* b2WorldCallbacks.cpp */, - 491330A51372616300DFB46D /* b2WorldCallbacks.h */, - 491330A61372616300DFB46D /* Contacts */, - 491330B31372616300DFB46D /* Joints */, + 4913341313727CB100DFB46D /* b2Body.cpp */, + 4913341413727CB100DFB46D /* b2Body.h */, + 4913341513727CB100DFB46D /* b2ContactManager.cpp */, + 4913341613727CB100DFB46D /* b2ContactManager.h */, + 4913341713727CB100DFB46D /* b2Fixture.cpp */, + 4913341813727CB100DFB46D /* b2Fixture.h */, + 4913341913727CB100DFB46D /* b2Island.cpp */, + 4913341A13727CB100DFB46D /* b2Island.h */, + 4913341B13727CB100DFB46D /* b2TimeStep.h */, + 4913341C13727CB100DFB46D /* b2World.cpp */, + 4913341D13727CB100DFB46D /* b2World.h */, + 4913341E13727CB100DFB46D /* b2WorldCallbacks.cpp */, + 4913341F13727CB100DFB46D /* b2WorldCallbacks.h */, + 4913342013727CB100DFB46D /* Contacts */, + 4913342D13727CB100DFB46D /* Joints */, ); path = Dynamics; sourceTree = ""; }; - 491330A61372616300DFB46D /* Contacts */ = { + 4913342013727CB100DFB46D /* Contacts */ = { isa = PBXGroup; children = ( - 491330A71372616300DFB46D /* b2CircleContact.cpp */, - 491330A81372616300DFB46D /* b2CircleContact.h */, - 491330A91372616300DFB46D /* b2Contact.cpp */, - 491330AA1372616300DFB46D /* b2Contact.h */, - 491330AB1372616300DFB46D /* b2ContactSolver.cpp */, - 491330AC1372616300DFB46D /* b2ContactSolver.h */, - 491330AD1372616300DFB46D /* b2PolygonAndCircleContact.cpp */, - 491330AE1372616300DFB46D /* b2PolygonAndCircleContact.h */, - 491330AF1372616300DFB46D /* b2PolygonContact.cpp */, - 491330B01372616300DFB46D /* b2PolygonContact.h */, - 491330B11372616300DFB46D /* b2TOISolver.cpp */, - 491330B21372616300DFB46D /* b2TOISolver.h */, + 4913342113727CB100DFB46D /* b2CircleContact.cpp */, + 4913342213727CB100DFB46D /* b2CircleContact.h */, + 4913342313727CB100DFB46D /* b2Contact.cpp */, + 4913342413727CB100DFB46D /* b2Contact.h */, + 4913342513727CB100DFB46D /* b2ContactSolver.cpp */, + 4913342613727CB100DFB46D /* b2ContactSolver.h */, + 4913342713727CB100DFB46D /* b2PolygonAndCircleContact.cpp */, + 4913342813727CB100DFB46D /* b2PolygonAndCircleContact.h */, + 4913342913727CB100DFB46D /* b2PolygonContact.cpp */, + 4913342A13727CB100DFB46D /* b2PolygonContact.h */, + 4913342B13727CB100DFB46D /* b2TOISolver.cpp */, + 4913342C13727CB100DFB46D /* b2TOISolver.h */, ); path = Contacts; sourceTree = ""; }; - 491330B31372616300DFB46D /* Joints */ = { + 4913342D13727CB100DFB46D /* Joints */ = { isa = PBXGroup; children = ( - 491330B41372616300DFB46D /* b2DistanceJoint.cpp */, - 491330B51372616300DFB46D /* b2DistanceJoint.h */, - 491330B61372616300DFB46D /* b2FrictionJoint.cpp */, - 491330B71372616300DFB46D /* b2FrictionJoint.h */, - 491330B81372616300DFB46D /* b2GearJoint.cpp */, - 491330B91372616300DFB46D /* b2GearJoint.h */, - 491330BA1372616300DFB46D /* b2Joint.cpp */, - 491330BB1372616300DFB46D /* b2Joint.h */, - 491330BC1372616300DFB46D /* b2LineJoint.cpp */, - 491330BD1372616300DFB46D /* b2LineJoint.h */, - 491330BE1372616300DFB46D /* b2MouseJoint.cpp */, - 491330BF1372616300DFB46D /* b2MouseJoint.h */, - 491330C01372616300DFB46D /* b2PrismaticJoint.cpp */, - 491330C11372616300DFB46D /* b2PrismaticJoint.h */, - 491330C21372616300DFB46D /* b2PulleyJoint.cpp */, - 491330C31372616300DFB46D /* b2PulleyJoint.h */, - 491330C41372616300DFB46D /* b2RevoluteJoint.cpp */, - 491330C51372616300DFB46D /* b2RevoluteJoint.h */, - 491330C61372616300DFB46D /* b2WeldJoint.cpp */, - 491330C71372616300DFB46D /* b2WeldJoint.h */, + 4913342E13727CB100DFB46D /* b2DistanceJoint.cpp */, + 4913342F13727CB100DFB46D /* b2DistanceJoint.h */, + 4913343013727CB100DFB46D /* b2FrictionJoint.cpp */, + 4913343113727CB100DFB46D /* b2FrictionJoint.h */, + 4913343213727CB100DFB46D /* b2GearJoint.cpp */, + 4913343313727CB100DFB46D /* b2GearJoint.h */, + 4913343413727CB100DFB46D /* b2Joint.cpp */, + 4913343513727CB100DFB46D /* b2Joint.h */, + 4913343613727CB100DFB46D /* b2LineJoint.cpp */, + 4913343713727CB100DFB46D /* b2LineJoint.h */, + 4913343813727CB100DFB46D /* b2MouseJoint.cpp */, + 4913343913727CB100DFB46D /* b2MouseJoint.h */, + 4913343A13727CB100DFB46D /* b2PrismaticJoint.cpp */, + 4913343B13727CB100DFB46D /* b2PrismaticJoint.h */, + 4913343C13727CB100DFB46D /* b2PulleyJoint.cpp */, + 4913343D13727CB100DFB46D /* b2PulleyJoint.h */, + 4913343E13727CB100DFB46D /* b2RevoluteJoint.cpp */, + 4913343F13727CB100DFB46D /* b2RevoluteJoint.h */, + 4913344013727CB100DFB46D /* b2WeldJoint.cpp */, + 4913344113727CB100DFB46D /* b2WeldJoint.h */, ); path = Joints; sourceTree = ""; }; - 491331291372630F00DFB46D /* Frameworks */ = { - isa = PBXGroup; - children = ( - 491331271372630700DFB46D /* UIKit.framework */, - 49133122137262F200DFB46D /* Foundation.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -332,42 +332,42 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 491330C81372616300DFB46D /* Box2D.h in Headers */, - 491330CA1372616300DFB46D /* b2BroadPhase.h in Headers */, - 491330CE1372616300DFB46D /* b2Collision.h in Headers */, - 491330D01372616300DFB46D /* b2Distance.h in Headers */, - 491330D21372616300DFB46D /* b2DynamicTree.h in Headers */, - 491330D41372616300DFB46D /* b2TimeOfImpact.h in Headers */, - 491330D61372616300DFB46D /* b2CircleShape.h in Headers */, - 491330D81372616300DFB46D /* b2PolygonShape.h in Headers */, - 491330D91372616300DFB46D /* b2Shape.h in Headers */, - 491330DB1372616300DFB46D /* b2BlockAllocator.h in Headers */, - 491330DD1372616300DFB46D /* b2Math.h in Headers */, - 491330DF1372616300DFB46D /* b2Settings.h in Headers */, - 491330E11372616300DFB46D /* b2StackAllocator.h in Headers */, - 491330E31372616300DFB46D /* b2Body.h in Headers */, - 491330E51372616300DFB46D /* b2ContactManager.h in Headers */, - 491330E71372616300DFB46D /* b2Fixture.h in Headers */, - 491330E91372616300DFB46D /* b2Island.h in Headers */, - 491330EA1372616300DFB46D /* b2TimeStep.h in Headers */, - 491330EC1372616300DFB46D /* b2World.h in Headers */, - 491330EE1372616300DFB46D /* b2WorldCallbacks.h in Headers */, - 491330F01372616300DFB46D /* b2CircleContact.h in Headers */, - 491330F21372616300DFB46D /* b2Contact.h in Headers */, - 491330F41372616300DFB46D /* b2ContactSolver.h in Headers */, - 491330F61372616300DFB46D /* b2PolygonAndCircleContact.h in Headers */, - 491330F81372616300DFB46D /* b2PolygonContact.h in Headers */, - 491330FA1372616300DFB46D /* b2TOISolver.h in Headers */, - 491330FC1372616300DFB46D /* b2DistanceJoint.h in Headers */, - 491330FE1372616300DFB46D /* b2FrictionJoint.h in Headers */, - 491331001372616300DFB46D /* b2GearJoint.h in Headers */, - 491331021372616300DFB46D /* b2Joint.h in Headers */, - 491331041372616300DFB46D /* b2LineJoint.h in Headers */, - 491331061372616300DFB46D /* b2MouseJoint.h in Headers */, - 491331081372616300DFB46D /* b2PrismaticJoint.h in Headers */, - 4913310A1372616300DFB46D /* b2PulleyJoint.h in Headers */, - 4913310C1372616300DFB46D /* b2RevoluteJoint.h in Headers */, - 4913310E1372616300DFB46D /* b2WeldJoint.h in Headers */, + 4913344213727CB100DFB46D /* Box2D.h in Headers */, + 4913344413727CB100DFB46D /* b2BroadPhase.h in Headers */, + 4913344813727CB100DFB46D /* b2Collision.h in Headers */, + 4913344A13727CB100DFB46D /* b2Distance.h in Headers */, + 4913344C13727CB100DFB46D /* b2DynamicTree.h in Headers */, + 4913344E13727CB100DFB46D /* b2TimeOfImpact.h in Headers */, + 4913345013727CB100DFB46D /* b2CircleShape.h in Headers */, + 4913345213727CB100DFB46D /* b2PolygonShape.h in Headers */, + 4913345313727CB100DFB46D /* b2Shape.h in Headers */, + 4913345513727CB100DFB46D /* b2BlockAllocator.h in Headers */, + 4913345713727CB100DFB46D /* b2Math.h in Headers */, + 4913345913727CB100DFB46D /* b2Settings.h in Headers */, + 4913345B13727CB100DFB46D /* b2StackAllocator.h in Headers */, + 4913345D13727CB100DFB46D /* b2Body.h in Headers */, + 4913345F13727CB100DFB46D /* b2ContactManager.h in Headers */, + 4913346113727CB100DFB46D /* b2Fixture.h in Headers */, + 4913346313727CB100DFB46D /* b2Island.h in Headers */, + 4913346413727CB100DFB46D /* b2TimeStep.h in Headers */, + 4913346613727CB100DFB46D /* b2World.h in Headers */, + 4913346813727CB100DFB46D /* b2WorldCallbacks.h in Headers */, + 4913346A13727CB100DFB46D /* b2CircleContact.h in Headers */, + 4913346C13727CB100DFB46D /* b2Contact.h in Headers */, + 4913346E13727CB100DFB46D /* b2ContactSolver.h in Headers */, + 4913347013727CB100DFB46D /* b2PolygonAndCircleContact.h in Headers */, + 4913347213727CB100DFB46D /* b2PolygonContact.h in Headers */, + 4913347413727CB100DFB46D /* b2TOISolver.h in Headers */, + 4913347613727CB100DFB46D /* b2DistanceJoint.h in Headers */, + 4913347813727CB100DFB46D /* b2FrictionJoint.h in Headers */, + 4913347A13727CB100DFB46D /* b2GearJoint.h in Headers */, + 4913347C13727CB100DFB46D /* b2Joint.h in Headers */, + 4913347E13727CB100DFB46D /* b2LineJoint.h in Headers */, + 4913348013727CB100DFB46D /* b2MouseJoint.h in Headers */, + 4913348213727CB100DFB46D /* b2PrismaticJoint.h in Headers */, + 4913348413727CB100DFB46D /* b2PulleyJoint.h in Headers */, + 4913348613727CB100DFB46D /* b2RevoluteJoint.h in Headers */, + 4913348813727CB100DFB46D /* b2WeldJoint.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -418,41 +418,41 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 491330C91372616300DFB46D /* b2BroadPhase.cpp in Sources */, - 491330CB1372616300DFB46D /* b2CollideCircle.cpp in Sources */, - 491330CC1372616300DFB46D /* b2CollidePolygon.cpp in Sources */, - 491330CD1372616300DFB46D /* b2Collision.cpp in Sources */, - 491330CF1372616300DFB46D /* b2Distance.cpp in Sources */, - 491330D11372616300DFB46D /* b2DynamicTree.cpp in Sources */, - 491330D31372616300DFB46D /* b2TimeOfImpact.cpp in Sources */, - 491330D51372616300DFB46D /* b2CircleShape.cpp in Sources */, - 491330D71372616300DFB46D /* b2PolygonShape.cpp in Sources */, - 491330DA1372616300DFB46D /* b2BlockAllocator.cpp in Sources */, - 491330DC1372616300DFB46D /* b2Math.cpp in Sources */, - 491330DE1372616300DFB46D /* b2Settings.cpp in Sources */, - 491330E01372616300DFB46D /* b2StackAllocator.cpp in Sources */, - 491330E21372616300DFB46D /* b2Body.cpp in Sources */, - 491330E41372616300DFB46D /* b2ContactManager.cpp in Sources */, - 491330E61372616300DFB46D /* b2Fixture.cpp in Sources */, - 491330E81372616300DFB46D /* b2Island.cpp in Sources */, - 491330EB1372616300DFB46D /* b2World.cpp in Sources */, - 491330ED1372616300DFB46D /* b2WorldCallbacks.cpp in Sources */, - 491330EF1372616300DFB46D /* b2CircleContact.cpp in Sources */, - 491330F11372616300DFB46D /* b2Contact.cpp in Sources */, - 491330F31372616300DFB46D /* b2ContactSolver.cpp in Sources */, - 491330F51372616300DFB46D /* b2PolygonAndCircleContact.cpp in Sources */, - 491330F71372616300DFB46D /* b2PolygonContact.cpp in Sources */, - 491330F91372616300DFB46D /* b2TOISolver.cpp in Sources */, - 491330FB1372616300DFB46D /* b2DistanceJoint.cpp in Sources */, - 491330FD1372616300DFB46D /* b2FrictionJoint.cpp in Sources */, - 491330FF1372616300DFB46D /* b2GearJoint.cpp in Sources */, - 491331011372616300DFB46D /* b2Joint.cpp in Sources */, - 491331031372616300DFB46D /* b2LineJoint.cpp in Sources */, - 491331051372616300DFB46D /* b2MouseJoint.cpp in Sources */, - 491331071372616300DFB46D /* b2PrismaticJoint.cpp in Sources */, - 491331091372616300DFB46D /* b2PulleyJoint.cpp in Sources */, - 4913310B1372616300DFB46D /* b2RevoluteJoint.cpp in Sources */, - 4913310D1372616300DFB46D /* b2WeldJoint.cpp in Sources */, + 4913344313727CB100DFB46D /* b2BroadPhase.cpp in Sources */, + 4913344513727CB100DFB46D /* b2CollideCircle.cpp in Sources */, + 4913344613727CB100DFB46D /* b2CollidePolygon.cpp in Sources */, + 4913344713727CB100DFB46D /* b2Collision.cpp in Sources */, + 4913344913727CB100DFB46D /* b2Distance.cpp in Sources */, + 4913344B13727CB100DFB46D /* b2DynamicTree.cpp in Sources */, + 4913344D13727CB100DFB46D /* b2TimeOfImpact.cpp in Sources */, + 4913344F13727CB100DFB46D /* b2CircleShape.cpp in Sources */, + 4913345113727CB100DFB46D /* b2PolygonShape.cpp in Sources */, + 4913345413727CB100DFB46D /* b2BlockAllocator.cpp in Sources */, + 4913345613727CB100DFB46D /* b2Math.cpp in Sources */, + 4913345813727CB100DFB46D /* b2Settings.cpp in Sources */, + 4913345A13727CB100DFB46D /* b2StackAllocator.cpp in Sources */, + 4913345C13727CB100DFB46D /* b2Body.cpp in Sources */, + 4913345E13727CB100DFB46D /* b2ContactManager.cpp in Sources */, + 4913346013727CB100DFB46D /* b2Fixture.cpp in Sources */, + 4913346213727CB100DFB46D /* b2Island.cpp in Sources */, + 4913346513727CB100DFB46D /* b2World.cpp in Sources */, + 4913346713727CB100DFB46D /* b2WorldCallbacks.cpp in Sources */, + 4913346913727CB100DFB46D /* b2CircleContact.cpp in Sources */, + 4913346B13727CB100DFB46D /* b2Contact.cpp in Sources */, + 4913346D13727CB100DFB46D /* b2ContactSolver.cpp in Sources */, + 4913346F13727CB100DFB46D /* b2PolygonAndCircleContact.cpp in Sources */, + 4913347113727CB100DFB46D /* b2PolygonContact.cpp in Sources */, + 4913347313727CB100DFB46D /* b2TOISolver.cpp in Sources */, + 4913347513727CB100DFB46D /* b2DistanceJoint.cpp in Sources */, + 4913347713727CB100DFB46D /* b2FrictionJoint.cpp in Sources */, + 4913347913727CB100DFB46D /* b2GearJoint.cpp in Sources */, + 4913347B13727CB100DFB46D /* b2Joint.cpp in Sources */, + 4913347D13727CB100DFB46D /* b2LineJoint.cpp in Sources */, + 4913347F13727CB100DFB46D /* b2MouseJoint.cpp in Sources */, + 4913348113727CB100DFB46D /* b2PrismaticJoint.cpp in Sources */, + 4913348313727CB100DFB46D /* b2PulleyJoint.cpp in Sources */, + 4913348513727CB100DFB46D /* b2RevoluteJoint.cpp in Sources */, + 4913348713727CB100DFB46D /* b2WeldJoint.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/libs/box2d/box2d-iphone.xcodeproj/project.pbxproj b/libs/box2d/box2d-iphone.xcodeproj/project.pbxproj index 6e1af9d..65cf69b 100644 --- a/libs/box2d/box2d-iphone.xcodeproj/project.pbxproj +++ b/libs/box2d/box2d-iphone.xcodeproj/project.pbxproj @@ -21,9 +21,7 @@ 4913323913726B1F00DFB46D /* BodyTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913320E13726B1F00DFB46D /* BodyTypes.h */; }; 4913323A13726B1F00DFB46D /* Breakable.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913320F13726B1F00DFB46D /* Breakable.h */; }; 4913323B13726B1F00DFB46D /* Bridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321013726B1F00DFB46D /* Bridge.h */; }; - 4913323C13726B1F00DFB46D /* BulletTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321113726B1F00DFB46D /* BulletTest.h */; }; 4913323D13726B1F00DFB46D /* Cantilever.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321213726B1F00DFB46D /* Cantilever.h */; }; - 4913323E13726B1F00DFB46D /* Car.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321313726B1F00DFB46D /* Car.h */; }; 4913323F13726B1F00DFB46D /* Chain.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321413726B1F00DFB46D /* Chain.h */; }; 4913324013726B1F00DFB46D /* CharacterCollision.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321513726B1F00DFB46D /* CharacterCollision.h */; }; 4913324113726B1F00DFB46D /* CollisionFiltering.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321613726B1F00DFB46D /* CollisionFiltering.h */; }; @@ -35,26 +33,20 @@ 4913324713726B1F00DFB46D /* Dominos.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321C13726B1F00DFB46D /* Dominos.h */; }; 4913324813726B1F00DFB46D /* DynamicTreeTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321D13726B1F00DFB46D /* DynamicTreeTest.h */; }; 4913324913726B1F00DFB46D /* EdgeShapes.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321E13726B1F00DFB46D /* EdgeShapes.h */; }; - 4913324A13726B1F00DFB46D /* EdgeTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913321F13726B1F00DFB46D /* EdgeTest.h */; }; 4913324B13726B1F00DFB46D /* Gears.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322013726B1F00DFB46D /* Gears.h */; }; 4913324C13726B1F00DFB46D /* LineJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322113726B1F00DFB46D /* LineJoint.h */; }; 4913324D13726B1F00DFB46D /* OneSidedPlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322213726B1F00DFB46D /* OneSidedPlatform.h */; }; - 4913324E13726B1F00DFB46D /* Pinball.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322313726B1F00DFB46D /* Pinball.h */; }; 4913324F13726B1F00DFB46D /* PolyCollision.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322413726B1F00DFB46D /* PolyCollision.h */; }; 4913325013726B1F00DFB46D /* PolyShapes.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322513726B1F00DFB46D /* PolyShapes.h */; }; 4913325113726B1F00DFB46D /* Prismatic.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322613726B1F00DFB46D /* Prismatic.h */; }; 4913325213726B1F00DFB46D /* Pulleys.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322713726B1F00DFB46D /* Pulleys.h */; }; 4913325313726B1F00DFB46D /* Pyramid.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322813726B1F00DFB46D /* Pyramid.h */; }; 4913325413726B1F00DFB46D /* RayCast.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322913726B1F00DFB46D /* RayCast.h */; }; - 4913325513726B1F00DFB46D /* Revolute.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322A13726B1F00DFB46D /* Revolute.h */; }; - 4913325613726B1F00DFB46D /* Rope.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322B13726B1F00DFB46D /* Rope.h */; }; - 4913325713726B1F00DFB46D /* RopeJoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322C13726B1F00DFB46D /* RopeJoint.h */; }; 4913325813726B1F00DFB46D /* SensorTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322D13726B1F00DFB46D /* SensorTest.h */; }; 4913325913726B1F00DFB46D /* ShapeEditing.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322E13726B1F00DFB46D /* ShapeEditing.h */; }; 4913325A13726B1F00DFB46D /* SliderCrank.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913322F13726B1F00DFB46D /* SliderCrank.h */; }; 4913325B13726B1F00DFB46D /* SphereStack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913323013726B1F00DFB46D /* SphereStack.h */; }; 4913325C13726B1F00DFB46D /* TheoJansen.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913323113726B1F00DFB46D /* TheoJansen.h */; }; - 4913325D13726B1F00DFB46D /* Tiles.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913323213726B1F00DFB46D /* Tiles.h */; }; 4913325E13726B1F00DFB46D /* TimeOfImpact.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913323313726B1F00DFB46D /* TimeOfImpact.h */; }; 4913325F13726B1F00DFB46D /* VaryingFriction.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913323413726B1F00DFB46D /* VaryingFriction.h */; }; 4913326013726B1F00DFB46D /* VaryingRestitution.h in Headers */ = {isa = PBXBuildFile; fileRef = 4913323513726B1F00DFB46D /* VaryingRestitution.h */; }; @@ -109,9 +101,7 @@ 4913320E13726B1F00DFB46D /* BodyTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BodyTypes.h; sourceTree = ""; }; 4913320F13726B1F00DFB46D /* Breakable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Breakable.h; sourceTree = ""; }; 4913321013726B1F00DFB46D /* Bridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Bridge.h; sourceTree = ""; }; - 4913321113726B1F00DFB46D /* BulletTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BulletTest.h; sourceTree = ""; }; 4913321213726B1F00DFB46D /* Cantilever.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cantilever.h; sourceTree = ""; }; - 4913321313726B1F00DFB46D /* Car.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Car.h; sourceTree = ""; }; 4913321413726B1F00DFB46D /* Chain.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Chain.h; sourceTree = ""; }; 4913321513726B1F00DFB46D /* CharacterCollision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CharacterCollision.h; sourceTree = ""; }; 4913321613726B1F00DFB46D /* CollisionFiltering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollisionFiltering.h; sourceTree = ""; }; @@ -123,26 +113,20 @@ 4913321C13726B1F00DFB46D /* Dominos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Dominos.h; sourceTree = ""; }; 4913321D13726B1F00DFB46D /* DynamicTreeTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DynamicTreeTest.h; sourceTree = ""; }; 4913321E13726B1F00DFB46D /* EdgeShapes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EdgeShapes.h; sourceTree = ""; }; - 4913321F13726B1F00DFB46D /* EdgeTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EdgeTest.h; sourceTree = ""; }; 4913322013726B1F00DFB46D /* Gears.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gears.h; sourceTree = ""; }; 4913322113726B1F00DFB46D /* LineJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LineJoint.h; sourceTree = ""; }; 4913322213726B1F00DFB46D /* OneSidedPlatform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OneSidedPlatform.h; sourceTree = ""; }; - 4913322313726B1F00DFB46D /* Pinball.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pinball.h; sourceTree = ""; }; 4913322413726B1F00DFB46D /* PolyCollision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolyCollision.h; sourceTree = ""; }; 4913322513726B1F00DFB46D /* PolyShapes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolyShapes.h; sourceTree = ""; }; 4913322613726B1F00DFB46D /* Prismatic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prismatic.h; sourceTree = ""; }; 4913322713726B1F00DFB46D /* Pulleys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pulleys.h; sourceTree = ""; }; 4913322813726B1F00DFB46D /* Pyramid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Pyramid.h; sourceTree = ""; }; 4913322913726B1F00DFB46D /* RayCast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RayCast.h; sourceTree = ""; }; - 4913322A13726B1F00DFB46D /* Revolute.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Revolute.h; sourceTree = ""; }; - 4913322B13726B1F00DFB46D /* Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Rope.h; sourceTree = ""; }; - 4913322C13726B1F00DFB46D /* RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RopeJoint.h; sourceTree = ""; }; 4913322D13726B1F00DFB46D /* SensorTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SensorTest.h; sourceTree = ""; }; 4913322E13726B1F00DFB46D /* ShapeEditing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShapeEditing.h; sourceTree = ""; }; 4913322F13726B1F00DFB46D /* SliderCrank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderCrank.h; sourceTree = ""; }; 4913323013726B1F00DFB46D /* SphereStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SphereStack.h; sourceTree = ""; }; 4913323113726B1F00DFB46D /* TheoJansen.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TheoJansen.h; sourceTree = ""; }; - 4913323213726B1F00DFB46D /* Tiles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Tiles.h; sourceTree = ""; }; 4913323313726B1F00DFB46D /* TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimeOfImpact.h; sourceTree = ""; }; 4913323413726B1F00DFB46D /* VaryingFriction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VaryingFriction.h; sourceTree = ""; }; 4913323513726B1F00DFB46D /* VaryingRestitution.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VaryingRestitution.h; sourceTree = ""; }; @@ -259,9 +243,7 @@ 4913320E13726B1F00DFB46D /* BodyTypes.h */, 4913320F13726B1F00DFB46D /* Breakable.h */, 4913321013726B1F00DFB46D /* Bridge.h */, - 4913321113726B1F00DFB46D /* BulletTest.h */, 4913321213726B1F00DFB46D /* Cantilever.h */, - 4913321313726B1F00DFB46D /* Car.h */, 4913321413726B1F00DFB46D /* Chain.h */, 4913321513726B1F00DFB46D /* CharacterCollision.h */, 4913321613726B1F00DFB46D /* CollisionFiltering.h */, @@ -273,26 +255,20 @@ 4913321C13726B1F00DFB46D /* Dominos.h */, 4913321D13726B1F00DFB46D /* DynamicTreeTest.h */, 4913321E13726B1F00DFB46D /* EdgeShapes.h */, - 4913321F13726B1F00DFB46D /* EdgeTest.h */, 4913322013726B1F00DFB46D /* Gears.h */, 4913322113726B1F00DFB46D /* LineJoint.h */, 4913322213726B1F00DFB46D /* OneSidedPlatform.h */, - 4913322313726B1F00DFB46D /* Pinball.h */, 4913322413726B1F00DFB46D /* PolyCollision.h */, 4913322513726B1F00DFB46D /* PolyShapes.h */, 4913322613726B1F00DFB46D /* Prismatic.h */, 4913322713726B1F00DFB46D /* Pulleys.h */, 4913322813726B1F00DFB46D /* Pyramid.h */, 4913322913726B1F00DFB46D /* RayCast.h */, - 4913322A13726B1F00DFB46D /* Revolute.h */, - 4913322B13726B1F00DFB46D /* Rope.h */, - 4913322C13726B1F00DFB46D /* RopeJoint.h */, 4913322D13726B1F00DFB46D /* SensorTest.h */, 4913322E13726B1F00DFB46D /* ShapeEditing.h */, 4913322F13726B1F00DFB46D /* SliderCrank.h */, 4913323013726B1F00DFB46D /* SphereStack.h */, 4913323113726B1F00DFB46D /* TheoJansen.h */, - 4913323213726B1F00DFB46D /* Tiles.h */, 4913323313726B1F00DFB46D /* TimeOfImpact.h */, 4913323413726B1F00DFB46D /* VaryingFriction.h */, 4913323513726B1F00DFB46D /* VaryingRestitution.h */, @@ -321,9 +297,7 @@ 4913323913726B1F00DFB46D /* BodyTypes.h in Headers */, 4913323A13726B1F00DFB46D /* Breakable.h in Headers */, 4913323B13726B1F00DFB46D /* Bridge.h in Headers */, - 4913323C13726B1F00DFB46D /* BulletTest.h in Headers */, 4913323D13726B1F00DFB46D /* Cantilever.h in Headers */, - 4913323E13726B1F00DFB46D /* Car.h in Headers */, 4913323F13726B1F00DFB46D /* Chain.h in Headers */, 4913324013726B1F00DFB46D /* CharacterCollision.h in Headers */, 4913324113726B1F00DFB46D /* CollisionFiltering.h in Headers */, @@ -335,26 +309,20 @@ 4913324713726B1F00DFB46D /* Dominos.h in Headers */, 4913324813726B1F00DFB46D /* DynamicTreeTest.h in Headers */, 4913324913726B1F00DFB46D /* EdgeShapes.h in Headers */, - 4913324A13726B1F00DFB46D /* EdgeTest.h in Headers */, 4913324B13726B1F00DFB46D /* Gears.h in Headers */, 4913324C13726B1F00DFB46D /* LineJoint.h in Headers */, 4913324D13726B1F00DFB46D /* OneSidedPlatform.h in Headers */, - 4913324E13726B1F00DFB46D /* Pinball.h in Headers */, 4913324F13726B1F00DFB46D /* PolyCollision.h in Headers */, 4913325013726B1F00DFB46D /* PolyShapes.h in Headers */, 4913325113726B1F00DFB46D /* Prismatic.h in Headers */, 4913325213726B1F00DFB46D /* Pulleys.h in Headers */, 4913325313726B1F00DFB46D /* Pyramid.h in Headers */, 4913325413726B1F00DFB46D /* RayCast.h in Headers */, - 4913325513726B1F00DFB46D /* Revolute.h in Headers */, - 4913325613726B1F00DFB46D /* Rope.h in Headers */, - 4913325713726B1F00DFB46D /* RopeJoint.h in Headers */, 4913325813726B1F00DFB46D /* SensorTest.h in Headers */, 4913325913726B1F00DFB46D /* ShapeEditing.h in Headers */, 4913325A13726B1F00DFB46D /* SliderCrank.h in Headers */, 4913325B13726B1F00DFB46D /* SphereStack.h in Headers */, 4913325C13726B1F00DFB46D /* TheoJansen.h in Headers */, - 4913325D13726B1F00DFB46D /* Tiles.h in Headers */, 4913325E13726B1F00DFB46D /* TimeOfImpact.h in Headers */, 4913325F13726B1F00DFB46D /* VaryingFriction.h in Headers */, 4913326013726B1F00DFB46D /* VaryingRestitution.h in Headers */, diff --git a/libs/box2d/iPhone/Classes/Box2DView.mm b/libs/box2d/iPhone/Classes/Box2DView.mm index edbf9ef..11743b0 100644 --- a/libs/box2d/iPhone/Classes/Box2DView.mm +++ b/libs/box2d/iPhone/Classes/Box2DView.mm @@ -66,8 +66,6 @@ Settings settings; [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / kAccelerometerFrequency)]; [[UIAccelerometer sharedAccelerometer] setDelegate:self]; - - //[self setMultipleTouchEnabled:YES]; } @@ -248,9 +246,7 @@ Settings settings; //printf("Screen touched %f,%f -> %f,%f\n",touchLocation.x,touchLocation.y,worldPosition.x,worldPosition.y); lastScreenTouch=touchLocation; lastWorldTouch=worldPosition; - b2Vec2 p = b2Vec2(lastWorldTouch.x,lastWorldTouch.y); - test->MouseDown(p); - //test->ShiftMouseDown(p); + test->MouseDown(b2Vec2(lastWorldTouch.x,lastWorldTouch.y)); if (!test->m_mouseJoint) panning=true; } diff --git a/libs/box2d/iPhone/Classes/GLES-Render.h b/libs/box2d/iPhone/Classes/GLES-Render.h index 8e02a74..2551666 100644 --- a/libs/box2d/iPhone/Classes/GLES-Render.h +++ b/libs/box2d/iPhone/Classes/GLES-Render.h @@ -32,7 +32,7 @@ struct b2AABB; // This class implements debug drawing callbacks that are invoked // inside b2World::Step. -class GLESDebugDraw : public b2Draw +class GLESDebugDraw : public b2DebugDraw { public: void DrawPolygon(const b2Vec2* vertices, int32 vertexCount, const b2Color& color); diff --git a/libs/box2d/iPhone/Classes/TestEntriesViewController.mm b/libs/box2d/iPhone/Classes/TestEntriesViewController.mm index bb8e1ac..49eb94e 100644 --- a/libs/box2d/iPhone/Classes/TestEntriesViewController.mm +++ b/libs/box2d/iPhone/Classes/TestEntriesViewController.mm @@ -57,7 +57,7 @@ TestEntry* e = g_testEntries; e+=indexPath.row; - cell.textLabel.text = [NSString stringWithUTF8String:e->name]; + [cell setText:[NSString stringWithCString:e->name]]; return cell; } diff --git a/libs/box2d/iPhone/Classes/iPhoneTest.h b/libs/box2d/iPhone/Classes/iPhoneTest.h index c7c767a..dc82ed5 100644 --- a/libs/box2d/iPhone/Classes/iPhoneTest.h +++ b/libs/box2d/iPhone/Classes/iPhoneTest.h @@ -58,28 +58,25 @@ inline float32 RandomFloat(float32 lo, float32 hi) struct Settings { Settings() : - viewCenter(0.0f, 20.0f), - hz(60.0f), - velocityIterations(8), - positionIterations(3), - drawShapes(1), - drawJoints(1), - drawAABBs(0), - drawPairs(0), - drawContactPoints(0), - drawContactNormals(0), - drawContactForces(0), - drawFrictionForces(0), - drawCOMs(0), - drawStats(0), - enableWarmStarting(1), - enableContinuous(1), - enableSubStepping(0), - pause(0), - singleStep(0) - {} - - b2Vec2 viewCenter; + hz(60.0f), + velocityIterations(10), + positionIterations(4), + drawStats(0), + drawShapes(1), + drawJoints(1), + drawAABBs(0), + drawPairs(0), + drawContactPoints(0), + drawContactNormals(0), + drawContactForces(0), + drawFrictionForces(0), + drawCOMs(0), + enableWarmStarting(1), + enableContinuous(1), + pause(0), + singleStep(0) + {} + float32 hz; int32 velocityIterations; int32 positionIterations; @@ -95,7 +92,6 @@ struct Settings int32 drawStats; int32 enableWarmStarting; int32 enableContinuous; - int32 enableSubStepping; int32 pause; int32 singleStep; }; diff --git a/libs/box2d/iPhone/Classes/iPhoneTest.mm b/libs/box2d/iPhone/Classes/iPhoneTest.mm index faf08df..16cc5da 100644 --- a/libs/box2d/iPhone/Classes/iPhoneTest.mm +++ b/libs/box2d/iPhone/Classes/iPhoneTest.mm @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com * * iPhone port by Simon Oliver - http://www.simonoliver.com - http://www.handcircus.com * @@ -46,16 +46,16 @@ Test::Test() m_textLine = 30; m_mouseJoint = NULL; m_pointCount = 0; - + m_destructionListener.test = this; m_world->SetDestructionListener(&m_destructionListener); m_world->SetContactListener(this); m_world->SetDebugDraw(&m_debugDraw); m_bombSpawning = false; - + m_stepCount = 0; - + b2BodyDef bodyDef; m_groundBody = m_world->CreateBody(&bodyDef); } @@ -79,21 +79,21 @@ void Test::SetGravity( float x, float y) void Test::PreSolve(b2Contact* contact, const b2Manifold* oldManifold) { const b2Manifold* manifold = contact->GetManifold(); - + if (manifold->pointCount == 0) { return; } - + b2Fixture* fixtureA = contact->GetFixtureA(); b2Fixture* fixtureB = contact->GetFixtureB(); - + b2PointState state1[b2_maxManifoldPoints], state2[b2_maxManifoldPoints]; b2GetPointStates(state1, state2, oldManifold, manifold); - + b2WorldManifold worldManifold; contact->GetWorldManifold(&worldManifold); - + for (int32 i = 0; i < manifold->pointCount && m_pointCount < k_maxContactPoints; ++i) { ContactPoint* cp = m_points + m_pointCount; @@ -112,36 +112,37 @@ void Test::DrawTitle(int x, int y, const char *string) } class QueryCallback : public b2QueryCallback -{ -public: - QueryCallback(const b2Vec2& point) - { - m_point = point; - m_fixture = NULL; - } - - bool ReportFixture(b2Fixture* fixture) { - b2Body* body = fixture->GetBody(); - if (body->GetType() == b2_dynamicBody) + public: + QueryCallback(const b2Vec2& point) { - bool inside = fixture->TestPoint(m_point); - if (inside) + m_point = point; + m_fixture = NULL; + } + + bool ReportFixture(b2Fixture* fixture) + { + b2Body* body = fixture->GetBody(); + if (body->GetType() == b2_dynamicBody) { - m_fixture = fixture; - - // We are done, terminate the query. - return false; + bool inside = fixture->TestPoint(m_point); + if (inside) + { + m_fixture = fixture; + + // We are done, terminate the query. + return false; + } } + + // Continue the query. + return true; } + + b2Vec2 m_point; + b2Fixture* m_fixture; + }; - // Continue the query. - return true; - } - - b2Vec2 m_point; - b2Fixture* m_fixture; -}; void Test::MouseDown(const b2Vec2& p) { @@ -151,18 +152,18 @@ void Test::MouseDown(const b2Vec2& p) { return; } - + // Make a small box. b2AABB aabb; b2Vec2 d; d.Set(0.001f, 0.001f); aabb.lowerBound = p - d; aabb.upperBound = p + d; - + // Query the world for overlapping shapes. QueryCallback callback(p); m_world->QueryAABB(&callback, aabb); - + if (callback.m_fixture) { b2Body* body = callback.m_fixture->GetBody(); @@ -186,14 +187,14 @@ void Test::SpawnBomb(const b2Vec2& worldPt) m_bombSpawnPoint = worldPt; m_bombSpawning = true; } - + void Test::CompleteBombSpawn(const b2Vec2& p) { if (m_bombSpawning == false) { return; } - + const float multiplier = 30.0f; b2Vec2 vel = m_bombSpawnPoint - p; vel *= multiplier; @@ -209,7 +210,7 @@ void Test::ShiftMouseDown(const b2Vec2& p) { return; } - + SpawnBomb(p); } @@ -251,7 +252,7 @@ void Test::LaunchBomb(const b2Vec2& position, const b2Vec2& velocity) m_world->DestroyBody(m_bomb); m_bomb = NULL; } - + b2BodyDef bd; bd.type = b2_dynamicBody; bd.position = position; @@ -261,11 +262,11 @@ void Test::LaunchBomb(const b2Vec2& position, const b2Vec2& velocity) b2CircleShape circle; circle.m_radius = 0.3f; - + b2FixtureDef fd; fd.shape = &circle; fd.density = 20.0f; - fd.restitution = 0.0f; + fd.restitution = 0.1f; b2Vec2 minV = position - b2Vec2(0.3f,0.3f); b2Vec2 maxV = position + b2Vec2(0.3f,0.3f); @@ -273,14 +274,14 @@ void Test::LaunchBomb(const b2Vec2& position, const b2Vec2& velocity) b2AABB aabb; aabb.lowerBound = minV; aabb.upperBound = maxV; - + m_bomb->CreateFixture(&fd); } void Test::Step(Settings* settings) { float32 timeStep = settings->hz > 0.0f ? 1.0f / settings->hz : float32(0.0f); - + if (settings->pause) { if (settings->singleStep) @@ -291,94 +292,89 @@ void Test::Step(Settings* settings) { timeStep = 0.0f; } - + m_debugDraw.DrawString(5, m_textLine, "****PAUSED****"); m_textLine += 15; } - + uint32 flags = 0; - flags += settings->drawShapes * b2Draw::e_shapeBit; - flags += settings->drawJoints * b2Draw::e_jointBit; - flags += settings->drawAABBs * b2Draw::e_aabbBit; - flags += settings->drawPairs * b2Draw::e_pairBit; - flags += settings->drawCOMs * b2Draw::e_centerOfMassBit; + flags += settings->drawShapes * b2DebugDraw::e_shapeBit; + flags += settings->drawJoints * b2DebugDraw::e_jointBit; + flags += settings->drawAABBs * b2DebugDraw::e_aabbBit; + flags += settings->drawPairs * b2DebugDraw::e_pairBit; + flags += settings->drawCOMs * b2DebugDraw::e_centerOfMassBit; m_debugDraw.SetFlags(flags); - + m_world->SetWarmStarting(settings->enableWarmStarting > 0); m_world->SetContinuousPhysics(settings->enableContinuous > 0); - m_world->SetSubStepping(settings->enableSubStepping > 0); - + m_pointCount = 0; - + m_world->Step(timeStep, settings->velocityIterations, settings->positionIterations); - + m_world->DrawDebugData(); - + if (timeStep > 0.0f) { ++m_stepCount; } - + if (settings->drawStats) { m_debugDraw.DrawString(5, m_textLine, "bodies/contacts/joints/proxies = %d/%d/%d", - m_world->GetBodyCount(), m_world->GetContactCount(), m_world->GetJointCount(), m_world->GetProxyCount()); + m_world->GetBodyCount(), m_world->GetContactCount(), m_world->GetJointCount(), m_world->GetProxyCount()); m_textLine += 15; + +// m_debugDraw.DrawString(5, m_textLine, "heap bytes = %d", b2_byteCount); +// m_textLine += 15; } - + if (m_mouseJoint) { - b2Vec2 p1 = m_mouseJoint->GetAnchorB(); - b2Vec2 p2 = m_mouseJoint->GetTarget(); - - glPointSize(4.0f); - glColor4f(0.0f, 1.0f, 0.0f, 1.0f); - GLbyte verts1[2 * 3] = { - p1.x, p1.y, 0.0f, - p2.x, p2.y, 0.0f - }; - glVertexPointer(3, GL_BYTE, 0, verts1); - glDrawArrays(GL_POINTS, 0, 2); - glPointSize(1.0f); - - glColor4f(0.8f, 0.8f, 0.8f, 1.0f); - GLbyte verts2[2 * 3] = { - p1.x, p1.y, 0.0f, - p2.x, p2.y, 0.0f - }; - glVertexPointer(3, GL_BYTE, 0, verts2); - glDrawArrays(GL_LINES, 0, 2); +// b2Body* body = m_mouseJoint->GetBodyB(); +// b2Vec2 p1 = body->GetWorldPoint(m_mouseJoint->m_localAnchor); +// b2Vec2 p2 = m_mouseJoint->m_target; +// +// glPointSize(4.0f); +// glColor3f(0.0f, 1.0f, 0.0f); +// glBegin(GL_POINTS); +// glVertex2f(p1.x, p1.y); +// glVertex2f(p2.x, p2.y); +// glEnd(); +// glPointSize(1.0f); +// +// glColor3f(0.8f, 0.8f, 0.8f); +// glBegin(GL_LINES); +// glVertex2f(p1.x, p1.y); +// glVertex2f(p2.x, p2.y); +// glEnd(); } if (m_bombSpawning) { - glPointSize(4.0f); - glColor4f(0.0f, 0.0f, 1.0f, 1.0f); - glColor4f(0.0f, 0.0f, 1.0f, 1.0f); - GLbyte verts1[1 * 3] = { - m_bombSpawnPoint.x, m_bombSpawnPoint.y, 0.0f - }; - glVertexPointer(3, GL_BYTE, 0, verts1); - glDrawArrays(GL_POINTS, 0, 1); - - glColor4f(0.8f, 0.8f, 0.8f, 1.0f); - GLbyte verts2[2 * 3] = { - m_mouseWorld.x, m_mouseWorld.y, 0.0f, - m_bombSpawnPoint.x, m_bombSpawnPoint.y, 0.0f - }; - glVertexPointer(3, GL_BYTE, 0, verts2); - glDrawArrays(GL_LINES, 0, 2); +// glPointSize(4.0f); +// glColor3f(0.0f, 0.0f, 1.0f); +// glBegin(GL_POINTS); +// glColor3f(0.0f, 0.0f, 1.0f); +// glVertex2f(m_bombSpawnPoint.x, m_bombSpawnPoint.y); +// glEnd(); +// +// glColor3f(0.8f, 0.8f, 0.8f); +// glBegin(GL_LINES); +// glVertex2f(m_mouseWorld.x, m_mouseWorld.y); +// glVertex2f(m_bombSpawnPoint.x, m_bombSpawnPoint.y); +// glEnd(); } - + if (settings->drawContactPoints) { //const float32 k_impulseScale = 0.1f; const float32 k_axisScale = 0.3f; - + for (int32 i = 0; i < m_pointCount; ++i) { ContactPoint* point = m_points + i; - + if (point->state == b2_addState) { // Add @@ -389,12 +385,12 @@ void Test::Step(Settings* settings) // Persist m_debugDraw.DrawPoint(point->position, 5.0f, b2Color(0.3f, 0.3f, 0.95f)); } - + if (settings->drawContactNormals == 1) { b2Vec2 p1 = point->position; b2Vec2 p2 = p1 + k_axisScale * point->normal; - m_debugDraw.DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.9f)); + m_debugDraw.DrawSegment(p1, p2, b2Color(0.4f, 0.9f, 0.4f)); } else if (settings->drawContactForces == 1) { @@ -402,7 +398,7 @@ void Test::Step(Settings* settings) //b2Vec2 p2 = p1 + k_forceScale * point->normalForce * point->normal; //DrawSegment(p1, p2, b2Color(0.9f, 0.9f, 0.3f)); } - + if (settings->drawFrictionForces == 1) { //b2Vec2 tangent = b2Cross(point->normal, 1.0f); diff --git a/libs/box2d/iPhone/Classes/iPhoneTestEntries.mm b/libs/box2d/iPhone/Classes/iPhoneTestEntries.mm index 18faaa0..02da5f5 100644 --- a/libs/box2d/iPhone/Classes/iPhoneTestEntries.mm +++ b/libs/box2d/iPhone/Classes/iPhoneTestEntries.mm @@ -1,111 +1,92 @@ -/* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include "iPhoneTest.h" -#include -using namespace std; - -#include "ApplyForce.h" -#include "BodyTypes.h" -#include "Breakable.h" -#include "Bridge.h" -#include "BulletTest.h" -#include "Cantilever.h" -#include "Car.h" -#include "ContinuousTest.h" -#include "Chain.h" -#include "CharacterCollision.h" -#include "CollisionFiltering.h" -#include "CollisionProcessing.h" -#include "CompoundShapes.h" -#include "Confined.h" -#include "DistanceTest.h" -#include "Dominos.h" -#include "DynamicTreeTest.h" -#include "EdgeShapes.h" -#include "EdgeTest.h" -#include "Gears.h" -#include "OneSidedPlatform.h" -#include "Pinball.h" -#include "PolyCollision.h" -#include "PolyShapes.h" -#include "Prismatic.h" -#include "Pulleys.h" -#include "Pyramid.h" -#include "RayCast.h" -#include "Revolute.h" -#include "Rope.h" -#include "RopeJoint.h" -#include "SensorTest.h" -#include "ShapeEditing.h" -#include "SliderCrank.h" -#include "SphereStack.h" -#include "TheoJansen.h" -#include "Tiles.h" -#include "TimeOfImpact.h" -#include "VaryingFriction.h" -#include "VaryingRestitution.h" -#include "VerticalStack.h" -#include "Web.h" - -TestEntry g_testEntries[] = -{ - {"Pulleys", Pulleys::Create}, - {"SphereStack", SphereStack::Create}, - {"Tiles", Tiles::Create}, - {"Polygon Shapes", PolyShapes::Create}, - {"Rope", Rope::Create}, - {"Web", Web::Create}, - {"Car", Car::Create}, - {"Vertical Stack", VerticalStack::Create}, - {"RopeJoint", RopeJoint::Create}, - {"Character Collision", CharacterCollision::Create}, - {"Edge Test", EdgeTest::Create}, - {"One-Sided Platform", OneSidedPlatform::Create}, - {"Pinball", Pinball::Create}, - {"Bullet Test", BulletTest::Create}, - {"Continuous Test", ContinuousTest::Create}, - {"Time of Impact", TimeOfImpact::Create}, - {"Ray-Cast", RayCast::Create}, - {"Confined", Confined::Create}, - {"Pyramid", Pyramid::Create}, - {"Varying Restitution", VaryingRestitution::Create}, - {"Theo Jansen's Walker", TheoJansen::Create}, - {"Body Types", BodyTypes::Create}, - {"Prismatic", Prismatic::Create}, - {"Edge Shapes", EdgeShapes::Create}, - {"PolyCollision", PolyCollision::Create}, - {"Apply Force", ApplyForce::Create}, - {"Cantilever", Cantilever::Create}, - {"Bridge", Bridge::Create}, - {"Breakable", Breakable::Create}, - {"Chain", Chain::Create}, - {"Collision Filtering", CollisionFiltering::Create}, - {"Collision Processing", CollisionProcessing::Create}, - {"Compound Shapes", CompoundShapes::Create}, - {"Distance Test", DistanceTest::Create}, - {"Dominos", Dominos::Create}, - {"Dynamic Tree", DynamicTreeTest::Create}, - {"Gears", Gears::Create}, - {"Revolute", Revolute::Create}, - {"Sensor Test", SensorTest::Create}, - {"Shape Editing", ShapeEditing::Create}, - {"Slider Crank", SliderCrank::Create}, - {"Varying Friction", VaryingFriction::Create}, - {NULL, NULL} -}; +/* + * Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#include "iPhoneTest.h" +//#include "GLES-Render.h" + +#include "ApplyForce.h" +#include "BodyTypes.h" + +#include "Breakable.h" +#include "Bridge.h" +#include "Chain.h" +#include "CollisionFiltering.h" +#include "CollisionProcessing.h" +#include "CompoundShapes.h" +#include "Confined.h" +#include "DistanceTest.h" +#include "Dominos.h" +#include "DynamicTreeTest.h" +#include "Gears.h" +#include "LineJoint.h" +#include "OneSidedPlatform.h" +#include "PolyCollision.h" +#include "PolyShapes.h" +#include "Prismatic.h" +#include "Pulleys.h" +#include "Pyramid.h" +#include "RayCast.h" +#include "Revolute.h" +#include "SensorTest.h" +#include "ShapeEditing.h" +#include "SliderCrank.h" +#include "SphereStack.h" +#include "TheoJansen.h" +#include "TimeOfImpact.h" +#include "VaryingFriction.h" +#include "VaryingRestitution.h" +#include "VerticalStack.h" +#include "Web.h" + +TestEntry g_testEntries[] = +{ +{"Body Types", BodyTypes::Create}, +{"SphereStack", SphereStack::Create}, +{"Vertical Stack", VerticalStack::Create}, +{"Confined", Confined::Create}, +{"Bridge", Bridge::Create}, +{"Breakable", Breakable::Create}, +{"Varying Restitution", VaryingRestitution::Create}, +{"Ray-Cast", RayCast::Create}, +{"Pyramid", Pyramid::Create}, +{"PolyCollision", PolyCollision::Create}, +{"One-Sided Platform", OneSidedPlatform::Create}, +{"Apply Force", ApplyForce::Create}, +{"Chain", Chain::Create}, +{"Collision Filtering", CollisionFiltering::Create}, +{"Collision Processing", CollisionProcessing::Create}, +{"Compound Shapes", CompoundShapes::Create}, +{"Distance Test", DistanceTest::Create}, +{"Dominos", Dominos::Create}, +{"Dynamic Tree", DynamicTreeTest::Create}, +{"Gears", Gears::Create}, +{"Line Joint", LineJoint::Create}, +{"Polygon Shapes", PolyShapes::Create}, +{"Prismatic", Prismatic::Create}, +{"Pulleys", Pulleys::Create}, +{"Revolute", Revolute::Create}, +{"Sensor Test", SensorTest::Create}, +{"Shape Editing", ShapeEditing::Create}, +{"Slider Crank", SliderCrank::Create}, +{"Theo Jansen's Walker", TheoJansen::Create}, +{"Time of Impact", TimeOfImpact::Create}, +{"Varying Friction", VaryingFriction::Create}, +{"Web", Web::Create}, +{NULL, NULL} + +}; diff --git a/libs/box2d/src/Box2D/Box2D.h b/libs/box2d/src/Box2D/Box2D.h index 0414477..dc5701f 100644 --- a/libs/box2d/src/Box2D/Box2D.h +++ b/libs/box2d/src/Box2D/Box2D.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -32,12 +32,8 @@ For discussion please visit http://box2d.org/forum // These include files constitute the main Box2D API #include -#include -#include #include -#include -#include #include #include @@ -56,14 +52,11 @@ For discussion please visit http://box2d.org/forum #include #include #include -#include +#include #include #include #include #include -#include #include -#include - #endif diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2CircleShape.cpp b/libs/box2d/src/Box2D/Collision/Shapes/b2CircleShape.cpp index 80dac85..a950b0b 100644 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2CircleShape.cpp +++ b/libs/box2d/src/Box2D/Collision/Shapes/b2CircleShape.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -18,7 +18,6 @@ #include #include -using namespace std; b2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const { @@ -28,11 +27,6 @@ b2Shape* b2CircleShape::Clone(b2BlockAllocator* allocator) const return clone; } -int32 b2CircleShape::GetChildCount() const -{ - return 1; -} - bool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) const { b2Vec2 center = transform.position + b2Mul(transform.R, m_p); @@ -44,11 +38,8 @@ bool b2CircleShape::TestPoint(const b2Transform& transform, const b2Vec2& p) con // From Section 3.1.2 // x = s + a * r // norm(x) = radius -bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& transform, int32 childIndex) const +bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const { - B2_NOT_USED(childIndex); - b2Vec2 position = transform.position + b2Mul(transform.R, m_p); b2Vec2 s = input.p1 - position; float32 b = b2Dot(s, s) - m_radius * m_radius; @@ -81,10 +72,8 @@ bool b2CircleShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input return false; } -void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const +void b2CircleShape::ComputeAABB(b2AABB* aabb, const b2Transform& transform) const { - B2_NOT_USED(childIndex); - b2Vec2 p = transform.position + b2Mul(transform.R, m_p); aabb->lowerBound.Set(p.x - m_radius, p.y - m_radius); aabb->upperBound.Set(p.x + m_radius, p.y + m_radius); diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2CircleShape.h b/libs/box2d/src/Box2D/Collision/Shapes/b2CircleShape.h index 6c1fd54..bb31da8 100644 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2CircleShape.h +++ b/libs/box2d/src/Box2D/Collision/Shapes/b2CircleShape.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -30,18 +30,14 @@ public: /// Implement b2Shape. b2Shape* Clone(b2BlockAllocator* allocator) const; - /// @see b2Shape::GetChildCount - int32 GetChildCount() const; - /// Implement b2Shape. bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; /// Implement b2Shape. - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& transform, int32 childIndex) const; + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; + void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; /// @see b2Shape::ComputeMass void ComputeMass(b2MassData* massData, float32 density) const; diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2EdgeShape.cpp b/libs/box2d/src/Box2D/Collision/Shapes/b2EdgeShape.cpp deleted file mode 100644 index 19ca893..0000000 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2EdgeShape.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -using namespace std; - -void b2EdgeShape::Set(const b2Vec2& v1, const b2Vec2& v2) -{ - m_vertex1 = v1; - m_vertex2 = v2; - m_hasVertex0 = false; - m_hasVertex3 = false; -} - -b2Shape* b2EdgeShape::Clone(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2EdgeShape)); - b2EdgeShape* clone = new (mem) b2EdgeShape; - *clone = *this; - return clone; -} - -int32 b2EdgeShape::GetChildCount() const -{ - return 1; -} - -bool b2EdgeShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const -{ - B2_NOT_USED(xf); - B2_NOT_USED(p); - return false; -} - -// p = p1 + t * d -// v = v1 + s * e -// p1 + t * d = v1 + s * e -// s * e - t * d = p1 - v1 -bool b2EdgeShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& xf, int32 childIndex) const -{ - B2_NOT_USED(childIndex); - - // Put the ray into the edge's frame of reference. - b2Vec2 p1 = b2MulT(xf.R, input.p1 - xf.position); - b2Vec2 p2 = b2MulT(xf.R, input.p2 - xf.position); - b2Vec2 d = p2 - p1; - - b2Vec2 v1 = m_vertex1; - b2Vec2 v2 = m_vertex2; - b2Vec2 e = v2 - v1; - b2Vec2 normal(e.y, -e.x); - normal.Normalize(); - - // q = p1 + t * d - // dot(normal, q - v1) = 0 - // dot(normal, p1 - v1) + t * dot(normal, d) = 0 - float32 numerator = b2Dot(normal, v1 - p1); - float32 denominator = b2Dot(normal, d); - - if (denominator == 0.0f) - { - return false; - } - - float32 t = numerator / denominator; - if (t < 0.0f || 1.0f < t) - { - return false; - } - - b2Vec2 q = p1 + t * d; - - // q = v1 + s * r - // s = dot(q - v1, r) / dot(r, r) - b2Vec2 r = v2 - v1; - float32 rr = b2Dot(r, r); - if (rr == 0.0f) - { - return false; - } - - float32 s = b2Dot(q - v1, r) / rr; - if (s < 0.0f || 1.0f < s) - { - return false; - } - - output->fraction = t; - if (numerator > 0.0f) - { - output->normal = -normal; - } - else - { - output->normal = normal; - } - return true; -} - -void b2EdgeShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const -{ - B2_NOT_USED(childIndex); - - b2Vec2 v1 = b2Mul(xf, m_vertex1); - b2Vec2 v2 = b2Mul(xf, m_vertex2); - - b2Vec2 lower = b2Min(v1, v2); - b2Vec2 upper = b2Max(v1, v2); - - b2Vec2 r(m_radius, m_radius); - aabb->lowerBound = lower - r; - aabb->upperBound = upper + r; -} - -void b2EdgeShape::ComputeMass(b2MassData* massData, float32 density) const -{ - B2_NOT_USED(density); - - massData->mass = 0.0f; - massData->center = 0.5f * (m_vertex1 + m_vertex2); - massData->I = 0.0f; -} diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2EdgeShape.h b/libs/box2d/src/Box2D/Collision/Shapes/b2EdgeShape.h deleted file mode 100644 index 780eb2c..0000000 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2EdgeShape.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_EDGE_SHAPE_H -#define B2_EDGE_SHAPE_H - -#include - -/// A line segment (edge) shape. These can be connected in chains or loops -/// to other edge shapes. The connectivity information is used to ensure -/// correct contact normals. -class b2EdgeShape : public b2Shape -{ -public: - b2EdgeShape(); - - /// Set this as an isolated edge. - void Set(const b2Vec2& v1, const b2Vec2& v2); - - /// Implement b2Shape. - b2Shape* Clone(b2BlockAllocator* allocator) const; - - /// @see b2Shape::GetChildCount - int32 GetChildCount() const; - - /// @see b2Shape::TestPoint - bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; - - /// Implement b2Shape. - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& transform, int32 childIndex) const; - - /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; - - /// @see b2Shape::ComputeMass - void ComputeMass(b2MassData* massData, float32 density) const; - - /// These are the edge vertices - b2Vec2 m_vertex1, m_vertex2; - - /// Optional adjacent vertices. These are used for smooth collision. - b2Vec2 m_vertex0, m_vertex3; - bool m_hasVertex0, m_hasVertex3; -}; - -inline b2EdgeShape::b2EdgeShape() -{ - m_type = e_edge; - m_radius = b2_polygonRadius; - m_hasVertex0 = false; - m_hasVertex3 = false; -} - -#endif diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2LoopShape.cpp b/libs/box2d/src/Box2D/Collision/Shapes/b2LoopShape.cpp deleted file mode 100644 index 7f7a216..0000000 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2LoopShape.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include -using namespace std; - -b2LoopShape::~b2LoopShape() -{ - b2Free(m_vertices); - m_vertices = NULL; - m_count = 0; -} - -void b2LoopShape::Create(const b2Vec2* vertices, int32 count) -{ - b2Assert(m_vertices == NULL && m_count == 0); - b2Assert(count >= 2); - m_count = count; - m_vertices = (b2Vec2*)b2Alloc(count * sizeof(b2Vec2)); - memcpy(m_vertices, vertices, m_count * sizeof(b2Vec2)); -} - -b2Shape* b2LoopShape::Clone(b2BlockAllocator* allocator) const -{ - void* mem = allocator->Allocate(sizeof(b2LoopShape)); - b2LoopShape* clone = new (mem) b2LoopShape; - clone->Create(m_vertices, m_count); - return clone; -} - -int32 b2LoopShape::GetChildCount() const -{ - return m_count; -} - -void b2LoopShape::GetChildEdge(b2EdgeShape* edge, int32 index) const -{ - b2Assert(2 <= m_count); - b2Assert(0 <= index && index < m_count); - edge->m_type = b2Shape::e_edge; - edge->m_radius = m_radius; - edge->m_hasVertex0 = true; - edge->m_hasVertex3 = true; - - int32 i0 = index - 1 >= 0 ? index - 1 : m_count - 1; - int32 i1 = index; - int32 i2 = index + 1 < m_count ? index + 1 : 0; - int32 i3 = index + 2; - while (i3 >= m_count) - { - i3 -= m_count; - } - - edge->m_vertex0 = m_vertices[i0]; - edge->m_vertex1 = m_vertices[i1]; - edge->m_vertex2 = m_vertices[i2]; - edge->m_vertex3 = m_vertices[i3]; -} - -bool b2LoopShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const -{ - B2_NOT_USED(xf); - B2_NOT_USED(p); - return false; -} - -bool b2LoopShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& xf, int32 childIndex) const -{ - b2Assert(childIndex < m_count); - - b2EdgeShape edgeShape; - - int32 i1 = childIndex; - int32 i2 = childIndex + 1; - if (i2 == m_count) - { - i2 = 0; - } - - edgeShape.m_vertex1 = m_vertices[i1]; - edgeShape.m_vertex2 = m_vertices[i2]; - - return edgeShape.RayCast(output, input, xf, 0); -} - -void b2LoopShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const -{ - b2Assert(childIndex < m_count); - - int32 i1 = childIndex; - int32 i2 = childIndex + 1; - if (i2 == m_count) - { - i2 = 0; - } - - b2Vec2 v1 = b2Mul(xf, m_vertices[i1]); - b2Vec2 v2 = b2Mul(xf, m_vertices[i2]); - - aabb->lowerBound = b2Min(v1, v2); - aabb->upperBound = b2Max(v1, v2); -} - -void b2LoopShape::ComputeMass(b2MassData* massData, float32 density) const -{ - B2_NOT_USED(density); - - massData->mass = 0.0f; - massData->center.SetZero(); - massData->I = 0.0f; -} diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2LoopShape.h b/libs/box2d/src/Box2D/Collision/Shapes/b2LoopShape.h deleted file mode 100644 index 0dd7f1c..0000000 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2LoopShape.h +++ /dev/null @@ -1,96 +0,0 @@ -/* -* Copyright (c) 2006-2010 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#ifndef B2_LOOP_SHAPE_H -#define B2_LOOP_SHAPE_H - -#include - -class b2EdgeShape; - -/// A loop shape is a free form sequence of line segments that form a circular list. -/// The loop may cross upon itself, but this is not recommended for smooth collision. -/// The loop has double sided collision, so you can use inside and outside collision. -/// Therefore, you may use any winding order. -/// Since there may be many vertices, they are allocated using b2Alloc. -class b2LoopShape : public b2Shape -{ -public: - b2LoopShape(); - - /// The destructor frees the vertices using b2Free. - ~b2LoopShape(); - - /// Create the loop shape, copy all vertices. - void Create(const b2Vec2* vertices, int32 count); - - /// Implement b2Shape. Vertices are cloned using b2Alloc. - b2Shape* Clone(b2BlockAllocator* allocator) const; - - /// @see b2Shape::GetChildCount - int32 GetChildCount() const; - - /// Get a child edge. - void GetChildEdge(b2EdgeShape* edge, int32 index) const; - - /// This always return false. - /// @see b2Shape::TestPoint - bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; - - /// Implement b2Shape. - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& transform, int32 childIndex) const; - - /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; - - /// Chains have zero mass. - /// @see b2Shape::ComputeMass - void ComputeMass(b2MassData* massData, float32 density) const; - - /// Get the number of vertices. - int32 GetCount() const { return m_count; } - - /// Get the vertices (read-only). - const b2Vec2& GetVertex(int32 index) const - { - b2Assert(0 <= index && index < m_count); - return m_vertices[index]; - } - - /// Get the vertices (read-only). - const b2Vec2* GetVertices() const { return m_vertices; } - -protected: - - /// The vertices. Owned by this class. - b2Vec2* m_vertices; - - /// The vertex count. - int32 m_count; -}; - -inline b2LoopShape::b2LoopShape() -{ - m_type = e_loop; - m_radius = b2_polygonRadius; - m_vertices = NULL; - m_count = 0; -} - -#endif diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2PolygonShape.cpp b/libs/box2d/src/Box2D/Collision/Shapes/b2PolygonShape.cpp index a625aff..429e647 100644 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2PolygonShape.cpp +++ b/libs/box2d/src/Box2D/Collision/Shapes/b2PolygonShape.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -66,18 +66,30 @@ void b2PolygonShape::SetAsBox(float32 hx, float32 hy, const b2Vec2& center, floa } } -int32 b2PolygonShape::GetChildCount() const +void b2PolygonShape::SetAsEdge(const b2Vec2& v1, const b2Vec2& v2) { - return 1; + m_vertexCount = 2; + m_vertices[0] = v1; + m_vertices[1] = v2; + m_centroid = 0.5f * (v1 + v2); + m_normals[0] = b2Cross(v2 - v1, 1.0f); + m_normals[0].Normalize(); + m_normals[1] = -m_normals[0]; } static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) { - b2Assert(count >= 3); + b2Assert(count >= 2); b2Vec2 c; c.Set(0.0f, 0.0f); float32 area = 0.0f; + if (count == 2) + { + c = 0.5f * (vs[0] + vs[1]); + return c; + } + // pRef is the reference point for forming triangles. // It's location doesn't change the result (except for rounding error). b2Vec2 pRef(0.0f, 0.0f); @@ -119,7 +131,7 @@ static b2Vec2 ComputeCentroid(const b2Vec2* vs, int32 count) void b2PolygonShape::Set(const b2Vec2* vertices, int32 count) { - b2Assert(3 <= count && count <= b2_maxPolygonVertices); + b2Assert(2 <= count && count <= b2_maxPolygonVertices); m_vertexCount = count; // Copy vertices. @@ -186,82 +198,131 @@ bool b2PolygonShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const return true; } -bool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& xf, int32 childIndex) const +bool b2PolygonShape::RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& xf) const { - B2_NOT_USED(childIndex); - // Put the ray into the polygon's frame of reference. b2Vec2 p1 = b2MulT(xf.R, input.p1 - xf.position); b2Vec2 p2 = b2MulT(xf.R, input.p2 - xf.position); b2Vec2 d = p2 - p1; - float32 lower = 0.0f, upper = input.maxFraction; - - int32 index = -1; - - for (int32 i = 0; i < m_vertexCount; ++i) + if (m_vertexCount == 2) { - // p = p1 + a * d - // dot(normal, p - v) = 0 - // dot(normal, p1 - v) + a * dot(normal, d) = 0 - float32 numerator = b2Dot(m_normals[i], m_vertices[i] - p1); - float32 denominator = b2Dot(m_normals[i], d); + b2Vec2 v1 = m_vertices[0]; + b2Vec2 v2 = m_vertices[1]; + b2Vec2 normal = m_normals[0]; + + // q = p1 + t * d + // dot(normal, q - v1) = 0 + // dot(normal, p1 - v1) + t * dot(normal, d) = 0 + float32 numerator = b2Dot(normal, v1 - p1); + float32 denominator = b2Dot(normal, d); if (denominator == 0.0f) - { - if (numerator < 0.0f) - { - return false; - } + { + return false; + } + + float32 t = numerator / denominator; + if (t < 0.0f || 1.0f < t) + { + return false; + } + + b2Vec2 q = p1 + t * d; + + // q = v1 + s * r + // s = dot(q - v1, r) / dot(r, r) + b2Vec2 r = v2 - v1; + float32 rr = b2Dot(r, r); + if (rr == 0.0f) + { + return false; + } + + float32 s = b2Dot(q - v1, r) / rr; + if (s < 0.0f || 1.0f < s) + { + return false; + } + + output->fraction = t; + if (numerator > 0.0f) + { + output->normal = -normal; } else { - // Note: we want this predicate without division: - // lower < numerator / denominator, where denominator < 0 - // Since denominator < 0, we have to flip the inequality: - // lower < numerator / denominator <==> denominator * lower > numerator. - if (denominator < 0.0f && numerator < lower * denominator) + output->normal = normal; + } + return true; + } + else + { + float32 lower = 0.0f, upper = input.maxFraction; + + int32 index = -1; + + for (int32 i = 0; i < m_vertexCount; ++i) + { + // p = p1 + a * d + // dot(normal, p - v) = 0 + // dot(normal, p1 - v) + a * dot(normal, d) = 0 + float32 numerator = b2Dot(m_normals[i], m_vertices[i] - p1); + float32 denominator = b2Dot(m_normals[i], d); + + if (denominator == 0.0f) + { + if (numerator < 0.0f) + { + return false; + } + } + else { - // Increase lower. - // The segment enters this half-space. - lower = numerator / denominator; - index = i; + // Note: we want this predicate without division: + // lower < numerator / denominator, where denominator < 0 + // Since denominator < 0, we have to flip the inequality: + // lower < numerator / denominator <==> denominator * lower > numerator. + if (denominator < 0.0f && numerator < lower * denominator) + { + // Increase lower. + // The segment enters this half-space. + lower = numerator / denominator; + index = i; + } + else if (denominator > 0.0f && numerator < upper * denominator) + { + // Decrease upper. + // The segment exits this half-space. + upper = numerator / denominator; + } } - else if (denominator > 0.0f && numerator < upper * denominator) + + // The use of epsilon here causes the assert on lower to trip + // in some cases. Apparently the use of epsilon was to make edge + // shapes work, but now those are handled separately. + //if (upper < lower - b2_epsilon) + if (upper < lower) { - // Decrease upper. - // The segment exits this half-space. - upper = numerator / denominator; + return false; } } - // The use of epsilon here causes the assert on lower to trip - // in some cases. Apparently the use of epsilon was to make edge - // shapes work, but now those are handled separately. - //if (upper < lower - b2_epsilon) - if (upper < lower) + b2Assert(0.0f <= lower && lower <= input.maxFraction); + + if (index >= 0) { - return false; + output->fraction = lower; + output->normal = b2Mul(xf.R, m_normals[index]); + return true; } } - b2Assert(0.0f <= lower && lower <= input.maxFraction); - - if (index >= 0) - { - output->fraction = lower; - output->normal = b2Mul(xf.R, m_normals[index]); - return true; - } - return false; } -void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const +void b2PolygonShape::ComputeAABB(b2AABB* aabb, const b2Transform& xf) const { - B2_NOT_USED(childIndex); - b2Vec2 lower = b2Mul(xf, m_vertices[0]); b2Vec2 upper = lower; @@ -303,30 +364,44 @@ void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const // // The rest of the derivation is handled by computer algebra. - b2Assert(m_vertexCount >= 3); + b2Assert(m_vertexCount >= 2); + + // A line segment has zero mass. + if (m_vertexCount == 2) + { + massData->center = 0.5f * (m_vertices[0] + m_vertices[1]); + massData->mass = 0.0f; + massData->I = 0.0f; + return; + } b2Vec2 center; center.Set(0.0f, 0.0f); float32 area = 0.0f; float32 I = 0.0f; - // s is the reference point for forming triangles. + // pRef is the reference point for forming triangles. // It's location doesn't change the result (except for rounding error). - b2Vec2 s(0.0f, 0.0f); - + b2Vec2 pRef(0.0f, 0.0f); +#if 0 // This code would put the reference point inside the polygon. for (int32 i = 0; i < m_vertexCount; ++i) { - s += m_vertices[i]; + pRef += m_vertices[i]; } - s *= 1.0f / m_vertexCount; + pRef *= 1.0f / count; +#endif const float32 k_inv3 = 1.0f / 3.0f; for (int32 i = 0; i < m_vertexCount; ++i) { // Triangle vertices. - b2Vec2 e1 = m_vertices[i] - s; - b2Vec2 e2 = i + 1 < m_vertexCount ? m_vertices[i+1] - s : m_vertices[0] - s; + b2Vec2 p1 = pRef; + b2Vec2 p2 = m_vertices[i]; + b2Vec2 p3 = i + 1 < m_vertexCount ? m_vertices[i+1] : m_vertices[0]; + + b2Vec2 e1 = p2 - p1; + b2Vec2 e2 = p3 - p1; float32 D = b2Cross(e1, e2); @@ -334,15 +409,16 @@ void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const area += triangleArea; // Area weighted centroid - center += triangleArea * k_inv3 * (e1 + e2); + center += triangleArea * k_inv3 * (p1 + p2 + p3); + float32 px = p1.x, py = p1.y; float32 ex1 = e1.x, ey1 = e1.y; float32 ex2 = e2.x, ey2 = e2.y; - float32 intx2 = ex1*ex1 + ex2*ex1 + ex2*ex2; - float32 inty2 = ey1*ey1 + ey2*ey1 + ey2*ey2; + float32 intx2 = k_inv3 * (0.25f * (ex1*ex1 + ex2*ex1 + ex2*ex2) + (px*ex1 + px*ex2)) + 0.5f*px*px; + float32 inty2 = k_inv3 * (0.25f * (ey1*ey1 + ey2*ey1 + ey2*ey2) + (py*ey1 + py*ey2)) + 0.5f*py*py; - I += (0.25f * k_inv3 * D) * (intx2 + inty2); + I += D * (intx2 + inty2); } // Total mass @@ -351,8 +427,8 @@ void b2PolygonShape::ComputeMass(b2MassData* massData, float32 density) const // Center of mass b2Assert(area > b2_epsilon); center *= 1.0f / area; - massData->center = center + s; + massData->center = center; // Inertia tensor relative to the local origin. - massData->I = density * I + massData->mass * b2Dot(s, s); + massData->I = density * I; } diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2PolygonShape.h b/libs/box2d/src/Box2D/Collision/Shapes/b2PolygonShape.h index fd11bd1..564d4b0 100644 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2PolygonShape.h +++ b/libs/box2d/src/Box2D/Collision/Shapes/b2PolygonShape.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -23,8 +23,6 @@ /// A convex polygon. It is assumed that the interior of the polygon is to /// the left of each edge. -/// Polygons have a maximum number of vertices equal to b2_maxPolygonVertices. -/// In most cases you should not need many vertices for a convex polygon. class b2PolygonShape : public b2Shape { public: @@ -33,12 +31,8 @@ public: /// Implement b2Shape. b2Shape* Clone(b2BlockAllocator* allocator) const; - /// @see b2Shape::GetChildCount - int32 GetChildCount() const; - /// Copy vertices. This assumes the vertices define a convex polygon. /// It is assumed that the exterior is the the right of each edge. - /// The count must be in the range [3, b2_maxPolygonVertices]. void Set(const b2Vec2* vertices, int32 vertexCount); /// Build vertices to represent an axis-aligned box. @@ -53,19 +47,27 @@ public: /// @param angle the rotation of the box in local coordinates. void SetAsBox(float32 hx, float32 hy, const b2Vec2& center, float32 angle); + /// Set this as a single edge. + void SetAsEdge(const b2Vec2& v1, const b2Vec2& v2); + /// @see b2Shape::TestPoint bool TestPoint(const b2Transform& transform, const b2Vec2& p) const; /// Implement b2Shape. - bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& transform, int32 childIndex) const; + bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const; /// @see b2Shape::ComputeAABB - void ComputeAABB(b2AABB* aabb, const b2Transform& transform, int32 childIndex) const; + void ComputeAABB(b2AABB* aabb, const b2Transform& transform) const; /// @see b2Shape::ComputeMass void ComputeMass(b2MassData* massData, float32 density) const; + /// Get the supporting vertex index in the given direction. + int32 GetSupport(const b2Vec2& d) const; + + /// Get the supporting vertex in the given direction. + const b2Vec2& GetSupportVertex(const b2Vec2& d) const; + /// Get the vertex count. int32 GetVertexCount() const { return m_vertexCount; } @@ -86,6 +88,40 @@ inline b2PolygonShape::b2PolygonShape() m_centroid.SetZero(); } +inline int32 b2PolygonShape::GetSupport(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_vertexCount; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return bestIndex; +} + +inline const b2Vec2& b2PolygonShape::GetSupportVertex(const b2Vec2& d) const +{ + int32 bestIndex = 0; + float32 bestValue = b2Dot(m_vertices[0], d); + for (int32 i = 1; i < m_vertexCount; ++i) + { + float32 value = b2Dot(m_vertices[i], d); + if (value > bestValue) + { + bestIndex = i; + bestValue = value; + } + } + + return m_vertices[bestIndex]; +} + inline const b2Vec2& b2PolygonShape::GetVertex(int32 index) const { b2Assert(0 <= index && index < m_vertexCount); diff --git a/libs/box2d/src/Box2D/Collision/Shapes/b2Shape.h b/libs/box2d/src/Box2D/Collision/Shapes/b2Shape.h index 34656dd..9082c0e 100644 --- a/libs/box2d/src/Box2D/Collision/Shapes/b2Shape.h +++ b/libs/box2d/src/Box2D/Collision/Shapes/b2Shape.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -38,7 +38,7 @@ struct b2MassData /// A shape is used for collision detection. You can create a shape however you like. /// Shapes used for simulation in b2World are created automatically when a b2Fixture -/// is created. Shapes may encapsulate a one or more child shapes. +/// is created. class b2Shape { public: @@ -47,10 +47,8 @@ public: { e_unknown= -1, e_circle = 0, - e_edge = 1, - e_polygon = 2, - e_loop = 3, - e_typeCount = 4 + e_polygon = 1, + e_typeCount = 2, }; b2Shape() { m_type = e_unknown; } @@ -63,27 +61,21 @@ public: /// @return the shape type. Type GetType() const; - /// Get the number of child primitives. - virtual int32 GetChildCount() const = 0; - /// Test a point for containment in this shape. This only works for convex shapes. /// @param xf the shape world transform. /// @param p a point in world coordinates. virtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0; - /// Cast a ray against a child shape. + /// Cast a ray against this shape. /// @param output the ray-cast results. /// @param input the ray-cast input parameters. /// @param transform the transform to be applied to the shape. - /// @param childIndex the child shape index - virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, - const b2Transform& transform, int32 childIndex) const = 0; + virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input, const b2Transform& transform) const = 0; - /// Given a transform, compute the associated axis aligned bounding box for a child shape. + /// Given a transform, compute the associated axis aligned bounding box for this shape. /// @param aabb returns the axis aligned box. /// @param xf the world transform of the shape. - /// @param childIndex the child shape - virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const = 0; + virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf) const = 0; /// Compute the mass properties of this shape using its dimensions and density. /// The inertia tensor is computed about the local origin. diff --git a/libs/box2d/src/Box2D/Collision/b2BroadPhase.cpp b/libs/box2d/src/Box2D/Collision/b2BroadPhase.cpp index 2aa62f9..12c7967 100644 --- a/libs/box2d/src/Box2D/Collision/b2BroadPhase.cpp +++ b/libs/box2d/src/Box2D/Collision/b2BroadPhase.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -18,7 +18,6 @@ #include #include -using namespace std; b2BroadPhase::b2BroadPhase() { @@ -63,11 +62,6 @@ void b2BroadPhase::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& di } } -void b2BroadPhase::TouchProxy(int32 proxyId) -{ - BufferMove(proxyId); -} - void b2BroadPhase::BufferMove(int32 proxyId) { if (m_moveCount == m_moveCapacity) diff --git a/libs/box2d/src/Box2D/Collision/b2BroadPhase.h b/libs/box2d/src/Box2D/Collision/b2BroadPhase.h index c7398c9..bff188e 100644 --- a/libs/box2d/src/Box2D/Collision/b2BroadPhase.h +++ b/libs/box2d/src/Box2D/Collision/b2BroadPhase.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -40,7 +40,7 @@ public: enum { - e_nullProxy = -1 + e_nullProxy = -1, }; b2BroadPhase(); @@ -57,9 +57,6 @@ public: /// call UpdatePairs to finalized the proxy pairs (for your time step). void MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement); - /// Call to trigger a re-processing of it's pairs on the next call to UpdatePairs. - void TouchProxy(int32 proxyId); - /// Get the fat AABB for a proxy. const b2AABB& GetFatAABB(int32 proxyId) const; @@ -91,14 +88,8 @@ public: template void RayCast(T* callback, const b2RayCastInput& input) const; - /// Get the height of the embedded tree. - int32 GetTreeHeight() const; - - /// Get the balance of the embedded tree. - int32 GetTreeBalance() const; - - /// Get the quality metric of the embedded tree. - float32 GetTreeQuality() const; + /// Compute the height of the embedded tree. + int32 ComputeHeight() const; private: @@ -162,19 +153,9 @@ inline int32 b2BroadPhase::GetProxyCount() const return m_proxyCount; } -inline int32 b2BroadPhase::GetTreeHeight() const -{ - return m_tree.GetHeight(); -} - -inline int32 b2BroadPhase::GetTreeBalance() const -{ - return m_tree.GetMaxBalance(); -} - -inline float32 b2BroadPhase::GetTreeQuality() const +inline int32 b2BroadPhase::ComputeHeight() const { - return m_tree.GetAreaRatio(); + return m_tree.ComputeHeight(); } template @@ -230,7 +211,7 @@ void b2BroadPhase::UpdatePairs(T* callback) } // Try to keep the tree balanced. - //m_tree.Rebalance(4); + m_tree.Rebalance(4); } template diff --git a/libs/box2d/src/Box2D/Collision/b2CollideCircle.cpp b/libs/box2d/src/Box2D/Collision/b2CollideCircle.cpp index 0ad58f0..6edf89d 100644 --- a/libs/box2d/src/Box2D/Collision/b2CollideCircle.cpp +++ b/libs/box2d/src/Box2D/Collision/b2CollideCircle.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages diff --git a/libs/box2d/src/Box2D/Collision/b2CollideEdge.cpp b/libs/box2d/src/Box2D/Collision/b2CollideEdge.cpp deleted file mode 100644 index e2ded85..0000000 --- a/libs/box2d/src/Box2D/Collision/b2CollideEdge.cpp +++ /dev/null @@ -1,673 +0,0 @@ -/* -* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org -* -* This software is provided 'as-is', without any express or implied -* warranty. In no event will the authors be held liable for any damages -* arising from the use of this software. -* Permission is granted to anyone to use this software for any purpose, -* including commercial applications, and to alter it and redistribute it -* freely, subject to the following restrictions: -* 1. The origin of this software must not be misrepresented; you must not -* claim that you wrote the original software. If you use this software -* in a product, an acknowledgment in the product documentation would be -* appreciated but is not required. -* 2. Altered source versions must be plainly marked as such, and must not be -* misrepresented as being the original software. -* 3. This notice may not be removed or altered from any source distribution. -*/ - -#include -#include -#include -#include - -enum b2EdgeType -{ - b2_isolated, - b2_concave, - b2_flat, - b2_convex -}; - -// Compute contact points for edge versus circle. -// This accounts for edge connectivity. -void b2CollideEdgeAndCircle(b2Manifold* manifold, - const b2EdgeShape* edgeA, const b2Transform& xfA, - const b2CircleShape* circleB, const b2Transform& xfB) -{ - manifold->pointCount = 0; - - // Compute circle in frame of edge - b2Vec2 Q = b2MulT(xfA, b2Mul(xfB, circleB->m_p)); - - b2Vec2 A = edgeA->m_vertex1, B = edgeA->m_vertex2; - b2Vec2 e = B - A; - - // Barycentric coordinates - float32 u = b2Dot(e, B - Q); - float32 v = b2Dot(e, Q - A); - - float32 radius = edgeA->m_radius + circleB->m_radius; - - b2ContactFeature cf; - cf.indexB = 0; - cf.typeB = b2ContactFeature::e_vertex; - - // Region A - if (v <= 0.0f) - { - b2Vec2 P = A; - b2Vec2 d = Q - P; - float32 dd = b2Dot(d, d); - if (dd > radius * radius) - { - return; - } - - // Is there an edge connected to A? - if (edgeA->m_hasVertex0) - { - b2Vec2 A1 = edgeA->m_vertex0; - b2Vec2 B1 = A; - b2Vec2 e1 = B1 - A1; - float32 u1 = b2Dot(e1, B1 - Q); - - // Is the circle in Region AB of the previous edge? - if (u1 > 0.0f) - { - return; - } - } - - cf.indexA = 0; - cf.typeA = b2ContactFeature::e_vertex; - manifold->pointCount = 1; - manifold->type = b2Manifold::e_circles; - manifold->localNormal.SetZero(); - manifold->localPoint = P; - manifold->points[0].id.key = 0; - manifold->points[0].id.cf = cf; - manifold->points[0].localPoint = circleB->m_p; - return; - } - - // Region B - if (u <= 0.0f) - { - b2Vec2 P = B; - b2Vec2 d = Q - P; - float32 dd = b2Dot(d, d); - if (dd > radius * radius) - { - return; - } - - // Is there an edge connected to B? - if (edgeA->m_hasVertex3) - { - b2Vec2 B2 = edgeA->m_vertex3; - b2Vec2 A2 = B; - b2Vec2 e2 = B2 - A2; - float32 v2 = b2Dot(e2, Q - A2); - - // Is the circle in Region AB of the next edge? - if (v2 > 0.0f) - { - return; - } - } - - cf.indexA = 1; - cf.typeA = b2ContactFeature::e_vertex; - manifold->pointCount = 1; - manifold->type = b2Manifold::e_circles; - manifold->localNormal.SetZero(); - manifold->localPoint = P; - manifold->points[0].id.key = 0; - manifold->points[0].id.cf = cf; - manifold->points[0].localPoint = circleB->m_p; - return; - } - - // Region AB - float32 den = b2Dot(e, e); - b2Assert(den > 0.0f); - b2Vec2 P = (1.0f / den) * (u * A + v * B); - b2Vec2 d = Q - P; - float32 dd = b2Dot(d, d); - if (dd > radius * radius) - { - return; - } - - b2Vec2 n(-e.y, e.x); - if (b2Dot(n, Q - A) < 0.0f) - { - n.Set(-n.x, -n.y); - } - n.Normalize(); - - cf.indexA = 0; - cf.typeA = b2ContactFeature::e_face; - manifold->pointCount = 1; - manifold->type = b2Manifold::e_faceA; - manifold->localNormal = n; - manifold->localPoint = A; - manifold->points[0].id.key = 0; - manifold->points[0].id.cf = cf; - manifold->points[0].localPoint = circleB->m_p; -} - -struct b2EPAxis -{ - enum Type - { - e_unknown, - e_edgeA, - e_edgeB - }; - - Type type; - int32 index; - float32 separation; -}; - -// Edge shape plus more stuff. -struct b2FatEdge -{ - b2Vec2 v0, v1, v2, v3; - b2Vec2 normal; - bool hasVertex0, hasVertex3; -}; - -// This lets us treate and edge shape and a polygon in the same -// way in the SAT collider. -struct b2EPProxy -{ - b2Vec2 vertices[b2_maxPolygonVertices]; - b2Vec2 normals[b2_maxPolygonVertices]; - b2Vec2 centroid; - int32 count; -}; - -// This class collides and edge and a polygon, taking into account edge adjacency. -struct b2EPCollider -{ - b2EPCollider(const b2EdgeShape* edgeA, const b2Transform& xfA, - const b2PolygonShape* polygonB_in, const b2Transform& xfB); - - void Collide(b2Manifold* manifold); - - void ComputeAdjacency(); - b2EPAxis ComputeEdgeSeparation(); - b2EPAxis ComputePolygonSeparation(); - void FindIncidentEdge(b2ClipVertex c[2], const b2EPProxy* proxy1, int32 edge1, const b2EPProxy* proxy2); - - b2FatEdge m_edgeA; - - b2EPProxy m_proxyA, m_proxyB; - - b2Transform m_xf; - b2Vec2 m_normal0, m_normal2; - b2Vec2 m_limit11, m_limit12; - b2Vec2 m_limit21, m_limit22; - float32 m_radius; -}; - -b2EPCollider::b2EPCollider(const b2EdgeShape* edgeA, const b2Transform& xfA, - const b2PolygonShape* polygonB, const b2Transform& xfB) -{ - m_xf = b2MulT(xfA, xfB); - - // Edge geometry - m_edgeA.v0 = edgeA->m_vertex0; - m_edgeA.v1 = edgeA->m_vertex1; - m_edgeA.v2 = edgeA->m_vertex2; - m_edgeA.v3 = edgeA->m_vertex3; - b2Vec2 e = m_edgeA.v2 - m_edgeA.v1; - - // Normal points outwards in CCW order. - m_edgeA.normal.Set(e.y, -e.x); - m_edgeA.normal.Normalize(); - m_edgeA.hasVertex0 = edgeA->m_hasVertex0; - m_edgeA.hasVertex3 = edgeA->m_hasVertex3; - - // Proxy for edge - m_proxyA.vertices[0] = m_edgeA.v1; - m_proxyA.vertices[1] = m_edgeA.v2; - m_proxyA.normals[0] = m_edgeA.normal; - m_proxyA.normals[1] = -m_edgeA.normal; - m_proxyA.centroid = 0.5f * (m_edgeA.v1 + m_edgeA.v2); - m_proxyA.count = 2; - - // Proxy for polygon - m_proxyB.count = polygonB->m_vertexCount; - m_proxyB.centroid = b2Mul(m_xf, polygonB->m_centroid); - for (int32 i = 0; i < polygonB->m_vertexCount; ++i) - { - m_proxyB.vertices[i] = b2Mul(m_xf, polygonB->m_vertices[i]); - m_proxyB.normals[i] = b2Mul(m_xf.R, polygonB->m_normals[i]); - } - - m_radius = 2.0f * b2_polygonRadius; - - m_limit11.SetZero(); - m_limit12.SetZero(); - m_limit21.SetZero(); - m_limit22.SetZero(); -} - -// Collide an edge and polygon. This uses the SAT and clipping to produce up to 2 contact points. -// Edge adjacency is handle to produce locally valid contact points and normals. This is intended -// to allow the polygon to slide smoothly over an edge chain. -// -// Algorithm -// 1. Classify front-side or back-side collision with edge. -// 2. Compute separation -// 3. Process adjacent edges -// 4. Classify adjacent edge as convex, flat, null, or concave -// 5. Skip null or concave edges. Concave edges get a separate manifold. -// 6. If the edge is flat, compute contact points as normal. Discard boundary points. -// 7. If the edge is convex, compute it's separation. -// 8. Use the minimum separation of up to three edges. If the minimum separation -// is not the primary edge, return. -// 9. If the minimum separation is the primary edge, compute the contact points and return. -void b2EPCollider::Collide(b2Manifold* manifold) -{ - manifold->pointCount = 0; - - ComputeAdjacency(); - - b2EPAxis edgeAxis = ComputeEdgeSeparation(); - - // If no valid normal can be found than this edge should not collide. - // This can happen on the middle edge of a 3-edge zig-zag chain. - if (edgeAxis.type == b2EPAxis::e_unknown) - { - return; - } - - if (edgeAxis.separation > m_radius) - { - return; - } - - b2EPAxis polygonAxis = ComputePolygonSeparation(); - if (polygonAxis.type != b2EPAxis::e_unknown && polygonAxis.separation > m_radius) - { - return; - } - - // Use hysteresis for jitter reduction. - const float32 k_relativeTol = 0.98f; - const float32 k_absoluteTol = 0.001f; - - b2EPAxis primaryAxis; - if (polygonAxis.type == b2EPAxis::e_unknown) - { - primaryAxis = edgeAxis; - } - else if (polygonAxis.separation > k_relativeTol * edgeAxis.separation + k_absoluteTol) - { - primaryAxis = polygonAxis; - } - else - { - primaryAxis = edgeAxis; - } - - b2EPProxy* proxy1; - b2EPProxy* proxy2; - b2ClipVertex incidentEdge[2]; - if (primaryAxis.type == b2EPAxis::e_edgeA) - { - proxy1 = &m_proxyA; - proxy2 = &m_proxyB; - manifold->type = b2Manifold::e_faceA; - } - else - { - proxy1 = &m_proxyB; - proxy2 = &m_proxyA; - manifold->type = b2Manifold::e_faceB; - } - - int32 edge1 = primaryAxis.index; - - FindIncidentEdge(incidentEdge, proxy1, primaryAxis.index, proxy2); - int32 count1 = proxy1->count; - const b2Vec2* vertices1 = proxy1->vertices; - - int32 iv1 = edge1; - int32 iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; - - b2Vec2 v11 = vertices1[iv1]; - b2Vec2 v12 = vertices1[iv2]; - - b2Vec2 tangent = v12 - v11; - tangent.Normalize(); - - b2Vec2 normal = b2Cross(tangent, 1.0f); - b2Vec2 planePoint = 0.5f * (v11 + v12); - - // Face offset. - float32 frontOffset = b2Dot(normal, v11); - - // Side offsets, extended by polytope skin thickness. - float32 sideOffset1 = -b2Dot(tangent, v11) + m_radius; - float32 sideOffset2 = b2Dot(tangent, v12) + m_radius; - - // Clip incident edge against extruded edge1 side edges. - b2ClipVertex clipPoints1[2]; - b2ClipVertex clipPoints2[2]; - int np; - - // Clip to box side 1 - np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1, iv1); - - if (np < b2_maxManifoldPoints) - { - return; - } - - // Clip to negative box side 1 - np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); - - if (np < b2_maxManifoldPoints) - { - return; - } - - // Now clipPoints2 contains the clipped points. - if (primaryAxis.type == b2EPAxis::e_edgeA) - { - manifold->localNormal = normal; - manifold->localPoint = planePoint; - } - else - { - manifold->localNormal = b2MulT(m_xf.R, normal); - manifold->localPoint = b2MulT(m_xf, planePoint); - } - - int32 pointCount = 0; - for (int32 i = 0; i < b2_maxManifoldPoints; ++i) - { - float32 separation; - - separation = b2Dot(normal, clipPoints2[i].v) - frontOffset; - - if (separation <= m_radius) - { - b2ManifoldPoint* cp = manifold->points + pointCount; - - if (primaryAxis.type == b2EPAxis::e_edgeA) - { - cp->localPoint = b2MulT(m_xf, clipPoints2[i].v); - cp->id = clipPoints2[i].id; - } - else - { - cp->localPoint = clipPoints2[i].v; - cp->id.cf.typeA = clipPoints2[i].id.cf.typeB; - cp->id.cf.typeB = clipPoints2[i].id.cf.typeA; - cp->id.cf.indexA = clipPoints2[i].id.cf.indexB; - cp->id.cf.indexB = clipPoints2[i].id.cf.indexA; - } - - ++pointCount; - } - } - - manifold->pointCount = pointCount; -} - -// Compute allowable normal ranges based on adjacency. -// A normal n is allowable iff: -// cross(n, n1) >= 0.0f && cross(n2, n) >= 0.0f -// n points from A to B (edge to polygon) -void b2EPCollider::ComputeAdjacency() -{ - b2Vec2 v0 = m_edgeA.v0; - b2Vec2 v1 = m_edgeA.v1; - b2Vec2 v2 = m_edgeA.v2; - b2Vec2 v3 = m_edgeA.v3; - - // Determine allowable the normal regions based on adjacency. - // Note: it may be possible that no normal is admissable. - b2Vec2 centerB = m_proxyB.centroid; - if (m_edgeA.hasVertex0) - { - b2Vec2 e0 = v1 - v0; - b2Vec2 e1 = v2 - v1; - b2Vec2 n0(e0.y, -e0.x); - b2Vec2 n1(e1.y, -e1.x); - n0.Normalize(); - n1.Normalize(); - - bool convex = b2Cross(n0, n1) >= 0.0f; - bool front0 = b2Dot(n0, centerB - v0) >= 0.0f; - bool front1 = b2Dot(n1, centerB - v1) >= 0.0f; - - if (convex) - { - if (front0 || front1) - { - m_limit11 = n1; - m_limit12 = n0; - } - else - { - m_limit11 = -n1; - m_limit12 = -n0; - } - } - else - { - if (front0 && front1) - { - m_limit11 = n0; - m_limit12 = n1; - } - else - { - m_limit11 = -n0; - m_limit12 = -n1; - } - } - } - else - { - m_limit11.SetZero(); - m_limit12.SetZero(); - } - - if (m_edgeA.hasVertex3) - { - b2Vec2 e1 = v2 - v1; - b2Vec2 e2 = v3 - v2; - b2Vec2 n1(e1.y, -e1.x); - b2Vec2 n2(e2.y, -e2.x); - n1.Normalize(); - n2.Normalize(); - - bool convex = b2Cross(n1, n2) >= 0.0f; - bool front1 = b2Dot(n1, centerB - v1) >= 0.0f; - bool front2 = b2Dot(n2, centerB - v2) >= 0.0f; - - if (convex) - { - if (front1 || front2) - { - m_limit21 = n2; - m_limit22 = n1; - } - else - { - m_limit21 = -n2; - m_limit22 = -n1; - } - } - else - { - if (front1 && front2) - { - m_limit21 = n1; - m_limit22 = n2; - } - else - { - m_limit21 = -n1; - m_limit22 = -n2; - } - } - } - else - { - m_limit21.SetZero(); - m_limit22.SetZero(); - } -} - -b2EPAxis b2EPCollider::ComputeEdgeSeparation() -{ - // EdgeA separation - b2EPAxis bestAxis; - bestAxis.type = b2EPAxis::e_unknown; - bestAxis.index = -1; - bestAxis.separation = -FLT_MAX; - b2Vec2 normals[2] = {m_edgeA.normal, -m_edgeA.normal}; - - for (int32 i = 0; i < 2; ++i) - { - b2Vec2 n = normals[i]; - - // Adjacency - bool valid1 = b2Cross(n, m_limit11) >= -b2_angularSlop && b2Cross(m_limit12, n) >= -b2_angularSlop; - bool valid2 = b2Cross(n, m_limit21) >= -b2_angularSlop && b2Cross(m_limit22, n) >= -b2_angularSlop; - - if (valid1 == false || valid2 == false) - { - continue; - } - - b2EPAxis axis; - axis.type = b2EPAxis::e_edgeA; - axis.index = i; - axis.separation = FLT_MAX; - - for (int32 j = 0; j < m_proxyB.count; ++j) - { - float32 s = b2Dot(n, m_proxyB.vertices[j] - m_edgeA.v1); - if (s < axis.separation) - { - axis.separation = s; - } - } - - if (axis.separation > m_radius) - { - return axis; - } - - if (axis.separation > bestAxis.separation) - { - bestAxis = axis; - } - } - - return bestAxis; -} - -b2EPAxis b2EPCollider::ComputePolygonSeparation() -{ - b2EPAxis axis; - axis.type = b2EPAxis::e_unknown; - axis.index = -1; - axis.separation = -FLT_MAX; - for (int32 i = 0; i < m_proxyB.count; ++i) - { - b2Vec2 n = -m_proxyB.normals[i]; - - // Adjacency - bool valid1 = b2Cross(n, m_limit11) >= -b2_angularSlop && b2Cross(m_limit12, n) >= -b2_angularSlop; - bool valid2 = b2Cross(n, m_limit21) >= -b2_angularSlop && b2Cross(m_limit22, n) >= -b2_angularSlop; - - if (valid1 == false && valid2 == false) - { - continue; - } - - float32 s1 = b2Dot(n, m_proxyB.vertices[i] - m_edgeA.v1); - float32 s2 = b2Dot(n, m_proxyB.vertices[i] - m_edgeA.v2); - float32 s = b2Min(s1, s2); - - if (s > m_radius) - { - axis.type = b2EPAxis::e_edgeB; - axis.index = i; - axis.separation = s; - } - - if (s > axis.separation) - { - axis.type = b2EPAxis::e_edgeB; - axis.index = i; - axis.separation = s; - } - } - - return axis; -} - -void b2EPCollider::FindIncidentEdge(b2ClipVertex c[2], const b2EPProxy* proxy1, int32 edge1, const b2EPProxy* proxy2) -{ - int32 count1 = proxy1->count; - const b2Vec2* normals1 = proxy1->normals; - - int32 count2 = proxy2->count; - const b2Vec2* vertices2 = proxy2->vertices; - const b2Vec2* normals2 = proxy2->normals; - - b2Assert(0 <= edge1 && edge1 < count1); - - // Get the normal of the reference edge in proxy2's frame. - b2Vec2 normal1 = normals1[edge1]; - - // Find the incident edge on proxy2. - int32 index = 0; - float32 minDot = b2_maxFloat; - for (int32 i = 0; i < count2; ++i) - { - float32 dot = b2Dot(normal1, normals2[i]); - if (dot < minDot) - { - minDot = dot; - index = i; - } - } - - // Build the clip vertices for the incident edge. - int32 i1 = index; - int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0; - - c[0].v = vertices2[i1]; - c[0].id.cf.indexA = (uint8)edge1; - c[0].id.cf.indexB = (uint8)i1; - c[0].id.cf.typeA = b2ContactFeature::e_face; - c[0].id.cf.typeB = b2ContactFeature::e_vertex; - - c[1].v = vertices2[i2]; - c[1].id.cf.indexA = (uint8)edge1; - c[1].id.cf.indexB = (uint8)i2; - c[1].id.cf.typeA = b2ContactFeature::e_face; - c[1].id.cf.typeB = b2ContactFeature::e_vertex; -} - -void b2CollideEdgeAndPolygon( b2Manifold* manifold, - const b2EdgeShape* edgeA, const b2Transform& xfA, - const b2PolygonShape* polygonB, const b2Transform& xfB) -{ - b2EPCollider collider(edgeA, xfA, polygonB, xfB); - collider.Collide(manifold); -} diff --git a/libs/box2d/src/Box2D/Collision/b2CollidePolygon.cpp b/libs/box2d/src/Box2D/Collision/b2CollidePolygon.cpp index bc53465..b37b7ba 100644 --- a/libs/box2d/src/Box2D/Collision/b2CollidePolygon.cpp +++ b/libs/box2d/src/Box2D/Collision/b2CollidePolygon.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -173,16 +173,14 @@ static void b2FindIncidentEdge(b2ClipVertex c[2], int32 i2 = i1 + 1 < count2 ? i1 + 1 : 0; c[0].v = b2Mul(xf2, vertices2[i1]); - c[0].id.cf.indexA = (uint8)edge1; - c[0].id.cf.indexB = (uint8)i1; - c[0].id.cf.typeA = b2ContactFeature::e_face; - c[0].id.cf.typeB = b2ContactFeature::e_vertex; + c[0].id.features.referenceEdge = (uint8)edge1; + c[0].id.features.incidentEdge = (uint8)i1; + c[0].id.features.incidentVertex = 0; c[1].v = b2Mul(xf2, vertices2[i2]); - c[1].id.cf.indexA = (uint8)edge1; - c[1].id.cf.indexB = (uint8)i2; - c[1].id.cf.typeA = b2ContactFeature::e_face; - c[1].id.cf.typeB = b2ContactFeature::e_vertex; + c[1].id.features.referenceEdge = (uint8)edge1; + c[1].id.features.incidentEdge = (uint8)i2; + c[1].id.features.incidentVertex = 1; } // Find edge normal of max separation on A - return if separating axis is found @@ -244,11 +242,8 @@ void b2CollidePolygons(b2Manifold* manifold, int32 count1 = poly1->m_vertexCount; const b2Vec2* vertices1 = poly1->m_vertices; - int32 iv1 = edge1; - int32 iv2 = edge1 + 1 < count1 ? edge1 + 1 : 0; - - b2Vec2 v11 = vertices1[iv1]; - b2Vec2 v12 = vertices1[iv2]; + b2Vec2 v11 = vertices1[edge1]; + b2Vec2 v12 = edge1 + 1 < count1 ? vertices1[edge1+1] : vertices1[0]; b2Vec2 localTangent = v12 - v11; localTangent.Normalize(); @@ -275,13 +270,13 @@ void b2CollidePolygons(b2Manifold* manifold, int np; // Clip to box side 1 - np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1, iv1); + np = b2ClipSegmentToLine(clipPoints1, incidentEdge, -tangent, sideOffset1); if (np < 2) return; // Clip to negative box side 1 - np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2, iv2); + np = b2ClipSegmentToLine(clipPoints2, clipPoints1, tangent, sideOffset2); if (np < 2) { @@ -302,15 +297,7 @@ void b2CollidePolygons(b2Manifold* manifold, b2ManifoldPoint* cp = manifold->points + pointCount; cp->localPoint = b2MulT(xf2, clipPoints2[i].v); cp->id = clipPoints2[i].id; - if (flip) - { - // Swap features - b2ContactFeature cf = cp->id.cf; - cp->id.cf.indexA = cf.indexB; - cp->id.cf.indexB = cf.indexA; - cp->id.cf.typeA = cf.typeB; - cp->id.cf.typeB = cf.typeA; - } + cp->id.features.flip = flip; ++pointCount; } } diff --git a/libs/box2d/src/Box2D/Collision/b2Collision.cpp b/libs/box2d/src/Box2D/Collision/b2Collision.cpp index f317cb9..a86c7c5 100644 --- a/libs/box2d/src/Box2D/Collision/b2Collision.cpp +++ b/libs/box2d/src/Box2D/Collision/b2Collision.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -196,7 +196,7 @@ bool b2AABB::RayCast(b2RayCastOutput* output, const b2RayCastInput& input) const // Sutherland-Hodgman clipping. int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], - const b2Vec2& normal, float32 offset, int32 vertexIndexA) + const b2Vec2& normal, float32 offset) { // Start with no output points int32 numOut = 0; @@ -215,25 +215,26 @@ int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], // Find intersection point of edge and plane float32 interp = distance0 / (distance0 - distance1); vOut[numOut].v = vIn[0].v + interp * (vIn[1].v - vIn[0].v); - - // VertexA is hitting edgeB. - vOut[numOut].id.cf.indexA = vertexIndexA; - vOut[numOut].id.cf.indexB = vIn[0].id.cf.indexB; - vOut[numOut].id.cf.typeA = b2ContactFeature::e_vertex; - vOut[numOut].id.cf.typeB = b2ContactFeature::e_face; + if (distance0 > 0.0f) + { + vOut[numOut].id = vIn[0].id; + } + else + { + vOut[numOut].id = vIn[1].id; + } ++numOut; } return numOut; } -bool b2TestOverlap( const b2Shape* shapeA, int32 indexA, - const b2Shape* shapeB, int32 indexB, - const b2Transform& xfA, const b2Transform& xfB) +bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, + const b2Transform& xfA, const b2Transform& xfB) { b2DistanceInput input; - input.proxyA.Set(shapeA, indexA); - input.proxyB.Set(shapeB, indexB); + input.proxyA.Set(shapeA); + input.proxyB.Set(shapeB); input.transformA = xfA; input.transformB = xfB; input.useRadii = true; diff --git a/libs/box2d/src/Box2D/Collision/b2Collision.h b/libs/box2d/src/Box2D/Collision/b2Collision.h index 2bc110e..baffdbd 100644 --- a/libs/box2d/src/Box2D/Collision/b2Collision.h +++ b/libs/box2d/src/Box2D/Collision/b2Collision.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -28,31 +28,21 @@ class b2Shape; class b2CircleShape; -class b2EdgeShape; class b2PolygonShape; const uint8 b2_nullFeature = UCHAR_MAX; -/// The features that intersect to form the contact point -/// This must be 4 bytes or less. -struct b2ContactFeature -{ - enum Type - { - e_vertex = 0, - e_face = 1 - }; - - uint8 indexA; ///< Feature index on shapeA - uint8 indexB; ///< Feature index on shapeB - uint8 typeA; ///< The feature type on shapeA - uint8 typeB; ///< The feature type on shapeB -}; - /// Contact ids to facilitate warm starting. union b2ContactID { - b2ContactFeature cf; + /// The features that intersect to form the contact point + struct Features + { + uint8 referenceEdge; ///< The edge that defines the outward contact normal. + uint8 incidentEdge; ///< The edge most anti-parallel to the reference edge. + uint8 incidentVertex; ///< The vertex (0 or 1) on the incident edge that was clipped. + uint8 flip; ///< A value of 1 indicates that the reference edge is on shape2. + } features; uint32 key; ///< Used to quickly compare contact ids. }; @@ -175,21 +165,6 @@ struct b2AABB return 0.5f * (upperBound - lowerBound); } - /// Get the perimeter length - float32 GetPerimeter() const - { - float32 wx = upperBound.x - lowerBound.x; - float32 wy = upperBound.y - lowerBound.y; - return 2.0f * (wx + wy); - } - - /// Combine an AABB into this one. - void Combine(const b2AABB& aabb) - { - lowerBound = b2Min(lowerBound, aabb.lowerBound); - upperBound = b2Max(upperBound, aabb.upperBound); - } - /// Combine two AABBs into this one. void Combine(const b2AABB& aabb1, const b2AABB& aabb2) { @@ -216,37 +191,26 @@ struct b2AABB /// Compute the collision manifold between two circles. void b2CollideCircles(b2Manifold* manifold, - const b2CircleShape* circleA, const b2Transform& xfA, - const b2CircleShape* circleB, const b2Transform& xfB); + const b2CircleShape* circle1, const b2Transform& xf1, + const b2CircleShape* circle2, const b2Transform& xf2); /// Compute the collision manifold between a polygon and a circle. void b2CollidePolygonAndCircle(b2Manifold* manifold, - const b2PolygonShape* polygonA, const b2Transform& xfA, - const b2CircleShape* circleB, const b2Transform& xfB); + const b2PolygonShape* polygon, const b2Transform& xf1, + const b2CircleShape* circle, const b2Transform& xf2); /// Compute the collision manifold between two polygons. void b2CollidePolygons(b2Manifold* manifold, - const b2PolygonShape* polygonA, const b2Transform& xfA, - const b2PolygonShape* polygonB, const b2Transform& xfB); - -/// Compute the collision manifold between an edge and a circle. -void b2CollideEdgeAndCircle(b2Manifold* manifold, - const b2EdgeShape* polygonA, const b2Transform& xfA, - const b2CircleShape* circleB, const b2Transform& xfB); - -/// Compute the collision manifold between an edge and a circle. -void b2CollideEdgeAndPolygon(b2Manifold* manifold, - const b2EdgeShape* edgeA, const b2Transform& xfA, - const b2PolygonShape* circleB, const b2Transform& xfB); + const b2PolygonShape* polygon1, const b2Transform& xf1, + const b2PolygonShape* polygon2, const b2Transform& xf2); /// Clipping for contact manifolds. int32 b2ClipSegmentToLine(b2ClipVertex vOut[2], const b2ClipVertex vIn[2], - const b2Vec2& normal, float32 offset, int32 vertexIndexA); + const b2Vec2& normal, float32 offset); /// Determine if two generic shapes overlap. -bool b2TestOverlap( const b2Shape* shapeA, int32 indexA, - const b2Shape* shapeB, int32 indexB, - const b2Transform& xfA, const b2Transform& xfB); +bool b2TestOverlap(const b2Shape* shapeA, const b2Shape* shapeB, + const b2Transform& xfA, const b2Transform& xfB); // ---------------- Inline Functions ------------------------------------------ diff --git a/libs/box2d/src/Box2D/Collision/b2Distance.cpp b/libs/box2d/src/Box2D/Collision/b2Distance.cpp index 39567dd..f95c82f 100644 --- a/libs/box2d/src/Box2D/Collision/b2Distance.cpp +++ b/libs/box2d/src/Box2D/Collision/b2Distance.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -18,14 +18,12 @@ #include #include -#include -#include #include // GJK using Voronoi regions (Christer Ericson) and Barycentric coordinates. int32 b2_gjkCalls, b2_gjkIters, b2_gjkMaxIters; -void b2DistanceProxy::Set(const b2Shape* shape, int32 index) +void b2DistanceProxy::Set(const b2Shape* shape) { switch (shape->GetType()) { @@ -47,36 +45,6 @@ void b2DistanceProxy::Set(const b2Shape* shape, int32 index) } break; - case b2Shape::e_loop: - { - const b2LoopShape* loop = (b2LoopShape*)shape; - b2Assert(0 <= index && index < loop->GetCount()); - - m_buffer[0] = loop->GetVertex(index); - if (index + 1 < loop->GetCount()) - { - m_buffer[1] = loop->GetVertex(index + 1); - } - else - { - m_buffer[1] = loop->GetVertex(0); - } - - m_vertices = m_buffer; - m_count = 2; - m_radius = loop->m_radius; - } - break; - - case b2Shape::e_edge: - { - const b2EdgeShape* edge = (b2EdgeShape*)shape; - m_vertices = &edge->m_vertex1; - m_count = 2; - m_radius = edge->m_radius; - } - break; - default: b2Assert(false); } diff --git a/libs/box2d/src/Box2D/Collision/b2Distance.h b/libs/box2d/src/Box2D/Collision/b2Distance.h index 54ed1e1..e56ea0a 100644 --- a/libs/box2d/src/Box2D/Collision/b2Distance.h +++ b/libs/box2d/src/Box2D/Collision/b2Distance.h @@ -1,6 +1,6 @@ /* -* Copyright (c) 2006-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2006-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -21,6 +21,7 @@ #define B2_DISTANCE_H #include +#include class b2Shape; @@ -32,7 +33,7 @@ struct b2DistanceProxy /// Initialize the proxy using the given shape. The shape /// must remain in scope while the proxy is in use. - void Set(const b2Shape* shape, int32 index); + void Set(const b2Shape* shape); /// Get the supporting vertex index in the given direction. int32 GetSupport(const b2Vec2& d) const; @@ -46,7 +47,6 @@ struct b2DistanceProxy /// Get a vertex by index. Used by b2Distance. const b2Vec2& GetVertex(int32 index) const; - b2Vec2 m_buffer[2]; const b2Vec2* m_vertices; int32 m_count; float32 m_radius; diff --git a/libs/box2d/src/Box2D/Collision/b2DynamicTree.cpp b/libs/box2d/src/Box2D/Collision/b2DynamicTree.cpp index f43ea1e..d8a05eb 100644 --- a/libs/box2d/src/Box2D/Collision/b2DynamicTree.cpp +++ b/libs/box2d/src/Box2D/Collision/b2DynamicTree.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Erin Catto http://www.box2d.org +* Copyright (c) 2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -19,10 +19,6 @@ #include #include #include -using namespace std; - - -#if B2_USE_DYNAMIC_TREE b2DynamicTree::b2DynamicTree() { @@ -30,17 +26,15 @@ b2DynamicTree::b2DynamicTree() m_nodeCapacity = 16; m_nodeCount = 0; - m_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode)); - memset(m_nodes, 0, m_nodeCapacity * sizeof(b2TreeNode)); + m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); + memset(m_nodes, 0, m_nodeCapacity * sizeof(b2DynamicTreeNode)); // Build a linked list for the free list. for (int32 i = 0; i < m_nodeCapacity - 1; ++i) { m_nodes[i].next = i + 1; - m_nodes[i].height = -1; } m_nodes[m_nodeCapacity-1].next = b2_nullNode; - m_nodes[m_nodeCapacity-1].height = -1; m_freeList = 0; m_path = 0; @@ -63,10 +57,10 @@ int32 b2DynamicTree::AllocateNode() b2Assert(m_nodeCount == m_nodeCapacity); // The free list is empty. Rebuild a bigger pool. - b2TreeNode* oldNodes = m_nodes; + b2DynamicTreeNode* oldNodes = m_nodes; m_nodeCapacity *= 2; - m_nodes = (b2TreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2TreeNode)); - memcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2TreeNode)); + m_nodes = (b2DynamicTreeNode*)b2Alloc(m_nodeCapacity * sizeof(b2DynamicTreeNode)); + memcpy(m_nodes, oldNodes, m_nodeCount * sizeof(b2DynamicTreeNode)); b2Free(oldNodes); // Build a linked list for the free list. The parent @@ -74,10 +68,8 @@ int32 b2DynamicTree::AllocateNode() for (int32 i = m_nodeCount; i < m_nodeCapacity - 1; ++i) { m_nodes[i].next = i + 1; - m_nodes[i].height = -1; } m_nodes[m_nodeCapacity-1].next = b2_nullNode; - m_nodes[m_nodeCapacity-1].height = -1; m_freeList = m_nodeCount; } @@ -87,8 +79,6 @@ int32 b2DynamicTree::AllocateNode() m_nodes[nodeId].parent = b2_nullNode; m_nodes[nodeId].child1 = b2_nullNode; m_nodes[nodeId].child2 = b2_nullNode; - m_nodes[nodeId].height = 0; - m_nodes[nodeId].userData = NULL; ++m_nodeCount; return nodeId; } @@ -99,7 +89,6 @@ void b2DynamicTree::FreeNode(int32 nodeId) b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); b2Assert(0 < m_nodeCount); m_nodes[nodeId].next = m_freeList; - m_nodes[nodeId].height = -1; m_freeList = nodeId; --m_nodeCount; } @@ -116,10 +105,20 @@ int32 b2DynamicTree::CreateProxy(const b2AABB& aabb, void* userData) m_nodes[proxyId].aabb.lowerBound = aabb.lowerBound - r; m_nodes[proxyId].aabb.upperBound = aabb.upperBound + r; m_nodes[proxyId].userData = userData; - m_nodes[proxyId].height = 0; InsertLeaf(proxyId); + // Rebalance if necessary. + int32 iterationCount = m_nodeCount >> 4; + int32 tryCount = 0; + int32 height = ComputeHeight(); + while (height > 64 && tryCount < 10) + { + Rebalance(iterationCount); + height = ComputeHeight(); + ++tryCount; + } + return proxyId; } @@ -189,133 +188,79 @@ void b2DynamicTree::InsertLeaf(int32 leaf) return; } - // Find the best sibling for this node - b2AABB leafAABB = m_nodes[leaf].aabb; - int32 index = m_root; - while (m_nodes[index].IsLeaf() == false) + // Find the best sibling for this node. + b2Vec2 center = m_nodes[leaf].aabb.GetCenter(); + int32 sibling = m_root; + if (m_nodes[sibling].IsLeaf() == false) { - int32 child1 = m_nodes[index].child1; - int32 child2 = m_nodes[index].child2; - - float32 area = m_nodes[index].aabb.GetPerimeter(); + do + { + int32 child1 = m_nodes[sibling].child1; + int32 child2 = m_nodes[sibling].child2; - b2AABB combinedAABB; - combinedAABB.Combine(m_nodes[index].aabb, leafAABB); - float32 combinedArea = combinedAABB.GetPerimeter(); + b2Vec2 delta1 = b2Abs(m_nodes[child1].aabb.GetCenter() - center); + b2Vec2 delta2 = b2Abs(m_nodes[child2].aabb.GetCenter() - center); - // Cost of creating a new parent for this node and the new leaf - float32 cost = 2.0f * combinedArea; + float32 norm1 = delta1.x + delta1.y; + float32 norm2 = delta2.x + delta2.y; - // Minimum cost of pushing the leaf further down the tree - float32 inheritanceCost = 2.0f * (combinedArea - area); + if (norm1 < norm2) + { + sibling = child1; + } + else + { + sibling = child2; + } - // Cost of descending into child1 - float32 cost1; - if (m_nodes[child1].IsLeaf()) - { - b2AABB aabb; - aabb.Combine(leafAABB, m_nodes[child1].aabb); - cost1 = aabb.GetPerimeter() + inheritanceCost; - } - else - { - b2AABB aabb; - aabb.Combine(leafAABB, m_nodes[child1].aabb); - float32 oldArea = m_nodes[child1].aabb.GetPerimeter(); - float32 newArea = aabb.GetPerimeter(); - cost1 = (newArea - oldArea) + inheritanceCost; - } - - // Cost of descending into child2 - float32 cost2; - if (m_nodes[child2].IsLeaf()) - { - b2AABB aabb; - aabb.Combine(leafAABB, m_nodes[child2].aabb); - cost2 = aabb.GetPerimeter() + inheritanceCost; - } - else - { - b2AABB aabb; - aabb.Combine(leafAABB, m_nodes[child2].aabb); - float32 oldArea = m_nodes[child2].aabb.GetPerimeter(); - float32 newArea = aabb.GetPerimeter(); - cost2 = newArea - oldArea + inheritanceCost; } + while(m_nodes[sibling].IsLeaf() == false); + } - // Descend according to the minimum cost. - if (cost < cost1 && cost < cost2) - { - break; - } + // Create a parent for the siblings. + int32 node1 = m_nodes[sibling].parent; + int32 node2 = AllocateNode(); + m_nodes[node2].parent = node1; + m_nodes[node2].userData = NULL; + m_nodes[node2].aabb.Combine(m_nodes[leaf].aabb, m_nodes[sibling].aabb); - // Descend - if (cost1 < cost2) + if (node1 != b2_nullNode) + { + if (m_nodes[m_nodes[sibling].parent].child1 == sibling) { - index = child1; + m_nodes[node1].child1 = node2; } else { - index = child2; + m_nodes[node1].child2 = node2; } - } - int32 sibling = index; + m_nodes[node2].child1 = sibling; + m_nodes[node2].child2 = leaf; + m_nodes[sibling].parent = node2; + m_nodes[leaf].parent = node2; - // Create a new parent. - int32 oldParent = m_nodes[sibling].parent; - int32 newParent = AllocateNode(); - m_nodes[newParent].parent = oldParent; - m_nodes[newParent].userData = NULL; - m_nodes[newParent].aabb.Combine(leafAABB, m_nodes[sibling].aabb); - m_nodes[newParent].height = m_nodes[sibling].height + 1; - - if (oldParent != b2_nullNode) - { - // The sibling was not the root. - if (m_nodes[oldParent].child1 == sibling) - { - m_nodes[oldParent].child1 = newParent; - } - else + do { - m_nodes[oldParent].child2 = newParent; - } + if (m_nodes[node1].aabb.Contains(m_nodes[node2].aabb)) + { + break; + } - m_nodes[newParent].child1 = sibling; - m_nodes[newParent].child2 = leaf; - m_nodes[sibling].parent = newParent; - m_nodes[leaf].parent = newParent; + m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); + node2 = node1; + node1 = m_nodes[node1].parent; + } + while(node1 != b2_nullNode); } else { - // The sibling was the root. - m_nodes[newParent].child1 = sibling; - m_nodes[newParent].child2 = leaf; - m_nodes[sibling].parent = newParent; - m_nodes[leaf].parent = newParent; - m_root = newParent; + m_nodes[node2].child1 = sibling; + m_nodes[node2].child2 = leaf; + m_nodes[sibling].parent = node2; + m_nodes[leaf].parent = node2; + m_root = node2; } - - // Walk back up the tree fixing heights and AABBs - index = m_nodes[leaf].parent; - while (index != b2_nullNode) - { - index = Balance(index); - - int32 child1 = m_nodes[index].child1; - int32 child2 = m_nodes[index].child2; - - b2Assert(child1 != b2_nullNode); - b2Assert(child2 != b2_nullNode); - - m_nodes[index].height = 1 + b2Max(m_nodes[child1].height, m_nodes[child2].height); - m_nodes[index].aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb); - - index = m_nodes[index].parent; - } - - //Validate(); } void b2DynamicTree::RemoveLeaf(int32 leaf) @@ -326,250 +271,89 @@ void b2DynamicTree::RemoveLeaf(int32 leaf) return; } - int32 parent = m_nodes[leaf].parent; - int32 grandParent = m_nodes[parent].parent; + int32 node2 = m_nodes[leaf].parent; + int32 node1 = m_nodes[node2].parent; int32 sibling; - if (m_nodes[parent].child1 == leaf) + if (m_nodes[node2].child1 == leaf) { - sibling = m_nodes[parent].child2; + sibling = m_nodes[node2].child2; } else { - sibling = m_nodes[parent].child1; + sibling = m_nodes[node2].child1; } - if (grandParent != b2_nullNode) + if (node1 != b2_nullNode) { - // Destroy parent and connect sibling to grandParent. - if (m_nodes[grandParent].child1 == parent) + // Destroy node2 and connect node1 to sibling. + if (m_nodes[node1].child1 == node2) { - m_nodes[grandParent].child1 = sibling; + m_nodes[node1].child1 = sibling; } else { - m_nodes[grandParent].child2 = sibling; + m_nodes[node1].child2 = sibling; } - m_nodes[sibling].parent = grandParent; - FreeNode(parent); + m_nodes[sibling].parent = node1; + FreeNode(node2); // Adjust ancestor bounds. - int32 index = grandParent; - while (index != b2_nullNode) + while (node1 != b2_nullNode) { - index = Balance(index); + b2AABB oldAABB = m_nodes[node1].aabb; + m_nodes[node1].aabb.Combine(m_nodes[m_nodes[node1].child1].aabb, m_nodes[m_nodes[node1].child2].aabb); - int32 child1 = m_nodes[index].child1; - int32 child2 = m_nodes[index].child2; - - m_nodes[index].aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb); - m_nodes[index].height = 1 + b2Max(m_nodes[child1].height, m_nodes[child2].height); + if (oldAABB.Contains(m_nodes[node1].aabb)) + { + break; + } - index = m_nodes[index].parent; + node1 = m_nodes[node1].parent; } } else { m_root = sibling; m_nodes[sibling].parent = b2_nullNode; - FreeNode(parent); - } - - //Validate(); -} - -// Perform a left or right rotation if node A is imbalanced. -// Returns the new root index. -int32 b2DynamicTree::Balance(int32 iA) -{ - b2Assert(iA != b2_nullNode); - - b2TreeNode* A = m_nodes + iA; - if (A->IsLeaf() || A->height < 2) - { - return iA; - } - - int32 iB = A->child1; - int32 iC = A->child2; - b2Assert(0 <= iB && iB < m_nodeCapacity); - b2Assert(0 <= iC && iC < m_nodeCapacity); - - b2TreeNode* B = m_nodes + iB; - b2TreeNode* C = m_nodes + iC; - - int32 balance = C->height - B->height; - - // Rotate C up - if (balance > 1) - { - int32 iF = C->child1; - int32 iG = C->child2; - b2TreeNode* F = m_nodes + iF; - b2TreeNode* G = m_nodes + iG; - b2Assert(0 <= iF && iF < m_nodeCapacity); - b2Assert(0 <= iG && iG < m_nodeCapacity); - - // Swap A and C - C->child1 = iA; - C->parent = A->parent; - A->parent = iC; - - // A's old parent should point to C - if (C->parent != b2_nullNode) - { - if (m_nodes[C->parent].child1 == iA) - { - m_nodes[C->parent].child1 = iC; - } - else - { - b2Assert(m_nodes[C->parent].child2 == iA); - m_nodes[C->parent].child2 = iC; - } - } - else - { - m_root = iC; - } - - // Rotate - if (F->height > G->height) - { - C->child2 = iF; - A->child2 = iG; - G->parent = iA; - A->aabb.Combine(B->aabb, G->aabb); - C->aabb.Combine(A->aabb, F->aabb); - - A->height = 1 + b2Max(B->height, G->height); - C->height = 1 + b2Max(A->height, F->height); - } - else - { - C->child2 = iG; - A->child2 = iF; - F->parent = iA; - A->aabb.Combine(B->aabb, F->aabb); - C->aabb.Combine(A->aabb, G->aabb); - - A->height = 1 + b2Max(B->height, F->height); - C->height = 1 + b2Max(A->height, G->height); - } - - return iC; + FreeNode(node2); } - - // Rotate B up - if (balance < -1) - { - int32 iD = B->child1; - int32 iE = B->child2; - b2TreeNode* D = m_nodes + iD; - b2TreeNode* E = m_nodes + iE; - b2Assert(0 <= iD && iD < m_nodeCapacity); - b2Assert(0 <= iE && iE < m_nodeCapacity); - - // Swap A and B - B->child1 = iA; - B->parent = A->parent; - A->parent = iB; - - // A's old parent should point to B - if (B->parent != b2_nullNode) - { - if (m_nodes[B->parent].child1 == iA) - { - m_nodes[B->parent].child1 = iB; - } - else - { - b2Assert(m_nodes[B->parent].child2 == iA); - m_nodes[B->parent].child2 = iB; - } - } - else - { - m_root = iB; - } - - // Rotate - if (D->height > E->height) - { - B->child2 = iD; - A->child1 = iE; - E->parent = iA; - A->aabb.Combine(C->aabb, E->aabb); - B->aabb.Combine(A->aabb, D->aabb); - - A->height = 1 + b2Max(C->height, E->height); - B->height = 1 + b2Max(A->height, D->height); - } - else - { - B->child2 = iE; - A->child1 = iD; - D->parent = iA; - A->aabb.Combine(C->aabb, D->aabb); - B->aabb.Combine(A->aabb, E->aabb); - - A->height = 1 + b2Max(C->height, D->height); - B->height = 1 + b2Max(A->height, E->height); - } - - return iB; - } - - return iA; } -int32 b2DynamicTree::GetHeight() const +void b2DynamicTree::Rebalance(int32 iterations) { if (m_root == b2_nullNode) { - return 0; + return; } - return m_nodes[m_root].height; -} - -// -float32 b2DynamicTree::GetAreaRatio() const -{ - if (m_root == b2_nullNode) + for (int32 i = 0; i < iterations; ++i) { - return 0.0f; - } + int32 node = m_root; - const b2TreeNode* root = m_nodes + m_root; - float32 rootArea = root->aabb.GetPerimeter(); - - float32 totalArea = 0.0f; - for (int32 i = 0; i < m_nodeCapacity; ++i) - { - const b2TreeNode* node = m_nodes + i; - if (node->height < 0) + uint32 bit = 0; + while (m_nodes[node].IsLeaf() == false) { - // Free node in pool - continue; + int32* children = &m_nodes[node].child1; + node = children[(m_path >> bit) & 1]; + bit = (bit + 1) & (8* sizeof(uint32) - 1); } + ++m_path; - totalArea += node->aabb.GetPerimeter(); + RemoveLeaf(node); + InsertLeaf(node); } - - return totalArea / rootArea; } // Compute the height of a sub-tree. int32 b2DynamicTree::ComputeHeight(int32 nodeId) const { - b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); - b2TreeNode* node = m_nodes + nodeId; - - if (node->IsLeaf()) + if (nodeId == b2_nullNode) { return 0; } + b2Assert(0 <= nodeId && nodeId < m_nodeCapacity); + b2DynamicTreeNode* node = m_nodes + nodeId; int32 height1 = ComputeHeight(node->child1); int32 height2 = ComputeHeight(node->child2); return 1 + b2Max(height1, height2); @@ -577,359 +361,5 @@ int32 b2DynamicTree::ComputeHeight(int32 nodeId) const int32 b2DynamicTree::ComputeHeight() const { - int32 height = ComputeHeight(m_root); - return height; -} - -void b2DynamicTree::ValidateStructure(int32 index) const -{ - if (index == b2_nullNode) - { - return; - } - - if (index == m_root) - { - b2Assert(m_nodes[index].parent == b2_nullNode); - } - - const b2TreeNode* node = m_nodes + index; - - int32 child1 = node->child1; - int32 child2 = node->child2; - - if (node->IsLeaf()) - { - b2Assert(child1 == b2_nullNode); - b2Assert(child2 == b2_nullNode); - b2Assert(node->height == 0); - return; - } - - b2Assert(0 <= child1 && child1 < m_nodeCapacity); - b2Assert(0 <= child2 && child2 < m_nodeCapacity); - - b2Assert(m_nodes[child1].parent == index); - b2Assert(m_nodes[child2].parent == index); - - ValidateStructure(child1); - ValidateStructure(child2); -} - -void b2DynamicTree::ValidateMetrics(int32 index) const -{ - if (index == b2_nullNode) - { - return; - } - - const b2TreeNode* node = m_nodes + index; - - int32 child1 = node->child1; - int32 child2 = node->child2; - - if (node->IsLeaf()) - { - b2Assert(child1 == b2_nullNode); - b2Assert(child2 == b2_nullNode); - b2Assert(node->height == 0); - return; - } - - b2Assert(0 <= child1 && child1 < m_nodeCapacity); - b2Assert(0 <= child2 && child2 < m_nodeCapacity); - - int32 height1 = m_nodes[child1].height; - int32 height2 = m_nodes[child2].height; - int32 height = 1 + b2Max(height1, height2); - b2Assert(node->height == height); - - b2AABB aabb; - aabb.Combine(m_nodes[child1].aabb, m_nodes[child2].aabb); - - b2Assert(aabb.lowerBound == node->aabb.lowerBound); - b2Assert(aabb.upperBound == node->aabb.upperBound); - - ValidateMetrics(child1); - ValidateMetrics(child2); -} - -void b2DynamicTree::Validate() const -{ - ValidateStructure(m_root); - ValidateMetrics(m_root); - - int32 freeCount = 0; - int32 freeIndex = m_freeList; - while (freeIndex != b2_nullNode) - { - b2Assert(0 <= freeIndex && freeIndex < m_nodeCapacity); - freeIndex = m_nodes[freeIndex].next; - ++freeCount; - } - - b2Assert(GetHeight() == ComputeHeight()); - - b2Assert(m_nodeCount + freeCount == m_nodeCapacity); -} - -int32 b2DynamicTree::GetMaxBalance() const -{ - int32 maxBalance = 0; - for (int32 i = 0; i < m_nodeCapacity; ++i) - { - const b2TreeNode* node = m_nodes + i; - if (node->height <= 1) - { - continue; - } - - b2Assert(node->IsLeaf() == false); - - int32 child1 = node->child1; - int32 child2 = node->child2; - int32 balance = b2Abs(m_nodes[child2].height - m_nodes[child1].height); - maxBalance = b2Max(maxBalance, balance); - } - - return maxBalance; -} - -void b2DynamicTree::RebuildBottomUp() -{ - int32* nodes = (int32*)b2Alloc(m_nodeCount * sizeof(int32)); - int32 count = 0; - - // Build array of leaves. Free the rest. - for (int32 i = 0; i < m_nodeCapacity; ++i) - { - if (m_nodes[i].height < 0) - { - // free node in pool - continue; - } - - if (m_nodes[i].IsLeaf()) - { - m_nodes[i].parent = b2_nullNode; - nodes[count] = i; - ++count; - } - else - { - FreeNode(i); - } - } - - while (count > 1) - { - float32 minCost = b2_maxFloat; - int32 iMin = -1, jMin = -1; - for (int32 i = 0; i < count; ++i) - { - b2AABB aabbi = m_nodes[nodes[i]].aabb; - - for (int32 j = i + 1; j < count; ++j) - { - b2AABB aabbj = m_nodes[nodes[j]].aabb; - b2AABB b; - b.Combine(aabbi, aabbj); - float32 cost = b.GetPerimeter(); - if (cost < minCost) - { - iMin = i; - jMin = j; - minCost = cost; - } - } - } - - int32 index1 = nodes[iMin]; - int32 index2 = nodes[jMin]; - b2TreeNode* child1 = m_nodes + index1; - b2TreeNode* child2 = m_nodes + index2; - - int32 parentIndex = AllocateNode(); - b2TreeNode* parent = m_nodes + parentIndex; - parent->child1 = index1; - parent->child2 = index2; - parent->height = 1 + b2Max(child1->height, child2->height); - parent->aabb.Combine(child1->aabb, child2->aabb); - parent->parent = b2_nullNode; - - child1->parent = parentIndex; - child2->parent = parentIndex; - - nodes[jMin] = nodes[count-1]; - nodes[iMin] = parentIndex; - --count; - } - - m_root = nodes[0]; - b2Free(nodes); - - Validate(); -} - -#elif B2_USE_BRUTE_FORCE - -b2DynamicTree::b2DynamicTree() -{ - m_proxyCapacity = 128; - m_proxyCount = 0; - - m_proxyMap = (int32*)b2Alloc(m_proxyCapacity * sizeof(int32)); - m_proxies = (b2Proxy*)b2Alloc(m_proxyCapacity * sizeof(b2Proxy)); - - // Build the free list - m_freeId = 0; - int32 last = m_proxyCapacity - 1; - for (int32 i = m_freeId; i < last; ++i) - { - m_proxyMap[i] = i + 1; - } - - m_proxyMap[last] = b2_nullNode; -} - -b2DynamicTree::~b2DynamicTree() -{ - b2Free(m_proxyMap); - b2Free(m_proxies); -} - -int32 b2DynamicTree::CreateProxy(const b2AABB& aabb, void* userData) -{ - if (m_proxyCount == m_proxyCapacity) - { - m_proxyCapacity *= 2; - int32* proxyMap = (int32*)b2Alloc(m_proxyCapacity * sizeof(int32)); - b2Proxy* proxies = (b2Proxy*)b2Alloc(m_proxyCapacity * sizeof(b2Proxy)); - - memcpy(proxyMap, m_proxyMap, m_proxyCount * sizeof(int32)); - memcpy(proxies, m_proxies, m_proxyCount * sizeof(b2Proxy)); - - b2Free(m_proxyMap); - b2Free(m_proxies); - m_proxyMap = proxyMap; - m_proxies = proxies; - proxyMap = NULL; - proxies = NULL; - - m_freeId = m_proxyCount; - int32 last = m_proxyCapacity - 1; - for (int32 i = m_freeId; i < last; ++i) - { - m_proxyMap[i] = i + 1; - } - - m_proxyMap[last] = b2_nullNode; - } - - b2Assert(0 <= m_freeId && m_freeId < m_proxyCapacity); - int32 id = m_freeId; - m_freeId = m_proxyMap[id]; - int32 index = m_proxyCount; - - m_proxies[index].aabb = aabb; - m_proxies[index].userData = userData; - m_proxies[index].id = id; - m_proxyMap[id] = index; - ++m_proxyCount; - - return id; -} - -void b2DynamicTree::DestroyProxy(int32 proxyId) -{ - b2Assert(0 < m_proxyCount && 0 <= proxyId && proxyId < m_proxyCapacity); - int32 index = m_proxyMap[proxyId]; - - // Add to free list - m_proxyMap[proxyId] = m_freeId; - m_freeId = proxyId; - - // Keep proxy array contiguous - if (index < m_proxyCount - 1) - { - m_proxies[index] = m_proxies[m_proxyCount-1]; - int32 id = m_proxies[index].id; - m_proxyMap[id] = index; - } - - --m_proxyCount; - - Validate(); + return ComputeHeight(m_root); } - -bool b2DynamicTree::MoveProxy(int32 proxyId, const b2AABB& aabb, const b2Vec2& displacement) -{ - b2Assert(0 < m_proxyCount && 0 <= proxyId && proxyId < m_proxyCapacity); - B2_NOT_USED(displacement); - - int32 index = m_proxyMap[proxyId]; - - if (m_proxies[index].aabb.Contains(aabb)) - { - return false; - } - - // Extend AABB. - b2AABB b = aabb; - b2Vec2 r(b2_aabbExtension, b2_aabbExtension); - b.lowerBound = b.lowerBound - r; - b.upperBound = b.upperBound + r; - - // Predict AABB displacement. - b2Vec2 d = b2_aabbMultiplier * displacement; - - if (d.x < 0.0f) - { - b.lowerBound.x += d.x; - } - else - { - b.upperBound.x += d.x; - } - - if (d.y < 0.0f) - { - b.lowerBound.y += d.y; - } - else - { - b.upperBound.y += d.y; - } - - m_proxies[index].aabb = b; - - return true; -} - -void b2DynamicTree::Validate() const -{ - b2Assert(m_proxyCount > 0 || m_freeId == b2_nullNode); - b2Assert(m_freeId == b2_nullNode || m_freeId < m_proxyCapacity); - - int32 id = m_freeId; - int32 freeCount = 0; - while (id != b2_nullNode) - { - ++freeCount; - b2Assert(freeCount <= m_proxyCapacity); - id = m_proxyMap[id]; - } - - b2Assert(freeCount + m_proxyCount == m_proxyCapacity); - - b2Assert(m_proxyCount <= m_proxyCapacity); - - for (int32 i = 0; i < m_proxyCount; ++i) - { - int32 id = m_proxies[i].id; - - b2Assert(m_proxyMap[id] == i); - } -} - -#endif diff --git a/libs/box2d/src/Box2D/Collision/b2DynamicTree.h b/libs/box2d/src/Box2D/Collision/b2DynamicTree.h index 8afaa6d..b67686b 100644 --- a/libs/box2d/src/Box2D/Collision/b2DynamicTree.h +++ b/libs/box2d/src/Box2D/Collision/b2DynamicTree.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009 Erin Catto http://www.box2d.org +* Copyright (c) 2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -20,26 +20,23 @@ #define B2_DYNAMIC_TREE_H #include -#include -#define b2_nullNode (-1) - -#define B2_USE_DYNAMIC_TREE 1 -#define B2_USE_BRUTE_FORCE 0 +/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. -#if B2_USE_DYNAMIC_TREE +#define b2_nullNode (-1) /// A node in the dynamic tree. The client does not interact with this directly. -struct b2TreeNode +struct b2DynamicTreeNode { bool IsLeaf() const { return child1 == b2_nullNode; } - /// Enlarged AABB + /// This is the fattened AABB. b2AABB aabb; + //int32 userData; void* userData; union @@ -50,12 +47,8 @@ struct b2TreeNode int32 child1; int32 child2; - - // leaf = 0, free node = -1 - int32 height; }; -/// A dynamic AABB tree broad-phase, inspired by Nathanael Presson's btDbvt. /// A dynamic tree arranges data in a binary tree to accelerate /// queries such as volume queries and ray casts. Leafs are proxies /// with an AABB. In the tree we expand the proxy AABB by b2_fatAABBFactor @@ -66,6 +59,7 @@ struct b2TreeNode class b2DynamicTree { public: + /// Constructing the tree initializes the node pool. b2DynamicTree(); @@ -84,6 +78,9 @@ public: /// @return true if the proxy was re-inserted. bool MoveProxy(int32 proxyId, const b2AABB& aabb1, const b2Vec2& displacement); + /// Perform some iterations to re-balance the tree. + void Rebalance(int32 iterations); + /// Get proxy user data. /// @return the proxy user data or 0 if the id is invalid. void* GetUserData(int32 proxyId) const; @@ -91,6 +88,9 @@ public: /// Get the fat AABB for a proxy. const b2AABB& GetFatAABB(int32 proxyId) const; + /// Compute the height of the tree. + int32 ComputeHeight() const; + /// Query an AABB for overlapping proxies. The callback class /// is called for each proxy that overlaps the supplied AABB. template @@ -106,23 +106,6 @@ public: template void RayCast(T* callback, const b2RayCastInput& input) const; - /// Validate this tree. For testing. - void Validate() const; - - /// Compute the height of the binary tree in O(N) time. Should not be - /// called often. - int32 GetHeight() const; - - /// Get the maximum balance of an node in the tree. The balance is the difference - /// in height of the two children of a node. - int32 GetMaxBalance() const; - - /// Get the ratio of the sum of the node areas to the root area. - float32 GetAreaRatio() const; - - /// Build an optimal tree. Very expensive. For testing. - void RebuildBottomUp(); - private: int32 AllocateNode(); @@ -131,23 +114,17 @@ private: void InsertLeaf(int32 node); void RemoveLeaf(int32 node); - int32 Balance(int32 index); - - int32 ComputeHeight() const; int32 ComputeHeight(int32 nodeId) const; - void ValidateStructure(int32 index) const; - void ValidateMetrics(int32 index) const; - int32 m_root; - b2TreeNode* m_nodes; + b2DynamicTreeNode* m_nodes; int32 m_nodeCount; int32 m_nodeCapacity; int32 m_freeList; - /// This is used to incrementally traverse the tree for re-balancing. + /// This is used incrementally traverse the tree for re-balancing. uint32 m_path; int32 m_insertionCount; @@ -168,18 +145,21 @@ inline const b2AABB& b2DynamicTree::GetFatAABB(int32 proxyId) const template inline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const { - b2GrowableStack stack; - stack.Push(m_root); + const int32 k_stackSize = 128; + int32 stack[k_stackSize]; + + int32 count = 0; + stack[count++] = m_root; - while (stack.GetCount() > 0) + while (count > 0) { - int32 nodeId = stack.Pop(); + int32 nodeId = stack[--count]; if (nodeId == b2_nullNode) { continue; } - const b2TreeNode* node = m_nodes + nodeId; + const b2DynamicTreeNode* node = m_nodes + nodeId; if (b2TestOverlap(node->aabb, aabb)) { @@ -193,8 +173,15 @@ inline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const } else { - stack.Push(node->child1); - stack.Push(node->child2); + if (count < k_stackSize) + { + stack[count++] = node->child1; + } + + if (count < k_stackSize) + { + stack[count++] = node->child2; + } } } } @@ -226,18 +213,21 @@ inline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) con segmentAABB.upperBound = b2Max(p1, t); } - b2GrowableStack stack; - stack.Push(m_root); + const int32 k_stackSize = 128; + int32 stack[k_stackSize]; - while (stack.GetCount() > 0) + int32 count = 0; + stack[count++] = m_root; + + while (count > 0) { - int32 nodeId = stack.Pop(); + int32 nodeId = stack[--count]; if (nodeId == b2_nullNode) { continue; } - const b2TreeNode* node = m_nodes + nodeId; + const b2DynamicTreeNode* node = m_nodes + nodeId; if (b2TestOverlap(node->aabb, segmentAABB) == false) { @@ -280,196 +270,17 @@ inline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) con } else { - stack.Push(node->child1); - stack.Push(node->child2); - } - } -} - -#elif B2_USE_BRUTE_FORCE 0 - -struct b2Proxy -{ - /// This is the fattened AABB. - b2AABB aabb; - void* userData; - int32 id; -}; - -/// This implementation is not a tree at all. It is just a cache friendly array of AABBs. -class b2DynamicTree -{ -public: - - /// Constructing the tree initializes the node pool. - b2DynamicTree(); - - /// Destroy the tree, freeing the node pool. - ~b2DynamicTree(); - - /// Create a proxy. Provide a tight fitting AABB and a userData pointer. - int32 CreateProxy(const b2AABB& aabb, void* userData); - - /// Destroy a proxy. This asserts if the id is invalid. - void DestroyProxy(int32 proxyId); - - /// Move a proxy with a swepted AABB. If the proxy has moved outside of its fattened AABB, - /// then the proxy is removed from the tree and re-inserted. Otherwise - /// the function returns immediately. - /// @return true if the proxy was re-inserted. - bool MoveProxy(int32 proxyId, const b2AABB& aabb1, const b2Vec2& displacement); - - /// Perform some iterations to re-balance the tree. - void Rebalance(int32 iterations) - { - B2_NOT_USED(iterations); - } - - /// Get proxy user data. - /// @return the proxy user data or 0 if the id is invalid. - void* GetUserData(int32 proxyId) const; - - /// Get the fat AABB for a proxy. - const b2AABB& GetFatAABB(int32 proxyId) const; - - /// Compute the height of the binary tree in O(N) time. Should not be - /// called often. - int32 ComputeHeight() const - { - return 0; - } - - /// Query an AABB for overlapping proxies. The callback class - /// is called for each proxy that overlaps the supplied AABB. - template - void Query(T* callback, const b2AABB& aabb) const; - - /// Ray-cast against the proxies in the tree. This relies on the callback - /// to perform a exact ray-cast in the case were the proxy contains a shape. - /// The callback also performs the any collision filtering. This has performance - /// roughly equal to k * log(n), where k is the number of collisions and n is the - /// number of proxies in the tree. - /// @param input the ray-cast input data. The ray extends from p1 to p1 + maxFraction * (p2 - p1). - /// @param callback a callback class that is called for each proxy that is hit by the ray. - template - void RayCast(T* callback, const b2RayCastInput& input) const; - - void Validate() const; - -private: - - // Map of ids to proxies indices. This may have holes (which contain a free list). - int32* m_proxyMap; - - // Contiguous array of proxies - b2Proxy* m_proxies; - - int32 m_proxyCount; - int32 m_proxyCapacity; - - int32 m_freeId; -}; - -inline void* b2DynamicTree::GetUserData(int32 proxyId) const -{ - b2Assert(0 <= proxyId && proxyId < m_proxyCapacity); - int32 index = m_proxyMap[proxyId]; - return m_proxies[index].userData; -} - -inline const b2AABB& b2DynamicTree::GetFatAABB(int32 proxyId) const -{ - b2Assert(0 <= proxyId && proxyId < m_proxyCapacity); - int32 index = m_proxyMap[proxyId]; - return m_proxies[index].aabb; -} - -template -inline void b2DynamicTree::Query(T* callback, const b2AABB& aabb) const -{ - for (int32 i = 0; i < m_proxyCount; ++i) - { - if (b2TestOverlap(m_proxies[i].aabb, aabb)) - { - bool proceed = callback->QueryCallback(m_proxies[i].id); - if (proceed == false) + if (count < k_stackSize) { - return; + stack[count++] = node->child1; } - } - } -} - -template -inline void b2DynamicTree::RayCast(T* callback, const b2RayCastInput& input) const -{ - b2Vec2 p1 = input.p1; - b2Vec2 p2 = input.p2; - b2Vec2 r = p2 - p1; - b2Assert(r.LengthSquared() > 0.0f); - r.Normalize(); - // v is perpendicular to the segment. - b2Vec2 v = b2Cross(1.0f, r); - b2Vec2 abs_v = b2Abs(v); - - // Separating axis for segment (Gino, p80). - // |dot(v, p1 - c)| > dot(|v|, h) - - float32 maxFraction = input.maxFraction; - - // Build a bounding box for the segment. - b2AABB segmentAABB; - { - b2Vec2 t = p1 + maxFraction * (p2 - p1); - segmentAABB.lowerBound = b2Min(p1, t); - segmentAABB.upperBound = b2Max(p1, t); - } - - for (int32 i = 0; i < m_proxyCount; ++i) - { - const b2Proxy* proxy = m_proxies + i; - b2AABB proxyAABB = proxy->aabb; - - if (b2TestOverlap(proxyAABB, segmentAABB) == false) - { - continue; - } - - // Separating axis for segment (Gino, p80). - // |dot(v, p1 - c)| > dot(|v|, h) - b2Vec2 c = proxyAABB.GetCenter(); - b2Vec2 h = proxyAABB.GetExtents(); - float32 separation = b2Abs(b2Dot(v, p1 - c)) - b2Dot(abs_v, h); - if (separation > 0.0f) - { - continue; - } - - b2RayCastInput subInput; - subInput.p1 = input.p1; - subInput.p2 = input.p2; - subInput.maxFraction = maxFraction; - - float32 value = callback->RayCastCallback(subInput, proxy->id); - - if (value == 0.0f) - { - // The client has terminated the ray cast. - return; - } - - if (value > 0.0f) - { - // Update segment bounding box. - maxFraction = value; - b2Vec2 t = p1 + maxFraction * (p2 - p1); - segmentAABB.lowerBound = b2Min(p1, t); - segmentAABB.upperBound = b2Max(p1, t); + if (count < k_stackSize) + { + stack[count++] = node->child2; + } } } } #endif - -#endif diff --git a/libs/box2d/src/Box2D/Collision/b2TimeOfImpact.cpp b/libs/box2d/src/Box2D/Collision/b2TimeOfImpact.cpp index 2fef964..b1f2f4e 100644 --- a/libs/box2d/src/Box2D/Collision/b2TimeOfImpact.cpp +++ b/libs/box2d/src/Box2D/Collision/b2TimeOfImpact.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Erin Catto http://www.box2d.org +* Copyright (c) 2007-2009 Erin Catto http://www.gphysics.com * * This software is provided 'as-is', without any express or implied * warranty. In no event will the authors be held liable for any damages @@ -23,11 +23,12 @@ #include #include -using namespace std; int32 b2_toiCalls, b2_toiIters, b2_toiMaxIters; int32 b2_toiRootIters, b2_toiMaxRootIters; +int32 b2_toiMaxOptIters; + struct b2SeparationFunction { enum Type @@ -41,8 +42,7 @@ struct b2SeparationFunction float32 Initialize(const b2SimplexCache* cache, const b2DistanceProxy* proxyA, const b2Sweep& sweepA, - const b2DistanceProxy* proxyB, const b2Sweep& sweepB, - float32 t1) + const b2DistanceProxy* proxyB, const b2Sweep& sweepB) { m_proxyA = proxyA; m_proxyB = proxyB; @@ -53,8 +53,8 @@ struct b2SeparationFunction m_sweepB = sweepB; b2Transform xfA, xfB; - m_sweepA.GetTransform(&xfA, t1); - m_sweepB.GetTransform(&xfB, t1); + m_sweepA.GetTransform(&xfA, 0.0f); + m_sweepB.GetTransform(&xfB, 0.0f); if (count == 1) { @@ -325,7 +325,7 @@ void b2TimeOfImpact(b2TOIOutput* output, const b2TOIInput* input) // Initialize the separating axis. b2SeparationFunction fc