Following one man's task of building a virtual world from the comfort of his pajamas. Discusses Procedural Terrain, Vegetation and Architecture generation. Also OpenCL, Voxels and Computer Graphics in general.

Tuesday, January 28, 2014

You may want to check out the previous post about water. It ended up producing a 2D map of booleans, where true meant there was water in that location of the map. That was great, but we still had a nasty problem ahead. We needed to level the lakes.

It will be easier if we look at some pictures. Imagine this is the tile we need to compute. Initially it is just the terrain height and the sea map (in this case using a sea-level value):

And here you can see the lake and river location phase from the earlier post in pretty pink:

As you can see in the zoomed portion, these lakes often span over very irregular terrain. We knew the shoreline points for the same lake were at similar height. Figuring out the water level from A to B was the problem. We know A-B should be as flat as possible and the same applies to A and any other point in the shoreline. That's a lot of potential points.

If we had all the time in the world, we could try discovering individual lakes in one phase and then do some sort of iterative leveling by relaxation and or filtering. We had only a fraction of a second for this so we knew it had to be hacked.

We tried many different things. (When I say "we", it is not modesty plural. Michael Coates who recently joined Voxel Farm got to implement these desperate things we tried.) Most had to do with rasterization and interpolation, first from shore to shore, then we got looking into water height derivatives. Nothing really worked.

As a last recourse attempt, we tried an approach that involved a Quadtree. The idea was to encode the water bodies in a Quadtree and apply the same leveling algorithms we knew would be too slow if we were operating in individual water samples.

The shorelines produced a lot of small quads, but as we moved inside the lake we started getting larger quads.

We could see that the larger a patch, the more "detached" it was from the shore. That we liked. We could raise or sink those points much more to achieve the level we needed.

Once the water height of the larger patches is decided, we rasterize them into the water heightmap. This is a simple, fast bi-linear interpolation over the quad. Then we do the same for the smaller quads. There is a reason why you need to process all quads of a given size before processing the next level of smaller patches: You need to make sure the small quads match the interpolation values along the edges they share with a larger quad.

This overall process is quite fast. Here is a rendering of the new found water volumes. It is a bit exaggerated, but hopefully you get the idea:

We still need to work out on some of the heuristics, but it looks we are pretty much on our way.

If there is any lesson to be drawn from this, it would be when in despair, apply a Quadtree and everything will be alright.

Tuesday, January 21, 2014

Kickstarter.com is a beautiful thing. It also has a dark side. It is up to us, the crowd, not only to fund the projects, but to make sure the system is not exploited by scammers and vaporware salesmen.

Without our permission it uses screenshots from Voxel Farm videos to get people to open their wallets. That is not cool. They have not licensed from us, they are not showing any original work. To me that amounts to lying. If you lie to get money, it amounts to stealing.

We have no choice but to point a finger and ask everyone and their friends NOT to contribute to this campaign.

As a rule, we do not allow anyone to raise funds using Voxel Farm. This is to protect funders and the ideal of crowdsourcing in general.

Every week or so we get a request that goes like this: "Dear Voxel Farm: We at Fourcats (or FlyngOx, or whatever) love your Engine. Please let us use your name and artwork to raise funds, then we will be able to afford the license and all will be good." The answer in every case is no. I hope you can see why.

Thursday, January 16, 2014

We just had a new iteration over the smoothing tool. Now it really acts like sand-paper. It can dissolve an entire object if you apply it long enough. If you apply it just the right amount, it even outs surfaces to the point you like.

This is me sculpting in this video. I did not start with a detailed plan, just a vague idea of what I wanted to do. I knew it would be some kind of bony hut structure.

A few months ago while doing a stone golem I realized the sculpting toolset still needed some work. This new version of the smooth tool already makes a huge difference. I can feel now I am more limited by my imagination and skills than by the tools I'm using. This is a good thing.

Monday, January 6, 2014

Both asteroids are around 10 Km diameter. Extinction-Level-Event material for sure.

The lighting in both shots is a bit flat. It helps showing there is some color variation in these bodies. Also this is a new deferred renderer I'm trying out, did not have time to write any shadows and ambient occlusion for it.

Thursday, January 2, 2014

This is taken from some sort of asteroid field. What seems to be a mountain range is the surface of an asteroid where the camera has landed. This one in particular is a few kilometers diameter.

As you can see these asteroids have quite interesting surfaces. And you can dig across them as you fly or walk by. If I had the extra time I would add some pew-pew lasers and rocks being blasted into space.

You can fly around and visit all these rocks. It is all seamless. We are also testing a new system for LOD transitions, where vertices morph gradually from one LOD to the next as you approach them. This makes LOD switches virtually unnoticeable.

The star in the distance is a modified version from this one in shadertoy.com