<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C04EQ3s7fSp7ImA9WhBaFEw.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690</id><updated>2013-05-24T12:11:42.505-04:00</updated><category term="Country" /><category term="Dual Contouring" /><category term="VoxelDB" /><category term="Unlimited Detail" /><category term="Slides" /><category term="Mont Royal Game Society" /><category term="Voxel Studio" /><category term="Culling" /><category term="Simulation" /><category term="Multiplayer" /><category term="Universe" /><category term="Canyon City" /><category term="Castle" /><category term="Mesh Simplification" /><category term="Procedural Architecture" /><category term="LOD" /><category term="HTTP" /><category term="cellular noise" /><category term="Light Scattering" /><category term="Streaming" /><category term="Mesh" /><category term="Leaves" /><category term="Terrain Zones" /><category term="Voxels" /><category term="Sampling Theorem" /><category term="Mesh Compresion" /><category term="AiGameDev.com" /><category term="Unity" /><category term="Monkey Test" /><category term="Voxel Tree" /><category term="Columns" /><category term="Demoparty" /><category term="Skylight" /><category term="Procedural" /><category term="Triangle Mesh" /><category term="Planet" /><category term="Desert" /><category term="Atmosphere" /><category term="Instancing" /><category term="Mesh Baking" /><category term="County" /><category term="Isosurfaces" /><category term="Contour" /><category term="QA" /><category term="Sputnik" /><category term="Corner Tiles" /><category term="Recursion" /><category term="Marching Cubes" /><category term="Decimate" /><category term="Clipmaps" /><category term="Sword and Sworcery" /><category term="Compression" /><category term="Biome" /><category term="Space Colonization" /><category term="Euclideon" /><category term="AdSense" /><category term="Roads" /><category term="Vertex Clustering" /><category term="John Whigham" /><category term="Topology" /><category term="Texturing" /><category term="Terrain Synthesis" /><category term="Tree" /><category term="Snow" /><category term="Demoscene" /><category term="Reduce" /><category term="Neuschwanstein" /><category term="Dwarf Fortress" /><category term="Baloney" /><category term="Relaxation" /><category term="Shadows" /><category term="Scan" /><category term="Grammar" /><category term="World Machine" /><category term="State" /><category term="Perlin" /><category term="Prefix Sum" /><category term="Melodive" /><category term="3ds max" /><category term="worley noise" /><category term="Voxel" /><category term="Indy" /><category term="Worley" /><category term="Interview" /><category term="Genetic Algorithm" /><category term="Politics" /><category term="Ruins" /><category term="Caves" /><category term="Artificial Intelligence" /><category term="Space Warp" /><category term="Voyager3" /><category term="Capital" /><category term="Stats" /><category term="Materials" /><category term="Clouds" /><category term="Ridged Multifractal" /><category term="CUDA" /><category term="Voxelization" /><category term="Presentation" /><category term="Normal Map" /><category term="perlin noise" /><category term="OpenCL" /><category term="Toy" /><category term="wind" /><category term="Singularity" /><category term="Octree" /><category term="Golem" /><category term="Seminar" /><category term="Virtual Memory" /><category term="turbulence" /><category term="Minecraft" /><category term="Sand" /><category term="Volcanic" /><category term="Off-grid" /><category term="Detail Recovery" /><category term="Voxel Farm" /><category term="Star" /><category term="SVO" /><category term="Pixel Art" /><category term="Herringbone Tiles" /><category term="MCA" /><category term="Province" /><category term="VoxelFarm Realtime" /><category term="Occlusion" /><category term="Google" /><category term="Ribbed Vaults" /><category term="Ambient Occlusion" /><category term="Smoothing" /><category term="Forest" /><category term="Sky" /><category term="GreenSpace" /><category term="3D Coat" /><category term="Mesh Projection" /><category term="Procedural City" /><category term="Oveja" /><category term="Wang Tiles" /><category term="Radiosity" /><category term="Journey" /><category term="L-System" /><category term="Multiple Choice Algorithms" /><category term="Sandbox" /><category term="Fall" /><category term="City" /><category term="Undergrowth" /><title>Procedural World</title><subtitle type="html">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.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://procworld.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>128</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ProceduralWorld" /><feedburner:info uri="proceduralworld" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>ProceduralWorld</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CkAAQ3Y_fCp7ImA9WhBaEE4.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-2177251103916860354</id><published>2013-05-20T02:19:00.000-04:00</published><updated>2013-05-20T02:19:02.844-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-20T02:19:02.844-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sandbox" /><category scheme="http://www.blogger.com/atom/ns#" term="Off-grid" /><title>Going off-grid</title><content type="html">Here is a teaser of a series of screenshots and videos to come very soon:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-yIiCsW4R7m0/UZm7m5ifZtI/AAAAAAAACHI/eB1jqGxgAXA/s1600/offgrid1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://4.bp.blogspot.com/-yIiCsW4R7m0/UZm7m5ifZtI/AAAAAAAACHI/eB1jqGxgAXA/s400/offgrid1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This is not Minecraft on LSD.&lt;br /&gt;
&lt;br /&gt;
Once you have a voxel system that is capable of representing surfaces in any direction and curvature, the real challenge becomes UI mechanics. Creating content has to be simple and rewarding. It has to feel like a game. You cannot expect players to pickup a manual or become experts in full voxel edition systems like Z-brush or 3D Coat.&lt;br /&gt;
&lt;br /&gt;
But the potential is definitively there. Going off-grid allows for more interesting creations. If the system is intelligent enough to adapt to whatever is already there, you could be creating all sort of angled and curved content without busting any veins in your forehead.&lt;br /&gt;
&lt;br /&gt;
What is even more interesting: there is no reason why you would limit this only to cubes. These elements you place could be anything: column disks, rocks, crystal shards, archways, statues. They could be even portions of stuff you or someone else has done before.&lt;br /&gt;
&lt;br /&gt;
I'll leave it there for now. Hopefully you will be intrigued enough to come back later checking for more.&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/BflgALpfx70" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/2177251103916860354/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/05/going-off-grid.html#comment-form" title="23 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/2177251103916860354?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/2177251103916860354?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/BflgALpfx70/going-off-grid.html" title="Going off-grid" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-yIiCsW4R7m0/UZm7m5ifZtI/AAAAAAAACHI/eB1jqGxgAXA/s72-c/offgrid1.png" height="72" width="72" /><thr:total>23</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/05/going-off-grid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8DRXw_fyp7ImA9WhBbEE4.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-9185239820053958887</id><published>2013-05-07T23:27:00.000-04:00</published><updated>2013-05-08T13:41:14.247-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-05-08T13:41:14.247-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Culling" /><category scheme="http://www.blogger.com/atom/ns#" term="Clipmaps" /><category scheme="http://www.blogger.com/atom/ns#" term="Occlusion" /><title>Covering the Sun with a finger</title><content type="html">The oldest optimization in real-time graphics is to avoid rendering what you don't see. When you explain this to people who are not in the field, they usually&amp;nbsp;shrug&amp;nbsp;and say something in the line of "Duh, Sherlock".&lt;br /&gt;
&lt;br /&gt;
It is easier said that done. Well, actually a big part of it is quite easy. The first trick you see in all graphics books is to render only what's inside the field of view. While the scene&amp;nbsp;surrounds&amp;nbsp;entirely the camera, the camera only captures a narrower slice of it. Anything outside this slice, which is usually 90 degrees along the horizontal, does not need to render. For a mostly horizontal scene, only 90 degrees out of 360 need to be rendered. This simple optimization reduces scene complexity four times. Another way to put it is, now you can have four times more detail without a performance drop. This technique is called Frustum Culling.&lt;br /&gt;
&lt;br /&gt;
Frustum Culling is a no-brainer&amp;nbsp;for small objects that are scattered around the scene. As scene complexity rises you must batch as many objects together as possible. The need for aggressive batching apparently has relaxed a bit recently, but there is no question that batching is still necessary. This goes against Frustum culling. What if there is an entire batch that is only partially in the field of view? You would still need to render it all. So, the more you batch, the more you can loose from the frustum culling optimization... unless your batches are somehow compatible with the scene slices you need to render. More to that later.&lt;br /&gt;
&lt;br /&gt;
Even if you were able to perfectly cull all the information outside the field of view, there is usually a lot of polygons being rendered in a scene that never make it to the screen as pixels. This is because they become hidden later by a closer polygon.&lt;br /&gt;
&lt;br /&gt;
Imagine a huge mountain with a valley behind it. If the mountain was not there you would see the valley. With the mountain in front of you, all the efforts rendering this valley go to waste. If we could somehow detect we can skip this valley, we would save a lot of rendering. We could have a much nicer mountain.&lt;br /&gt;
&lt;br /&gt;
This technique is called Occlusion Culling. It is in principle a difficult problem, as the final rendering is the ultimate test of what is really visible and what not. Obviously some sort of approximation or model has to be used. A simpler model of the scene allows to estimate what portions of the final rendering will become hidden so it is safe to skip them.&lt;br /&gt;
&lt;br /&gt;
And then again, if you had the occlusion problem perfectly solved, you would still have the issue with batching. It is not that different than with frustum culling. Maybe just a small clip of a large batch is visible, still that would require the entire batch to render... unless your batches are somehow compatible with the scene volumes being occluded.&lt;br /&gt;
&lt;br /&gt;
I wondered that maybe there was a single approach that would help with all these issues at once. Yes, some sort of silver bullet. I set out to look for one, and did find something. Well maybe it is not a silver bullet, but it is quite shinny.&lt;br /&gt;
&lt;br /&gt;
It is about the geometry clipmaps. I have covered them many times in the past. The idea is somewhat simple: if your world can be represented as an octree, you can compute any scene from this world as as series of concentric square rings. Each ring is made of cubic cells. The size of these cells grow exponentially as the rings are farther from the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-N2Eg59Q81GM/TOQiVPe60pI/AAAAAAAAAec/PbBmk4cxxIM/s1600/clipmap.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://2.bp.blogspot.com/-N2Eg59Q81GM/TOQiVPe60pI/AAAAAAAAAec/PbBmk4cxxIM/s400/clipmap.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The image above shows a projection of a clipmap in 2D.&lt;br /&gt;
&lt;br /&gt;
You can see right away how this helps with batching and frustum culling. Each cell is an individual batch, which can contain a few thousand polygons. It is quite simple to determine whether a cell is inside the field of view. Also, cells go out of the field of view quite efficiently as their size is constrained by their very definition.&lt;br /&gt;
&lt;br /&gt;
The clipmap turned to be very friendly for occlusion testing as well. Imagine you could identify some cells as occluders in one specific direction of the clipmap. It becomes fairly simple to test if more distant cells are occluded or not.&lt;br /&gt;
&lt;br /&gt;
The following image shows how this principle works:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-gsk0xbbC3zo/UYnBAFy1eII/AAAAAAAACDk/YJszzb3QjPs/s1600/occlusion.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://3.bp.blogspot.com/-gsk0xbbC3zo/UYnBAFy1eII/AAAAAAAACDk/YJszzb3QjPs/s400/occlusion.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Here four cells have been identified as occluders. They show as vertical red lines. Thanks to them, we can safely assume all the cells painted in dark red can be discarded. These batches are never sent to the graphics card.&lt;br /&gt;
&lt;br /&gt;
In my case I am performing the tests doing software rasterization. It is very fast because the actual cell geometry is not rendered, only cell aligned planes. So far a depth buffer of 64x64 provides sufficient resolution.&lt;br /&gt;
&lt;br /&gt;
Not bad!&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/_T9mOM3bXGU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/9185239820053958887/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/05/covering-sun-with-finger.html#comment-form" title="16 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/9185239820053958887?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/9185239820053958887?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/_T9mOM3bXGU/covering-sun-with-finger.html" title="Covering the Sun with a finger" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-N2Eg59Q81GM/TOQiVPe60pI/AAAAAAAAAec/PbBmk4cxxIM/s72-c/clipmap.png" height="72" width="72" /><thr:total>16</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/05/covering-sun-with-finger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYMQ3s4fyp7ImA9WhBUEUU.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-3439818213263695590</id><published>2013-04-28T11:07:00.002-04:00</published><updated>2013-04-28T16:49:42.537-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-28T16:49:42.537-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Clouds" /><category scheme="http://www.blogger.com/atom/ns#" term="Occlusion" /><title>Video Update for April 2013</title><content type="html">An update about clouds and a surprise topic for the second part.

&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/l_AUzACeQxg?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/l_AUzACeQxg?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;
&lt;/center&gt;
&lt;br /&gt;
Making these recordings feels a bit weird. I love talking to real audiences, but this feels more like leaving a message in someone's answering machine.&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/WG5Zoh2hTNg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/3439818213263695590/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/04/video-update-for-april-2013.html#comment-form" title="23 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3439818213263695590?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3439818213263695590?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/WG5Zoh2hTNg/video-update-for-april-2013.html" title="Video Update for April 2013" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><thr:total>23</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/04/video-update-for-april-2013.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQDSHc5eip7ImA9WhBVGEg.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-2037095634424471108</id><published>2013-04-24T21:29:00.001-04:00</published><updated>2013-04-24T21:29:39.922-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-24T21:29:39.922-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Unity" /><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><title>The Unity plugin is looking good!</title><content type="html">Here is an update on the Unity front. Let's see if a screenshot is worth a thousand words:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-pGfzFDPUivc/UXiEU2bzZII/AAAAAAAACBE/GaDJC5vlxsI/s1600/UnityWithTextures.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://2.bp.blogspot.com/-pGfzFDPUivc/UXiEU2bzZII/AAAAAAAACBE/GaDJC5vlxsI/s400/UnityWithTextures.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This is the same terrain generation you see in other screenshots and videos I have posted. This image in particular was not created by me, but by some very talented guys who took the Voxel Farm engine and are using it from Unity.&lt;br /&gt;
&lt;br /&gt;
The sky and clouds in the screenshot is a box with a static image on it, it is not related to the clouds and sky streak of posts I had earlier. The thing is, once you are in Unity there are several plugins that will do real-time skies for you. Actually there are plugins that will do real-time &lt;i&gt;anything&lt;/i&gt;&amp;nbsp;for you. That is the point. We are hoping to become another one.&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/e1tczgeSEGs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/2037095634424471108/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/04/the-unity-plugin-is-looking-good.html#comment-form" title="24 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/2037095634424471108?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/2037095634424471108?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/e1tczgeSEGs/the-unity-plugin-is-looking-good.html" title="The Unity plugin is looking good!" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-pGfzFDPUivc/UXiEU2bzZII/AAAAAAAACBE/GaDJC5vlxsI/s72-c/UnityWithTextures.png" height="72" width="72" /><thr:total>24</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/04/the-unity-plugin-is-looking-good.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4GR349fyp7ImA9WhBVEEw.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-1653271743762880841</id><published>2013-04-15T03:28:00.001-04:00</published><updated>2013-04-15T03:28:46.067-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-15T03:28:46.067-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Clouds" /><category scheme="http://www.blogger.com/atom/ns#" term="Sky" /><title>Some Clouds</title><content type="html">Clouds come in many forms. When it comes to generating them it seems there is no silver bullet method. Part of the problem is we call clouds to just one aspect of a more general process: water particles suspended in air. This could also be fog, or the misty breath coming out of trees and plants in a jungle. This is what the initiated in this occult science call "The Participating Media".&lt;br /&gt;
&lt;br /&gt;
I decided to tackle this problem by having different layers working together. Which layer to do first? Even in the highest places in Earth, it is likely to find a layer of clouds over your head. I did some experiments over the weekend on how this particular layer could be rendered.&lt;br /&gt;
&lt;br /&gt;
Here are a couple of early screenshots for your consideration:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-AoUxlQ00yo0/UWukrBhGq3I/AAAAAAAAB7k/BAAEMYRda4U/s1600/VoxelFarmDemoGL+2013-04-15+02-49-52-92.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://3.bp.blogspot.com/-AoUxlQ00yo0/UWukrBhGq3I/AAAAAAAAB7k/BAAEMYRda4U/s400/VoxelFarmDemoGL+2013-04-15+02-49-52-92.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-Y3o6r0atRWM/UWulHYA9E2I/AAAAAAAAB70/Ztcs5xQZ4DA/s1600/VoxelFarmDemoGL+2013-04-15+02-35-30-88.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="211" src="http://4.bp.blogspot.com/-Y3o6r0atRWM/UWulHYA9E2I/AAAAAAAAB70/Ztcs5xQZ4DA/s400/VoxelFarmDemoGL+2013-04-15+02-35-30-88.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
It is a very simple and fast method that allows clouds to animate and evolve over time. You can go from a clear sky to a very cloudy one as well. It takes into account the sun's position and does some basic scattering and self shadowing.&lt;br /&gt;
&lt;br /&gt;
These clouds are rendered in the same skydome that performs the day-night cycle, so they do not add any new geometry. This is also the problem with this method: This is a flat layer. There is the impression of volume thanks to how the light is computed, and this trick holds as long as the clouds do not move too fast. If you make them sprint over your head it becomes obvious it is a flat layer. You cannot also come too close to these clouds, that also kills the illusion.&lt;br /&gt;
&lt;br /&gt;
For what it does, I think the method is quite neat, especially if you don't have much GPU cycles to spend in clouds. It does not use any textures or any other resources. This is 100% GPU so it would run nicely in demos or WebGL frames. I think it deserves a future technical post on its own, that of course assuming you guys like how they look.&lt;br /&gt;
&lt;br /&gt;
Let me know what you think by dropping a comment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/cacmEhoudAc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/1653271743762880841/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/04/some-clouds.html#comment-form" title="33 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/1653271743762880841?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/1653271743762880841?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/cacmEhoudAc/some-clouds.html" title="Some Clouds" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-AoUxlQ00yo0/UWukrBhGq3I/AAAAAAAAB7k/BAAEMYRda4U/s72-c/VoxelFarmDemoGL+2013-04-15+02-49-52-92.png" height="72" width="72" /><thr:total>33</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/04/some-clouds.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYDQns5eyp7ImA9WhBWGU0.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-8711338262528656534</id><published>2013-04-10T10:31:00.000-04:00</published><updated>2013-04-13T21:16:13.523-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-13T21:16:13.523-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Light Scattering" /><category scheme="http://www.blogger.com/atom/ns#" term="Atmosphere" /><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><title>The sun rises in ProcWorld, again</title><content type="html">Last week I posted &lt;a href="http://procworld.blogspot.ca/2013/04/the-sun-rises-in-procworld.html"&gt;some early screenshots of the nigh-day cycle&lt;/a&gt;. There was a lot going wrong in them and you guys were very helpful in pointing out solutions.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
I did another iteration on this, while not everything is as it should, I think there was some improvement. This time I have captured a video. The transitions are better appreciated like this. Again let me know what you think.&lt;br /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ubeAipNz2yU?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/ubeAipNz2yU?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;
&lt;/center&gt;
&lt;br /&gt;
The main issues with the previous iteration were the brightness of the sky (or lack of it), and how the distant features failed to blend with the sky. This time I made sure there was enough atmosphere so more light was trapped between the horizon and the eye. The distance to the sky is also consistent with the terrain dimensions, now the colors in terrain and sky match better.&lt;br /&gt;
&lt;br /&gt;
A few comments in the previous post suggested a different method called &lt;a href="http://hal.inria.fr/docs/00/28/87/58/PDF/article.pdf"&gt;"Precomputed Atmospheric Scattering"&lt;/a&gt;. It certainly produces better results than the method I am using here, which is the one from &lt;a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html"&gt;O'Neil in GPU Gems 2&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I had a quick look at the method and saw that in its vanilla form it could run slower than what I have now. While the method uses precomputed tables as textures to accelerate rendering, all the work is done in the fragment shader. That means every pixel on screen now had to perform two or three additional texture fetches.&lt;br /&gt;
&lt;br /&gt;
The method from O'Neil does all the heavy lifting in the vertex shader. Consider this scene:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-hDuhdpZsiCY/UWVwkxzgk8I/AAAAAAAAB7A/slYacMqpqgA/s1600/demo+2013-04-10+09-48-27-88.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="225" src="http://1.bp.blogspot.com/-hDuhdpZsiCY/UWVwkxzgk8I/AAAAAAAAB7A/slYacMqpqgA/s400/demo+2013-04-10+09-48-27-88.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
The sky, even if it appears softly shaded, has only a few vertices:&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Oanbv-PFSDE/UWV0n_eiziI/AAAAAAAAB7Q/A8EMo5Q7I-s/s1600/demo+2013-04-10+10-15-10-90.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://1.bp.blogspot.com/-Oanbv-PFSDE/UWV0n_eiziI/AAAAAAAAB7Q/A8EMo5Q7I-s/s400/demo+2013-04-10+10-15-10-90.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
I think in this case it makes a big difference.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
The precomputed method could also run in the vertex shader, but then it would take some time to port the tables, which now are in pixel formats that cannot be read by the vertex shader.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Of course there is a chance I am reading this wrong. If you have worked in this area before and see what I am missing please let me know.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/aXU2Ke9-HYE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/8711338262528656534/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/04/the-sun-rises-in-procworld-again.html#comment-form" title="28 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/8711338262528656534?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/8711338262528656534?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/aXU2Ke9-HYE/the-sun-rises-in-procworld-again.html" title="The sun rises in ProcWorld, again" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-hDuhdpZsiCY/UWVwkxzgk8I/AAAAAAAAB7A/slYacMqpqgA/s72-c/demo+2013-04-10+09-48-27-88.png" height="72" width="72" /><thr:total>28</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/04/the-sun-rises-in-procworld-again.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYGRHs_fip7ImA9WhBWEEk.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-3920524284834797256</id><published>2013-04-03T22:55:00.001-04:00</published><updated>2013-04-03T22:55:25.546-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-03T22:55:25.546-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Light Scattering" /><category scheme="http://www.blogger.com/atom/ns#" term="Atmosphere" /><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><title>The sun rises in ProcWorld</title><content type="html">So I finally added some proper light scattering to the sky atmosphere in the realtime demo.&lt;br /&gt;
&lt;br /&gt;
I am using the &lt;a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter16.html"&gt;classic approach devised by O'Neil&lt;/a&gt;, which produces great results but it is also very sensitive to any change in the input parameters. A lot of tweaking is still required.&lt;br /&gt;
&lt;br /&gt;
Here is a series of shots, keep in mind this is a work in progress but any early comments surely will help.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-bFDYhj094LM/UVzq7YfSFiI/AAAAAAAAB6U/Auk1LymtAMo/s1600/demo+2013-04-03+22-13-44-97.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://3.bp.blogspot.com/-bFDYhj094LM/UVzq7YfSFiI/AAAAAAAAB6U/Auk1LymtAMo/s400/demo+2013-04-03+22-13-44-97.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-L4cCpaKj3FQ/UVzq6tMbolI/AAAAAAAAB6M/7hGfBWyDwvY/s1600/demo+2013-04-03+22-14-08-73.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://4.bp.blogspot.com/-L4cCpaKj3FQ/UVzq6tMbolI/AAAAAAAAB6M/7hGfBWyDwvY/s400/demo+2013-04-03+22-14-08-73.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-aNvZM6ONo_s/UVzq-6YybGI/AAAAAAAAB6s/bhOw6Nbdjb4/s1600/demo+2013-04-03+22-14-12-09.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://2.bp.blogspot.com/-aNvZM6ONo_s/UVzq-6YybGI/AAAAAAAAB6s/bhOw6Nbdjb4/s400/demo+2013-04-03+22-14-12-09.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&amp;nbsp;&lt;a href="http://4.bp.blogspot.com/-IztbF2Um_cg/UVzq8UBEUdI/AAAAAAAAB6c/-yLZV4HpWF0/s1600/demo+2013-04-03+22-14-25-21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="225" src="http://4.bp.blogspot.com/-IztbF2Um_cg/UVzq8UBEUdI/AAAAAAAAB6c/-yLZV4HpWF0/s400/demo+2013-04-03+22-14-25-21.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-BK43ZaWORig/UVzq-QQl85I/AAAAAAAAB6k/WYq4cEB9JiM/s1600/demo+2013-04-03+22-14-35-49.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://1.bp.blogspot.com/-BK43ZaWORig/UVzq-QQl85I/AAAAAAAAB6k/WYq4cEB9JiM/s400/demo+2013-04-03+22-14-35-49.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/10Hlh7QqEEE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/3920524284834797256/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/04/the-sun-rises-in-procworld.html#comment-form" title="43 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3920524284834797256?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3920524284834797256?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/10Hlh7QqEEE/the-sun-rises-in-procworld.html" title="The sun rises in ProcWorld" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-bFDYhj094LM/UVzq7YfSFiI/AAAAAAAAB6U/Auk1LymtAMo/s72-c/demo+2013-04-03+22-13-44-97.png" height="72" width="72" /><thr:total>43</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/04/the-sun-rises-in-procworld.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYESH8yeyp7ImA9WhBXFko.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-8003200784044956161</id><published>2013-03-30T15:01:00.002-04:00</published><updated>2013-03-30T15:01:49.193-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-30T15:01:49.193-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Multiplayer" /><title>Network Update</title><content type="html">Here is a new video I recently captured. It shows the networking and storage components in action.&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Q4x6RLphiTo?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/Q4x6RLphiTo?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;
&lt;/center&gt;
&lt;br /&gt;
&lt;br /&gt;
When it comes to networking this is the smallest test possible, you cannot really go below two connected clients. I have tested this same server code with nearly a hundred clients performing queries and changes at rates many times higher than what humans would do. Network tests are good at showing why some stuff does not work. But when the results are good it does not really mean anything. The real network is so complex you cannot replace it by any model. In this case results are as good as any network test can be at this stage. There is very little overhead from the thread and connection management, which is what I was looking for.&lt;br /&gt;
&lt;br /&gt;
While this is good news and by all means necessary, the real bottleneck comes from how any application using this engine chooses to store and process information. So again what you are seeing here is just a brick. You could create many different houses with it.&lt;br /&gt;
&lt;br /&gt;
You could do it like Minecraft servers do, have everything including procedural generation run in the server. You could do like this particular demo does, where user-created content is stored in a server and everything else remains client-side. And you could have solutions in-between, for instance have some custom server-side generation which is merged later with the rest of the client-side generation.&lt;br /&gt;
&lt;br /&gt;

This is a fascinating subject to me, I will be covering some of these approaches in the future.&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/w79NN1rysB8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/8003200784044956161/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/03/network-update.html#comment-form" title="32 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/8003200784044956161?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/8003200784044956161?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/w79NN1rysB8/network-update.html" title="Network Update" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><thr:total>32</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/03/network-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQNSX8zfCp7ImA9WhBXFE8.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-2011635842778721884</id><published>2013-03-27T19:51:00.000-04:00</published><updated>2013-03-27T19:53:18.184-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-27T19:53:18.184-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VoxelDB" /><category scheme="http://www.blogger.com/atom/ns#" term="Virtual Memory" /><category scheme="http://www.blogger.com/atom/ns#" term="Voxel Farm" /><title>Storage Matters</title><content type="html">Imagine you were creating a massive persistent world where everyone would be able to change anything at will. It is a simple, powerful idea that eventually has occurred to everyone ever exposed to a game. Why there aren't many of these worlds out there? Well, this very simple idea is quite difficult and expensive to execute. Not only you need to store the information, you have to be able to write it and read it in a timely fashion.&lt;br /&gt;
&lt;br /&gt;
Then how about your own personal world, something you can run in your PC and invite some friends to play over. How much of your PC's performance are you willing to sacrifice, how many people could you actually invite before you would see the quality of your gameplay begin to suffer?&lt;br /&gt;
&lt;br /&gt;
I began wondering whether all the above could be manifestations of the same problem. What if you could have a storage solution that is lightweight so&amp;nbsp;enthusiasts&amp;nbsp;could run at home, and if you pieced enough of them together you could scale it so it would run massive worlds the size of planet Earth?&lt;br /&gt;
&lt;br /&gt;
As it turns out it was possible. I have now a shinny&amp;nbsp;new&amp;nbsp;database system that does exactly that. The main trick is it aligns with the same other concepts of the voxel world. So this is mainly a voxel database. It won't do any SQL queries, XPath evaluation or any other form of traditional DB interaction. It just stores and retrieves voxel data very fast.&lt;br /&gt;
&lt;br /&gt;
How fast? Over a 10 minute period, a machine with six-year-old Intel processor (T2500 at 2GHz) and an equally crappy HD was able to serve 10 Gigabytes worth of individual queries while another 10 Gigabytes worth of queries were being written. Each query ranged from 500 bytes to 100KBytes worth of data.&lt;br /&gt;
&lt;br /&gt;
That would translate into a lot of friends sharing your server. To give you a better idea, a volume of 40x40x40 worth of player voxels compresses to 2K as an average. Here is how you would compute how much space 10 GB of voxel data would be:&lt;br /&gt;
&lt;br /&gt;
1 chunk = 40x40x40 voxels = 12x12x12 meters&lt;br /&gt;
1 chunk = 2K&lt;br /&gt;
10 GB =&amp;nbsp;5,242,880 chunks = 2048x2048x2048&amp;nbsp;meters&lt;br /&gt;
&lt;br /&gt;
How many people can create this amount of voxel content in 10 minutes? I have no idea, but I bet it will be an entire army. At this point the DB is the least of your concerns. The bottleneck is in the network.&lt;br /&gt;
&lt;br /&gt;
The twist comes now: While this rate was sustained for 10 minutes, it was not meant to push the system to the limit. The DB process CPU usage never went up 1% and the memory usage for the process remained at 3 MB. The system was responsive and usable (well as usable as a six year old PC can be), showing no big difference in behavior.&lt;br /&gt;
&lt;br /&gt;
Here is some evidence:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-TNvEuBVxafk/UVNmgMFUJpI/AAAAAAAAB58/UuhSkF8h248/s1600/db.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/-TNvEuBVxafk/UVNmgMFUJpI/AAAAAAAAB58/UuhSkF8h248/s400/db.png" width="353" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
For most of you who are more artistically or design inclined this is certainly the most boring screenshot I have ever posted. But if you are into programming this kind of thing, this is process porn.&lt;br /&gt;
&lt;br /&gt;
Of course the system is doing real work. The main clue is in a different column not displayed by Task Manager: Virtual memory, which was hovering all the time below 20 Megs. Even then the virtual memory was lower than what Google Chrome was using, which was a whooping 99 Megs.&lt;br /&gt;
&lt;br /&gt;
The voxel database is so fast because it uses the same virtual memory management of the OS. So, instead of writing to files in the HD directly, all the information is mapped through the OS paging system. Only the pages that need to be altered go into memory. Also the system does a lazy write to the HD. Even after the process is gone, the OS continues to save the changes to disk.&lt;br /&gt;
&lt;br /&gt;
I feel this is the stepping stone for great things. It will be fairly easy and inexpensive for people to set up their own servers. They could be hosting a lot of players and barely take a hit for it. This of course depends on how the networking is implemented, which leads into another favorite topic of mine: how to make a server that will not bring your PC to its knees. I will be covering that in the near future.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/losKIFLMhxs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/2011635842778721884/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/03/storage-matters.html#comment-form" title="26 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/2011635842778721884?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/2011635842778721884?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/losKIFLMhxs/storage-matters.html" title="Storage Matters" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-TNvEuBVxafk/UVNmgMFUJpI/AAAAAAAAB58/UuhSkF8h248/s72-c/db.png" height="72" width="72" /><thr:total>26</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/03/storage-matters.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEABQn87fyp7ImA9WhBQE0o.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-3650373610440203081</id><published>2013-03-15T15:45:00.000-04:00</published><updated>2013-03-15T15:45:53.107-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-15T15:45:53.107-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Melodive" /><category scheme="http://www.blogger.com/atom/ns#" term="Indy" /><category scheme="http://www.blogger.com/atom/ns#" term="Oveja" /><title>Melodive and Oveja </title><content type="html">I couple of days ago I got this game from one of the readers of this blog. It is all procedural, including the progression of music. The name is Melodive and it is available for iOS.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/EA0oE5sPrTY?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/EA0oE5sPrTY?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;
&lt;/div&gt;
&lt;br /&gt;
Even without the help of mind altering substances, the game takes you to a different dimension. I did find the control scheme a bit frustrating, but it seems there is a whole class of games using this form of tilt, rotate interface. To many of you out there the controls may seem standard.&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;
Oveja&lt;/h2&gt;
And there is this other non-procedural game a&amp;nbsp;Russian&amp;nbsp;friend did from scratch, including programming, graphics and music. He named it Oveja, which in Spanish means "sheep". (Why a Russian guy is giving Spanish names to his games, it is beyond me.) The game is fun and equally surreal, but on a different level.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-gGMCxnPEa2U/UUN3OD42GAI/AAAAAAAAB34/HwzlAllYz-A/s1600/oveja.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://1.bp.blogspot.com/-gGMCxnPEa2U/UUN3OD42GAI/AAAAAAAAB34/HwzlAllYz-A/s400/oveja.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
It runs in Android and it is available free from Google Play:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.mastercluster.oveja" style="background-color: white; color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank"&gt;https://play.google.com/store/&lt;wbr&gt;&lt;/wbr&gt;apps/details?id=com.&lt;wbr&gt;&lt;/wbr&gt;mastercluster.oveja&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you like air-traffic control games you should give it a try. It is like these games, but with sheep in it. I did not get why the black sheep needed to be segregated from the white sheep. This is 2013, those times should be over.&lt;br /&gt;
&lt;br /&gt;
The next version is rumored to include sheep poop and other equally interesting gameplay mechanics.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/Vu8YNH_I3mM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/3650373610440203081/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/03/melodive-and-oveja.html#comment-form" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3650373610440203081?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3650373610440203081?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/Vu8YNH_I3mM/melodive-and-oveja.html" title="Melodive and Oveja " /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-gGMCxnPEa2U/UUN3OD42GAI/AAAAAAAAB34/HwzlAllYz-A/s72-c/oveja.jpg" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/03/melodive-and-oveja.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEBRXw8cSp7ImA9WhBSGE4.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-3058920508456250974</id><published>2013-02-25T17:50:00.001-05:00</published><updated>2013-02-25T17:50:54.279-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-25T17:50:54.279-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Undergrowth" /><category scheme="http://www.blogger.com/atom/ns#" term="Ambient Occlusion" /><title>This one is a talkie!</title><content type="html">Here are two new videos showing some new features.&lt;br /&gt;
&lt;br /&gt;
I finally decided to add an audio track to a video. It does help describing what is new as it appears on screen:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DyybDmt_3_s?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/DyybDmt_3_s?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;

&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: left;"&gt;
Let me know if you like this format. I think I could do one of these every month.&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
The second video is some sort of fast steady-cam flyover:&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;center&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/M1u6_qQi9kg?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/M1u6_qQi9kg?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;
&lt;/center&gt;
&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/rFDWSq__rq8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/3058920508456250974/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/02/this-one-is-talkie.html#comment-form" title="59 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3058920508456250974?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3058920508456250974?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/rFDWSq__rq8/this-one-is-talkie.html" title="This one is a talkie!" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><thr:total>59</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/02/this-one-is-talkie.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIEQX0-eyp7ImA9WhBSFEk.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-1620801664262263780</id><published>2013-02-21T07:06:00.000-05:00</published><updated>2013-02-21T07:08:20.353-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-21T07:08:20.353-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Instancing" /><category scheme="http://www.blogger.com/atom/ns#" term="Undergrowth" /><title>Undergrowth</title><content type="html">Last weekend I took some time to add a new feature to the engine. It is some sort of mesh instancing system that brings additional detail on top of the geometry output. It can be used to add a new vegetation layer under trees, like the following images show:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-jYXlMW9rmDA/USYKsurNtOI/AAAAAAAAB24/KnBi1z2qhnA/s1600/undergrowth1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://3.bp.blogspot.com/-jYXlMW9rmDA/USYKsurNtOI/AAAAAAAAB24/KnBi1z2qhnA/s400/undergrowth1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-JDLQfivPJ4U/USYKsndmK_I/AAAAAAAAB28/JSoldE5eXP0/s1600/undergrowth2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://1.bp.blogspot.com/-JDLQfivPJ4U/USYKsndmK_I/AAAAAAAAB28/JSoldE5eXP0/s400/undergrowth2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I will be using it for rocks, pebbles, even man-made elements sticking out of the blocks you place.&lt;br /&gt;
&lt;br /&gt;
Polygon counts are now escalating quickly because of this. My old 4770 still averages 40 FPS at 1080p but begins to struggle. It is still manageable, there are some polygons right now I can cut.&lt;br /&gt;
&lt;br /&gt;
This one was long needed. I will be posting a video later so you guys can see how the LOD transitions are managed. I think this has improved a lot.&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/CU4L_T1oEMU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/1620801664262263780/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/02/undergrowth.html#comment-form" title="37 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/1620801664262263780?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/1620801664262263780?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/CU4L_T1oEMU/undergrowth.html" title="Undergrowth" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-jYXlMW9rmDA/USYKsurNtOI/AAAAAAAAB24/KnBi1z2qhnA/s72-c/undergrowth1.jpg" height="72" width="72" /><thr:total>37</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/02/undergrowth.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkYERXYyeCp7ImA9WhBSEkw.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-4234628156189454090</id><published>2013-02-18T14:01:00.000-05:00</published><updated>2013-02-18T14:01:44.890-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-18T14:01:44.890-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Unity" /><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><title>Unity makes strength</title><content type="html">I like writing everything from scratch, but not everyone shares this form of dementia.&lt;br /&gt;
&lt;br /&gt;
Many in the past have asked whether any of this would run on mainstream game engines. I could not see a reason why not. The VoxelFarm engine outputs traditional polygons, in theory it could be plugged into any engine using polygons for rendering, physics, etc. That remained a nice theory until recently. Now we have some hard proof:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-c9Z8Su97wL8/USJ4PJx8kBI/AAAAAAAAB2U/cDE1TjFV17Q/s1600/voxelfarm-Unity3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://2.bp.blogspot.com/-c9Z8Su97wL8/USJ4PJx8kBI/AAAAAAAAB2U/cDE1TjFV17Q/s400/voxelfarm-Unity3.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This screnshot shows the VoxelFarm realtime engine providing polygons for terrain in Unity.&lt;br /&gt;
&lt;br /&gt;
Here is are a video. It shows a simple physics test and a little bit of walking. The capture speed and resolution is not good, but hopefully you will get the idea.&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0-mZ3coEbZA?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/0-mZ3coEbZA?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;

&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
I understand if this tech is to be widely used, it will likely come in the form of plugins for mainstream engines. So think this is very encouraging news.&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/qnOb0xzi6fw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/4234628156189454090/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/02/unity-makes-strength.html#comment-form" title="26 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/4234628156189454090?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/4234628156189454090?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/qnOb0xzi6fw/unity-makes-strength.html" title="Unity makes strength" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-c9Z8Su97wL8/USJ4PJx8kBI/AAAAAAAAB2U/cDE1TjFV17Q/s72-c/voxelfarm-Unity3.jpg" height="72" width="72" /><thr:total>26</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/02/unity-makes-strength.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYFR3k5eip7ImA9WhBTEE0.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-9196099973114661308</id><published>2013-02-04T14:45:00.001-05:00</published><updated>2013-02-04T14:45:16.722-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-04T14:45:16.722-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Procedural Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="Voxel Tree" /><category scheme="http://www.blogger.com/atom/ns#" term="Voxel Studio" /><title>Voxel Studio Videos</title><content type="html">Here are three videos I captured from Voxel Studio to help with the AiGameDev.com interview:

&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;

&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6XqXY3miBck?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/6XqXY3miBck?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;

&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/k-jHy7-fIhc?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/k-jHy7-fIhc?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;

&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LSd4sEQdwKQ?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/LSd4sEQdwKQ?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;

&lt;/center&gt;
&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/o8nhGDCUwBw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/9196099973114661308/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/02/voxel-studio-videos.html#comment-form" title="12 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/9196099973114661308?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/9196099973114661308?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/o8nhGDCUwBw/voxel-studio-videos.html" title="Voxel Studio Videos" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><thr:total>12</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/02/voxel-studio-videos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QDRX88fyp7ImA9WhNaFUw.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-720609142468465034</id><published>2013-01-29T23:16:00.002-05:00</published><updated>2013-01-29T23:16:14.177-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-29T23:16:14.177-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Interview" /><category scheme="http://www.blogger.com/atom/ns#" term="AiGameDev.com" /><title>AiGameDev.com Live Broadcast</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-rpQYB2TNhac/UQieVCaxwfI/AAAAAAAABw4/VjHuFAvlsrQ/s1600/aidev.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-rpQYB2TNhac/UQieVCaxwfI/AAAAAAAABw4/VjHuFAvlsrQ/s1600/aidev.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Next Sunday February 3rd I will be doing a live interview at AiGameDev.com&lt;br /&gt;
&lt;br /&gt;
You can find the right moment to tune in for you time-zone here in this page, where the broadcast will eventually appear:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://aigamedev.com/broadcasts/procworld/"&gt;http://aigamedev.com/broadcasts/procworld/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Make sure you catch it on time. The archived version may be playable only to members of the AiGameDev community.


&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/M4j53D_F0EE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/720609142468465034/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/01/aigamedevcom-live-broadcast.html#comment-form" title="16 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/720609142468465034?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/720609142468465034?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/M4j53D_F0EE/aigamedevcom-live-broadcast.html" title="AiGameDev.com Live Broadcast" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-rpQYB2TNhac/UQieVCaxwfI/AAAAAAAABw4/VjHuFAvlsrQ/s72-c/aidev.jpg" height="72" width="72" /><thr:total>16</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/01/aigamedevcom-live-broadcast.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04AR307fCp7ImA9WhNbF04.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-4173568366790634458</id><published>2013-01-20T22:45:00.000-05:00</published><updated>2013-01-20T22:45:46.304-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-20T22:45:46.304-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Sandbox" /><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Minecraft" /><category scheme="http://www.blogger.com/atom/ns#" term="Voxel" /><category scheme="http://www.blogger.com/atom/ns#" term="Smoothing" /><title>Don't be square!</title><content type="html">Minecraft gets many things right, but the top in my list is how easy it is to create. Nothing is simpler than laying out boxes. Since everything is square (even the cows), being limited to boxes does not feel bad at all.&lt;br /&gt;
&lt;br /&gt;
If you are doing some sort of sandbox environment going beyond just boxes is not trivial. One possible approach is to do like Blockscape, where in addition to the classic box you now have a large repertoire of prefixed angular shapes. I do not like this approach as it makes the interface very complex and frustrating. It makes you forehead veins pop.&lt;br /&gt;
&lt;br /&gt;
So I chose a different approach, where you still lay boxes the same as in Minecraft, but then you can go back and alter them. I saw that a single operation was enough to produce both curved and straight angled surfaces. If you applied it gently you would get curves. If you applied it more, it would straighten out.&lt;br /&gt;
&lt;br /&gt;
Here you can see a round hole and a needle, both&amp;nbsp;initially&amp;nbsp;created as boxes. It only takes a few clicks to shift their shapes:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-SX_XmTiOSpk/UPy439IMHqI/AAAAAAAABok/BTWsPZoRzFM/s1600/VoxelFarmRealtime+2013-01-20+22-31-11-99.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="225" src="http://2.bp.blogspot.com/-SX_XmTiOSpk/UPy439IMHqI/AAAAAAAABok/BTWsPZoRzFM/s400/VoxelFarmRealtime+2013-01-20+22-31-11-99.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I think this is the right direction. Still it is not simple to implement. While I got this thing working, there are many issues to fix.&lt;br /&gt;
&lt;br /&gt;
I leave you with a video, let me know what you think:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/EuLOJBUBMqw?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/EuLOJBUBMqw?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;&lt;/center&gt;
&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/N0oEEzmkBsc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/4173568366790634458/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/01/dont-be-square.html#comment-form" title="84 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/4173568366790634458?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/4173568366790634458?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/N0oEEzmkBsc/dont-be-square.html" title="Don't be square!" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-SX_XmTiOSpk/UPy439IMHqI/AAAAAAAABok/BTWsPZoRzFM/s72-c/VoxelFarmRealtime+2013-01-20+22-31-11-99.jpg" height="72" width="72" /><thr:total>84</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/01/dont-be-square.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIFSH07cSp7ImA9WhNbFk8.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-6710400999102250551</id><published>2013-01-19T14:25:00.000-05:00</published><updated>2013-01-19T14:25:19.309-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-19T14:25:19.309-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Voxel" /><category scheme="http://www.blogger.com/atom/ns#" term="Toy" /><title>Voxel Playset</title><content type="html">One last post about kids and I will shut up.&lt;br /&gt;
&lt;br /&gt;
It turns out I have been using my kid's toys to help me think about voxels and other algorithms. This is by far my favorite:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-6IdDyefDQfI/UPrwoMcQt1I/AAAAAAAABlk/dnOaGTop1qg/s1600/voxelset.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://2.bp.blogspot.com/-6IdDyefDQfI/UPrwoMcQt1I/AAAAAAAABlk/dnOaGTop1qg/s400/voxelset.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This thing really helps. Some of the work you do with voxels becomes a lot easier if you have a way to look around them with your eyes instead of just your mind.&lt;br /&gt;
&lt;br /&gt;
Several of these cubes now have little annotations done by me with a sharpie: numbers, face indices and other stuff like that. These numbers can also be found in the source code.&lt;br /&gt;
&lt;br /&gt;
Here is another time saver:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-9PFRmTcP_M4/UPrxz7_xn5I/AAAAAAAABmI/C-K6URsKIWg/s1600/voxelset2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://2.bp.blogspot.com/-9PFRmTcP_M4/UPrxz7_xn5I/AAAAAAAABmI/C-K6URsKIWg/s400/voxelset2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
No need to waste paper if you just want a temporary drawing for something you need to understand.&lt;/div&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/jsEXsV4yuJU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/6710400999102250551/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/01/voxel-playset.html#comment-form" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/6710400999102250551?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/6710400999102250551?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/jsEXsV4yuJU/voxel-playset.html" title="Voxel Playset" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-6IdDyefDQfI/UPrwoMcQt1I/AAAAAAAABlk/dnOaGTop1qg/s72-c/voxelset.JPG" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/01/voxel-playset.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMESH46cCp7ImA9WhNbE0o.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-972078544564802702</id><published>2013-01-16T17:05:00.001-05:00</published><updated>2013-01-16T18:03:29.018-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-16T18:03:29.018-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="QA" /><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Monkey Test" /><title>Monkey Testing</title><content type="html">It is hard to find bugs in software you have written. A developer is always conditioned to the way the software its built. The scenarios that you will test are only those you anticipated. It is like playing chess against yourself.&lt;br /&gt;
&lt;br /&gt;
When it comes to a fresh point of view, nothing can rival an actual monkey. Monkeys are guaranteed to exercise every bit of interface you expose. Now monkeys are hard to come by. If you lack one the next&amp;nbsp;best thing is a two-year old human.&lt;br /&gt;
&lt;br /&gt;
I have two-year old twins girls, so I decided to give it a try. It was surprisingly easy to get them to play with the software. (I did tell them there was a pretty bird hiding somewhere in the trees.)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-WAI_1zKtV3s/UPcfsr-8KXI/AAAAAAAABkc/cp3tcXAORw4/s1600/beta1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://3.bp.blogspot.com/-WAI_1zKtV3s/UPcfsr-8KXI/AAAAAAAABkc/cp3tcXAORw4/s400/beta1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;
&lt;br /&gt;
&lt;center&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/fM8i7Aqroc0?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/fM8i7Aqroc0?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;&lt;/center&gt;
&lt;br /&gt;
Did they find any bugs?&lt;br /&gt;
&lt;br /&gt;
They found several bugs I had not seen before. Most were about camera collisions, and there was one really nasty synchronization bug with a garbage collector. That bug alone was worth the experiment.&lt;br /&gt;
&lt;br /&gt;
And there is also proof you can advance a software project and look absolutely adorable in the process.&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/lNP_10gvcoQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/972078544564802702/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/01/monkey-testing.html#comment-form" title="21 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/972078544564802702?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/972078544564802702?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/lNP_10gvcoQ/monkey-testing.html" title="Monkey Testing" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-WAI_1zKtV3s/UPcfsr-8KXI/AAAAAAAABkc/cp3tcXAORw4/s72-c/beta1.jpg" height="72" width="72" /><thr:total>21</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/01/monkey-testing.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YERXk5eip7ImA9WhNUGU4.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-7203318211132206367</id><published>2013-01-11T13:16:00.001-05:00</published><updated>2013-01-11T14:05:04.722-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-11T14:05:04.722-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Artificial Intelligence" /><category scheme="http://www.blogger.com/atom/ns#" term="Singularity" /><category scheme="http://www.blogger.com/atom/ns#" term="Google" /><category scheme="http://www.blogger.com/atom/ns#" term="AdSense" /><title>Google you still don't get this</title><content type="html">Nothing to do with procedural generation, but maybe a bit about artificial intelligence.&lt;br /&gt;
&lt;br /&gt;
Almost two years ago &lt;a href="http://procworld.blogspot.ca/2011/03/seriously-google-seriously.html"&gt;I was complaining about Google's lack of intelligence in matching ads to content&lt;/a&gt;. A bit later I was doing posts about tree and forest generation and Google kept serving ads about gardening and&amp;nbsp;genealogical&amp;nbsp;trees.&lt;br /&gt;
&lt;br /&gt;
You would expect two years would have made a difference, then a week ago I started posting about T.I.L.E.S. These are the ads I get now:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-mZXYOrVJgqo/UPBBY-4FATI/AAAAAAAABfY/_L_BEP9-5pI/s1600/dumbgoogle.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://3.bp.blogspot.com/-mZXYOrVJgqo/UPBBY-4FATI/AAAAAAAABfY/_L_BEP9-5pI/s400/dumbgoogle.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Just makes no sense to me. With all the tracking and understanding they do, just a few words are enough to get them off the scent.&lt;br /&gt;
&lt;br /&gt;
I'm glad they got Ray Kurzweil and all, but I begin to wonder whether the Singularity will be just sub-par intelligence at a massive scale. We are bracing for this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-ZJuvrhqGxU4/UPBWccXGRHI/AAAAAAAABgM/s2XnzYUhN8c/s1600/fullevil.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="247" src="http://3.bp.blogspot.com/-ZJuvrhqGxU4/UPBWccXGRHI/AAAAAAAABgM/s2XnzYUhN8c/s400/fullevil.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
When what we may be getting is this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-bz_4dmRJzXo/UPBWOMk-HhI/AAAAAAAABgE/zL89NKlBOVc/s1600/fullretard.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="268" src="http://2.bp.blogspot.com/-bz_4dmRJzXo/UPBWOMk-HhI/AAAAAAAABgE/zL89NKlBOVc/s400/fullretard.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span id="goog_1826900208"&gt;&lt;/span&gt;&lt;span id="goog_1826900209"&gt;&lt;/span&gt;&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/nZUhI-Oezp8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/7203318211132206367/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/01/google-you-still-dont-get-this.html#comment-form" title="20 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/7203318211132206367?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/7203318211132206367?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/nZUhI-Oezp8/google-you-still-dont-get-this.html" title="Google you still don't get this" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-mZXYOrVJgqo/UPBBY-4FATI/AAAAAAAABfY/_L_BEP9-5pI/s72-c/dumbgoogle.jpg" height="72" width="72" /><thr:total>20</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/01/google-you-still-dont-get-this.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIMQHw7fSp7ImA9WhNUGEo.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-5227353264289068883</id><published>2013-01-10T11:47:00.001-05:00</published><updated>2013-01-10T23:13:01.205-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-10T23:13:01.205-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Wang Tiles" /><category scheme="http://www.blogger.com/atom/ns#" term="Genetic Algorithm" /><category scheme="http://www.blogger.com/atom/ns#" term="Corner Tiles" /><category scheme="http://www.blogger.com/atom/ns#" term="Herringbone Tiles" /><title>Tile Genetics</title><content type="html">This is a continuation of &lt;a href="http://procworld.blogspot.ca/2013/01/introduction-to-wang-tiles.html"&gt;an earlier post&lt;/a&gt; which was some kind of introduction to Wang tiles. These tiles allow you to cover an infinite plane using a small set, and you can do it in a way that makes repeating patterns a lot less noticeable.&lt;br /&gt;
&lt;br /&gt;
I was recommending everyone to learn about them because there are many problems in&amp;nbsp;procedural&amp;nbsp;generation that lend very well to aperiodic tiling. But the approach in vanilla Wang tiles was only the&amp;nbsp;beginning&amp;nbsp; This same principle can be applied in many different ways. For instance, here is a brilliant approach to doing rooms using what the author has called Herringbone Wang Tiles. Here you can see how they were used to generate a system or corridors and rooms.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-EZVCNL8oFRo/UO7MQEHCbaI/AAAAAAAABbc/GqLVkpyYn5c/s1600/tilesB1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://4.bp.blogspot.com/-EZVCNL8oFRo/UO7MQEHCbaI/AAAAAAAABbc/GqLVkpyYn5c/s400/tilesB1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
You can find a description of the method &lt;a href="http://nothings.org/gamedev/herringbone/"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
There is also a quite popular improvement over classic Wang tiles which uses &lt;a href="http://graphics.cs.kuleuven.be/publications/LD06AWTCECC/"&gt;colored corners&lt;/a&gt; instead of colored edges. It results in smaller sets, more diversity and of course their main claim, which is to solve the "corner problem" in Wang tiles. This problem arises from the fact Wang tiles constrains which tiles can be placed along the edges, but says nothing about the corners, that is, the diagonal directions: NW, NE, SE and SW. This often creates noticeable artifacts in the tiling. Corner tiles still suffers from this. The&amp;nbsp;discontinuities&amp;nbsp;are now pushed to the middle of the edges but the problem is somewhat smaller since only two tiles meet there, compared to four tiles in the corner for vanilla Wang.&lt;br /&gt;
&lt;br /&gt;
And there is this very popular &lt;a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter12.html"&gt;adaptation of the Wang algorithm to the GPU&lt;/a&gt; in GPU Gems 2.&amp;nbsp;I found &lt;a href="http://www.pathofexile.com/forum/view-thread/55091"&gt;this nice tutorial&lt;/a&gt; about how to create textures for it. This is from the game Path Of Exile, which appears to use Wang tiles extensively with great results.&lt;br /&gt;
&lt;br /&gt;
As I was saying in my earlier post, the real challenge with all these methods is to come up with the content for the tiles. One approach is to&amp;nbsp;synthesize&amp;nbsp;the content of the tiles entirely. This way you are always in control of what happens at the connection points (corners, edges, etc. depending on which tile flavor you have picked).&lt;br /&gt;
&lt;br /&gt;
This is how I built the cave system for the realtime engine. The crypt profiles, along with narrow tunnels, are drawn by a program. This program makes sure everything connects properly. Here is an example of the output;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-cOrM0ac4VBI/UO7SL5-yDnI/AAAAAAAABcA/wJ-5JRYNz5s/s1600/cave.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-cOrM0ac4VBI/UO7SL5-yDnI/AAAAAAAABcA/wJ-5JRYNz5s/s1600/cave.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
The dots inside the large space are massive columns. These are in the tiles as well.&lt;br /&gt;
&lt;br /&gt;
This is not difficult and provides good results as long as you are targeting simple shapes, something you can&amp;nbsp;synthesize. Problem is, in most cases like with textures, you want to use samples you have taken from the real world and use them for the tiles.&lt;br /&gt;
&lt;br /&gt;
If you read the Path Of Exile tutorial I linked before, you will see that this is not a simple task. A lot of work and skill was needed to produce good looking tiles. And this method is only for two colors, that is, the simplest set possible. Imagine if you wanted to have 10 different colors. It would be madness.&lt;br /&gt;
&lt;br /&gt;
There are ways to automate this. If you have an original sample that is large enough, you can take different portions of it and assemble the texture set. Here is &lt;a href="http://graphics.ewha.ac.kr/SWangTile/main.pdf"&gt;a fairly good description of the method&lt;/a&gt;&amp;nbsp;(PDF). There is a lot of&amp;nbsp;Frankenstein-esque&amp;nbsp;ingenuity involved, as you must stitch different parts together, hoping the texturing discontinuities will remain small. This produces fairly good results if the original texture is homogeneous, but in most cases "hoping" is not good enough.&lt;br /&gt;
&lt;br /&gt;
I tried this method for terrain synthesis. As a source I used a heightmap with some dramatic features in it. Here you can see a sample:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-IvVhMjH9KM0/UO7ZBA8SXII/AAAAAAAABck/-PDGnzGGGZE/s1600/tilesB2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-IvVhMjH9KM0/UO7ZBA8SXII/AAAAAAAABck/-PDGnzGGGZE/s400/tilesB2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
As the original sample was far from homogeneous, which is after all what you want in interesting terrain, I quickly saw that just one iteration of the method was not enough.&amp;nbsp;This was an optimization problem, somehow I had to minimize the discontinuities produced by the tiles. It is the kind of problem you could solve using genetic algorithms.&lt;br /&gt;
&lt;br /&gt;
You may feel you are entering the mad scientist realm, growing human ears out of mice, playing God with bits, and in fact you are.&lt;br /&gt;
&lt;br /&gt;
The fist step was to design a DNA sequence. Each possible solution (an individual) can be defined as the border and tile coordinates within the sample bitmap. I was doing a set of 200 tiles, with 10 borders in each direction. That resulted in a few hundred bits of DNA.&lt;br /&gt;
&lt;br /&gt;
Next I would do the first population of individuals, which I kept at a thousand. Each individual was randomly generated, just by flipping bits in the DNA.&lt;br /&gt;
&lt;br /&gt;
Next a "fitness"&amp;nbsp;coefficient&amp;nbsp;is computed for each individual. This is a number that indicates how good the individual is as a solution. In my case it was simple, as I could compute the amount of discontinuities the solution had. I also threw in a histogram comparison with the original source, just to make sure all the tones in the original were kept. Adding these two errors gave me a direct measure of the quality of the individual.&lt;br /&gt;
&lt;br /&gt;
Using this measure I could rank the entire population and throw some kind of sexy party. The hot individuals got to reproduce the most, but even the not-so-good ones got their chance to immortalize their seed. This makes sense because a very undesirable trait could become the base of a very nice feature in a future generation. Even the Great Mutato could be the beginning of something beautiful.&lt;br /&gt;
&lt;br /&gt;
I used a very specific way of mixing the DNA, which is called "one-point crossover". It gets a random portion of the father's DNA and the remainder space is copied from the mother's DNA.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-O6HasGmoA7Y/UO7ma4H0FEI/AAAAAAAABdI/c0iltIYr_GU/s1600/SinglePointCrossover.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-O6HasGmoA7Y/UO7ma4H0FEI/AAAAAAAABdI/c0iltIYr_GU/s1600/SinglePointCrossover.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This way a new generation is formed. But only 80% of the new members are descendants of existing individuals. The remaining 20% is generated randomly generated, just to make sure there will be enough genetic variety.&amp;nbsp;And of course there is mutation. Each children would have some of its DNA bits randomly flipped.&lt;br /&gt;
&lt;br /&gt;
Watching these things evolve and get better over time is mesmerizing. But it was kind of slow. I realized a needed a massive approach to it. I split the logic into two sections. The part keeping track of the population, doing crossovers and mutations ran in a single process. Then the part that evaluated the fitness of an individual, which was the time-consuming part, ran in a little army of processes over a LAN. (I used good old TCP/IP for distributing the work, ZeroMQ evangelists please go away)&lt;br /&gt;
&lt;br /&gt;
Now this thing ran in eight machines, averaging 3 cores. That is roughly 24 instances of the fitness evaluator. After a week running, I started seeing solutions that I could use. For instance, this image is the result of tiling one of these individuals:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-VeCwkS1qRp8/UO7s8Y9s9UI/AAAAAAAABds/bSnau74ZQgw/s1600/tilesB3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-VeCwkS1qRp8/UO7s8Y9s9UI/AAAAAAAABds/bSnau74ZQgw/s1600/tilesB3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This may seem like a success story, but to me it does not feel like that. The amount of effort and energy that goes into producing tilesets may not justify the advantages you get out of them. Even after weeks of running, most of the individuals still produced noticeable discontinuities.&lt;br /&gt;
&lt;br /&gt;
I know in my case there is a lot of room for improvement. The cutting strategy for mixing tiles with borders can be improved a lot. One thing I want to try it to use patterns in the texture to govern the cutting path. This should mask the transitions even more natural.&lt;br /&gt;
&lt;br /&gt;
The bottom line for me is, Wang tiles are amazing things until you try to use them seriously. They work great for stuff you can&amp;nbsp;synthesize&amp;nbsp;from the ground up. If you are trying to mix samples from real life, get ready for some trouble.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/XrT4NImQwDs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/5227353264289068883/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/01/tile-genetics.html#comment-form" title="10 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/5227353264289068883?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/5227353264289068883?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/XrT4NImQwDs/tile-genetics.html" title="Tile Genetics" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-EZVCNL8oFRo/UO7MQEHCbaI/AAAAAAAABbc/GqLVkpyYn5c/s72-c/tilesB1.png" height="72" width="72" /><thr:total>10</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/01/tile-genetics.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4HRn4zcCp7ImA9WhNUEkk.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-5867293528781666021</id><published>2013-01-03T16:35:00.001-05:00</published><updated>2013-01-03T16:35:37.088-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-03T16:35:37.088-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Wang Tiles" /><title>Introduction to Wang Tiles</title><content type="html">This is guaranteed to be a very colorful post.&lt;br /&gt;
&lt;br /&gt;
Since the early days of computer graphics, texturing has been the favorite method to bring detail into 3D surfaces.&lt;br /&gt;
&lt;br /&gt;
The problem with textures is they take a lot of memory. While there are some attempts to have 3D worlds uniquely textured, like Id's Rage, the traditional approach remains to tile a smaller rectangle of texture across a much larger 3D surface.&lt;br /&gt;
&lt;br /&gt;
This certainly does the job, but it also brings out these repeating patterns we dislike so much. There are a number of ways to mask the repetition, sometimes by blending more than one texture, or by adding splats of unique detail in strategic places.&lt;br /&gt;
&lt;br /&gt;
Another approach is to use Wang tiles. If they are new to you, once you are done reading this you should Google them up and get soaked on what they are and how they work. You will love learning about this. It will expand the way you look at problems in the future. Wang tiles are much more than just a method to avoid repeating textures. You could use them to generate terrain, geometry, architecture. If you get carried away, you'd see they are actually full fledged computing devices on their own.&lt;br /&gt;
&lt;br /&gt;
You could say we have used them already without knowing, as the traditional way we tile textures is one specific case of Wang tiles.&lt;br /&gt;
&lt;br /&gt;
But forget Wang tiles for a moment. The way you would normally texture a brick wall is to use a 2D image and let the GPU do the tiling. If you just take a picture of a brick wall in real life and use it, you would see there are very noticeable discontinuities where the edges meet. The colors on the North edge of the image do not connect properly to the colors in the South edge, and the same happens with East and West.&lt;br /&gt;
&lt;br /&gt;
This is very noticeable in the following polka dots texture:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-7aCfTrb6AAM/UOWagYn4F0I/AAAAAAAABUU/7312scoej-g/s1600/tiles1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://3.bp.blogspot.com/-7aCfTrb6AAM/UOWagYn4F0I/AAAAAAAABUU/7312scoej-g/s400/tiles1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This is easily solved by making the texture "seamless". What it involves is to make sure the West and North edges match the East and South edges respectively. In most cases this is done manually, using a tool like Photoshop.&lt;br /&gt;
&lt;br /&gt;
Here you see the fixed texture:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-E0P5zgARU24/UOWeiwG7vUI/AAAAAAAABU0/ZsAaCTH2lZA/s1600/tiles2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="215" src="http://4.bp.blogspot.com/-E0P5zgARU24/UOWeiwG7vUI/AAAAAAAABU0/ZsAaCTH2lZA/s400/tiles2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Problem solved. But this texture still has very noticeable repeating patterns. If you tile it long enough they are hard to miss.&lt;br /&gt;
&lt;br /&gt;
Here comes the twist. We made this texture work by making sure edges connected properly. We have one edge that is shared horizontally, and another one that is shared vertically:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-yLr42UEfyOE/UOWj0J2DIcI/AAAAAAAABVU/7-AkZ0BO4Sc/s1600/tiles3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-yLr42UEfyOE/UOWj0J2DIcI/AAAAAAAABVU/7-AkZ0BO4Sc/s1600/tiles3.png" /&gt;&lt;/a&gt;&lt;/div&gt;
So what is inside the tile does not matter as long as the edges connect properly. Instead of just one texture we could use several, all sharing the same edges. Here is an example:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-VcIfA90pcMw/UOWy8bePoJI/AAAAAAAABWU/OhPC03UXEG8/s1600/tiles4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://1.bp.blogspot.com/-VcIfA90pcMw/UOWy8bePoJI/AAAAAAAABWU/OhPC03UXEG8/s400/tiles4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
We could pick which tile to use randomly. This will eliminate the repeating patterns coming from the center area of the tiles. But we would still have some repetition coming from the edges.&lt;br /&gt;
&lt;br /&gt;
Here enters Mr Hao Wang. He predicted what we are about to do was not possible, and for being wrong this method bears his name. In reality he did all the heavy work so it is more than deserved. Here is a picture of Hao Wang winning the 20 Km men's race in Chihuahua:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-W2Q3KGt_-7k/UOXT0FzpCaI/AAAAAAAABW0/fzk-DgXDJPI/s1600/wang.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="265" src="http://3.bp.blogspot.com/-W2Q3KGt_-7k/UOXT0FzpCaI/AAAAAAAABW0/fzk-DgXDJPI/s400/wang.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Actually that is not Wang, but it is the spirit what counts.&lt;br /&gt;
&lt;br /&gt;
Wang tiles allow us to have more than just one vertical and one horizontal border. You can choose to have as many as you want. As soon as you know how many different borders there are, the method tells you how many tiles you need so you can tile them all you want without leaving any holes.&lt;br /&gt;
&lt;br /&gt;
Let's say you choose to have two horizontal borders, blue and yellow, and two vertical borders, red and green. Here is a resulting set of 16 tiles:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-tWONPctbUV4/UOXh0pylsJI/AAAAAAAABXU/Kc0iDXXXD20/s1600/tiles5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-tWONPctbUV4/UOXh0pylsJI/AAAAAAAABXU/Kc0iDXXXD20/s1600/tiles5.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This is what the tiling authorities call a "complete set", meaning it has all the possible tiles. It contains every combination of every combination of colors. This is how you would compute the number of tiles in a complete set:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-FLWmOE1MqW8/UOXxJSBS6GI/AAAAAAAABZM/GrzqnRHMfgA/s1600/tiles11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-FLWmOE1MqW8/UOXxJSBS6GI/AAAAAAAABZM/GrzqnRHMfgA/s1600/tiles11.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Where N is the number of horizontal borders and M is the number of vertical ones. Hence 2 horizontal and 2 vertical make a set of 16 tiles. Now these numbers explode quickly. For 3 colors in each direction you now have 81 tiles. For 4 colors it would be 256 tiles. Four colors do not provide too much variation along the edges, still the number of tiles is huge. If you had to store this info in video memory it would be a problem.&lt;br /&gt;
&lt;br /&gt;
Thankfully the math guys proved you do not need a complete set to achieve full&amp;nbsp;tiling. A much more smaller set exists which can be created in the following way: For each combination of North and West colors, you need at least two tiles. Now the tile count becomes:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-17lHcQNMWpw/UOXz5SO3_CI/AAAAAAAABZs/2xVvmybhtQg/s1600/tiles12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-17lHcQNMWpw/UOXz5SO3_CI/AAAAAAAABZs/2xVvmybhtQg/s1600/tiles12.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
This is a lot more&amp;nbsp;manageable. Two borders on each direction requires eight tiles. Four borders, 32.&lt;br /&gt;
&lt;br /&gt;
Once you have your tile set, you can use it in different ways. When time comes to place them, there are a few simple rules to follow. You start from the top-left corner, North-West. At this point you can place any tile from the set, picking one at random will do.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-eFb8EgeU6JQ/UOXqVB6xRRI/AAAAAAAABX0/xmISM8yq0LQ/s1600/tiles6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-eFb8EgeU6JQ/UOXqVB6xRRI/AAAAAAAABX0/xmISM8yq0LQ/s1600/tiles6.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The next tile you place must match the existing one. You can still pick a random tile, but its West side must match the East side of the previous tile. You can continue to do so for the first row:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-suxU4-cbimA/UOXrJ1w8PBI/AAAAAAAABX8/5pALcTbw20Q/s1600/tiles7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-suxU4-cbimA/UOXrJ1w8PBI/AAAAAAAABX8/5pALcTbw20Q/s1600/tiles7.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
When starting the second row, you will have to match the South border of the tile on top, in this case you can pick any tile in the set that has a green North.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-6XEmaaQdKoo/UOXr0BJoysI/AAAAAAAABYc/3gTF5lNw_VM/s1600/tiles8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-6XEmaaQdKoo/UOXr0BJoysI/AAAAAAAABYc/3gTF5lNw_VM/s1600/tiles8.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
And then for the rest of the row, you will find tiles that match both the North and West color requirements:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-9E-zxVfj2_o/UOXsZSsHwfI/AAAAAAAABYk/5i3rKBKqSAg/s1600/tiles9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-9E-zxVfj2_o/UOXsZSsHwfI/AAAAAAAABYk/5i3rKBKqSAg/s1600/tiles9.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
At this point you are ready to go on tiling forever:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-2e9HBeqlGAs/UOXtFXOSWyI/AAAAAAAABYs/8yQglXXZ-Og/s1600/tiles10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-2e9HBeqlGAs/UOXtFXOSWyI/AAAAAAAABYs/8yQglXXZ-Og/s1600/tiles10.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
While all this seems great and&amp;nbsp;guaranteed&amp;nbsp;to make you interesting at parties, the difficulties with Wang tiling are not in picking edge colors and using the sets. The real challenge is to come up with content for the tiles. In my case I had to resort to genetic algorithms running many instances over a LAN.&lt;br /&gt;
&lt;br /&gt;
I will cover this in my next post.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/RE9WTVSweOA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/5867293528781666021/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2013/01/introduction-to-wang-tiles.html#comment-form" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/5867293528781666021?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/5867293528781666021?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/RE9WTVSweOA/introduction-to-wang-tiles.html" title="Introduction to Wang Tiles" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-7aCfTrb6AAM/UOWagYn4F0I/AAAAAAAABUU/7312scoej-g/s72-c/tiles1.png" height="72" width="72" /><thr:total>13</thr:total><feedburner:origLink>http://procworld.blogspot.com/2013/01/introduction-to-wang-tiles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUMR389fCp7ImA9WhNWFE8.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-8530307147015011004</id><published>2012-12-13T13:44:00.001-05:00</published><updated>2012-12-13T13:44:46.164-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-13T13:44:46.164-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Interview" /><category scheme="http://www.blogger.com/atom/ns#" term="Golem" /><title>Golem Interview</title><content type="html">I was interviewed recently by the Golem magazine. They were researching for an article on procedural generation. The article is in German.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.golem.de/news/prozedurale-schoepfung-kuenstliche-welten-auf-knopfdruck-1212-96323.html"&gt;&amp;nbsp;http://www.golem.de/news/prozedurale-schoepfung-kuenstliche-welten-auf-knopfdruck-1212-96323.html&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Only 7% of ProcWorld readers come from Germany. For the English readers I though it would be nice to post the original round of questions I got from Golem, along with the answers:&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;What are you working on at the moment? What are you most proud of in that regard?&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&amp;nbsp;

&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Right now I am working on real-time architecture. Buildings are generated as you approach them. It is challenging for many reasons. First you need ways to teach the system how to generate interesting buildings. Then you need to make it happen really fast. It is the worst combination possible: a hard problem that needs to be solved in very little time.
&lt;br /&gt;
&lt;br /&gt;
I am proud of the potential. It is not obvious right now, but as the hardware continues to grow this platform could produce incredibly rich environments.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What does procedural generation mean for artists? How will it transform their job - and how will they have to adapt to benefit?
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Robots are coming for our jobs everywhere, even journalism is being automated (you could be a robot for all that I know). The key question is how creative your job really is. If you perform unimaginative tasks, even as a "creator", odds are you will be replaced by some technology. Artists are no exception. How to adapt? Be more human, less robotic :)
 &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What makes procedural generation important for the future? What will it enable? 
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
It helps looking at the past first. I see three ages in procedural generation. The first coming was when storage and delivery was very limited, so there was an advantage in generating stuff on-the-fly. This is when games like Elite first appeared. We were very forgiving as an audience back then. You could throw a few points on screen and call it a galaxy.
&lt;br /&gt;
&lt;br /&gt;
Then hardware grew to a point where more realistic representations could be stored and rendered. At this point it became possible to pack quality artwork into a product. This gave us the second age, where most content was hand made. We are still in that era. Consumer grade hardware, like current console generation, is not able to produce content that is rich enough to challenge human-created content. There is some proceduralism there and there, but it is relegated to the background.
&lt;br /&gt;
&lt;br /&gt;
If Moore's law continues to hold, we will enter a third stage. Hardware is growing at a faster pace than artist output. The industry needs to keep moving the new hardware, but it is becoming prohibitively expensive to do it in the traditional model. Automation is the only choice.
&lt;br /&gt;
&lt;br /&gt;
What will be the future? You can think of a variation of the Turing's test: A human plays a game without ever realizing most of it was created by a computer.
 &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;In what way could it make gaming better? Or worse? ;-)
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
I think it will produce a lot of horrible games. Look at what the auto-tune has done for music. But then it will produce some unique experiences. 
&lt;br /&gt;
&lt;br /&gt;
I also think we should not worry about that. Imagine a house is burning and the people inside are wondering whether it is sunny outside. It does not matter because they have to come out anyway. Automation is inevitable in the games industry, otherwise the whole industry will stagnate and burn like the house. Whether it will be worse or better, makes no difference.
 &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What are the worst problems - from a programming and an artistic standpoint? 
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Let's say you were building a game the traditional way. You would have one guy doing the story, some guys do concept art, some other guys do the actual environments, level design, others will create and place props and so on. In theory all of these tasks can be automated. 
&lt;br /&gt;
&lt;br /&gt;
The reality is some of these tasks are a lot simpler. For instance the guy modeling rocks can be easily replaced, but what about the one doing the concept art or the storyline? 
&lt;br /&gt;
&lt;br /&gt;
There are some tough problems there. They are on the fringe of AI and we have no solutions for them today. But then once you look at what we can do with automated translation, self-driving cars, and so on, we may not be far from that. There is also the advent of "the cloud" as a computing device. I think that changes everything.
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;What do you think has been the most important progress to procedural generation during the last years? An what can we expect from the future? And how important are hardware and 3D engines for the further advance of procedural content?
&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
The hardware has evolved to a point where some cool things are now possible. We have known about them for many years. It was just too slow to try them.
 &lt;br /&gt;
&lt;br /&gt;
There has been a lot of research in synthetic reality, for a long time now. The real bottleneck has been and continues to be the hardware. Look at the movie Avatar for example. It is a procedural world what you have there, still it costed millions to generate. This has to come to the point where an equally rich world could be generated by your home console or computer, or by cloud services you can afford.&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/OzdvDkwHnmc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/8530307147015011004/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2012/12/golem-interview.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/8530307147015011004?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/8530307147015011004?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/OzdvDkwHnmc/golem-interview.html" title="Golem Interview" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><thr:total>11</thr:total><feedburner:origLink>http://procworld.blogspot.com/2012/12/golem-interview.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8ARH8_fCp7ImA9WhNXFUU.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-3681503811943602421</id><published>2012-12-03T20:34:00.000-05:00</published><updated>2012-12-03T20:34:05.144-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-03T20:34:05.144-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Procedural Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="Caves" /><title>Videos of Caves and Buildings</title><content type="html">Here is a series of videos I captured over the weekend.&lt;br /&gt;
&lt;br /&gt;
The first one shows a bit of the architecture, also how a couple of useful underground passages can save you time while travelling:&lt;br /&gt;
&lt;br /&gt;

&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/M-_Y5hZ4ltE?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/M-_Y5hZ4ltE?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;

&lt;br /&gt;
&lt;br /&gt;
The second is a trip I did to get close to a tower I saw. It seemed simple at the beginning, but the terrain had some severe accidents so I had to figure out my way. I found some caves that helped me get there, also saw I needed to do a quick bridge over a chasm. It runs at double the speed so you would not get bored by all the wandering. Also note that at the end of the video I carve some holes into the tower walls.&lt;br /&gt;
&lt;br /&gt;

&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/SygK1wqrdCY?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/SygK1wqrdCY?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;

&lt;br /&gt;
&lt;br /&gt;
The next video also runs at double the speed. It shares the same beginning as the first video posted here, but goes a lot farther.&lt;br /&gt;
&lt;br /&gt;
&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/g4Adaezs-Co?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/g4Adaezs-Co?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;

&lt;br /&gt;
&lt;br /&gt;
And the last video shows how the caves can sometimes go really deep underground. You often see cave openings into the surface, but also they could be right under your feet and you would not know. I cheated in this video by showing the wireframe, otherwise it would have taken an awful lot of time to find these caves.&lt;br /&gt;&lt;br /&gt;

&lt;object style="height: 500px; width: 281px;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/VSnsDBw3xso?version=3&amp;feature=player_profilepage"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowScriptAccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/VSnsDBw3xso?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="500" height="281"&gt;&lt;/object&gt;
&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/_-pIZ6JCY48" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/3681503811943602421/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2012/12/videos-of-caves-and-buildings.html#comment-form" title="25 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3681503811943602421?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/3681503811943602421?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/_-pIZ6JCY48/videos-of-caves-and-buildings.html" title="Videos of Caves and Buildings" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><thr:total>25</thr:total><feedburner:origLink>http://procworld.blogspot.com/2012/12/videos-of-caves-and-buildings.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAFQH8-eip7ImA9WhNXFU8.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-8604857017616648345</id><published>2012-12-03T02:45:00.000-05:00</published><updated>2012-12-03T02:45:11.152-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-12-03T02:45:11.152-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VoxelFarm Realtime" /><category scheme="http://www.blogger.com/atom/ns#" term="Procedural Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="L-System" /><category scheme="http://www.blogger.com/atom/ns#" term="Grammar" /><title>Architecture On-The-Fly</title><content type="html">Boy this was a tough one. I always knew it was coming, tried to&amp;nbsp;postpone&amp;nbsp;it for as long as I could.&lt;br /&gt;
&lt;br /&gt;
In the past I had succeeded creating complex buildings out of L-Systems. While it was fast, it was for a different approach to world generation. It was for static game worlds like Skyrim's. I had the luxury of time.&lt;br /&gt;
&lt;br /&gt;
In a world that generates as the viewer moves, most of the time I had for generation was already taken by the terrain and trees.&lt;br /&gt;
&lt;br /&gt;
Architecture is something you cannot just instance. You want buildings to be different, even if they belong to the same class. I needed the actual grammar programs to run in real time, its polygonal output &amp;nbsp;voxelized and then merged with the rest of the voxel data.&lt;br /&gt;
&lt;br /&gt;
You may think going from polygons to voxels then back to polygons is an awful waste of time. It had been, except for the fact I needed changes made Minecraft-style to also work over buildings. When you are wielding that&amp;nbsp;pickaxe you don't really care if that rock in front is a natural formation or a cathedral wall.&lt;br /&gt;
&lt;br /&gt;
At the end I did manage to make it work. As usual most of the solution went into creating indices to accelerate the actual work.&lt;br /&gt;
&lt;br /&gt;
I had to make compromises. For starters, the voxel resolution in the realtime engine is much coarser than what I had for the pre-computed worlds. This meant a lot of the detail in buildings had to go. This also applied to the following levels of detail. Detail had to be removed in all levels.&lt;br /&gt;
&lt;br /&gt;
I also saw I needed simpler grammars just so the system could keep up in lower-end hardware. I found it &amp;nbsp;common to have thousands of different buildings in a single scene. The solution I found was to pass the LOD parameter to the building grammar at evaluation time. It made it possible, but now the building programmer has to worry about creating different views for the same building.&lt;br /&gt;
&lt;br /&gt;
I am still very happy with the results of something I feared almost impossible. There is room for improvement, and this is a good thing. The hard part is over.&lt;br /&gt;
&lt;br /&gt;
I leave you with some screenshots of a single tower grammar that appears scattered everywhere. Please do not mind the lack of actual cities, or the fact it is the same tower over and over again. This is rather a test for the system. I will be posting some videos later.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-cc8IQSGhPMI/ULxXWIWBvSI/AAAAAAAABTI/Zw3Hb5_b2Hs/s1600/arch2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://2.bp.blogspot.com/-cc8IQSGhPMI/ULxXWIWBvSI/AAAAAAAABTI/Zw3Hb5_b2Hs/s400/arch2.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-tUy-0Rd2-RU/ULxXXYpL1WI/AAAAAAAABTQ/D11S0o6hk68/s1600/arch3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://2.bp.blogspot.com/-tUy-0Rd2-RU/ULxXXYpL1WI/AAAAAAAABTQ/D11S0o6hk68/s400/arch3.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-A8eNSUKfpKY/ULxXYcaz5EI/AAAAAAAABTY/aKeS7wYgJHA/s1600/arch4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://1.bp.blogspot.com/-A8eNSUKfpKY/ULxXYcaz5EI/AAAAAAAABTY/aKeS7wYgJHA/s400/arch4.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-bhA9bA9i7-g/ULxXZdRSjxI/AAAAAAAABTg/NfnmQFOyw_8/s1600/arch5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://3.bp.blogspot.com/-bhA9bA9i7-g/ULxXZdRSjxI/AAAAAAAABTg/NfnmQFOyw_8/s400/arch5.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/qwy1wP13ifw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/8604857017616648345/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2012/12/architecture-on-fly.html#comment-form" title="34 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/8604857017616648345?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/8604857017616648345?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/qwy1wP13ifw/architecture-on-fly.html" title="Architecture On-The-Fly" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-cc8IQSGhPMI/ULxXWIWBvSI/AAAAAAAABTI/Zw3Hb5_b2Hs/s72-c/arch2.jpg" height="72" width="72" /><thr:total>34</thr:total><feedburner:origLink>http://procworld.blogspot.com/2012/12/architecture-on-fly.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8HSXYyfSp7ImA9WhNQEko.&quot;"><id>tag:blogger.com,1999:blog-3779956188045272690.post-2203478102941249013</id><published>2012-11-18T16:23:00.001-05:00</published><updated>2012-11-18T16:23:58.895-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-11-18T16:23:58.895-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Recursion" /><category scheme="http://www.blogger.com/atom/ns#" term="Seminar" /><category scheme="http://www.blogger.com/atom/ns#" term="Demoscene" /><category scheme="http://www.blogger.com/atom/ns#" term="Presentation" /><category scheme="http://www.blogger.com/atom/ns#" term="Demoparty" /><title>Come see me at Recursion</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-Yh1hk1qI6RQ/UKlQkNiSP3I/AAAAAAAABSk/iRzG2mldWUc/s1600/rec-header_sqr_transp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="93" src="http://1.bp.blogspot.com/-Yh1hk1qI6RQ/UKlQkNiSP3I/AAAAAAAABSk/iRzG2mldWUc/s400/rec-header_sqr_transp.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
There is a reboot of the demoscene going on in Montreal. A large event is planned for this weekend (Nov 23, 24 and 25) at Concordia University.&lt;br /&gt;
&lt;br /&gt;
Here is the schedule:&amp;nbsp;&lt;a href="http://recursionparty.org/horraire/?lang=en"&gt;http://recursionparty.org/horraire/?lang=en&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
If you look closely, you'll see I will be doing a seminar&lt;b&gt; Saturday 24, at 3:00 PM&lt;/b&gt;.&amp;nbsp;As usual I will talk about procedural things. I will also show the realtime demo from the last videos and screenshots.&lt;img src="http://feeds.feedburner.com/~r/ProceduralWorld/~4/exEH2yAGyuA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://procworld.blogspot.com/feeds/2203478102941249013/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://procworld.blogspot.com/2012/11/come-see-me-at-recursion.html#comment-form" title="18 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/2203478102941249013?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3779956188045272690/posts/default/2203478102941249013?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/ProceduralWorld/~3/exEH2yAGyuA/come-see-me-at-recursion.html" title="Come see me at Recursion" /><author><name>Miguel Cepero</name><uri>http://www.blogger.com/profile/17586513342346629237</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_kvCpVC7wn5s/TOF6wVhBeLI/AAAAAAAAAd4/RE9MmaWoCG4/S220/raro1.png" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Yh1hk1qI6RQ/UKlQkNiSP3I/AAAAAAAABSk/iRzG2mldWUc/s72-c/rec-header_sqr_transp.png" height="72" width="72" /><thr:total>18</thr:total><feedburner:origLink>http://procworld.blogspot.com/2012/11/come-see-me-at-recursion.html</feedburner:origLink></entry></feed>
