And there was much rejoicing! It does feel great to finally ‘finish' something. I started out this project as something to give me a foundation to code my own game project on, and now after 110+ hours of coding there is a 2D physics library for Blitzmax :)! I hope it proves useful to those that end up using it. While the engine hasn’t been tested for ‘real-world' use it I think the demos do a good job of putting it through its paces. It’ll very soon have a good test through a ‘real world' application once I get it integrated with my own game project. Anyway, Farseer Physics for Blitzmax is ready for download. The zip file contains:
- A compiled version of the physics demo application with 4 new demos!
- Ready-to-compile source code for both the core physics engine and the demo application
- A ‘quickstart' application that shows someone how to setup a basic physics scene with minimal code.
- a ‘quick start guide' that pretty much is a walk through of the quick start application. Which can also be found online.
For those eager to get their hands on it:
Since the last update, things came together rather quickly. I finished up the last of the classes that needed to be ported earlier in the week, which I then spent the rest of the week adding in demos to the demo application. This port is a very close implementation of the original Farseer in C#. The only times the source would deviate in any major fashion were in time-critical algorithms where optimization needed to be done differently considering how different C# and Blitzmax handle things (particularly garbage collection). With that said, you may find it helpful to visit the codeplex site of the C# version of the engine if you find yourself wondering how to do something in Farseer. While the answer you get may be in C#, keep in mind the methods, functions, and variable names are similar, if not identical, in Blitzmax. I’ve also implemented additional demos on top of the standard ones that came with Farseer to show the use of most of the available types in the engine. So if you wish to know how to implement a certain feature, try looking at the source code of one of the demos that does the said feature.
Here’s just a quick run down of what was added/updated since last post:
- Added Demo 11 – Slider and Pin Joints
- Fixed a minor bug in the main menu causing the about screen to stick
- Sweep and Prune Collider implemented (not completely optimized)
- Bilinear Interpolator
- Added the Convert Units class for easy transformation between screen and world coordinates
- Added IFluidContainer
- Added onEntry and onExit event handling for fluid containers
- Added Collision event handling
- Added Demo 12 – Fluid Drag Controller
- Added Demo 13 – Collision Event Handling
The fluid container objects turned out to be a bit cooler than I expected it to be. Not only did it simulate buoyancy but there was a controller that simulated wave formations on the surface of a container. Cool stuff indeed…
Pictures don’t do it justice so here’s a video…
By default Farseer doesn’t come with any code that allows geometry to create disturbances in a fluid container, but it comes with a nice, easy to use Disturb() function along with handy callback events for when a object enters and exits the container. With this I threw together a basic water container class that does some very ‘rough' interaction between geometry and the waves. It’s far from realistic, but still yields an interesting effect I think. Someone could easily take this code and improve upon it. I’ve kept it outside of the ‘core' physics engine and put it in the demo source since it was something that was kind of thrown together last minute (you can tell that by the rather rushed rendering code).
So that’s about it for now. I hope this engine finds some use in the Blitzmax community. Thanks to those on the blitz forums that provided feedback and data to help me optimize the engine. An especially big thanks to Jeff Weber for writing such a robust 2D physics engine to begin with!
Crosses fingers and hopes the code will compile without issue on OSX and Linux… 😉