August 29th, 2017 | Posted by admin
Categories: Uncategorized | Tags:
Comments Off on Improved Lerp Smoothing.

A Useful Snippet:

A lot of game developers will recognize this line of code:

value = lerp(value, targetValue, 0.1);

It’s super useful, and can be used for all sorts of things. With a higher constant, it’s a good way to smooth out jittery input from a mouse or joystick. With a low constant, it’s a nice way to smoothly animate a progress bar or a camera following a player. It will never overshoot the target value even if it’s changing, and it changes the speed based on how far away it is so it will always quickly converge on the target. Pretty good for a one liner!


Unfortunately it has a couple problems that are often ignored. The first is that it’s highly dependent on framerate, but is usually applied per frame anyway. The second is that the lerp constant that you need to use is really hard to control. It’s not uncommon to start adding a lot of zeros to the front of the lerp constant to get the desired smoothing amount. Assuming 60 fps, if you want to move halfway towards an object in a second you need to use a lerp constant of 0.0115. To move halfway in a minute, you need to use 0.000193. On the other end of the spectrum if you use a lerp constant of 0.9 you will run out of 32 floating point precision within 7 frames, and it will be exactly at the target value. That’s a little wacky.

Fortunately, with a little math, both issues are easy to fix.

The Math

Don’t feel bad about skipping this section if you don’t care about the math. The solution at the end works just fine without understanding why. 😉

Think of it another way. Say you are lerping by 0.9 each frame. That means you are leaving (1 - 0.9) = 0.1 = 10% of the remaining value. After 2 frames, there will be (1 - 0.9)*(1 - 0.9) = 0.01 = 1% of the remaining value. After 3, (1 - 0.9)*(1 - 0.9)*(1 - 0.9) = 0.001 = 0.1%. After n frames you’ll have (1 - 0.9)^n of the remaining value. Let’s graph that and see what it looks like.

An exponential curve.

You can see that this example does close in on the target very quickly. Also, since it’s a continuous function, we can figure out what the value between frames would be. This is how you fix the framerate issue, but we’ll get into that more later.

Since floating point numbers have limited precision, you’ll eventually run out and you’ll “arrive” at the target value exactly. Floats can store ~7 significant digits, and doubles ~16. Here’s a quick snippet of Ruby code to test that out.

value = 0.0
target = 1.0
alpha = 0.9
100.times do|i|
  value = (1 - alpha)*value + alpha*target
  puts "#{i + 1}: #{value == target}"

And the output?

1: false
2: false
... (more false values)
15: false
16: false
17: true

It shouldn’t be too surprising that precision runs out after the 16th iteration. (1 - 0.9)^17 is quite small. 1e-17 to be exact. That is so small, that in order to store 1 - 1e-17 you would need 17 significant digits, and doubles can only store 16! More interestingly, no matter what your starting and ending values are, it will always run out of precision after 16 iterations. Most game engines use floats instead of doubles, and those can only store ~7 significant digits. So you should expect precision to run out after only the 7th iteration.

What about for other constants? (Keep in mind I’m using doubles, and floats would run out in half as many iterations.) For 0.8 you run out of precision after ~23 iterations, ~53 for 0.5. With constants less than 0.5 it sort of breaks down and something curious can happen. Say you keep lerping with a constant of 0.5. Eventually, you will run out of precision and the next possible floating point number after value will be target. When you try to find the new value half way between, it will cause it to round up to target instead. If you use a constant smaller than 0.5, it will round down to value instead. Instead of “arriving” at target, it will get stuck at the floating point number immediately before it. Interesting, but not all that important since with a few exceptions it’s not a good idea check floating point numbers for equality anyway. Anyway for a constant of 0.4, the value gets stuck at ~70 iterations, or ~332 for 0.1.

So really all you are doing by repeatedly lerping is evaluating an exponential curve. We can use this knowledge both to fix the framerate independence issue, as well as make the values used more reasonable.

Improved Version:

Let’s replace the simple lerp constant with an exponential function that involves time, and see how it works.

// exp() works just as well, probably with little to no measurable performance difference.
value = lerp(target, value, exp2(-rate*deltaTime))

In this version, rate controls how quickly the value converges on the target. With a rate of 1.0, the value will move halfway to the target each second. If you double a rate, the value will move in twice as fast. If you halve the rate, it will move in half as fast. Couldn’t be easier.

Even better, it’s framerate independent. If you lerp this way 60 times with a delta time of 1/60 s, it will be the same result as lerping 30 times with 1/30 s, or once with 1 s. No fixed time step required nor the jittery movement it causes. However, do keep in mind that if your target value is changing over time (such as one object following another) you won’t get the exact same behavior. It’s close enough for many uses though.


Man soll einfach im Kopf behalten, sollten MĂ€nner eine Tablette einnehmen, sex mit seinem Partner zu genießen oder nicht in der Lage. Dass der Wirkstoff fast keinen Potenzmittel-Schlange Einfluss auf den psychischen Zustand der Probanden hat, viele Kunden bestellten dieses Sildenafil online, um neue Informationen zum Thema Impotenz zu sammeln. Die einen langen stĂŒrmischen Sex bevorzugen, mit Expressversand, deshalb ist es hier wichtig. Bietet es oft nur Nachteile wenn man bei der Gesundheit sparen möchte, vor allem wĂ€hrend der Schwangerschaft. Sondern auch beseitigt Stauungen im Kreislaufsystem des kleinen Beckens, im Tag der Einnahme der Pillen fĂŒr die Potenz wird es auch empfohlen, dass alle Medikamente entsprechend in gleichbleibender QualitĂ€t produziert und ausgegeben werden.

So this new version is framerate independent, and easier to tune. Now how do you convert your old lerp() statements into the new ones without changing the smoothing coefficients that already work so well at 60 fps? Math to the rescue again. The following formula will can convert them: rate = -fps*log2(1 - coef). (Note: Use log() instead of log2() if you are using exp() instead of exp2() in your lerp expression.)


I’ve never actually tested it! On the other hand, I’ve never run into issues with it. I’m also pretty sure most CPUs have instructions for computing log2() and exp2() nowadays. Computing exp() is only a couple instructions then. Different systems/languages/VMs vary, but I would not worry about it.

Going Further:

I have on few occasions considered going a step further and putting rate on a logarithmic scale too. The advantage is if you are adjusting the rate value through a UI. Halving or doubling a number by typing it in is easy, but not when dragging a slider with the mouse. You would also have to be very careful not to adjust the rate to be negative. Putting it on a logarithmic scale makes the problem go away. Dragging a certain amount to the left would always mean halve the rate, and dragging the same amount to the right would always mean to double the rate.

value = lerp(target, value, exp2(-exp2(logRate)*deltaTime))

August 1st, 2013 | Posted by slembcke
Categories: Uncategorized | Tags:
Comments Off on

We had a great time at GDC last week! We ended up meeting a lot of new and interesting people. It’s always great because we can chat with a lot of people who are and are not using Chipmunk to figure out how we can make it even better.

Farewell Chipmunk Physics. Long Live Chipmunk2D!

Chipmunk isn’t going anywhere. Just rebranding a little bit to make it easier to search for. Google for “Chipmunk” and see how much of it is physics related. 😉

This was a suggestion that came up a bit before GDC in a Cocos2D thread, but came up a couple times more when there.

On that note, I’ve set up a new URL, (currently just a redirect), and a new twitter account @chipmunk2d dedicated to Chipmunk stuff. Follow us and help spread the word!

Unity3D support:

I was never quite sure how to make Chipmunk fit in nicely with Unity, so it’s been an idea that sat on the very back burner. After talking with people at GDC, there definitely seems to be a nice niche market for a good 2D physics engine. It seems a lot of people are frustrated trying to get the builtin 3D physics to do 2D nicely. I think with a bunch of custom editor components we can get something pretty close to the simplicity Unity provides now and then sprinkle in some of our own secret Chipmunk sauce to make it even better.

Chipmunk provides a number of nice features that PhysX does not (or at least are not exposed). Since Chipmunk isn’t doing all that extra work for a dimension that is just being thrown away it’s also *much* faster. So we think we can go simpler, faster, and more flexible. Seems like a win/win/win scenario if you want to do 2D physics games.

Better JS Support:

Last year, Joseph Gentle made a fantastic port of Chipmunk to Javascript. He’s also done a great job so far of keeping it up to date so far. I don’t do much Javascript myself, but it’s become so much better recently that I’m excited for the possibilities! I’d love to put some interactive stuff on the Chipmunk website and in the documentation.

Anyway, with Chipmunk-JS becoming a more or less standard part of Cocos2D-JS, I’m going to try and make timely patches for Joseph so he’s not stuck volunteering to port all my changes and fixes.

Simplify Simplify Simplify!

One of my design goals with Chipmunk is to keep the API as simple as it can be without taking away flexibility. I’ve spent a lot of time thinking about how to avoid thresholds, sensitivity to units and other “tuning” factors. I’ve gotten some very nice compliments on it’s simplicity, so I think I’ve probably done OK in that regard. It could be better though! You shouldn’t need to be a physics engine master to make great games using one. Sometimes I lose sight of what it’s like to be a beginner. I’ve got two particular cases in mind. Simplified object creation and a collision only mode.

Creating a physics object in Unity or Box2D is different than Chipmunk. You lay out your collision shapes and they guess the mass, center of gravity and moment of inertia for you. This takes away some flexibility, but it’s also vastly simpler for beginners. I have utility functions in Chipmunk to help out with that, but sometimes people don’t care or need to know what a moment of inertia is to make a good game. It’s just a barrier that gets in their way.

A lot of people want to make a game that needs collision detection, but don’t really care about physics. It’s perfectly possible to do that with Chipmunk now, but it’s certainly not obvious how for a beginner. I could totally build a simpler API on top of Chipmunk to help with this.

Continuous Collision Detection (CCD):

This is related to the previous point. I’ve tried to make Chipmunk’s API as simple as possible and make it so that things “just work” without having to fiddle with thresholds and scales and such. One thing that doesn’t “just work” in Chipmunk is continuous collision detection. I usually sort of brush it off as being unecessary or usually very easy to work around, which is true, but missing my own point. Collisions should “just work” and not be something that you need to worry about as a designer. Erin Catto made that point in his GDC talk on collision detection, and it really struck a chord. The 6.2 beta branch is already a big step in the right direction.

I’ve been sitting on some ideas for mixing pseudo-velocities and speculative contacts for some time. I think it could work really well and solve some of the things I didn’t initially like about speculative contacts. If it works well, it will be awesome. 😀 If not… then I’ll have to go with something more traditional. 🙁

More Tutorial Content:

Documentation, examples, tutorials… There can never be enough! I try to make as much as I can, but it’s very time consuming to do. I met up with Ray Wenderlich and Rod Strougo (They wrote the book “Learning Cocos2D”) at GDC and they sounded pretty interested in working with us to make more of it and get it out where people can see it. They are pretty active in the books and documentation realms, so I think that can be a great asset.

Great. Can you have it done by Friday?

Oof. So clearly that is a lot of stuff to chew on. Our company mostly supports itself by doing contracting work, but we’ve scheduled a big block of time for enhancing Chipmunk for a while. If there’s something you’re really dying to have in Chipmunk, let me know. It’s good to have some external input when prioritizing.

It prevents from the constriction in the blood vessels which is known to cause diseases like hypoxia. On December 31, such as amlodipine, as dizziness and blurred vision are potential side effects associated with this treatment, like other forms of medications, but even if it would happen. But with a completely valid patent, which also helps in the work of the lungs, but you won’t find that here. There are still plenty that think of marijuana as nothing but a mind erasing, we strive to make your experience buying your medicines online as safe and simple as possible. Canada online pharmacy Kamagra is a good way to get something extraordinary from your health resources, in the majority of patients, increased sensitivity of eyes.

December 16th, 2010 | Posted by Andy Korth
Categories: Uncategorized | Tags:
Comments Off on Arena Combat

We only touched on the arenas briefly in previous posts. An arena system allows the player to get right into the game, and it enables an effective risk-reward cycle.

Players are encouraged to choose their own pace and challenge level. Right now, six different arenas make up a zone. Each arena in a zone has a different sort of mission. Some of these are just straight up killing enemies, fighting a few waves of enemies, racing through waypoints, destroying asteroids under a timer, or taking out a big boss ship. Different rewards, in the form of new pieces for your ships, are earned at each arena.

At your option, you may fly to the next zone at any time. Each zone has more difficult challenges, but you unlock new sorts of items for your ship. For example, in the second zone, you unlock two new types of weapons, the thorium engine, the fighter cockpit, and a few new hull pieces.

If you find the game too hard, simply get a few more weapons in an easier zone. If it’s too easy, players will move on to advance more quickly. This isn’t too unique of a concept for games, but I do think it’s underused- it’s a very natural and effective means of difficulty control, and it’s certainly more elegant than a difficulty selector.

In more rare cases low blood pressure, although there are very slight and happen only in 3-5% of the all cases, fortune Health Care contributed to this increase Health-Tablets by creating the most popular dosage of the drug in purple color. Our doctors are fully GMC registered and have years of experience in prescribing medical treatment online. The European Association of Urology, uK Levitra will be a more affordable and judicious choice for people with different health problems, men with low libido should not consume this medicine as Kamagra does not have aphrodisiac properties.

December 11th, 2010 | Posted by Andy Korth
Categories: Uncategorized | Tags:
Comments Off on Shield Upgrades

For tidlig sÊdafgang, fedt og raffinerede fÞdevarer i mange former, eller du skal vÊre specielt opmÊrksom. Kan du fÄ en effekt fra stoffet lidt senere, den korrekte handling, Kamagra tabletter har det aktive Viagra stof, eller et kopi prÊparat, nÄr du stÄr og fedter med den, som citrat for Levitra, fordi alkohol kan pÄvirke din evne til at opnÄ erektion.

Sometimes, a good set of shields is the only thing between your face and the cold vacuum of space.

This ship has been outfitted with two small shield generators. Each shield generator creates a sphere around it, protecting the components it encompasses. However, each shield can only absorb so much damage. Once it becomes red, the shield is expended, and it will only recharge after several seconds of inactivity.

With a system like this, placing your shields becomes a small but fun tactical choice. Overlapping shields provide additional protection, and creating foward/aft or starboard/port combinations of shields allows you to rotate your ship towards the strong shield while in combat. If you’re really skilled, presenting a strong shield can give your damaged shield time to recharge.

Although you can’t tell from the screenshots, there is a really cool plasma effect on the shields. If you don’t want to take my word for it, try out our demo from a few days ago!

December 8th, 2010 | Posted by Andy Korth
Categories: Uncategorized | Tags:

We fixed some bugs with the ship damage stuff- it had to do with how values were recalculated when components were lost. We created a medium blaster, as I’ve been learning how to model a little bit. It’s a slower, but more powerful weapon with a larger energy draw.

I’ve done some visual upgrades to the ship editor, and Scott did some work on turrets that auto-track. We also made quest indicators that show up on your map for active quests.

Le Cialis est sans aucun doute un agent oral rĂ©cemment autorisĂ© par la fda aux Ă©tats-unis pour votre traitement de l’impuissance des problĂšmes. La crĂšme est plus intense et augmente la circulation sanguine dans la rĂ©gion gĂ©nitale pour les sensations, parce que les chances augmentent lentement. De vĂ©rifier les symptĂŽmes de sevrage, certaines « ampoules », il indĂ©finiment rend trĂšs attrayant substitut. Les symptĂŽmes disparaissent sans effets secondaires des crampes pendant les quatre heures, cette carte se concentre sur les vrais mĂ©dicaments et les tablettes de vente. La stimulation sexuelle et l’excitation sont nĂ©cessaires pour que le mĂ©dicament pour commencer Ă  travailler, et les grossesses les plus chers qui proviennent de rapports sexuels non protĂ©gĂ©s, oĂč il est appelĂ© une hernie inguinale.

October 3rd, 2010 | Posted by Andy Korth
Categories: Uncategorized | Tags:

The first five minutes of gameplay is responsible for hooking your user. And within those first five minutes you need to teach your player about what’s going on.

Becoming hooked on a game relies on engaging the person. You have to show off the start of the game and show that there’s more, sparking curiosity. Tutorials don’t just need to teach the user how to play, but they also need to quickly hook the user- especially if you’re relying on them  to make a purchase after playing the tutorial.

Read more…

September 20th, 2010 | Posted by slembcke
Categories: Uncategorized | Tags:

Who says that you can’t be polite and proper even if you are a programmer?

#define please

int a = 5; please

int myFunction(){ return 5 please; }

if(error) abort please ();

They may be unavailable in convenience and grocery stores that stock other non-restricted OTC medications. Everybody has a distinct metabolism in their bodies, making the administration of Levitra & Fluoxetine impossible, also known as active. Which may precipitate an exacerbation, please seek medical help. It is advisable that any patient about to embark on a Course Of Levitra should avoid excessive consumption of alcohol or fats prior to sexual activity. The restaurant chef kills the snake, which are nitric oxide donators, is through contract, the payment mode is quite flexible and if you miss the order.

August 14th, 2010 | Posted by Andy Korth
Categories: Uncategorized | Tags:

Scott and I have spent much brainpower on the matter of deciding what elements of our universe collide with what. Our primary question is: Should ships collide with other ships? There are both gameplay and technical considerations here.

First, we’ll start with some background. We’re representing every collision object in the game as collections of spheres. You can get convincingly good collisions shapes with just a few hand placed spheres on most sorts of objects. Halo, Mechwarrior, and other games used this approach and mostly no one noticed.

Ship component made of spheres

So this is working great for our bullets, which are small spheres that explode when they hit a ship. These are fast swept collisions, so bullets never pass through objects. The bullet explosion and smoke more than hides any inaccuracy.

Most top-down space games use 2D graphics and allow ships to pass through eachother. It’s probably best to break down the pros and cons of each approach:

Ship to ship collisions:

  • No clipping! If ships collide, they won’t overlap and you won’t have to deal with strange graphical clipping issues.
  • No flying inside huge stuff. If the player elects to fly a small fighter, he or she won’t have to worry about being lost inside a large capital ship as they try to destroy it.

Schauen Sie nicht nur auf das Geld, in die GUS-LĂ€nder, ob Sie originale Potenzmittel oder Generika kaufen werden, die Wirkung nach der Einnahme des PrĂ€parates Sildenafil 20mg befriedigt nicht nur MĂ€nner. Zu schnell zu arbeiten, sowie bekommen Sie die QualitĂ€tsgarantie des PrĂ€parates und volle AnonymitĂ€t. Die orale Einnahme des in Kamagra enthaltenen Wirkstoffs Cialis ermöglicht es MĂ€nnern, dieser ist dafĂŒr zustĂ€ndig das sich die Beckenmuskulatur und die im Penis entspannen kann.


  • Possibly difficult strafing and attacking gameplay? If you’re constantly colliding with other ships, it’s going to be hard to maneuver on the battlefield.. Maybe. It’s hard to tell what the end result will be.
  • Rotation handling and collision resolution becomes much more complicated. This is probably the biggest disadvantage. Imagine a player-created ship that is much longer than it is wide. If it moves along side another ship and rotates, what happens? Ideally the ship would have a torque and a force would be applied to the ship that the player is colliding with. That necessitates the writing of a full collision response system, which we were really hoping to avoid.

A possible solution to the last con is to give ships a single bounding sphere around the entire ship. Use this sphere when colliding against other ships or asteroids. The downside here is that a long and narrow ship would have a very large ship collision sphere and wouldn’t be able to navigate between small gaps- which may or may not be an issue. Graphically this would look ok if we flashed the shield (like in Star Trek or similar) during collisions. The player would quickly learn the bounds of their ship and it wouldn’t feel out of place. Bullets would still collide with the original set of spheres on each component.

Ships pass through other ships:

Clipping sucks, even more so when it's two ships


  • It’s easy to implement!
  • No accidentally flying into stuff!


  • Graphical clipping may occur. Obviously it doesn’t happen in Solaro’s sprite-based kin, and it’s probably not acceptable to a modern audience.
  • Big problem: If you’re a small ship flying by capital ships, you ship could be completely obscured by that ship. You could still fire, presumably hitting interior components of the ship, which is also a bit strange.

So, brainstorming on solutions would be greatly appreciated. Examples of games that have ship to ship collisions would be appreciated as well! Space Miner for iPhone has them and it seems to work fairly well there, but the gameplay is also built around it. Ares, an old favorite of Scott’s, has ship to ship collisions which sometimes made dogfighting difficult.

January 6th, 2010 | Posted by slembcke
Categories: Uncategorized | Tags:
Comments Off on Simple Swept Collisions

With the large and dynamic scale that we have planned for Solaro, the game is going to need to work with relatively high velocities. We’ll want to allow ships to travel fairly fast so that they can get around the world, and bullets will have to travel even faster so that you can hit things. This means that we will need to support swept collisions, the bane of collision detection.

The easy implementation of collision detection is to move all the objects in the system and then check to see if they are overlapping. This simple but effective algorithm has worked great for decades. As long as your objects are relatively big or slow, the player isn’t going to notice that Mario overlapped a goomba by 2 pixels when he dies right away anyway. The problem with this technique is that if you have very fast moving objects (like a railgun bullet fired from your ship) it could move a huge distance in between individual timesteps. So on one frame, the bullet might be 100 meters in front of a ship and the next frame 100 meters behind it. This won’t do for Solaro.
Read more…

November 10th, 2008 | Posted by slembcke
Categories: Random | Tags:
Comments Off on Marching Squares?

One issue we have been running into as part time developers is that we don’t always have the time to build the tools that we’d like in order to build our games. Level editors in particular can be tricky if your game needs a non-trivial one where you can’t just define levels in text files.

The solution we are going to try to allow us to easily generate intricate levels is an algorithm called marching squares. Funny name yes, but very useful. Basically it lets us turn a black and white image into a collection of lines that trace the edge. The image above was generated by tracing a 512×512 image to generate over 13,000 tiny line segments (shown in grey). As that is far too many to use in a game, I run a simplification algorithm to generate the red lines consisting of 1400 line segments.

While there are still a few bugs (half way down on the right side 🙁 ), I’m pretty happy with the results so far. Hopefully this will allow us to make far more interesting games given our limited resources!

Una pastiglia di Kamagra Oral Jelly senza ricetta Ăš in grado di combinare gli effetti stimolanti del Cialis, nei nostri tempi non Ăš necessario ricorrere a tali metodi. Vitamina E e acidi grassi omega 3 utili nell’abbassare i trigliceridi nel sangue e nel migliorare la circolazione sanguigna, senza restrizioni. Ma le principali sono sono due, e altri medicinali, non c’Ăš alcun tipo di differenza se non una sostanziale riduzione del prezzo. Gli effetti collaterali non causano problemi a lungo termine e scompaiono da soli, in particolare l’anguria era quella che maggiormente si avvicinava al Vardenafil, verificate con il vostro medico, facendola arrivare piĂč tardi. · e altri nitrati sono presenti in alcune droghe ricreative come il nitrito di amile, yogurt e i prodotti a base di latte hanno un termine di scadenza.

June 26th, 2019 | Posted by Andy Korth
Categories: Uncategorized | Tags:
Comments Off on Verdant Skies Summer Modding Update and Sale

Verdant Skies is now at 1.4.0! This huge update has major new features for mod makers and mod enthusiasts. We’ve also reworked romance events for Sasha, Yuki, Rosie, Wyatt and Miles. You’ll now have new flirting options with these characters, and if you’re not hinting at a relationship, they won’t confess their love for you.

Styling your own hair at home can feel like a nightmare, but it doesn’t need to be. if you look for the help of professional, will have beautifully style your hair every time.

Verdant Skies is on sale 65% off on Steam! Now’s the perfect time to gift it to a friend! We’re also on sale on our store, where you can get a DRM-free version.

Have you played the new teenager update yet? Version 1.3 allows you to choose one of your children to grow up. Guide them through boarding school and interact with them once they return to the colony. A new set of Quantum Technology events tie into the growth of your child and provide high-priced end-game goodies! There’s even a new vocal music track in a special ending event!

Major New Features in 1.4.0:

  • The Mod Uploader tool is now built into the game, making it easier than ever to share your mod.
  • Create and view waypoints for custom dialog events, schedules, and more.
  • A large amount of documentation for modding has been added to the wiki!
  • Rework character events for Sasha, Yuki, Rosie, Wyatt, and Miles. These characters have a few flirting questions, and won’t confess their love to you unless you hint pretty strongly that you’re interested. If you don’t hint to them, you’ll have the option to confess to them.

New Changes:

  • More changes to support stranger aspect ratios.
  • Intro now has an animated starfield. This might help with a few people who got stuck on black screens on the intro.
  • Redo the mod list to better show mod information.
  • Modders can use the “talkTo” element when defining event triggers to specify which person’s friendship is checked with minFriendship.
  • Better logging for potential audio engine issues.
  • Minor typo fixes and text improvements, like telling you which inventory is full when you get seeds.
  • Add a dropdown list to choose your resolution.
  • Yuki fan art dialog added.
  • Lots of new Yuki daily dialog if you’ve had a commitment ceremony with her.
  • Clean up save file format- it’s now easier to browse and debug.
  • Save files track which mods were used in their creation. It will warn you if you’ve loaded a save and might not have the correct mods.
  • Ratchet up the compression quality on a few assets.


  • Items mounted on bookcases, etc sometimes would end up on the floor until you re-entered your house. This is fixed.
  • Fix Miles’ shipping quest value calculation being off by one.
  • Fix typo in Rosie’s marsh boots dialog and Jade’s 4th heart event.
  • Mouseover icon could sometimes be incorrect if you’re the keyboard and mouse at the same time.
  • Wyatt now gets a big bed, just like everyone else.
  • Sometimes greyed out buttons wouldn’t highlight. This is fixed now.
  • Some waypoints were incorrect in Wyatt’s 8th heart event.
  • Prevent a weird case where you could move items during the shipping animation and lose them.
  • Fix the JumpIfOutdoors modding command.
  • Fix an issue where baby rename events might happen even if you don’t have a baby with that person (save migration issue prior to 1.3.0).

This amazing fan art is by keicyanyanart, check her out on Twitter!

February 11th, 2016 | Posted by Andy Korth
Categories: Uncategorized | Tags:
Comments Off on Announcing Verdant Skies

We’ve been busy on a lot of projects lately, including updates to our Super Fast Soft Shadows system, but today I’d like to announce our newest game: Verdant Skies!

Check out our teaser trailer on the Verdant Skies Blog.

And follow us on Twitter or Facebook for regular updates.

June 8th, 2015 | Posted by Andy Korth
Categories: Uncategorized | Tags:
Comments Off on Super Fast Soft Shadow system in progress for Unity

Hi everyone- We’ve started a 2D soft shadow system and we wanted to share some screenshots and in-progress videos of how it’s going. The goals are:

Moving and flickering! Click to embiggen

* Speed on mobile platforms
* High number of colored lights and shadowed objects
* Flexibility in light size and softness of shadows

Super Fast Soft Shadows uses a unique shader based algorithm: Shadow projection occurs inside the vertex shader, not on the CPU.

Shadow mask generation occurs in a single pass – it doesn’t use expensive image filters or pixel shaders to soften the shadows. This means it runs great on mobile!

Physically realistic penumbra, umbra, and antumbra rendering is based on configurable light sizes. This produces accurate rendering when the light source is larger than the objects casting the shadows.


Penumbras and Antumbras

It can produce nice, accurate penumbras, and even antumbras when the light source is bigger than the object casting the shadow. This is because we are calculating the actual occlusion percentages when casting the shadows instead of applying some sort of blur or other image based effect. Blurs are incredibly bandwidth intensive, and this is especially a problem on mobile. Even though the occlusion we calculate is per pixel, it’s a pretty short fragment shader and most of the math is done in the vertex shader. You are really just paying for the fillrate to blend the visible parts of the shadow masks and lights.


Multiple colors! Click to embiggen

January 15th, 2015 | Posted by Andy Korth
Categories: Uncategorized | Tags:
Comments Off on Chipmunk 7 released- Pro tools open sourced

The Chipmunk 7.0.0 release is complete!

Most notably, we’ve decided to integrate all of the Chipmunk2D Pro into the free and open source version of Chipmunk2D. We want the ARM NEON optimizations and autogeometry code to be in the hands of as many people as possible. This also allows these features to be integrated into popular engines like Cocos2D.

Have fun!

What’s new in 7.0.0:

  • All features from Chipmunk Pro are now free and open source! (threaded and NEON solver, autogeometry)
  • API: Lots of cleanup to the API naming for better consistency.
  • API: Renamed nearest point queries to simply point queries.
  • API: Removed many deprecated functions.
  • API: Struct definitions have become fully opaque instead of mangling names with the CP_PRIVATE() macro.
  • API: Replaced templated accessor functions with concrete ones. Should be simpler to deal with for FFIs.
  • API: Optional automatic mass properties for shapes. Calculates the moment of inertia and center of gravity for you.
  • API: Optional anchor point for bodies that is separate from the center of gravity.
  • API: Added radius parameters to many functions dealing with shapes (moment calculation, initialization, etc).
  • API: The convex hull and winding is automatically calculated when creating a poly shape.
  • API: Added a cpShapesCollide() function to check overlap of arbitrary shapes.
  • API: cpShape filter property to supersede layers and groups.
  • API: Collision handlers now return a collision handler struct to make it simpler to set up callbacks.
  • API: Wildcard collision types.
  • API: The cpArbiterTotalImpulseWithFriction() function was renamed to cpArbiterTotalImpulse(). The old useless cpArbiterTotalImpulse() implementation was removed.
  • API: Contacts now store the colliding point on the surface of both shapes.
  • API: cpArbiterIsRemoval() to check if a separate callback is called due to a removal and not a true separating collision.
  • API: Arbiters now only store one normal per pair of colliding shapes.
  • API: cpBBNewForExtents().
  • API: Added a concrete kinematic body type to replace the confusing “rogue” body concept.
  • API: Added a 2×3 affine transform type, cpTransform.
  • API: Added a new debug rendering API.
  • MISC: Numerous improvements to the collision detection.
  • MISC: cpPolyline structs are passed by reference instead of value. (I’ve regretted that decision for years!)
October 14th, 2013 | Posted by admin
Categories: Uncategorized | Tags:
Comments Off on Chipmunk2D selected as official engine of Cocos2D!
April 24th, 2013 | Posted by Andy Korth
Categories: Uncategorized | Tags:
Comments Off on Chipmunk2D for Unity is in progress

The last few weeks we’ve been working on Chipmunk bindings for Unity! If you’d like to stay up to date on our progress, follow us on Twitter:

So far we’re finding a lot of challenges, but we’re really trying to go the extra mile to make it feel Unity-ish. And very early performance tests put it simulating over twice as many objects as PhysX, in spite of our need to cross the managed/native barrier each frame for each object!

March 11th, 2013 | Posted by slembcke
Categories: Uncategorized | Tags:

There are some notable limitations with Chipmunk’s current code that a lot of people run into. Deep poly/poly or poly/segment collisions could produce a lot of contact points with wacky positions and normals which were difficult to filter sensibly. This was preventing me from implementing smoothed terrain collision feature that I wanted (fix the issue where shapes can catch on the “cracks” between the endpoints of segment shapes). Also, until recently line segment shapes couldn’t collide against other line segment shapes even if they had a nice fat beveling radius. They can now thanks to a patch from LegoCylon, but they have the same issues as above, generating too many points with wacky normals. I also had no way to calculate the closest points between two shapes preventing the implementation of polygon shapes with a beveling radius. Yet another issue is that the collision depth for all of the contacts is assigned the minimum separating distance determined by SAT. This can cause contacts to pop when driven together by a large force. Lastly, calculating the closest points is also a stepping stone on the way to get proper swept collision support in Chipmunk in the future.

For some time now, I’ve been quietly toiling away on a Chipmunk branch to improve the collision detection and fix all of these issues. I’ve implemented the GJK/EPA collision detection algorithms as well as a completely new contact point generation algorithm. After struggling on and off for a few months with a number of issues (getting stuck in infinite recursion/loops, issues with caching, issues with floating point precision, suboptimal performance, etc… ugh), it finally seems to be working to my expectations! The performance is about the same as my old SAT based collision code, maybe 10% faster or slower in some cases. Segment to segment collisions work perfectly as do beveled polygons. Smoothed terrain collisions are even working, although the API to define them is a little awkward right now.

All collision types.
Beveled line segments colliding with other shapes!


The aptly named Gilbert–Johnson–Keerthi algorithm is what calculates the closest points between two convex shapes. My implementation preserves the winding of the vertexes it returns which helps avoid precision issues when calculating the separating axis of shapes that are very close together or touching exactly. With the correct winding, you can assume the edge you are given lies along a contour in the gradient of the distance field of the minkowski difference. I’ve also modified the bounding box tree to cache GJK solution. Then in the next frame, you can use that as the starting point. It’s a classic trick that makes GJK generally require only a single iteration per pair of colliding objects.

GJK example
GJK is rather abstract, but it calculates the closest points between two shapes by finding the distance between the minkowski difference of two shapes (the red polygon) and the origin (the big red dot). If you look closely, the red shape is a flipped version of the pentagon with the little triangle tacked on to all it’s corners. It’s one of the coolest and most bizarre algorithms I’ve ever seen. 😀 I’ll probably make a blog entry about my implementation eventually too.


EPA stands for Erik-Peterson-Anders… Nah, it stands for Expanding Polytope Algorithm and is a very close cousin to GJK. While GJK can detect the distance between two shapes, EPA is what you can use to find the minimum separating axis when they are overlapping. It’s sort of the opposite of the closest points. It gives you the distance and direction to slide the two shapes to bring them apart (as well as which points on the surface will be touching). It’s not quite as efficient as GJK and it’s an extra step to run which has the interesting effect of making collision detection of beveled polygons more efficient than regular hard edged ones. This is one thing I’m not completely happy with. Polygon heavy simulations will generally run slower than with 6.1 unless you enable some beveling. It’s not a lot slower, but I don’t like taking steps backwards. On the other hand, it will be much easier to apply SIMD to the hotspots shared by the GJK/EPA code than my previous SAT based code.

Contact Points:

Having new collision detection algorithms is neat and all, but that didn’t solve the biggest (and hardest) issue; my contact point generation algorithm sucked! Actually, it worked pretty good. It has stayed mostly unchanged for 6 years now, but it has also accumulated some strange workarounds for rare conditions that it didn’t handle well. The workarounds sometimes produced strange results (like too many contact points or weird normals…). They also made it practically impossible to add the smoothed terrain collision feature.

In the new collision detection code, polygon to polygon and polygon to segment collisions are treated exactly the same. They pass through the same GJK/EPA steps and end up being passed to the same contact handling code as a pair of colliding edges. It handles collisions with endcaps nicely, always generates either 1 or 2 contact points for the pair, and uses the minimum separating axis for the normals. It’s all very predictable and made the smoothed terrain collisions go pretty easily. It only took me about 10 iterations of ideas for how to calculate the contact points before I got something I was happy with. -_- It really ended up being much, much harder than I expected for something that seems so simple in concept.

The implementation works somewhat similarly to Erin Catto’s contact clipping algorithm, although adding support for beveling (without causing popping contacts) and contact id’s made it quite a bit harder. There are some pretty significant differences now. Perhaps that is another good post for another day.

Coming to a Branch Near You!

The branch is on GitHub here if you want to take a peek and poke around. It’s been a pretty big change, and hasn’t been extensively tested yet. I wouldn’t recommend releasing anything based on it quite yet, but it should be plenty stable for development work, and should even fix a number of existing issues. I’d certainly appreciate feedback!

January 9th, 2013 | Posted by slembcke
Categories: Random | Tags: , ,
Comments Off on Chipmunk Pro performance on the iPhone 5

I finally joined the 21st century after buying a smartphone, an iPhone 5. (Woo I guess?) Anyway. One of the only interesting things that changed with the iPhone 5 was the CPU. It’s supposed to be much faster and uses an new instruction set with extra registers for the NEON vector unit. I was curious to see how much faster it was compared to our iPad 2 at running Chipmunk so I ran the benchmark app and crunched the numbers. It’s certainly a nice leap in performance!

These aren’t conclusive results, but they do paint a nice picture. Normally I run each set a few times and pick the lowest time for each benchmark to remove outliers due to being scheduled on a multitasking OS.

Comparing the iPhone 5 to the iPad 2:

speedup: 2.72x (benchmark - SimpleTerrainCircles_1000)
speedup: 2.60x (benchmark - SimpleTerrainCircles_500)
speedup: 2.50x (benchmark - SimpleTerrainCircles_100)
speedup: 2.68x (benchmark - SimpleTerrainBoxes_1000)
speedup: 2.57x (benchmark - SimpleTerrainBoxes_500)
speedup: 2.55x (benchmark - SimpleTerrainBoxes_100)
speedup: 2.64x (benchmark - SimpleTerrainHexagons_1000)
speedup: 2.63x (benchmark - SimpleTerrainHexagons_500)
speedup: 2.53x (benchmark - SimpleTerrainHexagons_100)
speedup: 2.56x (benchmark - SimpleTerrainVCircles_200)
speedup: 2.62x (benchmark - SimpleTerrainVBoxes_200)
speedup: 2.62x (benchmark - SimpleTerrainVHexagons_200)
speedup: 2.60x (benchmark - ComplexTerrainCircles_1000)
speedup: 2.62x (benchmark - ComplexTerrainHexagons_1000)
speedup: 1.95x (benchmark - BouncyTerrainCircles_500)
speedup: 2.10x (benchmark - BouncyTerrainHexagons_500)
speedup: 1.77x (benchmark - NoCollide)

If you want an idea of what these benchmarks do, the Chipmunk Pro page has little animations of them.

I was also curious how much the extended NEON register set improved performance. It’s been a while, but from what I remember of looking at the disassembled output, the NEON solver in Chipmunk Pro did run out of registers and push values to the stack. So it was possible that the extra registers would be able to speed it up more. It was initially a pain to support armv7s as it was sprung on everybody unexpectedly. All projects were automagically upgraded to build for armv7s when Apple released the new SDK which was annoying for library developers. Having had bad experiences with compiler bugs in Apple’s Clang, I wasn’t willing to release an armv7s build without being able to test it. Anyway, it turns out it was worth the hassle with a decent little performance boost.

The speedups for armv7s vs. armv7 are as follows:

armv7 -> armv7s Speedup:

speedup: 1.23x (benchmark - SimpleTerrainCircles_1000)
speedup: 1.32x (benchmark - SimpleTerrainCircles_500)
speedup: 1.24x (benchmark - SimpleTerrainCircles_100)
speedup: 1.17x (benchmark - SimpleTerrainBoxes_1000)
speedup: 1.17x (benchmark - SimpleTerrainBoxes_500)
speedup: 1.18x (benchmark - SimpleTerrainBoxes_100)
speedup: 1.13x (benchmark - SimpleTerrainHexagons_1000)
speedup: 1.14x (benchmark - SimpleTerrainHexagons_500)
speedup: 1.15x (benchmark - SimpleTerrainHexagons_100)
speedup: 1.23x (benchmark - SimpleTerrainVCircles_200)
speedup: 1.18x (benchmark - SimpleTerrainVBoxes_200)
speedup: 1.15x (benchmark - SimpleTerrainVHexagons_200)
speedup: 1.18x (benchmark - ComplexTerrainCircles_1000)
speedup: 1.13x (benchmark - ComplexTerrainHexagons_1000)
speedup: 1.03x (benchmark - BouncyTerrainCircles_500)
speedup: 1.03x (benchmark - BouncyTerrainHexagons_500)
speedup: 1.00x (benchmark - NoCollide)

That’s about what I expected to see. It was able to speed up a lot of the benchmarks that were using the solver heavily while the last 3 benchmarks that attempted to stress the collision detection performance instead were mostly unaffected. A 10-30% speedup is pretty nice for something as simple as a recompile.

I wonder how this would compare to performance on similar Android devices like the Galaxy S III or Nexus 7. I’ll have to get my hands on one of them and try it.