tag:blogger.com,1999:blog-1287100453284435062024-03-06T01:03:24.199-08:00duangleLeonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comBlogger53125tag:blogger.com,1999:blog-128710045328443506.post-42486139796949270082016-12-19T20:36:00.000-08:002018-05-08T06:56:54.736-07:00Going NOWHERE, Status Update December 2016Development went quietly this year, so quiet in fact that it might have appeared to some that the project had died:<br /><br /><blockquote class="tr_bq">
<span style="font-family: inherit;"><i>"I founded this 2 years ago and every once in a while i check the forum or I see a 'discount' in humble bundle. Just admit it: this project is dead. :-("</i></span></blockquote>
<br />I wrote a longer reply to this <a href="http://nowherians.com/discussion/281/2-years-later-no-progress">forum post</a>, which we thought might be of general interest to many of you, who are probably asking yourself the same thing:<blockquote>
I'm sorry you're seeing so little output from us as of late, but I can assure you that the project is far from dead. We have received additional funding that has permitted us to fully concentrate on our work and extend its scope (permitting for at least another 12 months of development), instead of doing more PR.<br /><br />Do not give up on us! I understand that it is frustrating to not see much from the outside, but I've spent and am still spending a lot of time to nail down the technical side, and that part is not pretty, if not even outright depressing at times. No one wants a new alpha version more than me, but the necessary work is not done yet. You can absolutely call our development "troubled", it's not going as elegantly as other projects, it's almost embarrassing, but we're a 100% committed to it, and we'll get to great results in the end. This is not just a throwaway game, it's also an infrastructure that I want to see blossom and bear fruits when it's sufficiently progressed.<br /><br />We have a new kind of world / rendering engine that can render thousands of CSG operations of implicit primitives in realtime, allowing for crazy geometric animations and procedural world editing. The rendering engine is running on a new kind of Scheme-like programming language that permits live compilation of generated programs (massively speeding up procedural generation of geometry, textures and music), and on top of that a - not yet rewritten - visual programming IDE that allows us to design AI behavior and procedural generators for geometry and music live - that is, while the game is running.<br /><br />With more manpower and better funding, perhaps all this would be done sooner. But I'd also lose control of my ideas, and then we'd just look like everything else that's out right now, and I'd still have to try to make the game of my dreams.<br /><br />As always, I'm occasionally updating my <a href="https://gist.github.com/paniq/f7abb94e0bd683c9072b">Devlog</a> with what's going on. I hope I can soon work my way out of development hell, and get back to visible, and most importantly, playable results.<br /><br />I probably can't make your worries go away, but you deserve to know at least what's going on.</blockquote>
<div>
That said, rather than bumping up the release date by another year, we're going to delay the release of NOWHERE indefinitely -- that is, the release date will be changed to TBA (when it's done). That's not very informative, and also not what we originally promised, but at least it's more accurate.</div>
<div>
<br /></div>
<div>
New alpha releases will arrive much sooner. In fact that is my primary goal. I'm aiming for a new release in the first week of March 2017. We originally promised alpha versions every two weeks, and I was able to keep that commitment for a time, but as goals grew and development became more convoluted, I couldn't think of a way to publish my development progress in playable form, aaand - two years went by. :-/</div>
<div>
<br /></div>
<div>
Thus we had to bite the bullet and reach a compromise on what to put in the alphas as long as the main game loop has not matured. The March 2017 alpha will come in the form of a basic "creative mode" using the new engine, with a built-in modding IDE to toy around with, and a written introduction that explains how to play in creative mode and how to use the IDE.</div>
<div>
<br /></div>
<div>
From that point on we will be able to do regular (ideally biweekly) updates to creative mode until the main mode has reached a sufficient number of mechanics permitting to play it from start to end, then both modes will be playable side by side.</div>
<div>
<br /></div>
Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-4064014318819645902016-03-15T02:38:00.002-07:002018-05-08T06:56:50.661-07:00NOWHERE Progress Report March 2016
Leonard wrote on the <a href="https://steamcommunity.com/sharedfiles/filedetails/?id=219516796">NOWHERE Steam Greenlight page</a> about our current progress:
<br></br>
<blockquote><i>Hi, Leonard here. I'm sorry for the delays towards releasing the next alpha. I've been spending the past year in R&D hell developing technology that helps us getting the game to become as dynamic as we're envisioning it to be, and moving it sufficiently far away from anything that people can buy currently. That means even some of the basics are still missing, but our commitment to development is unbroken. I'm working nearly every waking minute on the game.
If you are interested in the technical details, have a look at my frequently updated <a href="https://gist.github.com/paniq/f7abb94e0bd683c9072b">Devlog</a>, or my twitter at @paniq. We also have an IRC channel where you can talk to us directly; <a href="https://webchat.freenode.net/?channels=duangle">irc.freenode.org</a>, #duangle.</i></blockquote>
<br></br>
<center><font size="2">New Shadertoy: Light Propagation Volume <a href="https://www.shadertoy.com/view/XdtSRn ">https://www.shadertoy.com/view/XdtSRn </a> </center></font>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-t7_hhi8jfgRKVYZ8gLLLqRukQxPVhd9m7P3oYBa77EjnxzkLhwKhygwaqlF45O4ja_d9C0dqOXwDOd24g7i5efMigSGT4osHK2AV44lq-HUc9EjuT1-2iacuZuKtAOtm-arPXQa4hhA/s1600/Cc_UrGJW8AADqxQ.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-t7_hhi8jfgRKVYZ8gLLLqRukQxPVhd9m7P3oYBa77EjnxzkLhwKhygwaqlF45O4ja_d9C0dqOXwDOd24g7i5efMigSGT4osHK2AV44lq-HUc9EjuT1-2iacuZuKtAOtm-arPXQa4hhA/s640/Cc_UrGJW8AADqxQ.jpg" /></a></div>Sylvia Ritterhttp://www.blogger.com/profile/16412487140122220567noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-62811245261109753242015-09-16T17:52:00.000-07:002018-05-08T06:56:59.259-07:00NOWHERE Development Log, Financials and The Future™<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-xKvUcNaluVGC5b9fDVv2H-ueHpg_UqBIESN162Xb5uGxxfpzKQmxLFyaCU_PfWnGSnQ07R37YB2mAHfnWovRieJXsr9gNHzUxaH8wcwJERkAidFYXMcqO5I8-kzOvxJ09aJm9yzP9Ss/s1600/Screenshot+from+2015-07-10+09%253A01%253A43.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-xKvUcNaluVGC5b9fDVv2H-ueHpg_UqBIESN162Xb5uGxxfpzKQmxLFyaCU_PfWnGSnQ07R37YB2mAHfnWovRieJXsr9gNHzUxaH8wcwJERkAidFYXMcqO5I8-kzOvxJ09aJm9yzP9Ss/s640/Screenshot+from+2015-07-10+09%253A01%253A43.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Screenshot of recent prototype work for Nowhere. Article on that coming soon.</td></tr>
</tbody></table>
Three months ago I started a <a href="https://gist.github.com/paniq/f7abb94e0bd683c9072b">development log for NOWHERE</a> and its associated tooling in a github gist. It wasn't really supposed to be read by anyone but other developers, and was more meant as a self motivation exercise, but the convenience of updating gists resulted in this blog not getting updates for five months while the devlog saw a new entry nearly every week.<br />
<br />
If you are interested in the shall we say microscopic aspects of development, <a href="https://gist.github.com/paniq/f7abb94e0bd683c9072b">check it out</a>.<br />
<br />
I should also mention that we launched a separate project for the programming language developed alongside our game <a href="http://www.duangle.com/nowhere">Nowhere</a>, aptly titled <a href="http://nonelang.org/">None</a>. The release got some attention on <a href="https://news.ycombinator.com/item?id=9910960">Hacker News</a> and <a href="https://www.reddit.com/r/programming/comments/3dtkcl/the_best_programming_language_is_none/">Reddit</a>. None will allow us and mods to visually design and compile procedural generators for art and sound to machine language and shaders on player's machines, while the game is running. <a href="https://bitbucket.org/duangle/liminal/overview">Liminal</a> is the complementary project, a game engine built on None. While Liminal is not ready for use, None has matured enough for experimentation. If you would like to support the development of these two pieces of technology, please consider becoming a <a href="https://www.patreon.com/duangle">Patreon</a>. Patreon money directly pays for our rent, food and coffee.<br />
<br />
In the entry for today, I also made some remarks about our current financial situation and the future of the project.<br />
<br />
<blockquote class="tr_bq">
Now on to financial matters.
It appears we are running out of money again. The long waiting time for new content has eroded the number of new founders, and one of our long time patreons had to reduce his monthly support because he's also in a financial pickle right now. We also used to borrow a small complementary amount of money from my mum each month and are about to reach the cap next month, so we will also run out of that funding pot by end of October. Sylvia is still waiting on payment from one of her commissions (this was before Sylvia began to require advances), but it is very likely they screwed us and we're not going to see a cent. There are currently no new commisions in sight for her, but of course that can change any day.<br />
<br />
That means we have to think about how to get fresh funds before September runs out. I've considered starting a Patreon for None/game engine development exclusively, so we are at least getting support for that part of the work (which is not what Nowhere players are necessarily interested in, although they damn well should ;-)), but Patreon only allows one page per account, and managing that one account is already hard work for Sylvia, so we'll have to merge the tool development part with the page and make it about more things than one. We'll have to think about how to best present this.<br />
<br />
We also need something new to show so we can justify doing a new video and invite everyone to check out the new alpha. Sylvia has done lots of new concept art that could go into a new video, we can finally exchange that old dreadful logo, and replace "Psychedelic RPG" with a much more fitting "Alien Life Simulator". The fundraising video is nearly 2 years old. Back then we gave away the end game without mentioning many of the intermediate steps, and I believe people would be more inclined to trust us if there were a more detailed plan of action, and we would be more clearly on our game being developed as a service, not as a one trick pony.<br />
<br />
It also becomes clear that we will not be able to deliver on our full promise by the end of 2015, but I want to do a release anyway with what we get to work by that date. We don't want anyone to feel disappointed or exploited. The plan is to ship what's there, then continue on a "sequel" (which is really just a new major version) and keep our founders on board until they get what they paid for. <br />
<br />
I can not believe how fresh our concept for Nowhere still is. The pitch has been out for several years and no one has stolen it from us, and I guess that's because it really <i>is</i> that ambitious and forward thinking. We have ideas for art, sound and gameplay design as well as programming, modding and player service which are quite different from how most game development is done today, and I would love to see all our goals realized in exactly the way we envision them.<br />
<br />
I don't mind if it takes ten years to get there, but we need to compromise on the progress on the way and reintroduce regular releases of alphas, betas and "masters" to keep the company operational without incurring additional debt.<br />
<br />
I wanted to hold off new alphas until we had a game model we could definitely stick to, but I see now that I have to get over my perfectionism and, as the mantra goes, release early, release often.</blockquote>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8KyDEVm3C6I45vPRweW4pg7akzwkes9Il-oj3lcYQNhRLlMgjdRzfc4TqcXuUHE6u3gnLPDj3efWEyxV2qmxMaYQx_N-DLMfgdDHPWUt1yS9C9JWxamWxJDR9WahKBFoEGVF3bjcn5F0/s1600/download.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="309" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj8KyDEVm3C6I45vPRweW4pg7akzwkes9Il-oj3lcYQNhRLlMgjdRzfc4TqcXuUHE6u3gnLPDj3efWEyxV2qmxMaYQx_N-DLMfgdDHPWUt1yS9C9JWxamWxJDR9WahKBFoEGVF3bjcn5F0/s640/download.jpg" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Oh man, look at this logo. So good.</td></tr>
</tbody></table>
<br />
<div>
</div>
Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-78406809109063681012015-04-23T03:27:00.002-07:002018-05-16T02:30:13.186-07:00Towards Realtime Deformable Worlds: Why Tetrahedra Rule, Voxels DroolIn this article I provide a chronicle of our turbulent terrain development, what lessons I've learned and what's next. Also, why tetrahedra (probably) rule and voxels (mostly) drool.<br />
<br />
It was nearly one and a half year ago that we showcased an early tech alpha of <a href="http://www.duangle.com/nowhere">NOWHERE</a> that had organically growing and sculptable terrain.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/LKEN8fdo174/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/LKEN8fdo174?feature=player_embedded" width="320"></iframe></div>
I had put high hopes in this approach, but found that, while triangle meshes allowed fine control over geometric features, they were difficult to simulate efficiently in a way that would keep the surface <a href="http://en.wikipedia.org/wiki/Manifold">2-manifold</a>.<br />
<br />
The last alpha version that we released took a few minutes of CPU time to grow a single coral like structure. The program takes several snapshots from the same mesh at different stages and exposes them as separately rotating triangle meshes.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/LKEN8fdo174" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></div>
Knowing that I wanted to generate worlds far larger than that, running out of ideas in what ways initial geometry could be seeded, and hitting upon other shortcomings of triangle meshes, I embarked on a long and perilous journey to explore the rabbit hole of alternate geometric representations.<br />
<br />
But first, let us visit the ultimate (and retconned) list of requirements that I made for NOWHERE's terrain:<br />
<br />
<ul>
<li>360° degrees of freedom, modelling of <a href="http://en.wikipedia.org/wiki/Minor_planet">minor planets</a> in zero G</li>
<li>Ideally a single integrated solution for animated actors as well as terrain</li>
<li>Can be seeded from any implicit function (not necessarily just distance fields)</li>
<li>Support for smooth surfaces but also sharp features (e.g. a cylinder would have both)</li>
<li>Can model rocky terrain with many cavities</li>
<li>Able to model anisotropic structures like sticks and membranes</li>
<li>Can model contiguous, "never-ending" surfaces, but also separated, distinct structures like floating rocks</li>
<li>Can host cellular automata for non-scripted procedural growth of plants-like organisms and crystals</li>
<li>Can selectively host rigid and soft body physics simulations, and run classic bone animation</li>
<li>Can host a simulator for flowing substances like water, lava, plasma or goo</li>
<li>Persistently diggable, fillable, sculptable by players</li>
<li>Support for different sediments: as you dig in, you hit upon different layers of material</li>
<li>Supports classical mesh operations like extrusion, subdivision as well as boolean operators (better known as <a href="http://en.wikipedia.org/wiki/Constructive_solid_geometry">CSG</a> modelling)</li>
<li>Supports seamless ornamental and player-authorable texturing, similar to <a href="http://en.wikipedia.org/wiki/Wang_tile">Wang Tiles</a>; Classical <a href="http://www.martinpalko.com/triplanar-mapping/">triplanar mapping</a> is not enough.</li>
<li>Support for realtime ambient occlusion / radiosity</li>
<li>Scale independent, non-uniform distribution of detail</li>
<li>Support for seamless distance-dependent level of detail</li>
</ul>
<blockquote class="twitter-tweet" data-conversation="none" lang="en">
<a href="https://twitter.com/paniq">@paniq</a> oh just the holy grail. That's uh. Yeah. Um. Humph.<br />
— David Goldfarb (@locust9) <a href="https://twitter.com/locust9/status/586468539986534401">April 10, 2015</a></blockquote>
<br />
<div>
Over the course of this project, whose beginnings started several years ago (back then, what the gameplay would ultimately be was completely unclear), I tried more than a handful of solutions. The first one was the most obvious choice:</div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/Lcmwtqoh1ak/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/Lcmwtqoh1ak?feature=player_embedded" width="320"></iframe></div>
You can clearly see what influenced it. But I wanted more freedom of expression. The next approach glued prefabricated models together, similar to how <a href="http://store.steampowered.com/app/346010/">Besiege</a> works:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/1FszskWOcRY/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/1FszskWOcRY?feature=player_embedded" width="320"></iframe></div>
While that covers scaffolding nicely, it's neither particularly organic nor terrain oriented, in fact it scaled rather badly, and would only allow for rather puny scenes.<br />
<br />
Then I tried mixing scaffolding and raymarching distance fields to produce a huge, if only somewhat monotonic terrain that was unfortunately completely unalterable and ate too much GPU time to make it a comfortable solution for low end computers (We want to make people with weaker hardware happy too):<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/dNm0l1L8O1A/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/dNm0l1L8O1A?feature=player_embedded" width="320"></iframe></div>
I had some luck with <a href="http://en.wikipedia.org/wiki/Wang_tile">Wang Tiles</a> earlier, so I thought a 3D version of that might be interesting to try:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/S3Bm3LWpuKs/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/S3Bm3LWpuKs?feature=player_embedded" width="320"></iframe></div>
This ended up being more of a one trick pony. At the time I entertained the thought that terrains could not be altered, but I could not make peace with it. On the way to figuring out how to make geometry user-editable, I experimented with procedural terrain growth by extrusions, the first triangle mesh based solution:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/9p0hpwwWcPc/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/9p0hpwwWcPc?feature=player_embedded" width="320"></iframe></div>
The pesky problem with extruding triangle meshes is that it is impossible to tell when surfaces intersect, which turns the mesh into garbage; Furthermore, joining intersecting meshes is everything but trivial. I started to look into scientific papers for solutions and was made aware of Stéphane Ginier's formidable <a href="http://stephaneginier.com/sculptgl/">SculptGL</a>, which does Z-Brush/Sculptris-like sculpting with support for punching holes into the topology, a rarely supported technique. I wanted the same thing for our game, and that's where my first full-on foray into triangle mesh editing started (see first video).<br />
<br />
So in the past year I looked into voxel based solutions again, particularly <a href="https://upvoid.com/devblog/2013/05/terrain-engine-part-1-dual-contouring/">Dual Contouring</a>, and I got some rather spectacular results out of it, in terms of being able to feed it with distance field functions, doing CSG on it, running light simulation, which is why I thought this would be the ultimate solution we'd end up with. The first <a href="http://en.wikipedia.org/wiki/Octree">octree-based</a> solution ran on the old Python engine, and despite large parts being written in C, seeding even small volumes took a few seconds too long, and editing wasn't realtime enough. Here are some screenshots from that time. Sigh.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZFLCJnniS0duTi6Sm7PFaYJH9VW_9Pu75Rcso5NkkBX-9jaH8hyphenhyphenGZQ_IivPBgp8H2EGgRS74gBcb1b5YR6K1uTZm7DxVsMuFtYkI0NXL2vA845SdbaV17M1vrK9uhAAVE0xSvlS_aOhg/s1600/screenshot_2014-06-08_12-24_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZFLCJnniS0duTi6Sm7PFaYJH9VW_9Pu75Rcso5NkkBX-9jaH8hyphenhyphenGZQ_IivPBgp8H2EGgRS74gBcb1b5YR6K1uTZm7DxVsMuFtYkI0NXL2vA845SdbaV17M1vrK9uhAAVE0xSvlS_aOhg/s1600/screenshot_2014-06-08_12-24_0001.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnrEZCq-sYpGf2-vdtkwFaQggFze3rB0CZlxrLlyytA5HhxdVCSraexELwfzNmspcIAJeaM3SXP3m-g9T5JJOLuCJMq3SkZ7U-37_obN4Kz5vvmk-BL7lIWzP2Mw_r2usojbQE3oL5c6g/s1600/screenshot_2014-06-04_19-24_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnrEZCq-sYpGf2-vdtkwFaQggFze3rB0CZlxrLlyytA5HhxdVCSraexELwfzNmspcIAJeaM3SXP3m-g9T5JJOLuCJMq3SkZ7U-37_obN4Kz5vvmk-BL7lIWzP2Mw_r2usojbQE3oL5c6g/s1600/screenshot_2014-06-04_19-24_0001.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEQpppjzNaXbsoi6HhOTfwehIUgVjpa-5N26go7zrO1sN5aZws4h4gwXbN9-09wv-8kMLBJkMNaVeB4TR2TZ_EamfoEGmqdOF1app2lXPnJRRB0MpPt7iw079h8-zGD5X2qrP2fI-qDrU/s1600/screenshot_2014-05-29_04-24_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEQpppjzNaXbsoi6HhOTfwehIUgVjpa-5N26go7zrO1sN5aZws4h4gwXbN9-09wv-8kMLBJkMNaVeB4TR2TZ_EamfoEGmqdOF1app2lXPnJRRB0MpPt7iw079h8-zGD5X2qrP2fI-qDrU/s1600/screenshot_2014-05-29_04-24_0001.png" width="320" /></a></div>
After a rewrite of our engine and experimenting with <a href="http://blog.duangle.com/2015/01/conspire-programming-environment-for.html">new editing paradigms</a> in January this year, I had an insight for how to do, well, <i><a href="https://twitter.com/paniq/status/556672265107304448">something</a></i> with tetrahedral meshes, but it didn't quite click yet.<br />
<br />
Instead, I got sidetracked into tetrahedra-based dual contouring and wrote a fast GPU-based implementation that used a grid instead of an octree, and experimented with <a href="http://en.wikipedia.org/wiki/Cubic_crystal_system#Cubic_space_groups">alternate honeycombs for meshing</a>. Things were great for a while. Descend your gaze upon this smooth animation of an implicit function:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/p1inuxmzcVc/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/p1inuxmzcVc?feature=player_embedded" width="320"></iframe></div>
I managed to integrate a realtime light propagation solution that ran on the same grid:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/MNj-HpG51Ww/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/MNj-HpG51Ww?feature=player_embedded" width="320"></iframe></div>
I made strides. I wrote a realtime meshing solution that meshes voxel data on the fly, completely alterable (although that's not visible in the video yet), realtime lit, at the cost of a heavily reduced draw range:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/UaE0uL0VWgA/0.jpg" frameborder="0" height="266" src="https://www.youtube-nocookie.com/embed/UaE0uL0VWgA?feature=player_embedded" width="320"></iframe></div>
<br />
Alas, geometry representation on regular grids sucks for the same reason as shape
representation in bitmaps, the 2D analog case, and I've ultimately decided to completely give up on a voxel based solution.<br />
<br />
Why? Behold, the long shitlist of
voxel-based data structures. If you're considering to write something with voxels, beware of the perils:<br />
<br />
<ul>
<li>You have no semantic structure, unable to easily discern area, orientation,
islands sharing attributes, proximity, related features over areas larger than
the immediate 1-cell neighborhood, which always spans the minimally possible
distance; Octrees can help caching some of this information, but they're not
nearly as accurate as a graph-based representation.</li>
<li>Storage increases at the power of 3 (^2 in 2D). Every time your side lengths double,
storage increases by a factor of 8. That means 1 GB of VRAM stores only a 1024^3
voxel cube at 1 byte per voxel; typically, when dual contouring and different
materials are involved, a voxel costs at least 16 bytes, so a ~406^3 voxel cube is
more realistic.</li>
<li>Rendering must be done in triangles, which requires a "mixdown" of the data, as the
two structures do not store data in the same way. You keep the same information
twice in memory. Also, you can not know the number of generated triangles in advance,
neither can you update single triangles well (storage penalty), which makes compact
allocations more difficult.</li>
<li>While detail is not taxed (in fact, it's prepaid ;-), it is capped at the nyquist
frequency of <side length>;<side length=""> you can not have features smaller than that. </side></li>
<li>On the other hand, large areas without topological features still store values at
the full sample rate, which, for reasons explained, is a tremendous waste of space. </li>
<li>Scaling / shearing / rotating grid data is lossy. Transformed voxels don't always
fit back into individual cells due to the nyquist cap. Even a dual contouring grid
can't guarantee that edges and vertices are always preserved. That means you're forced
to keep moving objects separate from the world. </li>
<li>Sparse octrees can help with culling rendundant spaces, but their expanse is isotropic;
the volume of a pencil still requires breaking down resolution to the maximum hierarchy,
despite less surface detail along the length of the pencil. </li>
<li>Hierarchical access in an octree is limited to 10 levels with 32-bit addressing.
That means if you want to address a space with a resolution higher than 1024^3,
you will need 64-bit morton codes, which incurs a storage and compute penalty. </li>
<li>All octrees are bounded. Exceeding the bounds means at best patching and at worst
rebuilding the tree. Likewise, all grids are bounded. Resizing the grid can't be done
with a simple memcpy. Also, all operations that could exceed the resolution must
be checked. </li>
<li>Neighborhood queries in octrees are a mess. Going up the hierarchy is manageable,
going down requires extra data; explicit edges are not present. In short: due to
hierarchical storage, octree cells are not really neighbors. </li>
<li>Because of this, local transformations in an octree cause deep changes all over the
hierarchy. </li>
<li>Raycasting requires visiting each cell with a Bresenham-like algorithm; Octrees can
help here, but can't help in the pencil case, when the ray is grazing the surface. </li>
<li>Buckets can alleviate some Octree issues, but not ultimately fix them, and incur an
added storage penalty. </li>
<li>Mesh LOD techniques are inapplicable; LOD only works for dealing with situations
where voxels become smaller than a pixel. Dual Contouring seems like it could apply,
but it has no good LOD scheme, and nyquist is also forced to jump by a whole factor 2,
regardless of topological detail. </li>
<li>There is no popular voxel data format or voxel data editor; Most work that artists
do these days is stored in meshes and textures, and it's impossible to import them
without damaging the model's representation, let alone export them for backwards
compatibility. The semantic information is destroyed. </li>
</ul>
<div>
So I went to look into Tetrahedral meshes, also called "Finite Element Meshes", the solution I'm currently implementing. The idea is pretty straightforward: They work exactly like triangle meshes, except that the triangles are expanded by one dimension to form a volumetric mesh of tetrahedra, which tessellates space completely into solids and air. Tetrahedral meshes are largely undiscovered by the game development community (with two <a href="http://graphics.berkeley.edu/papers/Parker-RTD-2009-08/Parker-RTD-2009-08.pdf">notable</a> <a href="http://twvideo01.ubm-us.net/o1/vault/gdc2012/slides/Programming%20Track/Cupisz_Robert_Light_Probe_Interpolation.pdf">exceptions</a>), but an old hat for companies doing structural analysis simulations (think hard core <a href="http://en.wikipedia.org/wiki/Bridge_Builder">Bridge Builder</a>) and interactive tissue surgery simulators.</div>
<div>
<br /></div>
<div>
Here's why I think that NOWHERE will fare much better using a tetrahedral mesh for its terrain, in comparison with the bullet list above:</div>
<br />
<ul>
<li>A mesh is a graph and therefore nothing but semantic structure. Area, orientation,
neighboring islands sharing attributes, proximity are easily discernible from the
provided vertice-edge-face-cell structure. The immediate 1-cell neighborhood
spans large volumes of space when topological detail is low, and small volumes
where topological detail is high.</li>
<li>Storage increase is independent of space spanned, but depends only on topological
complexity, so it's a little difficult to tell how much complexity this buys you.
Assuming no vertices are shared, and only float positions are stored, 1 GB of
VRAM covers about 29 million triangles, or 22 million tets. If those tets were
stored at equal distance, they would compact to a ~281^3 voxel cube; but could span
a distance only bounded by desired float precision.</li>
<li>Rendering must be done in triangles, which is easily achieved either by pruning
the mesh for surface bounding faces only, or maintaining boundary faces in a
separate array during mesh operations.</li>
<li>Topological detail is taxed, but independent of scale; Size of features is only
bounded by floating point precision.</li>
<li>A large area without any variance in data can occupy as few tets as possible,
providing an effective compression for regions with low entropy.</li>
<li>Scaling / shearing / rotating vertices is, apart from float precision issues,
lossless. C1 continuous deformations do not alter topology. Transformations that do
always cause at least one tet to invert, which can be detected and fixed with
local remeshing. This only alters face and edge relationships, but not vertex
positions.</li>
<li>All classical mesh animation techniques, like bone animation, still work here.
Additionally, 3D cellular automata also operate on tetmeshes. Physics simulations
of softbodies or fracturing volumes on tetmeshes are well documented.</li>
<li>Meshes can use highly anisotropic scales. The pencil example would perform quite
well here, tessellating space with the lowest amount of elements required. Along
the length of the pencil, no extra elements need to be added.</li>
<li>Access in a tetmesh is not explicitly hierarchical, but graph based. Each tet
is a node with four neighbors (using a half-face structure), and most spatial
queries are done by walking along tetfaces. The tetmesh acts as both volume data
and accelleration structure. For everything else, non-exclusive ad-hoc BVH's
can be constructed.</li>
<li>A Mesh is only bounded by its cells. If you need more space, add as many cells
as required. This can be done locally and directed. It is also possible to maintain
the mesh within the volume of a cube with near infinite side length.</li>
<li>Local transformations in a tetmesh are indeed only local to the hull of their
connected neighborhood.</li>
<li>Raycasting is a simple <a href="http://people.cs.kuleuven.be/~ares.lagae/publications/LD08ARTCT/LD08ARTCT.pdf">neighborhood walk algorithm</a>. In the pencil case, when the
ray grazes the surface along its length, a few steps suffice to cover an enormous
distance.</li>
<li>Mesh LOD techniques apply. Techniques exist to adaptively decimate meshes by
storing edge collapse operations in a hierarchy (a so-called Half-Edge Tree).</li>
<li>Triangle mesh editing is the de-facto standard for models in games.
Many formats and assets exist. Any 2-manifold triangle mesh can be tessellated into
a tetmesh, and pruned back into a triangle mesh without any loss of information,
so triangle mesh imports and exports can be easily supported.</li>
</ul>
<div>
This is the very last solution I'm trying, and the one we'll most likely stick with, which means that the gameplay of the next alpha will be close to Alpha 75 again, and then some.</div>
<div>
<br /></div>
<div>
The only regret I have is that I didn't know all this three years ago. It took a long time to look at approaches and figure out what the game needs. We could have settled for something way earlier had I been more willing to make compromises. But at least this way I can say we picked the best solution for our problem, and the game is truly becoming the kind of game we want to play.</div>
<div>
<br /></div>
<div>
Regarding tetrahedral meshes and related techniques, I'm keeping a lengthy list of relevant papers that may be of interest to anyone else interested in the subject <a href="https://gist.github.com/paniq/8bdec20d00d08810f081">here</a>.</div>
<div>
<br /></div>
Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-13315450493162997122015-01-06T12:06:00.004-08:002018-05-08T06:59:07.223-07:00Conspire: A Programming Environment for NOWHERE<i>It's time for another <a href="http://www.duangle.com/nowhere">NOWHERE</a> tech write-up. I've been tweeting about my work on Twitter up to the point where I was nudged to write a longer blog post about what the hell I'm actually doing, so this is an attempt at doing just this. A chronological description of my trials and tribulations and where I finally ended up.</i><br />
<br />
The importance of tooling can not be overstated. There are no tools out there for the kind of deeply procedural game we're working on, and good tooling comprises 90% of what makes the game, as nearly all of our content is procedural in one way or another, and not handmade. If there's currently a lack of procedural content out there, it's precisely because of the lack of tooling.
<br />
<br />
So I set out to construct an IDE in which assembling procedures in a maintainable way became easier. Inspired by UE4's Blueprints, I began with graph based editing as a guide, as graphs make it relatively easy to describe procedural flow. As a warm-up, I wrote <a href="https://bitbucket.org/duangle/oui-blendish">two tiny C libraries</a>: a theming library based on Blender's UI style, and a low level semi-immediate UI library that covers the task of layouting and processing widget trees.<br />
<br />
The IDE, dubbed <i>Noodles</i>, was written on top of the fabled 500k big <a href="http://luajit.org/">LuaJIT</a>. The result looked like this:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX4ONSuYAALpJXPolZ0ncs1ilzXasj7MjNbr451tit14lFMI6vdBIKbeeval64xYWENRYr96RsKheM8X9f3sG2s9sSvgUAoFjJaEYmLORtrtLnee06uBmBBgg8lyjNhR8vB0xO1yJP30U/s1600/wurst.gif" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX4ONSuYAALpJXPolZ0ncs1ilzXasj7MjNbr451tit14lFMI6vdBIKbeeval64xYWENRYr96RsKheM8X9f3sG2s9sSvgUAoFjJaEYmLORtrtLnee06uBmBBgg8lyjNhR8vB0xO1yJP30U/s1600/wurst.gif"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Demonstrating compaction of node selections into subnodes, ad absurdum ;-)</td></tr>
</tbody></table>
A back-end compiler would translate these graph nodes back to Lua code to keep execution reasonably efficient, and I added support for GLSL code generation, something I've been planning to do from the beginning. I found that the ability to cover different targets (dynamic programming, static CPU, GPU pipelines) with a single interface paradigm became somewhat of a priority.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifvsl1F-VW3c0DhZsNv3Soupd7IDpFwzBU5Dvh5LUJPdEcRyj83rA_Y5rSLLEAsUhyphenhyphenIR9WZW55e4SdcLSJ83sVKZWPUi14AApzYsn3mzYcfqw585w9NQqmKWV9xUhcbZcVvnciJHJQsXE/s1600/glsl.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifvsl1F-VW3c0DhZsNv3Soupd7IDpFwzBU5Dvh5LUJPdEcRyj83rA_Y5rSLLEAsUhyphenhyphenIR9WZW55e4SdcLSJ83sVKZWPUi14AApzYsn3mzYcfqw585w9NQqmKWV9xUhcbZcVvnciJHJQsXE/s1600/glsl.png" height="315" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A simple GLSL shader in nodes, with output visible in the background.</td></tr>
</tbody></table>
The workflow was pretty neat for high level processing, but working with the mouse wasn't fast enough to construct low level code from scratch - refactoring was way easier though.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7rjYfUBAE-Ma4h3YMLoq8xX4Aww0B8Bo1VXRqHTpKAIYEjOdsPxmkVG-K-1MBnz8WEi_QNbaNYUVd8kEReTrBKtmbMF5yaSskyQdGIaVbffA8jWzN72-qGjzk4W-4lk2aZNGjvvZ6b5c/s1600/gl_cube.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7rjYfUBAE-Ma4h3YMLoq8xX4Aww0B8Bo1VXRqHTpKAIYEjOdsPxmkVG-K-1MBnz8WEi_QNbaNYUVd8kEReTrBKtmbMF5yaSskyQdGIaVbffA8jWzN72-qGjzk4W-4lk2aZNGjvvZ6b5c/s1600/gl_cube.png" height="352" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Noodles, shortly before I simplified the concept. Live-editing the OpenGL code for a cube rotating in the background.</td></tr>
</tbody></table>
I still didn't have much of an idea what the semantics of programming with nodes were going to be. I felt that the system should be able to analyze and modify itself, but a few design issues cropped up. The existing data model was already three times more complex than it needed to be. The file format was kept in text form to make diffing possible, the clipboard also dealt with nodes in text form, but the structure was too bloated to make manual editing feasible. The fundament was too big, and it had to become lighter before I felt ready to work on more advanced features.<br />
<br />
At this point, I didn't know much about building languages and compilers. I researched what kind of existing programming languages were structurally compatible with noodles, and data flow programming in general. They should be completely data flow oriented, therefore of a functional nature. The AST must be simple enough to make runtime analysis and generation of code possible. The system must work without a graphical representation, and be ubiquitous enough to retarget it for many different domain specific graphs.<br />
<br />
It turned out the answer had been there all along. Since 1958, to be exact.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/rdj6deraQ6k" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></div>
Or 1984, if we start with <a href="http://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs">SICP</a>. Apparently everyone but me has been in CS courses, and knows this book and the fabled eval-apply duality. I never got in contact with Lisp or Scheme early on, something that I would consider my biggest mistake in my professional career. There are two XKCD comics that are relevant to my discovery here:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://xkcd.com/224/"><img border="0" src="https://imgs.xkcd.com/comics/lisp.jpg" height="190" width="640"></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://xkcd.com/297/"><img border="0" src="https://imgs.xkcd.com/comics/lisp_cycles.png" height="210" width="640"></a></div>
Did you know the first application of Lisp was AI programming? A language that consists almost exclusively out of procedures instead of data structures. I had the intuitive feeling that I had found exactly the right level of abstraction for the kind of problems we are and will be dealing with in our game.<br />
<br />
My first step was changing the computational model to a simple tree-based processing of nodes. Here's the flow graph for a fold/reduce function:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYP5OGzx5haDM3qeRDAoejbQ8SnI_6JJ2OzHnWjj2hPzbAuC0mcTx5hKUF6ShCtizck28rJpD7j8JBwh5lJiZqTMKEpMnBJeLGHs-cOgT5TOmXivtLFqPxwBu0kWFv5m5vbZqwu5-ko5k/s1600/fold_reduce.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYP5OGzx5haDM3qeRDAoejbQ8SnI_6JJ2OzHnWjj2hPzbAuC0mcTx5hKUF6ShCtizck28rJpD7j8JBwh5lJiZqTMKEpMnBJeLGHs-cOgT5TOmXivtLFqPxwBu0kWFv5m5vbZqwu5-ko5k/s1600/fold_reduce.png" height="113" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Disassemble a list, route out processing to another function, then reassemble the list</td></tr>
</tbody></table>
I figured out a way to do first-order functions in a graph, and did a little demonstrative graphic about it.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ9Sxlu1Jr-x4Dg4X5NoEBNAPP94id5_v41cGs7KYFlulaC2_DQY27XmHNLXUexhOxkhIrJFM4m6BgjK7HAGMGuSRIfScYqkm_CUoFtRlJYMIsqlyEtcnJ2vz0sK2aXJ132p7TC8YDgzY/s1600/first_order_functions.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQ9Sxlu1Jr-x4Dg4X5NoEBNAPP94id5_v41cGs7KYFlulaC2_DQY27XmHNLXUexhOxkhIrJFM4m6BgjK7HAGMGuSRIfScYqkm_CUoFtRlJYMIsqlyEtcnJ2vz0sK2aXJ132p7TC8YDgzY/s1600/first_order_functions.png" height="200" width="105"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Click for a bigger picture</td></tr>
</tbody></table>
While these representations are informative to look at, they're neither particulary dense nor easy to construct, even with an auto-complete context box at your disposal. You're also required to manually layout the tree as you build it; while relaxing, this necessity is not particularly productive.<br />
<br />
It became clear that the graph could be compacted where relationships were trivial (that is: tree-like), in the way <a href="http://www.pawfal.org/dave/index.cgi?Projects/Scheme%20Bricks">Scheme Bricks</a> does it:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://c2.staticflickr.com/4/3047/3048459246_c5d5ae9ede.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="263" src="https://c2.staticflickr.com/4/3047/3048459246_c5d5ae9ede.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Not beautiful, but an interesting way to compact the tree</td></tr>
</tbody></table>
And then it hit me: what if the editor was built from the grounds up with Lispy principles: the simplest graphically based visualization possible, extensible from within the editor, so that the editor would factually become an <b>editor-editor</b>, an idea I've been pursuing in library projects like <a href="https://bitbucket.org/paniq/datenwerk/wiki/Home">Datenwerk</a> and <a href="https://bitbucket.org/duangle/soil">Soil</a>. Work on Noodles ended and Noodles was salvaged for parts to put into the next editor, named <i>Conspire</i>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSLUThz9Qv5YwitLi0l9voTXysCPsmKwnmkyHI88B-1ADrU8LLfUIKu0IlmetbFTlNkJJN2BQ9Y7FRKT2LGW658-XS29mXlxnYiAOsWd4-Qwg8-H0x3JOJD5Nbpl9KkiHPFqqjUjgakiw/s1600/Screenshot+from+2014-11-24+19:17:47.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSLUThz9Qv5YwitLi0l9voTXysCPsmKwnmkyHI88B-1ADrU8LLfUIKu0IlmetbFTlNkJJN2BQ9Y7FRKT2LGW658-XS29mXlxnYiAOsWd4-Qwg8-H0x3JOJD5Nbpl9KkiHPFqqjUjgakiw/s1600/Screenshot+from+2014-11-24+19:17:47.png" height="273" width="400"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A very early screenshot. Atoms are rendered as widgets, lists are turned into layout containers with varying orientation. </td></tr>
</tbody></table>
At its heart, Conspire is a minimal single-document editor for a simplified <a href="http://en.wikipedia.org/wiki/S-expression">S-expression</a> tree that only knows four <a href="http://en.wikipedia.org/wiki/Immutable_object">immutable</a> data types: lists (implemented as Lua tables), symbols (mapped to Lua strings) , strings (a Lua string with a prefix to distinguish it from symbols) and numbers (mapped to the native Lua datatype).<br />
<br />
By default, Conspire maps editing to a typical text editing workflow with an undo/redo stack and all the familiar shortcuts, but the data only exists as text when saved to disk. The <i>model</i> is an AST tree; the <i>view</i> is one of a text editor.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSGMPQNEqN5RDG7sqD5NoDupFPTRcC1gRjShBHibU_24lYmcGcATN1EglZ1AoKxg028J8ogCIWkNR5ZGALl0-QzgH5maQEouvETgaTRVpgzEqeUn8HufbREXTzJRRRg1bnbeATvLDlNQQ/s1600/formatting.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSGMPQNEqN5RDG7sqD5NoDupFPTRcC1gRjShBHibU_24lYmcGcATN1EglZ1AoKxg028J8ogCIWkNR5ZGALl0-QzgH5maQEouvETgaTRVpgzEqeUn8HufbREXTzJRRRg1bnbeATvLDlNQQ/s1600/formatting.png" height="291" width="400"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Rainbow parentheses make editing and reading nested structures easier.</td></tr>
</tbody></table>
Conspire can be extended to recognize certain expressions in the same way <span style="font-family: Courier New, Courier, monospace;">(define-syntax)</span> works in Scheme, and style these expressions to display different controls or data:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEv96HVTpVDMOOUUMi6cTIPlOQhs7V8DyERSXyjb8LsKslPQ3HU1-oApil_KkKhbVFwIjxd6Bk03HK2yRg2QHZfL6iJt5cbohSseCMuo2DbcWa0O5jBgSM03DieDehtpTt0TyGI4-vkA0/s1600/Screenshot+from+2015-01-06+20:27:17.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEv96HVTpVDMOOUUMi6cTIPlOQhs7V8DyERSXyjb8LsKslPQ3HU1-oApil_KkKhbVFwIjxd6Bk03HK2yRg2QHZfL6iJt5cbohSseCMuo2DbcWa0O5jBgSM03DieDehtpTt0TyGI4-vkA0/s1600/Screenshot+from+2015-01-06+20:27:17.png"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A numerical expression is rendered as a dragable slider that alters the wrapped number.</td></tr>
</tbody></table>
In the example above, the expression <span style="font-family: Courier New, Courier, monospace;">(ui-slider (:step 100 :range (0 1000) <value>)</span> is rendered as a slider widget that, when dragged with the mouse, alters the <value> slot in the AST tree the view represents. The operations are committed to the undo buffer the same way any other editing operation would.<br />
<br />
Using this principle, the editor can be gradually expanded with more editing features. One of the first things that I added was the ability to nest editors within each other. The editor's root document then acts as the first and fundamental view, bootstrapping all other contexts into place:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLJCm0v1oc-Hylq6PCCYBx4OUTLaWVJwC_sa3Bp75tRVeRyakPQuinQTgVxh-XCet0mXDeNUFNqKC0JinRIcIhe3GUjrNewjhoYXtAxFp230Zo_ni9xMLYi0BApxFOkBYhD0NkOhnV5HM/s1600/csp_edit.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLJCm0v1oc-Hylq6PCCYBx4OUTLaWVJwC_sa3Bp75tRVeRyakPQuinQTgVxh-XCet0mXDeNUFNqKC0JinRIcIhe3GUjrNewjhoYXtAxFp230Zo_ni9xMLYi0BApxFOkBYhD0NkOhnV5HM/s1600/csp_edit.png"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The root document with unstyled markup. csp-edit declares a new nested editor.</td></tr>
</tbody></table>
Hitting the F2 key, which toggles styling, we immediately get the interpreted version of the markup document above. The referenced documents are loaded into the sub-editors, with their own undo stack:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4LYLess_PUAvikF7Ao8uXaURO7-wVQ94akt7bOqdK3VQUmNTg-DXBclq9J1EdV515YRsMETAwT3c22JXgCC18NGmf2NyJnys7x1vFr7j1PkXzxnKiT3CvBN2E6ecZiEyvce3zf-w5SO4/s1600/csp_edit2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj4LYLess_PUAvikF7Ao8uXaURO7-wVQ94akt7bOqdK3VQUmNTg-DXBclq9J1EdV515YRsMETAwT3c22JXgCC18NGmf2NyJnys7x1vFr7j1PkXzxnKiT3CvBN2E6ecZiEyvce3zf-w5SO4/s1600/csp_edit2.png"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tab and Shift+Tab switch between documents.</td></tr>
</tbody></table>
New views and controllers such as a Noodles-like graph editor could be implemented as additional AST transformers, allowing the user to shape the editor into whatever it needs to be for the tasks at hand, which in our case will be game programming.<br />
<br />
The idea here is that language and editor become a harmoniously inter-operating unit. I'm comparing Conspire to a headless web browser where HTML, CSS, Javascript have all been replaced with their S-Expression-based equivalents, so all syntax trees are compatible to each other.<br />
<br />
I've recently integrated the <a href="http://terralang.org/">Terra</a> low-level extensions for Lua and am now working on a way to seamlessly mix interpreted code with LLVM compiled instructions so the graphics pipeline can completely run through Conspire, be scripted even while it is running and yet keep a C-like performance level. Without the wonders of Scheme, all these ideas would have been unthinkable for the timeframe we're covering.<br />
<br />
Oh, and there's of course one more advantage of writing your editor from scratch: it runs in a virtual reality environment out of the box.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgomOC9jmCz7PZg2TxBDAXOCBsHwBpJIgOSneitWB-LrLvsDSTQqFhpKFIrS5mVixwgYAL7wtPhw-SMH9Z2aaIi7d5_LD1stxm2LJKHgEUc5GKKI8F9t8TM7V6rJothvateKJSlsvXDpnk/s1600/ovr_editing.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgomOC9jmCz7PZg2TxBDAXOCBsHwBpJIgOSneitWB-LrLvsDSTQqFhpKFIrS5mVixwgYAL7wtPhw-SMH9Z2aaIi7d5_LD1stxm2LJKHgEUc5GKKI8F9t8TM7V6rJothvateKJSlsvXDpnk/s1600/ovr_editing.png" height="360" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Conspire running on a virtual hemispheric screen on the Oculus Rift DK2</td></tr>
</tbody></table>
<br />
<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-52859969590921778372014-11-23T03:02:00.001-08:002018-05-08T06:56:05.442-07:00NOWHERE Progress Report November 2014<br />
<br />
Leonard <a href="http://nowherians.com/discussion/comment/254/#Comment_254">wrote in the Nowherian forum</a> about our current progress with NOWHERE:<br />
<br />
<blockquote class="tr_bq">
<i>Right now is, hands down, the worst part of development. There are no fancy graphics to show off, no intricate gameplay, no surprising AI, no badass music, just unglamorous system design that interests no one so we can get all the aforementioned stuff in a manageable form that doesn't keep becoming a sluggish and unserviceable mess. </i></blockquote>
<a href="http://nowherians.com/discussion/comment/254/#Comment_254"></a>Sylvia Ritterhttp://www.blogger.com/profile/16412487140122220567noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-78571402802134803512014-07-20T15:42:00.004-07:002018-05-08T06:56:01.274-07:00NOWHERE Progress Report: It's Going Great & Terrible At The Same Time<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNeXj1cjpI0in195amfs-ZBNg5QK-OXt1CKRuNJOxAj5VQm1zBOTN08d3zD0kqwdpApUJ98lU_iGrSFDKIUc8EHbjRHqdoq1hxVb4Aq8loUSLF2vVlQrSXKw_e8QH9ewoQ_Ey2mNp0sHA/s1600/screenshot_2014-06-14_16-50_0001.png" imageanchor="1"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNeXj1cjpI0in195amfs-ZBNg5QK-OXt1CKRuNJOxAj5VQm1zBOTN08d3zD0kqwdpApUJ98lU_iGrSFDKIUc8EHbjRHqdoq1hxVb4Aq8loUSLF2vVlQrSXKw_e8QH9ewoQ_Ey2mNp0sHA/s1600/screenshot_2014-06-14_16-50_0001.png" height="360" width="640"></a></div>
<br />
This post is partly an explanation of what's currently going on, partly an attempt to summarize the situation for ourselves.<br />
<br />
First, the bad news.<br />
<br />
With the final release of <a href="http://www.duangle.com/nowhere">NOWHERE</a> scheduled for the end of 2015, we're currently about 30% into development, and tech wise, it's going great. As you know our goal is to be 99% asset free, that is: all assets are generated on the players computer, for the players world, and the player will also have a chance to guide this process in the game. I've finished prototyping and embedding the meshing & landscaping tech, wrote a new procedural audio engine, and got the procedural model generator to productive speeds, on which I'll write more at a later date.<br />
<br />
We solved some tough design issues concerning Nowherian world structure, body physique and society building, although it still all exists only in thoughts and paper, and none of that is implemented yet; Among improving our procedural authoring tools, I'm currently in the process of laying the foundation for world persistence, which is a demanding challenge. You can track my progress online at our <a href="http://bitbucket.org/duangle">open source repositories</a>. I can't wait to finally work more on the actual content.<br />
<br />
I'm sorry, I messed up, that were the good news! So, now the bad news:<br />
<br />
We have not only been greenlit on Steam (so could theoretically release NOWHERE as Early Access game any day), but have also been accepted to talk about NOWHERE at the <a href="http://www.gdceurope.com/">GDC Europe</a> Innovative Games Showcase in August (out of what I imagine to be hundreds of applicants).<br />
<br />
Wait, that's actually good news <i>again</i>. Here's the bad news. For real now.<br />
<br />
In light of the rising complaints about Early Access games being released <i>too </i>early, we wanted the next alpha release to make a good impression, and so we overran our deadlines numerous times to get to a point where the game would be presentable enough for an Early Access crowd. (And we do need that crowd. The founding campaign on our own website isn't nearly attracting as many supporters as we need to cover funding for the complete development time.)<br />
<br />
The result is that we're broke, phenomenally so. The Humble Store revenues for this month wouldn't cover our expenses sufficiently; Sylvia's dad borrowed us €1k to cover for this month but the situation is repeating. This month we're only getting $250 in revenues, but we need about $2k to cover rent, utility, food, etc.<br />
<br />
The original planning was that a Steam release this month would give us sufficient revenues in writing (Both Humble and Steam pay out revenue with one month delay, e.g. this month we've made about $360, which are only due for payout for the end of August), so we could borrow a little more knowing that we'd be able to pay it back soon enough, and that the risk would be minimal. Alas, I can't seem to find an end for this alpha just yet, at least not one that would attract enough new interest. We gambled too hard.<br />
<br />
I admit, we're really bad at advertising for ourselves. Talk is cheap and people want to see results, which is why I dug deep into what I love to do (writing sweet sweet game tech), and avoided doing anything that would not further development directly, such as video promotion, more interviews, and so on. This was probably <i>not</i> a good strategy. Now we need to find a way to fix this.<br />
<br />
I would like to repeat that we are not ever going to give up. We're agile enough to deal with setbacks, and we own 100% of our project. This game is going to get made, whatever it takes. This is the work of a lifetime, and there is no other project we'd rather work on.<br />
<br />
If you would like to help us out financially, and you feel you can afford to spare a small contribution on a monthly basis, please have a look at our <a href="http://www.patreon.com/duangle">Patreon page</a>. Patreon contributions reach us sooner than any other revenue source.<br />
<br />
Our <a href="http://www.duangle.com/nowhere">fundraiser</a> is of course also still running.<br />
<br />
We would also again thank all our founders and supporters for your trust and contributions, you're making this project possible, and you deserve to see an excellent outcome.<br />
<br />
<b>Update</b>: my amazing mom read our blog article and, since my birthday is coming up, spontaneously decided to send us a little "birthday present" (and offered emergency loans in case this happens again), so August is saved. You all have moved heaven and earth in the past days to get us back on track too, and it worked! September appears almost covered now as well. You all are incredible and we are lucky to have such strong support! I'm back on working on the next release, and we'll be able to do one or two more alphas for founders before the Steam Early Access release. We're aiming for early August. Let's hope the trip goes a bit smoother from here on.<br />
<br />
<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-69822786420147105882014-05-08T16:39:00.003-07:002018-05-08T06:55:55.756-07:00Voxel Mesh Hybrids: A Walkthrough<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1xnOo5F-SPMo_cPatYF8k5VVNwyNmuL61ox7MQvC8hTJC3a7vxdgxMDWNu1-VDfwIwE0jSfFsmhrxL-mRQnNg28HDUpFaFI-kAR2zjjpXwrqoMGCEsvyzrIiOr4ZhxqnkJEcF2GdDRlE/s1600/screenshot_2014-05-07_23-05_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1xnOo5F-SPMo_cPatYF8k5VVNwyNmuL61ox7MQvC8hTJC3a7vxdgxMDWNu1-VDfwIwE0jSfFsmhrxL-mRQnNg28HDUpFaFI-kAR2zjjpXwrqoMGCEsvyzrIiOr4ZhxqnkJEcF2GdDRlE/s1600/screenshot_2014-05-07_23-05_0001.png" height="360" width="640"></a></div>
<i>Six more weeks have passed since I first posted about <a href="http://blog.duangle.com/2014/03/new-tech-unlocked-adaptive-volumetric.html">Adaptive Volumetric Meshes</a>, which have since turned into Voxel Mesh Hybrids after some refinements for the sake of simplicity and ease of use. It's the driving tech behind the procedural and player-authored meshing that our game in production, <a href="http://www.duangle.com/nowhere">NOWHERE</a> (alpha available for download), requires.</i><br />
<i><br /></i>
<i>After the recent refinements, it's time for another short write-up, as the work has reached a stable state and is nearly ripe for release as part of the next Alpha later this month. Beware: from here on it gets technical.</i><br />
<br />
<a name='more'></a>In this article I'm going to walk you through the construction of a complete voxel mesh hybrid structure including level of detail using an analog quadtree structure and an exemplary shape.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRz8COIS5wxc8E4dwOtavDHbSMmcaQUecRV0re_r3k6YYFzi-kn69Fl42Ytte7Afu1JUhFnUQ3SmWNSPWVBlHSNQnn5bB4juGsWbwe9Ay8B_6TKnhDr4oo4uSzJZiK_xrWdY65XBnfLQc/s1600/screenshot_2014-05-08_02-41_0001.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRz8COIS5wxc8E4dwOtavDHbSMmcaQUecRV0re_r3k6YYFzi-kn69Fl42Ytte7Afu1JUhFnUQ3SmWNSPWVBlHSNQnn5bB4juGsWbwe9Ay8B_6TKnhDr4oo4uSzJZiK_xrWdY65XBnfLQc/s1600/screenshot_2014-05-08_02-41_0001.png" height="360" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A voxel mesh hybrid octree with leafs and branches visualized.</td></tr>
</tbody></table>
We're going to source a simple shape for the rasterization / tracing. In 3D, this could be a distance field, a volumetric texture, an existing high resolution mesh, basically any boolean spatial structure.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_GRY1dry02WzKopGH5iiERlM4gBsfT1J98Jd5oUlOzgVYzLEMQggo0cUuFOzEzjg7lJurDs-viEZJGdMf_nBbWK_wTjCg2Zh_r3m5dINjDg4v7fqTJJ1xvK82ftmTk_jMGPSEhojue14/s1600/original_shape.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_GRY1dry02WzKopGH5iiERlM4gBsfT1J98Jd5oUlOzgVYzLEMQggo0cUuFOzEzjg7lJurDs-viEZJGdMf_nBbWK_wTjCg2Zh_r3m5dINjDg4v7fqTJJ1xvK82ftmTk_jMGPSEhojue14/s1600/original_shape.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">An oriented concave shape with a hole that we're going to store in the grid.</td></tr>
</tbody></table>
Now, for every voxel enclosing a part of the volume, we add a new cell to a single quadtree, along with its parent cells, at a preset homogeneous level of detail, in this case level 4, which equals a resolution of 16x16. Depending on the source data, there are two ways to construct the tree: top-down or bottom-up. In this case we're going bottom-up.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_ZnMtqoH-ptyIbf66Lw00TrmVUx1CPZSqiKvDxJSnzFvpgjzn8mIk2RHfzirFzEXG2DmJ-KQ3-8EqJg5WU5hRC1P61iDG5EBaZgbz4ectZDeQ2FdSuTXd7uv1rfSH8e8RLwxHqEd9yyc/s1600/step1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_ZnMtqoH-ptyIbf66Lw00TrmVUx1CPZSqiKvDxJSnzFvpgjzn8mIk2RHfzirFzEXG2DmJ-KQ3-8EqJg5WU5hRC1P61iDG5EBaZgbz4ectZDeQ2FdSuTXd7uv1rfSH8e8RLwxHqEd9yyc/s1600/step1.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The grid resulting from rasterizing the shape. All vertices are at their default locations.</td></tr>
</tbody></table>
The data structure for voxel mesh hybrids is essentially just a 3D grid of cells in a fixed resolution, which can be stored in a sparse octree for memory efficiency (and additional perks, which I'll get to further below).<br />
<br />
Each cell acts both as voxel and point, holding a vertex with coordinates relative to the extents of the cell, so that -1 -1 -1 is the lower left front, 1 1 1 is the upper right back, and 0 0 0 is right in the center of the cell. Note how all vertices here are still at their default locations. This isn't strictly necessary, but helps to understand the implicit connectivity step that comes next.<br />
<br />
Using a simple set of 16 binary marching cube connectivity rules (in 3D, it's 256 different combinations), we now build a dual mesh, connecting 4 adjacent cells at a time. Thanks to the connectivity rules, the mesh is guaranteed to be watertight, non-intersecting and two-manifold.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj112YwHSuAmTwezYf7675D8PfFfGWaYUHYqzWAkIygvcKh4WXi8mU7zCg1jWKkQlkDVa3vKUQxcxAPmxA5F5vIu6bQaQlaF_sT4c0otgeKcDA4ttwQO3MHQwAcFBuVsbcrLHkqMHtTb64/s1600/rules.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj112YwHSuAmTwezYf7675D8PfFfGWaYUHYqzWAkIygvcKh4WXi8mU7zCg1jWKkQlkDVa3vKUQxcxAPmxA5F5vIu6bQaQlaF_sT4c0otgeKcDA4ttwQO3MHQwAcFBuVsbcrLHkqMHtTb64/s1600/rules.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The 16 connectivity rules for 2D grids. Orange spots are marked as inside the mesh.</td></tr>
</tbody></table>
As a set of adjacent vertices always results in the same creation of edges, connectivity is implicit: the resulting mesh can be regenerated as often as needed after changes and does not have to be stored permanently or queried for editing. Edges local to each vertex (in 3D, the 1-ring neighborhood) can be constructed ad-hoc from a cells surrounding Moore neighborhood (2D: 9 cell kernel, 3D: 27 cell kernel), which is useful for doing ray intersection tests, finding the vertex normal, checking if the vertex is degenerate, estimating curvature, vertex smoothing etc.<br />
<br />
Furthermore, the marching cube has been extended with a bitmask marking inside cells, which helps to discern if a vertex is visible, and allows to easily find degenerate vertices. A degenerate vertex is any vertex with a valence < 2 (3D: degenerate if valence < 3 or ring loop hops counted != valence), unless that vertex is marked as inside.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCqvhsG8QF1q9qUAzyENPXWOdNhqyjLrcuU1b8iKia4tIgfosaErCDIKCBnl3aKl9HnmkpcWY3qeOlTHr54r_cW9AMkrT8HZ4IglhmmD8T2aZFLETHfwVVM7K8fI6VJ4br7htTVcyyZAc/s1600/step1_edges.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCqvhsG8QF1q9qUAzyENPXWOdNhqyjLrcuU1b8iKia4tIgfosaErCDIKCBnl3aKl9HnmkpcWY3qeOlTHr54r_cW9AMkrT8HZ4IglhmmD8T2aZFLETHfwVVM7K8fI6VJ4br7htTVcyyZAc/s1600/step1_edges.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The resulting traced mesh</td></tr>
</tbody></table>
As an additional step, it is possible to merge quadtree pairs which are completely inside into their parents, and resolve neighbor queries to the parent cell, but in our case we actually want to persist data in the volume, so we keep the cells around.<br />
<br />
As a next step (which can be done independent of connectivity), we move vertices closer to the surface. In this case, the vertices were hand-edited, but this could also be automated using a distance fields gradient data; if the data source is already a mesh, the vertices would copy representative positions.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjlLIfa9HBwtl3wTKolG6I_yIwv2U-RD0aXhB7jOeynx7iL-q6EErAz98LhUwFyUmMzhNZ5aG76dTjVjf50H31PHV89fi1p5UPwaxzDxjxHhNG68rCR_ry9zauipZhOJ4Zx9b0zb5Q62o/s1600/step2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjlLIfa9HBwtl3wTKolG6I_yIwv2U-RD0aXhB7jOeynx7iL-q6EErAz98LhUwFyUmMzhNZ5aG76dTjVjf50H31PHV89fi1p5UPwaxzDxjxHhNG68rCR_ry9zauipZhOJ4Zx9b0zb5Q62o/s1600/step2.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Vertices on the surface have been moved to the boundary, reconstructing the surface. Note the oversampling at four locations caused by the coarse resolution.</td></tr>
</tbody></table>
If the data source is binary, a smoothing step could be applied, moving each vertex towards the average of its neighbors, which usually gives good results but doesn't preserve hard edges. Also, vertices may end up clamped against the cell boundary after several iterations. Applying some kind of constraint to keep the vertices close to the cell center is advisable.<br />
<br />
Since the parent cells are of the same structure as the leaf nodes, we can mesh the tree at lower levels and get coarser meshes with can be used for level of detail and building collision meshes for physics simulation. Therefore, we now adjust the vertices at level 3 so that their edges resemble boundaries around the vertices of level 4:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUoaerfSvLaCP7wOLjS9QLIb3nKuJfbE0wV5ioqSi-2g0S9hSN9smQ69SG6YyG_vhOawajTn7SYEfRuBBDCARzSKcqnT9ur-hmSnecho6mbT6fXWge-sm_MwpTXfPJY6luCEA8GbOKs-Q/s1600/step3a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUoaerfSvLaCP7wOLjS9QLIb3nKuJfbE0wV5ioqSi-2g0S9hSN9smQ69SG6YyG_vhOawajTn7SYEfRuBBDCARzSKcqnT9ur-hmSnecho6mbT6fXWge-sm_MwpTXfPJY6luCEA8GbOKs-Q/s1600/step3a.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The level 4 cell structure and its implicit mesh</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK3YbRmDQIuP_IwSLdc-0NpKg5ZtmPC4oJgnEe31r1XZ_BQRT633BcT0QLhtE6BSfrqAIx9GNWRCEnTKBlYdDQzwluO_7oAuoGFyPuv4_UxREQXmjFq5jnxH2NrotZGfE1l_eFQcA4YTI/s1600/step3b.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK3YbRmDQIuP_IwSLdc-0NpKg5ZtmPC4oJgnEe31r1XZ_BQRT633BcT0QLhtE6BSfrqAIx9GNWRCEnTKBlYdDQzwluO_7oAuoGFyPuv4_UxREQXmjFq5jnxH2NrotZGfE1l_eFQcA4YTI/s1600/step3b.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Level 3 cells superimposed over level 4, with outer vertices forming an implicit boundary mesh. The coarse resolution causes the concave sections to disappear early.</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZB0ccCUKWha8XXNuC5-R9xFxHmaPyPCSX7Z2HjMM2mK8Y3nLA1UsPpbJJ76rlkTEciK6uiIdg3-60ddYMlGx0tBPo2wjabrMeYbnYhWMQ7mDt3Hz8o0qHzTIhZy0FkM1r6R-WhtgG8Y8/s1600/step3c.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZB0ccCUKWha8XXNuC5-R9xFxHmaPyPCSX7Z2HjMM2mK8Y3nLA1UsPpbJJ76rlkTEciK6uiIdg3-60ddYMlGx0tBPo2wjabrMeYbnYhWMQ7mDt3Hz8o0qHzTIhZy0FkM1r6R-WhtgG8Y8/s1600/step3c.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The resulting implicit mesh of level 3 cells.</td></tr>
</tbody></table>
This process can be repeated up to level 1, building all levels of the mesh:<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYbo1meUQkxXMqYUvIMD8lH-3gx9z0cJNhDympdcRf1bimZkL7f-302Pi3T7U6qR0TfQJyX8Mt14wT_WoTe3LiKG2z1Nrl784GQVD30XCAshhOSDDcrL7U03PMr6Ta20bc6AHupDi9DHs/s1600/step4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYbo1meUQkxXMqYUvIMD8lH-3gx9z0cJNhDympdcRf1bimZkL7f-302Pi3T7U6qR0TfQJyX8Mt14wT_WoTe3LiKG2z1Nrl784GQVD30XCAshhOSDDcrL7U03PMr6Ta20bc6AHupDi9DHs/s1600/step4.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The mesh at level 2.</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSzjLEPlL8gNKNnjHgl-vcmQl0hFOpiLVBPgQZf8taxk3DVSHAYNtjYZ3N136lZI-u0lZYEMiYxmm5Ssf5_EWL-ACqBwE11ZGemj_rIkeHh2dXvuTGMr4l-SjaYD-YL-skSQLaPJcD-_8/s1600/step5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSzjLEPlL8gNKNnjHgl-vcmQl0hFOpiLVBPgQZf8taxk3DVSHAYNtjYZ3N136lZI-u0lZYEMiYxmm5Ssf5_EWL-ACqBwE11ZGemj_rIkeHh2dXvuTGMr4l-SjaYD-YL-skSQLaPJcD-_8/s1600/step5.png" height="320" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The mesh at the lowest level.</td></tr>
</tbody></table>
This concludes the walkthrough for the voxel mesh hybrid creation.<br />
<br />
Voxel meshes can be edited with classical techniques available both to voxel and mesh editing, with differences in any task involving changes in edge connectivity, as with voxel mesh hybrids, connectivity is implicit: new triangles are only created when cells are removed or added. Variety in detail magnitude on a single level is possible up to a certain degree. Edge lengths may range from 0 to 2*sqrt(3)*(cell width).<br />
<br />
Extrusion must be performed on the voxel level, with edge lengths dependent on how close vertices are to cell boundaries.<br />
<br />
Subdivision must be performed uniformly, subdividing all cells to a higher level, testing against the vertex ring to decide where cells need to be created (only add new voxels whose boundaries collide with the lower level mesh volume), then projecting the new vertices to the surface.<br />
<br />
So much for now. More to come.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC-ZVNp1gbKqpOyW1qj1LHZlS9YyrJow6HEZiAmKlRkDLrqyPpRD5I6BTMLGSZT2zPomzT5JWehGfYj2sBANt8i5CNLkx5QHukh8SEuUHPLZP8DgNLzWej6Ov24XjapotrSSrBqWGKjww/s1600/screenshot_2014-05-07_23-07_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiC-ZVNp1gbKqpOyW1qj1LHZlS9YyrJow6HEZiAmKlRkDLrqyPpRD5I6BTMLGSZT2zPomzT5JWehGfYj2sBANt8i5CNLkx5QHukh8SEuUHPLZP8DgNLzWej6Ov24XjapotrSSrBqWGKjww/s1600/screenshot_2014-05-07_23-07_0001.png" height="360" width="640"></a></div>
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-5231306698856724942014-04-04T13:02:00.000-07:002018-05-08T06:55:30.668-07:00NOWHERE - News From The Business EndAside from all the hardcore video game making going on, a bunch of super exciting business related events happened during the last few weeks as well.
Enough reason to post a summary. Hold on to your seats.
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilx9xF5mMnWO4C_Y2s42qxnY12IpaOBHnnonKxHlAdmTGvwPKqikev-Kq9dhacOkRcFiwCzY3Jz19o9yW3zMvTTenv3MNYxsoXqzKps7ajlwGdUPzVJhqNSGuZfe-M0wy8zSQCiaQQTPI/s1600/1960115_661493813910293_1892990722_n.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilx9xF5mMnWO4C_Y2s42qxnY12IpaOBHnnonKxHlAdmTGvwPKqikev-Kq9dhacOkRcFiwCzY3Jz19o9yW3zMvTTenv3MNYxsoXqzKps7ajlwGdUPzVJhqNSGuZfe-M0wy8zSQCiaQQTPI/s320/1960115_661493813910293_1892990722_n.png" height="400" width="366"></a></div>
<b><br /></b>
<b>March 4th</b>: Thanks to everyone involved (which most likely includes you), NOWHERE has been greenlit on Steam. That means our greatest hurdle to a Steam release has been overcome. All existing and future buyers of the game will be able to redeem their Steam keys after launch. NOWHERE is scheduled to launch April 15th 2014<b> (Update: Steam launch and new alpha delayed, new alpha scheduled for June 10th!) </b>in the Early Access category, along with a new alpha build and an accompanying trailer. Until then, you can follow new updates on NOWHERE’s <a href="http://steamcommunity.com/sharedfiles/filedetails/?id=219516796">Steam Greenlight page</a>.
A huge thank you to everyone who voted for us and supported us, you are amazing and the reason we got this far.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbUOxrpx-12JATgol9nPzBZe49_PRe2VoTr1XBDlWahx-T-Tx5wQNSTevBG7u69rpqWzlS0AfXL1qL4S09mvNrAPGO_1yktryZEhpE5ana3_BPDnyu3-pU0jwFfLIvJ4CvOYivx1u5kfw/s1600/forum.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbUOxrpx-12JATgol9nPzBZe49_PRe2VoTr1XBDlWahx-T-Tx5wQNSTevBG7u69rpqWzlS0AfXL1qL4S09mvNrAPGO_1yktryZEhpE5ana3_BPDnyu3-pU0jwFfLIvJ4CvOYivx1u5kfw/s320/forum.png" height="400" width="386"></a></div>
<b><br /></b>
<b>March 17th</b>: All founders registered for access to the Founders Lounge at the <a href="http://nowherians.com/">Nowherian forum</a> can now download all previously released alphas from its Release Archive, thanks to the tireless work of forum administrator Frame.
If you are a founder, you are eligible for the Founders Lounge! To add founder status to your forum account, just send us an email to support-at-duangle-dot-com and mention your forum username and purchase email address.
If you bought the game via Humble Store please send us a screenshot of the purchase or forward the purchase confirmation mail.
I'll process every request as quickly as possible. Thank you for your patience!
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLrkJYMCoumsp-qDICq41sh4BJHkTEC3iy8tWh7NdKgNtX5h9wR41a98TKaeHE5XK-P2cRd3CdMGmnGWNRA5lAgkCz0mde4NYjF8UWLc75sMaJu3AQT7mP6ymPM0iLZcZ_GD1gAFhkmX4/s1600/patreon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLrkJYMCoumsp-qDICq41sh4BJHkTEC3iy8tWh7NdKgNtX5h9wR41a98TKaeHE5XK-P2cRd3CdMGmnGWNRA5lAgkCz0mde4NYjF8UWLc75sMaJu3AQT7mP6ymPM0iLZcZ_GD1gAFhkmX4/s1600/patreon.png" height="373" width="400"></a></div>
<b><br /></b>
<b>March 23th</b>: A few founders asked if it were possible to support the development of NOWHERE on a monthly basis, so we created a <a href="http://www.patreon.com/duangle">Patreon site</a>. You can also pledge smaller amounts monthly to get a copy of Nowhere. Patrons pledging at least $21 will be listed in the Patreon section in the game's credits (ranked by contribution).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju00CwyEdj2u_Ns2LtnLctssdHfKNQZ6ELSy_pQAu_9Tw3x62H_JQS1Zqnpju0vyXj5074qJyg53k3dmpS0v9ZS7b_0xGbyUTc2pRWP9iSAF0337AxgOCUrTal9LX3Cjuh6T6yKSY3RSs/s1600/humblestore.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju00CwyEdj2u_Ns2LtnLctssdHfKNQZ6ELSy_pQAu_9Tw3x62H_JQS1Zqnpju0vyXj5074qJyg53k3dmpS0v9ZS7b_0xGbyUTc2pRWP9iSAF0337AxgOCUrTal9LX3Cjuh6T6yKSY3RSs/s320/humblestore.png" height="51" width="400"></a></div>
<br />
<b>March 24th</b>: Nowhere has been launched on <a href="https://www.humblebundle.com/store/p/nowhere_storefront">the official Humble Store</a>. Please note that due to technical reasons these sales go into another bucket; the full list of reward tiers can only be purchased on our site.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfR9HlnFSecYMNF_7XXLJYuro06DEhyphenhyphenUvPd6iPCaM7z6zqzqG43nHU6OWl26uO_SJlZCeXO6lqSgs1m4yoXT07C8JQlealOCtU2pXO5gnUyVEKJc4kVqy3oypjV9F9U_ZPFGcuDGFffx4/s1600/10010228_674629862596688_2106109438_o.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfR9HlnFSecYMNF_7XXLJYuro06DEhyphenhyphenUvPd6iPCaM7z6zqzqG43nHU6OWl26uO_SJlZCeXO6lqSgs1m4yoXT07C8JQlealOCtU2pXO5gnUyVEKJc4kVqy3oypjV9F9U_ZPFGcuDGFffx4/s1600/10010228_674629862596688_2106109438_o.png" height="251" width="400"></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<b>March 30th</b>: 1.000 founders (currently 1.042) have bought and supported NOWHERE. THAT IS SERIOUSLY TOTALLY NUTS YOU GUYS.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/nUerGW4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://i.imgur.com/nUerGW4.jpg" height="266" width="400"></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<b>March 31th</b>: We visited Rezzed this weekend, listened to great dev talks and met a bunch of great people. Although videogamesing is awesome, It’s good to leave the cave and do something different from time to time. Birmingham was lovely. What in the world beats vintage cheddar? Nothing. Not even our game.<br />
<br />
<b>April 1st</b>: We’re thrilled to report that Duangle got acquired by Mountain Dew for a round $2 billion sum and is renamed to Dewangle. All Nowherian bodies will be branded with appropriate new corporate identity. An exciting synergy only for people who have no idea <a href="http://indiestatik.com/2014/03/31/most-expensive-game-jam/">what’s been going on lately</a>!<br />
<b><br /></b>
<b>April 2nd</b>: <a href="https://twitter.com/deadendthrills">Duncan Harris</a>, curator and creator of the lovely website <a href="http://deadendthrills.com/">Dead End Thrills</a> published a long interview with Leonard and me in his <a href="http://www.rockpapershotgun.com/2014/04/02/alien-nation-going-nowhere-with-duangle/">Rock Paper Shotgun</a> column. <a href="http://www.rockpapershotgun.com/2014/04/02/alien-nation-going-nowhere-with-duangle/">Check it out</a>!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1X4btDcKz9ovGbpI4pNh3sLzAcz_8J3vt3Y6O3HuT0HrDUdhnTjUeA0z42FsIhLl6D8EVruvRKxYW6-ESryMWMm9QTRMpC_LuunxuyWfMXRtxaC5H5bH44HNNiLlLkAnkM7weZfP25Gg/s1600/boston.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1X4btDcKz9ovGbpI4pNh3sLzAcz_8J3vt3Y6O3HuT0HrDUdhnTjUeA0z42FsIhLl6D8EVruvRKxYW6-ESryMWMm9QTRMpC_LuunxuyWfMXRtxaC5H5bH44HNNiLlLkAnkM7weZfP25Gg/s1600/boston.png" height="400" width="336"></a></div>
<br />
<b>April 11th, 2014</b>: The distant future. Nowhere will be playable at PAX, at the “<a href="http://bewildero.us/">Joyful Bewilderment</a>” installation organized by BigSushi.fm starting April 11th between 8 p.m. and 2 a.m. in Boston, MA, USA. We’re not sure yet, but either Alpha 75 or Alpha 91 will be shown.
Sylvia Ritterhttp://www.blogger.com/profile/16412487140122220567noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-68761345322572480672014-03-24T07:35:00.000-07:002018-05-08T06:55:49.952-07:00New Tech Unlocked: Adaptive Volumetric Meshes<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI85sLVOdsCXg_q4Fj1JGCVmE78CRuoVvIkCEtHgEm5ngKQrw48vMa5oZ-GJA7XXDZWnuJXQyqe4vPDB1QOha8_kOIo3IJGdu1zHqYybZw0-D-d_p96f5Fsn-7pw2K30zNTRtBSiMMAKw/s1600/screenshot_2014-03-22_12-08_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiI85sLVOdsCXg_q4Fj1JGCVmE78CRuoVvIkCEtHgEm5ngKQrw48vMa5oZ-GJA7XXDZWnuJXQyqe4vPDB1QOha8_kOIo3IJGdu1zHqYybZw0-D-d_p96f5Fsn-7pw2K30zNTRtBSiMMAKw/s1600/screenshot_2014-03-22_12-08_0001.png" height="360" width="640"></a></div>
<i><br /></i>
<i>This week I reached a major milestone in my implementation of the new general meshing tech for our game in production, <a href="http://www.duangle.com/nowhere">NOWHERE</a> (alpha available for download), which is going to replace the previous implementation we used for sculpting and will do a better job at covering the different procedural modelling approaches the game requires. To commemorate the occasion, I did a little write-up. Beware: from here on it gets quite technical. I interspersed the article with a few screenshots from the work on the prototype. These are not screenshots of the game.</i><br />
<br />
<a name='more'></a><br />
The mesh representation is mostly done, only smaller augmentations and performance optimizations remain, so I thought this would be a good moment to do a little summary of the new tech. I think I ended up with a little more than I initially hoped I could realistically get.<br />
<br />
The result is surprisingly close to the crazy idea that I had in the beginning. I wanted a kind of hybrid that would combine the simplicity of dealing with volumes with the performance and precision of meshes, versatile enough to easily describe simple primitives, surfaces with low triangle count but also huge terrains of any genus. The topology should at all times implicitly form a clean closed surface without self intersections. It should be easily possible to generate different level of detail meshes from the same representation, and the entire structure must support interactive editing and lend itself well to tooling.<br />
<br />
The work is almost completely based on the papers by Schaefer & Warren [1] (for the original marching cubes on a dual grid idea) and Lewiner et al [2] (for an efficient implementation of the dual grid). My original contribution would be a radical simplification of the meshing process aiming for both a finer level of control to facilitate manual editing and cleaner meshes without slivers.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPb_-WwOeBPxaPPrnDddNg3Syrh2DZhH18UjvA0BmvksQE3C4Rh1oorv-gORUsCps0YZsIL0oUa1fh_oSi6Ji4gpzVn_ev1nwQcvyNggTD46uoSJkWVd6XBKhsLqgqdKgL-YbyjIWxRtM/s1600/screenshot_2014-03-22_11-50_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPb_-WwOeBPxaPPrnDddNg3Syrh2DZhH18UjvA0BmvksQE3C4Rh1oorv-gORUsCps0YZsIL0oUa1fh_oSi6Ji4gpzVn_ev1nwQcvyNggTD46uoSJkWVd6XBKhsLqgqdKgL-YbyjIWxRtM/s1600/screenshot_2014-03-22_11-50_0001.png" height="360" width="640"></a></div>
<br />
<br />
<h3>
Breakdown</h3>
<br />
The implementation consists of populating a data structure and generating a mesh from it. <br />
<br />
You need only a simple hashtable-based sparse octree implementation; Each cell stores (at minimum) the relative coordinate of a vertex that will or will not become a defining point on the surface. There are no leaves outside the volume, so every leaf is implicitly inside or on the boundary of a volume. You can easily add more attributes to the cells such as normals or material information, that will be used in the meshing process.<br />
<br />
As the octree cell implicitly already defines an origin and scale through its morton encoded location, the coordinate can be of low precision; three signed 8-bit components would suffice. I'm using 16-bit precision at the moment. <br />
<br />
These vertices form a dual grid, on which the actual mesh will be generated.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvHt6-MM4kIMTbedzIvqUBUxuIVZJCpURd8eZ3Mz8vFuUhcSGBBxqhse687bi1Pj7TddCLRJufTosOgVV_hokaTsFnyt7pNTWzq6fyWlM1szuU-buJCeylwbQzpJV_-77_i676SZiNLR8/s1600/screenshot_2014-03-23_21-17_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvHt6-MM4kIMTbedzIvqUBUxuIVZJCpURd8eZ3Mz8vFuUhcSGBBxqhse687bi1Pj7TddCLRJufTosOgVV_hokaTsFnyt7pNTWzq6fyWlM1szuU-buJCeylwbQzpJV_-77_i676SZiNLR8/s1600/screenshot_2014-03-23_21-17_0001.png" height="360" width="640"></a></div>
<br />
The mesh generator then uses a simple binary marching cube process to decide whether triangles need to be generated for each dual grid of eight adjacent vertices (If neighboring leaves aren't present, that's no problem; since those points are outside anyway, the MC doesn't need them for building the triangles). The endpoints of the triangles will always be at the vertex locations, so you have explicit control over surface features.<br />
<br />
The simplest structures you can build with this in a single branch (keeping all vertices at their default center positions) are a flat triangle with two sides (tag three adjacent cells as inside), a 2-sided quad (tag four adjacent cells), a tetrahedron (tag four adjacent cells in the pattern <span style="font-family: Courier New, Courier, monospace;">0b000,0b110,0b101,0b011</span>), and a 12-sided cube (tag eight adjacent cells).<br />
<br />
To build a perfect sphere, you can tag all cells within a desired radius as inside, and push the vertices of cells enclosing a piece of the surface to the surface of the sphere ("shrinkwrapping").<br />
<br />
For very complex surfaces, you can also fill the octree using a CSG tree describing a signed distance field, and push the vertices along the distance fields gradient to the surface for a smooth regular surface.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeB654D25P2GeIYmVTmh_XVZRyS2AhBylQpPhtn1U811SOIbZcb-_s4tSxcaUrXAa0MRdXFd0NdnPno9z4yjO6iwSGBfJMgpghg2AU9KVcrhiOXUTr1K0BcHyRYjFvQ3_yNPpgR4joqBs/s1600/screenshot_2014-03-21_23-55_0002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeB654D25P2GeIYmVTmh_XVZRyS2AhBylQpPhtn1U811SOIbZcb-_s4tSxcaUrXAa0MRdXFd0NdnPno9z4yjO6iwSGBfJMgpghg2AU9KVcrhiOXUTr1K0BcHyRYjFvQ3_yNPpgR4joqBs/s1600/screenshot_2014-03-21_23-55_0002.png" height="360" width="640"></a></div>
<br />
<h3>
Drawbacks & Yet Unexplored Avenues</h3>
<br />
I don't have a good scheme for UV mapping yet. Using trilinear texturing and weights at the vertices to control the blending, it should be possible to describe most terrains. One could also store mapping information at the axes (see implementation notes). There's also an interesting paper on TileTree texturing by Lefebvre & Dachsbacher [3] which offers a fine grade of control but needs to be adapted to volumetric meshes; a single tree should be enough, and we have enough information to not need ray casting as the paper suggests.<br />
<br />
Normals aren't smoothed, and vertices aren't merged into index buffers. This could all be done as a third step; But smooth normals could also be saved with the cell vertices, and would have to be re-calculated for the cell and adjacent cells on change, which is not particularly difficult (see implementation notes).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJIul9ot8Lr7CTGoKye1HvI7OKXxpnBAEqxwjBEuHnMS4REnB7drOCU9-6VEFuzZwCj5C1oPQtqAhq-R1q8c50rG3b-ikEErLgG479m1wsrmv3IGA1K69DgNdklRpjxjFHmoT2HKl6aWY/s1600/screenshot_2014-03-13_02-37_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJIul9ot8Lr7CTGoKye1HvI7OKXxpnBAEqxwjBEuHnMS4REnB7drOCU9-6VEFuzZwCj5C1oPQtqAhq-R1q8c50rG3b-ikEErLgG479m1wsrmv3IGA1K69DgNdklRpjxjFHmoT2HKl6aWY/s1600/screenshot_2014-03-13_02-37_0001.png" height="360" width="640"></a></div>
<br />
Level of detail (LOD) isn't done yet. Sparse octrees support LOD easily, as branches can always sum up what's going on in the leaves, and this tree is no different. If the mesher does not traverse deeper than a preset LOD level, the mesh will be more coarse, but still regular. If the tree is to be partially LOD'ed, the dual cells connecting the 1-ring neighbors of zones would have to be handled separately, but this is also easy to figure out.<br />
<br />
Partial mesh updates are not done yet. The latest plan is to split up large trees into zones with separate vertex buffers, and to recalculate a complete zone on change, as per-cell updates cause all kinds of logical fragmentation problems.<br />
<br />
Threading & GPU support: both tree population and the binary MC meshing can be neatly parallelized if desired, as work can be discretely split up along the branches' octants.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKldcSMTUN515Njo0cszBNoN2rPLAKm9pIynVQkJVTOlKVIohzsl8yjR9lHWaC5unR0gpMZwewsGdo8TE3CfVIJUrPx5o6Bk2qv-Mu6LsIWT0fJ40Qcybvx74iSkMMpq1MDeIAXGeL5-U/s1600/screenshot_2014-03-12_10-41_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKldcSMTUN515Njo0cszBNoN2rPLAKm9pIynVQkJVTOlKVIohzsl8yjR9lHWaC5unR0gpMZwewsGdo8TE3CfVIJUrPx5o6Bk2qv-Mu6LsIWT0fJ40Qcybvx74iSkMMpq1MDeIAXGeL5-U/s1600/screenshot_2014-03-12_10-41_0001.png" height="360" width="640"></a></div>
<br />
<h3>
Implementation Notes</h3>
<br />
To speed up the meshing and allow the enumeration of each dual grid body, the octree needs a second set of values for the hashtable, which represent the axes or corners of the octree cells. An octree axis conveniently always maps to a single dual grid cell, and is used to efficiently retrieve the edges connecting neighboring cell vertices. To achieve this, an axis stores the level of the deepest octree cell that supplies a vertex to the grid volume.<br />
<br />
The basic implementation is very much the same as in Lewiner et al [2], you can follow that one to the letter, and Lewiner has source code on his website for comparison (there's a typo in the paper so you'll need it).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpazaS-00EGqeaoKJrqeU8_tRYerlssW_ywaya1bNm_693XL7AvgMTiaxdREMcSRWhxVu0H0YI9fkp99rjdPf46GWrIVOweV3cA4NNsAmelDIpgsOzB3Uv2Tk5kkrgR5rtr6_StnUs54Q/s1600/screenshot_2014-03-08_00-59_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpazaS-00EGqeaoKJrqeU8_tRYerlssW_ywaya1bNm_693XL7AvgMTiaxdREMcSRWhxVu0H0YI9fkp99rjdPf46GWrIVOweV3cA4NNsAmelDIpgsOzB3Uv2Tk5kkrgR5rtr6_StnUs54Q/s1600/screenshot_2014-03-08_00-59_0001.png" height="360" width="640"></a></div>
<h3>
Thanks</h3>
<br />
Thanks to my wife and co-designer <a href="https://twitter.com/sylvia_ritter">Sylvia Ritter</a> for her endurance, patience and trust.<br />
<br />
Thanks to <a href="https://twitter.com/rygorous">Fabian Giesen</a> for his <a href="http://fgiesen.wordpress.com/">magnificient blog</a>, exhaustive rubberducking and hours of unpaid<br />
consulting. <br />
<br />
Thanks to <a href="https://twitter.com/mmalex">Alex Evans</a>, <a href="https://twitter.com/dougbinks">Doug Binks</a>, <a href="https://twitter.com/Tenebrous">Tenebrous</a>, <a href="https://twitter.com/meshula">Nick Porcino</a>, <a href="https://twitter.com/nothings">Sean Barrett</a>, <a href="https://twitter.com/JonOlick">Jon Olick</a>, <a href="https://twitter.com/Reedbeta">Nathan Reed</a> and many other Twitteristas for advice, hints, positive responses and oh so many favs.<br />
<br />
Lastly, thanks to <a href="https://twitter.com/tom_forsyth">Tom Forsyth</a> who told me not to cross the streams, because I totally did, and it worked!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhateFB27OuyivQyCAScAs9E9OMmyJqsFiggE6Dsh_BxZyR6AYPVA80Qax7RxdcbMs40JEXIlAKxYaAFEJZ9UD98yw_nJKmmX4-43rwP06-cxiEYhc94PsfP9hWtkzBPzA9K6BWR5oMvuc/s1600/screenshot_2014-03-19_20-33_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhateFB27OuyivQyCAScAs9E9OMmyJqsFiggE6Dsh_BxZyR6AYPVA80Qax7RxdcbMs40JEXIlAKxYaAFEJZ9UD98yw_nJKmmX4-43rwP06-cxiEYhc94PsfP9hWtkzBPzA9K6BWR5oMvuc/s1600/screenshot_2014-03-19_20-33_0001.png" height="360" width="640"></a></div>
<br />
<h3>
Sources</h3>
<br />
[1] Schaefer & Warren, Dual Marching Cubes (2004), slides:<br />
<a href="http://www.cs.berkeley.edu/~jrs/meshs08/present/Andrews.pdf">http://www.cs.berkeley.edu/~jrs/meshs08/present/Andrews.pdf</a><br />
[2] Lewiner et al, Fast generation of pointerless octree duals (2010)<br />
<a href="http://www.matmidia.mat.puc-rio.br/tomlew/pdfs/fastdualoctree_sgp.pdf">http://www.matmidia.mat.puc-rio.br/tomlew/pdfs/fastdualoctree_sgp.pdf</a><br />
[3] Lefebvre & Dachsbacher, TileTrees (2007)<br />
<a href="http://www-sop.inria.fr/reves/Basilic/2007/LD07/LD07.pdf">http://www-sop.inria.fr/reves/Basilic/2007/LD07/LD07.pdf</a><br />
<div>
<br /></div>
Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-13863139577753571692014-01-22T04:28:00.003-08:002014-01-22T04:29:40.868-08:00Vote for NOWHERE on Steam Greenlight!<div class="separator" style="clear: both; text-align: center;">
<a href="http://steamcommunity.com/sharedfiles/filedetails/?id=219516796"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTtJHh69gMmacpwTBpI_pZLHEKh0HBNzo27l1I5NL5HKwWdSIELRgs3LGQ0vYEN4JDCszTQceTP_1xW0iUyYTeOFj1dBPClGrSuZUGYGSph0KDt3wOIAW8pIyCjQ9q7yxv5quyD6dy3oc/s1600/Screenshot+from+2014-01-22+13:22:56.png" height="367" width="400" /></a></div>
<br />
Although Valve has announced recently that they would rather switch Greenlight for something else, we still haven't really done something with it, although we paid the $90 admission fee a long time ago. So we figured, what the heck, let's try it. If you have nothing better to do right now, why not head over to Greenlight to give us a big smackin' YES? It will be totally worth it your time, and we may actually end up on Steam, which greatly helps our ever diminishing funding treasury.<br />
<br />
<a href="http://steamcommunity.com/sharedfiles/filedetails/?id=219516796">TO THE VOTE MOBILE, ROBIN</a>Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-49457672926886162222014-01-11T00:12:00.000-08:002018-05-08T07:01:11.411-07:00NOWHERE - Alpha 91 - Sailing<div style="text-align: center;">
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/vg1as6Z_ZUI" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe></div>
About three months have passed since the release of Alpha 75, and it's about time for an update. This video walks you through the changes in Alpha 91 of NOWHERE, which you can download right away from your Humble Store account, if you have <a href="http://duangle.com/nowhere">backed the game</a> or are about to do so.<br />
<br />
Windows, Linux and Mac OS X builds are online.<br />
<br />
Changes:<br />
- NEW: The readme.txt has been updated to reflect latest changes. Check it out.<br />
- NEW: Procedural terrain! Alpha 91 demonstrates the earliest incarnation of the kind of landscapes you can expect to see in NOWHERE. After a short one time seeding, the game starts off with three Nowherian shells, which are uniquely grown for every game; All shells are depictions of the same Nowherian at different stages of his life. The smallest shell has an age comparable to the human age of 10. The second shell is about 20 years old, while the third shell is about 60 years of age, and has an average diameter of 600 to 800 meters.
While these bodies are still just gracefully rotating shells, in the finished game, Nowherians will live within and around each other, functioning both as agents with artificial intelligence and housings to other agents.<br />
- NEW: Instead of a propulsion system that would get you precisely where you would like to go, you are now equipped with a much more energy efficient tether, which works as a mixture of a rope and an anchor, or some kind of electromagnetic umbilical cord.<br />
- NEW: Previous alphas have been using the Bullet physics system, which was difficult to control from Python, badly documented and therefore hard to tune right. The library has been replaced with the <a href="http://www.ode.org/">OpenDynamics Engine</a>, which, while not as excessively featured, is more accessible, well documented, exposes better treatment of hard collisions and, most importantly, is fun to use.<br />
- NEW: A completely overhauled rendering system. The engine now uses deferred high dynamic range rendering and lighting, normal mapping, cascaded exponential variant shadow maps, screen-space ambient occlusion, motion blur, depth of field rendering and wide bloom to improve color fidelity, surface plasticity and depth perception.
These improvements help players greatly with navigating an abstract environment, and establish the basic system requirements of the game. They also help us to maintain a basic visual quality level even when models and textures are still placeholders.<br />
- NEW: Video quality can be controlled with the command-line switch <code>--video-quality</code> and provides seven different presets to balance presentation for performance.
Check out the readme.txt for more information.<br />
<br />
Known problems are listed in the supplied readme.txt.<br />
<br />
Up Ahead:<br />
- Populate the colony with Nowherians.Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-83253916474936774822013-09-19T07:15:00.000-07:002018-05-08T06:55:03.340-07:00NOWHERE - Let's Make It Happen!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh019i4baCk1BabQEmHPL6OC63a-3nP9h3_Z3FSjBSQtprKmSw9m57JchzO0A00XMrkNgXh_bKVOt5ZL_53hm2tZ2DXTncoRis4QHWCLcJ9yq2LN7kr_V-ibZJ_5ynLO9VxvT-kYqlRbKI/s1600/wir.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh019i4baCk1BabQEmHPL6OC63a-3nP9h3_Z3FSjBSQtprKmSw9m57JchzO0A00XMrkNgXh_bKVOt5ZL_53hm2tZ2DXTncoRis4QHWCLcJ9yq2LN7kr_V-ibZJ_5ynLO9VxvT-kYqlRbKI/s640/wir.png" width="640"></a></div>
<br />
This is the day. The day that our love child NOWHERE goes into official crowdfunding to allow us to work full time on the game that we always wanted to play.<br />
<br />
The <a href="http://www.duangle.com/nowhere">NOWHERE site has been completely rebooted</a> and now features the concept trailer that we have put everything into within the past week. Until now I was very hesitant to give the big picture away, but as we depend on your support, this is the last ace that I had in my sleeve.<br />
<br />
Much love also goes out to the great folks from Humble Store who are shouldering the payment process for us. Buying NOWHERE will now add the alpha to your existing humble account. If you already have an account with us, you'll still receive new Alphas this way, with an option to migrate NOWHERE to your Humble account if you like, and the ability to upgrade your tier.<br />
<br />
We hope that you'll love what we're doing and ask you to tell everyone you know about NOWHERE. The internet is a noisy place, so let's be the loudest, if only for half an hour. Our success is your success.<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-74165540051965245462013-09-19T06:55:00.000-07:002013-09-20T09:22:19.593-07:00NOWHERE - Alpha 75 - Sculpt<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzW3NVnCx-5PELba6fNgf9tKAFo5l1ydUr4p4sUY3H5x-WqBL6Mn1dZYm5S8pVxi0OBPQXnNH7Ulbs4rMR-S73X-orMiHZmBvolVrUHyUBADndZ_GqRNH051AUo6qV9s59Oe8tN9E5UZk/s1600/screenshot_2013-09-03_08-14_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzW3NVnCx-5PELba6fNgf9tKAFo5l1ydUr4p4sUY3H5x-WqBL6Mn1dZYm5S8pVxi0OBPQXnNH7Ulbs4rMR-S73X-orMiHZmBvolVrUHyUBADndZ_GqRNH051AUo6qV9s59Oe8tN9E5UZk/s640/screenshot_2013-09-03_08-14_0001.png" width="640" /></a></div>
<br />
We've been taking our sweet time, but here it is, finally, Alpha 75, with a dozen new features, available for everyone who is alphafunding the game (have you seen <a href="http://www.duangle.com/nowhere">our new site</a> yet? Tell everyone!). As usual, you'll find the new download on your account page.<br />
<br />
Changes:<br />
- NEW: The readme.txt has been extended with new information and quickstart guide. Check it out.<br />
- NEW: Sculpting/terrain engine! Meshes in the game can now be sculpted and procedurally deformed freely. This tech is the foundation for everything we are going to do with growing avatars and landscapes in the next alphas.<br />
- NEW: Oculus Rift support! For Windows, there's a batchfile supplied to start up the game with the right parameters. For other platforms, the command-line options <span style="font-family: Courier New, Courier, monospace;">--3d or</span> and<span style="font-family: Courier New, Courier, monospace;"> --fullscreen</span> will lead you to success. Use<span style="font-family: Courier New, Courier, monospace;"> --videomode list</span> to find the OVR display and pick a videomode (e.g. <span style="font-family: Courier New, Courier, monospace;">--videomode 1.1</span>) that matches a 1280x800x60 resolution.<br />
- NEW: HDR rendering. The retained rendering engine has been rewritten, and the game is now rendered with HDR quality and filmic tonemapping. The bloom shader has been improved to allow for really high blooms. As a result, colors look way more vibrant now and artifacts have been greatly reduced.<br />
- NEW: Procedural music effects. The magnificent <a href="http://www.warmplace.ru/soft/sunvox/">Sunvox</a> library (which replaces the more low-level libpd) provides realtime synthesized music and dsp effects that the game modulates based on events that happen in the game. Eventually, all sounds in the world will be represented by musical elements, and entire passages of the music will be procedurally generated in the game world.<br />
- NEW: A "Third-Eye" system that projects augmented reality into your game world; currently it generates coordinate points and shows you the currently selected tool, but it will eventually be somewhat of an internet in 3D, projecting the "thinking world" of Nowherians to allow them to communicate.<br />
- NEW: A very rudimentary cosmic bubble. It's currently only 100 meters across, but will grow as performance and features of the game improve. The light blue "noodles" growing from the sides are a first primitive rendition of what are eventually going to become plasma rivers, which provide the raw energy that Nowherians require to live.<br />
- NEW: The menu has a quickhelp for keyboard and gamepad controls.<br />
- FIX: XBOX 360 Gamepad support has been fixed for Windows.<br />
<br />
Known problems are listed in the supplied readme.txt.<br />
<br />
Up Ahead:<br />
- Flesh out the colony in which the sentients will be living and create places where there's something to do.<br />
- Drive the backstory forward and rearrange the gameplay around our new terrain techniques, starting with populating our space with the sentient swarm AI. The sentients are not hostile, but they inhabit the world, and interaction with them is a key element of the gameplay.Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-70778399869887506812013-09-06T18:15:00.004-07:002018-05-08T06:54:12.005-07:00Musings on Maslow Scale of Needs and Games<div>
<i>During a concept phase last year I mused over the <a href="http://en.wikipedia.org/wiki/Maslow's_hierarchy_of_needs">Maslow scale of needs</a> and how we might use it in our game. I just found the monologue in my notes and thought it might be an informative read for folks interested in our design process.</i></div>
<div>
<br /></div>
What if the game is about climbing up Maslow’s scale of needs? We provide opportunities to learn and master all levels, from the ground up.<br />
<br />
There is not much to write I guess. Fill the page with writing. About what? About everything. About myself. What about me? I have kind of given up thinking about myself. I guess you only think about the problems you have, and when the problems involve yourself, or the things you see wrong in you, then that’s where you spend your thinking time.<br />
<br />
A computer game isn’t much about thinking I guess. Well, maybe if you have to figure something out, a problem, a puzzle. What I’m missing is a certain intimacy, a personal relationship with the problem. How can I relate that to a stranger?<br />
<br />
My best bet has always been to just focus on the stuff that matters to me, talk about my issues, and then rely on the fact that we are not so different as a species. That on the bottom, we all have similar aspirations. The only thing you can not do is be confusing - unless confusion is your topic.<br />
<br />
But now we as a society are in a crisis. We see our personal wealth at stake. What suggestion do I have? To do a leap of faith, or rather: a marathon of faith. A caravan of faith. To get through a hostile desert with the reserves you have brought with you.<br />
<br />
I’m trying to avoid destruction and death in my game. As if those factors did not exist. Well they haven’t played a big part in my life yet. I guess I would be telling different stories if I have had a rougher life. But what would I relate? You move on.<br />
<br />
Despite many claiming the contrary, a game is highly pedagogical. It teaches. It is zen, too. But when we are selling something, I guess we are also working for evoking pleasure. What is pleasurable to me?<br />
<br />
I guess the mirror question is: what is not pleasurable? Hunger. Thirst. Pleasurable is satisfying hunger, quenching thirst. Maslow’s hierarchy of needs (look at next page). You need to breathe - asphyxiation is not pleasurable. Reproduction - I guess the game can’t help here (or can it?). Sleeping - you need to sleep, to dream. Homeostasis: temperatures should be not too hot, not too cold. Excretion: not being able to take a dump sure is inconvenient.<br />
<br />
Minecraft covers a few of those, but not all of them. I guess most people think physiological needs are annoying; or you’re taking care of those in your real life, so now you’d have to take care double - I guess you want a game to satisfy needs that you are not able to satisfy any other way. So what about the next level?<br />
<br />
Safety. Now we’re entering game territory, because all these needs are perfectly covered in real life. The human body still has thirst for action, I guess because it doesn’t pay off to be lethargic. One still has to be aware and prepared, as much as possible. Security of body: armor, privacy. Employment: interesting - not having anything to do, a stable income is not a problem if you are able to be self-reliant - I guess there is no need for employment.<img src="https://lh6.googleusercontent.com/Ydqr9zZMVGeKn5yeZN8U7kz7h6DIVtV0CjmB5mTG7yGlF5wDBsCeeWcdINvxtcrqOJ9yigZWQtQV6jKN5LEgyif4By1fH0P6y7lHPbqZOAgaiZ-udg8" /><br />
Well, to be of service, I would call it that. To be needed by others. Hero quests are like that. Circumstances require someone who improves a place, and so it’s a job, even if only for a limited time. Resources: you need to be able to accumulate for worse times. To know that you’ll soon have nothing sucks. You naturally accumulate. When it’s too much, it’s hoarding. To protect your family: yeah. Definitely something that all games lack. You’re rarely getting someone to defend or feed. I thought that Minecraft would be a lot better if you could help the villagers there. Health. You don’t want to get sick. And when you’re sick, it’s terrible - so, you want to be sane. You have a need to be sane. Insanity or sickness is a problem - especially when it’s in the way of another need. We could explore that.<br />
<br />
Property. I guess they mean shelter - and security of shelter. To know that this shelter is yours, that you own a place, and nobody can take it from you. Man, even we don’t have that. Our home is rented. It could be taken from us as soon as we run out of money. That thought sucks.<br />
<br />
Well at least we own everything inside. Credit is bad, when it means that you don’t own anything unless it’s paid. You’re renting your property. You wouldn’t want to have this for long - we could have this in the game: rentable vs. buyable stuff. Make the difference clear.<br />
<br />
People have trouble dealing with credit. A game would be a great place to teach someone about the issue of credit. Why can you always only spend what you have? That doesn’t reflect the real world, a world that happens to be eager to enslave you. I don’t think bankers are evil people. They’re just unable to give presents without expecting anything in return. I guess if they would just give their stuff away, it would work better for all of us. ;-)<br />
<br />
Then there’s the level of love/belonging. Something games are continuously bad at. Well, not entirely, because we have multiplayer - people can be friends online this way, be companions, have adventures together. I guess on a remote level, family and intimacy suck... I could try putting my wife and I in the same game. Then we could see what needs evoke out of that.<br />
<br />
I don’t know. I think this is a single player game, and you’re interacting with a mechanical universe. But I guess it would be more pleasurable to show your inventions to others.<br />
<br />
We arrive at the next level: Esteem. In a very nice purple. The need to respect yourself. That was a problem for me, and still is. I think it’s only possible when others respect you and say great things about you. But then again, only out of self respect, you can do great things. You must be able to believe that you can be great; without an AI giving you false credit.<br />
<br />
Confidence. To be sure of your abilities. You wouldn’t dabble around in fields you know nothing about - very difficult to bridge a player over to a new ability without ever feeling in-confident. Maybe we should play with that. Achievement - very important. The need to create something that lasts. Also kind of dangerous, because the lasting thing could be terrible. So - confidence is required. Respect by others - that’s a reiteration of “self-esteem”; I think the two are entangled. At least for my wife and me. Respect OF others: indeed, I need to be surrounded by people I respect and honor. You rarely enjoy being with lowly or evil people.<br />
<br />
I guess other characters in a game are important. We can’t get around other characters.<br />
<br />
Last level: Self-actualization. I guess that’s my deal. Morality: to be an exemplary character - Molyneux dealt with this. You can do good or evil - mainly demonstrating to you, quite pedagogical, that it feels great to be good, and terrible to be evil - including a stigmatization by others, because you have done evil things in a _game_, a game that effectively allows you to do evil - but is not seen as an evil game. Masterful!<br />
<br />
Creativity. The urge to make and create. Minecraft has this big time. Lego had this. Any kind of art is a “game” in this sense. Spontaneity: the need to break out of usual habits, to fight boredom. I guess I have a high urge to be spontaneous and creative at the same time. Problem solving. Yeah yeah, right right. Key element. Lack of prejudice: seeing things for what they are, not as a cliché of some sorts - that works only by closer learning, and by experience. Acceptance of facts: the need to accept inconvenient truths - by which I mean empirically sound truth like “you’re going to die” - not nonsense like “you are talentless”. :-) Also a way of problem solving.<br />
<br />
I guess only when all these needs are satisfied, you will have a need for self-transcendence, where you leave a stale image of yourself behind. Is that possible? I think yes.<br />
<br />
A world in which you act, the world changes, and then you can look back on your actions and judge yourself, laugh about your past mistakes. -- does that make sense? Record the player on his first run and on his last - so he can watch both, compare and look back on his own actions.<br />
<div>
<br /></div>
<div>
I guess that's all I can think for now.</div>
Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-34909936982622668072013-09-05T22:30:00.001-07:002018-05-08T06:54:51.925-07:00Why We Are Going NOWHERE<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpCnj_QUvdKxHCNzd1P7Z8Tmu4-HEq8h_Dr_WL1wOa2JVXo0eGp8jU13S_flWEpZXlA9ggddNnFxtAvXiwh4kYe_5pjPeyyxffz0Rz3eNO9WESSppChoFP0KnnURgHEPHdZrlM8QHK64A/s1600/screenshot_2013-07-26_02-30_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpCnj_QUvdKxHCNzd1P7Z8Tmu4-HEq8h_Dr_WL1wOa2JVXo0eGp8jU13S_flWEpZXlA9ggddNnFxtAvXiwh4kYe_5pjPeyyxffz0Rz3eNO9WESSppChoFP0KnnURgHEPHdZrlM8QHK64A/s640/screenshot_2013-07-26_02-30_0001.png" width="640"></a></div>
<br />
<i>A friend once told me that blog articles need pictures. I took the liberty to add a few unrelated screenshots of NOWHERE tests and debug sessions to this post.</i><br />
<br />
Sooo, a new blog post. In about ten days, our new crowdfunding site and teaser video will go online, showing off new concept art that Sylvia has drawn for the game, along with a new alpha presenting the features that I've been working on for the past two months.<br />
<br />
The new site exists mostly as assorted notes in text files scattered along my hard drive, and I currently find myself procrastinating hard, preferring to think deep about details for solving various technical future challenges instead of actually getting the fundraiser done; which is, of course, unacceptable.<br />
<br />
Therefore I thought it would be a good kick-off to just write a little about our motivations for <a href="http://www.duangle.com/nowhere">this project</a> and our goals: why we are doing it, and especially: why this game deserves to be developed over the course of several years.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeJXpdFQ8N0-TSY43c3B3L-YaW8S28jGXdlfjOUQ7H82YxnfENbiJy5ZqO02d-v6yw6q4oqR_M7zQhzp8LMfbkFwNQatlh6KMjqcPhDxK9iahYThFRKcZQTQK_964HdHIMT_5AWI4MCbE/s1600/screenshot_2013-08-07_03-13_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjeJXpdFQ8N0-TSY43c3B3L-YaW8S28jGXdlfjOUQ7H82YxnfENbiJy5ZqO02d-v6yw6q4oqR_M7zQhzp8LMfbkFwNQatlh6KMjqcPhDxK9iahYThFRKcZQTQK_964HdHIMT_5AWI4MCbE/s640/screenshot_2013-08-07_03-13_0001.png" width="640"></a></div>
<br />
You're still reading this? You seem genuinely interested. Let us see if I can keep this up.<br />
<br />
There are multiple angles from which this project makes sense for me, personally. There is of course the undeniable bonus of working on something that you really want to see exist in the world. The continuous anticipation, the suspense of waiting for that point in time when you finally get to play the game you always wanted to play.<br />
<br />
There is the wish to get in dialogue with other game designers: dialogue that is not played out in words, in tweets, in blogs, but in the language of gameplay; what we have to say are the games we make; if the subject was easy to put in words, we would be writers instead.<br />
<br />
I've been playing a lot of small and big titles within the past years as preparation for my own project. The plan was not only to get a feeling for where the game conversation is taking place, but also to recognize what games are lacking, and what they need the most. We are in the business of entertainment. If we go for tested and tried recipes too hard, we will risk doing our job badly.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-vlsrR9ScFFnq1y0NBg7ojROlDzh4TIle2nLSn3JMsjWVk2PaVuwyvz6SrXy8GFgJUd2xCLaejefu6OohwFy8OZeLCuxhvmAewDy9Yqea2iQzcV9eeMJdn-e17BQgeBEHIF8565LrVys/s1600/screenshot_2013-08-17_22-39_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-vlsrR9ScFFnq1y0NBg7ojROlDzh4TIle2nLSn3JMsjWVk2PaVuwyvz6SrXy8GFgJUd2xCLaejefu6OohwFy8OZeLCuxhvmAewDy9Yqea2iQzcV9eeMJdn-e17BQgeBEHIF8565LrVys/s640/screenshot_2013-08-17_22-39_0001.png" width="640"></a></div>
<br />
With NOWHERE, I would like to pick up and expand on the ideas that Markus "Notch" Persson's <a href="http://minecraft.net/">Minecraft</a> has brought forward. It has not become such a huge cultural phenomenon because of some fluke or fad. Notch has tapped right into something that most mainstream and indie games do not deliver: his game displays deep respect for the players need for self expression. When, as a kid, I played with my brother and sister, <a href="http://en.wikipedia.org/wiki/Playmobil">Playmobil</a> figures were our avatars. Our games had no goal oriented arcs; we were telling stories; within those stories, we invented rules - we designed small games. Children do not distinguish between making a game and playing a game: rules are altered as the game progresses, nothing is fixed, everything is permitted if players can agree upon it.<br />
<br />
But self-expression does not only cover avatar design, picking furniture or digging tunnels. As a human I'm embedded in a society that I interact with every day. As game AI is usually severely underdeveloped, you rarely meet a NPC (Non-Playable Character) that does have his own economics, needs, dreams and interests; you never had a discussion with a machine that made a difference for you or the simulated character. Dialogue trees are like mazes that have dead ends and exits. Exchange of goods is coldly economical. Could a NPC be more than a servant or foe - could she or he be your friend? Could you, who is himself subject to the mechanics and simulations of evolution, develop respect for another mechanical simulated being?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdDMJo6wtKE-Fy4FjMjNop7epUGGvzY31pfXMTRvfxJxSkG1PX9DtduEZN3CwgC6LrRxxE-iOfwo95pilgqZm-Ux8DKloTpAwTOz9lOa-NxjK2iX-rggo4TvHcigmQLQe4Kn6z2bJdFcA/s1600/screenshot_2013-08-31_01-13_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdDMJo6wtKE-Fy4FjMjNop7epUGGvzY31pfXMTRvfxJxSkG1PX9DtduEZN3CwgC6LrRxxE-iOfwo95pilgqZm-Ux8DKloTpAwTOz9lOa-NxjK2iX-rggo4TvHcigmQLQe4Kn6z2bJdFcA/s640/screenshot_2013-08-31_01-13_0001.png" width="640"></a></div>
<br />
I love <a href="http://en.wikipedia.org/wiki/Animal_Crossing">Animal Crossing</a> for its exploration of this social landscape, and I would like to see way more work towards this direction; work that ties several self-expressive game concepts together, yet there isn't happening much. This is why making NOWHERE is important to me.<br />
<br />
Then, I seek to make sense of the real world. I have friends who dream of fighting the system, starting a revolution. I have lots of friends who bemoan the political status quo, and I'm one of them. But how great are anyone's chances to change anything? What would it like to be a politician? How is a totalitarian system problematic? What is democracy? What would it feel like to make laws and then live under them? How do groups and relationships form and break? Can we really win this thing? A game could permit a player to walk in someone else's shoes for a while, so that we might understand ourselves and each other a little better.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiywfillIY31wph8vhW3xjytg05vuI1GrJIcIWjhlvK6-ogHdeitb_YNR3da8SWA95HOkKcoV1GbgAp1l9zfFjkSL4HHid6BqCAJXsHXykqolT6Duu-lf9xQkKRpeU5GEhj1c-Rxp2p9_Y/s1600/screenshot_2013-08-29_17-56_0002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiywfillIY31wph8vhW3xjytg05vuI1GrJIcIWjhlvK6-ogHdeitb_YNR3da8SWA95HOkKcoV1GbgAp1l9zfFjkSL4HHid6BqCAJXsHXykqolT6Duu-lf9xQkKRpeU5GEhj1c-Rxp2p9_Y/s640/screenshot_2013-08-29_17-56_0002.png" width="640"></a></div>
<br />
It is a big dream. A game that would be able to relate deep holistic wisdom to someone before she or he even reaches his 20th birthday. Am I asking for too much? I think game designers are largely selling themselves short. This job isn't just about making cute little playthings, like a royal toymaker would make mechanical birds for the indulgence of the emperor's daughter. As Jane McGonigal noted <a href="http://www.amazon.com/Reality-Broken-Games-Better-Change/dp/145583291X">in her book</a>, we have an obligation for the betterment of society, and with NOWHERE, I would love to get a chance to do my part.<br />
<br />
I probably forgot a few other aspects, but this post has become long enough. See you again soon, I hope. :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqc8O11mai-1D-XbHOXRmMi-4E7-krCtr3aXiJqTWLr3Awaal2cgSvRhpd9lzPZeTCYEqsKgyLJ9jSsG3AbfoPVGrxmulfWe3mf5SlbC74SqPqc_xt0yfmQwoBvcZB0CUt7ROR2x92G3Q/s1600/screenshot_2013-09-03_07-19_0001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqc8O11mai-1D-XbHOXRmMi-4E7-krCtr3aXiJqTWLr3Awaal2cgSvRhpd9lzPZeTCYEqsKgyLJ9jSsG3AbfoPVGrxmulfWe3mf5SlbC74SqPqc_xt0yfmQwoBvcZB0CUt7ROR2x92G3Q/s640/screenshot_2013-09-03_07-19_0001.png" width="640"></a></div>
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-39326650039305306372013-06-17T10:00:00.001-07:002013-06-17T15:46:39.782-07:00NOWHERE Progress Report: Declaring Independence<div class="separator" style="clear: both; text-align: center;">
<a href="https://pbs.twimg.com/media/BM0_6uICAAAkLmS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://pbs.twimg.com/media/BM0_6uICAAAkLmS.png" /></a></div>
<br />
<b>It's time for a little status update. What is happening? What are we up to? Where is the game going? When will the next alpha be released?</b><br />
<br />
Until now, Duangle and <a href="http://www.duangle.com/nowhere">NOWHERE</a> have been primarily funded by my day job. I've been entertaining this split personality thing for the past ten years: do mediocre wage slavery during the day, work on music and art in the evening and on weekends, in the hopes of one day being in a position where I would be trusted with greater creative control and responsibilities based on my personal track record. But that time never came.<br />
<br />
During crunch time at the office last month the amount of pressure I needed to get anything done at work had me devastated. In a quiet moment I told Sylvia that other men may have fantasies of women in stockings while my wildest perverted dream is to just quit my job and follow my passion. She said: "so why don't you just do it?", and that kind of was the push I needed. I announced my resignation the same day.<br />
<br />
It's time to seize the day. The office job has been diverting most of my mental energy to think about things I had no emotional stakes in, so game updates have been progressing very slowly the past weeks, but this is now going to change. My full time commitment ends at the end of July. After another month of 3 days/week part time, we're going to have all the space and time needed to turn NOWHERE into, uhm, the <a href="http://thecitizenkaneofvideogames.tumblr.com/">Citizen Kane of videogames</a>.<br />
<br />
Being no longer supported by a day job means that we have to ask the community for help. We're going to do this in the only way I know how: by doing a Kickstarter. Well, not exactly a Kickstarter, as KS is a hassle if you're not a US/UK resident*, but something very close. We are going to launch the thing on our own site, very much in the way <a href="http://www.introversion.co.uk/prisonarchitect/">Prison Architect</a> and <a href="http://www.playstarbound.com/store/">Starbound</a> are funded: buy the game in alpha stage (what Steam calls "Early Access"), and, depending on the package you pick, get additional perks and goodies associated with the game, such as shirts, coupons, and (err, let me have a look at the list... bup bup budum...), official cheat codes named after your choosing and/or a sponsored color.<br />
<br />
You'll also be able to directly vote on a stretch goal with your commission. These are some of the ideas we're throwing around. Nothing is completely certain yet, except this: if you have already preordered/alphafunded the game, your contribution counts towards the goal, and you'll be able to upgrade your commission.<br />
<br />
It would of course help if the alpha was in a playable state, or at least a state that would allow players to get a taste of what we're aiming for. This is where we're in kind of a hen-and-egg pickle: in order to make the game, we need your funding - but in order to get your funding we also need a game.<br />
<br />
We'll try to do our best and launch the campaign with an upgraded alpha, along with an in-depth pitch/trailer video. The video will explain some of the concepts in detail, give a historic overview of how far we've come so far and show off some of the rejected prototypes that have been made in the process.<br />
<br />
There is also a strong technical side to all this. The game is developed alongside with a set of freely available open sourced Python-based game bindings and libraries, aimed at adding to the indie communities available choice of programming languages. I'm not entirely sure how much we should stress this. It's definitely our goal to make the game as moddable as possible (moddable, is that a word?). Python/PyPy seems like a perfect fit to enable anyone to make and distribute quick modifications to his copy of the game, as it runs on all three major PC platforms without any compilation step required, and should offer much better mod mixing abilities.<br />
<br />
Does that sound like a great proposal? Do you miss a vital thing? What other topics would you like to see covered in our crowdfunding campaign? Put your thoughts and comments below!<br />
<br />
<span style="font-size: x-small;">* However, we see exposition on Kickstarter more as a godsent. It has become apparent by now that merely being on Kickstarter isn't a lucky charm on its own. If your project is attractive, it doesn't matter who hosts it. An escrow-based funding process wouldn't make sense, as we already have a product to offer, and can already associate buyers with an account. Prison Architect and Starbound have demonstrated how well such a self-hosting works, with the added benefit of giving the site a nicely customized styling. Sylvia has painted special artwork visible during the fundraiser, and there are some more surprises in store.</span><br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-65286446231051429132013-06-02T17:19:00.003-07:002018-05-08T06:53:51.595-07:00NOWHERE Progress Report: Geometrical GrowthNo new alpha this week as I'm still wrapping up the tech required for the next big feature, and my day job is currently in crunch mode (Did I mention I quit my job last week? We have big (crowdfunding) plans. More about that around the next month.).<br />
<br />
Instead, here's a video:<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="360" id="ytplayer" src="https://www.youtube-nocookie.com/embed/9p0hpwwWcPc
?modestbranding=1&vq=hd720&controls=0&rel=0&showinfo=0&color=white" type="text/html" width="640"></iframe><br />
<br/>
Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-71055425729461190382013-05-23T15:43:00.001-07:002018-05-08T06:53:26.462-07:00NOWHERE Progress Report: Procedural Procedures!Four weeks have passed, and still no new <a href="http://www.duangle.com/nowhere">NOWHERE</a> alpha in sight. What's happening? Time to give you all a little heads up.<br />
<br />
The colony as it looks at the moment was already cool enough to make a few jaws drop, but we're not happy. The game's world is supposed to be a rich diverse place, yet with a kind of homogeneous look but featuring a lot of distinct landmarks; as if that wasn't enough, each new play-through is supposed to throw the dices anew and generate a whole different look for the world. The colony will look a little different to each player.<br />
<br />
In the first two weeks I worked on a base implementation for easily generating 2-manifold meshes based on Fabian Giesen's excellent <a href="http://fgiesen.wordpress.com/2012/02/21/half-edge-based-mesh-representations-theory/">implementation guide</a> on the subject, adding support for splitting vertices and faces, subdivision and texture mapping. In the rest of the time I worked on a generator for hexagonal <a href="http://en.wikipedia.org/wiki/Greeble">greeble</a> patterns to skin meshes with interesting surfaces. It's very early stuff, and more is about to come in the following months.<br />
<br />
<span id="goog_1666858980"></span><span id="goog_1666858981"></span>I believe a few screenshots in chronological order will explain our progress best.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxSsJWU8sub-bcTu36W2Rkx7tPo2xf9wsYR1cx-kUVe9gYQfNcMp9nAmiNaEgwUW4yI2s2ExDta5h56lt1Z4QICp-fBRO00tLXH8ZS8raP8f5niqZAHsZCFV-R3Zp_-HqI3dkgg_MooYg/s1600/Screenshot+from+2013-05-03+22:30:59.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="505" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxSsJWU8sub-bcTu36W2Rkx7tPo2xf9wsYR1cx-kUVe9gYQfNcMp9nAmiNaEgwUW4yI2s2ExDta5h56lt1Z4QICp-fBRO00tLXH8ZS8raP8f5niqZAHsZCFV-R3Zp_-HqI3dkgg_MooYg/s640/Screenshot+from+2013-05-03+22:30:59.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">It all starts with a quad</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjBrq81gpNfbIPFxQDwH70D0BxDNvm1CUmNnR-9hGIRYrbuGk9jQa2V78spTPUqmPzZHxABrXQ2NUBx-hc5jgBu4ixkg841BBvPjZIW1XmQ3WA0RQE5hsANz22X8Wvg7lOX_elG8uN04s/s1600/Screenshot+from+2013-05-04+00:47:21.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjBrq81gpNfbIPFxQDwH70D0BxDNvm1CUmNnR-9hGIRYrbuGk9jQa2V78spTPUqmPzZHxABrXQ2NUBx-hc5jgBu4ixkg841BBvPjZIW1XmQ3WA0RQE5hsANz22X8Wvg7lOX_elG8uN04s/s640/Screenshot+from+2013-05-04+00:47:21.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Splitting faces is one of the two elemental operators to increase mesh complexity</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTVe-sfGxQ1Ofmw66b2jRvMyYdeB-5z3lzGjn3T3iK3aumuYHvpTrEQthEGoJBPhUG2L7GmCl2mFE-jKBtrJ0YWPZtH51Z4Jy0kJM5-CTSeABp7qTAIeFfKva1kuQFYoOEjHVyO3aPfP8/s1600/Screenshot+from+2013-05-04+12:11:15.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTVe-sfGxQ1Ofmw66b2jRvMyYdeB-5z3lzGjn3T3iK3aumuYHvpTrEQthEGoJBPhUG2L7GmCl2mFE-jKBtrJ0YWPZtH51Z4Jy0kJM5-CTSeABp7qTAIeFfKva1kuQFYoOEjHVyO3aPfP8/s640/Screenshot+from+2013-05-04+12:11:15.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Testing extrusion, which is built from the split vertex/face operators </td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC8bSEhBTlB7p4WV0d-LO1WZqQ2Y_vpvEuR1AYgJOav-aP4PSLU7eYiNoEavUCZkHtuCLsWAw1yRtXO4H6X-dpJcPVXyeaBSL3FJwOtkywsWSjzmZkxQppxNxgpagXCrUlg0XWvwqg-6E/s1600/Screenshot+from+2013-05-04+20:09:47.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhC8bSEhBTlB7p4WV0d-LO1WZqQ2Y_vpvEuR1AYgJOav-aP4PSLU7eYiNoEavUCZkHtuCLsWAw1yRtXO4H6X-dpJcPVXyeaBSL3FJwOtkywsWSjzmZkxQppxNxgpagXCrUlg0XWvwqg-6E/s640/Screenshot+from+2013-05-04+20:09:47.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Added code for various base primitives, here's a cone. How awesome is that? Not much. Moving on.</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqw6ErHofb2EDVGv73yiiSv5A-dPhaV6omd4x25wRmghstnKGxlJrU_xGygpByjtmZ9S6xd_DtHzUKInPjTuZ5PH0WlSAq6OAFmnkAXjCD6aOdUtA_N8C213BxCdbsvfJsC3L1WI4qneA/s1600/Screenshot+from+2013-05-05+02:46:06.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqw6ErHofb2EDVGv73yiiSv5A-dPhaV6omd4x25wRmghstnKGxlJrU_xGygpByjtmZ9S6xd_DtHzUKInPjTuZ5PH0WlSAq6OAFmnkAXjCD6aOdUtA_N8C213BxCdbsvfJsC3L1WI4qneA/s640/Screenshot+from+2013-05-05+02:46:06.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">It took a long time to get this right: meshes with holes.</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJU9fZz20y_C-Ym57dt0XI8RSM5eL6coQXF6Ok4mpGqSnUvfxLWPKAPL-X0ZQ3WUS2FTVIWrv00q655MVbVzhfxDxKw9FAo3yDpYlAfz0BMeij25egI5rJNiO-BMB94gCDICkGQr5Sjj4/s1600/Screenshot+from+2013-05-04+21:59:49.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJU9fZz20y_C-Ym57dt0XI8RSM5eL6coQXF6Ok4mpGqSnUvfxLWPKAPL-X0ZQ3WUS2FTVIWrv00q655MVbVzhfxDxKw9FAo3yDpYlAfz0BMeij25egI5rJNiO-BMB94gCDICkGQr5Sjj4/s640/Screenshot+from+2013-05-04+21:59:49.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A repeated sequence of face extrude & transform can yield pretty organic structures.</td></tr>
</tbody></table>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5CcpZripfpAJkRNAM_QBKNDqA1oUrsKZeNlGiyRacoX3oj4TI7dTTCNR_C8CXrz2ULSY42OLXIBlrzrAHTLVhih77GA4OrsD5Ny7goz3en7lbLNKQGDgIN6tuQXAHuDLeM5V_Azq7v4k/s1600/Screenshot+from+2013-05-15+11:52:25.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5CcpZripfpAJkRNAM_QBKNDqA1oUrsKZeNlGiyRacoX3oj4TI7dTTCNR_C8CXrz2ULSY42OLXIBlrzrAHTLVhih77GA4OrsD5Ny7goz3en7lbLNKQGDgIN6tuQXAHuDLeM5V_Azq7v4k/s640/Screenshot+from+2013-05-15+11:52:25.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Catmull-Clark subdivision surfaces with support for creasing / semi-hard edges. I think we're done here.</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRPRINn4F3Udp896ohsJF_7mEfC727P7nFCUo2JbtqxIcITsZApmnFDbwaWlSZBHvzVKaErdbIL7eH-2Es8S7WUcm5tbOBhiGMTPAtMzRB1bipXyVMnsn66cPUXd7y3BPejiOCIx0URI4/s1600/Screenshot+from+2013-05-17+00:59:46.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiRPRINn4F3Udp896ohsJF_7mEfC727P7nFCUo2JbtqxIcITsZApmnFDbwaWlSZBHvzVKaErdbIL7eH-2Es8S7WUcm5tbOBhiGMTPAtMzRB1bipXyVMnsn66cPUXd7y3BPejiOCIx0URI4/s640/Screenshot+from+2013-05-17+00:59:46.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Just one of many failed attempts to somehow get a grip on a workable pattern technique. Terrible.</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp77kO2eJsMWH5IMXmaQloYh_AY2qgLe2eDr5iaqH0whx6XuCkYNSv2T2CzV0rEWLiLYSvEtd8IfYFhom22V2Up8N0KfPLwDTtmSTBXMm9YdbZMkOUsMcMfVeYF4i4DJB57JOVFMecMxc/s1600/Screenshot+from+2012-06-01+23:28:58.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgp77kO2eJsMWH5IMXmaQloYh_AY2qgLe2eDr5iaqH0whx6XuCkYNSv2T2CzV0rEWLiLYSvEtd8IfYFhom22V2Up8N0KfPLwDTtmSTBXMm9YdbZMkOUsMcMfVeYF4i4DJB57JOVFMecMxc/s640/Screenshot+from+2012-06-01+23:28:58.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">This was one of the earliest hexagonal patterns we did, manually, a year ago. Why not do this procedurally?</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvUT0jMVSODVRExC_YEAvnS_H3ggD0phj3ERZb1KQbvyTpzSZxJgkKSTkoFHdwzql25Osm5NCPvMwbRSuhCZcOsMWQvC-K_sphGyOxU6GLmGFzfyGi6OU1uHCDbB84QNXdI3ReJPbOgpk/s1600/Screenshot+from+2013-05-20+18:10:08.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvUT0jMVSODVRExC_YEAvnS_H3ggD0phj3ERZb1KQbvyTpzSZxJgkKSTkoFHdwzql25Osm5NCPvMwbRSuhCZcOsMWQvC-K_sphGyOxU6GLmGFzfyGi6OU1uHCDbB84QNXdI3ReJPbOgpk/s640/Screenshot+from+2013-05-20+18:10:08.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Eroded RLE noise with an axonometric projection, with islands identified and colored by flood-fill algorithm. Piece of cake. A bright spot kept whooshing by the window several times while I worked on this. I'm not fully sure but I believe it was the sun.</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizZuUXOkyY0vOVl2HVvMM1FuwXkZGaDvfCUvb9HoUboGc90aQP7CmEVZHhmDoDh_ltXII2XdtuiSpuV_0j1pxdQQuVPzjhI6Ok400XwA7GbpE10I-KOu6iKEkjI3P4O9LNKuk_erX4Dnk/s1600/Screenshot+from+2013-05-20+17:00:09.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizZuUXOkyY0vOVl2HVvMM1FuwXkZGaDvfCUvb9HoUboGc90aQP7CmEVZHhmDoDh_ltXII2XdtuiSpuV_0j1pxdQQuVPzjhI6Ok400XwA7GbpE10I-KOu6iKEkjI3P4O9LNKuk_erX4Dnk/s640/Screenshot+from+2013-05-20+17:00:09.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Another generated pattern, this time with a more appropriate color scheme. </td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwJN5fya8EnIHLQXacaffq9CxfLnVlRRRE1R2pL6shGGyDgksltguC5zsOuYWtvDsRDsBc6dPrKVfemyhWK2BlctsEoqmK6A7pJwjwIpUaTaquSGJbL5D7yw_vwUZJMfcrzcTFNMu41CI/s1600/hex_0002_064.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwJN5fya8EnIHLQXacaffq9CxfLnVlRRRE1R2pL6shGGyDgksltguC5zsOuYWtvDsRDsBc6dPrKVfemyhWK2BlctsEoqmK6A7pJwjwIpUaTaquSGJbL5D7yw_vwUZJMfcrzcTFNMu41CI/s320/hex_0002_064.png" width="320"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">This is what a generated texture tile looks like.</td></tr>
</tbody></table>
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix5Ag9kk_pj7nxKf5kll4mxD6kE5jgvdAWGmJ3JDYotMqAGa2Odypgk8uBarOukCuXRHgOTPTcqhueARTBXm3NWly77QXW7009OiCnJWDtrxtt1_eoLZMnnsPNaFmDWuIMq7ig3gNxcc4/s1600/qVyiPOO.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEix5Ag9kk_pj7nxKf5kll4mxD6kE5jgvdAWGmJ3JDYotMqAGa2Odypgk8uBarOukCuXRHgOTPTcqhueARTBXm3NWly77QXW7009OiCnJWDtrxtt1_eoLZMnnsPNaFmDWuIMq7ig3gNxcc4/s640/qVyiPOO.jpg" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Testing one of the generated textures on a fitting object using Blender/Cycles. The procedural technique used here is<br />
based on repeatedly simulating a round of Nibbles/Snake, by the way.</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgluAka8ZWg4JxMpX44F3FLANggs_3PG_veu9ZlM8-pi-iX1vMajmTvhs5ztu88MB_xw7DoIAEcTMlN_Pru06hzYb6pzlYpwyRwJw6wpnt1JaR7Mj5SNjZWV7tPUm_xN_Jey130eEFNsCk/s1600/Screenshot+from+2013-05-24+00:06:07.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgluAka8ZWg4JxMpX44F3FLANggs_3PG_veu9ZlM8-pi-iX1vMajmTvhs5ztu88MB_xw7DoIAEcTMlN_Pru06hzYb6pzlYpwyRwJw6wpnt1JaR7Mj5SNjZWV7tPUm_xN_Jey130eEFNsCk/s640/Screenshot+from+2013-05-24+00:06:07.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Time to put it in the game. A first generated mesh looks pretty good! And yet still so much to do...</td></tr>
</tbody></table>
<br />
Hope that was as interesting for you as it was for me. You'll find a few more pictures in my <a href="https://twitter.com/paniq/media/grid">Twitter gallery</a>. Expect a new alpha build appearing in your account soon! Watch the skies!<br />
<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-15034167939778355862013-04-28T06:21:00.001-07:002018-05-08T06:53:08.094-07:00NOWHERE - Alpha 54 - Synth<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZPOZq57ugNtKnzx3bbkSx8Zmps31g2q88wxMw_nHjZuHtjMm2AUDQYI2yoFNIHhAqvvE5JsJPR4Zz2uKkSYVVeuA5jW9fO_jxo2SenyxLIPKKaTuxYYL4a890mtbuK2vg5-lk_KML9pc/s1600/Screenshot+from+2013-04-15+21:41:34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZPOZq57ugNtKnzx3bbkSx8Zmps31g2q88wxMw_nHjZuHtjMm2AUDQYI2yoFNIHhAqvvE5JsJPR4Zz2uKkSYVVeuA5jW9fO_jxo2SenyxLIPKKaTuxYYL4a890mtbuK2vg5-lk_KML9pc/s640/Screenshot+from+2013-04-15+21:41:34.png" width="640"></a></div>
<br />
<a href="http://www.duangle.com/nowhere">NOWHERE</a> Alpha 54 is now available for players who are preordering / alphafunding the game. As usual, you'll find the new download on your account page.<br />
<br />
Windows, Linux and Mac OS X builds are available.<br />
<br />
Changes:<br />
<br />
- NEW: Full support for XBOX 360 Gamepads.<br />
- NEW: Sound and music are back; shield absorber produces a dynamic effect (try colliding with walls).<br />
- NEW: The menu has been simplified. A new settings menu allows to toggle fullscreen on/off.<br />
- NEW: readme.txt contains a quickstart guide. <b>Windows users beware</b>: please open readme.txt in Wordpad (or any other editor), not Notepad for now. Notepad can't deal with UNIX line endings.<br />
- NEW: A loading screen.<br />
- NEW: Smoother transitions between menu and game.<br />
- NEW: Logging output is always written to debuglog.txt<br />
- FIX: On some systems, window resize events caused the game to crash.<br />
- FIX: Shadermodel 1.30 was broken, which made the game fail with older Intel drivers.<br />
<br />
Under The Hood:<br />
<br />
- Support for <a href="http://libpd.cc/">libpd</a> has been added to allow writing procedural audio soundtracks. libpd allows building complex synthesizer and effect DSP chains for dynamic acoustic feedback.<br />
<br />
Known Problems:<br />
- Fullscreen toggle: even though toggling fullscreen within the game works, some elements don't use the correct aspect or disappear. You need to quit / restart the game to make sure these artifacts are gone.<br />
- Occasional small freezes on Linux and OSX are caused by the PyPy garbage collector. The GC can be <a href="http://doc.pypy.org/en/latest/gc_info.html#minimark-environment-variables">tuned with environment variables</a>. If you manage to get a good tweak, let us know.<br />
- Restarting the game from the menu is broken. You need to restart the executable.<br />
- Win32: XBOX Gamepad support is possibly broken and will be fixed in the next alpha.<br />
- Win32: pthreadGC2.dll was missing from the release. Alpha 54b has been uploaded promptly.<br />
<br />
Up ahead:<br />
<br />
- Continous development on both editor and game as we move forward.<br />
- Flesh out the colony in which the sentients will be living and create places where there's something to do.<br />
- Drive the backstory forward and rearrange the gameplay around our new terrain techniques, starting with populating our space with the sentient swarm AI. The sentients are not hostile, but they inhabit the world, and interaction with them is a key element of the gameplay.<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-71028023453852035362013-04-22T01:42:00.001-07:002018-05-08T06:53:00.077-07:00What NOWHERE Is Actually About<iframe allowfullscreen="" frameborder="0" height="360" id="ytplayer" src="https://www.youtube-nocookie.com/embed/GqroHJ6GiPA?modestbranding=1&vq=hd720&controls=1&rel=0&showinfo=0&color=white" type="text/html" width="640"></iframe>
<br />
In this post, I will tell how <a href="http://www.duangle.com/nowhere">Nowhere</a> came about, why I think such a game is important and give you a short outline of the story, setting and gameplay (which are intertwined, as it should be). It is a temporary post that I will take offline in a month, as it contains quite a few spoilers; but I felt it is important to tell you what's going on as <a href="http://www.duangle.com/preorder/nowhere">we need your money</a> to be able to work on this project full time.<br />
<br />
Until now, I discussed the story and design of Nowhere only with friends. You may have noticed that the concept of the game has changed <a href="https://www.youtube.com/user/duangle/videos?view=0&flow=grid">dramatically</a> over the course of the past year. This is due to the evolutionary design process that we follow, which goes down to the concept as well. We keep what is fun and fits the goal and change what isn't quite spot-on and has grown stale. Eventually, we had to end up at something that works. Well, in theory, at least ;-)<br />
<br />
The idea for Nowhere (which started out as Project Ginshu, of which the moniker is a malapropism of <a href="http://en.wikipedia.org/wiki/Alexander_Shulgin">Shulgin</a>) ultimately needed three key ideas to come together. It started out from my desire to create a three dimensional game that confronted the player with key aesthetics and emotions of the <a href="http://en.wikipedia.org/wiki/Lysergic_acid_diethylamide">psychedelic experience</a> (what a lofty word, but I can't bring myself to say "acid trip") as I had witnessed it a few times in my twenties (don't do drugs, kids!). Getting your mind blown is amazing, but if it happens only in your head, you will remain rather lonely with what you saw. Words don't do this thing justice. So in a way, most of my previous work had in one way or another circled, or shall I say spiraled around this desire to relate the impossible. Yet I had the feeling that only an interactive experience, a true trip, would begin to scratch the surface; judging by what hallucinatory marvels CGI has brought on in the past ten years, and factoring in recent technological developments such as the <a href="http://www.oculusvr.com/">Oculus Rift</a>, a curated trip should also be a lot more pleasurable. For one, you can pause it whenever you like; but more importantly, you can share the dream (or nightmare) with someone else.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_2deRHTJV3cOpGTvUwu5GGqVs-bHf3shSY4SSVqDFjBIIGZsw4GfrYFXRfjV0x9nyfT88xqv0A7U6ZTcPvI-7s7M95jLD4sEAdACMrgRg0tpw9sbhUmr9xlvEx4ptGmr8g6zRtFlEjf8/s1600/drone6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_2deRHTJV3cOpGTvUwu5GGqVs-bHf3shSY4SSVqDFjBIIGZsw4GfrYFXRfjV0x9nyfT88xqv0A7U6ZTcPvI-7s7M95jLD4sEAdACMrgRg0tpw9sbhUmr9xlvEx4ptGmr8g6zRtFlEjf8/s400/drone6.png" width="400" /></a></div>
<br />
But that just accounts for the aesthetics; where is the gameplay? What would the playful equivalent of these cerebral presentations be? It took an awful lot of senseless rummaging in contemporary trends until I remembered an older idea I had originally acquired while playing <a href="http://en.wikipedia.org/wiki/Grand_Theft_Auto_IV">GTA IV</a>, which was to turn an open world single player game into a <a href="http://www.imdb.com/title/tt0175880/">multiplot</a> story where every citizen of the clockwork had a persistent identity; This was in 2007. After a few prototypes and technical considerations I gave up on it because I deemed it simply too hard to do. Well, whaddayaknow. If you give up the pretense of AAA realism, an ambitious design becomes manageable by a two headed team.<br />
<br />
YES YES OLD MAN, QUITE RIGHT, SO WHAT IS THIS ABOUT. Eh, don't shove me. I'll get right to it. I should also add that I was born 1980, the year that John Lennon was shot, so I'm not particularly old - yet. The third key influence was <a href="http://www.amazon.com/Fourth-Turning-American-Prophecy-Rendezvous/dp/0767900464">this peculiar book here</a>. Someone on Twitter recommended it to me when I began to have the notion that the tides of history are procured - brought on by generational friction. Regarding historic science (and possibly a lot of other topics) I'm a quack, and I embrace that quackness. While it renders conversation with pundits impossible, it allows me to indulge in ivory tower fantasizing, and considering that the natural laws of our universe would border on the fascist were they man-made, isn't dreaming the last refuge of the downtrodden? But I digress. In a nutshell, the book presents the moods of history as a four-staged seasonal cycle that lasts about an average human life, or 80 years. Every 20 years, one of four generational archetypes sees the light of day and seeks to distinguish itself from its elders. It's a fascinating read; the idea may seem completely bonkers to fanboys of scrutiny (only a part-time club for me), but know that the authors have been advising Disney in the 90's on how to prep the upcoming Millenials for their pivotal role in the crisis we are currently in, so, like any good prophecy, this one fulfills itself rather neatly. We have all been subjected to the ideas of this book already, you could as well read it - or read <a href="http://www.amazon.com/Debt-First-5-000-Years/dp/1933633867">this one</a> (much more grounded, amazing stuff, quite influential on me). Or play our game. [Addendum: I remember more books I have read where inspiration went into the design, more or less: <a href="http://www.amazon.com/Story-Structure-Substance-Principles-Screenwriting/dp/0060391685/ref=sr_1_2?ie=UTF8&qid=1366889989&sr=8-2&keywords=story">Story</a>, <a href="http://www.amazon.com/Design-Everyday-Things-Donald-Norman/dp/0465067107">The Design of Everyday Things</a>, <a href="http://www.amazon.com/Fire-Upon-Deep-Zones-Thought/dp/0812515285">A Fire Upon The Deep</a>, <a href="http://www.amazon.com/Book-Taboo-Against-Knowing-Who/dp/0679723005">The Book: On the Taboo Against Knowing Who You Are</a>, <a href="http://www.amazon.com/I-Ching-Book-Changes/dp/069109750X">I Ching The Book of Changes</a>, <a href="http://www.amazon.com/Electric-Kool-Aid-Acid-Test/dp/031242759X">The Electric Kool-Aid Acid Test</a>, <a href="http://www.amazon.com/House-Leaves-Mark-Z-Danielewski/dp/0375703764">House of Leaves</a>, <a href="http://www.amazon.com/Ready-Player-One-Ernest-Cline/dp/0307887448/ref=sr_1_1?s=books&ie=UTF8&qid=1366985161&sr=1-1&keywords=ready+player+one">Ready Player One</a>]<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHcusNVvt3nF1F_VOM6ka-E_LZ5AuKpN8q1BGSDVVu8qFsBurgGmIzb5pJ7SzrPNOMBIP01fMj5XkCtrHaOOmP7Izn8IULcX0LOyuAuuzV-oD4a-ApOP-ASFT36hyphenhyphenFwxaFOSB7bUToR-s/s1600/drone5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="287" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHcusNVvt3nF1F_VOM6ka-E_LZ5AuKpN8q1BGSDVVu8qFsBurgGmIzb5pJ7SzrPNOMBIP01fMj5XkCtrHaOOmP7Izn8IULcX0LOyuAuuzV-oD4a-ApOP-ASFT36hyphenhyphenFwxaFOSB7bUToR-s/s400/drone5.png" width="400"></a></div>
<br />
What is this now all coming down to? Here is the breakdown:<br />
<br />
<i>Nowhere is a procedural single player, open world, sandbox game; You incarnate as a floating sentient orb, a machine-being in a post-singularity society of vaguely self-conscious mechanical entities; for lack of a better word, I call them drones. You live the full life of that one drone in this closed ecosystem, which is represented as a giant otherworldly colony suspended in space. When you die, you reincarnate, and you live the next life, until all lives are played out. The lives you live are distributed across the equivalent of a drone's lifespan - randomly. Occasionally you meet a former self of yours, younger and older. You go back and forth in time and as every member of that society, you shape what you are as a collective. As the game progresses, you and the system become one.<br />
<br />
Nowhere has no fixed plot line, but provides emergent goals. The player creates his own narrative. The concept is highly AI dependent. It is a "civic" sandbox game. You can go with the flow of society, obstruct it, destroy it or mold it into something else. You are going to experience the system from both sides: conservative and progressive, rich and poor, creator and inhabitant. You will pass laws and be forced to live under them. You will instigate against yourself, become a victim of your own indifference, or enjoy the rule of your state-building foresight. The game can reach one of six extreme outcomes, of which each one is honored as a unique ending to your karmic ascension.</i><br />
<br />
I'm doing design and programming, my wife does concept art, texturing, co-design and play testing. Early technological work started 2011, it took another whole year to get to a sustainable idea and develop an <a href="http://blog.duangle.com/2013/02/nowhere-liminal-activities-part-2.html">engine</a> around it that would help us speed up development. I estimate the first complete beta to be delivered in 2014, and the final game to be released in 2015. There's still an awful lot to do.<br />
<br />
I think that's about it. We run an ongoing <a href="http://www.duangle.com/nowhere">alphafunding</a> campaign to crowdsource enough financing to be able to work on Nowhere full time; it's not a requirement for completion but it would help to speed up development time tremendously. So, please, if you love what we are working on, let others know we exist. I'll gladly answer questions and address objections in the comment section.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw9LJAJAKLTv44rj-hm_uJ6HmedIzJlZknSP_AF__SpG7r5Nvd5u3hGNi6MonmVn8nIYx97u8NSHWlOp6eC311Nsdai2UqbLMuWD1BOt-S6GL-QWhKRAqj0BApVHE8LMHHzdlBwSAXKP8/s1600/citytest1_web.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw9LJAJAKLTv44rj-hm_uJ6HmedIzJlZknSP_AF__SpG7r5Nvd5u3hGNi6MonmVn8nIYx97u8NSHWlOp6eC311Nsdai2UqbLMuWD1BOt-S6GL-QWhKRAqj0BApVHE8LMHHzdlBwSAXKP8/s400/citytest1_web.png" width="400" /></a></div>
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-21254110984066522832013-04-18T15:31:00.002-07:002018-05-08T06:57:11.408-07:00NOWHERE - Alpha 53 - Survival<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhImdm14inl2YUxYNw7xqZHJ4ioiVt7o-HjSPLlyEd7SMgE7322w7IKiBMxjnj7D0amurlcpaoVm85MBwpj53R_Ue4ispzHdvjx6PaHo7QtOM8KzvLOGhoKOh_ysxSth23q1a-93HfpqsM/s1600/actionshot.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhImdm14inl2YUxYNw7xqZHJ4ioiVt7o-HjSPLlyEd7SMgE7322w7IKiBMxjnj7D0amurlcpaoVm85MBwpj53R_Ue4ispzHdvjx6PaHo7QtOM8KzvLOGhoKOh_ysxSth23q1a-93HfpqsM/s640/actionshot.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Roaming through canyons to find some energy to absorb</td></tr>
</tbody></table>
<a href="http://www.duangle.com/nowhere">NOWHERE</a> Alpha 53 is now available for players who are preordering / alphafunding the game. As usual, you'll find the new download on your account page.<br />
<br />
Windows, Linux and Mac OS X builds are available.<br />
<br />
Controls:<br />
- WSADRF: accelerate forward / backward / left / right / up / down<br />
- Space: decelerate / brake<br />
- WSADRF+Space: maneuver mode (precise, but takes more energy)<br />
- QE: roll left/right<br />
- Shift: boost speed to 2x (will slow down when navigating)<br />
- Left mouse click: interact with objects<br />
<br />
Windows and Linux users also have access to our in-game IDE called "Liminal". See <a href="http://blog.duangle.com/2013/02/going-nowhere-liminally-progress-update.html">this</a> and <a href="http://blog.duangle.com/2013/02/nowhere-liminal-activities-part-2.html">this</a> blog post for more details. The editor is young and relatively limited, but can be toyed with a little already. Here are the most important hotkeys:<br />
- F12: Exit immediately (also works in the regular game)<br />
- F1: Toggle between IDE / Game<br />
- (In workspace) Middle Mouse Button+Drag: pan across UI<br />
- (In workspace) Ctrl+Mousewheel: zoom UI in/out<br />
<br />
Changes:<br />
- NEW: The colony has been fleshed out. Spaces have become canyons. Textures are darker and more detailed.<br />
- NEW: Your lifetime is now bound to your energy level. If you run out of energy, the game returns to the menu.<br />
- NEW: You lose a small percentage of energy all the time.<br />
- NEW: Movement costs energy. As with actual space, only acceleration, course changes and deceleration require power. Drifting at linear velocity is free.<br />
- NEW: Colliding with the walls activates the shields and costs energy.<br />
- NEW: Preliminary HUD displays for speed (in km/h), energy, and some other stuff ;-)<br />
- NEW: "Spacier" movement controls (see top part of article for manual). It takes a while to get used to but feels quite natural after some time, almost like diving.<br />
- NEW: The colony is now more elongated and slightly larger.<br />
- FIX: Two NVIDIA related bugs have been fixed.<br />
<div>
<br /></div>
Under The Hood:<br />
<br />
- Lots of dead code removed, a bunch of smaller optimizations.<br />
<br />
Known Problems:<br />
<br />
- Linux: On dual monitor setups, the engine may not recognize the screen resolution correctly. The launcher script explicitly starts the game in a 1280x720 window for now. (a problem caused by SDL missing a X11 feature on the older 32-bit Debian machine I have to use for building; this has low priority for now).<br />
- Linux: If double-clicking the run-script in Nautilus does not work, launch the script from the terminal (./run-nowhere, ./run-liminal).<br />
- Linux: The build is for 32-bit systems. Some 64-bit platforms do not provide 32-bit support libraries out of the box. 64-bit Ubuntu e.g. requires the ia32-libs package to be installed, which is part of the official repository. Other distros may require additional libraries.<br />
- OSX: The game is currently not deployed within an .app folder yet. You'll need to launch the run-nowhere script from the root folder of the unpacked archive instead. Double-clicking works.<br />
- OSX: No Liminal editor yet, due to a fairly messy situation where PyPy stock builds are 64-bit, but Awesomium which Liminal depends on is 32-bit, thus rendering both components incompatible to each other. As long as PyPy offers no 32-bit macosx builds and Awesomium sticks to 64-bit, this issue can not be resolved.<br />
<div>
<br /></div>
Up ahead:<br />
<br />
- Continous development on both editor and game as we move forward.<br />
- Flesh out the colony in which the sentients will be living and create places where there's something to do.<br />
- Sound!<br />
- Drive the backstory forward and rearrange the gameplay around our new terrain techniques, starting with populating our space with the sentient swarm AI. The sentients are not hostile, but they inhabit the world, and interaction with them is a key element of the gameplay.<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-25460895850123442692013-04-07T12:36:00.001-07:002018-05-08T06:58:06.411-07:00NOWHERE - Alpha 51 - Colony<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgced8R1QLwPYaH57-LyvO6VgfVVvOyvjPNl5513gaEh9w3Wz2X5Uq5GofReeywOvSsdcscd_vMF_AVQndn7l2r0Cu_atMXd8sh8T-lAsPFju173_dL8lhsM6xSChYsQQCS-bUyEVUnZgI/s1600/Screenshot+from+2013-04-07+14:13:54.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgced8R1QLwPYaH57-LyvO6VgfVVvOyvjPNl5513gaEh9w3Wz2X5Uq5GofReeywOvSsdcscd_vMF_AVQndn7l2r0Cu_atMXd8sh8T-lAsPFju173_dL8lhsM6xSChYsQQCS-bUyEVUnZgI/s640/Screenshot+from+2013-04-07+14:13:54.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Rolling through the colony</td></tr>
</tbody></table>
<a href="http://www.duangle.com/nowhere">NOWHERE</a> Alpha 51 is now available for players who are preordering / alphafunding the game. As usual, you'll find the new download on your account page.<br />
<br />
Windows and Linux builds are available, Mac OS X build follows soon.<br />
<br />
Windows and Linux users also have access to our in-game IDE called "Liminal". See <a href="http://blog.duangle.com/2013/02/going-nowhere-liminally-progress-update.html">this</a> and <a href="http://blog.duangle.com/2013/02/nowhere-liminal-activities-part-2.html">this</a> blog post for more details. The editor is young and relatively limited, but can be toyed with a little already. Here are the most important hotkeys:<br />
- F12: Exit immediately (also works in the regular game)<br />
- F1: Toggle between IDE / Game<br />
- (In workspace) Middle Mouse Button+Drag: pan across UI<br />
- (In workspace) Ctrl+Mousewheel: zoom UI in/out<br />
<br />
Changes:<br />
<br />
- Game: The "City" test map has now replaced the old "Rock" test map, and become the "Colony" test map.<br />
- Game: The algorithm for the city generator has been vastly improved and features lush mock structures and surfaces that are early precursors to what the colony will look like. The colony is randomly generated on each launch and covers about 1600 cubic meters of ground. There is no collision code yet.<br />
- Game: The player movement physics has been changed from movement-based to force-based and works now a lot more like a multidirectional matter exhaust drive; your vehicle accelerates up to 120 km/h. When doing hard turns or not pressing one of the directional keys (WSAD), the motor applies correctional and braking force to stay on course or bring the vehicle to a halt.<br />
- Game: The cameras FOV has been increased from 75 to 90 degrees.<br />
- Game: post processing shaders are back, and enabled by default.<br />
- Game: sentients have been taken out on short notice. The code needs to be optimized further.<br />
- Game: Fixed game not launchable on win32 if path contained spaces.<br />
<div>
<br /></div>
Under The Hood:<br />
<br />
- A few smaller optimizations.<br />
<br />
Known Problems:<br />
<br />
- Linux: On dual monitor setups, the engine may not recognize the screen resolution correctly. The launcher script explicitly starts the game in a 1280x720 window for now. (a problem caused by SDL missing a X11 feature on the older 32-bit Debian machine I have to use for building; this has low priority for now).<br />
- Linux: If double-clicking the run-script in Nautilus does not work, launch the script from the terminal (./run-nowhere, ./run-liminal).<br />
- Linux: The build is for 32-bit systems. Some 64-bit platforms do not provide 32-bit support libraries out of the box. 64-bit Ubuntu e.g. requires the ia32-libs package to be installed, which is part of the official repository. Other distros may require additional libraries.<br />
<br />
- Nvidia cards (some? all?): I got reports that at least one of the shaders does not compile correctly; As I did all work on an AMD past week I didn't notice. The problem will be fixed in the next alpha.<br />
<div>
<br /></div>
<br />
- OSX: The game is currently not deployed within an .app folder yet. You'll need to launch the run-nowhere script from the root folder of the unpacked archive instead. Double-clicking works.<br />
- OSX: No Liminal editor yet, due to a fairly messy situation where PyPy stock builds are 64-bit, but Awesomium which Liminal depends on is 32-bit, thus rendering both components incompatible to each other. As long as PyPy offers no 32-bit macosx builds and Awesomium sticks to 64-bit, this issue can not be resolved.<br />
<div>
<br /></div>
Up ahead:<br />
<br />
- Continous development on both editor and game as we move forward.<br />
- Drive the backstory forward and rearrange the gameplay around our new terrain techniques, starting with populating our space with the sentient swarm AI. The sentients are not hostile, but they inhabit the world, and interaction with them is a key element of the gameplay.<br />
- Flesh out the colony in which the sentients will be living and create places where there's something to do.<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-35602331978125586492013-03-25T13:40:00.000-07:002018-05-08T06:52:29.765-07:00NOWHERE - Alpha 50 - Prim City<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBaiUPoubU-AdY93dXK6whX4wiUcpVQ1CzEUl0CVkMGRtI0Dx6MpSsdEVb5-HTriEtxOBq_oyOGUjuHdMbblfHtxWv6bMBrtiy9stECPoTDupZtdgXkbVrdYN4PlcsEScB9MLWkybpUd0/s1600/Screenshot+from+2013-03-25+20:54:04.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBaiUPoubU-AdY93dXK6whX4wiUcpVQ1CzEUl0CVkMGRtI0Dx6MpSsdEVb5-HTriEtxOBq_oyOGUjuHdMbblfHtxWv6bMBrtiy9stECPoTDupZtdgXkbVrdYN4PlcsEScB9MLWkybpUd0/s640/Screenshot+from+2013-03-25+20:54:04.png" width="640"></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Behold, the feeble beginnings of what is one day going to become a procedural floating city</td></tr>
</tbody></table>
<a href="http://www.duangle.com/nowhere">NOWHERE</a> Alpha 50 is now available for players who are preordering / alphafunding the game. As usual, you'll find the new download on your account page.<br />
<br />
Windows, Mac OS X and Linux builds are available.<br />
<br />
Windows and Linux users also have access to our in-game IDE called "Liminal". See <a href="http://blog.duangle.com/2013/02/going-nowhere-liminally-progress-update.html">this</a> and <a href="http://blog.duangle.com/2013/02/nowhere-liminal-activities-part-2.html">this</a> blog post for more details. The editor is young and relatively limited, but can be toyed with a little already. Here are the most important hotkeys:<br />
- F12: Exit immediately (also works in the regular game)<br />
- F1: Toggle between IDE / Game<br />
- (In workspace) Middle Mouse Button+Drag: pan across UI<br />
- (In workspace) Ctrl+Mousewheel: zoom UI in/out<br />
<br />
Changes:<br />
<br />
- IDE: Script editor. Double-click any Python file or shader in the project, edit and save with Ctrl+S. Wherever possible, game objects and shaders will update immediately on the fly.<br />
- IDE: Python prompt. The special "lim" object gives you access to a few important top level objects.<br />
- IDE: Python VM inspector. Type "lim.inspect(any_obj)" to open an inspector UI.<br />
- IDE: PyDoc browser. See "lim.pydoc()".<br />
- Menu: "Client" menu point has been split up in the existing "Rock" and the new "City" test maps.<br />
- Game: New "City" test map. The city (which is just a 4x4x4 block of boxes, actually) is randomly assembled every launch by a very primitive Wang Tiles algorithm.<br />
- Game: "Rock" test map uses an alternative, more rectangular approach to rock generation.<br />
- Game: Drones/Sentients spawned in both test maps now prefer building axis aligned pathways over random directions. This is in preparation of the street canal building.<br />
<br />
Under The Hood:<br />
<br />
- A few smaller optimizations.<br />
- Removed the Blender Game Engine compatibility layer, as we're moving more towards working with the in-game IDE; added the ability to translate blend-files on the fly.<br />
- Published <a href="https://pypi.python.org/pypi/glue.py/0.5.1">glue.py</a>, a collection of language extensions for Python often used across the code base.<br />
<br />
Known Problems:<br />
<br />
- OSX: The game is currently not deployed within an .app folder yet. You'll need to launch the run-nowhere script from the root folder of the unpacked archive instead. Double-clicking works.<br />
- OSX: No Liminal editor yet, due to a fairly messy situation where PyPy stock builds are 64-bit, but Awesomium which Liminal depends on is 32-bit, thus rendering both components incompatible to each other. As long as PyPy offers no 32-bit macosx builds and Awesomium sticks to 64-bit, this issue can not be resolved.<br />
- Linux: On dual monitor setups, the engine may not recognize the screen resolution correctly. The launcher script explicitly starts the game in a 1280x720 window for now. (a problem caused by SDL missing a X11 feature on the older 32-bit Debian machine I have to use for building; this has low priority for now).<br />
- Linux: If double-clicking the run-script in Nautilus does not work, launch the script from the terminal (./run-nowhere, ./run-liminal).<br />
- Linux: The build is for 32-bit systems. Some 64-bit platforms do not provide 32-bit support libraries out of the box. 64-bit Ubuntu e.g. requires the ia32-libs package to be installed, which is part of the official repository. Other distros may require additional libraries.<br />
<br />
Up ahead:<br />
<br />
- Continous development on both editor and game as we move forward.<br />
- Drive the backstory forward and rearrange the gameplay around our new terrain techniques, starting with populating our space with the sentient swarm AI. The sentients are not hostile, but they inhabit the world, and interaction with them is a key element of the gameplay.<br />
- Flesh out the city in which the sentients will be living and create places where there's something to do.<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.comtag:blogger.com,1999:blog-128710045328443506.post-36890583743735584342013-02-26T03:23:00.001-08:002018-05-08T06:52:23.428-07:00NOWHERE - Alpha 46 - Liminal<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoPPGHUSJE5014tbSIC_DlGfos3TRuVUDQzgJkU8DMCLuJCYSfCeSf6P0ZhURn7-SyJPLBWCihRbLNkIzCwHOSnn0F7cSdCZxj9BMv1Z02otH0FmRmAhszgMLTIDjyJlryLvcKGUw-qjw/s1600/BDqw2wBCAAAzNjk.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="346" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoPPGHUSJE5014tbSIC_DlGfos3TRuVUDQzgJkU8DMCLuJCYSfCeSf6P0ZhURn7-SyJPLBWCihRbLNkIzCwHOSnn0F7cSdCZxj9BMv1Z02otH0FmRmAhszgMLTIDjyJlryLvcKGUw-qjw/s640/BDqw2wBCAAAzNjk.png" width="640"></a></div>
<br />
<a href="http://www.duangle.com/nowhere">NOWHERE</a> Alpha 46 is now available for players who are preordering / alphafunding the game. As usual, you'll find the new download on your account page.<br />
<br />
Windows, Mac OS X and Linux builds are available.<br />
<br />
This release features our new in-game IDE Liminal, which is being designed with strong support for stereoscopic visualization, rapid prototyping/live coding and a low latency edit & continue working cycle. See <a href="http://blog.duangle.com/2013/02/going-nowhere-liminally-progress-update.html">this</a> and <a href="http://blog.duangle.com/2013/02/nowhere-liminal-activities-part-2.html">this</a> blog post for more details. The editor is young and relatively limited, but can be toyed with a little already. Here are the most important hotkeys:<br />
- F12: Exit immediately<br />
- Ctrl+Tab: Release mouse control<br />
- Ctrl+^: Switch between world / workspace controls<br />
- (In world) WSAD Q/E R/F: navigate<br />
- (In workspace) Shift+Slide: pan across UI<br />
- (In workspace) Ctrl+Mousewheel: zoom UI in/out<br />
<br />
Changes:<br />
<br />
- First release of Liminal, our new live-coding game IDE (Windows/Linux only for now, see Known Problems below).<br />
- Game: The menu has been re-skinned. Nothing else has changed. The game is in process of being ported to the editor, which allows us to get a better grip on the scale the project is about to reach.<br />
<br />
Under The Hood:<br />
<br />
- Wrote Python bindings for <a href="http://awesomium.com/">Awesomium</a>, a commercial library that allows to embed Webkit-based browsers in 3D applications and games. The library has been tremendously helpful with integrating complex and responsive UI code in the editor. Liminal exposes a web server internally that the UI connects to. The bindings are MIT licensed and available at our <a href="https://bitbucket.org/duangle">bitbucket site</a>.<br />
- Wrote a new cross-platform build script that is guaranteed to perform clean from-scratch builds of NOWHERE and the Liminal game editor. The script has configurations for five of our machines (of which three are virtual), and builds a combination of our source repositories and packed archives of pre-built dependencies on a shared network location. The result is archived and put back on the fileserver for publishing.<br />
<br />
Known Problems:<br />
<br />
- OSX: The game is currently not deployed within an .app folder yet. You'll need to launch the run-nowhere script from the root folder of the unpacked archive instead. Double-clicking works.<br />
- OSX: No Liminal editor yet, due to a fairly messy situation where PyPy stock builds are 64-bit, but Awesomium which Liminal depends on is 32-bit, thus rendering both components incompatible to each other. I'm looking into resolving this issue ASAP.<br />
- Linux: On dual monitor setups, the engine may not recognize the screen resolution correctly. The launcher script explicitly starts the game in a 1280x720 window for now. (a problem caused by SDL missing a X11 feature on the older 32-bit Debian machine I have to use for building; I'm dodging the task of having to rebuild X11 just to get this).<br />
- Linux: Last minute discovery: Double-clicking the run-script in Nautilus didn't work for me. I had to launch the script from the terminal (./run-nowhere, ./run-liminal).<br />
- Linux: The build is for 32-bit systems. Some 64-bit platforms do not provide 32-bit support libraries out of the box. 64-bit Ubuntu e.g. requires the ia32-libs package to be installed, which is part of the official repository.<br />
- Post processing FX have been disabled because the underlying blender game engine inspired technique performs rather badly, because it uses glCopyTexImage2D. They will be replaced with better, render-to-texture based implementations.<br />
- Missing Feature: 3D sound. We use OpenAL but sounds are currently not attached to a location and will appear to emanate from the center of the screen.<br />
<br />
Up ahead:<br />
<br />
- Continous development on both editor and game as we move forward.<br />
- Drive the backstory forward and rearrange the gameplay around our new terrain techniques, starting with populating our space with the sentient swarm AI. The sentients are not hostile, but they inhabit the world, and interaction with them is a key element of the gameplay.<br />
<br />Leonard Ritterhttp://www.blogger.com/profile/09075774021335432327noreply@blogger.com