Pārlūkot izejas kodu

- added visual studio 2015 support
- added new tests to demo
- updated android build
- updated box2d to latest version
- refactored readme folder
- updated win32 libs
- added json
- new blend mode
- minor

dmuratshin 10 gadi atpakaļ
vecāks
revīzija
bd20456214
100 mainītis faili ar 2337 papildinājumiem un 2247 dzēšanām
  1. 2 2
      .hg_archival.txt
  2. 1 0
      .hgignore
  3. 20 2
      CMakeLists.txt
  4. 0 36
      doc/Home.md
  5. 0 83
      doc/actors.md
  6. 0 111
      doc/atlasses.md
  7. 0 5
      doc/colors.md
  8. 0 12
      doc/custom_shaders.md
  9. 0 80
      doc/debug.md
  10. BIN
      doc/doc.zip
  11. 0 296
      doc/events.md
  12. 0 141
      doc/filesystem.md
  13. 0 41
      doc/fonts.md
  14. BIN
      doc/img/DebugActor.png
  15. BIN
      doc/img/actor.gif
  16. BIN
      doc/img/actor.png
  17. BIN
      doc/img/bmfont.png
  18. BIN
      doc/img/box.jpg
  19. BIN
      doc/img/box9sprite.jpg
  20. BIN
      doc/img/colors.png
  21. BIN
      doc/img/event_phases.png
  22. BIN
      doc/img/event_stopimprop.jpg
  23. BIN
      doc/img/event_stopprop.jpg
  24. BIN
      doc/img/event_target.jpg
  25. BIN
      doc/img/eventpath.jpg
  26. BIN
      doc/img/eventphases.jpg
  27. BIN
      doc/img/events_begin.png
  28. BIN
      doc/img/font.png
  29. BIN
      doc/img/image_cols.png
  30. BIN
      doc/img/mask.png
  31. BIN
      doc/img/mpexport.png
  32. BIN
      doc/img/oxyresbuild.png
  33. BIN
      doc/img/polygon.png
  34. BIN
      doc/img/progressbar.png
  35. BIN
      doc/img/sprite.png
  36. BIN
      doc/img/text.png
  37. 0 44
      doc/magicparticles.md
  38. 0 0
      doc/new_project.md
  39. 0 145
      doc/resources.md
  40. 0 17
      doc/ru/Home.md
  41. 0 57
      doc/ru/start.md
  42. 0 12
      doc/shaders.md
  43. 0 117
      doc/sounds.md
  44. 0 72
      doc/start.md
  45. BIN
      doc/wiki.zip
  46. BIN
      examples/Demo/data/images/map.png
  47. BIN
      examples/Demo/data/images/mask.png
  48. BIN
      examples/Demo/data/images/n0.png
  49. BIN
      examples/Demo/data/images/n1.png
  50. BIN
      examples/Demo/data/images/n2.png
  51. BIN
      examples/Demo/data/images/n3.png
  52. BIN
      examples/Demo/data/images/n4.png
  53. BIN
      examples/Demo/data/images/n5.png
  54. BIN
      examples/Demo/data/images/n6.png
  55. BIN
      examples/Demo/data/images/n7.png
  56. BIN
      examples/Demo/data/images/n8.png
  57. BIN
      examples/Demo/data/images/n9.png
  58. BIN
      examples/Demo/data/images/score_table.png
  59. BIN
      examples/Demo/data/images/sky.png
  60. BIN
      examples/Demo/data/images/tiled2.png
  61. 12 0
      examples/Demo/data/xmls/res.xml
  62. 2 2
      examples/Demo/proj.android/AndroidManifest.xml
  63. 0 11
      examples/Demo/proj.android/default.properties
  64. 1 1
      examples/Demo/proj.android/jni/src/Android.mk
  65. 1 1
      examples/Demo/proj.android/project.properties
  66. 1 1
      examples/Demo/proj.cmake/CMakeLists.txt
  67. 1 1
      examples/Demo/proj.emscripten/CMakeLists.txt
  68. 88 78
      examples/Demo/proj.ios/demo_ios.xcodeproj/project.pbxproj
  69. 88 78
      examples/Demo/proj.macosx/demo_macosx.xcodeproj/project.pbxproj
  70. 2 2
      examples/Demo/proj.win32/Demo.sln
  71. 57 8
      examples/Demo/proj.win32/Demo.vcxproj
  72. 108 0
      examples/Demo/proj.win32/Demo.vcxproj.filters
  73. 0 13
      examples/Demo/proj.win32/Demo_vs2010.vcxproj.user
  74. 0 49
      examples/Demo/proj.win32/Demo_vs2013.sln
  75. 0 101
      examples/Demo/proj.win32/Demo_vs2013.vcxproj
  76. 0 13
      examples/Demo/proj.win32/Demo_vs2013.vcxproj.user
  77. 192 0
      examples/Demo/src/Counter.cpp
  78. 33 0
      examples/Demo/src/Counter.h
  79. 28 0
      examples/Demo/src/TestCounter.h
  80. 1 1
      examples/Demo/src/TestPolygon.h
  81. 69 0
      examples/Demo/src/TestTweenShine.h
  82. 55 0
      examples/Demo/src/TestTweenText.h
  83. 27 0
      examples/Demo/src/example.cpp
  84. 10 5
      examples/Demo/src/test.cpp
  85. 6 1
      examples/Demo/src/test.h
  86. 193 0
      examples/DemoBox2D/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp
  87. 105 0
      examples/DemoBox2D/box2d/Box2D/Collision/Shapes/b2ChainShape.h
  88. 53 0
      examples/DemoBox2D/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp
  89. 39 0
      examples/DemoBox2D/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h
  90. 53 0
      examples/DemoBox2D/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp
  91. 39 0
      examples/DemoBox2D/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h
  92. 304 0
      examples/DemoBox2D/box2d/Box2D/Dynamics/Joints/b2MotorJoint.cpp
  93. 133 0
      examples/DemoBox2D/box2d/Box2D/Dynamics/Joints/b2MotorJoint.h
  94. 1 2
      examples/DemoBox2D/proj.android/AndroidManifest.xml
  95. 1 1
      examples/DemoBox2D/proj.android/build.sh
  96. 0 11
      examples/DemoBox2D/proj.android/default.properties
  97. 2 2
      examples/DemoBox2D/proj.android/install.sh
  98. 1 1
      examples/DemoBox2D/proj.android/project.properties
  99. 307 296
      examples/DemoBox2D/proj.ios/DemoBox2D_ios.xcodeproj/project.pbxproj
  100. 301 295
      examples/DemoBox2D/proj.macosx/DemoBox2D_macosx.xcodeproj/project.pbxproj

+ 2 - 2
.hg_archival.txt

@@ -1,5 +1,5 @@
 repo: b6d71054df5712e643a0685bc3ba54b123db5729
-node: 7803a77d7aa1415d0c93a0192e6e9b6c1d751827
+node: 0d85c996b3c5f0b6963440e987684547be6bf6c1
 branch: default
 latesttag: oldrender
-latesttagdistance: 842
+latesttagdistance: 892

+ 1 - 0
.hgignore

@@ -54,3 +54,4 @@ oxygine/SDL/android/extension/gen/
 oxygine/SDL/android/extension/bin/
 *.exp
 *.pdb
+*/Debug_v*

+ 20 - 2
CMakeLists.txt

@@ -146,9 +146,19 @@ endif(WIN32)
 
 #add png library
 if (OX_HAVE_LIBPNG)
+
+	set(LIBPNG ${libprefix}png)
+
+	if (MSVC)
+		if (MSVC_VERSION EQUAL "1900")
+			set(LIBPNG ${LIBPNG}-2015)
+		endif()
+	endif()	
+
 	set(CORE_LIBS
 		${CORE_LIBS}
-		${libprefix}png)
+		${LIBPNG})
+
 	set(OX_DEFINITIONS	${OX_DEFINITIONS}
 		-DOX_HAVE_LIBPNG)
 endif(OX_HAVE_LIBPNG)
@@ -171,11 +181,19 @@ message(STATUS ${CORE_LIBS})
 
 #add jpeg library
 if (OX_HAVE_LIBJPEG)
+	set(LIBJPEG ${libprefix}jpeg)
+
+	if (MSVC)
+		if (MSVC_VERSION EQUAL "1900")
+			set(LIBJPEG ${LIBJPEG}-2015)
+		endif()	
+	endif()	
+
 	set(OX_DEFINITIONS	${OX_DEFINITIONS}
 		-DOX_HAVE_LIBJPEG)
 	set(CORE_LIBS
 		${CORE_LIBS}
-		${libprefix}jpeg)
+		${LIBJPEG})
 endif(OX_HAVE_LIBJPEG)
 
 

+ 0 - 36
doc/Home.md

@@ -1,36 +0,0 @@
-#Oxygine Wiki
-Work in progress...
-
-##Documentation
-1. [How To Start](start)
-2. [Actors and SceneGraph](actors)
-3. [Animations (Tweening)](tweens)
-4. [Event Handling](events)
-5. [Working with files](filesystem)
-6. [Debugging, Profiling and Logging](debug) 
-7. [Fonts](fonts)
-8. [Shaders](shaders)
-9. [Resources](resources2)
-10. [Colors Table](colors)
-11. [Atlasses and HD Assets](atlasses)
-12. [Http Requests](http)
-13. [Keyboard](keyboard)
-14. [Tips and Tricks](https://docs.google.com/document/d/1QbiPQpJvCfSkVkIESXSMg9EvqTB9wfJlx3VSpux1gFo/edit?usp=sharing)
-
-
-
-[Videos](videos)
-
-##Extensions:
-1. [oxygine-sound library](sounds)
-2. [oxygine-magicparticles library](magicparticles)
-3. [oxygine-freetype library](freetype)
-4. [oxygine-billing library](billing)
-5. [oxygine-dragobones library](dragonbones)
-6. [oxygine-spine library](oxygine-spine)
-
-
-##Advanced usage
-1. [GLES via Direct3D](gl_via_d3d)
-
-###[Документация на русском языке](Home_ru)

+ 0 - 83
doc/actors.md

@@ -1,83 +0,0 @@
-#Scene Graph
-Low level 2D frameworks provides you basic rendering functionality. Where you should draw images each frame by hands.
- 
-Oxygine isn't low level 2D framework and in addition to this it provides own scene graph.
-
-##Example
-You could create Sprite, set position and image, attach it to scene and "forget". Sprite would be displayed and updated each frame automatically. You could say to this sprite "rotate on 360 degrees for 2 seconds 5 times and then remove self".
-
-	spSrite sprite = new Sprite;
-	sprite->attachTo(getStage()); 
-	sprite->addTween(Sprite::TweenRotation(2*PI), 2000, 5)->setDetachActor(true);
-
-> it is pseudocode, you also should set to sprite "image" resource or it would be empty and invisible  
-> getStage() returns root node of the scene graph
-
-You could create second *"child"* sprite attached to already created and they would be rotating both:
-
-	spSprite child = new Sprite;
-	child->attachTo(sprite);
- 
-![Actor inheritance](img/actor.png)
- 
- 
-
-#Actor
-[Actor](http://oxygine.org/doc/api/classoxygine_1_1_actor.html) is base class in scene graph. 
-It can be moved, rotated, scaled, animated. Actors can have other actors as children. When a parent is transformed, all its children are transformed as well.
-
-Actor has properties:
-
-- transformation (position, scale, rotation)
-- anchor point
-- size
-- name
-- transparency
-- list of children
-- list of added tweens 
-- etc. 
-
-
-
-##Sprite
-
-You would widely use [Sprites](http://oxygine.org/doc/api/classoxygine_1_1_sprite.html) in your app.
-Sprite is subclass of Actor. It is using for displaying images and animations.
-
-
-![](img/sprite.png)
-
-##Polygon
-[Polygon](http://oxygine.org/doc/api/classoxygine_1_1_polygon.html) is subclass of Sprite. It is used for rendering custom vertices array.  
-
-![](img/polygon.png)
-
-##TextField
-[TextField](http://oxygine.org/doc/api/classoxygine_1_1_text_field.html) is subclass of Actor. It is used for displaying text.
-
-![](img/text.png)
-
-##Progress Bar
-[ProgressBar](http://oxygine.org/doc/api/classoxygine_1_1_progress_bar.html) is subclass of Sprite. It is used for displaying progress.
-
-![](img/progressbar.png)
-
-##ColorRectSprite
-[ColorRectSprite](http://oxygine.org/doc/api/classoxygine_1_1_color_rect_sprite.html) is subclass of Sprite. It is rectangle filled with one color.
-
-![](img/colorrect.png)
-
-##ClipRectActor
-[ClipRectActor](http://oxygine.org/doc/api/classoxygine_1_1_clip_rect_actor.html) is sublcass of Actor. It is used to clip area with children outside of actor's bound.
-
-##Box9Sprite
-
-[Box9Sprite](http://oxygine.org/doc/api/classoxygine_1_1_box9_sprite.html) is sublcass of Sprite. It is used to scale the image in such a way that the 4 corners remain unscaled, but the four edges are scaled(or tiled) in one axis and the middle is scaled(or tiled) in both axis. So the graphical representation of this scenario will be something like this:
-
-![](img/box9sprite.jpg)
-
-
-##MaskedSprite
-[MaskedSprite](http://oxygine.org/doc/api/classoxygine_1_1_masked_sprite.html) is subclass of Sprite. It is using other sprite for masking own children.
-
-![](img/mask.png)

+ 0 - 111
doc/atlasses.md

@@ -1,111 +0,0 @@
-#Atlasses
-
-If you wish to use a third-party tool for packing images into atlasses, for example TexturePacker, then you may use the Oxygine-supported Starling/Sparrow format. See [Resources article](resources) #Starling
-
-However, if you wish to experience everything Oxygine has to offer, then you should use the utility oxyresbuild. Look below for details.
-
-##Building Atlasses with Oxygine
-All decals in the xml resource files in the <atlas> group automatically turn into atlases upon loading the xml files.
-	
-	<atlas>
-	    <image file="close.png" />
-	    <image file="button.png" />     
-	    <image file="anim/run.png" />
-	</atlas>
-
-It is possible to decrease the loading times and memory usage of a game if you prebuild the atlases with special tool.
-> as it essentially creates a single image with another marking file instead of many individual images. This results in quicker loading times and saves memory.
-
-For this, Oxygine posesses a special utility command called **"oxyresbuild"**, which located in the tools folder:
-
-	oxygine-framework/tools/oxyresbuild.py
-
-![](img/oxyresbuild.png)
-
-To use this tool, you will need to install Python. Read how to do so below:
-		
-[oxygine-framework/tools/readme.txt](https://bitbucket.org/oxygine/oxygine-framework/src/tip/tools/readme.txt?at=tip)
-
-In examples/Game/Part5 there are examples on how to use it. Look at the shell scripts for more details. For example, examples/Game/part5/gen-atlasses.bat:
-
-	python ../../../tools/oxyresbuild.py -x xmls/ui.xml --src_data data --dest_data data
-
-its result is located in the following folder:
-
-	oxygine-framework/examples/Game/part5/data/ui.xml.ox/
-
-Also, in Game/Part5 the folder with the source images is outside of the data folder, as it is not needed in the final compiled version of the application.
-
-##HD Assets
-
-Source artwork is usually saved in high resolution to support HD displays.
- 
-For example, an artist used 2048x1536 resolution as a basis for source images, but the game is displayed at 1024x768.
-The artist made a background which needs to be displayed in the game, so we add it to our resources.xml file:
-
-	<atlas>
-	    <image file="background.png" />
-	</atlas> 
-
-Now, let's create it in code:
-
-	spSprite sprite = new Sprite;
-	sprite->setResAnim(res.getResAnim("background"));
-	sprite->attachTo(getStage());
-
-The sprite will be too large for the display, so we will need to make it smaller:
-
-	float scaleFactor = 1024.0f / 2048.0f; // =0.5f
-	/* or
-	float scaleFactor = getStage()->getWidth() / (float)sprite->getWidth()	
-	*/
-	sprite->setScale(scaleFactor);
-
-Similar *setScale* calls will need to be done on every created sprite that is saved in high resolution. However, we can make our job easier by specifying everything in the xml file with scale_factor:
-
-	<set scale_factor = "0.5f" />
-
- 	<atlas>
-	    <image file="background.png" />
-	</atlas>
-
-This way the code will simplify to the way it was before: 
-	
-	spSprite sprite = new Sprite;
-	sprite->setResAnim(res.getResAnim("background"));
-	sprite->attachTo(getStage());
-
-while the sprite will be displayed in proper resolution (1024x768), and will fully fit on the screen:
-
-	sprite->getWidth () == 1024
-	sprite->getHeight() == 768 
-
-The source image, however, will still be stored at 2048x1536 and will therefore take up more memory. To avoid this, we generate an atlas for xml with the help of *oxyresbuild* with the argument **-r**:
-
-	python path/to/oxyresbuild/oxyresbuild.py -x resources.xml --src_data data --dest_data data -r
-
-**-r** is short for **--resize**, which means that before the creation of an atlas the image needs to be resized according to scale_factor. This way atlas receives an image which is 2 times smaller.
-
-We can also lower the size of the image in atlas by adding the argument **-s**:
-
-	python path/to/oxyresbuild/oxyresbuild.py -x resources.xml --src_data data --dest_data data -r -s 0.625
-
-**-s** is short for **--scale**. When it is 0.625, the image needs to the rescaled by a factor of 0.625 before being loaded in. This way the atlast receives the image of the following scales:
-
-	w = 2048 * 0.5 * 0.625 = 640
-	h = 1536 * 0.5 * 0.625 = 480
-
-However, the size of the Sprite will remain the same:
-
-	sprite->getWidth () == 1024
-	sprite->getHeight() == 768 
-
-We can also increase the size of an image in atlas by setting the argument **-s** > 1:
-	
-	python path/to/oxyresbuild/oxyresbuild.py -x resources.xml --src_data data --dest_data data -r -s 1.25 
-
-This way atlas receives the images of the following sizes:
-
-	w = 2048 * 0.5 * 1.25 = 1280
-	h = 1536 * 0.5 * 1.25 = 960
-

+ 0 - 5
doc/colors.md

@@ -1,5 +0,0 @@
-#Colors table
-
-Colors are available in the class **Color**.
-
-![](img/colors.png)

+ 0 - 12
doc/custom_shaders.md

@@ -1,12 +0,0 @@
-#Shaders
-Oxygine shading is based on "Uber Shaders" system.
-
-Shader source is located here:
-*oxygine/system_data/original/system/shader.glsl*
-
-It is already embedded into Oxygine source code and can't be modified directly.
-If you want to change it then copy shader to Application data folder (working directory).
-
-##Example
-
-*examples/Demo/src/TestUserShader.h* has example how custom shaders could be created and added to the rendering pipeline.

+ 0 - 80
doc/debug.md

@@ -1,80 +0,0 @@
-##DebugActor 
-DebugActor displays some useful stats. Some of them available only in Debug mode:
-
-- **fps** - frames per second
-- **objects** - number of created instances of Object. Debug only, to enable it in release define OXYGINE_DEBUG_TRACE_LEAKS
-- **batches** - number of batches per frame (draw calls). Debug only, to enable it in release define OXYGINE_TRACE_VIDEO_STATS
-- **triangles** - number of triangles per frame
-- **update** - RootActor::update time in milliseconds. It includes all children updates
-- **render** - RootActor::render time in milliseconds. It includes all children rendering
-- **textures** - number of total created textures
-- **listeners** - number of event listeners attached to RootActor
-
-![](img/DebugActor.png)
-
-###Custom text
-To display custom text on DebugActor (image above) call it each frame:
-
-    DebugActor::instance->addDebugString("Custom text");
-
-###Tools
-**DebugActor** has 4 buttons from left to right:
-
-1. **Textures inspector** shows all created and not deleted textures. Debug only, to enable it in release define OXYGINE_DEBUG_TRACE_LEAKS
-2. **T2P** - Texel2Pixel. It shows "blurred" sprites displayed without texel to pixel precision on display
-3. **Finger** - Animates clicked actors under mouse cursor. Could be useful to find out who blocked mouse events
-4. **Tree Inspector** show graph tree of actors with detailed info.
-
-#Logging
-**namespace log** has functions to print text to output. Include **log.h**  by entering #include "core/log.h". 
-> If using Visual Studio 2013, make sure to open the Output window (View > Output) and set it to show output from Debug after compilation to view the messages.
-
-
-    log::messageln("it is message");
-    > it is message
-
-    log::messageln("printf formatting %s-%d", "abc", 123);
-    > printf formatting abc-123
-    
-    log::warning("it is warning");
-    > warning: it is warning
-    
-    log::error("it is error");
-    > error: it is error
-
-
-
-#Tracing Object leaks
-Helps you to find leaked Objects.
- 
-> It is Debug only feature, to enable it in release mode define: OXYGINE_DEBUG_TRACE_LEAKS
-
-Guards to trace leaks:
-
-	ObjectBase::__startTracingLeaks();
-    new Actor;//leak
-	new Sprite;//leak
-	ObjectBase::__stopTracingLeaks();
-
-If you want to display all created and not deleted Objects call:
-
-	ObjectBase::dumpCreatedObjects();
-
-result: 
-
-	allocated objects:
-	id = 3, name = '', typeid = 'class oxygine::Actor', refs = 0
-	id = 4, name = '', typeid = 'class oxygine::Sprite', refs = 0
-	total: 2 -----------------------------
-
-There are some useful functions:
-
-		/**Shows assert when object with this unique ID will be created.*/ 
-		ObjectBase::showAssertInCtor(int id);
-		/**Shows assert when object with this unique ID will be destroyed.*/
-		ObjectBase::showAssertInDtor(int id);
-
-**"id"** is numeric identifier which could be retrieved from "allocated objects" list 
-
-
-> Each example has leak guards (entry_point.cpp)

BIN
doc/doc.zip


+ 0 - 296
doc/events.md

@@ -1,296 +0,0 @@
-#Events
-Oxygine has events model taken from Adobe Flash (as3).
-This article is based on as3 article about events: [http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html](http://www.adobe.com/devnet/actionscript/articles/event_handling_as3.html)
-
- 
-
-##EventDispatcher class
-
-Event handling in Oxygine depends heavily on the EventDispatcher class. 
-
-For those not familiar with EventDispatcher, the basic concept is this: 
-First you define functions (methods), or event handlers, to react to various events. Then you associate those functions with the events by using the addEventListener() method, which is called from the object that will receive the event. 
-
-The code using EventDispatcher looks like this:
-
-	void clickHandler(Event*) {}
-	submitButton.addEventListener(TouchEvent::CLICK, CLOSURE(this, &SomeClass::clickHandler));
-
-
-Using EventDispatcher, you use removeEventListener(). This method removes an event listener that matches the same definition used in addEventListener (up to the third parameter).
-
-	submitButton.removeEventListener(TouchEvent::CLICK, CLOSURE(this, &SomeClass::clickHandler));
-
-
-You also could use C++11 with **std::function** and **lambda**:
-
-	submitButton.addEventListener(TouchEvent::CLICK, [](Event*){
-		log::messageln("button clicked");
-	});
-
-> It is slower than using CLOSURE
-
-
-##Where is EventDispatcher?
-You may have noticed that the code snippets above do not explicitly reference EventDispatcher. In fact, it's rare that you would ever use EventDispatcher directly in your code. EventDispatcher, in Oxygine, is actually a base class, which other classes extend in order to be able to have access to addEventListener and other EventDispatcher methods. 
-
-
-##EventDispatcher methods
-Here is a summary of the methods in EventDispatcher:
-
-	int addEventListener(eventType type, EventCallback callback); 
-	void removeEventListener(eventType type, EventCallback callback);
-	void dispatchEvent(Event *event);
-
-* **addEventListener**: Adds an event handler function to listen to an event so that when that event occurs, the function will be called.
-* **removeEventListener**: Removes an event handler added to a listeners list using addEventListener. The same first 2 arguments used in addEventListener must be used in removeEventListener to remove the correct handler.
-
-> there are other simplified versions of removeEventListener
-
-* **dispatchEvent**: Sends the passed event to all listeners in the listeners list of an object that relates to the event type. This method is most commonly used when creating custom events.
-
-###Example 1: Clicking a box
-As a simple example, consider clicking on a square instance named "box" on the screen. The goal of this example is to handle that event so that the text "click" is traced in the Output panel when the box is clicked with the mouse.
-
-![](img/events_begin.png)
-
-
-	class Root : public ColorRectSprite
-	{
-	public:
-		void clickHandler(Event*)
-		{
-			log::messageln("click");
-		}
-	
-		Root()
-		{
-			setSize(300, 200);
-			setPosition(getStage()->getSize() / 2 - getSize() / 2);
-			setColor(Color::Silver);
-			spColorRectSprite box = new ColorRectSprite;
-			box->setColor(Color::Salmon);
-			box->setPosition(50, 50);
-			box->setSize(100, 100);
-			addChild(box);
-	
-			box->addEventListener(TouchEvent::CLICK, CLOSURE(this, &Root::clickHandler));
-		}
-	};
-
-To test this code example, do the following:
-
-* open HelloWorld example
-* copy paste code to example.cpp
-* add this code to example_init function:
-
-	getStage()->addChild(new Root);
-
-
-Let's take a look at the code. The first step is to define the event handler (listener function). As with all events, this accepts in its parameter list a single event instance that's automatically passed into the function when called from an event dispatcher. After that, the function is set as a listener to the box instance-the event dispatcher-listening for a *TouchEvent::CLICK* event using a basic addEventListener call. Since the box is an instance of ColorRectSprite it inherits from EventDispatcher and has access to all the EventDispatcher methods, including addEventListener.
-
-*TouchEvent::CLICK* is a constant variable defined in the TouchEvent class. It simply provides the unique integer idendifier of the event. Other event types are also stored in similar constants in the TouchEvent class, as well as other event-related classes. 
-
-Testing the example will display a clickable box that, when clicked, traces the word "click".
-
-
-###Event propagation and phases
-
-Although you might not have realized it in the previous example, the event that took place as a result of the box being clicked actually affects many different objects, not just the object being clicked. Event handling is the support for event propagation—the transference of a single event applying to multiple objects. Each of those objects receives the event, instead of just the object in which the event originated.
-
-With event propagation you're dealing with three "phases" of an event. Each phase represents a path or the location of an event as it works itself through the display objects in Oxygine that relate to that event. The three phases of an event are capturing, at target, and bubbling:
-
-* **Capturing phase**: This represents the parent objects of the target object from which the event originated. Any propagated event starts with the topmost parent (stage) and works down the display object hierarchy until reaching the original target.
-* **At target phase**: The target phase is the phase where the event is at the target object or the object from which the event originated. Unlike the capturing and bubbling phases, this phase always relates to only one object, the target object.
-* **Bubbling phase**: When an event "bubbles" it follows the reverse path of the capturing phase and works its way back up the parent hierarchy of the target object until reaching the top-most parent or stage.
-Not all propagated events (and not all events propagate) go through each phase, however. If the Stage object, for example, receives an event, there will only be an at target phase since there are no objects beyond the stage for the capturing or bubbling phases to take place.
-
-![](img/event_phases.png)
-
-
-As the event makes its way though each phase and each object within those phases, it calls all of the listener functions that were added for that event. This means that clicking on the box doesn't limit the event to the box; the Stage also receives the event. 
-
-![](img/eventpath.jpg)
-
-You can see how this all works more clearly by adding more listeners to our example.
-
-
-###Example 2: One box, many listeners
-
-To see how a single mouse click propagates through many objects within the display list hierarchy, you can add additional listeners to receive the event for each of those objects it affects. 
-
-In this example we will add listeners for Stage, Root, and box. 
-
-Clicking the box propagates the events throughout all specified listeners for all phases
-
-	class Root : public ColorRectSprite
-	{
-	public:
-		void boxClick(Event*)
-		{
-			log::messageln("box click");
-		}
-		void rootClick(Event*)
-		{
-			log::messageln("root click");
-		}
-		void stageClick(Event*)
-		{
-			log::messageln("stage click");
-		}
-		Root()
-		{
-			setSize(300, 200);
-			setPosition(getStage()->getSize() / 2 - getSize() / 2);
-			setColor(Color::Silver);
-			spColorRectSprite box = new ColorRectSprite;
-			box->setColor(Color::Salmon);
-			box->setPosition(50, 50);
-			box->setSize(100, 100);
-			addChild(box);
-	
-			getStage()->addEventListener(TouchEvent::CLICK, CLOSURE(this, &Root::stageClick));
-			box->addEventListener(TouchEvent::CLICK, CLOSURE(this, &Root::boxClick));
-			this->addEventListener(TouchEvent::CLICK, CLOSURE(this, &Root::rootClick));
-		}
-	};
-
-
-
-Test this example and click around to see the results. Clicking on the box should give you the following output:
-
-	box click
-	root click
-	stage click
-
-Try clicking anywhere off of the *box* and you get an output of:
-
-	root click
-	stage click
-
-or:
-
-	stage click
-
-##Event targeting
-
-All events, like mouse clicks, start off in Oxygine with the process of event targeting. This is the process by which Oxygine determines which object is the target of the event (where the event originates). In the previous examples we've seen how Oxygine was able to determine whether or not you clicked on the box or the Stage. For every mouse event, the event references one object—the object of highest arrangement capable of receiving the event.
-
-![](img/event_target.jpg)
-
-All display objects are, by default, enabled to receive touch events. This means that even if no event handlers have been assigned to a particular actor, it will still be targeted for an event when clicked, preventing anything below it from receiving events.
-
-To change this behavior use the *setTouchEnabled* setter. Setting it to false will disable an acotr instance from receiving touch events and allows other instances below it to be targeted for touch  events:
-
-	sprite->setTouchEnabled(false);
-
-###Event objects
-Event objects are the objects listener functions receive as an argument when called during the occurrence of an event. 
-
-The event objects received by listener method are always of the type Event but can also be a subclass of Event rather than specifically being an Event instance. Common subclasses include TouchEvent for events associated with the mouse. Each class also contains the event type constants used for listening to related events, e.g. TouchEvent::CLICK.
-
-###The stage
-The stage represents the topmost container of all actors within a application.
-
-Additionally, stage targeting for mouse events does not depend on stage contents as is the case with other objects. With the box example, you have the basic hierarchy of stage > root > box. To click on the box and have Oxygine target the box for the click event, you need to click on the shape that makes up the box. Similarly, to click on the root object, you need to click on its contents, or the box instance. Clicking anywhere else will not be clicking on root since root consists only of the box. For the stage, however, you can click on the stage by clicking anywhere on the movie because the stage exists everywhere as a persistent background for the application, even if there is no other content on the stage. 
-
-##Event properties
-
-Here is the basic rundown of common Event properties:
-
-	eventType type;
-	Phase phase;
-	bool bubbles;
-	spEventDispatcher target;
-	spEventDispatcher currentTarget;
-
-
-* **type**: The type of event being handled. This is the same as the first parameter used to add the function as a listener in addEventListener. Ex: TouchEvent::CLICK.
-
-* **eventPhase**: The current phase of the event. This is provided as a number that relates to the constants Event::phase_target, and Event::phase_bubbling, depending on which phase the listener is being called.
-
-* **bubbles**: Indicates whether or not the event is an event that bubbles. This does not mean that the event went through or is going through a bubbles phase, but rather it is a kind of event that can. When clicking just the stage in the previous example, the event did not bubble because stage was the only target. However, bubbles would still be true since the event was a mouse click.
-
-* **target**: The object which Oxygine targeted for the event. This is the object that would receive the event in the at target phase.
-
-* **currentTarget**: Refers to the object that is currently called by the listener when the event occurs. This is the same object on which addEventListener was called from when the listener was added.
-These properties can be useful in determining specific actions that need to be taken for various events.
-
-##Event methods
-
-There are also a few useful methods associated with Event objects. They include but are not limited to:
-
-	stopPropagation()
-	stopImmediatePropagation()
-	
-Here is a description of what some of these event methods can do:
-
-* **stopPropagation()**: When called within an event listener for an event that bubbles, it will stop the propagation of the event to the remaining objects which would otherwise receive the event within the current phase and any remaining phases.
-
-![](img/event_stopprop.jpg)
-
-* **stopImmediatePropagation()**: When called within an event listener for an event that bubbles, it will stop the propagation of the event within the current object as well as in remaining objects . This works much like stopPropagation except stopPropagation will not prevent additional events in the current object to be called (if there is more than one listener listening for the same event in the same object).
-
-![](img/event_stopimprop.jpg) 
-
-
-##Disable specific events within a container
-
-As I mentioned earlier, touch events are inherently enabled for all interactive objects in Oxygine. You can disable touch interaction by setting their **setTouchEnabled** property to false.
-
-Additionally, there's a similar property for actors that allow you to disable touch events for all children of that object - **setTouchChildrenEnabled**. By setting touchChildren to false, you can effectively prevent the mouse from being enabled for all instances within any actor.
-
-
-##Customizing events
-
-You can create your own events. This encompasses dispatching new or existing events, creating new types of events, and defining new event classes (based on the Event class) whose instances are to be passed to event handlers listening for that event.
-
-To dispatch events manually, you use the **dispatchEvent** method of EventDispatcher. When calling dispatchEvent you pass an event object that describes the event being dispatched. This event then makes its way through all valid targets (multiple if propagated) causing any event handlers assigned as listeners to those targets to be called (if they are listening for that particular type of event). When the handlers are called, they each receive the event object passed to dispatchEvent:
-
-	int type = 123;
-	Event event(type);
-	target->dispatchEvent(&event);
-
-New event instances are created with a type parameter and optional bubbles. By default, at least in the Event class, bubbles is false if not explicitly passed in as true. Subclasses of the Event class like TouchEvent accept even more parameters, and in the case of the TouchEvent class, the default setting for bubbles is true. 
-
-You can create your own event classes by extending the core Event class. These custom subclasses can be used in dispatching your own custom events and have properties of your own choosing. 
-
-
-###Custom event example
-
-Custom events are useful for indicating events which are not inherently recognized within Oxygine. By making your own Event classes, you can provide handlers for those events by specifying additional information relating to your custom event. 
-
-
-	class AchieveEarnedEvent: public Event
-	{
-	public:
-		enum {EVENT = eventID('A','c','E','r')};
-
-		string achievementID;
-
-		AchieveEarnedEvent(string id):Event(EVENT), achievementID(id){}
-	};
-
-
-**eventID** above is a preprocessor command to easy define unique integer value: 
-
-
-	#define eventID(a,b,c,d) ( ((unsigned int)a) | (((unsigned int)b)<< 8) | (((unsigned int)c)<<16) | (((unsigned int)d)<<24))
-
-Listen custom created event:
-
-	void SomeClass::achieveListener(Event *ev)
-	{
-		AchieveEarnedEvent* event = static_cast<AchieveEarnedEvent*>(ev);
-		log::messageln("achievement earned: %s", event->achievementID.c_str());
-	}
-
-	target->addEventListener(AchieveEarnedEvent::EVENT, CLOSURE(this, &SomeClass::achieveListener));
-
-
-Dispath event:	
-
-	AchieveEarnedEvent event("awesome");
-	target->dispatchEvent(&event);
-
-> examples/Game/Part4 has custom HiddenEvent in the class Scene

+ 0 - 141
doc/filesystem.md

@@ -1,141 +0,0 @@
-#File System
-
-You should access to files only after Oxygine core initialization:
-
-	oxygine::core::init(..)
-
-##Typical usage example 
-Read file, modify it and save back:
-	
-	#include "file.h" 
-
-	void test()
-	{
-		oxygine::file::buffer data;
-	
-		//read entire file into buffer with stdio flags "rb"
-		oxygine::file::read("user", data);
-	
-		//modify buffer
-		data[0] += 1
-		data[1] += 2
-		data.push_back(3);
-	
-		//write file back from buffer with stdio flags "wb"
-		oxygine::file::write("user", data);
-	}
-	
-
-**oxygine::file** is intermediate buffer for storing data when working with files. It uses std::vector with unsigned chars internally.
-
- 
-##Low level
-Namespace **oxygine::file** has also low level functions to working with files.
-	
-
-	oxygine::file::handle h = oxygine::file::open("user", "wb");
-	oxygine::file::write(h, "Hello World", strlen("Hello World"));	
-	oxygine::file::close(h);
-
-> **Oxygine supports only binary file operations, you allways should use 'b' flag when opening file**
-
-##Working with missing files
-
-Imagine you want to read file and work with loaded data. But you not sure that file is exits:
-
-	file::read("user", data);
-	//user function
-	load_user(data);
-
-If file "user" is missing you would see error:
-
-	>> error: can't open file: user
-	>> error: Assert! 941 d:\oxygine-framework\oxygine\src\core\oxygine.cpp
-	>> Assertion failed!
-
-To avoid error you should pass additional argument:
-
-	file::read("user", data, ep_ignore_error);
-	if (!data.empty())
-		load_user(data);
-
-This code will show warning if file is missing:
-
-	file::read("user", data, ep_show_warning);
-	if (!data.empty())
-		load_user(data);
-
-	>> warning: can't open file: user
-	
-
-In examples above third argument is **error_policy** enum. It has 3 values:
-
-* ep_show_error. It is default and most strict value. Shows assert and prints error to log.
-* ep_show_warning. Prints warning to log.
-* ep_ignore_error. Does nothing.
-
-
-
-Or you could check it with **oxygine::file::exists** function. It is slower than solutions above:
-
-	if (oxygine::file::exists("user"))
-	{
-		file::read("user", data);
-		//user function
-		load_user(data);
-	}
-
-
-
-##Mounting zip archieves to filesytem
-
-First step is mount ZipFileSystem. More than one archive could be mounted at once:
-
-	#include "core/ZipFileSystem.h"
-
-	oxygine::file::ZipFileSystem zp;
-
-	void mount()
-	{		
-		zp.add("pack1.zip")
-		zp.add("pack2.zip")
-		zp.add("pack3.zip")
-	
-		oxygine::file::mount(&zp);		
-	}
-
-Read any data from file as usual:
-
-	void read_packs()
-	{
-		oxygine::file::buffer data;
-		oxygine::file::read("filename", data);
-	}
-
-
-> ZipFileSystem is read only.
-
-
-##Working with folders
-
-Create folder:
-
-	oxygine::file::makeDirectory("name");
-
-Delete:
-
-	oxygine::file::deleteDirectory("name");
-
-
-##Loading XMLs
-
-[Pugixml](https://github.com/zeux/pugixml) is included to Oxygine.
-
-		#include "pugixml/pugixml.hpp"
-
-
-		file::buffer bf;
-		file::read("file.xml", bf);
-
-		pugi::xml_document doc;
-		doc.load_buffer(&bf.data[0], bf.size());

+ 0 - 41
doc/fonts.md

@@ -1,41 +0,0 @@
-# Fonts
-
-
-Oxygine supports image-based fonts rendering.
-Each font should be generated before running your application by *[BMFont](http://www.angelcode.com/products/bmfont/)* tool.
-Generated font consists of pair .png + .fnt file.
-![font example](img/font.png)
-
-BMFont tool is located here:
-**3rdPartyTools/BMFont/bmfont.exe**
-> for Linux/MacOSX users: BMFont could be launched with Wine
-
-
-##Exporting fonts
-1. Run **bmfont.exe**
-2. Select required symbols
-![](img/bmfont.png)
-3. Select font, size and other settings
-4. Export it *(Menu->Options->Save Bitmap Font As)* to folder with your app resources and add it to resources xml file	
-
-	`<font file="myfont.fnt" />`
-
-> see examples/HelloWorld/data/res.xml
-
-
-##Advanced usage
-Fonts could be automatically generated from BMFont configuration files (.bmfc) by **oxyresbuild** tool.
-
-Add this line to resources xml:
-
-    <bmfc_font file="main.bmfc" chars="eng.txt"/>
-
-> see examples/Demo/data/demo/fonts.xml
-
-Where:
-
-- file="main.bmfc" is your BMFont configuration file
-- chars="eng.txt" is file (TF-16 LE encoding) with text (symbols) to export
-
-
-> read more about [oxyresbuild](https://bitbucket.org/oxygine/oxygine-framework/wiki/atlasses) tool

BIN
doc/img/DebugActor.png


BIN
doc/img/actor.gif


BIN
doc/img/actor.png


BIN
doc/img/bmfont.png


BIN
doc/img/box.jpg


BIN
doc/img/box9sprite.jpg


BIN
doc/img/colors.png


BIN
doc/img/event_phases.png


BIN
doc/img/event_stopimprop.jpg


BIN
doc/img/event_stopprop.jpg


BIN
doc/img/event_target.jpg


BIN
doc/img/eventpath.jpg


BIN
doc/img/eventphases.jpg


BIN
doc/img/events_begin.png


BIN
doc/img/font.png


BIN
doc/img/image_cols.png


BIN
doc/img/mask.png


BIN
doc/img/mpexport.png


BIN
doc/img/oxyresbuild.png


BIN
doc/img/polygon.png


BIN
doc/img/progressbar.png


BIN
doc/img/sprite.png


BIN
doc/img/text.png


+ 0 - 44
doc/magicparticles.md

@@ -1,44 +0,0 @@
-#Particles
-
-[**oxygine-magicparticles**](https://bitbucket.org/oxygine/oxygine-magicparticles) is extension for oxygine-framework. It is based on commercial particles library [**Magic Particles**](http://astralax.com/).
-
- 
-##Usage
-
-Install **Magic Particles 3D (Dev) Free**.
-
-Create and export your particles (Save for API mode):
-
-![](img/mpexport.png)
-
-Copy exported files to data folder and add reference to resources xml file:
-
-	<magicparticles file="particles/effects.ptc"/>
-
-Include headers:
-
-	#include "MagicEmitter.h"
-	#include "ResMagicParticles.h"
-
-Initialize particles:
-
-	ResMagicParticles::init();
-
-Create Emitter actor:
-
-	ResMagicParticles *rs = gameResources.getT<ResMagicParticles>("effects");
-	const ResMagicEmitter *mpem = rs->getEmitter("emitter_id");
-
-	spMagicEmitter em = new MagicEmitter;
-
-	em->attachTo(getStage());
-	em->setPosition(pos);
-	em->setEmitter(mpem);
-	em->setAutoDetach(true);
-
-Where *emitter_id* is unique identifier of emitter created in the *Magic Particles Editor*.
-
-
-
-
-	 

+ 0 - 0
doc/new_project.md


+ 0 - 145
doc/resources.md

@@ -1,145 +0,0 @@
-#Resources
-
-Oxygine has three common types of resources:
- 
-* image
-* font
-* *atlas*
-
- 
-All resources used in your application should be declared in special xml files.
-
-Here is simple xml example:
-
-	<resources>
-
-		<set path = "menu" />
-		<atlas>
-			<image file="close.png" />
-			<image file="button.png" />		
-			<image file="anim/run.png" />
-		</atlas>
-
-	</resources>
-
-It means: 
-
-* Generate atlas for group of images *menu/close.png, menu/anim/run.png, menu/button.png* into one atlas. 
-* Image "close.png" would be accessible "close"
-* Image "run.png" has 7 columns = 7 frames of single animation
-* Image "button.png" has 3 columns = 3 frames
-
-> You could have more than one *< atlas >* blocks.
-
-These resources would available in your application when you load xml. 
-You could access to them by id:
-
-	Resources menu;
-
-	void initMenu()
-	{
-		menu.loadXml("res.xml");
-		ResAnim *resClose = menu.getResAnim("close");
-		spSprite close = new Sprite;
-		close->setResAnim(resClose);
-	}
-
-
-> It is recommended to have many small xml files instead of the big one.
-	
-	
-##< Atlas >
-Atlas could have own id and format attribute:
-
-	<atlas format="565" id="some_id">
-
-Supported formats:
-
-* **8888** is set by default. Each channel has 8 bits
-* **565**, where R=5, G=6, B=5 bits, no alpha
-* **5551**, where R=5, G=5, B=5, A=1 bits
-* **4444**, where R=4, G=4, B=4, A=4 bits
-
-**format** option could be applied only to atlases generated in runtime or atlases without compression.
-
-By default, atlases are being generating in runtime. Oxygine has own tool to generate them before running application.   
-	
-
-##< Image >
-
-Each < image > should be declared only in **< atlas >**.
-
-###ID attribute
-ID's are **not** case sensitive.
-
-**ID** is optional attribute. By default, it would be set too value equal to filename without extension:
-
-	<image id="optional" file="path/to/filename.png" />
-
-> You could set custom id to any type of resource (not only image). 
-
-###Cols and Rows attributes
-
-**Cols** defines number of columns in image. 
-**Rows** defines number of rows in image.
-
-	<image .... cols = "3" rows = "2" />
-
-You could store multiple frames in one image.
-
-This pseudo code demonstrates usage of image with four columns and connecting it with game logic:
-
-	<image file="flags.png" cols="4" />
-![](img/image_cols.png)    
-
-	enum state
-	{
-		state_new = 0, 
-		state_fight = 1, 
-		state_refresh = 2,
-		state_pvp = 3
-	}
-	
-	state state = getLocationState();
-	int column = state; 
-	locationSprite->setAnimFrame(resources.getResAnim("flags"), column);
-
-###User data attributes
-Any type of resource could have custom user data associated with it. Custom attributes could have any name (except already reserved).
-
-	<image .... anim-delay = "123" offset-x = "200"/>
-
-Access to them:
-
-	ResAnim *rs = resources.getResAnim("anim");
-	int time = rs->getAttribute("anim-delay").as_int(0);
-	int offset = rs->getAttribute("offset-x").as_int(0);
-
-> You could set user data to any type of resource (not only image).
-
-
-##Paths
-Path to the current folder where resources should be found could be set in xml with:
- 
-	<set path = "path/to/folder" />
-
-Path is relative to your root "data" folder.
-
-Path could be also set relative to the current xml. It should begin with **"./"**:
-
-	path = "./../images"
-
-
-
-##< Starling> / Sparrow atlas format
-
-Oxygine supports atlas format exported for Starling/Sparrow framework. 
-Declare it in the resources xml:
- 
-	<starling file="atlas.xml" />
-
-
-Then use as usual resource:
-
-	ResAnim *rs = resources.getResAnim("image");
-

+ 0 - 17
doc/ru/Home.md

@@ -1,17 +0,0 @@
-#Oxygine Wiki
-Находится в разработке...
-
-##Документация
-1. [Начало работы](start)
-1. [Actor'ы и SceneGraph](actors)
-2. [События](events)
-3. [Работа с файлами](filesystem)
-4. [Отладка, профайлинг и логгирование](ru/debug) 
-5. [Шрифты](fonts)
-6. [Шейдеры](shaders)
-7. [Ресурсы](resources)
-8. [Таблица цветов](colors)
-
-
-##Дополнения:
-1. [Библиотека oxygine-sound](ru/sounds)

+ 0 - 57
doc/ru/start.md

@@ -1,57 +0,0 @@
-#Начало работы
-
-###Для пользователей Windows и MacOSX
-[Скачайте](http://oxygine.org/download.php) Oxygine. Рекомендуется скачать версию **All-In-One** (всё в одном) с SDL. Она включает в себя всё для быстрого и легкого старта и имеет предкомпилированные файлы библиотеки SDL.
-
-Перейдите в папку **oxygine-framework/examples** и откройте любой пример.
-
-Примеры:
-
-* **HelloWorld** - отправная точка.
-* **Game** обучающий пример. Он состоит из 4 частей от начинающего до продвинутого пользователя.
-* **Demo** включает тесты и демонстрирует функционал Oxygine.
-* **DemoBox2D** это пример встроенного физического движка Box2D.
-* **Match3** пример игры на Oxygine, где требуется собрать три одинаковых элемента вместе.
- 
-Каждый пример имеет конфигурационные директории для различных плафторм/ОС
-
-* **proj.win32** - решение для VisualStudio
-* **proj.ios** - проект для iOS xcode
-* **proj.macosx** - проект для MacOSX xcode
-* **proj.marmalade** - проект Marmalade
-* *proj.android* - для сборки под Android SDK/NDK
-* *proj.cmake* - конфигурационная директория CMake
-* *proj.emscripten* - конфигурационная директория Emscripten
-
-> Если у вас возникли какие-либо трудности со сборкой под Android, CMake или Emscripten, посмотрите директорию **oxygine-framework/readme**
-
-###Продвинутым пользователям
-
-Если вы хотите установить и собрать всё вручную, тогда [скачайте](http://oxygine.org/download.php) только oxygine framework.
-   
-Перейдите в директорию **oxygine-framework/readme** и следуйте инструкциям в файле **readme.txt**
-
-###Marmalade SDK
-Если вы планируете разрабатывать с помощью *MarmaladeSDK*, следуйте инструкциям из *Продвинутым пользователям*.
-
-##Следующие шаги
-Oxygine включает в себя некоторые инструменты, которые написаны на Python и вы должны установить его, чтобы использовать дополнительные возможности при работе с Oxygine.
-
-* [Скачайте](https://www.python.org/downloads/) и установите Python версии 2.7.*
-* [Скачайте](http://www.pythonware.com/products/pil/) и установите PIL для Python
-
-
-##Создание своего проекта
-Вы можете сгенерировать свой проект вне  директории oxygine-framework с помощью скрипта **gen_template.py**. Он расположен здесь:
-  
-	oxygine-framework/tools/
-
-Запустите скрипт **gen_template.py** с помощью Python, например:
-
-	python gen_template.py MyProjectName -t win32 -d path/to/MyProject/
-
-После выполнения данной команды, будет создано пустое решение *MyProject* для Visual Studio в папке *path/to/MyProject*
-
-для более подробной информации, прочитайте справку: 
-	
-	python gen_template.py --help

+ 0 - 12
doc/shaders.md

@@ -1,12 +0,0 @@
-#Shaders
-Oxygine shading is based on "Uber Shaders" system.
-
-Shader source is located here:
-*oxygine/system_data/original/system/shader.glsl*
-
-It is already embedded into Oxygine source code and can't be modified directly.
-If you want to change it then copy shader to Application data folder (working directory).
-
-##Example
-
-*examples/Demo/src/TestUserShader.h* has example how custom shaders could be created and added to the rendering pipeline.

+ 0 - 117
doc/sounds.md

@@ -1,117 +0,0 @@
-#Sounds
-
-[**oxygine-sound**](https://bitbucket.org/oxygine/oxygine-sound) is extension for oxygine-framework. It is based on OpenAL library and could be used for playing ogg files.
-
-It supports streaming for long sound tracks and using separate thread for decoding and reading ogg files.
- 
-##Usage
-
-Include headers:
-
-	#include "SoundPlayer.h"
-	#include "SoundSystem.h"
-	#include "SoundInstance.h"
-
-Initialize sound system with 16 channels:
-	
-	SoundSystem::instance = SoundSystem::create();
-	SoundSystem::instance->init(16);
-
-	SoundPlayer::initialize();
-
-*SoundPlayer::initialize* registers new type of resource "sound".
-
-
-Add your ogg tracks to resources file, lets call it "sounds.xml":
-
-	<?xml version="1.0"?>
-	<resources>
-		<set path = "sounds" />	
-	
-	 	<sound file="sfx1.ogg" />
-		<sound file="sfx2.ogg" />
-		<sound file="voice1.ogg"/>
-		<sound file="music.ogg" streaming="true"/>
-	
-	</resources>
-
-> you could	have multiple resources files
-
-* If sound is too short if would be automaticaly decoded to buffer when loading. 
-* If sound is longer than about 5 seconds it would be decoded step by step from memory when playing.
-* **streaming=true** attribute means that sound would be loaded from file and decoded on the fly when playing.   
-
-
-Load resources:
-
-	Resources resources;
-	resources.loadXML("sounds.xml");
-
-Next step is declaring SoundPlayer instance:
-
-	SoundPlayer sfxPlayer;
-
-SoundPlayer is a container for group of sounds playing right now. You could declare multiple instances of SoundPlayer and control them individually:
-
-	SoundPlayer sfxPlayer;
-	SoundPlayer musicPlayer;
-
-	...
-
-	sfxPlayer.setVolume(1.0f);
-	musicPlayer.setVolume(0.5f);
-
-
-Update SoundSystem and SoundPlayer instances each frame:
-
-	void example_update()
-	{
-		SoundSystem::instance->update();
-		sfxPlayer.update();
-		musicPlayer.update();
-	}
-
-
-Play single sound:
-	
-	sfxPlayer.play(resources.get("sfx1"));
-
-Play looped music with fade in 1.5 seconds:
-
-	musicPlayer.play(resources.get("music"), PlayOptions().loop().fade(1500));
-
-You could save handle to playing sound instance and use it for control:
-
-	spSoundInstance music = musicPlayer.play(resources.get("music"));	
-
-	void levelCompleted()
-	{
-		music->fadeOut();
-	}
-
-Or you could control group of sounds belonging to SoundPlayer:
-
-	sfxPlayer.pause();
-	...
-	sfxPlayer.stop();
-
-
-You could subscribe to events:
-
-	spSoundInstance music = musicPlayer.play(resources.get("music"));
-	music->addEventListener(SoundInstance::SoundEvent::EVENT_DONE, CLOSURE(this, &SomeClass::musicDone));
-
-
-	void SomeClass::musicDone(Event*)
-	{
-		musicPlayer.play(resources.get("music2"));
-	} 
-
-
-
-
-
-
-
-
-	 

+ 0 - 72
doc/start.md

@@ -1,72 +0,0 @@
-#How To Start
-
-###Windows, MacOSX users
-[Download](http://oxygine.org/download.php) Oxygine. I recommend to download **All-In-One** version with SDL. It includes everything to fast and easy start and has prebuilt SDL binaries.
-
-Go to **oxygine-framework/examples** folder and open any of them.
-There are examples:
-
-* **HelloWorld** is starting Point.
-* **Game** is tutorial example. It has 4 parts from beggining to advanced usage.
-* **Demo** has tests and demonstation Oxygine functionality. 
-* **DemoBox2D** is example with integrated Box2D.
-* **Match3** is match3 mechanics demonstration implemented on Oxygine.
- 
-Each example has configuration folders for different platforms/OS:
-
-* **proj.win32** - solutions for VisualStudio
-* **proj.ios** - iOS xcode project
-* **proj.macosx** - MacOSX xcode project
-* **proj.marmalade** - Marmalade project
-* *proj.android* - build folder for Android SDK/NDK
-* *proj.cmake* - CMake configuration folder (Windows | Linux)
-* *proj.emscripten* - Emscripten configuration folder
-
-> if you have any troubles or if you need to build for android, cmake, emscripten check **oxygine-framework/readme** folder
-
-###Advanced users 
-
-If you want to setup and build everything yourself then [download](http://oxygine.org/download.php) oxygine framework only.
-   
-Go to **oxygine-framework/readme** folder and follow instructions **readme.txt**
-
-###Marmalade SDK
-If you are *MarmaladeSDK* user then follow *Advanced users* in instructions.
-
-
-##Next Steps
-Oxygine has some tools written in Python and you need to install them for advanced usage.
-
-* [Download](https://www.python.org/downloads/) and install Python version 2.7.*
-* [Download](http://www.pythonware.com/products/pil/) and install PIL for Python
-
-[see details](https://bitbucket.org/oxygine/oxygine-framework/src/tip/tools/readme.txt?at=tip)
-
-##Generate own project 
-
-You could generate own project outside of oxygine-framework folder by **gen_template.py** tool. It is located in
-  
-	oxygine-framework/tools/
-
-![](img/gen_template.png)
-
-Run **gen_template.py** script with Python, example:
-
-	python gen_template.py MyProjectName -t win32 -d path/to/MyProject/
-
-It would create empty solution *MyProject* for Visual Studio in the folder *path/to/MyProject*
-
-
-Other example:
-
-	python gen_template.py MyProjectName -t all --hello -d path/to/MyProject/
-
-It would create full copy of examples/HelloWorld including src, data and proj.* folders.
-
-
-Next step is add *entry_point.cpp* (copy it from any example) to your project and implement basic functions (example_init, example_update and so on). Also, remember to copy the data folder as well if you are using a ready-made example code to start your project.
-
-see for more info: 
-	
-	python gen_template.py --help
-

BIN
doc/wiki.zip


BIN
examples/Demo/data/images/map.png


BIN
examples/Demo/data/images/mask.png


BIN
examples/Demo/data/images/n0.png


BIN
examples/Demo/data/images/n1.png


BIN
examples/Demo/data/images/n2.png


BIN
examples/Demo/data/images/n3.png


BIN
examples/Demo/data/images/n4.png


BIN
examples/Demo/data/images/n5.png


BIN
examples/Demo/data/images/n6.png


BIN
examples/Demo/data/images/n7.png


BIN
examples/Demo/data/images/n8.png


BIN
examples/Demo/data/images/n9.png


BIN
examples/Demo/data/images/score_table.png


BIN
examples/Demo/data/images/sky.png


BIN
examples/Demo/data/images/tiled2.png


+ 12 - 0
examples/Demo/data/xmls/res.xml

@@ -30,6 +30,18 @@
 		<image file="mask.png"/>
 		<image file="sky.png"/>
 		<image file="tiled2.png"/>
+
+		<image file="n0.png"/>
+		<image file="n1.png"/>
+		<image file="n2.png"/>
+		<image file="n3.png"/>
+		<image file="n4.png"/>
+		<image file="n5.png"/>
+		<image file="n6.png"/>
+		<image file="n7.png"/>
+		<image file="n8.png"/>
+		<image file="n9.png"/>
+		<image file="score_table.png"/>
 	</atlas>
 
 	<atlas>

+ 2 - 2
examples/Demo/proj.android/AndroidManifest.xml

@@ -24,8 +24,8 @@
         </activity>
     </application>
 
-    <!-- Android 2.3.3 -->
-    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="12" />
+    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14" />
+    
     <uses-permission android:name="android.permission.INTERNET" /> <!--used for http requests demo-->    
     <uses-permission android:name="android.permission.WAKE_LOCK" /><!--used for http requests demo (downloading files)-->
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><!--used for Proxy detection, could be disabled-->    

+ 0 - 11
examples/Demo/proj.android/default.properties

@@ -1,11 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-# 
-# This file must be checked in Version Control Systems.
-# 
-# To customize properties used by the Ant build system use,
-# "build.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-12

+ 1 - 1
examples/Demo/proj.android/jni/src/Android.mk

@@ -6,7 +6,7 @@ LOCAL_MODULE := main
 #SDK_ROOT points to folder with SDL and oxygine-framework
 LOCAL_SRC_FILES := ../../../../../..//SDL/src/main/android/SDL_android_main.c
 
-LOCAL_SRC_FILES += ../../../src/entry_point.cpp ../../../src/example.cpp ../../../src/test.cpp 
+LOCAL_SRC_FILES += ../../../src/Counter.cpp ../../../src/entry_point.cpp ../../../src/example.cpp ../../../src/test.cpp 
 
 
 LOCAL_STATIC_LIBRARIES := oxygine-framework_static

+ 1 - 1
examples/Demo/proj.android/project.properties

@@ -11,5 +11,5 @@
 #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
 
 # Project target.
-target=android-12
+target=android-14
 android.library.reference.1=../../../..//oxygine-framework/oxygine/SDL/android/lib

+ 1 - 1
examples/Demo/proj.cmake/CMakeLists.txt

@@ -7,7 +7,7 @@ include_directories(${OXYGINE_INCLUDE_DIRS})
 link_directories(${OXYGINE_LIBRARY_DIRS})
 
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
-add_executable(Demo ../src/entry_point.cpp ../src/example.cpp ../src/test.cpp  ../src/TestAlphaHitTest.h ../src/TestBox9Sprite.h ../src/TestClipRect.h ../src/TestDrag.h ../src/TestHttp.h ../src/TestInputText.h ../src/TestManageRes.h ../src/TestMask.h ../src/TestPerf.h ../src/TestPolygon.h ../src/TestProgressBar.h ../src/TestRender2Texture.h ../src/TestSliding.h ../src/TestTexel2Pixel.h ../src/TestText.h ../src/TestTextureFormat.h ../src/TestTweens.h ../src/TestUserShader.h ../src/TestUserShader2.h ../src/example.h ../src/test.h )
+add_executable(Demo ../src/Counter.cpp ../src/entry_point.cpp ../src/example.cpp ../src/test.cpp  ../src/Counter.h ../src/TestAlphaHitTest.h ../src/TestBox9Sprite.h ../src/TestClipRect.h ../src/TestCounter.h ../src/TestDrag.h ../src/TestHttp.h ../src/TestInputText.h ../src/TestManageRes.h ../src/TestMask.h ../src/TestPerf.h ../src/TestPolygon.h ../src/TestProgressBar.h ../src/TestRender2Texture.h ../src/TestSliding.h ../src/TestTexel2Pixel.h ../src/TestText.h ../src/TestTextureFormat.h ../src/TestTweenText.h ../src/TestTweens.h ../src/TestUserShader.h ../src/TestUserShader2.h ../src/example.h ../src/test.h )
 
 if (WIN32) #disable console mode for VC++
 	set_target_properties(Demo PROPERTIES WIN32_EXECUTABLE TRUE)

+ 1 - 1
examples/Demo/proj.emscripten/CMakeLists.txt

@@ -9,7 +9,7 @@ link_directories(${OXYGINE_LIBRARY_DIRS})
 SET(CMAKE_EXECUTABLE_SUFFIX ".html")
 set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-Wno-warn-absolute-paths -std=c++11")
 
-add_executable(Demo ../src/entry_point.cpp ../src/example.cpp ../src/test.cpp  ../src/TestAlphaHitTest.h ../src/TestBox9Sprite.h ../src/TestClipRect.h ../src/TestDrag.h ../src/TestHttp.h ../src/TestInputText.h ../src/TestManageRes.h ../src/TestMask.h ../src/TestPerf.h ../src/TestPolygon.h ../src/TestProgressBar.h ../src/TestRender2Texture.h ../src/TestSliding.h ../src/TestTexel2Pixel.h ../src/TestText.h ../src/TestTextureFormat.h ../src/TestTweens.h ../src/TestUserShader.h ../src/TestUserShader2.h ../src/example.h ../src/test.h )
+add_executable(Demo ../src/Counter.cpp ../src/entry_point.cpp ../src/example.cpp ../src/test.cpp  ../src/Counter.h ../src/TestAlphaHitTest.h ../src/TestBox9Sprite.h ../src/TestClipRect.h ../src/TestCounter.h ../src/TestDrag.h ../src/TestHttp.h ../src/TestInputText.h ../src/TestManageRes.h ../src/TestMask.h ../src/TestPerf.h ../src/TestPolygon.h ../src/TestProgressBar.h ../src/TestRender2Texture.h ../src/TestSliding.h ../src/TestTexel2Pixel.h ../src/TestText.h ../src/TestTextureFormat.h ../src/TestTweenText.h ../src/TestTweens.h ../src/TestUserShader.h ../src/TestUserShader2.h ../src/example.h ../src/test.h )
 
 if (CMAKE_BUILD_TYPE STREQUAL Debug)
 	SET(linkFlags "-g4 ")

+ 88 - 78
examples/Demo/proj.ios/demo_ios.xcodeproj/project.pbxproj

@@ -22,15 +22,16 @@
 		04998EF817F8B6F3003441C3 /* libjpeg.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 04998EF617F8B6F3003441C3 /* libjpeg.a */; };
 		049B52B11871EBFA00EF3C66 /* liboxygine_ios.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 049B52AD1871EBBA00EF3C66 /* liboxygine_ios.a */; };
 		04E9AD3F1876FE84006A7317 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04E9AD3E1876FE84006A7317 /* Images.xcassets */; };
-		2DC477AC10D6C07B3FE008F6 /* ../src/entry_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 360377333740D8A2FD15BBE6 /* ../src/entry_point.cpp */; };
-		DA49ED8903C628BA578C8670 /* ../src/example.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BF9628FC8D38F9748F0CDEB /* ../src/example.cpp */; };
-		C8860D93875589970329DCCD /* ../src/test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DA100C319512824B7570663 /* ../src/test.cpp */; };
-		1E839D002B2BA83FC83A695A /* ../data/demo in Sources */ = {isa = PBXBuildFile; fileRef = 04FE4D4FB640E0DF92DFB865 /* ../data/demo */; };
-		3A631A475DE035FC53ADE5EA /* ../data/ext in Sources */ = {isa = PBXBuildFile; fileRef = 7F3B12E3C9D554D9FE28101D /* ../data/ext */; };
-		CD59C69314E9E74CD0A11E03 /* ../data/images in Sources */ = {isa = PBXBuildFile; fileRef = F6123B1E6FE4471A00F49751 /* ../data/images */; };
-		EFF139F8BA484314F7AAF645 /* ../data/light_fs.glsl in Sources */ = {isa = PBXBuildFile; fileRef = 5DE458993031811A4C7D28C1 /* ../data/light_fs.glsl */; };
-		F2CFD518E4E2E05ECEDBB262 /* ../data/light_vs.glsl in Sources */ = {isa = PBXBuildFile; fileRef = BA41FC88D76540A6905224D6 /* ../data/light_vs.glsl */; };
-		693088A7AB377368EE4A018E /* ../data/xmls in Sources */ = {isa = PBXBuildFile; fileRef = 2CE4BD5BB9DEF92439C0AB58 /* ../data/xmls */; };
+		2DC477AC10D6C07B3FE008F6 /* ../src/Counter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 360377333740D8A2FD15BBE6 /* ../src/Counter.cpp */; };
+		DA49ED8903C628BA578C8670 /* ../src/entry_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BF9628FC8D38F9748F0CDEB /* ../src/entry_point.cpp */; };
+		C8860D93875589970329DCCD /* ../src/example.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DA100C319512824B7570663 /* ../src/example.cpp */; };
+		1E839D002B2BA83FC83A695A /* ../src/test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 04FE4D4FB640E0DF92DFB865 /* ../src/test.cpp */; };
+		3A631A475DE035FC53ADE5EA /* ../data/demo in Sources */ = {isa = PBXBuildFile; fileRef = 7F3B12E3C9D554D9FE28101D /* ../data/demo */; };
+		CD59C69314E9E74CD0A11E03 /* ../data/ext in Sources */ = {isa = PBXBuildFile; fileRef = F6123B1E6FE4471A00F49751 /* ../data/ext */; };
+		EFF139F8BA484314F7AAF645 /* ../data/images in Sources */ = {isa = PBXBuildFile; fileRef = 5DE458993031811A4C7D28C1 /* ../data/images */; };
+		F2CFD518E4E2E05ECEDBB262 /* ../data/light_fs.glsl in Sources */ = {isa = PBXBuildFile; fileRef = BA41FC88D76540A6905224D6 /* ../data/light_fs.glsl */; };
+		693088A7AB377368EE4A018E /* ../data/light_vs.glsl in Sources */ = {isa = PBXBuildFile; fileRef = 2CE4BD5BB9DEF92439C0AB58 /* ../data/light_vs.glsl */; };
+		2B0FCA4EF2CDAB7EF6C6252E /* ../data/xmls in Sources */ = {isa = PBXBuildFile; fileRef = F196143B0370A9D348494ACC /* ../data/xmls */; };
 
 /* End PBXBuildFile section */
 
@@ -81,36 +82,40 @@
 		04998EF517F8B6F3003441C3 /* libpng.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpng.a; path = "../../..//oxygine/third_party/ios/libraries/libpng.a"; sourceTree = "<group>"; };
 		04998EF617F8B6F3003441C3 /* libjpeg.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjpeg.a; path = "../../..//oxygine/third_party/ios/libraries/libjpeg.a"; sourceTree = "<group>"; };
 		04E9AD3E1876FE84006A7317 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name =Images.xcassets; path = Demo/Images.xcassets; sourceTree = "<group>"; };
-		360377333740D8A2FD15BBE6 /* ../src/entry_point.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = entry_point.cpp; path = ../src/entry_point.cpp; sourceTree = "<group>"; };
-		0BF9628FC8D38F9748F0CDEB /* ../src/example.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = example.cpp; path = ../src/example.cpp; sourceTree = "<group>"; };
-		4DA100C319512824B7570663 /* ../src/test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test.cpp; path = ../src/test.cpp; sourceTree = "<group>"; };
-		F196143B0370A9D348494ACC /* ../src/TestAlphaHitTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestAlphaHitTest.h; path = ../src/TestAlphaHitTest.h; sourceTree = "<group>"; };
-		7746CA7A63049ED8F7D6BF42 /* ../src/TestBox9Sprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestBox9Sprite.h; path = ../src/TestBox9Sprite.h; sourceTree = "<group>"; };
-		D954BD82D7708B65A08FB6B9 /* ../src/TestClipRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestClipRect.h; path = ../src/TestClipRect.h; sourceTree = "<group>"; };
-		BD0E956CC3A2F7EB94822B5C /* ../src/TestDrag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestDrag.h; path = ../src/TestDrag.h; sourceTree = "<group>"; };
-		7623D793B59EF0CD569E6EC2 /* ../src/TestHttp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestHttp.h; path = ../src/TestHttp.h; sourceTree = "<group>"; };
-		AFA30E959880563E6ABBBC4F /* ../src/TestInputText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestInputText.h; path = ../src/TestInputText.h; sourceTree = "<group>"; };
-		B52CCD463855CF91A7FBDB8E /* ../src/TestManageRes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestManageRes.h; path = ../src/TestManageRes.h; sourceTree = "<group>"; };
-		7EEFDEEC289FCBB5FA67F822 /* ../src/TestMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestMask.h; path = ../src/TestMask.h; sourceTree = "<group>"; };
-		4E9DE6A8FCBDF43BC876EC90 /* ../src/TestPerf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestPerf.h; path = ../src/TestPerf.h; sourceTree = "<group>"; };
-		8F2AFB956EEAEED67C5B7571 /* ../src/TestPolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestPolygon.h; path = ../src/TestPolygon.h; sourceTree = "<group>"; };
-		047F6BD19F885FF186A1447C /* ../src/TestProgressBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestProgressBar.h; path = ../src/TestProgressBar.h; sourceTree = "<group>"; };
-		C570FAEF487CD34B62389F89 /* ../src/TestRender2Texture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestRender2Texture.h; path = ../src/TestRender2Texture.h; sourceTree = "<group>"; };
-		2418B9A339E6004913AF5980 /* ../src/TestSliding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestSliding.h; path = ../src/TestSliding.h; sourceTree = "<group>"; };
-		CAD9D6A98986EA8082368448 /* ../src/TestTexel2Pixel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTexel2Pixel.h; path = ../src/TestTexel2Pixel.h; sourceTree = "<group>"; };
-		67194AC90FEA68E7C96E6907 /* ../src/TestText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestText.h; path = ../src/TestText.h; sourceTree = "<group>"; };
-		5AFC0664D7BA80AE2A75BF0E /* ../src/TestTextureFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTextureFormat.h; path = ../src/TestTextureFormat.h; sourceTree = "<group>"; };
-		12CAC42FDF06ABE860CFEA53 /* ../src/TestTweens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTweens.h; path = ../src/TestTweens.h; sourceTree = "<group>"; };
-		0F4469FB587862663D529DC9 /* ../src/TestUserShader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestUserShader.h; path = ../src/TestUserShader.h; sourceTree = "<group>"; };
-		B6A9281364AF5D3B581D374C /* ../src/TestUserShader2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestUserShader2.h; path = ../src/TestUserShader2.h; sourceTree = "<group>"; };
-		4013C6794AAE8DFC641D2870 /* ../src/example.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = example.h; path = ../src/example.h; sourceTree = "<group>"; };
-		22E408FD6FCDA6E7E8E76952 /* ../src/test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test.h; path = ../src/test.h; sourceTree = "<group>"; };
-		04FE4D4FB640E0DF92DFB865 /* ../data/demo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = demo; path = ../data/demo; sourceTree = "<group>"; };
-		7F3B12E3C9D554D9FE28101D /* ../data/ext */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = ext; path = ../data/ext; sourceTree = "<group>"; };
-		F6123B1E6FE4471A00F49751 /* ../data/images */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = images; path = ../data/images; sourceTree = "<group>"; };
-		5DE458993031811A4C7D28C1 /* ../data/light_fs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = light_fs.glsl; path = ../data/light_fs.glsl; sourceTree = "<group>"; };
-		BA41FC88D76540A6905224D6 /* ../data/light_vs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = light_vs.glsl; path = ../data/light_vs.glsl; sourceTree = "<group>"; };
-		2CE4BD5BB9DEF92439C0AB58 /* ../data/xmls */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = xmls; path = ../data/xmls; sourceTree = "<group>"; };
+		360377333740D8A2FD15BBE6 /* ../src/Counter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Counter.cpp; path = ../src/Counter.cpp; sourceTree = "<group>"; };
+		0BF9628FC8D38F9748F0CDEB /* ../src/entry_point.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = entry_point.cpp; path = ../src/entry_point.cpp; sourceTree = "<group>"; };
+		4DA100C319512824B7570663 /* ../src/example.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = example.cpp; path = ../src/example.cpp; sourceTree = "<group>"; };
+		04FE4D4FB640E0DF92DFB865 /* ../src/test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test.cpp; path = ../src/test.cpp; sourceTree = "<group>"; };
+		7746CA7A63049ED8F7D6BF42 /* ../src/Counter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Counter.h; path = ../src/Counter.h; sourceTree = "<group>"; };
+		D954BD82D7708B65A08FB6B9 /* ../src/TestAlphaHitTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestAlphaHitTest.h; path = ../src/TestAlphaHitTest.h; sourceTree = "<group>"; };
+		BD0E956CC3A2F7EB94822B5C /* ../src/TestBox9Sprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestBox9Sprite.h; path = ../src/TestBox9Sprite.h; sourceTree = "<group>"; };
+		7623D793B59EF0CD569E6EC2 /* ../src/TestClipRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestClipRect.h; path = ../src/TestClipRect.h; sourceTree = "<group>"; };
+		AFA30E959880563E6ABBBC4F /* ../src/TestCounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestCounter.h; path = ../src/TestCounter.h; sourceTree = "<group>"; };
+		B52CCD463855CF91A7FBDB8E /* ../src/TestDrag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestDrag.h; path = ../src/TestDrag.h; sourceTree = "<group>"; };
+		7EEFDEEC289FCBB5FA67F822 /* ../src/TestHttp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestHttp.h; path = ../src/TestHttp.h; sourceTree = "<group>"; };
+		4E9DE6A8FCBDF43BC876EC90 /* ../src/TestInputText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestInputText.h; path = ../src/TestInputText.h; sourceTree = "<group>"; };
+		8F2AFB956EEAEED67C5B7571 /* ../src/TestManageRes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestManageRes.h; path = ../src/TestManageRes.h; sourceTree = "<group>"; };
+		047F6BD19F885FF186A1447C /* ../src/TestMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestMask.h; path = ../src/TestMask.h; sourceTree = "<group>"; };
+		C570FAEF487CD34B62389F89 /* ../src/TestPerf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestPerf.h; path = ../src/TestPerf.h; sourceTree = "<group>"; };
+		2418B9A339E6004913AF5980 /* ../src/TestPolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestPolygon.h; path = ../src/TestPolygon.h; sourceTree = "<group>"; };
+		CAD9D6A98986EA8082368448 /* ../src/TestProgressBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestProgressBar.h; path = ../src/TestProgressBar.h; sourceTree = "<group>"; };
+		67194AC90FEA68E7C96E6907 /* ../src/TestRender2Texture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestRender2Texture.h; path = ../src/TestRender2Texture.h; sourceTree = "<group>"; };
+		5AFC0664D7BA80AE2A75BF0E /* ../src/TestSliding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestSliding.h; path = ../src/TestSliding.h; sourceTree = "<group>"; };
+		12CAC42FDF06ABE860CFEA53 /* ../src/TestTexel2Pixel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTexel2Pixel.h; path = ../src/TestTexel2Pixel.h; sourceTree = "<group>"; };
+		0F4469FB587862663D529DC9 /* ../src/TestText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestText.h; path = ../src/TestText.h; sourceTree = "<group>"; };
+		B6A9281364AF5D3B581D374C /* ../src/TestTextureFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTextureFormat.h; path = ../src/TestTextureFormat.h; sourceTree = "<group>"; };
+		4013C6794AAE8DFC641D2870 /* ../src/TestTweenText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTweenText.h; path = ../src/TestTweenText.h; sourceTree = "<group>"; };
+		22E408FD6FCDA6E7E8E76952 /* ../src/TestTweens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTweens.h; path = ../src/TestTweens.h; sourceTree = "<group>"; };
+		C0253E2158DFD901AD4F8991 /* ../src/TestUserShader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestUserShader.h; path = ../src/TestUserShader.h; sourceTree = "<group>"; };
+		5BE09AD6F31291430F5FB3E0 /* ../src/TestUserShader2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestUserShader2.h; path = ../src/TestUserShader2.h; sourceTree = "<group>"; };
+		01AAF6B516BCFD9887A9D77D /* ../src/example.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = example.h; path = ../src/example.h; sourceTree = "<group>"; };
+		B4059CD311FA2BF93FB2C895 /* ../src/test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test.h; path = ../src/test.h; sourceTree = "<group>"; };
+		7F3B12E3C9D554D9FE28101D /* ../data/demo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = demo; path = ../data/demo; sourceTree = "<group>"; };
+		F6123B1E6FE4471A00F49751 /* ../data/ext */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = ext; path = ../data/ext; sourceTree = "<group>"; };
+		5DE458993031811A4C7D28C1 /* ../data/images */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = images; path = ../data/images; sourceTree = "<group>"; };
+		BA41FC88D76540A6905224D6 /* ../data/light_fs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = light_fs.glsl; path = ../data/light_fs.glsl; sourceTree = "<group>"; };
+		2CE4BD5BB9DEF92439C0AB58 /* ../data/light_vs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = light_vs.glsl; path = ../data/light_vs.glsl; sourceTree = "<group>"; };
+		F196143B0370A9D348494ACC /* ../data/xmls */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = xmls; path = ../data/xmls; sourceTree = "<group>"; };
 
 /* End PBXFileReference section */
 
@@ -189,12 +194,12 @@
 		04998CF617F8A933003441C3 /* Supporting Files */ = {
 			isa = PBXGroup;
 			children = (
-				04FE4D4FB640E0DF92DFB865 /* demo */, 
-				7F3B12E3C9D554D9FE28101D /* ext */, 
-				F6123B1E6FE4471A00F49751 /* images */, 
-				5DE458993031811A4C7D28C1 /* light_fs.glsl */, 
-				BA41FC88D76540A6905224D6 /* light_vs.glsl */, 
-				2CE4BD5BB9DEF92439C0AB58 /* xmls */, 
+				7F3B12E3C9D554D9FE28101D /* demo */, 
+				F6123B1E6FE4471A00F49751 /* ext */, 
+				5DE458993031811A4C7D28C1 /* images */, 
+				BA41FC88D76540A6905224D6 /* light_fs.glsl */, 
+				2CE4BD5BB9DEF92439C0AB58 /* light_vs.glsl */, 
+				F196143B0370A9D348494ACC /* xmls */, 
 
 			);
 			name = "Supporting Files";
@@ -211,30 +216,34 @@
 		04998D4417F8A9ED003441C3 /* src */ = {
 			isa = PBXGroup;
 			children = (
-				360377333740D8A2FD15BBE6 /* entry_point.cpp */, 
-				0BF9628FC8D38F9748F0CDEB /* example.cpp */, 
-				4DA100C319512824B7570663 /* test.cpp */, 
-				F196143B0370A9D348494ACC /* TestAlphaHitTest.h */, 
-				7746CA7A63049ED8F7D6BF42 /* TestBox9Sprite.h */, 
-				D954BD82D7708B65A08FB6B9 /* TestClipRect.h */, 
-				BD0E956CC3A2F7EB94822B5C /* TestDrag.h */, 
-				7623D793B59EF0CD569E6EC2 /* TestHttp.h */, 
-				AFA30E959880563E6ABBBC4F /* TestInputText.h */, 
-				B52CCD463855CF91A7FBDB8E /* TestManageRes.h */, 
-				7EEFDEEC289FCBB5FA67F822 /* TestMask.h */, 
-				4E9DE6A8FCBDF43BC876EC90 /* TestPerf.h */, 
-				8F2AFB956EEAEED67C5B7571 /* TestPolygon.h */, 
-				047F6BD19F885FF186A1447C /* TestProgressBar.h */, 
-				C570FAEF487CD34B62389F89 /* TestRender2Texture.h */, 
-				2418B9A339E6004913AF5980 /* TestSliding.h */, 
-				CAD9D6A98986EA8082368448 /* TestTexel2Pixel.h */, 
-				67194AC90FEA68E7C96E6907 /* TestText.h */, 
-				5AFC0664D7BA80AE2A75BF0E /* TestTextureFormat.h */, 
-				12CAC42FDF06ABE860CFEA53 /* TestTweens.h */, 
-				0F4469FB587862663D529DC9 /* TestUserShader.h */, 
-				B6A9281364AF5D3B581D374C /* TestUserShader2.h */, 
-				4013C6794AAE8DFC641D2870 /* example.h */, 
-				22E408FD6FCDA6E7E8E76952 /* test.h */, 
+				360377333740D8A2FD15BBE6 /* Counter.cpp */, 
+				0BF9628FC8D38F9748F0CDEB /* entry_point.cpp */, 
+				4DA100C319512824B7570663 /* example.cpp */, 
+				04FE4D4FB640E0DF92DFB865 /* test.cpp */, 
+				7746CA7A63049ED8F7D6BF42 /* Counter.h */, 
+				D954BD82D7708B65A08FB6B9 /* TestAlphaHitTest.h */, 
+				BD0E956CC3A2F7EB94822B5C /* TestBox9Sprite.h */, 
+				7623D793B59EF0CD569E6EC2 /* TestClipRect.h */, 
+				AFA30E959880563E6ABBBC4F /* TestCounter.h */, 
+				B52CCD463855CF91A7FBDB8E /* TestDrag.h */, 
+				7EEFDEEC289FCBB5FA67F822 /* TestHttp.h */, 
+				4E9DE6A8FCBDF43BC876EC90 /* TestInputText.h */, 
+				8F2AFB956EEAEED67C5B7571 /* TestManageRes.h */, 
+				047F6BD19F885FF186A1447C /* TestMask.h */, 
+				C570FAEF487CD34B62389F89 /* TestPerf.h */, 
+				2418B9A339E6004913AF5980 /* TestPolygon.h */, 
+				CAD9D6A98986EA8082368448 /* TestProgressBar.h */, 
+				67194AC90FEA68E7C96E6907 /* TestRender2Texture.h */, 
+				5AFC0664D7BA80AE2A75BF0E /* TestSliding.h */, 
+				12CAC42FDF06ABE860CFEA53 /* TestTexel2Pixel.h */, 
+				0F4469FB587862663D529DC9 /* TestText.h */, 
+				B6A9281364AF5D3B581D374C /* TestTextureFormat.h */, 
+				4013C6794AAE8DFC641D2870 /* TestTweenText.h */, 
+				22E408FD6FCDA6E7E8E76952 /* TestTweens.h */, 
+				C0253E2158DFD901AD4F8991 /* TestUserShader.h */, 
+				5BE09AD6F31291430F5FB3E0 /* TestUserShader2.h */, 
+				01AAF6B516BCFD9887A9D77D /* example.h */, 
+				B4059CD311FA2BF93FB2C895 /* test.h */, 
 
 			);
 			name = src;
@@ -330,12 +339,12 @@
 			buildActionMask = 2147483647;
 			files = (
 				04E9AD3F1876FE84006A7317 /* Images.xcassets in Resources */,
-				1E839D002B2BA83FC83A695A /* demo */, 
-				3A631A475DE035FC53ADE5EA /* ext */, 
-				CD59C69314E9E74CD0A11E03 /* images */, 
-				EFF139F8BA484314F7AAF645 /* light_fs.glsl */, 
-				F2CFD518E4E2E05ECEDBB262 /* light_vs.glsl */, 
-				693088A7AB377368EE4A018E /* xmls */, 
+				3A631A475DE035FC53ADE5EA /* demo */, 
+				CD59C69314E9E74CD0A11E03 /* ext */, 
+				EFF139F8BA484314F7AAF645 /* images */, 
+				F2CFD518E4E2E05ECEDBB262 /* light_fs.glsl */, 
+				693088A7AB377368EE4A018E /* light_vs.glsl */, 
+				2B0FCA4EF2CDAB7EF6C6252E /* xmls */, 
 
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -347,9 +356,10 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				2DC477AC10D6C07B3FE008F6 /* entry_point.cpp */, 
-				DA49ED8903C628BA578C8670 /* example.cpp */, 
-				C8860D93875589970329DCCD /* test.cpp */, 
+				2DC477AC10D6C07B3FE008F6 /* Counter.cpp */, 
+				DA49ED8903C628BA578C8670 /* entry_point.cpp */, 
+				C8860D93875589970329DCCD /* example.cpp */, 
+				1E839D002B2BA83FC83A695A /* test.cpp */, 
 
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 88 - 78
examples/Demo/proj.macosx/demo_macosx.xcodeproj/project.pbxproj

@@ -15,15 +15,16 @@
 		0405A00118720D2200BA6557 /* libpng.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 04059FF11872031A00BA6557 /* libpng.a */; };
 		049B57321871FBE900EF3C66 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 049B57311871FBE900EF3C66 /* Cocoa.framework */; };
 		049B574A1871FBE900EF3C66 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 049B57491871FBE900EF3C66 /* Images.xcassets */; };
-		2DC477AC10D6C07B3FE008F6 /* ../src/entry_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 360377333740D8A2FD15BBE6 /* ../src/entry_point.cpp */; };
-		DA49ED8903C628BA578C8670 /* ../src/example.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BF9628FC8D38F9748F0CDEB /* ../src/example.cpp */; };
-		C8860D93875589970329DCCD /* ../src/test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DA100C319512824B7570663 /* ../src/test.cpp */; };
-		1E839D002B2BA83FC83A695A /* ../data/demo in Sources */ = {isa = PBXBuildFile; fileRef = 04FE4D4FB640E0DF92DFB865 /* ../data/demo */; };
-		3A631A475DE035FC53ADE5EA /* ../data/ext in Sources */ = {isa = PBXBuildFile; fileRef = 7F3B12E3C9D554D9FE28101D /* ../data/ext */; };
-		CD59C69314E9E74CD0A11E03 /* ../data/images in Sources */ = {isa = PBXBuildFile; fileRef = F6123B1E6FE4471A00F49751 /* ../data/images */; };
-		EFF139F8BA484314F7AAF645 /* ../data/light_fs.glsl in Sources */ = {isa = PBXBuildFile; fileRef = 5DE458993031811A4C7D28C1 /* ../data/light_fs.glsl */; };
-		F2CFD518E4E2E05ECEDBB262 /* ../data/light_vs.glsl in Sources */ = {isa = PBXBuildFile; fileRef = BA41FC88D76540A6905224D6 /* ../data/light_vs.glsl */; };
-		693088A7AB377368EE4A018E /* ../data/xmls in Sources */ = {isa = PBXBuildFile; fileRef = 2CE4BD5BB9DEF92439C0AB58 /* ../data/xmls */; };
+		2DC477AC10D6C07B3FE008F6 /* ../src/Counter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 360377333740D8A2FD15BBE6 /* ../src/Counter.cpp */; };
+		DA49ED8903C628BA578C8670 /* ../src/entry_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BF9628FC8D38F9748F0CDEB /* ../src/entry_point.cpp */; };
+		C8860D93875589970329DCCD /* ../src/example.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DA100C319512824B7570663 /* ../src/example.cpp */; };
+		1E839D002B2BA83FC83A695A /* ../src/test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 04FE4D4FB640E0DF92DFB865 /* ../src/test.cpp */; };
+		3A631A475DE035FC53ADE5EA /* ../data/demo in Sources */ = {isa = PBXBuildFile; fileRef = 7F3B12E3C9D554D9FE28101D /* ../data/demo */; };
+		CD59C69314E9E74CD0A11E03 /* ../data/ext in Sources */ = {isa = PBXBuildFile; fileRef = F6123B1E6FE4471A00F49751 /* ../data/ext */; };
+		EFF139F8BA484314F7AAF645 /* ../data/images in Sources */ = {isa = PBXBuildFile; fileRef = 5DE458993031811A4C7D28C1 /* ../data/images */; };
+		F2CFD518E4E2E05ECEDBB262 /* ../data/light_fs.glsl in Sources */ = {isa = PBXBuildFile; fileRef = BA41FC88D76540A6905224D6 /* ../data/light_fs.glsl */; };
+		693088A7AB377368EE4A018E /* ../data/light_vs.glsl in Sources */ = {isa = PBXBuildFile; fileRef = 2CE4BD5BB9DEF92439C0AB58 /* ../data/light_vs.glsl */; };
+		2B0FCA4EF2CDAB7EF6C6252E /* ../data/xmls in Sources */ = {isa = PBXBuildFile; fileRef = F196143B0370A9D348494ACC /* ../data/xmls */; };
 
 		
 /* End PBXBuildFile section */
@@ -95,36 +96,40 @@
 		049B57391871FBE900EF3C66 /* demo_macosx-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Demo_macosx-Info.plist"; sourceTree = "<group>"; };
 		049B57491871FBE900EF3C66 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = Demo/Images.xcassets; sourceTree = "<group>"; };
 		049B57501871FBE900EF3C66 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
-		360377333740D8A2FD15BBE6 /* ../src/entry_point.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = entry_point.cpp; path = ../src/entry_point.cpp; sourceTree = "<group>"; };
-		0BF9628FC8D38F9748F0CDEB /* ../src/example.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = example.cpp; path = ../src/example.cpp; sourceTree = "<group>"; };
-		4DA100C319512824B7570663 /* ../src/test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test.cpp; path = ../src/test.cpp; sourceTree = "<group>"; };
-		F196143B0370A9D348494ACC /* ../src/TestAlphaHitTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestAlphaHitTest.h; path = ../src/TestAlphaHitTest.h; sourceTree = "<group>"; };
-		7746CA7A63049ED8F7D6BF42 /* ../src/TestBox9Sprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestBox9Sprite.h; path = ../src/TestBox9Sprite.h; sourceTree = "<group>"; };
-		D954BD82D7708B65A08FB6B9 /* ../src/TestClipRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestClipRect.h; path = ../src/TestClipRect.h; sourceTree = "<group>"; };
-		BD0E956CC3A2F7EB94822B5C /* ../src/TestDrag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestDrag.h; path = ../src/TestDrag.h; sourceTree = "<group>"; };
-		7623D793B59EF0CD569E6EC2 /* ../src/TestHttp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestHttp.h; path = ../src/TestHttp.h; sourceTree = "<group>"; };
-		AFA30E959880563E6ABBBC4F /* ../src/TestInputText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestInputText.h; path = ../src/TestInputText.h; sourceTree = "<group>"; };
-		B52CCD463855CF91A7FBDB8E /* ../src/TestManageRes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestManageRes.h; path = ../src/TestManageRes.h; sourceTree = "<group>"; };
-		7EEFDEEC289FCBB5FA67F822 /* ../src/TestMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestMask.h; path = ../src/TestMask.h; sourceTree = "<group>"; };
-		4E9DE6A8FCBDF43BC876EC90 /* ../src/TestPerf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestPerf.h; path = ../src/TestPerf.h; sourceTree = "<group>"; };
-		8F2AFB956EEAEED67C5B7571 /* ../src/TestPolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestPolygon.h; path = ../src/TestPolygon.h; sourceTree = "<group>"; };
-		047F6BD19F885FF186A1447C /* ../src/TestProgressBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestProgressBar.h; path = ../src/TestProgressBar.h; sourceTree = "<group>"; };
-		C570FAEF487CD34B62389F89 /* ../src/TestRender2Texture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestRender2Texture.h; path = ../src/TestRender2Texture.h; sourceTree = "<group>"; };
-		2418B9A339E6004913AF5980 /* ../src/TestSliding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestSliding.h; path = ../src/TestSliding.h; sourceTree = "<group>"; };
-		CAD9D6A98986EA8082368448 /* ../src/TestTexel2Pixel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTexel2Pixel.h; path = ../src/TestTexel2Pixel.h; sourceTree = "<group>"; };
-		67194AC90FEA68E7C96E6907 /* ../src/TestText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestText.h; path = ../src/TestText.h; sourceTree = "<group>"; };
-		5AFC0664D7BA80AE2A75BF0E /* ../src/TestTextureFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTextureFormat.h; path = ../src/TestTextureFormat.h; sourceTree = "<group>"; };
-		12CAC42FDF06ABE860CFEA53 /* ../src/TestTweens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTweens.h; path = ../src/TestTweens.h; sourceTree = "<group>"; };
-		0F4469FB587862663D529DC9 /* ../src/TestUserShader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestUserShader.h; path = ../src/TestUserShader.h; sourceTree = "<group>"; };
-		B6A9281364AF5D3B581D374C /* ../src/TestUserShader2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestUserShader2.h; path = ../src/TestUserShader2.h; sourceTree = "<group>"; };
-		4013C6794AAE8DFC641D2870 /* ../src/example.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = example.h; path = ../src/example.h; sourceTree = "<group>"; };
-		22E408FD6FCDA6E7E8E76952 /* ../src/test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test.h; path = ../src/test.h; sourceTree = "<group>"; };
-		04FE4D4FB640E0DF92DFB865 /* ../data/demo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = demo; path = ../data/demo; sourceTree = "<group>"; };
-		7F3B12E3C9D554D9FE28101D /* ../data/ext */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = ext; path = ../data/ext; sourceTree = "<group>"; };
-		F6123B1E6FE4471A00F49751 /* ../data/images */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = images; path = ../data/images; sourceTree = "<group>"; };
-		5DE458993031811A4C7D28C1 /* ../data/light_fs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = light_fs.glsl; path = ../data/light_fs.glsl; sourceTree = "<group>"; };
-		BA41FC88D76540A6905224D6 /* ../data/light_vs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = light_vs.glsl; path = ../data/light_vs.glsl; sourceTree = "<group>"; };
-		2CE4BD5BB9DEF92439C0AB58 /* ../data/xmls */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = xmls; path = ../data/xmls; sourceTree = "<group>"; };
+		360377333740D8A2FD15BBE6 /* ../src/Counter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Counter.cpp; path = ../src/Counter.cpp; sourceTree = "<group>"; };
+		0BF9628FC8D38F9748F0CDEB /* ../src/entry_point.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = entry_point.cpp; path = ../src/entry_point.cpp; sourceTree = "<group>"; };
+		4DA100C319512824B7570663 /* ../src/example.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = example.cpp; path = ../src/example.cpp; sourceTree = "<group>"; };
+		04FE4D4FB640E0DF92DFB865 /* ../src/test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = test.cpp; path = ../src/test.cpp; sourceTree = "<group>"; };
+		7746CA7A63049ED8F7D6BF42 /* ../src/Counter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Counter.h; path = ../src/Counter.h; sourceTree = "<group>"; };
+		D954BD82D7708B65A08FB6B9 /* ../src/TestAlphaHitTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestAlphaHitTest.h; path = ../src/TestAlphaHitTest.h; sourceTree = "<group>"; };
+		BD0E956CC3A2F7EB94822B5C /* ../src/TestBox9Sprite.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestBox9Sprite.h; path = ../src/TestBox9Sprite.h; sourceTree = "<group>"; };
+		7623D793B59EF0CD569E6EC2 /* ../src/TestClipRect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestClipRect.h; path = ../src/TestClipRect.h; sourceTree = "<group>"; };
+		AFA30E959880563E6ABBBC4F /* ../src/TestCounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestCounter.h; path = ../src/TestCounter.h; sourceTree = "<group>"; };
+		B52CCD463855CF91A7FBDB8E /* ../src/TestDrag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestDrag.h; path = ../src/TestDrag.h; sourceTree = "<group>"; };
+		7EEFDEEC289FCBB5FA67F822 /* ../src/TestHttp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestHttp.h; path = ../src/TestHttp.h; sourceTree = "<group>"; };
+		4E9DE6A8FCBDF43BC876EC90 /* ../src/TestInputText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestInputText.h; path = ../src/TestInputText.h; sourceTree = "<group>"; };
+		8F2AFB956EEAEED67C5B7571 /* ../src/TestManageRes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestManageRes.h; path = ../src/TestManageRes.h; sourceTree = "<group>"; };
+		047F6BD19F885FF186A1447C /* ../src/TestMask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestMask.h; path = ../src/TestMask.h; sourceTree = "<group>"; };
+		C570FAEF487CD34B62389F89 /* ../src/TestPerf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestPerf.h; path = ../src/TestPerf.h; sourceTree = "<group>"; };
+		2418B9A339E6004913AF5980 /* ../src/TestPolygon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestPolygon.h; path = ../src/TestPolygon.h; sourceTree = "<group>"; };
+		CAD9D6A98986EA8082368448 /* ../src/TestProgressBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestProgressBar.h; path = ../src/TestProgressBar.h; sourceTree = "<group>"; };
+		67194AC90FEA68E7C96E6907 /* ../src/TestRender2Texture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestRender2Texture.h; path = ../src/TestRender2Texture.h; sourceTree = "<group>"; };
+		5AFC0664D7BA80AE2A75BF0E /* ../src/TestSliding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestSliding.h; path = ../src/TestSliding.h; sourceTree = "<group>"; };
+		12CAC42FDF06ABE860CFEA53 /* ../src/TestTexel2Pixel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTexel2Pixel.h; path = ../src/TestTexel2Pixel.h; sourceTree = "<group>"; };
+		0F4469FB587862663D529DC9 /* ../src/TestText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestText.h; path = ../src/TestText.h; sourceTree = "<group>"; };
+		B6A9281364AF5D3B581D374C /* ../src/TestTextureFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTextureFormat.h; path = ../src/TestTextureFormat.h; sourceTree = "<group>"; };
+		4013C6794AAE8DFC641D2870 /* ../src/TestTweenText.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTweenText.h; path = ../src/TestTweenText.h; sourceTree = "<group>"; };
+		22E408FD6FCDA6E7E8E76952 /* ../src/TestTweens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestTweens.h; path = ../src/TestTweens.h; sourceTree = "<group>"; };
+		C0253E2158DFD901AD4F8991 /* ../src/TestUserShader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestUserShader.h; path = ../src/TestUserShader.h; sourceTree = "<group>"; };
+		5BE09AD6F31291430F5FB3E0 /* ../src/TestUserShader2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TestUserShader2.h; path = ../src/TestUserShader2.h; sourceTree = "<group>"; };
+		01AAF6B516BCFD9887A9D77D /* ../src/example.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = example.h; path = ../src/example.h; sourceTree = "<group>"; };
+		B4059CD311FA2BF93FB2C895 /* ../src/test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = test.h; path = ../src/test.h; sourceTree = "<group>"; };
+		7F3B12E3C9D554D9FE28101D /* ../data/demo */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = demo; path = ../data/demo; sourceTree = "<group>"; };
+		F6123B1E6FE4471A00F49751 /* ../data/ext */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = ext; path = ../data/ext; sourceTree = "<group>"; };
+		5DE458993031811A4C7D28C1 /* ../data/images */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = images; path = ../data/images; sourceTree = "<group>"; };
+		BA41FC88D76540A6905224D6 /* ../data/light_fs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = light_fs.glsl; path = ../data/light_fs.glsl; sourceTree = "<group>"; };
+		2CE4BD5BB9DEF92439C0AB58 /* ../data/light_vs.glsl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = light_vs.glsl; path = ../data/light_vs.glsl; sourceTree = "<group>"; };
+		F196143B0370A9D348494ACC /* ../data/xmls */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = xmls; path = ../data/xmls; sourceTree = "<group>"; };
 
 		04A57D761871FFEB0068B1E5 /* oxygine_macosx.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = oxygine_macosx.xcodeproj; path = ../../..//oxygine/SDL/macosx/oxygine_macosx/oxygine_macosx.xcodeproj; sourceTree = "<group>"; };
 		04A57D7E1872012A0068B1E5 /* SDL.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SDL.xcodeproj; path = ../../../..//SDL/Xcode/SDL/SDL.xcodeproj; sourceTree = "<group>"; };
@@ -213,12 +218,12 @@
 		049B57381871FBE900EF3C66 /* Supporting Files */ = {
 			isa = PBXGroup;
 			children = (
-				04FE4D4FB640E0DF92DFB865 /* demo */, 
-				7F3B12E3C9D554D9FE28101D /* ext */, 
-				F6123B1E6FE4471A00F49751 /* images */, 
-				5DE458993031811A4C7D28C1 /* light_fs.glsl */, 
-				BA41FC88D76540A6905224D6 /* light_vs.glsl */, 
-				2CE4BD5BB9DEF92439C0AB58 /* xmls */, 
+				7F3B12E3C9D554D9FE28101D /* demo */, 
+				F6123B1E6FE4471A00F49751 /* ext */, 
+				5DE458993031811A4C7D28C1 /* images */, 
+				BA41FC88D76540A6905224D6 /* light_fs.glsl */, 
+				2CE4BD5BB9DEF92439C0AB58 /* light_vs.glsl */, 
+				F196143B0370A9D348494ACC /* xmls */, 
 
 				049B57391871FBE900EF3C66 /* Demo_macosx-Info.plist */,
 			);
@@ -228,30 +233,34 @@
 		04A57D391871FF8B0068B1E5 /* src */ = {
 			isa = PBXGroup;
 			children = (
-				360377333740D8A2FD15BBE6 /* entry_point.cpp */, 
-				0BF9628FC8D38F9748F0CDEB /* example.cpp */, 
-				4DA100C319512824B7570663 /* test.cpp */, 
-				F196143B0370A9D348494ACC /* TestAlphaHitTest.h */, 
-				7746CA7A63049ED8F7D6BF42 /* TestBox9Sprite.h */, 
-				D954BD82D7708B65A08FB6B9 /* TestClipRect.h */, 
-				BD0E956CC3A2F7EB94822B5C /* TestDrag.h */, 
-				7623D793B59EF0CD569E6EC2 /* TestHttp.h */, 
-				AFA30E959880563E6ABBBC4F /* TestInputText.h */, 
-				B52CCD463855CF91A7FBDB8E /* TestManageRes.h */, 
-				7EEFDEEC289FCBB5FA67F822 /* TestMask.h */, 
-				4E9DE6A8FCBDF43BC876EC90 /* TestPerf.h */, 
-				8F2AFB956EEAEED67C5B7571 /* TestPolygon.h */, 
-				047F6BD19F885FF186A1447C /* TestProgressBar.h */, 
-				C570FAEF487CD34B62389F89 /* TestRender2Texture.h */, 
-				2418B9A339E6004913AF5980 /* TestSliding.h */, 
-				CAD9D6A98986EA8082368448 /* TestTexel2Pixel.h */, 
-				67194AC90FEA68E7C96E6907 /* TestText.h */, 
-				5AFC0664D7BA80AE2A75BF0E /* TestTextureFormat.h */, 
-				12CAC42FDF06ABE860CFEA53 /* TestTweens.h */, 
-				0F4469FB587862663D529DC9 /* TestUserShader.h */, 
-				B6A9281364AF5D3B581D374C /* TestUserShader2.h */, 
-				4013C6794AAE8DFC641D2870 /* example.h */, 
-				22E408FD6FCDA6E7E8E76952 /* test.h */, 
+				360377333740D8A2FD15BBE6 /* Counter.cpp */, 
+				0BF9628FC8D38F9748F0CDEB /* entry_point.cpp */, 
+				4DA100C319512824B7570663 /* example.cpp */, 
+				04FE4D4FB640E0DF92DFB865 /* test.cpp */, 
+				7746CA7A63049ED8F7D6BF42 /* Counter.h */, 
+				D954BD82D7708B65A08FB6B9 /* TestAlphaHitTest.h */, 
+				BD0E956CC3A2F7EB94822B5C /* TestBox9Sprite.h */, 
+				7623D793B59EF0CD569E6EC2 /* TestClipRect.h */, 
+				AFA30E959880563E6ABBBC4F /* TestCounter.h */, 
+				B52CCD463855CF91A7FBDB8E /* TestDrag.h */, 
+				7EEFDEEC289FCBB5FA67F822 /* TestHttp.h */, 
+				4E9DE6A8FCBDF43BC876EC90 /* TestInputText.h */, 
+				8F2AFB956EEAEED67C5B7571 /* TestManageRes.h */, 
+				047F6BD19F885FF186A1447C /* TestMask.h */, 
+				C570FAEF487CD34B62389F89 /* TestPerf.h */, 
+				2418B9A339E6004913AF5980 /* TestPolygon.h */, 
+				CAD9D6A98986EA8082368448 /* TestProgressBar.h */, 
+				67194AC90FEA68E7C96E6907 /* TestRender2Texture.h */, 
+				5AFC0664D7BA80AE2A75BF0E /* TestSliding.h */, 
+				12CAC42FDF06ABE860CFEA53 /* TestTexel2Pixel.h */, 
+				0F4469FB587862663D529DC9 /* TestText.h */, 
+				B6A9281364AF5D3B581D374C /* TestTextureFormat.h */, 
+				4013C6794AAE8DFC641D2870 /* TestTweenText.h */, 
+				22E408FD6FCDA6E7E8E76952 /* TestTweens.h */, 
+				C0253E2158DFD901AD4F8991 /* TestUserShader.h */, 
+				5BE09AD6F31291430F5FB3E0 /* TestUserShader2.h */, 
+				01AAF6B516BCFD9887A9D77D /* example.h */, 
+				B4059CD311FA2BF93FB2C895 /* test.h */, 
 
 			);
 			name = src;
@@ -370,12 +379,12 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				1E839D002B2BA83FC83A695A /* demo */, 
-				3A631A475DE035FC53ADE5EA /* ext */, 
-				CD59C69314E9E74CD0A11E03 /* images */, 
-				EFF139F8BA484314F7AAF645 /* light_fs.glsl */, 
-				F2CFD518E4E2E05ECEDBB262 /* light_vs.glsl */, 
-				693088A7AB377368EE4A018E /* xmls */, 
+				3A631A475DE035FC53ADE5EA /* demo */, 
+				CD59C69314E9E74CD0A11E03 /* ext */, 
+				EFF139F8BA484314F7AAF645 /* images */, 
+				F2CFD518E4E2E05ECEDBB262 /* light_fs.glsl */, 
+				693088A7AB377368EE4A018E /* light_vs.glsl */, 
+				2B0FCA4EF2CDAB7EF6C6252E /* xmls */, 
 
 				049B574A1871FBE900EF3C66 /* Images.xcassets in Resources */,
 			);
@@ -388,9 +397,10 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				2DC477AC10D6C07B3FE008F6 /* entry_point.cpp */, 
-				DA49ED8903C628BA578C8670 /* example.cpp */, 
-				C8860D93875589970329DCCD /* test.cpp */, 
+				2DC477AC10D6C07B3FE008F6 /* Counter.cpp */, 
+				DA49ED8903C628BA578C8670 /* entry_point.cpp */, 
+				C8860D93875589970329DCCD /* example.cpp */, 
+				1E839D002B2BA83FC83A695A /* test.cpp */, 
 
 			);
 			runOnlyForDeploymentPostprocessing = 0;

+ 2 - 2
examples/Demo/proj.win32/Demo_vs2010.sln → examples/Demo/proj.win32/Demo.sln

@@ -1,9 +1,9 @@
 
 Microsoft Visual Studio Solution File, Format Version 11.00
 # Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo_vs2010", "Demo_vs2010.vcxproj", "{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo", "Demo.vcxproj", "{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "{project}", "../../../\oxygine\SDL\win32\oxygine_vs2010.vcxproj", "{52411305-CFE1-4FA8-9885-5729BFC816CF}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Oxygine", "../../../\oxygine\SDL\win32\oxygine.vcxproj", "{52411305-CFE1-4FA8-9885-5729BFC816CF}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution

+ 57 - 8
examples/Demo/proj.win32/Demo_vs2010.vcxproj → examples/Demo/proj.win32/Demo.vcxproj

@@ -21,12 +21,26 @@
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>true</UseDebugLibraries>
     <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '10.0'">v100</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0'">v110</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v110_xp</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v120_xp</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v140_xp</PlatformToolset>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <WholeProgramOptimization>true</WholeProgramOptimization>
     <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '10.0'">v100</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0'">v110</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '11.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v110_xp</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v120_xp</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
+    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0' and exists('$(MSBuildProgramFiles32)\Microsoft SDKs\Windows\v7.1A')">v140_xp</PlatformToolset>
   </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
@@ -38,6 +52,12 @@
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
+  <PropertyGroup>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Configuration)_$(PlatformToolset)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Configuration)_$(PlatformToolset)\</IntDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Configuration)_$(PlatformToolset)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Configuration)_$(PlatformToolset)\</IntDir>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <LinkIncremental>false</LinkIncremental>
   </PropertyGroup>
@@ -56,9 +76,10 @@
     <Link>
       <SubSystem>Windows</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>libcurl_imp.lib;ws2_32.lib;libjpeg.lib;libpng.lib;libzlib.lib;opengl32.lib;pthreadVCE2.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>libcurl_imp.lib;libjpeg.lib;libpng.lib;libzlib.lib;opengl32.lib;pthreadVCE2.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies Condition="'$(VisualStudioVersion)' == '14.0'">libcurl_imp.lib;libjpeg-2015.lib;libpng-2015.lib;libzlib.lib;opengl32.lib;pthreadVCE2.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <AdditionalLibraryDirectories>../../..//oxygine/third_party/win32/libraries;../../..//libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalOptions>/ignore:4217 /ignore:4049 %(AdditionalOptions)</AdditionalOptions>
+      <AdditionalOptions>/ignore:4099 /ignore:4204 %(AdditionalOptions)</AdditionalOptions>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -78,20 +99,48 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalLibraryDirectories>../../..//oxygine/third_party/win32/libraries;../../..//libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>libcurl_imp.lib;ws2_32.lib;libjpeg.lib;libpng.lib;libzlib.lib;opengl32.lib;pthreadVCE2.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalOptions>/ignore:4217 /ignore:4049 %(AdditionalOptions)</AdditionalOptions>
+      <AdditionalDependencies>libcurl_imp.lib;libjpeg.lib;libpng.lib;libzlib.lib;opengl32.lib;pthreadVCE2.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies Condition="'$(VisualStudioVersion)' == '14.0'">libcurl_imp.lib;libjpeg-2015.lib;libpng-2015.lib;libzlib.lib;opengl32.lib;pthreadVCE2.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
     </Link>
   </ItemDefinitionGroup>
-  <ItemGroup>    
-    <ProjectReference Include="../../../\oxygine\SDL\win32\oxygine_vs2010.vcxproj">
+  <ItemGroup>
+    <ProjectReference Include="../../../\oxygine\SDL\win32\oxygine.vcxproj">
       <Project>{52411305-cfe1-4fa8-9885-5729bfc816cf}</Project>
     </ProjectReference>
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="../src/entry_point.cpp" /><ClCompile Include="../src/example.cpp" /><ClCompile Include="../src/test.cpp" />
+    <ClCompile Include="../src/Counter.cpp" />
+    <ClCompile Include="../src/entry_point.cpp" />
+    <ClCompile Include="../src/example.cpp" />
+    <ClCompile Include="../src/test.cpp" />
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="../src/TestAlphaHitTest.h" /><ClInclude Include="../src/TestBox9Sprite.h" /><ClInclude Include="../src/TestClipRect.h" /><ClInclude Include="../src/TestDrag.h" /><ClInclude Include="../src/TestHttp.h" /><ClInclude Include="../src/TestInputText.h" /><ClInclude Include="../src/TestManageRes.h" /><ClInclude Include="../src/TestMask.h" /><ClInclude Include="../src/TestPerf.h" /><ClInclude Include="../src/TestPolygon.h" /><ClInclude Include="../src/TestProgressBar.h" /><ClInclude Include="../src/TestRender2Texture.h" /><ClInclude Include="../src/TestSliding.h" /><ClInclude Include="../src/TestTexel2Pixel.h" /><ClInclude Include="../src/TestText.h" /><ClInclude Include="../src/TestTextureFormat.h" /><ClInclude Include="../src/TestTweens.h" /><ClInclude Include="../src/TestUserShader.h" /><ClInclude Include="../src/TestUserShader2.h" /><ClInclude Include="../src/example.h" /><ClInclude Include="../src/test.h" />
+    <ClInclude Include="../src/Counter.h" />
+    <ClInclude Include="../src/TestAlphaHitTest.h" />
+    <ClInclude Include="../src/TestBox9Sprite.h" />
+    <ClInclude Include="../src/TestClipRect.h" />
+    <ClInclude Include="../src/TestCounter.h" />
+    <ClInclude Include="../src/TestDrag.h" />
+    <ClInclude Include="../src/TestHttp.h" />
+    <ClInclude Include="../src/TestInputText.h" />
+    <ClInclude Include="../src/TestManageRes.h" />
+    <ClInclude Include="../src/TestMask.h" />
+    <ClInclude Include="../src/TestPerf.h" />
+    <ClInclude Include="../src/TestPolygon.h" />
+    <ClInclude Include="../src/TestProgressBar.h" />
+    <ClInclude Include="../src/TestRender2Texture.h" />
+    <ClInclude Include="../src/TestSliding.h" />
+    <ClInclude Include="../src/TestTexel2Pixel.h" />
+    <ClInclude Include="../src/TestText.h" />
+    <ClInclude Include="../src/TestTextureFormat.h" />
+    <ClInclude Include="../src/TestTweenShine.h" />
+    <ClInclude Include="../src/TestTweenText.h" />
+    <ClInclude Include="../src/TestTweens.h" />
+    <ClInclude Include="../src/TestUserShader.h" />
+    <ClInclude Include="../src/TestUserShader2.h" />
+    <ClInclude Include="../src/example.h" />
+    <ClInclude Include="../src/test.h" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 108 - 0
examples/Demo/proj.win32/Demo.vcxproj.filters

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="../src/Counter.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="../src/entry_point.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="../src/example.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="../src/test.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="../src/Counter.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestAlphaHitTest.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestBox9Sprite.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestClipRect.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestCounter.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestDrag.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestHttp.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestInputText.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestManageRes.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestMask.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestPerf.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestPolygon.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestProgressBar.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestRender2Texture.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestSliding.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestTexel2Pixel.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestText.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestTextureFormat.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestTweenShine.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestTweenText.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestTweens.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestUserShader.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/TestUserShader2.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/example.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="../src/test.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>

+ 0 - 13
examples/Demo/proj.win32/Demo_vs2010.vcxproj.user

@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LocalDebuggerWorkingDirectory>../data</LocalDebuggerWorkingDirectory>
-    <LocalDebuggerEnvironment>PATH=../data;%PATH%;</LocalDebuggerEnvironment>
-    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LocalDebuggerWorkingDirectory>../data</LocalDebuggerWorkingDirectory>
-    <LocalDebuggerEnvironment>PATH=../data;%PATH%;</LocalDebuggerEnvironment>
-    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
-   </PropertyGroup>
-</Project>

+ 0 - 49
examples/Demo/proj.win32/Demo_vs2013.sln

@@ -1,49 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2013
-VisualStudioVersion = 12.0.21005.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Demo_vs2013", "Demo_vs2013.vcxproj", "{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "{project}", "../../../\oxygine\SDL\win32\oxygine_vs2013.vcxproj", "{52411305-CFE1-4FA8-9885-5729BFC816CF}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		Debug|x64 = Debug|x64
-		Release|Win32 = Release|Win32
-		Release|x64 = Release|x64
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}.Debug|Win32.ActiveCfg = Debug|Win32
-		{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}.Debug|Win32.Build.0 = Debug|Win32
-		{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}.Debug|x64.ActiveCfg = Debug|Win32
-		{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}.Release|Win32.ActiveCfg = Release|Win32
-		{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}.Release|Win32.Build.0 = Release|Win32
-		{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}.Release|x64.ActiveCfg = Release|Win32
-		{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.ActiveCfg = Debug|Win32
-		{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|Win32.Build.0 = Debug|Win32
-		{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.ActiveCfg = Debug|x64
-		{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Debug|x64.Build.0 = Debug|x64
-		{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.ActiveCfg = Release|Win32
-		{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|Win32.Build.0 = Release|Win32
-		{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.ActiveCfg = Release|x64
-		{81CE8DAF-EBB2-4761-8E45-B71ABCCA8C68}.Release|x64.Build.0 = Release|x64
-		{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Win32.ActiveCfg = Debug|Win32
-		{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|Win32.Build.0 = Debug|Win32
-		{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|x64.ActiveCfg = Debug|x64
-		{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Debug|x64.Build.0 = Debug|x64
-		{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Win32.ActiveCfg = Release|Win32
-		{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|Win32.Build.0 = Release|Win32
-		{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|x64.ActiveCfg = Release|x64
-		{DA956FD3-E142-46F2-9DD5-C78BEBB56B7A}.Release|x64.Build.0 = Release|x64
-		{52411305-CFE1-4FA8-9885-5729BFC816CF}.Debug|Win32.ActiveCfg = Debug|Win32
-		{52411305-CFE1-4FA8-9885-5729BFC816CF}.Debug|Win32.Build.0 = Debug|Win32
-		{52411305-CFE1-4FA8-9885-5729BFC816CF}.Debug|x64.ActiveCfg = Debug|Win32
-		{52411305-CFE1-4FA8-9885-5729BFC816CF}.Release|Win32.ActiveCfg = Release|Win32
-		{52411305-CFE1-4FA8-9885-5729BFC816CF}.Release|Win32.Build.0 = Release|Win32
-		{52411305-CFE1-4FA8-9885-5729BFC816CF}.Release|x64.ActiveCfg = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal

+ 0 - 101
examples/Demo/proj.win32/Demo_vs2013.vcxproj

@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{2B4D7491-A4F8-4606-B0E3-2A1FCE3C46C4}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>Demo</RootNamespace>
-    <ProjectName>Demo</ProjectName>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>true</UseDebugLibraries>
-    <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v120</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <UseDebugLibraries>false</UseDebugLibraries>
-    <WholeProgramOptimization>true</WholeProgramOptimization>
-    <CharacterSet>Unicode</CharacterSet>
-    <PlatformToolset>v120</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LinkIncremental>false</LinkIncremental>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <ClCompile>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <WarningLevel>Level3</WarningLevel>
-      <Optimization>Disabled</Optimization>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>../../..//oxygine/src;../../../..//SDL/include;../../..//oxygine/third_party/win32/pthreads/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>libcurl_imp.lib;ws2_32.lib;libjpeg.lib;libpng.lib;libzlib.lib;opengl32.lib;pthreadVCE2.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalLibraryDirectories>../../..//oxygine/third_party/win32/libraries;../../..//libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalOptions>/ignore:4217 /ignore:4049 %(AdditionalOptions)</AdditionalOptions>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <ClCompile>
-      <WarningLevel>Level3</WarningLevel>
-      <PrecompiledHeader>
-      </PrecompiledHeader>
-      <Optimization>MaxSpeed</Optimization>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <AdditionalIncludeDirectories>../../..//oxygine/src;../../../..//SDL/include;../../..//oxygine/third_party/win32/pthreads/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-    </ClCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalLibraryDirectories>../../..//oxygine/third_party/win32/libraries;../../..//libs;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>libcurl_imp.lib;ws2_32.lib;libjpeg.lib;libpng.lib;libzlib.lib;opengl32.lib;pthreadVCE2.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies>
-      <AdditionalOptions>/ignore:4217 /ignore:4049 %(AdditionalOptions)</AdditionalOptions>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>    
-    <ProjectReference Include="../../../\oxygine\SDL\win32\oxygine_vs2013.vcxproj">
-      <Project>{52411305-cfe1-4fa8-9885-5729bfc816cf}</Project>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="../src/entry_point.cpp" /><ClCompile Include="../src/example.cpp" /><ClCompile Include="../src/test.cpp" />
-  </ItemGroup>
-  <ItemGroup>
-    <ClInclude Include="../src/TestAlphaHitTest.h" /><ClInclude Include="../src/TestBox9Sprite.h" /><ClInclude Include="../src/TestClipRect.h" /><ClInclude Include="../src/TestDrag.h" /><ClInclude Include="../src/TestHttp.h" /><ClInclude Include="../src/TestInputText.h" /><ClInclude Include="../src/TestManageRes.h" /><ClInclude Include="../src/TestMask.h" /><ClInclude Include="../src/TestPerf.h" /><ClInclude Include="../src/TestPolygon.h" /><ClInclude Include="../src/TestProgressBar.h" /><ClInclude Include="../src/TestRender2Texture.h" /><ClInclude Include="../src/TestSliding.h" /><ClInclude Include="../src/TestTexel2Pixel.h" /><ClInclude Include="../src/TestText.h" /><ClInclude Include="../src/TestTextureFormat.h" /><ClInclude Include="../src/TestTweens.h" /><ClInclude Include="../src/TestUserShader.h" /><ClInclude Include="../src/TestUserShader2.h" /><ClInclude Include="../src/example.h" /><ClInclude Include="../src/test.h" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>

+ 0 - 13
examples/Demo/proj.win32/Demo_vs2013.vcxproj.user

@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <LocalDebuggerWorkingDirectory>../data</LocalDebuggerWorkingDirectory>
-    <LocalDebuggerEnvironment>PATH=../data;%PATH%;</LocalDebuggerEnvironment>
-    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <LocalDebuggerWorkingDirectory>../data</LocalDebuggerWorkingDirectory>
-    <LocalDebuggerEnvironment>PATH=../data;%PATH%;</LocalDebuggerEnvironment>
-    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
-   </PropertyGroup>
-</Project>

+ 192 - 0
examples/Demo/src/Counter.cpp

@@ -0,0 +1,192 @@
+#include "Counter.h"
+#include "utils/stringUtils.h"
+#include "Sprite.h"
+#include "res/Resources.h"
+
+DECLARE_SMART(Number, spNumber);
+class Number : public Actor
+{
+public:
+    enum { ADDED = eventID('N', 'm', 'T', 'r') };
+    Number(const Vector2& size, int pos) : _current(0), _pos(pos), _running(false)
+    {
+        _line = new Actor;
+        _line->setUserData(this);
+        addChild(_line);
+        setSize(size);
+
+    }
+
+    int getPos() const { return _pos; }
+
+    void setActor(int n, spActor a)
+    {
+        _sprites[n] = a;
+        a->setUserData((void*)n);
+    }
+
+    int getCurrent() const
+    {
+        return _current;
+    }
+
+    spTween add()
+    {
+        OX_ASSERT(_running == false);
+
+        _running = true;
+        int next = (_current + 1) % 10;
+        spActor actor = _sprites[next];
+        push(actor);
+        float offset = getHeight();
+        spTween tween = _line->addTween(Actor::TweenY(-offset), 500, 1, false, 0, Tween::ease_inOutCubic);
+        tween->setDoneCallback(CLOSURE(this, &Number::done));
+
+        return tween;
+    }
+
+    void done(Event*)
+    {
+        _running = false;
+        _line->removeChild(_line->getFirstChild());
+        _line->setY(0);
+        _line->getFirstChild()->setY(0);
+        _current = (_current + 1) % 10;
+    }
+
+
+    float push(spActor s)
+    {
+        spActor last = _line->getLastChild();
+        if (last)
+            s->setY(last->getY() + getHeight());
+        else
+            s->setY(0.0f);
+
+        s->setX(getWidth() / 2 - s->getWidth() / 2);
+
+        _line->addChild(s);
+
+        return last ? last->getHeight() : getHeight();
+    }
+
+    void reset()
+    {
+        _running = false;
+        _line->removeChildren();
+        _line->removeTweens();
+        _line->setPosition(0, 0);
+        _current = 0;
+
+        if (_pos != 0)
+        {
+            spActor a = new Actor;
+            a->setSize(getSize());
+            push(a);
+        }
+        else
+        {
+            push(_sprites[0]);
+        }
+    }
+
+private:
+    spActor _line;
+    spActor _sprites[10];
+
+    int _current;
+    int _pos;
+    bool _running;
+};
+
+
+Counter::Counter()
+{
+
+}
+
+Counter::~Counter()
+{
+
+}
+
+void Counter::init(const Resources* res, float numberWidth)
+{
+    _dest = 0;
+    _src = 0;
+    _running = false;
+
+    Vector2 sz(numberWidth, getHeight());
+    for (int n = 0; n < NUM; ++n)
+    {
+        spNumber num = new Number(sz, n);
+        _numbers[n] = num;
+        addChild(num);
+        num->setPosition(getWidth() - sz.x - n * sz.x + 5, 10);
+
+        for (int i = 0; i < 10; ++i)
+        {
+            spSprite v = new Sprite;
+
+            char name[32];
+            safe_sprintf(name, "n%d", i);
+            ResAnim* rs = res->getResAnim(name);
+
+            v->setResAnim(rs);
+
+            num->setActor(i, v);
+        }
+    }
+}
+
+void Counter::add()
+{
+    if (_running)
+        return;
+
+    _running = true;
+
+    spNumber n = _numbers[0];
+    while (n->getCurrent() == 9)
+    {
+        n = _numbers[n->getPos() + 1];
+        n->add();
+    }
+
+    _numbers[0]->add()->addDoneCallback(CLOSURE(this, &Counter::added));
+}
+
+void Counter::added(Event* e)
+{
+    _running = false;
+
+    _src++;
+    if (_src == _dest)
+        return;
+
+    add();
+}
+
+void Counter::setValue(int v)
+{
+    if (v == _dest)
+        return;
+
+    _dest = v;
+    add();
+}
+
+int  Counter::getValue() const
+{
+    return _dest;
+}
+
+void Counter::reset()
+{
+    _running = false;
+    _src = 0;
+    _dest = 0;
+
+    for (int n = 0; n < NUM; ++n)
+        _numbers[n]->reset();
+}

+ 33 - 0
examples/Demo/src/Counter.h

@@ -0,0 +1,33 @@
+#pragma once
+#include "ClipRectActor.h"
+#include "res/Resources.h"
+
+using namespace oxygine;
+
+
+DECLARE_SMART(Number, spNumber);
+DECLARE_SMART(Counter, spCounter);
+
+class Counter: public ClipRectActor
+{
+public:
+    Counter();
+    ~Counter();
+
+    void init(const Resources* res, float numberWidth);
+
+    void reset();
+
+    void setValue(int v);
+    int  getValue() const;
+
+protected:
+    void added(Event*);
+    void add();
+    enum { NUM = 8 };
+
+    int _dest;
+    int _src;
+    spNumber _numbers[NUM];
+    bool _running;
+};

+ 28 - 0
examples/Demo/src/TestCounter.h

@@ -0,0 +1,28 @@
+#pragma once
+#include "test.h"
+#include "Counter.h"
+
+class TestCounter: public Test
+{
+public:
+    TestCounter()
+    {
+        spSprite bg = new Sprite;
+        bg->setResAnim(resources.getResAnim("score_table"));
+        bg->setPosition(getStage()->getSize() / 2 - bg->getSize() / 2);
+        content->addChild(bg);
+
+
+        //Thanks to Dmitry Volokitin for Counter class  source code and assets used in this Test
+
+        counter = new Counter;
+        counter->setSize(702, 80);
+        counter->init(&resources, 88);
+        counter->reset();
+        counter->setValue(1000);
+        counter->setPosition(bg->getPosition() + Vector2(25, 20));
+        content->addChild(counter);
+    }
+
+    spCounter counter;
+};

+ 1 - 1
examples/Demo/src/TestPolygon.h

@@ -58,7 +58,7 @@ public:
         float rad = getRoot()->getHeight() * 0.4f * (1 + scalar::sin(theta * 10) / 10);
         Vector2 p = dir * rad;
 
-        Color c = interpolate(Color(Color::Lime), Color(Color::Red), scalar::abs(scalar::sin(theta * 3)));
+        Color c = lerp(Color(Color::Lime), Color(Color::Red), scalar::abs(scalar::sin(theta * 3)));
         return initVertex(p, c.rgba());
     }
 

+ 69 - 0
examples/Demo/src/TestTweenShine.h

@@ -0,0 +1,69 @@
+#pragma once
+#include "test.h"
+#include "TextField.h"
+#include "utils/stringUtils.h"
+
+class TweenShine: public Tween
+{
+public:
+
+    TweenShine()
+    {
+    }
+
+    void _loopDone(Actor& actor, const UpdateState& us) OVERRIDE
+    {
+        for (int i = 0; i < 5; ++i)
+        {
+            Vector2 pos;
+            pos.x = scalar::randFloat(0, actor.getWidth());
+            pos.y = scalar::randFloat(0, actor.getHeight());
+
+            if (!actor.isOn(pos))
+                continue;
+
+            spSprite sprite = new Sprite;
+            sprite->setResAnim(resources.getResAnim("snow"));
+            sprite->setAnchor(0.5f, 0.5f);
+            sprite->setPosition(pos);
+            //sprite->setAlpha(0);
+            sprite->setScale(0.5f);
+            sprite->addTween(Actor::TweenScale(1.5f), 500, 1, false, 0, Tween::ease_inBack);
+            sprite->addTween(Actor::TweenAlpha(0), TweenOptions(500).delay(800).detach(true));
+            actor.addChild(sprite);
+            //break;
+        }
+    }
+
+    static spTween create(int duration, int loops)
+    {
+        spTween t = new TweenShine;
+        t->setDuration(duration);
+        t->setLoops(loops);
+        return t;
+    }
+};
+
+
+class TestTweenShine: public Test
+{
+public:
+    spSprite sprite;
+    TestTweenShine()
+    {
+        sprite = new Sprite;
+        sprite->setResAnim(resources.getResAnim("flower"));
+        sprite->attachTo(content);
+        //sprite->setAnchor(0.5f, 0.5f);
+        sprite->setPosition(content->getSize() / 2 - sprite->getSize() / 2);
+
+        sprite->addTween(TweenShine::create(10, 300));
+
+        addButton("shine", "shine");
+    }
+
+    void clicked(string id)
+    {
+        sprite->addTween(TweenShine::create(10, 300));
+    }
+};

+ 55 - 0
examples/Demo/src/TestTweenText.h

@@ -0,0 +1,55 @@
+#pragma once
+#include "test.h"
+#include "TextField.h"
+#include "utils/stringUtils.h"
+
+class TweenText
+{
+public:
+    typedef TextField type;
+
+    TweenText(const string& text)
+    {
+        //convert utf8 string to wide string
+        _text = utf8tows(text.c_str());
+    }
+
+    void init(TextField& actor) {}
+    void update(TextField& actor, float p, const UpdateState& us)
+    {
+        int v = lerp<int>(0, _text.size(), p);
+        wstring res = _text.substr(0, v) + L"<div c = '0x00000000'>" + _text.substr(v, _text.size()) + L"</div>";
+
+        //convert back to utf8 string
+        string t = ws2utf8(res.c_str());
+        actor.setHtmlText(t);
+    }
+
+private:
+    wstring _text;
+
+};
+
+
+class TestTweenText : public Test
+{
+public:
+    TestTweenText()
+    {
+        spTextField text = new TextField;
+        content->addChild(text);
+
+        TextStyle st;
+        st.font = resourcesUI.getResFont("big")->getFont();
+        st.vAlign = TextStyle::VALIGN_MIDDLE;
+        st.hAlign = TextStyle::HALIGN_MIDDLE;
+        st.multiline = true;
+        text->setStyle(st);
+        text->setHeight(getHeight());
+        text->setWidth(300);
+        text->setX(getWidth() / 2 - 150);
+
+        text->addTween(TweenText("The quick brown fox jumps over the lazy dog. 1234567890. The quick brown fox jumps over the lazy dog. 1234567890. The quick brown fox jumps over the lazy dog. 1234567890. The quick brown fox jumps over the lazy dog. 1234567890. "),
+                       8000, -1, true);
+    }
+};

+ 27 - 0
examples/Demo/src/example.cpp

@@ -20,6 +20,9 @@
 #include "TestInputText.h"
 #include "TestHttp.h"
 #include "TestAlphaHitTest.h"
+#include "TestCounter.h"
+#include "TestTweenText.h"
+#include "TestTweenShine.h"
 
 #ifdef __S3E__
 #include "s3eKeyboard.h"
@@ -70,6 +73,15 @@ public:
         addButton("inputtext", "Input Text");
         addButton("openbrowser", "Open Browser");
         addButton("http", "Http requests");
+
+        _color = Color::Red;
+        _txtColor = Color::White;
+
+        _y = 5;
+        _x += 200;
+        addButton("counter", "Counter");
+        addButton("tweentext", "Tween Text");
+        addButton("tweenshine", "Tween Shine");
     }
 
     void showTest(spActor actor)
@@ -183,6 +195,21 @@ public:
         {
             showTest(new TestHttp);
         }
+
+        if (id == "counter")
+        {
+            showTest(new TestCounter);
+        }
+
+        if (id == "tweentext")
+        {
+            showTest(new TestTweenText);
+        }
+
+        if (id == "tweenshine")
+        {
+            showTest(new TestTweenShine);
+        }
     }
 };
 

+ 10 - 5
examples/Demo/src/test.cpp

@@ -48,13 +48,15 @@ public:
     std::vector<Test::toggle> _items;
 };
 
-spTextField createText(std::string txt)
+Color textColor(72, 61, 139, 255);
+
+spTextField createText(const std::string& txt)
 {
     spTextField text = new TextField();
 
     TextStyle style;
     style.font = Test::resourcesUI.getResFont("main")->getFont();
-    style.color = Color(72, 61, 139, 255);
+    style.color = textColor;
     style.vAlign = TextStyle::VALIGN_MIDDLE;
     style.hAlign = TextStyle::HALIGN_CENTER;
     style.multiline = true;
@@ -65,7 +67,7 @@ spTextField createText(std::string txt)
     return text;
 }
 
-spButton createButtonHelper(spButton button, string txt, EventCallback cb)
+spButton createButtonHelper(spButton button, const std::string& txt, EventCallback cb)
 {
     button->setPriority(10);
     //button->setName(id);
@@ -81,7 +83,7 @@ spButton createButtonHelper(spButton button, string txt, EventCallback cb)
 }
 
 
-Test::Test()
+Test::Test() : _color(Color::White), _txtColor(72, 61, 139, 255)
 {
     setSize(getStage()->getSize());
 
@@ -113,18 +115,21 @@ Test::~Test()
 
 spButton Test::addButton(std::string id, std::string txt)
 {
+    textColor = _txtColor;
     spButton button = createButtonHelper(new Button, txt, CLOSURE(this, &Test::_clicked));
     initActor(button.get(),
               arg_name = id,
               arg_attachTo = ui,
               arg_anchor = Vector2(0.5f, 0.0f),
               arg_pos = Vector2(_x, _y));
+    button->setColor(_color);
+    textColor = Color(72, 61, 139, 255);
 
     _y += button->getHeight() + 2.0f;
 
     if (_y + button->getHeight() >= getHeight())
     {
-        _y = 0;
+        _y = 5;
         _x += button->getWidth() + 70;
     }
 

+ 6 - 1
examples/Demo/src/test.h

@@ -3,11 +3,13 @@
 #include "Button.h"
 #include "RenderState.h"
 #include "STDRenderer.h"
+#include "TextField.h"
 using namespace oxygine;
 using namespace std;
 
 
-spButton createButtonHelper(spButton, std::string txt, EventCallback cb);
+spTextField createText(const std::string& txt);
+spButton createButtonHelper(spButton, const std::string& txt, EventCallback cb);
 
 class Content: public Actor
 {
@@ -64,6 +66,9 @@ public:
 protected:
     void notifyDone(Event* ev);
 
+    Color _color;
+    Color _txtColor;
+
     float _x;
     float _y;
     spActor ui;

+ 193 - 0
examples/DemoBox2D/box2d/Box2D/Collision/Shapes/b2ChainShape.cpp

@@ -0,0 +1,193 @@
+/*
+* 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 <Box2D/Collision/Shapes/b2ChainShape.h>
+#include <Box2D/Collision/Shapes/b2EdgeShape.h>
+#include <new>
+#include <string.h>
+
+b2ChainShape::~b2ChainShape()
+{
+	Clear();
+}
+
+void b2ChainShape::Clear()
+{
+	b2Free(m_vertices);
+	m_vertices = NULL;
+	m_count = 0;
+}
+
+void b2ChainShape::CreateLoop(const b2Vec2* vertices, int32 count)
+{
+	b2Assert(m_vertices == NULL && m_count == 0);
+	b2Assert(count >= 3);
+	for (int32 i = 1; i < count; ++i)
+	{
+		b2Vec2 v1 = vertices[i-1];
+		b2Vec2 v2 = vertices[i];
+		// If the code crashes here, it means your vertices are too close together.
+		b2Assert(b2DistanceSquared(v1, v2) > b2_linearSlop * b2_linearSlop);
+	}
+
+	m_count = count + 1;
+	m_vertices = (b2Vec2*)b2Alloc(m_count * sizeof(b2Vec2));
+	memcpy(m_vertices, vertices, count * sizeof(b2Vec2));
+	m_vertices[count] = m_vertices[0];
+	m_prevVertex = m_vertices[m_count - 2];
+	m_nextVertex = m_vertices[1];
+	m_hasPrevVertex = true;
+	m_hasNextVertex = true;
+}
+
+void b2ChainShape::CreateChain(const b2Vec2* vertices, int32 count)
+{
+	b2Assert(m_vertices == NULL && m_count == 0);
+	b2Assert(count >= 2);
+	for (int32 i = 1; i < count; ++i)
+	{
+		// If the code crashes here, it means your vertices are too close together.
+		b2Assert(b2DistanceSquared(vertices[i-1], vertices[i]) > b2_linearSlop * b2_linearSlop);
+	}
+
+	m_count = count;
+	m_vertices = (b2Vec2*)b2Alloc(count * sizeof(b2Vec2));
+	memcpy(m_vertices, vertices, m_count * sizeof(b2Vec2));
+
+	m_hasPrevVertex = false;
+	m_hasNextVertex = false;
+
+	m_prevVertex.SetZero();
+	m_nextVertex.SetZero();
+}
+
+void b2ChainShape::SetPrevVertex(const b2Vec2& prevVertex)
+{
+	m_prevVertex = prevVertex;
+	m_hasPrevVertex = true;
+}
+
+void b2ChainShape::SetNextVertex(const b2Vec2& nextVertex)
+{
+	m_nextVertex = nextVertex;
+	m_hasNextVertex = true;
+}
+
+b2Shape* b2ChainShape::Clone(b2BlockAllocator* allocator) const
+{
+	void* mem = allocator->Allocate(sizeof(b2ChainShape));
+	b2ChainShape* clone = new (mem) b2ChainShape;
+	clone->CreateChain(m_vertices, m_count);
+	clone->m_prevVertex = m_prevVertex;
+	clone->m_nextVertex = m_nextVertex;
+	clone->m_hasPrevVertex = m_hasPrevVertex;
+	clone->m_hasNextVertex = m_hasNextVertex;
+	return clone;
+}
+
+int32 b2ChainShape::GetChildCount() const
+{
+	// edge count = vertex count - 1
+	return m_count - 1;
+}
+
+void b2ChainShape::GetChildEdge(b2EdgeShape* edge, int32 index) const
+{
+	b2Assert(0 <= index && index < m_count - 1);
+	edge->m_type = b2Shape::e_edge;
+	edge->m_radius = m_radius;
+
+	edge->m_vertex1 = m_vertices[index + 0];
+	edge->m_vertex2 = m_vertices[index + 1];
+
+	if (index > 0)
+	{
+		edge->m_vertex0 = m_vertices[index - 1];
+		edge->m_hasVertex0 = true;
+	}
+	else
+	{
+		edge->m_vertex0 = m_prevVertex;
+		edge->m_hasVertex0 = m_hasPrevVertex;
+	}
+
+	if (index < m_count - 2)
+	{
+		edge->m_vertex3 = m_vertices[index + 2];
+		edge->m_hasVertex3 = true;
+	}
+	else
+	{
+		edge->m_vertex3 = m_nextVertex;
+		edge->m_hasVertex3 = m_hasNextVertex;
+	}
+}
+
+bool b2ChainShape::TestPoint(const b2Transform& xf, const b2Vec2& p) const
+{
+	B2_NOT_USED(xf);
+	B2_NOT_USED(p);
+	return false;
+}
+
+bool b2ChainShape::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 b2ChainShape::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 b2ChainShape::ComputeMass(b2MassData* massData, float32 density) const
+{
+	B2_NOT_USED(density);
+
+	massData->mass = 0.0f;
+	massData->center.SetZero();
+	massData->I = 0.0f;
+}

+ 105 - 0
examples/DemoBox2D/box2d/Box2D/Collision/Shapes/b2ChainShape.h

@@ -0,0 +1,105 @@
+/*
+* 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_CHAIN_SHAPE_H
+#define B2_CHAIN_SHAPE_H
+
+#include <Box2D/Collision/Shapes/b2Shape.h>
+
+class b2EdgeShape;
+
+/// A chain shape is a free form sequence of line segments.
+/// The chain has two-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.
+/// Connectivity information is used to create smooth collisions.
+/// WARNING: The chain will not collide properly if there are self-intersections.
+class b2ChainShape : public b2Shape
+{
+public:
+	b2ChainShape();
+
+	/// The destructor frees the vertices using b2Free.
+	~b2ChainShape();
+
+	/// Clear all data.
+	void Clear();
+
+	/// Create a loop. This automatically adjusts connectivity.
+	/// @param vertices an array of vertices, these are copied
+	/// @param count the vertex count
+	void CreateLoop(const b2Vec2* vertices, int32 count);
+
+	/// Create a chain with isolated end vertices.
+	/// @param vertices an array of vertices, these are copied
+	/// @param count the vertex count
+	void CreateChain(const b2Vec2* vertices, int32 count);
+
+	/// Establish connectivity to a vertex that precedes the first vertex.
+	/// Don't call this for loops.
+	void SetPrevVertex(const b2Vec2& prevVertex);
+
+	/// Establish connectivity to a vertex that follows the last vertex.
+	/// Don't call this for loops.
+	void SetNextVertex(const b2Vec2& nextVertex);
+
+	/// 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;
+
+	/// The vertices. Owned by this class.
+	b2Vec2* m_vertices;
+
+	/// The vertex count.
+	int32 m_count;
+
+	b2Vec2 m_prevVertex, m_nextVertex;
+	bool m_hasPrevVertex, m_hasNextVertex;
+};
+
+inline b2ChainShape::b2ChainShape()
+{
+	m_type = e_chain;
+	m_radius = b2_polygonRadius;
+	m_vertices = NULL;
+	m_count = 0;
+	m_hasPrevVertex = false;
+	m_hasNextVertex = false;
+}
+
+#endif

+ 53 - 0
examples/DemoBox2D/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.cpp

@@ -0,0 +1,53 @@
+/*
+* 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 <Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h>
+#include <Box2D/Common/b2BlockAllocator.h>
+#include <Box2D/Dynamics/b2Fixture.h>
+#include <Box2D/Collision/Shapes/b2ChainShape.h>
+#include <Box2D/Collision/Shapes/b2EdgeShape.h>
+
+#include <new>
+
+b2Contact* b2ChainAndCircleContact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator)
+{
+	void* mem = allocator->Allocate(sizeof(b2ChainAndCircleContact));
+	return new (mem) b2ChainAndCircleContact(fixtureA, indexA, fixtureB, indexB);
+}
+
+void b2ChainAndCircleContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)
+{
+	((b2ChainAndCircleContact*)contact)->~b2ChainAndCircleContact();
+	allocator->Free(contact, sizeof(b2ChainAndCircleContact));
+}
+
+b2ChainAndCircleContact::b2ChainAndCircleContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB)
+: b2Contact(fixtureA, indexA, fixtureB, indexB)
+{
+	b2Assert(m_fixtureA->GetType() == b2Shape::e_chain);
+	b2Assert(m_fixtureB->GetType() == b2Shape::e_circle);
+}
+
+void b2ChainAndCircleContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)
+{
+	b2ChainShape* chain = (b2ChainShape*)m_fixtureA->GetShape();
+	b2EdgeShape edge;
+	chain->GetChildEdge(&edge, m_indexA);
+	b2CollideEdgeAndCircle(	manifold, &edge, xfA,
+							(b2CircleShape*)m_fixtureB->GetShape(), xfB);
+}

+ 39 - 0
examples/DemoBox2D/box2d/Box2D/Dynamics/Contacts/b2ChainAndCircleContact.h

@@ -0,0 +1,39 @@
+/*
+* 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.
+*/
+
+#ifndef B2_CHAIN_AND_CIRCLE_CONTACT_H
+#define B2_CHAIN_AND_CIRCLE_CONTACT_H
+
+#include <Box2D/Dynamics/Contacts/b2Contact.h>
+
+class b2BlockAllocator;
+
+class b2ChainAndCircleContact : public b2Contact
+{
+public:
+	static b2Contact* Create(	b2Fixture* fixtureA, int32 indexA,
+								b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);
+	static void Destroy(b2Contact* contact, b2BlockAllocator* allocator);
+
+	b2ChainAndCircleContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB);
+	~b2ChainAndCircleContact() {}
+
+	void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);
+};
+
+#endif

+ 53 - 0
examples/DemoBox2D/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.cpp

@@ -0,0 +1,53 @@
+/*
+* 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 <Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h>
+#include <Box2D/Common/b2BlockAllocator.h>
+#include <Box2D/Dynamics/b2Fixture.h>
+#include <Box2D/Collision/Shapes/b2ChainShape.h>
+#include <Box2D/Collision/Shapes/b2EdgeShape.h>
+
+#include <new>
+
+b2Contact* b2ChainAndPolygonContact::Create(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator)
+{
+	void* mem = allocator->Allocate(sizeof(b2ChainAndPolygonContact));
+	return new (mem) b2ChainAndPolygonContact(fixtureA, indexA, fixtureB, indexB);
+}
+
+void b2ChainAndPolygonContact::Destroy(b2Contact* contact, b2BlockAllocator* allocator)
+{
+	((b2ChainAndPolygonContact*)contact)->~b2ChainAndPolygonContact();
+	allocator->Free(contact, sizeof(b2ChainAndPolygonContact));
+}
+
+b2ChainAndPolygonContact::b2ChainAndPolygonContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB)
+: b2Contact(fixtureA, indexA, fixtureB, indexB)
+{
+	b2Assert(m_fixtureA->GetType() == b2Shape::e_chain);
+	b2Assert(m_fixtureB->GetType() == b2Shape::e_polygon);
+}
+
+void b2ChainAndPolygonContact::Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB)
+{
+	b2ChainShape* chain = (b2ChainShape*)m_fixtureA->GetShape();
+	b2EdgeShape edge;
+	chain->GetChildEdge(&edge, m_indexA);
+	b2CollideEdgeAndPolygon(	manifold, &edge, xfA,
+								(b2PolygonShape*)m_fixtureB->GetShape(), xfB);
+}

+ 39 - 0
examples/DemoBox2D/box2d/Box2D/Dynamics/Contacts/b2ChainAndPolygonContact.h

@@ -0,0 +1,39 @@
+/*
+* 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.
+*/
+
+#ifndef B2_CHAIN_AND_POLYGON_CONTACT_H
+#define B2_CHAIN_AND_POLYGON_CONTACT_H
+
+#include <Box2D/Dynamics/Contacts/b2Contact.h>
+
+class b2BlockAllocator;
+
+class b2ChainAndPolygonContact : public b2Contact
+{
+public:
+	static b2Contact* Create(	b2Fixture* fixtureA, int32 indexA,
+								b2Fixture* fixtureB, int32 indexB, b2BlockAllocator* allocator);
+	static void Destroy(b2Contact* contact, b2BlockAllocator* allocator);
+
+	b2ChainAndPolygonContact(b2Fixture* fixtureA, int32 indexA, b2Fixture* fixtureB, int32 indexB);
+	~b2ChainAndPolygonContact() {}
+
+	void Evaluate(b2Manifold* manifold, const b2Transform& xfA, const b2Transform& xfB);
+};
+
+#endif

+ 304 - 0
examples/DemoBox2D/box2d/Box2D/Dynamics/Joints/b2MotorJoint.cpp

@@ -0,0 +1,304 @@
+/*
+* Copyright (c) 2006-2012 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 <Box2D/Dynamics/Joints/b2MotorJoint.h>
+#include <Box2D/Dynamics/b2Body.h>
+#include <Box2D/Dynamics/b2TimeStep.h>
+
+// Point-to-point constraint
+// Cdot = v2 - v1
+//      = v2 + cross(w2, r2) - v1 - cross(w1, r1)
+// J = [-I -r1_skew I r2_skew ]
+// Identity used:
+// w k % (rx i + ry j) = w * (-ry i + rx j)
+
+// Angle constraint
+// Cdot = w2 - w1
+// J = [0 0 -1 0 0 1]
+// K = invI1 + invI2
+
+void b2MotorJointDef::Initialize(b2Body* bA, b2Body* bB)
+{
+	bodyA = bA;
+	bodyB = bB;
+	b2Vec2 xB = bodyB->GetPosition();
+	linearOffset = bodyA->GetLocalPoint(xB);
+
+	float32 angleA = bodyA->GetAngle();
+	float32 angleB = bodyB->GetAngle();
+	angularOffset = angleB - angleA;
+}
+
+b2MotorJoint::b2MotorJoint(const b2MotorJointDef* def)
+: b2Joint(def)
+{
+	m_linearOffset = def->linearOffset;
+	m_angularOffset = def->angularOffset;
+
+	m_linearImpulse.SetZero();
+	m_angularImpulse = 0.0f;
+
+	m_maxForce = def->maxForce;
+	m_maxTorque = def->maxTorque;
+	m_correctionFactor = def->correctionFactor;
+}
+
+void b2MotorJoint::InitVelocityConstraints(const b2SolverData& data)
+{
+	m_indexA = m_bodyA->m_islandIndex;
+	m_indexB = m_bodyB->m_islandIndex;
+	m_localCenterA = m_bodyA->m_sweep.localCenter;
+	m_localCenterB = m_bodyB->m_sweep.localCenter;
+	m_invMassA = m_bodyA->m_invMass;
+	m_invMassB = m_bodyB->m_invMass;
+	m_invIA = m_bodyA->m_invI;
+	m_invIB = m_bodyB->m_invI;
+
+	b2Vec2 cA = data.positions[m_indexA].c;
+	float32 aA = data.positions[m_indexA].a;
+	b2Vec2 vA = data.velocities[m_indexA].v;
+	float32 wA = data.velocities[m_indexA].w;
+
+	b2Vec2 cB = data.positions[m_indexB].c;
+	float32 aB = data.positions[m_indexB].a;
+	b2Vec2 vB = data.velocities[m_indexB].v;
+	float32 wB = data.velocities[m_indexB].w;
+
+	b2Rot qA(aA), qB(aB);
+
+	// Compute the effective mass matrix.
+	m_rA = b2Mul(qA, -m_localCenterA);
+	m_rB = b2Mul(qB, -m_localCenterB);
+
+	// J = [-I -r1_skew I r2_skew]
+	//     [ 0       -1 0       1]
+	// r_skew = [-ry; rx]
+
+	// Matlab
+	// K = [ mA+r1y^2*iA+mB+r2y^2*iB,  -r1y*iA*r1x-r2y*iB*r2x,          -r1y*iA-r2y*iB]
+	//     [  -r1y*iA*r1x-r2y*iB*r2x, mA+r1x^2*iA+mB+r2x^2*iB,           r1x*iA+r2x*iB]
+	//     [          -r1y*iA-r2y*iB,           r1x*iA+r2x*iB,                   iA+iB]
+
+	float32 mA = m_invMassA, mB = m_invMassB;
+	float32 iA = m_invIA, iB = m_invIB;
+
+	b2Mat22 K;
+	K.ex.x = mA + mB + iA * m_rA.y * m_rA.y + iB * m_rB.y * m_rB.y;
+	K.ex.y = -iA * m_rA.x * m_rA.y - iB * m_rB.x * m_rB.y;
+	K.ey.x = K.ex.y;
+	K.ey.y = mA + mB + iA * m_rA.x * m_rA.x + iB * m_rB.x * m_rB.x;
+
+	m_linearMass = K.GetInverse();
+
+	m_angularMass = iA + iB;
+	if (m_angularMass > 0.0f)
+	{
+		m_angularMass = 1.0f / m_angularMass;
+	}
+
+	m_linearError = cB + m_rB - cA - m_rA - b2Mul(qA, m_linearOffset);
+	m_angularError = aB - aA - m_angularOffset;
+
+	if (data.step.warmStarting)
+	{
+		// Scale impulses to support a variable time step.
+		m_linearImpulse *= data.step.dtRatio;
+		m_angularImpulse *= data.step.dtRatio;
+
+		b2Vec2 P(m_linearImpulse.x, m_linearImpulse.y);
+		vA -= mA * P;
+		wA -= iA * (b2Cross(m_rA, P) + m_angularImpulse);
+		vB += mB * P;
+		wB += iB * (b2Cross(m_rB, P) + m_angularImpulse);
+	}
+	else
+	{
+		m_linearImpulse.SetZero();
+		m_angularImpulse = 0.0f;
+	}
+
+	data.velocities[m_indexA].v = vA;
+	data.velocities[m_indexA].w = wA;
+	data.velocities[m_indexB].v = vB;
+	data.velocities[m_indexB].w = wB;
+}
+
+void b2MotorJoint::SolveVelocityConstraints(const b2SolverData& data)
+{
+	b2Vec2 vA = data.velocities[m_indexA].v;
+	float32 wA = data.velocities[m_indexA].w;
+	b2Vec2 vB = data.velocities[m_indexB].v;
+	float32 wB = data.velocities[m_indexB].w;
+
+	float32 mA = m_invMassA, mB = m_invMassB;
+	float32 iA = m_invIA, iB = m_invIB;
+
+	float32 h = data.step.dt;
+	float32 inv_h = data.step.inv_dt;
+
+	// Solve angular friction
+	{
+		float32 Cdot = wB - wA + inv_h * m_correctionFactor * m_angularError;
+		float32 impulse = -m_angularMass * Cdot;
+
+		float32 oldImpulse = m_angularImpulse;
+		float32 maxImpulse = h * m_maxTorque;
+		m_angularImpulse = b2Clamp(m_angularImpulse + impulse, -maxImpulse, maxImpulse);
+		impulse = m_angularImpulse - oldImpulse;
+
+		wA -= iA * impulse;
+		wB += iB * impulse;
+	}
+
+	// Solve linear friction
+	{
+		b2Vec2 Cdot = vB + b2Cross(wB, m_rB) - vA - b2Cross(wA, m_rA) + inv_h * m_correctionFactor * m_linearError;
+
+		b2Vec2 impulse = -b2Mul(m_linearMass, Cdot);
+		b2Vec2 oldImpulse = m_linearImpulse;
+		m_linearImpulse += impulse;
+
+		float32 maxImpulse = h * m_maxForce;
+
+		if (m_linearImpulse.LengthSquared() > maxImpulse * maxImpulse)
+		{
+			m_linearImpulse.Normalize();
+			m_linearImpulse *= maxImpulse;
+		}
+
+		impulse = m_linearImpulse - oldImpulse;
+
+		vA -= mA * impulse;
+		wA -= iA * b2Cross(m_rA, impulse);
+
+		vB += mB * impulse;
+		wB += iB * b2Cross(m_rB, impulse);
+	}
+
+	data.velocities[m_indexA].v = vA;
+	data.velocities[m_indexA].w = wA;
+	data.velocities[m_indexB].v = vB;
+	data.velocities[m_indexB].w = wB;
+}
+
+bool b2MotorJoint::SolvePositionConstraints(const b2SolverData& data)
+{
+	B2_NOT_USED(data);
+
+	return true;
+}
+
+b2Vec2 b2MotorJoint::GetAnchorA() const
+{
+	return m_bodyA->GetPosition();
+}
+
+b2Vec2 b2MotorJoint::GetAnchorB() const
+{
+	return m_bodyB->GetPosition();
+}
+
+b2Vec2 b2MotorJoint::GetReactionForce(float32 inv_dt) const
+{
+	return inv_dt * m_linearImpulse;
+}
+
+float32 b2MotorJoint::GetReactionTorque(float32 inv_dt) const
+{
+	return inv_dt * m_angularImpulse;
+}
+
+void b2MotorJoint::SetMaxForce(float32 force)
+{
+	b2Assert(b2IsValid(force) && force >= 0.0f);
+	m_maxForce = force;
+}
+
+float32 b2MotorJoint::GetMaxForce() const
+{
+	return m_maxForce;
+}
+
+void b2MotorJoint::SetMaxTorque(float32 torque)
+{
+	b2Assert(b2IsValid(torque) && torque >= 0.0f);
+	m_maxTorque = torque;
+}
+
+float32 b2MotorJoint::GetMaxTorque() const
+{
+	return m_maxTorque;
+}
+
+void b2MotorJoint::SetCorrectionFactor(float32 factor)
+{
+	b2Assert(b2IsValid(factor) && 0.0f <= factor && factor <= 1.0f);
+	m_correctionFactor = factor;
+}
+
+float32 b2MotorJoint::GetCorrectionFactor() const
+{
+	return m_correctionFactor;
+}
+
+void b2MotorJoint::SetLinearOffset(const b2Vec2& linearOffset)
+{
+	if (linearOffset.x != m_linearOffset.x || linearOffset.y != m_linearOffset.y)
+	{
+		m_bodyA->SetAwake(true);
+		m_bodyB->SetAwake(true);
+		m_linearOffset = linearOffset;
+	}
+}
+
+const b2Vec2& b2MotorJoint::GetLinearOffset() const
+{
+	return m_linearOffset;
+}
+
+void b2MotorJoint::SetAngularOffset(float32 angularOffset)
+{
+	if (angularOffset != m_angularOffset)
+	{
+		m_bodyA->SetAwake(true);
+		m_bodyB->SetAwake(true);
+		m_angularOffset = angularOffset;
+	}
+}
+
+float32 b2MotorJoint::GetAngularOffset() const
+{
+	return m_angularOffset;
+}
+
+void b2MotorJoint::Dump()
+{
+	int32 indexA = m_bodyA->m_islandIndex;
+	int32 indexB = m_bodyB->m_islandIndex;
+
+	b2Log("  b2MotorJointDef jd;\n");
+	b2Log("  jd.bodyA = bodies[%d];\n", indexA);
+	b2Log("  jd.bodyB = bodies[%d];\n", indexB);
+	b2Log("  jd.collideConnected = bool(%d);\n", m_collideConnected);
+	b2Log("  jd.linearOffset.Set(%.15lef, %.15lef);\n", m_linearOffset.x, m_linearOffset.y);
+	b2Log("  jd.angularOffset = %.15lef;\n", m_angularOffset);
+	b2Log("  jd.maxForce = %.15lef;\n", m_maxForce);
+	b2Log("  jd.maxTorque = %.15lef;\n", m_maxTorque);
+	b2Log("  jd.correctionFactor = %.15lef;\n", m_correctionFactor);
+	b2Log("  joints[%d] = m_world->CreateJoint(&jd);\n", m_index);
+}

+ 133 - 0
examples/DemoBox2D/box2d/Box2D/Dynamics/Joints/b2MotorJoint.h

@@ -0,0 +1,133 @@
+/*
+* Copyright (c) 2006-2012 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_MOTOR_JOINT_H
+#define B2_MOTOR_JOINT_H
+
+#include <Box2D/Dynamics/Joints/b2Joint.h>
+
+/// Motor joint definition.
+struct b2MotorJointDef : public b2JointDef
+{
+	b2MotorJointDef()
+	{
+		type = e_motorJoint;
+		linearOffset.SetZero();
+		angularOffset = 0.0f;
+		maxForce = 1.0f;
+		maxTorque = 1.0f;
+		correctionFactor = 0.3f;
+	}
+
+	/// Initialize the bodies and offsets using the current transforms.
+	void Initialize(b2Body* bodyA, b2Body* bodyB);
+
+	/// Position of bodyB minus the position of bodyA, in bodyA's frame, in meters.
+	b2Vec2 linearOffset;
+
+	/// The bodyB angle minus bodyA angle in radians.
+	float32 angularOffset;
+	
+	/// The maximum motor force in N.
+	float32 maxForce;
+
+	/// The maximum motor torque in N-m.
+	float32 maxTorque;
+
+	/// Position correction factor in the range [0,1].
+	float32 correctionFactor;
+};
+
+/// A motor joint is used to control the relative motion
+/// between two bodies. A typical usage is to control the movement
+/// of a dynamic body with respect to the ground.
+class b2MotorJoint : public b2Joint
+{
+public:
+	b2Vec2 GetAnchorA() const;
+	b2Vec2 GetAnchorB() const;
+
+	b2Vec2 GetReactionForce(float32 inv_dt) const;
+	float32 GetReactionTorque(float32 inv_dt) const;
+
+	/// Set/get the target linear offset, in frame A, in meters.
+	void SetLinearOffset(const b2Vec2& linearOffset);
+	const b2Vec2& GetLinearOffset() const;
+
+	/// Set/get the target angular offset, in radians.
+	void SetAngularOffset(float32 angularOffset);
+	float32 GetAngularOffset() const;
+
+	/// Set the maximum friction force in N.
+	void SetMaxForce(float32 force);
+
+	/// Get the maximum friction force in N.
+	float32 GetMaxForce() const;
+
+	/// Set the maximum friction torque in N*m.
+	void SetMaxTorque(float32 torque);
+
+	/// Get the maximum friction torque in N*m.
+	float32 GetMaxTorque() const;
+
+	/// Set the position correction factor in the range [0,1].
+	void SetCorrectionFactor(float32 factor);
+
+	/// Get the position correction factor in the range [0,1].
+	float32 GetCorrectionFactor() const;
+
+	/// Dump to b2Log
+	void Dump();
+
+protected:
+
+	friend class b2Joint;
+
+	b2MotorJoint(const b2MotorJointDef* def);
+
+	void InitVelocityConstraints(const b2SolverData& data);
+	void SolveVelocityConstraints(const b2SolverData& data);
+	bool SolvePositionConstraints(const b2SolverData& data);
+
+	// Solver shared
+	b2Vec2 m_linearOffset;
+	float32 m_angularOffset;
+	b2Vec2 m_linearImpulse;
+	float32 m_angularImpulse;
+	float32 m_maxForce;
+	float32 m_maxTorque;
+	float32 m_correctionFactor;
+
+	// Solver temp
+	int32 m_indexA;
+	int32 m_indexB;
+	b2Vec2 m_rA;
+	b2Vec2 m_rB;
+	b2Vec2 m_localCenterA;
+	b2Vec2 m_localCenterB;
+	b2Vec2 m_linearError;
+	float32 m_angularError;
+	float32 m_invMassA;
+	float32 m_invMassB;
+	float32 m_invIA;
+	float32 m_invIB;
+	b2Mat22 m_linearMass;
+	float32 m_angularMass;
+};
+
+#endif

+ 1 - 2
examples/DemoBox2D/proj.android/AndroidManifest.xml

@@ -24,8 +24,7 @@
         </activity>
     </application>
 
-    <!-- Android 2.3.3 -->
-    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="12" />
+    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="14" />
 
     <!-- OpenGL ES 2.0 -->
     <uses-feature android:glEsVersion="0x00020000" /> 

+ 1 - 1
examples/DemoBox2D/proj.android/build.sh

@@ -1,2 +1,2 @@
 #!/bin/bash
-ndk-build NDK_MODULE_PATH=${ROOT} $@
+ndk-build NDK_MODULE_PATH=../../../../ $@

+ 0 - 11
examples/DemoBox2D/proj.android/default.properties

@@ -1,11 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-# 
-# This file must be checked in Version Control Systems.
-# 
-# To customize properties used by the Ant build system use,
-# "build.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-12

+ 2 - 2
examples/DemoBox2D/proj.android/install.sh

@@ -1,3 +1,3 @@
 #!/bin/bash
-adb install -r bin/${PROJECT}-debug.apk
-adb shell am start -n org.oxygine.${PROJECT}/org.oxygine.${PROJECT}.MainActivity
+adb install -r bin/DemoBox2D-debug.apk
+adb shell am start -n org.oxygine.DemoBox2D/org.oxygine.DemoBox2D.MainActivity

+ 1 - 1
examples/DemoBox2D/proj.android/project.properties

@@ -11,5 +11,5 @@
 #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
 
 # Project target.
-target=android-12
+target=android-14
 android.library.reference.1=../../../..//oxygine-framework/oxygine/SDL/android/lib

+ 307 - 296
examples/DemoBox2D/proj.ios/DemoBox2D_ios.xcodeproj/project.pbxproj

@@ -24,51 +24,52 @@
 		1E839D002B2BA83FC83A695A /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = 04FE4D4FB640E0DF92DFB865 /* fonts */; };
 		2DC477AC10D6C07B3FE008F6 /* Box2DDebugDraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 360377333740D8A2FD15BBE6 /* Box2DDebugDraw.cpp */; };
 		3A631A475DE035FC53ADE5EA /* images in Resources */ = {isa = PBXBuildFile; fileRef = 7F3B12E3C9D554D9FE28101D /* images */; };
-		92908F4519C9EBFC0088BCA9 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EE519C9EBFB0088BCA9 /* b2BroadPhase.cpp */; };
-		92908F4619C9EBFC0088BCA9 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EE719C9EBFB0088BCA9 /* b2CollideCircle.cpp */; };
-		92908F4719C9EBFC0088BCA9 /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EE819C9EBFB0088BCA9 /* b2CollideEdge.cpp */; };
-		92908F4819C9EBFC0088BCA9 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EE919C9EBFB0088BCA9 /* b2CollidePolygon.cpp */; };
-		92908F4919C9EBFC0088BCA9 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EEA19C9EBFB0088BCA9 /* b2Collision.cpp */; };
-		92908F4A19C9EBFC0088BCA9 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EEC19C9EBFB0088BCA9 /* b2Distance.cpp */; };
-		92908F4B19C9EBFC0088BCA9 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EEE19C9EBFB0088BCA9 /* b2DynamicTree.cpp */; };
-		92908F4C19C9EBFC0088BCA9 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EF019C9EBFB0088BCA9 /* b2TimeOfImpact.cpp */; };
-		92908F4D19C9EBFC0088BCA9 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EF319C9EBFB0088BCA9 /* b2CircleShape.cpp */; };
-		92908F4E19C9EBFC0088BCA9 /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EF519C9EBFB0088BCA9 /* b2EdgeShape.cpp */; };
-		92908F4F19C9EBFC0088BCA9 /* b2LoopShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EF719C9EBFB0088BCA9 /* b2LoopShape.cpp */; };
-		92908F5019C9EBFC0088BCA9 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EF919C9EBFB0088BCA9 /* b2PolygonShape.cpp */; };
-		92908F5119C9EBFC0088BCA9 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EFD19C9EBFB0088BCA9 /* b2BlockAllocator.cpp */; };
-		92908F5219C9EBFC0088BCA9 /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908EFF19C9EBFB0088BCA9 /* b2Draw.cpp */; };
-		92908F5319C9EBFC0088BCA9 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F0219C9EBFB0088BCA9 /* b2Math.cpp */; };
-		92908F5419C9EBFC0088BCA9 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F0419C9EBFB0088BCA9 /* b2Settings.cpp */; };
-		92908F5519C9EBFC0088BCA9 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F0619C9EBFB0088BCA9 /* b2StackAllocator.cpp */; };
-		92908F5619C9EBFC0088BCA9 /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F0819C9EBFB0088BCA9 /* b2Timer.cpp */; };
-		92908F5719C9EBFC0088BCA9 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F0B19C9EBFB0088BCA9 /* b2Body.cpp */; };
-		92908F5819C9EBFC0088BCA9 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F0D19C9EBFB0088BCA9 /* b2ContactManager.cpp */; };
-		92908F5919C9EBFC0088BCA9 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F0F19C9EBFB0088BCA9 /* b2Fixture.cpp */; };
-		92908F5A19C9EBFC0088BCA9 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F1119C9EBFB0088BCA9 /* b2Island.cpp */; };
-		92908F5B19C9EBFC0088BCA9 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F1419C9EBFB0088BCA9 /* b2World.cpp */; };
-		92908F5C19C9EBFC0088BCA9 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F1619C9EBFB0088BCA9 /* b2WorldCallbacks.cpp */; };
-		92908F5D19C9EBFC0088BCA9 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F1919C9EBFB0088BCA9 /* b2CircleContact.cpp */; };
-		92908F5E19C9EBFC0088BCA9 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F1B19C9EBFB0088BCA9 /* b2Contact.cpp */; };
-		92908F5F19C9EBFC0088BCA9 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F1D19C9EBFC0088BCA9 /* b2ContactSolver.cpp */; };
-		92908F6019C9EBFC0088BCA9 /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F1F19C9EBFC0088BCA9 /* b2EdgeAndCircleContact.cpp */; };
-		92908F6119C9EBFC0088BCA9 /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F2119C9EBFC0088BCA9 /* b2EdgeAndPolygonContact.cpp */; };
-		92908F6219C9EBFC0088BCA9 /* b2LoopAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F2319C9EBFC0088BCA9 /* b2LoopAndCircleContact.cpp */; };
-		92908F6319C9EBFC0088BCA9 /* b2LoopAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F2519C9EBFC0088BCA9 /* b2LoopAndPolygonContact.cpp */; };
-		92908F6419C9EBFC0088BCA9 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F2719C9EBFC0088BCA9 /* b2PolygonAndCircleContact.cpp */; };
-		92908F6519C9EBFC0088BCA9 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F2919C9EBFC0088BCA9 /* b2PolygonContact.cpp */; };
-		92908F6619C9EBFC0088BCA9 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F2C19C9EBFC0088BCA9 /* b2DistanceJoint.cpp */; };
-		92908F6719C9EBFC0088BCA9 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F2E19C9EBFC0088BCA9 /* b2FrictionJoint.cpp */; };
-		92908F6819C9EBFC0088BCA9 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F3019C9EBFC0088BCA9 /* b2GearJoint.cpp */; };
-		92908F6919C9EBFC0088BCA9 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F3219C9EBFC0088BCA9 /* b2Joint.cpp */; };
-		92908F6A19C9EBFC0088BCA9 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F3419C9EBFC0088BCA9 /* b2MouseJoint.cpp */; };
-		92908F6B19C9EBFC0088BCA9 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F3619C9EBFC0088BCA9 /* b2PrismaticJoint.cpp */; };
-		92908F6C19C9EBFC0088BCA9 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F3819C9EBFC0088BCA9 /* b2PulleyJoint.cpp */; };
-		92908F6D19C9EBFC0088BCA9 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F3A19C9EBFC0088BCA9 /* b2RevoluteJoint.cpp */; };
-		92908F6E19C9EBFC0088BCA9 /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F3C19C9EBFC0088BCA9 /* b2RopeJoint.cpp */; };
-		92908F6F19C9EBFC0088BCA9 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F3E19C9EBFC0088BCA9 /* b2WeldJoint.cpp */; };
-		92908F7019C9EBFC0088BCA9 /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F4019C9EBFC0088BCA9 /* b2WheelJoint.cpp */; };
-		92908F7119C9EBFC0088BCA9 /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F4319C9EBFC0088BCA9 /* b2Rope.cpp */; };
+		9271CF101BAB66B50085E667 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEAE1BAB66B50085E667 /* b2BroadPhase.cpp */; };
+		9271CF111BAB66B50085E667 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEB01BAB66B50085E667 /* b2CollideCircle.cpp */; };
+		9271CF121BAB66B50085E667 /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEB11BAB66B50085E667 /* b2CollideEdge.cpp */; };
+		9271CF131BAB66B50085E667 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEB21BAB66B50085E667 /* b2CollidePolygon.cpp */; };
+		9271CF141BAB66B50085E667 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEB31BAB66B50085E667 /* b2Collision.cpp */; };
+		9271CF151BAB66B50085E667 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEB51BAB66B50085E667 /* b2Distance.cpp */; };
+		9271CF161BAB66B50085E667 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEB71BAB66B50085E667 /* b2DynamicTree.cpp */; };
+		9271CF171BAB66B50085E667 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEB91BAB66B50085E667 /* b2TimeOfImpact.cpp */; };
+		9271CF181BAB66B50085E667 /* b2ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEBC1BAB66B50085E667 /* b2ChainShape.cpp */; };
+		9271CF191BAB66B50085E667 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEBE1BAB66B50085E667 /* b2CircleShape.cpp */; };
+		9271CF1A1BAB66B50085E667 /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEC01BAB66B50085E667 /* b2EdgeShape.cpp */; };
+		9271CF1B1BAB66B50085E667 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEC21BAB66B50085E667 /* b2PolygonShape.cpp */; };
+		9271CF1C1BAB66B50085E667 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEC61BAB66B50085E667 /* b2BlockAllocator.cpp */; };
+		9271CF1D1BAB66B50085E667 /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEC81BAB66B50085E667 /* b2Draw.cpp */; };
+		9271CF1E1BAB66B50085E667 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CECB1BAB66B50085E667 /* b2Math.cpp */; };
+		9271CF1F1BAB66B50085E667 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CECD1BAB66B50085E667 /* b2Settings.cpp */; };
+		9271CF201BAB66B50085E667 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CECF1BAB66B50085E667 /* b2StackAllocator.cpp */; };
+		9271CF211BAB66B50085E667 /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CED11BAB66B50085E667 /* b2Timer.cpp */; };
+		9271CF221BAB66B50085E667 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CED41BAB66B50085E667 /* b2Body.cpp */; };
+		9271CF231BAB66B50085E667 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CED61BAB66B50085E667 /* b2ContactManager.cpp */; };
+		9271CF241BAB66B50085E667 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CED81BAB66B50085E667 /* b2Fixture.cpp */; };
+		9271CF251BAB66B50085E667 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEDA1BAB66B50085E667 /* b2Island.cpp */; };
+		9271CF261BAB66B50085E667 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEDD1BAB66B50085E667 /* b2World.cpp */; };
+		9271CF271BAB66B50085E667 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEDF1BAB66B50085E667 /* b2WorldCallbacks.cpp */; };
+		9271CF281BAB66B50085E667 /* b2ChainAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEE21BAB66B50085E667 /* b2ChainAndCircleContact.cpp */; };
+		9271CF291BAB66B50085E667 /* b2ChainAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEE41BAB66B50085E667 /* b2ChainAndPolygonContact.cpp */; };
+		9271CF2A1BAB66B50085E667 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEE61BAB66B50085E667 /* b2CircleContact.cpp */; };
+		9271CF2B1BAB66B50085E667 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEE81BAB66B50085E667 /* b2Contact.cpp */; };
+		9271CF2C1BAB66B50085E667 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEEA1BAB66B50085E667 /* b2ContactSolver.cpp */; };
+		9271CF2D1BAB66B50085E667 /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEEC1BAB66B50085E667 /* b2EdgeAndCircleContact.cpp */; };
+		9271CF2E1BAB66B50085E667 /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEEE1BAB66B50085E667 /* b2EdgeAndPolygonContact.cpp */; };
+		9271CF2F1BAB66B50085E667 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEF01BAB66B50085E667 /* b2PolygonAndCircleContact.cpp */; };
+		9271CF301BAB66B50085E667 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEF21BAB66B50085E667 /* b2PolygonContact.cpp */; };
+		9271CF311BAB66B50085E667 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEF51BAB66B50085E667 /* b2DistanceJoint.cpp */; };
+		9271CF321BAB66B50085E667 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEF71BAB66B50085E667 /* b2FrictionJoint.cpp */; };
+		9271CF331BAB66B50085E667 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEF91BAB66B50085E667 /* b2GearJoint.cpp */; };
+		9271CF341BAB66B50085E667 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEFB1BAB66B50085E667 /* b2Joint.cpp */; };
+		9271CF351BAB66B50085E667 /* b2MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEFD1BAB66B50085E667 /* b2MotorJoint.cpp */; };
+		9271CF361BAB66B50085E667 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CEFF1BAB66B50085E667 /* b2MouseJoint.cpp */; };
+		9271CF371BAB66B50085E667 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CF011BAB66B50085E667 /* b2PrismaticJoint.cpp */; };
+		9271CF381BAB66B50085E667 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CF031BAB66B50085E667 /* b2PulleyJoint.cpp */; };
+		9271CF391BAB66B50085E667 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CF051BAB66B50085E667 /* b2RevoluteJoint.cpp */; };
+		9271CF3A1BAB66B50085E667 /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CF071BAB66B50085E667 /* b2RopeJoint.cpp */; };
+		9271CF3B1BAB66B50085E667 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CF091BAB66B50085E667 /* b2WeldJoint.cpp */; };
+		9271CF3C1BAB66B50085E667 /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CF0B1BAB66B50085E667 /* b2WheelJoint.cpp */; };
+		9271CF3D1BAB66B50085E667 /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CF0E1BAB66B50085E667 /* b2Rope.cpp */; };
 		C8860D93875589970329DCCD /* example.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DA100C319512824B7570663 /* example.cpp */; };
 		CD59C69314E9E74CD0A11E03 /* res.xml in Resources */ = {isa = PBXBuildFile; fileRef = F6123B1E6FE4471A00F49751 /* res.xml */; };
 		DA49ED8903C628BA578C8670 /* entry_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BF9628FC8D38F9748F0CDEB /* entry_point.cpp */; };
@@ -127,97 +128,99 @@
 		4DA100C319512824B7570663 /* example.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = example.cpp; path = ../src/example.cpp; sourceTree = "<group>"; };
 		5DE458993031811A4C7D28C1 /* Box2DDebugDraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Box2DDebugDraw.h; path = ../src/Box2DDebugDraw.h; sourceTree = "<group>"; };
 		7F3B12E3C9D554D9FE28101D /* images */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = images; path = ../data/images; sourceTree = "<group>"; };
-		92908EE319C9EBFB0088BCA9 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Box2D.h; path = ../box2d/Box2D/Box2D.h; sourceTree = "<group>"; };
-		92908EE519C9EBFB0088BCA9 /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = "<group>"; };
-		92908EE619C9EBFB0088BCA9 /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = "<group>"; };
-		92908EE719C9EBFB0088BCA9 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = "<group>"; };
-		92908EE819C9EBFB0088BCA9 /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = "<group>"; };
-		92908EE919C9EBFB0088BCA9 /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = "<group>"; };
-		92908EEA19C9EBFB0088BCA9 /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = "<group>"; };
-		92908EEB19C9EBFB0088BCA9 /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = "<group>"; };
-		92908EEC19C9EBFB0088BCA9 /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = "<group>"; };
-		92908EED19C9EBFB0088BCA9 /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = "<group>"; };
-		92908EEE19C9EBFB0088BCA9 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = "<group>"; };
-		92908EEF19C9EBFB0088BCA9 /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = "<group>"; };
-		92908EF019C9EBFB0088BCA9 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = "<group>"; };
-		92908EF119C9EBFB0088BCA9 /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = "<group>"; };
-		92908EF319C9EBFB0088BCA9 /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = "<group>"; };
-		92908EF419C9EBFB0088BCA9 /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = "<group>"; };
-		92908EF519C9EBFB0088BCA9 /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = "<group>"; };
-		92908EF619C9EBFB0088BCA9 /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = "<group>"; };
-		92908EF719C9EBFB0088BCA9 /* b2LoopShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LoopShape.cpp; sourceTree = "<group>"; };
-		92908EF819C9EBFB0088BCA9 /* b2LoopShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LoopShape.h; sourceTree = "<group>"; };
-		92908EF919C9EBFB0088BCA9 /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = "<group>"; };
-		92908EFA19C9EBFB0088BCA9 /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = "<group>"; };
-		92908EFB19C9EBFB0088BCA9 /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = "<group>"; };
-		92908EFD19C9EBFB0088BCA9 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = "<group>"; };
-		92908EFE19C9EBFB0088BCA9 /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = "<group>"; };
-		92908EFF19C9EBFB0088BCA9 /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = "<group>"; };
-		92908F0019C9EBFB0088BCA9 /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = "<group>"; };
-		92908F0119C9EBFB0088BCA9 /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = "<group>"; };
-		92908F0219C9EBFB0088BCA9 /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = "<group>"; };
-		92908F0319C9EBFB0088BCA9 /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = "<group>"; };
-		92908F0419C9EBFB0088BCA9 /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = "<group>"; };
-		92908F0519C9EBFB0088BCA9 /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = "<group>"; };
-		92908F0619C9EBFB0088BCA9 /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = "<group>"; };
-		92908F0719C9EBFB0088BCA9 /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = "<group>"; };
-		92908F0819C9EBFB0088BCA9 /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = "<group>"; };
-		92908F0919C9EBFB0088BCA9 /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = "<group>"; };
-		92908F0B19C9EBFB0088BCA9 /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = "<group>"; };
-		92908F0C19C9EBFB0088BCA9 /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = "<group>"; };
-		92908F0D19C9EBFB0088BCA9 /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = "<group>"; };
-		92908F0E19C9EBFB0088BCA9 /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = "<group>"; };
-		92908F0F19C9EBFB0088BCA9 /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = "<group>"; };
-		92908F1019C9EBFB0088BCA9 /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = "<group>"; };
-		92908F1119C9EBFB0088BCA9 /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = "<group>"; };
-		92908F1219C9EBFB0088BCA9 /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = "<group>"; };
-		92908F1319C9EBFB0088BCA9 /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = "<group>"; };
-		92908F1419C9EBFB0088BCA9 /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = "<group>"; };
-		92908F1519C9EBFB0088BCA9 /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = "<group>"; };
-		92908F1619C9EBFB0088BCA9 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = "<group>"; };
-		92908F1719C9EBFB0088BCA9 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = "<group>"; };
-		92908F1919C9EBFB0088BCA9 /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = "<group>"; };
-		92908F1A19C9EBFB0088BCA9 /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = "<group>"; };
-		92908F1B19C9EBFB0088BCA9 /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = "<group>"; };
-		92908F1C19C9EBFB0088BCA9 /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = "<group>"; };
-		92908F1D19C9EBFC0088BCA9 /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = "<group>"; };
-		92908F1E19C9EBFC0088BCA9 /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = "<group>"; };
-		92908F1F19C9EBFC0088BCA9 /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = "<group>"; };
-		92908F2019C9EBFC0088BCA9 /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = "<group>"; };
-		92908F2119C9EBFC0088BCA9 /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = "<group>"; };
-		92908F2219C9EBFC0088BCA9 /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = "<group>"; };
-		92908F2319C9EBFC0088BCA9 /* b2LoopAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LoopAndCircleContact.cpp; sourceTree = "<group>"; };
-		92908F2419C9EBFC0088BCA9 /* b2LoopAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LoopAndCircleContact.h; sourceTree = "<group>"; };
-		92908F2519C9EBFC0088BCA9 /* b2LoopAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LoopAndPolygonContact.cpp; sourceTree = "<group>"; };
-		92908F2619C9EBFC0088BCA9 /* b2LoopAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LoopAndPolygonContact.h; sourceTree = "<group>"; };
-		92908F2719C9EBFC0088BCA9 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = "<group>"; };
-		92908F2819C9EBFC0088BCA9 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = "<group>"; };
-		92908F2919C9EBFC0088BCA9 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = "<group>"; };
-		92908F2A19C9EBFC0088BCA9 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = "<group>"; };
-		92908F2C19C9EBFC0088BCA9 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = "<group>"; };
-		92908F2D19C9EBFC0088BCA9 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = "<group>"; };
-		92908F2E19C9EBFC0088BCA9 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = "<group>"; };
-		92908F2F19C9EBFC0088BCA9 /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = "<group>"; };
-		92908F3019C9EBFC0088BCA9 /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = "<group>"; };
-		92908F3119C9EBFC0088BCA9 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = "<group>"; };
-		92908F3219C9EBFC0088BCA9 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = "<group>"; };
-		92908F3319C9EBFC0088BCA9 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = "<group>"; };
-		92908F3419C9EBFC0088BCA9 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = "<group>"; };
-		92908F3519C9EBFC0088BCA9 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = "<group>"; };
-		92908F3619C9EBFC0088BCA9 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = "<group>"; };
-		92908F3719C9EBFC0088BCA9 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = "<group>"; };
-		92908F3819C9EBFC0088BCA9 /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = "<group>"; };
-		92908F3919C9EBFC0088BCA9 /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = "<group>"; };
-		92908F3A19C9EBFC0088BCA9 /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = "<group>"; };
-		92908F3B19C9EBFC0088BCA9 /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = "<group>"; };
-		92908F3C19C9EBFC0088BCA9 /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = "<group>"; };
-		92908F3D19C9EBFC0088BCA9 /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = "<group>"; };
-		92908F3E19C9EBFC0088BCA9 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = "<group>"; };
-		92908F3F19C9EBFC0088BCA9 /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = "<group>"; };
-		92908F4019C9EBFC0088BCA9 /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = "<group>"; };
-		92908F4119C9EBFC0088BCA9 /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = "<group>"; };
-		92908F4319C9EBFC0088BCA9 /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = "<group>"; };
-		92908F4419C9EBFC0088BCA9 /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = "<group>"; };
+		9271CEAC1BAB66B50085E667 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = "<group>"; };
+		9271CEAE1BAB66B50085E667 /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = "<group>"; };
+		9271CEAF1BAB66B50085E667 /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = "<group>"; };
+		9271CEB01BAB66B50085E667 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = "<group>"; };
+		9271CEB11BAB66B50085E667 /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = "<group>"; };
+		9271CEB21BAB66B50085E667 /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = "<group>"; };
+		9271CEB31BAB66B50085E667 /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = "<group>"; };
+		9271CEB41BAB66B50085E667 /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = "<group>"; };
+		9271CEB51BAB66B50085E667 /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = "<group>"; };
+		9271CEB61BAB66B50085E667 /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = "<group>"; };
+		9271CEB71BAB66B50085E667 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = "<group>"; };
+		9271CEB81BAB66B50085E667 /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = "<group>"; };
+		9271CEB91BAB66B50085E667 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = "<group>"; };
+		9271CEBA1BAB66B50085E667 /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = "<group>"; };
+		9271CEBC1BAB66B50085E667 /* b2ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainShape.cpp; sourceTree = "<group>"; };
+		9271CEBD1BAB66B50085E667 /* b2ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainShape.h; sourceTree = "<group>"; };
+		9271CEBE1BAB66B50085E667 /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = "<group>"; };
+		9271CEBF1BAB66B50085E667 /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = "<group>"; };
+		9271CEC01BAB66B50085E667 /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = "<group>"; };
+		9271CEC11BAB66B50085E667 /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = "<group>"; };
+		9271CEC21BAB66B50085E667 /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = "<group>"; };
+		9271CEC31BAB66B50085E667 /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = "<group>"; };
+		9271CEC41BAB66B50085E667 /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = "<group>"; };
+		9271CEC61BAB66B50085E667 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = "<group>"; };
+		9271CEC71BAB66B50085E667 /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = "<group>"; };
+		9271CEC81BAB66B50085E667 /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = "<group>"; };
+		9271CEC91BAB66B50085E667 /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = "<group>"; };
+		9271CECA1BAB66B50085E667 /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = "<group>"; };
+		9271CECB1BAB66B50085E667 /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = "<group>"; };
+		9271CECC1BAB66B50085E667 /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = "<group>"; };
+		9271CECD1BAB66B50085E667 /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = "<group>"; };
+		9271CECE1BAB66B50085E667 /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = "<group>"; };
+		9271CECF1BAB66B50085E667 /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = "<group>"; };
+		9271CED01BAB66B50085E667 /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = "<group>"; };
+		9271CED11BAB66B50085E667 /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = "<group>"; };
+		9271CED21BAB66B50085E667 /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = "<group>"; };
+		9271CED41BAB66B50085E667 /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = "<group>"; };
+		9271CED51BAB66B50085E667 /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = "<group>"; };
+		9271CED61BAB66B50085E667 /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = "<group>"; };
+		9271CED71BAB66B50085E667 /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = "<group>"; };
+		9271CED81BAB66B50085E667 /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = "<group>"; };
+		9271CED91BAB66B50085E667 /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = "<group>"; };
+		9271CEDA1BAB66B50085E667 /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = "<group>"; };
+		9271CEDB1BAB66B50085E667 /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = "<group>"; };
+		9271CEDC1BAB66B50085E667 /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = "<group>"; };
+		9271CEDD1BAB66B50085E667 /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = "<group>"; };
+		9271CEDE1BAB66B50085E667 /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = "<group>"; };
+		9271CEDF1BAB66B50085E667 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = "<group>"; };
+		9271CEE01BAB66B50085E667 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = "<group>"; };
+		9271CEE21BAB66B50085E667 /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndCircleContact.cpp; sourceTree = "<group>"; };
+		9271CEE31BAB66B50085E667 /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndCircleContact.h; sourceTree = "<group>"; };
+		9271CEE41BAB66B50085E667 /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndPolygonContact.cpp; sourceTree = "<group>"; };
+		9271CEE51BAB66B50085E667 /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndPolygonContact.h; sourceTree = "<group>"; };
+		9271CEE61BAB66B50085E667 /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = "<group>"; };
+		9271CEE71BAB66B50085E667 /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = "<group>"; };
+		9271CEE81BAB66B50085E667 /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = "<group>"; };
+		9271CEE91BAB66B50085E667 /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = "<group>"; };
+		9271CEEA1BAB66B50085E667 /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = "<group>"; };
+		9271CEEB1BAB66B50085E667 /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = "<group>"; };
+		9271CEEC1BAB66B50085E667 /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = "<group>"; };
+		9271CEED1BAB66B50085E667 /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = "<group>"; };
+		9271CEEE1BAB66B50085E667 /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = "<group>"; };
+		9271CEEF1BAB66B50085E667 /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = "<group>"; };
+		9271CEF01BAB66B50085E667 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = "<group>"; };
+		9271CEF11BAB66B50085E667 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = "<group>"; };
+		9271CEF21BAB66B50085E667 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = "<group>"; };
+		9271CEF31BAB66B50085E667 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = "<group>"; };
+		9271CEF51BAB66B50085E667 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = "<group>"; };
+		9271CEF61BAB66B50085E667 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = "<group>"; };
+		9271CEF71BAB66B50085E667 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = "<group>"; };
+		9271CEF81BAB66B50085E667 /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = "<group>"; };
+		9271CEF91BAB66B50085E667 /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = "<group>"; };
+		9271CEFA1BAB66B50085E667 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = "<group>"; };
+		9271CEFB1BAB66B50085E667 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = "<group>"; };
+		9271CEFC1BAB66B50085E667 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = "<group>"; };
+		9271CEFD1BAB66B50085E667 /* b2MotorJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MotorJoint.cpp; sourceTree = "<group>"; };
+		9271CEFE1BAB66B50085E667 /* b2MotorJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MotorJoint.h; sourceTree = "<group>"; };
+		9271CEFF1BAB66B50085E667 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = "<group>"; };
+		9271CF001BAB66B50085E667 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = "<group>"; };
+		9271CF011BAB66B50085E667 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = "<group>"; };
+		9271CF021BAB66B50085E667 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = "<group>"; };
+		9271CF031BAB66B50085E667 /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = "<group>"; };
+		9271CF041BAB66B50085E667 /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = "<group>"; };
+		9271CF051BAB66B50085E667 /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = "<group>"; };
+		9271CF061BAB66B50085E667 /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = "<group>"; };
+		9271CF071BAB66B50085E667 /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = "<group>"; };
+		9271CF081BAB66B50085E667 /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = "<group>"; };
+		9271CF091BAB66B50085E667 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = "<group>"; };
+		9271CF0A1BAB66B50085E667 /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = "<group>"; };
+		9271CF0B1BAB66B50085E667 /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = "<group>"; };
+		9271CF0C1BAB66B50085E667 /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = "<group>"; };
+		9271CF0E1BAB66B50085E667 /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = "<group>"; };
+		9271CF0F1BAB66B50085E667 /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = "<group>"; };
 		BA41FC88D76540A6905224D6 /* example.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = example.h; path = ../src/example.h; sourceTree = "<group>"; };
 		F6123B1E6FE4471A00F49751 /* res.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = res.xml; path = ../data/res.xml; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -332,162 +335,169 @@
 			name = Products;
 			sourceTree = "<group>";
 		};
-		92908EE119C9EBE00088BCA9 /* box2d */ = {
+		9271CEAB1BAB66B50085E667 /* Box2D */ = {
 			isa = PBXGroup;
 			children = (
-				92908EE319C9EBFB0088BCA9 /* Box2D.h */,
-				92908EE419C9EBFB0088BCA9 /* Collision */,
-				92908EFC19C9EBFB0088BCA9 /* Common */,
-				92908F0A19C9EBFB0088BCA9 /* Dynamics */,
-				92908F4219C9EBFC0088BCA9 /* Rope */,
+				9271CEAC1BAB66B50085E667 /* Box2D.h */,
+				9271CEAD1BAB66B50085E667 /* Collision */,
+				9271CEC51BAB66B50085E667 /* Common */,
+				9271CED31BAB66B50085E667 /* Dynamics */,
+				9271CF0D1BAB66B50085E667 /* Rope */,
 			);
-			name = box2d;
+			name = Box2D;
+			path = ../box2d/Box2D;
 			sourceTree = "<group>";
 		};
-		92908EE419C9EBFB0088BCA9 /* Collision */ = {
+		9271CEAD1BAB66B50085E667 /* Collision */ = {
 			isa = PBXGroup;
 			children = (
-				92908EE519C9EBFB0088BCA9 /* b2BroadPhase.cpp */,
-				92908EE619C9EBFB0088BCA9 /* b2BroadPhase.h */,
-				92908EE719C9EBFB0088BCA9 /* b2CollideCircle.cpp */,
-				92908EE819C9EBFB0088BCA9 /* b2CollideEdge.cpp */,
-				92908EE919C9EBFB0088BCA9 /* b2CollidePolygon.cpp */,
-				92908EEA19C9EBFB0088BCA9 /* b2Collision.cpp */,
-				92908EEB19C9EBFB0088BCA9 /* b2Collision.h */,
-				92908EEC19C9EBFB0088BCA9 /* b2Distance.cpp */,
-				92908EED19C9EBFB0088BCA9 /* b2Distance.h */,
-				92908EEE19C9EBFB0088BCA9 /* b2DynamicTree.cpp */,
-				92908EEF19C9EBFB0088BCA9 /* b2DynamicTree.h */,
-				92908EF019C9EBFB0088BCA9 /* b2TimeOfImpact.cpp */,
-				92908EF119C9EBFB0088BCA9 /* b2TimeOfImpact.h */,
-				92908EF219C9EBFB0088BCA9 /* Shapes */,
+				9271CEAE1BAB66B50085E667 /* b2BroadPhase.cpp */,
+				9271CEAF1BAB66B50085E667 /* b2BroadPhase.h */,
+				9271CEB01BAB66B50085E667 /* b2CollideCircle.cpp */,
+				9271CEB11BAB66B50085E667 /* b2CollideEdge.cpp */,
+				9271CEB21BAB66B50085E667 /* b2CollidePolygon.cpp */,
+				9271CEB31BAB66B50085E667 /* b2Collision.cpp */,
+				9271CEB41BAB66B50085E667 /* b2Collision.h */,
+				9271CEB51BAB66B50085E667 /* b2Distance.cpp */,
+				9271CEB61BAB66B50085E667 /* b2Distance.h */,
+				9271CEB71BAB66B50085E667 /* b2DynamicTree.cpp */,
+				9271CEB81BAB66B50085E667 /* b2DynamicTree.h */,
+				9271CEB91BAB66B50085E667 /* b2TimeOfImpact.cpp */,
+				9271CEBA1BAB66B50085E667 /* b2TimeOfImpact.h */,
+				9271CEBB1BAB66B50085E667 /* Shapes */,
 			);
-			name = Collision;
-			path = ../box2d/Box2D/Collision;
+			path = Collision;
 			sourceTree = "<group>";
 		};
-		92908EF219C9EBFB0088BCA9 /* Shapes */ = {
+		9271CEBB1BAB66B50085E667 /* Shapes */ = {
 			isa = PBXGroup;
 			children = (
-				92908EF319C9EBFB0088BCA9 /* b2CircleShape.cpp */,
-				92908EF419C9EBFB0088BCA9 /* b2CircleShape.h */,
-				92908EF519C9EBFB0088BCA9 /* b2EdgeShape.cpp */,
-				92908EF619C9EBFB0088BCA9 /* b2EdgeShape.h */,
-				92908EF719C9EBFB0088BCA9 /* b2LoopShape.cpp */,
-				92908EF819C9EBFB0088BCA9 /* b2LoopShape.h */,
-				92908EF919C9EBFB0088BCA9 /* b2PolygonShape.cpp */,
-				92908EFA19C9EBFB0088BCA9 /* b2PolygonShape.h */,
-				92908EFB19C9EBFB0088BCA9 /* b2Shape.h */,
+				9271CEBC1BAB66B50085E667 /* b2ChainShape.cpp */,
+				9271CEBD1BAB66B50085E667 /* b2ChainShape.h */,
+				9271CEBE1BAB66B50085E667 /* b2CircleShape.cpp */,
+				9271CEBF1BAB66B50085E667 /* b2CircleShape.h */,
+				9271CEC01BAB66B50085E667 /* b2EdgeShape.cpp */,
+				9271CEC11BAB66B50085E667 /* b2EdgeShape.h */,
+				9271CEC21BAB66B50085E667 /* b2PolygonShape.cpp */,
+				9271CEC31BAB66B50085E667 /* b2PolygonShape.h */,
+				9271CEC41BAB66B50085E667 /* b2Shape.h */,
 			);
 			path = Shapes;
 			sourceTree = "<group>";
 		};
-		92908EFC19C9EBFB0088BCA9 /* Common */ = {
+		9271CEC51BAB66B50085E667 /* Common */ = {
 			isa = PBXGroup;
 			children = (
-				92908EFD19C9EBFB0088BCA9 /* b2BlockAllocator.cpp */,
-				92908EFE19C9EBFB0088BCA9 /* b2BlockAllocator.h */,
-				92908EFF19C9EBFB0088BCA9 /* b2Draw.cpp */,
-				92908F0019C9EBFB0088BCA9 /* b2Draw.h */,
-				92908F0119C9EBFB0088BCA9 /* b2GrowableStack.h */,
-				92908F0219C9EBFB0088BCA9 /* b2Math.cpp */,
-				92908F0319C9EBFB0088BCA9 /* b2Math.h */,
-				92908F0419C9EBFB0088BCA9 /* b2Settings.cpp */,
-				92908F0519C9EBFB0088BCA9 /* b2Settings.h */,
-				92908F0619C9EBFB0088BCA9 /* b2StackAllocator.cpp */,
-				92908F0719C9EBFB0088BCA9 /* b2StackAllocator.h */,
-				92908F0819C9EBFB0088BCA9 /* b2Timer.cpp */,
-				92908F0919C9EBFB0088BCA9 /* b2Timer.h */,
+				9271CEC61BAB66B50085E667 /* b2BlockAllocator.cpp */,
+				9271CEC71BAB66B50085E667 /* b2BlockAllocator.h */,
+				9271CEC81BAB66B50085E667 /* b2Draw.cpp */,
+				9271CEC91BAB66B50085E667 /* b2Draw.h */,
+				9271CECA1BAB66B50085E667 /* b2GrowableStack.h */,
+				9271CECB1BAB66B50085E667 /* b2Math.cpp */,
+				9271CECC1BAB66B50085E667 /* b2Math.h */,
+				9271CECD1BAB66B50085E667 /* b2Settings.cpp */,
+				9271CECE1BAB66B50085E667 /* b2Settings.h */,
+				9271CECF1BAB66B50085E667 /* b2StackAllocator.cpp */,
+				9271CED01BAB66B50085E667 /* b2StackAllocator.h */,
+				9271CED11BAB66B50085E667 /* b2Timer.cpp */,
+				9271CED21BAB66B50085E667 /* b2Timer.h */,
 			);
-			name = Common;
-			path = ../box2d/Box2D/Common;
+			path = Common;
 			sourceTree = "<group>";
 		};
-		92908F0A19C9EBFB0088BCA9 /* Dynamics */ = {
+		9271CED31BAB66B50085E667 /* Dynamics */ = {
 			isa = PBXGroup;
 			children = (
-				92908F0B19C9EBFB0088BCA9 /* b2Body.cpp */,
-				92908F0C19C9EBFB0088BCA9 /* b2Body.h */,
-				92908F0D19C9EBFB0088BCA9 /* b2ContactManager.cpp */,
-				92908F0E19C9EBFB0088BCA9 /* b2ContactManager.h */,
-				92908F0F19C9EBFB0088BCA9 /* b2Fixture.cpp */,
-				92908F1019C9EBFB0088BCA9 /* b2Fixture.h */,
-				92908F1119C9EBFB0088BCA9 /* b2Island.cpp */,
-				92908F1219C9EBFB0088BCA9 /* b2Island.h */,
-				92908F1319C9EBFB0088BCA9 /* b2TimeStep.h */,
-				92908F1419C9EBFB0088BCA9 /* b2World.cpp */,
-				92908F1519C9EBFB0088BCA9 /* b2World.h */,
-				92908F1619C9EBFB0088BCA9 /* b2WorldCallbacks.cpp */,
-				92908F1719C9EBFB0088BCA9 /* b2WorldCallbacks.h */,
-				92908F1819C9EBFB0088BCA9 /* Contacts */,
-				92908F2B19C9EBFC0088BCA9 /* Joints */,
+				9271CED41BAB66B50085E667 /* b2Body.cpp */,
+				9271CED51BAB66B50085E667 /* b2Body.h */,
+				9271CED61BAB66B50085E667 /* b2ContactManager.cpp */,
+				9271CED71BAB66B50085E667 /* b2ContactManager.h */,
+				9271CED81BAB66B50085E667 /* b2Fixture.cpp */,
+				9271CED91BAB66B50085E667 /* b2Fixture.h */,
+				9271CEDA1BAB66B50085E667 /* b2Island.cpp */,
+				9271CEDB1BAB66B50085E667 /* b2Island.h */,
+				9271CEDC1BAB66B50085E667 /* b2TimeStep.h */,
+				9271CEDD1BAB66B50085E667 /* b2World.cpp */,
+				9271CEDE1BAB66B50085E667 /* b2World.h */,
+				9271CEDF1BAB66B50085E667 /* b2WorldCallbacks.cpp */,
+				9271CEE01BAB66B50085E667 /* b2WorldCallbacks.h */,
+				9271CEE11BAB66B50085E667 /* Contacts */,
+				9271CEF41BAB66B50085E667 /* Joints */,
 			);
-			name = Dynamics;
-			path = ../box2d/Box2D/Dynamics;
+			path = Dynamics;
 			sourceTree = "<group>";
 		};
-		92908F1819C9EBFB0088BCA9 /* Contacts */ = {
+		9271CEE11BAB66B50085E667 /* Contacts */ = {
 			isa = PBXGroup;
 			children = (
-				92908F1919C9EBFB0088BCA9 /* b2CircleContact.cpp */,
-				92908F1A19C9EBFB0088BCA9 /* b2CircleContact.h */,
-				92908F1B19C9EBFB0088BCA9 /* b2Contact.cpp */,
-				92908F1C19C9EBFB0088BCA9 /* b2Contact.h */,
-				92908F1D19C9EBFC0088BCA9 /* b2ContactSolver.cpp */,
-				92908F1E19C9EBFC0088BCA9 /* b2ContactSolver.h */,
-				92908F1F19C9EBFC0088BCA9 /* b2EdgeAndCircleContact.cpp */,
-				92908F2019C9EBFC0088BCA9 /* b2EdgeAndCircleContact.h */,
-				92908F2119C9EBFC0088BCA9 /* b2EdgeAndPolygonContact.cpp */,
-				92908F2219C9EBFC0088BCA9 /* b2EdgeAndPolygonContact.h */,
-				92908F2319C9EBFC0088BCA9 /* b2LoopAndCircleContact.cpp */,
-				92908F2419C9EBFC0088BCA9 /* b2LoopAndCircleContact.h */,
-				92908F2519C9EBFC0088BCA9 /* b2LoopAndPolygonContact.cpp */,
-				92908F2619C9EBFC0088BCA9 /* b2LoopAndPolygonContact.h */,
-				92908F2719C9EBFC0088BCA9 /* b2PolygonAndCircleContact.cpp */,
-				92908F2819C9EBFC0088BCA9 /* b2PolygonAndCircleContact.h */,
-				92908F2919C9EBFC0088BCA9 /* b2PolygonContact.cpp */,
-				92908F2A19C9EBFC0088BCA9 /* b2PolygonContact.h */,
+				9271CEE21BAB66B50085E667 /* b2ChainAndCircleContact.cpp */,
+				9271CEE31BAB66B50085E667 /* b2ChainAndCircleContact.h */,
+				9271CEE41BAB66B50085E667 /* b2ChainAndPolygonContact.cpp */,
+				9271CEE51BAB66B50085E667 /* b2ChainAndPolygonContact.h */,
+				9271CEE61BAB66B50085E667 /* b2CircleContact.cpp */,
+				9271CEE71BAB66B50085E667 /* b2CircleContact.h */,
+				9271CEE81BAB66B50085E667 /* b2Contact.cpp */,
+				9271CEE91BAB66B50085E667 /* b2Contact.h */,
+				9271CEEA1BAB66B50085E667 /* b2ContactSolver.cpp */,
+				9271CEEB1BAB66B50085E667 /* b2ContactSolver.h */,
+				9271CEEC1BAB66B50085E667 /* b2EdgeAndCircleContact.cpp */,
+				9271CEED1BAB66B50085E667 /* b2EdgeAndCircleContact.h */,
+				9271CEEE1BAB66B50085E667 /* b2EdgeAndPolygonContact.cpp */,
+				9271CEEF1BAB66B50085E667 /* b2EdgeAndPolygonContact.h */,
+				9271CEF01BAB66B50085E667 /* b2PolygonAndCircleContact.cpp */,
+				9271CEF11BAB66B50085E667 /* b2PolygonAndCircleContact.h */,
+				9271CEF21BAB66B50085E667 /* b2PolygonContact.cpp */,
+				9271CEF31BAB66B50085E667 /* b2PolygonContact.h */,
 			);
 			path = Contacts;
 			sourceTree = "<group>";
 		};
-		92908F2B19C9EBFC0088BCA9 /* Joints */ = {
+		9271CEF41BAB66B50085E667 /* Joints */ = {
 			isa = PBXGroup;
 			children = (
-				92908F2C19C9EBFC0088BCA9 /* b2DistanceJoint.cpp */,
-				92908F2D19C9EBFC0088BCA9 /* b2DistanceJoint.h */,
-				92908F2E19C9EBFC0088BCA9 /* b2FrictionJoint.cpp */,
-				92908F2F19C9EBFC0088BCA9 /* b2FrictionJoint.h */,
-				92908F3019C9EBFC0088BCA9 /* b2GearJoint.cpp */,
-				92908F3119C9EBFC0088BCA9 /* b2GearJoint.h */,
-				92908F3219C9EBFC0088BCA9 /* b2Joint.cpp */,
-				92908F3319C9EBFC0088BCA9 /* b2Joint.h */,
-				92908F3419C9EBFC0088BCA9 /* b2MouseJoint.cpp */,
-				92908F3519C9EBFC0088BCA9 /* b2MouseJoint.h */,
-				92908F3619C9EBFC0088BCA9 /* b2PrismaticJoint.cpp */,
-				92908F3719C9EBFC0088BCA9 /* b2PrismaticJoint.h */,
-				92908F3819C9EBFC0088BCA9 /* b2PulleyJoint.cpp */,
-				92908F3919C9EBFC0088BCA9 /* b2PulleyJoint.h */,
-				92908F3A19C9EBFC0088BCA9 /* b2RevoluteJoint.cpp */,
-				92908F3B19C9EBFC0088BCA9 /* b2RevoluteJoint.h */,
-				92908F3C19C9EBFC0088BCA9 /* b2RopeJoint.cpp */,
-				92908F3D19C9EBFC0088BCA9 /* b2RopeJoint.h */,
-				92908F3E19C9EBFC0088BCA9 /* b2WeldJoint.cpp */,
-				92908F3F19C9EBFC0088BCA9 /* b2WeldJoint.h */,
-				92908F4019C9EBFC0088BCA9 /* b2WheelJoint.cpp */,
-				92908F4119C9EBFC0088BCA9 /* b2WheelJoint.h */,
+				9271CEF51BAB66B50085E667 /* b2DistanceJoint.cpp */,
+				9271CEF61BAB66B50085E667 /* b2DistanceJoint.h */,
+				9271CEF71BAB66B50085E667 /* b2FrictionJoint.cpp */,
+				9271CEF81BAB66B50085E667 /* b2FrictionJoint.h */,
+				9271CEF91BAB66B50085E667 /* b2GearJoint.cpp */,
+				9271CEFA1BAB66B50085E667 /* b2GearJoint.h */,
+				9271CEFB1BAB66B50085E667 /* b2Joint.cpp */,
+				9271CEFC1BAB66B50085E667 /* b2Joint.h */,
+				9271CEFD1BAB66B50085E667 /* b2MotorJoint.cpp */,
+				9271CEFE1BAB66B50085E667 /* b2MotorJoint.h */,
+				9271CEFF1BAB66B50085E667 /* b2MouseJoint.cpp */,
+				9271CF001BAB66B50085E667 /* b2MouseJoint.h */,
+				9271CF011BAB66B50085E667 /* b2PrismaticJoint.cpp */,
+				9271CF021BAB66B50085E667 /* b2PrismaticJoint.h */,
+				9271CF031BAB66B50085E667 /* b2PulleyJoint.cpp */,
+				9271CF041BAB66B50085E667 /* b2PulleyJoint.h */,
+				9271CF051BAB66B50085E667 /* b2RevoluteJoint.cpp */,
+				9271CF061BAB66B50085E667 /* b2RevoluteJoint.h */,
+				9271CF071BAB66B50085E667 /* b2RopeJoint.cpp */,
+				9271CF081BAB66B50085E667 /* b2RopeJoint.h */,
+				9271CF091BAB66B50085E667 /* b2WeldJoint.cpp */,
+				9271CF0A1BAB66B50085E667 /* b2WeldJoint.h */,
+				9271CF0B1BAB66B50085E667 /* b2WheelJoint.cpp */,
+				9271CF0C1BAB66B50085E667 /* b2WheelJoint.h */,
 			);
 			path = Joints;
 			sourceTree = "<group>";
 		};
-		92908F4219C9EBFC0088BCA9 /* Rope */ = {
+		9271CF0D1BAB66B50085E667 /* Rope */ = {
 			isa = PBXGroup;
 			children = (
-				92908F4319C9EBFC0088BCA9 /* b2Rope.cpp */,
-				92908F4419C9EBFC0088BCA9 /* b2Rope.h */,
+				9271CF0E1BAB66B50085E667 /* b2Rope.cpp */,
+				9271CF0F1BAB66B50085E667 /* b2Rope.h */,
 			);
-			name = Rope;
-			path = ../box2d/Box2D/Rope;
+			path = Rope;
+			sourceTree = "<group>";
+		};
+		92908EE119C9EBE00088BCA9 /* box2d */ = {
+			isa = PBXGroup;
+			children = (
+				9271CEAB1BAB66B50085E667 /* Box2D */,
+			);
+			name = box2d;
 			sourceTree = "<group>";
 		};
 /* End PBXGroup section */
@@ -590,54 +600,55 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				92908F6A19C9EBFC0088BCA9 /* b2MouseJoint.cpp in Sources */,
-				92908F4919C9EBFC0088BCA9 /* b2Collision.cpp in Sources */,
-				92908F5F19C9EBFC0088BCA9 /* b2ContactSolver.cpp in Sources */,
-				92908F5319C9EBFC0088BCA9 /* b2Math.cpp in Sources */,
-				92908F6219C9EBFC0088BCA9 /* b2LoopAndCircleContact.cpp in Sources */,
-				92908F6919C9EBFC0088BCA9 /* b2Joint.cpp in Sources */,
-				92908F4F19C9EBFC0088BCA9 /* b2LoopShape.cpp in Sources */,
-				92908F6519C9EBFC0088BCA9 /* b2PolygonContact.cpp in Sources */,
-				92908F5819C9EBFC0088BCA9 /* b2ContactManager.cpp in Sources */,
-				92908F6019C9EBFC0088BCA9 /* b2EdgeAndCircleContact.cpp in Sources */,
-				92908F6D19C9EBFC0088BCA9 /* b2RevoluteJoint.cpp in Sources */,
+				9271CF191BAB66B50085E667 /* b2CircleShape.cpp in Sources */,
+				9271CF381BAB66B50085E667 /* b2PulleyJoint.cpp in Sources */,
+				9271CF1E1BAB66B50085E667 /* b2Math.cpp in Sources */,
+				9271CF2E1BAB66B50085E667 /* b2EdgeAndPolygonContact.cpp in Sources */,
+				9271CF141BAB66B50085E667 /* b2Collision.cpp in Sources */,
+				9271CF341BAB66B50085E667 /* b2Joint.cpp in Sources */,
+				9271CF231BAB66B50085E667 /* b2ContactManager.cpp in Sources */,
+				9271CF301BAB66B50085E667 /* b2PolygonContact.cpp in Sources */,
 				2DC477AC10D6C07B3FE008F6 /* Box2DDebugDraw.cpp in Sources */,
-				92908F4A19C9EBFC0088BCA9 /* b2Distance.cpp in Sources */,
-				92908F5A19C9EBFC0088BCA9 /* b2Island.cpp in Sources */,
-				92908F5C19C9EBFC0088BCA9 /* b2WorldCallbacks.cpp in Sources */,
-				92908F4B19C9EBFC0088BCA9 /* b2DynamicTree.cpp in Sources */,
-				92908F5119C9EBFC0088BCA9 /* b2BlockAllocator.cpp in Sources */,
-				92908F5D19C9EBFC0088BCA9 /* b2CircleContact.cpp in Sources */,
-				92908F6E19C9EBFC0088BCA9 /* b2RopeJoint.cpp in Sources */,
-				92908F5219C9EBFC0088BCA9 /* b2Draw.cpp in Sources */,
-				92908F4E19C9EBFC0088BCA9 /* b2EdgeShape.cpp in Sources */,
-				92908F7119C9EBFC0088BCA9 /* b2Rope.cpp in Sources */,
-				92908F5019C9EBFC0088BCA9 /* b2PolygonShape.cpp in Sources */,
+				9271CF151BAB66B50085E667 /* b2Distance.cpp in Sources */,
+				9271CF2B1BAB66B50085E667 /* b2Contact.cpp in Sources */,
+				9271CF251BAB66B50085E667 /* b2Island.cpp in Sources */,
+				9271CF271BAB66B50085E667 /* b2WorldCallbacks.cpp in Sources */,
+				9271CF161BAB66B50085E667 /* b2DynamicTree.cpp in Sources */,
+				9271CF2D1BAB66B50085E667 /* b2EdgeAndCircleContact.cpp in Sources */,
+				9271CF1C1BAB66B50085E667 /* b2BlockAllocator.cpp in Sources */,
+				9271CF1D1BAB66B50085E667 /* b2Draw.cpp in Sources */,
 				DA49ED8903C628BA578C8670 /* entry_point.cpp in Sources */,
-				92908F6B19C9EBFC0088BCA9 /* b2PrismaticJoint.cpp in Sources */,
-				92908F4D19C9EBFC0088BCA9 /* b2CircleShape.cpp in Sources */,
-				92908F5519C9EBFC0088BCA9 /* b2StackAllocator.cpp in Sources */,
-				92908F5719C9EBFC0088BCA9 /* b2Body.cpp in Sources */,
-				92908F6419C9EBFC0088BCA9 /* b2PolygonAndCircleContact.cpp in Sources */,
-				92908F5E19C9EBFC0088BCA9 /* b2Contact.cpp in Sources */,
-				92908F6719C9EBFC0088BCA9 /* b2FrictionJoint.cpp in Sources */,
-				92908F6F19C9EBFC0088BCA9 /* b2WeldJoint.cpp in Sources */,
-				92908F4C19C9EBFC0088BCA9 /* b2TimeOfImpact.cpp in Sources */,
-				92908F6819C9EBFC0088BCA9 /* b2GearJoint.cpp in Sources */,
-				92908F4619C9EBFC0088BCA9 /* b2CollideCircle.cpp in Sources */,
-				92908F5919C9EBFC0088BCA9 /* b2Fixture.cpp in Sources */,
-				92908F4519C9EBFC0088BCA9 /* b2BroadPhase.cpp in Sources */,
-				92908F5B19C9EBFC0088BCA9 /* b2World.cpp in Sources */,
-				92908F6319C9EBFC0088BCA9 /* b2LoopAndPolygonContact.cpp in Sources */,
+				9271CF3B1BAB66B50085E667 /* b2WeldJoint.cpp in Sources */,
+				9271CF1B1BAB66B50085E667 /* b2PolygonShape.cpp in Sources */,
+				9271CF291BAB66B50085E667 /* b2ChainAndPolygonContact.cpp in Sources */,
+				9271CF171BAB66B50085E667 /* b2TimeOfImpact.cpp in Sources */,
+				9271CF111BAB66B50085E667 /* b2CollideCircle.cpp in Sources */,
+				9271CF201BAB66B50085E667 /* b2StackAllocator.cpp in Sources */,
+				9271CF391BAB66B50085E667 /* b2RevoluteJoint.cpp in Sources */,
+				9271CF281BAB66B50085E667 /* b2ChainAndCircleContact.cpp in Sources */,
+				9271CF2F1BAB66B50085E667 /* b2PolygonAndCircleContact.cpp in Sources */,
+				9271CF2A1BAB66B50085E667 /* b2CircleContact.cpp in Sources */,
+				9271CF321BAB66B50085E667 /* b2FrictionJoint.cpp in Sources */,
+				9271CF3A1BAB66B50085E667 /* b2RopeJoint.cpp in Sources */,
+				9271CF3C1BAB66B50085E667 /* b2WheelJoint.cpp in Sources */,
+				9271CF221BAB66B50085E667 /* b2Body.cpp in Sources */,
+				9271CF331BAB66B50085E667 /* b2GearJoint.cpp in Sources */,
+				9271CF101BAB66B50085E667 /* b2BroadPhase.cpp in Sources */,
 				C8860D93875589970329DCCD /* example.cpp in Sources */,
-				92908F5619C9EBFC0088BCA9 /* b2Timer.cpp in Sources */,
-				92908F6619C9EBFC0088BCA9 /* b2DistanceJoint.cpp in Sources */,
-				92908F6119C9EBFC0088BCA9 /* b2EdgeAndPolygonContact.cpp in Sources */,
-				92908F5419C9EBFC0088BCA9 /* b2Settings.cpp in Sources */,
-				92908F4819C9EBFC0088BCA9 /* b2CollidePolygon.cpp in Sources */,
-				92908F7019C9EBFC0088BCA9 /* b2WheelJoint.cpp in Sources */,
-				92908F4719C9EBFC0088BCA9 /* b2CollideEdge.cpp in Sources */,
-				92908F6C19C9EBFC0088BCA9 /* b2PulleyJoint.cpp in Sources */,
+				9271CF241BAB66B50085E667 /* b2Fixture.cpp in Sources */,
+				9271CF181BAB66B50085E667 /* b2ChainShape.cpp in Sources */,
+				9271CF3D1BAB66B50085E667 /* b2Rope.cpp in Sources */,
+				9271CF361BAB66B50085E667 /* b2MouseJoint.cpp in Sources */,
+				9271CF261BAB66B50085E667 /* b2World.cpp in Sources */,
+				9271CF131BAB66B50085E667 /* b2CollidePolygon.cpp in Sources */,
+				9271CF371BAB66B50085E667 /* b2PrismaticJoint.cpp in Sources */,
+				9271CF211BAB66B50085E667 /* b2Timer.cpp in Sources */,
+				9271CF311BAB66B50085E667 /* b2DistanceJoint.cpp in Sources */,
+				9271CF1F1BAB66B50085E667 /* b2Settings.cpp in Sources */,
+				9271CF351BAB66B50085E667 /* b2MotorJoint.cpp in Sources */,
+				9271CF1A1BAB66B50085E667 /* b2EdgeShape.cpp in Sources */,
+				9271CF121BAB66B50085E667 /* b2CollideEdge.cpp in Sources */,
+				9271CF2C1BAB66B50085E667 /* b2ContactSolver.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 301 - 295
examples/DemoBox2D/proj.macosx/DemoBox2D_macosx.xcodeproj/project.pbxproj

@@ -18,51 +18,52 @@
 		1E839D002B2BA83FC83A695A /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = 04FE4D4FB640E0DF92DFB865 /* fonts */; };
 		2DC477AC10D6C07B3FE008F6 /* Box2DDebugDraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 360377333740D8A2FD15BBE6 /* Box2DDebugDraw.cpp */; };
 		3A631A475DE035FC53ADE5EA /* images in Resources */ = {isa = PBXBuildFile; fileRef = 7F3B12E3C9D554D9FE28101D /* images */; };
-		92908FDB19C9ECC00088BCA9 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F7B19C9ECBF0088BCA9 /* b2BroadPhase.cpp */; };
-		92908FDC19C9ECC00088BCA9 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F7D19C9ECBF0088BCA9 /* b2CollideCircle.cpp */; };
-		92908FDD19C9ECC00088BCA9 /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F7E19C9ECBF0088BCA9 /* b2CollideEdge.cpp */; };
-		92908FDE19C9ECC00088BCA9 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F7F19C9ECBF0088BCA9 /* b2CollidePolygon.cpp */; };
-		92908FDF19C9ECC00088BCA9 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F8019C9ECC00088BCA9 /* b2Collision.cpp */; };
-		92908FE019C9ECC00088BCA9 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F8219C9ECC00088BCA9 /* b2Distance.cpp */; };
-		92908FE119C9ECC00088BCA9 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F8419C9ECC00088BCA9 /* b2DynamicTree.cpp */; };
-		92908FE219C9ECC00088BCA9 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F8619C9ECC00088BCA9 /* b2TimeOfImpact.cpp */; };
-		92908FE319C9ECC00088BCA9 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F8919C9ECC00088BCA9 /* b2CircleShape.cpp */; };
-		92908FE419C9ECC00088BCA9 /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F8B19C9ECC00088BCA9 /* b2EdgeShape.cpp */; };
-		92908FE519C9ECC00088BCA9 /* b2LoopShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F8D19C9ECC00088BCA9 /* b2LoopShape.cpp */; };
-		92908FE619C9ECC00088BCA9 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F8F19C9ECC00088BCA9 /* b2PolygonShape.cpp */; };
-		92908FE719C9ECC00088BCA9 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F9319C9ECC00088BCA9 /* b2BlockAllocator.cpp */; };
-		92908FE819C9ECC00088BCA9 /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F9519C9ECC00088BCA9 /* b2Draw.cpp */; };
-		92908FE919C9ECC00088BCA9 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F9819C9ECC00088BCA9 /* b2Math.cpp */; };
-		92908FEA19C9ECC00088BCA9 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F9A19C9ECC00088BCA9 /* b2Settings.cpp */; };
-		92908FEB19C9ECC00088BCA9 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F9C19C9ECC00088BCA9 /* b2StackAllocator.cpp */; };
-		92908FEC19C9ECC00088BCA9 /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908F9E19C9ECC00088BCA9 /* b2Timer.cpp */; };
-		92908FED19C9ECC00088BCA9 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FA119C9ECC00088BCA9 /* b2Body.cpp */; };
-		92908FEE19C9ECC00088BCA9 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FA319C9ECC00088BCA9 /* b2ContactManager.cpp */; };
-		92908FEF19C9ECC00088BCA9 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FA519C9ECC00088BCA9 /* b2Fixture.cpp */; };
-		92908FF019C9ECC00088BCA9 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FA719C9ECC00088BCA9 /* b2Island.cpp */; };
-		92908FF119C9ECC00088BCA9 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FAA19C9ECC00088BCA9 /* b2World.cpp */; };
-		92908FF219C9ECC00088BCA9 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FAC19C9ECC00088BCA9 /* b2WorldCallbacks.cpp */; };
-		92908FF319C9ECC00088BCA9 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FAF19C9ECC00088BCA9 /* b2CircleContact.cpp */; };
-		92908FF419C9ECC00088BCA9 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FB119C9ECC00088BCA9 /* b2Contact.cpp */; };
-		92908FF519C9ECC00088BCA9 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FB319C9ECC00088BCA9 /* b2ContactSolver.cpp */; };
-		92908FF619C9ECC00088BCA9 /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FB519C9ECC00088BCA9 /* b2EdgeAndCircleContact.cpp */; };
-		92908FF719C9ECC00088BCA9 /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FB719C9ECC00088BCA9 /* b2EdgeAndPolygonContact.cpp */; };
-		92908FF819C9ECC00088BCA9 /* b2LoopAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FB919C9ECC00088BCA9 /* b2LoopAndCircleContact.cpp */; };
-		92908FF919C9ECC00088BCA9 /* b2LoopAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FBB19C9ECC00088BCA9 /* b2LoopAndPolygonContact.cpp */; };
-		92908FFA19C9ECC00088BCA9 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FBD19C9ECC00088BCA9 /* b2PolygonAndCircleContact.cpp */; };
-		92908FFB19C9ECC00088BCA9 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FBF19C9ECC00088BCA9 /* b2PolygonContact.cpp */; };
-		92908FFC19C9ECC00088BCA9 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FC219C9ECC00088BCA9 /* b2DistanceJoint.cpp */; };
-		92908FFD19C9ECC00088BCA9 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FC419C9ECC00088BCA9 /* b2FrictionJoint.cpp */; };
-		92908FFE19C9ECC00088BCA9 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FC619C9ECC00088BCA9 /* b2GearJoint.cpp */; };
-		92908FFF19C9ECC00088BCA9 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FC819C9ECC00088BCA9 /* b2Joint.cpp */; };
-		9290900019C9ECC00088BCA9 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FCA19C9ECC00088BCA9 /* b2MouseJoint.cpp */; };
-		9290900119C9ECC00088BCA9 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FCC19C9ECC00088BCA9 /* b2PrismaticJoint.cpp */; };
-		9290900219C9ECC00088BCA9 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FCE19C9ECC00088BCA9 /* b2PulleyJoint.cpp */; };
-		9290900319C9ECC00088BCA9 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FD019C9ECC00088BCA9 /* b2RevoluteJoint.cpp */; };
-		9290900419C9ECC00088BCA9 /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FD219C9ECC00088BCA9 /* b2RopeJoint.cpp */; };
-		9290900519C9ECC00088BCA9 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FD419C9ECC00088BCA9 /* b2WeldJoint.cpp */; };
-		9290900619C9ECC00088BCA9 /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FD619C9ECC00088BCA9 /* b2WheelJoint.cpp */; };
-		9290900719C9ECC00088BCA9 /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 92908FD919C9ECC00088BCA9 /* b2Rope.cpp */; };
+		9271CE7A1BAB66780085E667 /* b2BroadPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE181BAB66780085E667 /* b2BroadPhase.cpp */; };
+		9271CE7B1BAB66780085E667 /* b2CollideCircle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE1A1BAB66780085E667 /* b2CollideCircle.cpp */; };
+		9271CE7C1BAB66780085E667 /* b2CollideEdge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE1B1BAB66780085E667 /* b2CollideEdge.cpp */; };
+		9271CE7D1BAB66780085E667 /* b2CollidePolygon.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE1C1BAB66780085E667 /* b2CollidePolygon.cpp */; };
+		9271CE7E1BAB66780085E667 /* b2Collision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE1D1BAB66780085E667 /* b2Collision.cpp */; };
+		9271CE7F1BAB66780085E667 /* b2Distance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE1F1BAB66780085E667 /* b2Distance.cpp */; };
+		9271CE801BAB66780085E667 /* b2DynamicTree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE211BAB66780085E667 /* b2DynamicTree.cpp */; };
+		9271CE811BAB66780085E667 /* b2TimeOfImpact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE231BAB66780085E667 /* b2TimeOfImpact.cpp */; };
+		9271CE821BAB66780085E667 /* b2ChainShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE261BAB66780085E667 /* b2ChainShape.cpp */; };
+		9271CE831BAB66780085E667 /* b2CircleShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE281BAB66780085E667 /* b2CircleShape.cpp */; };
+		9271CE841BAB66780085E667 /* b2EdgeShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE2A1BAB66780085E667 /* b2EdgeShape.cpp */; };
+		9271CE851BAB66780085E667 /* b2PolygonShape.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE2C1BAB66780085E667 /* b2PolygonShape.cpp */; };
+		9271CE861BAB66780085E667 /* b2BlockAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE301BAB66780085E667 /* b2BlockAllocator.cpp */; };
+		9271CE871BAB66780085E667 /* b2Draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE321BAB66780085E667 /* b2Draw.cpp */; };
+		9271CE881BAB66780085E667 /* b2Math.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE351BAB66780085E667 /* b2Math.cpp */; };
+		9271CE891BAB66780085E667 /* b2Settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE371BAB66780085E667 /* b2Settings.cpp */; };
+		9271CE8A1BAB66780085E667 /* b2StackAllocator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE391BAB66780085E667 /* b2StackAllocator.cpp */; };
+		9271CE8B1BAB66780085E667 /* b2Timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE3B1BAB66780085E667 /* b2Timer.cpp */; };
+		9271CE8C1BAB66780085E667 /* b2Body.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE3E1BAB66780085E667 /* b2Body.cpp */; };
+		9271CE8D1BAB66780085E667 /* b2ContactManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE401BAB66780085E667 /* b2ContactManager.cpp */; };
+		9271CE8E1BAB66780085E667 /* b2Fixture.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE421BAB66780085E667 /* b2Fixture.cpp */; };
+		9271CE8F1BAB66780085E667 /* b2Island.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE441BAB66780085E667 /* b2Island.cpp */; };
+		9271CE901BAB66780085E667 /* b2World.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE471BAB66780085E667 /* b2World.cpp */; };
+		9271CE911BAB66780085E667 /* b2WorldCallbacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE491BAB66780085E667 /* b2WorldCallbacks.cpp */; };
+		9271CE921BAB66780085E667 /* b2ChainAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE4C1BAB66780085E667 /* b2ChainAndCircleContact.cpp */; };
+		9271CE931BAB66780085E667 /* b2ChainAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE4E1BAB66780085E667 /* b2ChainAndPolygonContact.cpp */; };
+		9271CE941BAB66780085E667 /* b2CircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE501BAB66780085E667 /* b2CircleContact.cpp */; };
+		9271CE951BAB66780085E667 /* b2Contact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE521BAB66780085E667 /* b2Contact.cpp */; };
+		9271CE961BAB66780085E667 /* b2ContactSolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE541BAB66780085E667 /* b2ContactSolver.cpp */; };
+		9271CE971BAB66780085E667 /* b2EdgeAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE561BAB66780085E667 /* b2EdgeAndCircleContact.cpp */; };
+		9271CE981BAB66780085E667 /* b2EdgeAndPolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE581BAB66780085E667 /* b2EdgeAndPolygonContact.cpp */; };
+		9271CE991BAB66780085E667 /* b2PolygonAndCircleContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE5A1BAB66780085E667 /* b2PolygonAndCircleContact.cpp */; };
+		9271CE9A1BAB66780085E667 /* b2PolygonContact.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE5C1BAB66780085E667 /* b2PolygonContact.cpp */; };
+		9271CE9B1BAB66780085E667 /* b2DistanceJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE5F1BAB66780085E667 /* b2DistanceJoint.cpp */; };
+		9271CE9C1BAB66780085E667 /* b2FrictionJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE611BAB66780085E667 /* b2FrictionJoint.cpp */; };
+		9271CE9D1BAB66780085E667 /* b2GearJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE631BAB66780085E667 /* b2GearJoint.cpp */; };
+		9271CE9E1BAB66780085E667 /* b2Joint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE651BAB66780085E667 /* b2Joint.cpp */; };
+		9271CE9F1BAB66780085E667 /* b2MotorJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE671BAB66780085E667 /* b2MotorJoint.cpp */; };
+		9271CEA01BAB66780085E667 /* b2MouseJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE691BAB66780085E667 /* b2MouseJoint.cpp */; };
+		9271CEA11BAB66780085E667 /* b2PrismaticJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE6B1BAB66780085E667 /* b2PrismaticJoint.cpp */; };
+		9271CEA21BAB66780085E667 /* b2PulleyJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE6D1BAB66780085E667 /* b2PulleyJoint.cpp */; };
+		9271CEA31BAB66780085E667 /* b2RevoluteJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE6F1BAB66780085E667 /* b2RevoluteJoint.cpp */; };
+		9271CEA41BAB66780085E667 /* b2RopeJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE711BAB66780085E667 /* b2RopeJoint.cpp */; };
+		9271CEA51BAB66780085E667 /* b2WeldJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE731BAB66780085E667 /* b2WeldJoint.cpp */; };
+		9271CEA61BAB66780085E667 /* b2WheelJoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE751BAB66780085E667 /* b2WheelJoint.cpp */; };
+		9271CEA71BAB66780085E667 /* b2Rope.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9271CE781BAB66780085E667 /* b2Rope.cpp */; };
 		C8860D93875589970329DCCD /* example.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4DA100C319512824B7570663 /* example.cpp */; };
 		CD59C69314E9E74CD0A11E03 /* res.xml in Resources */ = {isa = PBXBuildFile; fileRef = F6123B1E6FE4471A00F49751 /* res.xml */; };
 		DA49ED8903C628BA578C8670 /* entry_point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0BF9628FC8D38F9748F0CDEB /* entry_point.cpp */; };
@@ -143,97 +144,99 @@
 		4DA100C319512824B7570663 /* example.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = example.cpp; path = ../src/example.cpp; sourceTree = "<group>"; };
 		5DE458993031811A4C7D28C1 /* Box2DDebugDraw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Box2DDebugDraw.h; path = ../src/Box2DDebugDraw.h; sourceTree = "<group>"; };
 		7F3B12E3C9D554D9FE28101D /* images */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = folder; name = images; path = ../data/images; sourceTree = "<group>"; };
-		92908F7919C9ECBF0088BCA9 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = "<group>"; };
-		92908F7B19C9ECBF0088BCA9 /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = "<group>"; };
-		92908F7C19C9ECBF0088BCA9 /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = "<group>"; };
-		92908F7D19C9ECBF0088BCA9 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = "<group>"; };
-		92908F7E19C9ECBF0088BCA9 /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = "<group>"; };
-		92908F7F19C9ECBF0088BCA9 /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = "<group>"; };
-		92908F8019C9ECC00088BCA9 /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = "<group>"; };
-		92908F8119C9ECC00088BCA9 /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = "<group>"; };
-		92908F8219C9ECC00088BCA9 /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = "<group>"; };
-		92908F8319C9ECC00088BCA9 /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = "<group>"; };
-		92908F8419C9ECC00088BCA9 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = "<group>"; };
-		92908F8519C9ECC00088BCA9 /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = "<group>"; };
-		92908F8619C9ECC00088BCA9 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = "<group>"; };
-		92908F8719C9ECC00088BCA9 /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = "<group>"; };
-		92908F8919C9ECC00088BCA9 /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = "<group>"; };
-		92908F8A19C9ECC00088BCA9 /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = "<group>"; };
-		92908F8B19C9ECC00088BCA9 /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = "<group>"; };
-		92908F8C19C9ECC00088BCA9 /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = "<group>"; };
-		92908F8D19C9ECC00088BCA9 /* b2LoopShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LoopShape.cpp; sourceTree = "<group>"; };
-		92908F8E19C9ECC00088BCA9 /* b2LoopShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LoopShape.h; sourceTree = "<group>"; };
-		92908F8F19C9ECC00088BCA9 /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = "<group>"; };
-		92908F9019C9ECC00088BCA9 /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = "<group>"; };
-		92908F9119C9ECC00088BCA9 /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = "<group>"; };
-		92908F9319C9ECC00088BCA9 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = "<group>"; };
-		92908F9419C9ECC00088BCA9 /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = "<group>"; };
-		92908F9519C9ECC00088BCA9 /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = "<group>"; };
-		92908F9619C9ECC00088BCA9 /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = "<group>"; };
-		92908F9719C9ECC00088BCA9 /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = "<group>"; };
-		92908F9819C9ECC00088BCA9 /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = "<group>"; };
-		92908F9919C9ECC00088BCA9 /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = "<group>"; };
-		92908F9A19C9ECC00088BCA9 /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = "<group>"; };
-		92908F9B19C9ECC00088BCA9 /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = "<group>"; };
-		92908F9C19C9ECC00088BCA9 /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = "<group>"; };
-		92908F9D19C9ECC00088BCA9 /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = "<group>"; };
-		92908F9E19C9ECC00088BCA9 /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = "<group>"; };
-		92908F9F19C9ECC00088BCA9 /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = "<group>"; };
-		92908FA119C9ECC00088BCA9 /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = "<group>"; };
-		92908FA219C9ECC00088BCA9 /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = "<group>"; };
-		92908FA319C9ECC00088BCA9 /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = "<group>"; };
-		92908FA419C9ECC00088BCA9 /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = "<group>"; };
-		92908FA519C9ECC00088BCA9 /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = "<group>"; };
-		92908FA619C9ECC00088BCA9 /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = "<group>"; };
-		92908FA719C9ECC00088BCA9 /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = "<group>"; };
-		92908FA819C9ECC00088BCA9 /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = "<group>"; };
-		92908FA919C9ECC00088BCA9 /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = "<group>"; };
-		92908FAA19C9ECC00088BCA9 /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = "<group>"; };
-		92908FAB19C9ECC00088BCA9 /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = "<group>"; };
-		92908FAC19C9ECC00088BCA9 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = "<group>"; };
-		92908FAD19C9ECC00088BCA9 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = "<group>"; };
-		92908FAF19C9ECC00088BCA9 /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = "<group>"; };
-		92908FB019C9ECC00088BCA9 /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = "<group>"; };
-		92908FB119C9ECC00088BCA9 /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = "<group>"; };
-		92908FB219C9ECC00088BCA9 /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = "<group>"; };
-		92908FB319C9ECC00088BCA9 /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = "<group>"; };
-		92908FB419C9ECC00088BCA9 /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = "<group>"; };
-		92908FB519C9ECC00088BCA9 /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = "<group>"; };
-		92908FB619C9ECC00088BCA9 /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = "<group>"; };
-		92908FB719C9ECC00088BCA9 /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = "<group>"; };
-		92908FB819C9ECC00088BCA9 /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = "<group>"; };
-		92908FB919C9ECC00088BCA9 /* b2LoopAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LoopAndCircleContact.cpp; sourceTree = "<group>"; };
-		92908FBA19C9ECC00088BCA9 /* b2LoopAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LoopAndCircleContact.h; sourceTree = "<group>"; };
-		92908FBB19C9ECC00088BCA9 /* b2LoopAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2LoopAndPolygonContact.cpp; sourceTree = "<group>"; };
-		92908FBC19C9ECC00088BCA9 /* b2LoopAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2LoopAndPolygonContact.h; sourceTree = "<group>"; };
-		92908FBD19C9ECC00088BCA9 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = "<group>"; };
-		92908FBE19C9ECC00088BCA9 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = "<group>"; };
-		92908FBF19C9ECC00088BCA9 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = "<group>"; };
-		92908FC019C9ECC00088BCA9 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = "<group>"; };
-		92908FC219C9ECC00088BCA9 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = "<group>"; };
-		92908FC319C9ECC00088BCA9 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = "<group>"; };
-		92908FC419C9ECC00088BCA9 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = "<group>"; };
-		92908FC519C9ECC00088BCA9 /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = "<group>"; };
-		92908FC619C9ECC00088BCA9 /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = "<group>"; };
-		92908FC719C9ECC00088BCA9 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = "<group>"; };
-		92908FC819C9ECC00088BCA9 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = "<group>"; };
-		92908FC919C9ECC00088BCA9 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = "<group>"; };
-		92908FCA19C9ECC00088BCA9 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = "<group>"; };
-		92908FCB19C9ECC00088BCA9 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = "<group>"; };
-		92908FCC19C9ECC00088BCA9 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = "<group>"; };
-		92908FCD19C9ECC00088BCA9 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = "<group>"; };
-		92908FCE19C9ECC00088BCA9 /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = "<group>"; };
-		92908FCF19C9ECC00088BCA9 /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = "<group>"; };
-		92908FD019C9ECC00088BCA9 /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = "<group>"; };
-		92908FD119C9ECC00088BCA9 /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = "<group>"; };
-		92908FD219C9ECC00088BCA9 /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = "<group>"; };
-		92908FD319C9ECC00088BCA9 /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = "<group>"; };
-		92908FD419C9ECC00088BCA9 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = "<group>"; };
-		92908FD519C9ECC00088BCA9 /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = "<group>"; };
-		92908FD619C9ECC00088BCA9 /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = "<group>"; };
-		92908FD719C9ECC00088BCA9 /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = "<group>"; };
-		92908FD919C9ECC00088BCA9 /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = "<group>"; };
-		92908FDA19C9ECC00088BCA9 /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = "<group>"; };
+		9271CE161BAB66780085E667 /* Box2D.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Box2D.h; sourceTree = "<group>"; };
+		9271CE181BAB66780085E667 /* b2BroadPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BroadPhase.cpp; sourceTree = "<group>"; };
+		9271CE191BAB66780085E667 /* b2BroadPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BroadPhase.h; sourceTree = "<group>"; };
+		9271CE1A1BAB66780085E667 /* b2CollideCircle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideCircle.cpp; sourceTree = "<group>"; };
+		9271CE1B1BAB66780085E667 /* b2CollideEdge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollideEdge.cpp; sourceTree = "<group>"; };
+		9271CE1C1BAB66780085E667 /* b2CollidePolygon.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CollidePolygon.cpp; sourceTree = "<group>"; };
+		9271CE1D1BAB66780085E667 /* b2Collision.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Collision.cpp; sourceTree = "<group>"; };
+		9271CE1E1BAB66780085E667 /* b2Collision.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Collision.h; sourceTree = "<group>"; };
+		9271CE1F1BAB66780085E667 /* b2Distance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Distance.cpp; sourceTree = "<group>"; };
+		9271CE201BAB66780085E667 /* b2Distance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Distance.h; sourceTree = "<group>"; };
+		9271CE211BAB66780085E667 /* b2DynamicTree.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DynamicTree.cpp; sourceTree = "<group>"; };
+		9271CE221BAB66780085E667 /* b2DynamicTree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DynamicTree.h; sourceTree = "<group>"; };
+		9271CE231BAB66780085E667 /* b2TimeOfImpact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2TimeOfImpact.cpp; sourceTree = "<group>"; };
+		9271CE241BAB66780085E667 /* b2TimeOfImpact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeOfImpact.h; sourceTree = "<group>"; };
+		9271CE261BAB66780085E667 /* b2ChainShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainShape.cpp; sourceTree = "<group>"; };
+		9271CE271BAB66780085E667 /* b2ChainShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainShape.h; sourceTree = "<group>"; };
+		9271CE281BAB66780085E667 /* b2CircleShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleShape.cpp; sourceTree = "<group>"; };
+		9271CE291BAB66780085E667 /* b2CircleShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleShape.h; sourceTree = "<group>"; };
+		9271CE2A1BAB66780085E667 /* b2EdgeShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeShape.cpp; sourceTree = "<group>"; };
+		9271CE2B1BAB66780085E667 /* b2EdgeShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeShape.h; sourceTree = "<group>"; };
+		9271CE2C1BAB66780085E667 /* b2PolygonShape.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonShape.cpp; sourceTree = "<group>"; };
+		9271CE2D1BAB66780085E667 /* b2PolygonShape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonShape.h; sourceTree = "<group>"; };
+		9271CE2E1BAB66780085E667 /* b2Shape.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Shape.h; sourceTree = "<group>"; };
+		9271CE301BAB66780085E667 /* b2BlockAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2BlockAllocator.cpp; sourceTree = "<group>"; };
+		9271CE311BAB66780085E667 /* b2BlockAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2BlockAllocator.h; sourceTree = "<group>"; };
+		9271CE321BAB66780085E667 /* b2Draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Draw.cpp; sourceTree = "<group>"; };
+		9271CE331BAB66780085E667 /* b2Draw.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Draw.h; sourceTree = "<group>"; };
+		9271CE341BAB66780085E667 /* b2GrowableStack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GrowableStack.h; sourceTree = "<group>"; };
+		9271CE351BAB66780085E667 /* b2Math.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Math.cpp; sourceTree = "<group>"; };
+		9271CE361BAB66780085E667 /* b2Math.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Math.h; sourceTree = "<group>"; };
+		9271CE371BAB66780085E667 /* b2Settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Settings.cpp; sourceTree = "<group>"; };
+		9271CE381BAB66780085E667 /* b2Settings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Settings.h; sourceTree = "<group>"; };
+		9271CE391BAB66780085E667 /* b2StackAllocator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2StackAllocator.cpp; sourceTree = "<group>"; };
+		9271CE3A1BAB66780085E667 /* b2StackAllocator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2StackAllocator.h; sourceTree = "<group>"; };
+		9271CE3B1BAB66780085E667 /* b2Timer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Timer.cpp; sourceTree = "<group>"; };
+		9271CE3C1BAB66780085E667 /* b2Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Timer.h; sourceTree = "<group>"; };
+		9271CE3E1BAB66780085E667 /* b2Body.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Body.cpp; sourceTree = "<group>"; };
+		9271CE3F1BAB66780085E667 /* b2Body.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Body.h; sourceTree = "<group>"; };
+		9271CE401BAB66780085E667 /* b2ContactManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactManager.cpp; sourceTree = "<group>"; };
+		9271CE411BAB66780085E667 /* b2ContactManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactManager.h; sourceTree = "<group>"; };
+		9271CE421BAB66780085E667 /* b2Fixture.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Fixture.cpp; sourceTree = "<group>"; };
+		9271CE431BAB66780085E667 /* b2Fixture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Fixture.h; sourceTree = "<group>"; };
+		9271CE441BAB66780085E667 /* b2Island.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Island.cpp; sourceTree = "<group>"; };
+		9271CE451BAB66780085E667 /* b2Island.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Island.h; sourceTree = "<group>"; };
+		9271CE461BAB66780085E667 /* b2TimeStep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2TimeStep.h; sourceTree = "<group>"; };
+		9271CE471BAB66780085E667 /* b2World.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2World.cpp; sourceTree = "<group>"; };
+		9271CE481BAB66780085E667 /* b2World.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2World.h; sourceTree = "<group>"; };
+		9271CE491BAB66780085E667 /* b2WorldCallbacks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WorldCallbacks.cpp; sourceTree = "<group>"; };
+		9271CE4A1BAB66780085E667 /* b2WorldCallbacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WorldCallbacks.h; sourceTree = "<group>"; };
+		9271CE4C1BAB66780085E667 /* b2ChainAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndCircleContact.cpp; sourceTree = "<group>"; };
+		9271CE4D1BAB66780085E667 /* b2ChainAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndCircleContact.h; sourceTree = "<group>"; };
+		9271CE4E1BAB66780085E667 /* b2ChainAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ChainAndPolygonContact.cpp; sourceTree = "<group>"; };
+		9271CE4F1BAB66780085E667 /* b2ChainAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ChainAndPolygonContact.h; sourceTree = "<group>"; };
+		9271CE501BAB66780085E667 /* b2CircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2CircleContact.cpp; sourceTree = "<group>"; };
+		9271CE511BAB66780085E667 /* b2CircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2CircleContact.h; sourceTree = "<group>"; };
+		9271CE521BAB66780085E667 /* b2Contact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Contact.cpp; sourceTree = "<group>"; };
+		9271CE531BAB66780085E667 /* b2Contact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Contact.h; sourceTree = "<group>"; };
+		9271CE541BAB66780085E667 /* b2ContactSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2ContactSolver.cpp; sourceTree = "<group>"; };
+		9271CE551BAB66780085E667 /* b2ContactSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2ContactSolver.h; sourceTree = "<group>"; };
+		9271CE561BAB66780085E667 /* b2EdgeAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndCircleContact.cpp; sourceTree = "<group>"; };
+		9271CE571BAB66780085E667 /* b2EdgeAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndCircleContact.h; sourceTree = "<group>"; };
+		9271CE581BAB66780085E667 /* b2EdgeAndPolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2EdgeAndPolygonContact.cpp; sourceTree = "<group>"; };
+		9271CE591BAB66780085E667 /* b2EdgeAndPolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2EdgeAndPolygonContact.h; sourceTree = "<group>"; };
+		9271CE5A1BAB66780085E667 /* b2PolygonAndCircleContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonAndCircleContact.cpp; sourceTree = "<group>"; };
+		9271CE5B1BAB66780085E667 /* b2PolygonAndCircleContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonAndCircleContact.h; sourceTree = "<group>"; };
+		9271CE5C1BAB66780085E667 /* b2PolygonContact.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PolygonContact.cpp; sourceTree = "<group>"; };
+		9271CE5D1BAB66780085E667 /* b2PolygonContact.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PolygonContact.h; sourceTree = "<group>"; };
+		9271CE5F1BAB66780085E667 /* b2DistanceJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2DistanceJoint.cpp; sourceTree = "<group>"; };
+		9271CE601BAB66780085E667 /* b2DistanceJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2DistanceJoint.h; sourceTree = "<group>"; };
+		9271CE611BAB66780085E667 /* b2FrictionJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2FrictionJoint.cpp; sourceTree = "<group>"; };
+		9271CE621BAB66780085E667 /* b2FrictionJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2FrictionJoint.h; sourceTree = "<group>"; };
+		9271CE631BAB66780085E667 /* b2GearJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2GearJoint.cpp; sourceTree = "<group>"; };
+		9271CE641BAB66780085E667 /* b2GearJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2GearJoint.h; sourceTree = "<group>"; };
+		9271CE651BAB66780085E667 /* b2Joint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Joint.cpp; sourceTree = "<group>"; };
+		9271CE661BAB66780085E667 /* b2Joint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Joint.h; sourceTree = "<group>"; };
+		9271CE671BAB66780085E667 /* b2MotorJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MotorJoint.cpp; sourceTree = "<group>"; };
+		9271CE681BAB66780085E667 /* b2MotorJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MotorJoint.h; sourceTree = "<group>"; };
+		9271CE691BAB66780085E667 /* b2MouseJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2MouseJoint.cpp; sourceTree = "<group>"; };
+		9271CE6A1BAB66780085E667 /* b2MouseJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2MouseJoint.h; sourceTree = "<group>"; };
+		9271CE6B1BAB66780085E667 /* b2PrismaticJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PrismaticJoint.cpp; sourceTree = "<group>"; };
+		9271CE6C1BAB66780085E667 /* b2PrismaticJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PrismaticJoint.h; sourceTree = "<group>"; };
+		9271CE6D1BAB66780085E667 /* b2PulleyJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2PulleyJoint.cpp; sourceTree = "<group>"; };
+		9271CE6E1BAB66780085E667 /* b2PulleyJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2PulleyJoint.h; sourceTree = "<group>"; };
+		9271CE6F1BAB66780085E667 /* b2RevoluteJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RevoluteJoint.cpp; sourceTree = "<group>"; };
+		9271CE701BAB66780085E667 /* b2RevoluteJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RevoluteJoint.h; sourceTree = "<group>"; };
+		9271CE711BAB66780085E667 /* b2RopeJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2RopeJoint.cpp; sourceTree = "<group>"; };
+		9271CE721BAB66780085E667 /* b2RopeJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2RopeJoint.h; sourceTree = "<group>"; };
+		9271CE731BAB66780085E667 /* b2WeldJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WeldJoint.cpp; sourceTree = "<group>"; };
+		9271CE741BAB66780085E667 /* b2WeldJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WeldJoint.h; sourceTree = "<group>"; };
+		9271CE751BAB66780085E667 /* b2WheelJoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2WheelJoint.cpp; sourceTree = "<group>"; };
+		9271CE761BAB66780085E667 /* b2WheelJoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2WheelJoint.h; sourceTree = "<group>"; };
+		9271CE781BAB66780085E667 /* b2Rope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = b2Rope.cpp; sourceTree = "<group>"; };
+		9271CE791BAB66780085E667 /* b2Rope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = b2Rope.h; sourceTree = "<group>"; };
 		BA41FC88D76540A6905224D6 /* example.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = example.h; path = ../src/example.h; sourceTree = "<group>"; };
 		F6123B1E6FE4471A00F49751 /* res.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = wtf; name = res.xml; path = ../data/res.xml; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -346,169 +349,171 @@
 			name = Products;
 			sourceTree = "<group>";
 		};
-		92908F7419C9ECAC0088BCA9 /* box2d */ = {
-			isa = PBXGroup;
-			children = (
-				92908F7819C9ECBF0088BCA9 /* Box2D */,
-			);
-			name = box2d;
-			sourceTree = "<group>";
-		};
-		92908F7819C9ECBF0088BCA9 /* Box2D */ = {
+		9271CE151BAB66780085E667 /* Box2D */ = {
 			isa = PBXGroup;
 			children = (
-				92908F7919C9ECBF0088BCA9 /* Box2D.h */,
-				92908F7A19C9ECBF0088BCA9 /* Collision */,
-				92908F9219C9ECC00088BCA9 /* Common */,
-				92908FA019C9ECC00088BCA9 /* Dynamics */,
-				92908FD819C9ECC00088BCA9 /* Rope */,
+				9271CE161BAB66780085E667 /* Box2D.h */,
+				9271CE171BAB66780085E667 /* Collision */,
+				9271CE2F1BAB66780085E667 /* Common */,
+				9271CE3D1BAB66780085E667 /* Dynamics */,
+				9271CE771BAB66780085E667 /* Rope */,
 			);
 			name = Box2D;
 			path = ../box2d/Box2D;
 			sourceTree = "<group>";
 		};
-		92908F7A19C9ECBF0088BCA9 /* Collision */ = {
+		9271CE171BAB66780085E667 /* Collision */ = {
 			isa = PBXGroup;
 			children = (
-				92908F7B19C9ECBF0088BCA9 /* b2BroadPhase.cpp */,
-				92908F7C19C9ECBF0088BCA9 /* b2BroadPhase.h */,
-				92908F7D19C9ECBF0088BCA9 /* b2CollideCircle.cpp */,
-				92908F7E19C9ECBF0088BCA9 /* b2CollideEdge.cpp */,
-				92908F7F19C9ECBF0088BCA9 /* b2CollidePolygon.cpp */,
-				92908F8019C9ECC00088BCA9 /* b2Collision.cpp */,
-				92908F8119C9ECC00088BCA9 /* b2Collision.h */,
-				92908F8219C9ECC00088BCA9 /* b2Distance.cpp */,
-				92908F8319C9ECC00088BCA9 /* b2Distance.h */,
-				92908F8419C9ECC00088BCA9 /* b2DynamicTree.cpp */,
-				92908F8519C9ECC00088BCA9 /* b2DynamicTree.h */,
-				92908F8619C9ECC00088BCA9 /* b2TimeOfImpact.cpp */,
-				92908F8719C9ECC00088BCA9 /* b2TimeOfImpact.h */,
-				92908F8819C9ECC00088BCA9 /* Shapes */,
+				9271CE181BAB66780085E667 /* b2BroadPhase.cpp */,
+				9271CE191BAB66780085E667 /* b2BroadPhase.h */,
+				9271CE1A1BAB66780085E667 /* b2CollideCircle.cpp */,
+				9271CE1B1BAB66780085E667 /* b2CollideEdge.cpp */,
+				9271CE1C1BAB66780085E667 /* b2CollidePolygon.cpp */,
+				9271CE1D1BAB66780085E667 /* b2Collision.cpp */,
+				9271CE1E1BAB66780085E667 /* b2Collision.h */,
+				9271CE1F1BAB66780085E667 /* b2Distance.cpp */,
+				9271CE201BAB66780085E667 /* b2Distance.h */,
+				9271CE211BAB66780085E667 /* b2DynamicTree.cpp */,
+				9271CE221BAB66780085E667 /* b2DynamicTree.h */,
+				9271CE231BAB66780085E667 /* b2TimeOfImpact.cpp */,
+				9271CE241BAB66780085E667 /* b2TimeOfImpact.h */,
+				9271CE251BAB66780085E667 /* Shapes */,
 			);
 			path = Collision;
 			sourceTree = "<group>";
 		};
-		92908F8819C9ECC00088BCA9 /* Shapes */ = {
+		9271CE251BAB66780085E667 /* Shapes */ = {
 			isa = PBXGroup;
 			children = (
-				92908F8919C9ECC00088BCA9 /* b2CircleShape.cpp */,
-				92908F8A19C9ECC00088BCA9 /* b2CircleShape.h */,
-				92908F8B19C9ECC00088BCA9 /* b2EdgeShape.cpp */,
-				92908F8C19C9ECC00088BCA9 /* b2EdgeShape.h */,
-				92908F8D19C9ECC00088BCA9 /* b2LoopShape.cpp */,
-				92908F8E19C9ECC00088BCA9 /* b2LoopShape.h */,
-				92908F8F19C9ECC00088BCA9 /* b2PolygonShape.cpp */,
-				92908F9019C9ECC00088BCA9 /* b2PolygonShape.h */,
-				92908F9119C9ECC00088BCA9 /* b2Shape.h */,
+				9271CE261BAB66780085E667 /* b2ChainShape.cpp */,
+				9271CE271BAB66780085E667 /* b2ChainShape.h */,
+				9271CE281BAB66780085E667 /* b2CircleShape.cpp */,
+				9271CE291BAB66780085E667 /* b2CircleShape.h */,
+				9271CE2A1BAB66780085E667 /* b2EdgeShape.cpp */,
+				9271CE2B1BAB66780085E667 /* b2EdgeShape.h */,
+				9271CE2C1BAB66780085E667 /* b2PolygonShape.cpp */,
+				9271CE2D1BAB66780085E667 /* b2PolygonShape.h */,
+				9271CE2E1BAB66780085E667 /* b2Shape.h */,
 			);
 			path = Shapes;
 			sourceTree = "<group>";
 		};
-		92908F9219C9ECC00088BCA9 /* Common */ = {
+		9271CE2F1BAB66780085E667 /* Common */ = {
 			isa = PBXGroup;
 			children = (
-				92908F9319C9ECC00088BCA9 /* b2BlockAllocator.cpp */,
-				92908F9419C9ECC00088BCA9 /* b2BlockAllocator.h */,
-				92908F9519C9ECC00088BCA9 /* b2Draw.cpp */,
-				92908F9619C9ECC00088BCA9 /* b2Draw.h */,
-				92908F9719C9ECC00088BCA9 /* b2GrowableStack.h */,
-				92908F9819C9ECC00088BCA9 /* b2Math.cpp */,
-				92908F9919C9ECC00088BCA9 /* b2Math.h */,
-				92908F9A19C9ECC00088BCA9 /* b2Settings.cpp */,
-				92908F9B19C9ECC00088BCA9 /* b2Settings.h */,
-				92908F9C19C9ECC00088BCA9 /* b2StackAllocator.cpp */,
-				92908F9D19C9ECC00088BCA9 /* b2StackAllocator.h */,
-				92908F9E19C9ECC00088BCA9 /* b2Timer.cpp */,
-				92908F9F19C9ECC00088BCA9 /* b2Timer.h */,
+				9271CE301BAB66780085E667 /* b2BlockAllocator.cpp */,
+				9271CE311BAB66780085E667 /* b2BlockAllocator.h */,
+				9271CE321BAB66780085E667 /* b2Draw.cpp */,
+				9271CE331BAB66780085E667 /* b2Draw.h */,
+				9271CE341BAB66780085E667 /* b2GrowableStack.h */,
+				9271CE351BAB66780085E667 /* b2Math.cpp */,
+				9271CE361BAB66780085E667 /* b2Math.h */,
+				9271CE371BAB66780085E667 /* b2Settings.cpp */,
+				9271CE381BAB66780085E667 /* b2Settings.h */,
+				9271CE391BAB66780085E667 /* b2StackAllocator.cpp */,
+				9271CE3A1BAB66780085E667 /* b2StackAllocator.h */,
+				9271CE3B1BAB66780085E667 /* b2Timer.cpp */,
+				9271CE3C1BAB66780085E667 /* b2Timer.h */,
 			);
 			path = Common;
 			sourceTree = "<group>";
 		};
-		92908FA019C9ECC00088BCA9 /* Dynamics */ = {
+		9271CE3D1BAB66780085E667 /* Dynamics */ = {
 			isa = PBXGroup;
 			children = (
-				92908FA119C9ECC00088BCA9 /* b2Body.cpp */,
-				92908FA219C9ECC00088BCA9 /* b2Body.h */,
-				92908FA319C9ECC00088BCA9 /* b2ContactManager.cpp */,
-				92908FA419C9ECC00088BCA9 /* b2ContactManager.h */,
-				92908FA519C9ECC00088BCA9 /* b2Fixture.cpp */,
-				92908FA619C9ECC00088BCA9 /* b2Fixture.h */,
-				92908FA719C9ECC00088BCA9 /* b2Island.cpp */,
-				92908FA819C9ECC00088BCA9 /* b2Island.h */,
-				92908FA919C9ECC00088BCA9 /* b2TimeStep.h */,
-				92908FAA19C9ECC00088BCA9 /* b2World.cpp */,
-				92908FAB19C9ECC00088BCA9 /* b2World.h */,
-				92908FAC19C9ECC00088BCA9 /* b2WorldCallbacks.cpp */,
-				92908FAD19C9ECC00088BCA9 /* b2WorldCallbacks.h */,
-				92908FAE19C9ECC00088BCA9 /* Contacts */,
-				92908FC119C9ECC00088BCA9 /* Joints */,
+				9271CE3E1BAB66780085E667 /* b2Body.cpp */,
+				9271CE3F1BAB66780085E667 /* b2Body.h */,
+				9271CE401BAB66780085E667 /* b2ContactManager.cpp */,
+				9271CE411BAB66780085E667 /* b2ContactManager.h */,
+				9271CE421BAB66780085E667 /* b2Fixture.cpp */,
+				9271CE431BAB66780085E667 /* b2Fixture.h */,
+				9271CE441BAB66780085E667 /* b2Island.cpp */,
+				9271CE451BAB66780085E667 /* b2Island.h */,
+				9271CE461BAB66780085E667 /* b2TimeStep.h */,
+				9271CE471BAB66780085E667 /* b2World.cpp */,
+				9271CE481BAB66780085E667 /* b2World.h */,
+				9271CE491BAB66780085E667 /* b2WorldCallbacks.cpp */,
+				9271CE4A1BAB66780085E667 /* b2WorldCallbacks.h */,
+				9271CE4B1BAB66780085E667 /* Contacts */,
+				9271CE5E1BAB66780085E667 /* Joints */,
 			);
 			path = Dynamics;
 			sourceTree = "<group>";
 		};
-		92908FAE19C9ECC00088BCA9 /* Contacts */ = {
+		9271CE4B1BAB66780085E667 /* Contacts */ = {
 			isa = PBXGroup;
 			children = (
-				92908FAF19C9ECC00088BCA9 /* b2CircleContact.cpp */,
-				92908FB019C9ECC00088BCA9 /* b2CircleContact.h */,
-				92908FB119C9ECC00088BCA9 /* b2Contact.cpp */,
-				92908FB219C9ECC00088BCA9 /* b2Contact.h */,
-				92908FB319C9ECC00088BCA9 /* b2ContactSolver.cpp */,
-				92908FB419C9ECC00088BCA9 /* b2ContactSolver.h */,
-				92908FB519C9ECC00088BCA9 /* b2EdgeAndCircleContact.cpp */,
-				92908FB619C9ECC00088BCA9 /* b2EdgeAndCircleContact.h */,
-				92908FB719C9ECC00088BCA9 /* b2EdgeAndPolygonContact.cpp */,
-				92908FB819C9ECC00088BCA9 /* b2EdgeAndPolygonContact.h */,
-				92908FB919C9ECC00088BCA9 /* b2LoopAndCircleContact.cpp */,
-				92908FBA19C9ECC00088BCA9 /* b2LoopAndCircleContact.h */,
-				92908FBB19C9ECC00088BCA9 /* b2LoopAndPolygonContact.cpp */,
-				92908FBC19C9ECC00088BCA9 /* b2LoopAndPolygonContact.h */,
-				92908FBD19C9ECC00088BCA9 /* b2PolygonAndCircleContact.cpp */,
-				92908FBE19C9ECC00088BCA9 /* b2PolygonAndCircleContact.h */,
-				92908FBF19C9ECC00088BCA9 /* b2PolygonContact.cpp */,
-				92908FC019C9ECC00088BCA9 /* b2PolygonContact.h */,
+				9271CE4C1BAB66780085E667 /* b2ChainAndCircleContact.cpp */,
+				9271CE4D1BAB66780085E667 /* b2ChainAndCircleContact.h */,
+				9271CE4E1BAB66780085E667 /* b2ChainAndPolygonContact.cpp */,
+				9271CE4F1BAB66780085E667 /* b2ChainAndPolygonContact.h */,
+				9271CE501BAB66780085E667 /* b2CircleContact.cpp */,
+				9271CE511BAB66780085E667 /* b2CircleContact.h */,
+				9271CE521BAB66780085E667 /* b2Contact.cpp */,
+				9271CE531BAB66780085E667 /* b2Contact.h */,
+				9271CE541BAB66780085E667 /* b2ContactSolver.cpp */,
+				9271CE551BAB66780085E667 /* b2ContactSolver.h */,
+				9271CE561BAB66780085E667 /* b2EdgeAndCircleContact.cpp */,
+				9271CE571BAB66780085E667 /* b2EdgeAndCircleContact.h */,
+				9271CE581BAB66780085E667 /* b2EdgeAndPolygonContact.cpp */,
+				9271CE591BAB66780085E667 /* b2EdgeAndPolygonContact.h */,
+				9271CE5A1BAB66780085E667 /* b2PolygonAndCircleContact.cpp */,
+				9271CE5B1BAB66780085E667 /* b2PolygonAndCircleContact.h */,
+				9271CE5C1BAB66780085E667 /* b2PolygonContact.cpp */,
+				9271CE5D1BAB66780085E667 /* b2PolygonContact.h */,
 			);
 			path = Contacts;
 			sourceTree = "<group>";
 		};
-		92908FC119C9ECC00088BCA9 /* Joints */ = {
+		9271CE5E1BAB66780085E667 /* Joints */ = {
 			isa = PBXGroup;
 			children = (
-				92908FC219C9ECC00088BCA9 /* b2DistanceJoint.cpp */,
-				92908FC319C9ECC00088BCA9 /* b2DistanceJoint.h */,
-				92908FC419C9ECC00088BCA9 /* b2FrictionJoint.cpp */,
-				92908FC519C9ECC00088BCA9 /* b2FrictionJoint.h */,
-				92908FC619C9ECC00088BCA9 /* b2GearJoint.cpp */,
-				92908FC719C9ECC00088BCA9 /* b2GearJoint.h */,
-				92908FC819C9ECC00088BCA9 /* b2Joint.cpp */,
-				92908FC919C9ECC00088BCA9 /* b2Joint.h */,
-				92908FCA19C9ECC00088BCA9 /* b2MouseJoint.cpp */,
-				92908FCB19C9ECC00088BCA9 /* b2MouseJoint.h */,
-				92908FCC19C9ECC00088BCA9 /* b2PrismaticJoint.cpp */,
-				92908FCD19C9ECC00088BCA9 /* b2PrismaticJoint.h */,
-				92908FCE19C9ECC00088BCA9 /* b2PulleyJoint.cpp */,
-				92908FCF19C9ECC00088BCA9 /* b2PulleyJoint.h */,
-				92908FD019C9ECC00088BCA9 /* b2RevoluteJoint.cpp */,
-				92908FD119C9ECC00088BCA9 /* b2RevoluteJoint.h */,
-				92908FD219C9ECC00088BCA9 /* b2RopeJoint.cpp */,
-				92908FD319C9ECC00088BCA9 /* b2RopeJoint.h */,
-				92908FD419C9ECC00088BCA9 /* b2WeldJoint.cpp */,
-				92908FD519C9ECC00088BCA9 /* b2WeldJoint.h */,
-				92908FD619C9ECC00088BCA9 /* b2WheelJoint.cpp */,
-				92908FD719C9ECC00088BCA9 /* b2WheelJoint.h */,
+				9271CE5F1BAB66780085E667 /* b2DistanceJoint.cpp */,
+				9271CE601BAB66780085E667 /* b2DistanceJoint.h */,
+				9271CE611BAB66780085E667 /* b2FrictionJoint.cpp */,
+				9271CE621BAB66780085E667 /* b2FrictionJoint.h */,
+				9271CE631BAB66780085E667 /* b2GearJoint.cpp */,
+				9271CE641BAB66780085E667 /* b2GearJoint.h */,
+				9271CE651BAB66780085E667 /* b2Joint.cpp */,
+				9271CE661BAB66780085E667 /* b2Joint.h */,
+				9271CE671BAB66780085E667 /* b2MotorJoint.cpp */,
+				9271CE681BAB66780085E667 /* b2MotorJoint.h */,
+				9271CE691BAB66780085E667 /* b2MouseJoint.cpp */,
+				9271CE6A1BAB66780085E667 /* b2MouseJoint.h */,
+				9271CE6B1BAB66780085E667 /* b2PrismaticJoint.cpp */,
+				9271CE6C1BAB66780085E667 /* b2PrismaticJoint.h */,
+				9271CE6D1BAB66780085E667 /* b2PulleyJoint.cpp */,
+				9271CE6E1BAB66780085E667 /* b2PulleyJoint.h */,
+				9271CE6F1BAB66780085E667 /* b2RevoluteJoint.cpp */,
+				9271CE701BAB66780085E667 /* b2RevoluteJoint.h */,
+				9271CE711BAB66780085E667 /* b2RopeJoint.cpp */,
+				9271CE721BAB66780085E667 /* b2RopeJoint.h */,
+				9271CE731BAB66780085E667 /* b2WeldJoint.cpp */,
+				9271CE741BAB66780085E667 /* b2WeldJoint.h */,
+				9271CE751BAB66780085E667 /* b2WheelJoint.cpp */,
+				9271CE761BAB66780085E667 /* b2WheelJoint.h */,
 			);
 			path = Joints;
 			sourceTree = "<group>";
 		};
-		92908FD819C9ECC00088BCA9 /* Rope */ = {
+		9271CE771BAB66780085E667 /* Rope */ = {
 			isa = PBXGroup;
 			children = (
-				92908FD919C9ECC00088BCA9 /* b2Rope.cpp */,
-				92908FDA19C9ECC00088BCA9 /* b2Rope.h */,
+				9271CE781BAB66780085E667 /* b2Rope.cpp */,
+				9271CE791BAB66780085E667 /* b2Rope.h */,
 			);
 			path = Rope;
 			sourceTree = "<group>";
 		};
+		92908F7419C9ECAC0088BCA9 /* box2d */ = {
+			isa = PBXGroup;
+			children = (
+				9271CE151BAB66780085E667 /* Box2D */,
+			);
+			name = box2d;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -625,54 +630,55 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				9290900019C9ECC00088BCA9 /* b2MouseJoint.cpp in Sources */,
-				92908FDF19C9ECC00088BCA9 /* b2Collision.cpp in Sources */,
-				92908FF519C9ECC00088BCA9 /* b2ContactSolver.cpp in Sources */,
-				92908FE919C9ECC00088BCA9 /* b2Math.cpp in Sources */,
-				92908FF819C9ECC00088BCA9 /* b2LoopAndCircleContact.cpp in Sources */,
-				92908FFF19C9ECC00088BCA9 /* b2Joint.cpp in Sources */,
-				92908FE519C9ECC00088BCA9 /* b2LoopShape.cpp in Sources */,
-				92908FFB19C9ECC00088BCA9 /* b2PolygonContact.cpp in Sources */,
-				92908FEE19C9ECC00088BCA9 /* b2ContactManager.cpp in Sources */,
-				92908FF619C9ECC00088BCA9 /* b2EdgeAndCircleContact.cpp in Sources */,
-				9290900319C9ECC00088BCA9 /* b2RevoluteJoint.cpp in Sources */,
+				9271CE831BAB66780085E667 /* b2CircleShape.cpp in Sources */,
+				9271CEA21BAB66780085E667 /* b2PulleyJoint.cpp in Sources */,
+				9271CE881BAB66780085E667 /* b2Math.cpp in Sources */,
+				9271CE981BAB66780085E667 /* b2EdgeAndPolygonContact.cpp in Sources */,
+				9271CE7E1BAB66780085E667 /* b2Collision.cpp in Sources */,
+				9271CE9E1BAB66780085E667 /* b2Joint.cpp in Sources */,
+				9271CE8D1BAB66780085E667 /* b2ContactManager.cpp in Sources */,
+				9271CE9A1BAB66780085E667 /* b2PolygonContact.cpp in Sources */,
 				2DC477AC10D6C07B3FE008F6 /* Box2DDebugDraw.cpp in Sources */,
-				92908FE019C9ECC00088BCA9 /* b2Distance.cpp in Sources */,
-				92908FF019C9ECC00088BCA9 /* b2Island.cpp in Sources */,
-				92908FF219C9ECC00088BCA9 /* b2WorldCallbacks.cpp in Sources */,
-				92908FE119C9ECC00088BCA9 /* b2DynamicTree.cpp in Sources */,
-				92908FE719C9ECC00088BCA9 /* b2BlockAllocator.cpp in Sources */,
-				92908FF319C9ECC00088BCA9 /* b2CircleContact.cpp in Sources */,
-				9290900419C9ECC00088BCA9 /* b2RopeJoint.cpp in Sources */,
-				92908FE819C9ECC00088BCA9 /* b2Draw.cpp in Sources */,
-				92908FE419C9ECC00088BCA9 /* b2EdgeShape.cpp in Sources */,
-				9290900719C9ECC00088BCA9 /* b2Rope.cpp in Sources */,
-				92908FE619C9ECC00088BCA9 /* b2PolygonShape.cpp in Sources */,
+				9271CE7F1BAB66780085E667 /* b2Distance.cpp in Sources */,
+				9271CE951BAB66780085E667 /* b2Contact.cpp in Sources */,
+				9271CE8F1BAB66780085E667 /* b2Island.cpp in Sources */,
+				9271CE911BAB66780085E667 /* b2WorldCallbacks.cpp in Sources */,
+				9271CE801BAB66780085E667 /* b2DynamicTree.cpp in Sources */,
+				9271CE971BAB66780085E667 /* b2EdgeAndCircleContact.cpp in Sources */,
+				9271CE861BAB66780085E667 /* b2BlockAllocator.cpp in Sources */,
+				9271CE871BAB66780085E667 /* b2Draw.cpp in Sources */,
 				DA49ED8903C628BA578C8670 /* entry_point.cpp in Sources */,
-				9290900119C9ECC00088BCA9 /* b2PrismaticJoint.cpp in Sources */,
-				92908FE319C9ECC00088BCA9 /* b2CircleShape.cpp in Sources */,
-				92908FEB19C9ECC00088BCA9 /* b2StackAllocator.cpp in Sources */,
-				92908FED19C9ECC00088BCA9 /* b2Body.cpp in Sources */,
-				92908FFA19C9ECC00088BCA9 /* b2PolygonAndCircleContact.cpp in Sources */,
-				92908FF419C9ECC00088BCA9 /* b2Contact.cpp in Sources */,
-				92908FFD19C9ECC00088BCA9 /* b2FrictionJoint.cpp in Sources */,
-				9290900519C9ECC00088BCA9 /* b2WeldJoint.cpp in Sources */,
-				92908FE219C9ECC00088BCA9 /* b2TimeOfImpact.cpp in Sources */,
-				92908FFE19C9ECC00088BCA9 /* b2GearJoint.cpp in Sources */,
-				92908FDC19C9ECC00088BCA9 /* b2CollideCircle.cpp in Sources */,
-				92908FEF19C9ECC00088BCA9 /* b2Fixture.cpp in Sources */,
-				92908FDB19C9ECC00088BCA9 /* b2BroadPhase.cpp in Sources */,
-				92908FF119C9ECC00088BCA9 /* b2World.cpp in Sources */,
-				92908FF919C9ECC00088BCA9 /* b2LoopAndPolygonContact.cpp in Sources */,
+				9271CEA51BAB66780085E667 /* b2WeldJoint.cpp in Sources */,
+				9271CE851BAB66780085E667 /* b2PolygonShape.cpp in Sources */,
+				9271CE931BAB66780085E667 /* b2ChainAndPolygonContact.cpp in Sources */,
+				9271CE811BAB66780085E667 /* b2TimeOfImpact.cpp in Sources */,
+				9271CE7B1BAB66780085E667 /* b2CollideCircle.cpp in Sources */,
+				9271CE8A1BAB66780085E667 /* b2StackAllocator.cpp in Sources */,
+				9271CEA31BAB66780085E667 /* b2RevoluteJoint.cpp in Sources */,
+				9271CE921BAB66780085E667 /* b2ChainAndCircleContact.cpp in Sources */,
+				9271CE991BAB66780085E667 /* b2PolygonAndCircleContact.cpp in Sources */,
+				9271CE941BAB66780085E667 /* b2CircleContact.cpp in Sources */,
+				9271CE9C1BAB66780085E667 /* b2FrictionJoint.cpp in Sources */,
+				9271CEA41BAB66780085E667 /* b2RopeJoint.cpp in Sources */,
+				9271CEA61BAB66780085E667 /* b2WheelJoint.cpp in Sources */,
+				9271CE8C1BAB66780085E667 /* b2Body.cpp in Sources */,
+				9271CE9D1BAB66780085E667 /* b2GearJoint.cpp in Sources */,
+				9271CE7A1BAB66780085E667 /* b2BroadPhase.cpp in Sources */,
 				C8860D93875589970329DCCD /* example.cpp in Sources */,
-				92908FEC19C9ECC00088BCA9 /* b2Timer.cpp in Sources */,
-				92908FFC19C9ECC00088BCA9 /* b2DistanceJoint.cpp in Sources */,
-				92908FF719C9ECC00088BCA9 /* b2EdgeAndPolygonContact.cpp in Sources */,
-				92908FEA19C9ECC00088BCA9 /* b2Settings.cpp in Sources */,
-				92908FDE19C9ECC00088BCA9 /* b2CollidePolygon.cpp in Sources */,
-				9290900619C9ECC00088BCA9 /* b2WheelJoint.cpp in Sources */,
-				92908FDD19C9ECC00088BCA9 /* b2CollideEdge.cpp in Sources */,
-				9290900219C9ECC00088BCA9 /* b2PulleyJoint.cpp in Sources */,
+				9271CE8E1BAB66780085E667 /* b2Fixture.cpp in Sources */,
+				9271CE821BAB66780085E667 /* b2ChainShape.cpp in Sources */,
+				9271CEA71BAB66780085E667 /* b2Rope.cpp in Sources */,
+				9271CEA01BAB66780085E667 /* b2MouseJoint.cpp in Sources */,
+				9271CE901BAB66780085E667 /* b2World.cpp in Sources */,
+				9271CE7D1BAB66780085E667 /* b2CollidePolygon.cpp in Sources */,
+				9271CEA11BAB66780085E667 /* b2PrismaticJoint.cpp in Sources */,
+				9271CE8B1BAB66780085E667 /* b2Timer.cpp in Sources */,
+				9271CE9B1BAB66780085E667 /* b2DistanceJoint.cpp in Sources */,
+				9271CE891BAB66780085E667 /* b2Settings.cpp in Sources */,
+				9271CE9F1BAB66780085E667 /* b2MotorJoint.cpp in Sources */,
+				9271CE841BAB66780085E667 /* b2EdgeShape.cpp in Sources */,
+				9271CE7C1BAB66780085E667 /* b2CollideEdge.cpp in Sources */,
+				9271CE961BAB66780085E667 /* b2ContactSolver.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels