<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5248616490907735528</id><updated>2012-01-27T16:05:35.827-08:00</updated><category term='scripting'/><category term='docs'/><category term='security'/><category term='intensityengine'/><category term='communityupdate'/><category term='django'/><category term='lua'/><category term='demo'/><category term='webgl'/><category term='ammo.js'/><category term='library'/><category term='razanak'/><category term='clang'/><category term='git'/><category term='valgrind'/><category term='llvm'/><category term='launch'/><category term='article'/><category term='code'/><category term='masterserver'/><category term='new game'/><category term='screenshot'/><category term='release'/><category term='testing'/><category term='ubuntu'/><category term='bullet'/><category term='emscripten'/><title type='text'>Scriptensity</title><subtitle type='html'>Webifying FOSS game tech: Emscripten, Syntensity and other lunacy</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default?start-index=101&amp;max-results=100'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>117</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7520201406451212424</id><published>2011-12-05T10:22:00.001-08:00</published><updated>2011-12-05T10:26:27.306-08:00</updated><title type='text'>Emscripten stuff on other blog</title><content type='html'>As mentioned previously, I've moved to working fulltime on Emscripten now. So Emscripten-related blogposts will now be on my &lt;a href="http://mozakai.blogspot.com/"&gt;other blog&lt;/a&gt;. (You can also follow me on &lt;a href="http://twitter.com/kripken"&gt;twitter&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;I'll use this blog for Syntensity-specific stuff, that is, about porting Sauerbraten and/or Syntensity which is based on it to the web. I have not had any progress to report on that recently, since I am completely blocked on OpenGL issues: I can compile the C++ to JS, but I can't convert the OpenGL code to WebGL. I've asked around for help but so far no luck, hopefully it will happen though.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7520201406451212424?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7520201406451212424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/12/emscripten-stuff-on-other-blog.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7520201406451212424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7520201406451212424'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/12/emscripten-stuff-on-other-blog.html' title='Emscripten stuff on other blog'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1944244863797560012</id><published>2011-11-10T17:35:00.001-08:00</published><updated>2011-11-10T18:32:02.400-08:00</updated><title type='text'>Emscripten Updates</title><content type='html'>Lots of stuff has happened with Emscripten, I haven't blogged because I've been too busy. Here are some updates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Emscripten was used to compile the Android H264 codec to JavaScript, in a project called &lt;a href="https://github.com/mbebenita/Broadway/"&gt;Broadway&lt;/a&gt;. (&lt;a href="http://mbebenita.github.com/Broadway/broadway.html"&gt;live demo&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;I gave a talk about Emscripten at SPLASH 2011 in Portland. (&lt;a href="http://syntensity.com/static/splashpres.pdf"&gt;slides&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;I gave a talk about Emscripten at JSConf.EU in Berlin. (&lt;a href="http://syntensity.com/static/jsconf_eu_Emscripten_lo.pdf"&gt;slides&lt;/a&gt;) &lt;/li&gt;&lt;li&gt;Performance of the generated code has been improving due to progress in the relevant projects (JS engines, Emscripten and Closure Compiler). Some numbers appear in the slides linked to above (the upper link is more recent).&lt;/li&gt;&lt;li&gt;Bundled headers. This makes it easier to use Emscripten on non-Linux platforms (Linux being the platform that most development is done on) and in a portable way that does not depend on your local system headers.&lt;/li&gt;&lt;li&gt;Some library bugfixes that resolved almost all the open issues on &lt;a href="https://github.com/kripken/speak.js"&gt;speak.js&lt;/a&gt;, the Emscripten port of eSpeak to JavaScript which lets you do text-to-speech on the web.&lt;/li&gt;&lt;li&gt;&lt;a href="https://github.com/kripken/j2k.js"&gt;j2k.js&lt;/a&gt;, a port of OpenJPEG to JavaScript with a nice API, letting you decode JPEG2000 images on the web. This might be helpful with &lt;a href="https://github.com/andreasgal/pdf.js/"&gt;pdf.js&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Support for LLVM svn (soon to be 3.0). Note that revision 141881 is known to work, others should but not necessarily.&lt;/li&gt;&lt;li&gt;Many other improvements and bugfixes to Emscripten. I should probably formally release a 2.0 version, but I can't seem to decide when.&lt;/li&gt;&lt;li&gt;Finally, I am now working fulltime on Emscripten and Emscripten-related things (at Mozilla, where I already worked but on other stuff before). So progress on Emscripten will be faster :)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1944244863797560012?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1944244863797560012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/11/emscripten-updates.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1944244863797560012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1944244863797560012'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/11/emscripten-updates.html' title='Emscripten Updates'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2425595966420478205</id><published>2011-10-09T07:53:00.000-07:00</published><updated>2011-10-09T07:53:09.025-07:00</updated><title type='text'>llvm-svn branch has been merged</title><content type='html'>The &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;llvm-svn&lt;/span&gt;&lt;/b&gt; branch of Emscripten has been merged to &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;master&lt;/span&gt;&lt;/b&gt;, in preparation for Emscripten 2.0, after all tests have been fixed and all speed regressions resolved. If you are currently using &lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;master&lt;/span&gt;&lt;/b&gt;, the consequences of that are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You should use LLVM's svn (soon to be 3.0). LLVM 2.9 might still work, but it isn't guaranteed. Also, LLVM 3.0 is deprecating &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;llvm-gcc&lt;/span&gt;, so Emscripten no longer uses that in its tests (as with 2.9, it might still work, but it might not). &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;clang&lt;/span&gt; in 3.0 is much improved and is able to compile much more code than 2.9, so llvm-gcc is less necessary; there is also dragonegg which combines LLVM and GCC in a different manner, but its website says it is not mature yet.&lt;/li&gt;&lt;li&gt;Emscripten now uses its own header files, &lt;b&gt;not&lt;/b&gt; your system headers. That means that Emscripten should now work on all platforms exactly the same. However, if you were using Emscripten to compile something that relied on your system headers, you might need to change how your project is built (that is, tell it to use those headers and not just Emscripten's bundled ones in &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;system/include&lt;/span&gt;). Note that if you do not use the bundled headers, you will probably need to use the &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;-H&lt;/span&gt; flag with emscripten.py, which tells it what headers to parse for constants (library.js needs to be aware of constants in your library headers, so that it is synchronized with them).&lt;/li&gt;&lt;/ul&gt;Please report bugs if you find them. If there are no show-stoppers, Emscripten 2.0 will be released soon.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2425595966420478205?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2425595966420478205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/10/llvm-svn-branch-has-been-merged.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2425595966420478205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2425595966420478205'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/10/llvm-svn-branch-has-been-merged.html' title='llvm-svn branch has been merged'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-3938929386651017682</id><published>2011-09-24T14:05:00.000-07:00</published><updated>2011-09-24T14:05:12.804-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><category scheme='http://www.blogger.com/atom/ns#' term='ammo.js'/><title type='text'>Road to Emscripten 2.0</title><content type='html'>Lots and lots of work has been taking place on emscripten (the LLVM-to-JS compiler). I haven't been breaking things out into smaller releases, instead, there will be a 2.0 release in the near future (last release was 1.5). The remaining issues before that are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fix any remaining regressions in the llvm-svn branch compared to the master branch, and merge llvm-svn to mastert. The llvm-svn branch uses LLVM's svn, which will soon become 3.0. Some of the code changes in LLVM have hurt our generated code, however most of the issues are now fixed. The latest update is a fix for exception handling which has led to a 5% smaller ammo.js build (compared to 2.9), with no speed decrease :)&lt;/li&gt;&lt;li&gt;Bundle headers with emscripten. As more people have begun to use emscripten, we have been seeing more issues with platform-specific problems, almost all due to using different system headers (for example, issues #82 and #85 on github). Bundling working headers will fix that, in a similar way as to how SDKs and NDKs typically bundle a complete build environment. Currently the plan is to use the newlib headers for libc and start from there.&lt;/li&gt;&lt;/ul&gt;As mentioned in a previous blog post, emscripten 2.0 will require LLVM 3.0, and will no longer officially support the deprecated llvm-gcc compiler (it might still work though). This is a significant change which may affect projects using emscripten, please let me know if you are aware of any issues there.&lt;br /&gt;&lt;br /&gt;Note also that I will be merging llvm-svn to master before LLVM 3.0 goes stable. That means that you will need to build LLVM from source at that time since there won't be LLVM binaries. Of course, you will still be able to use a previous revision of emscripten, that works with LLVM 2.9, with no issues.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-3938929386651017682?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/3938929386651017682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/09/road-to-emscripten-20.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3938929386651017682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3938929386651017682'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/09/road-to-emscripten-20.html' title='Road to Emscripten 2.0'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6125611947835127934</id><published>2011-09-09T19:42:00.000-07:00</published><updated>2011-09-09T19:42:07.074-07:00</updated><title type='text'>LLVM 3.0, llvm-svn Branch</title><content type='html'>LLVM 3.0 will probably be released in about a month. In preparation for that, I've gotten emscripten to work properly with LLVM svn in the llvm-svn branch.&lt;br /&gt;&lt;br /&gt;As in the past, I intend to only support one version of LLVM at a time, since it takes too much effort to do any more - our automatic tests already require several hours, doubling that for another LLVM version is a huge burden.&lt;br /&gt;&lt;br /&gt;With LLVM 3.0 it looks like llvm-gcc is pretty much obsoleted. It isn't being developed much, and remains on gcc 4.2 (I am guessing due to Apple's aversion to the GPL3?). There is Dragonegg, which is a plugin for recent GCC versions which uses LLVM as the backend, however as of 2.9 Dragonegg is not considered mature. I am not sure if 3.0 will be sufficiently stable or not.&lt;br /&gt;&lt;br /&gt;So, the question is what compilers to use with LLVM 3.0. Clang goes without saying. The good news is that Clang can finally build &lt;b&gt;all&lt;/b&gt; of the source code in the emscripten automatic tests which is very nice (although I did need to file a bug last week for libc++ - which is kind of ironic considering it's an LLVM project ;) but kudos to the LLVM people for the quick fix). As for other compilers, llvm-gcc seems of little importance if Clang can compile the same code, since llvm-gcc is deprecated. Dragonegg is interesting but not sure it makes sense to use it before it is fully ready - we might end up wasting a lot of time on bugs.&lt;br /&gt;&lt;br /&gt;So my current plan is to move to a single compiler, Clang, in the emscripten test suite. That is what is currently done in the llvm-svn branch. The main risk here is of code that gcc can compile but Clang cannot. Is anyone aware of any significant cases of that? In particular I am curious about Python, I have not tried to compile it with Clang yet (the emscripten test suite has a prebuilt .ll file - we should fix that).&lt;br /&gt;&lt;br /&gt;If no one raises any concerns about this plan, I'll merge the llvm-svn branch into master in the near future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6125611947835127934?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6125611947835127934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/09/llvm-30-llvm-svn-branch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6125611947835127934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6125611947835127934'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/09/llvm-30-llvm-svn-branch.html' title='LLVM 3.0, llvm-svn Branch'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2255396148794189824</id><published>2011-09-08T22:03:00.000-07:00</published><updated>2011-09-08T22:08:35.589-07:00</updated><title type='text'>The VTable Customization Hack</title><content type='html'>Recently my main focus in &lt;a href="http://emscripten.org/"&gt;emscripten&lt;/a&gt; (the LLVM-to-JavaScript compiler) has been on the &lt;b&gt;bindings generator&lt;/b&gt;: A tool to make it easy to use C++ code from within JavaScript. Why is this needed? Well, assume you have some C++ class,&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;class MyClass {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; MyClass();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; virtual void doSomething();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;};&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;The bindings generator will autogenerate bindings code so that you can do the following from JavaScript:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;var inst = new MyClass;&lt;br /&gt;inst.doSomething();&lt;/blockquote&gt;&lt;br /&gt;In other words, use that class from JavaScript almost as if it was a native JavaScript class.&lt;br /&gt;&lt;br /&gt;Turns out that really doing this is not easy to do ;) One issue is callbacks from C++ into JavaScript: Imagine that you compiled some C++ library into JavaScript, and at some point the C++ code will expect to receive an object on which is a virtual function, which it will call. The virtual function is a common design pattern where you can basically get a callback to your own code. Typically you would create a new subclass, implement that virtual function, create an instance, and pass it to the library. That function will then be called when needed from the library.&lt;br /&gt;&lt;br /&gt;Why is this difficult when mixing C++ and JavaScript? The main issue is that in C++ you would be creating those new classes and functions at compile time. But in JavaScript you are doing it at runtime. Creating a new class at runtime is not simple, but it was one option I considered. However compilation speed was too much of a concern. Instead, I went for a &lt;b&gt;vtable customization&lt;/b&gt; approach.&lt;br /&gt;&lt;br /&gt;The vtable of a class is a list of addresses to its virtual functions. Virtual functions at runtime work as follows: The code goes to the vtable, and to the proper index into it, loads the address, and calls that function. So by replacing the vtable you can change what gets called. However this still turned out to be fairly difficult. The reason is that the bindings code gets you into this situation:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;// 1: Original C++ code&lt;/b&gt;void MyClass::doSomething();&lt;br /&gt;&lt;br /&gt;&lt;b&gt;// 2: Autogenerated C++ bindings code&lt;/b&gt;&lt;br /&gt;void emscripten_bind_MyClass_doSomething(MyClass *self)&lt;br /&gt;{ self-&amp;gt;doSomething(); }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;// C++/JS barrier&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;// 3: Autogenerated JS bindings code&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;MyClass.prototype.doSomething = function() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; _emscripten_bind_MyClass_doSomething(this.ptr);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;// 4: Handwritten JS code&lt;/span&gt;&lt;/b&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;myClassInstance.doSomething();&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;The top layer is the original C++ code in the library you are compiling. Next is the generated C++ bindings code. This does almost nothing except for it being defined as "extern C", so that there is no C++ name mangling. Below that is the JS bindings code, which also seems fairly trivial here, but generally speaking it handles type conversions, object caching and a few other crucial things. Finally, at the bottom is the handwritten JS code you create yourself.&lt;br /&gt;&lt;br /&gt;So, the idea of the vtable customization hack is to receive a concrete object, then copy and modify its vtable, replacing functions as desired. The replacements can be native, normal JS functions, and presto: Your C++ library is calling back into your handwritten JS code. However, how do you modify the vtable, exactly? When your handwritten code wants to modify it, what it specifies is code on the third level, something like this:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;customizeVTable(myClassInstance, [{&lt;br /&gt;&amp;nbsp; original: MyClass.prototype.doSomething,&lt;br /&gt;&amp;nbsp; replacement: function() { print('hello world!') }&lt;br /&gt;}]);&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Here we want to replace doSomething with a custom JS function. But what appears in the vtable is not the third-layer function specified here. It isn't even the second-layer function! It's the first-layer one. How can you get to there, from here..?&lt;br /&gt;&lt;br /&gt;A natural idea is to add something to the second layer,&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;// 2: Autogenerated C++ bindings code&lt;/b&gt;&lt;br /&gt;void emscripten_bind_MyClass_doSomething(MyClass *self)&lt;br /&gt;{ self-&amp;gt;doSomething(); }&lt;br /&gt;void *emscripten_bind_MyClass_doSomething_addr = &amp;amp;MyClass:doSomething;&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;- basically, have the address of the function in the bindings code. You can then read it at runtime and use that.&lt;/span&gt; But there are a few problems here. The first is that this code won't compile! The right-hand-side is a two-part pointer, consisting of a class and an representation of the function in the class. You can't convert that to void* (well, GCC will let you, but it won't work). Even if you do get around the compilation issue, though, you will be left with that representation of the function. I had hoped it was a simple offset into the vtable - but it isn't, at least not in Clang. After some mucking around with trying to figure out what in the world it was, I realized there was a better solution anyhow, because of the other reason that this approach is a bad idea: This approach forces you to add a lot of bindings code, a little for every single function. That's a lot of overhead, considering you will likely use that information for very few functions!&lt;br /&gt;&lt;br /&gt;So instead, I arrived at the following hack:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add a terminating 0 to all vtables at compile time. (This adds some overhead, but there is one vtable per class, and it's just one 32-bit value for each).&lt;/li&gt;&lt;li&gt;Copy the object's vtable.&lt;/li&gt;&lt;li&gt;Replace all the vtable elements with 'canary functions', that report back to you with their index in the vtable.&lt;/li&gt;&lt;li&gt;Call the function you want to replace, through the third-layer function you have available in JavaScript.&lt;/li&gt;&lt;li&gt;Since you replaced the entire vtable, you end up calling one of those. The canary function then reports back by setting a value. That value is the index of the function you want to replace in the vtable.&lt;/li&gt;&lt;li&gt;Copy the vtable again, this time the only modification is to replace the function at the index that you just found with the replacement function you want run instead.&lt;/li&gt;&lt;li&gt;(There are some additional complications, for example due to how emscripten handles C++ function pointers in JavaScript - pointers to functions are just integers, like all pointers, so there is a lookup table to map them to actual JS functions. Another issue is that the third-layer JS bindings code will try to convert types, and if you pass it the wrong things it will fail, so calling the canaries must be done very carefully. But the description above is the main idea.)&lt;/li&gt;&lt;/ul&gt;This ends up working properly. You can see the code in tools/bindings_generator.js (search for customizeVTable), and you can see it used in the latest version of &lt;a href="https://github.com/kripken/ammo.js"&gt;ammo.js&lt;/a&gt; (the README there has been updated with documentation for it).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2255396148794189824?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2255396148794189824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/09/vtable-customization-hack.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2255396148794189824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2255396148794189824'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/09/vtable-customization-hack.html' title='The VTable Customization Hack'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-256522970969908319</id><published>2011-08-11T20:53:00.000-07:00</published><updated>2011-08-11T21:11:15.426-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bullet'/><category scheme='http://www.blogger.com/atom/ns#' term='ammo.js'/><title type='text'>Rewritten Physics Engine Demo</title><content type='html'>Initial testing of &lt;a href="https://github.com/kripken/ammo.js"&gt;ammo.js&lt;/a&gt; (a port of Bullet Physics to JavaScript using Emscripten) found some issues, but they have been quickly resolved. ammo.js should be ready for use now.&lt;br /&gt;&lt;br /&gt;Completing that allowed me to rewrite the original Emscripten Bullet demo using ammo.js. That is, the original demo code - creating the scene and so forth - was written in C++, and was compiled alongside Bullet into JavaScript for the original demo. What I did now was to write the scene generating code in JavaScript, where it uses Bullet through ammo.js's autogenerated bindings. Check out the &lt;a style="font-weight: bold;" href="http://syntensity.com/static/ammo.html"&gt;demo here&lt;/a&gt;, and read the JavaScript embedded in the HTML file to see a complete example of using ammo.js.&lt;br /&gt;&lt;br /&gt;I'm very happy with the result: The JavaScript code in the demo is very nice to work with now, and in addition it outperforms the original demo due to build system improvements that were completed since the original demo was finished.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-256522970969908319?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/256522970969908319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/08/rewritten-physics-engine-demo.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/256522970969908319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/256522970969908319'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/08/rewritten-physics-engine-demo.html' title='Rewritten Physics Engine Demo'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1657231558478955593</id><published>2011-08-08T18:59:00.000-07:00</published><updated>2011-08-11T20:53:27.046-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ammo.js'/><title type='text'>ammo.js - Ready for Testing!</title><content type='html'>After months of work, &lt;a style="font-weight: bold;" href="https://github.com/kripken/ammo.js"&gt;ammo.js&lt;/a&gt; (the Bullet physics engine compiled to JavaScript using Emscripten) is now ready for testing. To do that, grab &lt;span style="font-family:courier new;"&gt;builds/ammo.js&lt;/span&gt;, and look at &lt;span style="font-family:courier new;"&gt;examples/hello_world.js&lt;/span&gt; for a code example.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;examples/hello_world.js&lt;/span&gt; is almost a 1 to 1 manual translation of &lt;span style="font-family:courier new;"&gt;HelloWorld.cpp&lt;/span&gt; (which you can find in &lt;span style="font-family:courier new;"&gt;bullet/Demos/HelloWorld/HelloWorld.cpp&lt;/span&gt;). That is possible since the ammo.js bindings let you write very natural JavaScript, for example this C++ code&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;btTransform groundTransform;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;groundTransform.setIdentity();&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;becomes this JavaScript code&lt;br /&gt;&lt;div class="line" id="LC21"&gt;&lt;span class="kd"&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div class="line" id="LC21"  style="font-family:courier new;"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;groundTransform&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;btTransform&lt;/span&gt;&lt;span class="p"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="line" id="LC22"&gt;&lt;span class="nx"  style="font-family:courier new;"&gt;groundTransform&lt;/span&gt;&lt;span class="p"  style="font-family:courier new;"&gt;.&lt;/span&gt;&lt;span class="nx"  style="font-family:courier new;"&gt;setIdentity&lt;/span&gt;&lt;span class="p"&gt;&lt;span style="font-family:courier new;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div class="line" id="LC22"&gt;&lt;span class="p"&gt;There are some limitations to the automatically generated bindings code (see the ammo.js README for more details), but overall it basically works.&lt;br /&gt;&lt;br /&gt;This is the result of a lot of &lt;a href="http://pyppet.blogspot.com/2011/07/c-wrapper-generator-part1.html"&gt;hard work&lt;/a&gt; by bretthart on &lt;a href="http://sourceforge.net/projects/cppheaderparser/"&gt;CppHeaderParser&lt;/a&gt; and by me on the bindings generator in Emscripten that uses it. Turns out it's pretty hard to automatically generate bindings from C++ to JavaScript, who would have thought ;) In any case we appear to have things in good shape now. I will probably write a separate blogpost about the bindings methodology later on.&lt;br /&gt;&lt;br /&gt;The speed of ammo.js should be fairly decent, most optimizations are applied to the underlying Bullet code except for the LLVM ones and for typed arrays. However the binding code itself is not optimized at all yet. Overall things should be fast enough for testing, with some additional speedups still possible later on.&lt;br /&gt;&lt;br /&gt;Please test ammo.js and file issues on github :)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1657231558478955593?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1657231558478955593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/08/ammojs-ready-for-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1657231558478955593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1657231558478955593'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/08/ammojs-ready-for-testing.html' title='ammo.js - Ready for Testing!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-617254246286348648</id><published>2011-07-31T11:15:00.000-07:00</published><updated>2011-07-31T11:38:52.051-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 1.5!</title><content type='html'>Version 1.5 of &lt;a href="http://emscripten.org"&gt;Emscripten&lt;/a&gt;, the LLVM to JavaScript compiler, is out. Lots of new stuff:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A &lt;a style="font-weight: bold;" href="http://syntensity.com/static/espeak.html"&gt;Text-to-Speech demo&lt;/a&gt; using &lt;a href="http://espeak.sourceforge.net/"&gt;eSpeak&lt;/a&gt;. Not much had to be done to get this to work, a few library functions were missing but that is pretty much it. I did need to bundle getopt and strtok C sources in the project though. Also, I had to use typed arrays type 2, since the eSpeak source code is not as platform independent as we would like (so this ended up being a good test of typed arrays 2 actually). For more details, source code etc., see the demo page.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;max99x has written a nice &lt;a style="font-weight: bold;" href="https://github.com/kripken/emscripten/wiki/Filesystem-Guide"&gt;Filesystem API&lt;/a&gt;. See that link for documentation. It makes the emulated filesystem much more flexible and useful. The text-to-speech demo uses it, as do all the automatic tests. Aside from the API itself, this update comes with a ton of library additions for IO related things.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;max99x also wrote parsing code to detect field names in LLVM metadata. This lets you use the original C/C++ field names in your JavaScript, so integrating compiled code and JavaScript becomes much easier. I am thinking about extending this for use in the bindings generator.&lt;/li&gt;&lt;li&gt;Speaking of the bindings generator, it has seen a lot of work and things are finally starting to run with Bullet, at least a 'hello world' of creating a btVector3. There is still some work ahead before it is finished, not sure how much.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-617254246286348648?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/617254246286348648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/07/emscripten-15.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/617254246286348648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/617254246286348648'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/07/emscripten-15.html' title='Emscripten 1.5!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-4144112657059734359</id><published>2011-07-10T10:55:00.000-07:00</published><updated>2011-07-10T16:15:30.717-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 1.4!</title><content type='html'>Version 1.4 of &lt;a href="http://emscripten.org/"&gt;Emscripten&lt;/a&gt;, the open source LLVM to JavaScript compiler, has been released.&lt;br /&gt;&lt;br /&gt;Some significant improvements this time, including&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Support for compiling and loading dynamic libraries&lt;/span&gt;, thanks to max99x for writing this very useful (and not easy to write!) feature. You can now compile a module as a shared library, and load it from your main compiled script just like you would load a normal shared library in native code, using dlopen() and so forth. This can potentially be very useful, both in not needing to rewrite code that is already split up into modules, and also in that it lets you load the main module quickly since other stuff is split out into other files, which can be loaded later on demand. I hope to see a demo of this up soon.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Automatic bindings generation&lt;/span&gt;. Until now, you could compile a C or C++ library and run it on the web, but using it from normal JavaScript was clunky. Thankfully bretthart pointed me &lt;span style="text-decoration: underline;"&gt;&lt;/span&gt; to &lt;a href="http://sourceforge.net/projects/cppheaderparser/"&gt;CppHeaderParser&lt;/a&gt;, a pure Python C++ header parser, which Emscripten can now use to generate bindings (for more details on the header parser, &lt;a href="http://pyppet.blogspot.com/2011/07/c-wrapper-generator-part1.html"&gt;see here&lt;/a&gt;). The result is a set of JavaScript objects that wrap the compiled C++ code, so you can write quite natural JavaScript code to access them, for example, &lt;span style="font-family: courier new;"&gt;var inst = new CppClass()&lt;/span&gt; to create an instance, &lt;span style="font-family: courier new;"&gt;inst.doSomething()&lt;/span&gt; to call a function, etc. A lot of basic stuff already works (see part 2 of test_scriptaclass), I am currently investigating the use of this with Bullet in ammo.js, hopefully I will succeed there and have a more detailed blogpost afterwards.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Library stuff&lt;/span&gt;, lots of fixes and additions there, thanks to max99x and timdawborn.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-4144112657059734359?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/4144112657059734359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/07/emscripten-14.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4144112657059734359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4144112657059734359'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/07/emscripten-14.html' title='Emscripten 1.4!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8101490227753602056</id><published>2011-06-22T19:47:00.001-07:00</published><updated>2011-06-22T20:55:36.116-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 1.3!</title><content type='html'>Version 1.3 of &lt;a href="http://emscripten.org"&gt;Emscripten&lt;/a&gt;, the open source LLVM to JavaScript compiler, has been released.&lt;br /&gt;&lt;br /&gt;No new demo this time, sorry. However the &lt;a href="http://syntensity.com/static/python.html"&gt;Python demo&lt;/a&gt; has been updated to improve performance and enable raw_input to work (it prompts for input using window.prompt). Press 'execute' in the demo to see it work.&lt;br /&gt;&lt;br /&gt;Main updates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support for a new usage of typed arrays, TA2. In TA2, a single shared buffer is used, and int8, int32 etc. are all accessed through views into that buffer. The main benefit here is memory usage - this mode takes much less memory than TA1 (the original typed array usage), and in most cases probably less than the non-typed array case.&lt;br /&gt;&lt;br /&gt;In theory, this can also be faster. However that doesn't appear to be the case in my benchmarks, due to the need to divide pointers by 2 or 4 constantly (pointers are raw addresses, while indexes into typed arrays take into account the size of the element. int32vec[1] is at address 4!), and since JS engines still do not heavily optimize typed arrays.&lt;br /&gt;&lt;br /&gt;One thing you can do, though, is use dangerous nonportable LLVM optimizations with TA2. TA2 lets you write an int and read the first character, and get the 'right' result. Of course 'right' will depend on the endianness, so this is very dangerous and not recommended. However you can compile two versions, one for each endianness. This can potentially be faster.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some relooper optimizations were done, which gave us a nice speed improvement. I'll probably do a full blogpost on performance issues, but to briefly summarize, we seem to be getting close to the speed of handwritten JS code, which is to say, as fast as we can probably get. In absolute terms, compared to gcc -O3 (the fastest native code), we are around 5X slower (on the latest development versions of SpiderMonkey and V8). But there is a big spread: In raw numeric processing we are often just 2-3X slower, which is about the same as Scala, Haskell, and Mono, but certain other operations are costlier and in some benchmarks we are up to 10X slower.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Other news:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Still hoping for people to help out with OpenGL/WebGL stuff. Please step up! I don't know what to do there myself.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Next main project for me personally will probably be better tools to integrate compiled code with normal JS code. One option is to use SWIG to generate bindings. We could then compile a C++ library and use it in a natural way on the web, which would be very cool. If you know SWIG, or don't but want to see this happen (like me ;) then please get in touch.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I had some discussions with people interested in compiling certain large projects to the web, for example Second Life and Mono. Both have significant technical difficulties (rendering and networking for Second Life, the non-existence of an interpreter and the limitations of mono-llvm in Mono), but if the people interested in each are serious enough to do the work to overcome the respective difficulties, I have promised to do the raw C++ to JS conversion for each of those projects. Hopefully cool things will happen here.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8101490227753602056?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8101490227753602056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/06/emscripten-13.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8101490227753602056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8101490227753602056'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/06/emscripten-13.html' title='Emscripten 1.3!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7310480287878850329</id><published>2011-05-31T18:42:00.000-07:00</published><updated>2011-05-31T20:55:32.884-07:00</updated><title type='text'>Followup to Doom on the Web</title><content type='html'>The &lt;a href="https://developer.mozilla.org/en-US/demos/detail/doom-on-the-web/"&gt;&lt;span style="font-weight: bold;"&gt;Doom on the Web&lt;/span&gt;&lt;/a&gt; demo has been viewed over 35,000 times so far. Based on the responses, I'd like to clarify some things that I should have mentioned before (sorry for not doing so).&lt;br /&gt;&lt;br /&gt;First off, I should have linked to the &lt;a href="https://developer.mozilla.org/media/uploads/demos/a/z/azakai/487d42c2ecc1627745a469861bd377e2/doom-on-the-web_1306727266_demo_package/details.html"&gt;details page&lt;/a&gt; more clearly. It explains a bit about the demo, where it is currently known to work, etc.&lt;br /&gt;&lt;br /&gt;Now, to the main issue: This demo is &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; a good benchmark of anything. The goal here was not to run a version of Doom with good performance, but to run &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;DOOM&lt;/span&gt;&lt;/span&gt; itself, the original, with as few changes as possible, on the web. I made &lt;span style="font-weight: bold;"&gt;no&lt;/span&gt; effort to optimize the code, which was written and heavily optimized for a completely different architecture (it uses fixed-point arithmetic! :) I wasn't sure if it would be playable at all.&lt;br /&gt;&lt;br /&gt;That is, the point of the demo is, "Doom can be run, with hardly any modifications, on the web." Showing that sounded like a cool thing to do, so I spent several evenings and a weekend or two on it.&lt;br /&gt;&lt;br /&gt;As for frame rates, Doom &lt;span style="font-weight: bold;"&gt;caps&lt;/span&gt; them at 35 - you won't see it get any better than that, simply because of how the main loop works (and as mentioned before, I didn't try to improve it). It will also max out your CPU, even if it doesn't need to, for the same reasons. It might be possible to optimize this with some modifications to the Doom source code, but I didn't look into that. So, if you are seeing 35fps and 100% CPU, that doesn't mean your machine is actually working hard to generate it.&lt;br /&gt;&lt;br /&gt;For example, I get close to 35fps on a slow 1.2GHz laptop. A modern machine would probably be able to get over 100fps with a proper main loop. And again, even this is not a fair measure of how fast Doom &lt;span style="font-weight: bold;"&gt;could&lt;/span&gt; be, if it were actually optimized for JavaScript. So please don't run this demo, be disappointed by the speed, and say "JavaScript is too slow, we need Flash/NaCl/Java/native apps" etc. The demo can't be used to conclude anything like that. Valid benchmarks (which this demo is not) show that JavaScript is quite fast, and getting faster more quickly than any other language - something that shouldn't be surprising, given that it probably has the most developer effort put into it, these days.&lt;br /&gt;&lt;br /&gt;I hope the above explains what frame rates in the demo actually mean (that is, almost nothing). Now, aside from that, some people said the demo was very slow for them. I suspect that depends on the browser, as both Firefox and Safari play it very speedily even on older machines (as I mentioned earlier, my old laptop at 1.2GHz runs it well on FF7). On the other hand, Opera runs it slowly, while Chrome is unplayable (I reported the issue to them, and am doing my best to help figure it out). So, performance depends on the browser. That's disappointing, clearly, but that is another point of this demo - to push the limits, and hopefully to motivate JavaScript engine devs to fix whatever bugs are in the way, and be even faster and more awesome.&lt;br /&gt;&lt;br /&gt;P.S. I apologize for the quality of sound in the demo. I never used any audio generating API before, and I still don't know what the numbers I am passing from Doom to the Audio Data API actually mean ;) I basically just hacked together something quickly, got it to the point it is in the demo, and stopped there. Someone that knows this stuff could probably make it sound right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7310480287878850329?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7310480287878850329/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/05/followup-to-doom-on-web.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7310480287878850329'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7310480287878850329'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/05/followup-to-doom-on-web.html' title='Followup to Doom on the Web'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2265356259803870255</id><published>2011-05-30T11:10:00.000-07:00</published><updated>2011-05-30T15:10:01.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ammo.js'/><title type='text'>ammo.js: Bullet on the Web</title><content type='html'>We already had a demo of the &lt;a href="http://www.syntensity.com/static/bullet.html"&gt;Bullet physics engine in JavaScript&lt;/a&gt; a while ago. People asked for an easier way to use it, so I set up &lt;a style="font-weight: bold;" href="https://github.com/kripken/ammo.js"&gt;ammo.js&lt;/a&gt;, a separate project to port Bullet to the web.&lt;br /&gt;&lt;br /&gt;The starting point is Bullet compiled to JavaScript using Emscripten, and the main challenge is to make a friendly API for JavaScript applications to use. See Issue #1 in that github repo, we are currently looking for ideas and help in doing this. Discussion also takes place on Emscripten's IRC channel (#emscripten on irc.mozilla.org).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2265356259803870255?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2265356259803870255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/05/ammojs-bullet-on-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2265356259803870255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2265356259803870255'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/05/ammojs-bullet-on-web.html' title='ammo.js: Bullet on the Web'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-590018381820137005</id><published>2011-05-30T10:19:00.000-07:00</published><updated>2011-05-30T14:50:35.413-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 1.2, Doom on the Web</title><content type='html'>Emscripten, the LLVM to JavaScript compiler, is now at version 1.2. The main updates in this release were to enable this demo of &lt;a href="https://developer.mozilla.org/en-US/demos/detail/doom-on-the-web"&gt;&lt;span style="font-weight: bold;"&gt;Doom on the Web&lt;/span&gt;&lt;/a&gt; - a playable version of the classic game Doom, compiled from C to JavaScript and rendering using Canvas.&lt;br /&gt;&lt;br /&gt;The demo is known to work on Firefox and Safari. It works, but slowly, on Opera. I can't get it to run properly in Chrome due to &lt;a href="http://code.google.com/p/v8/issues/detail?id=947"&gt;a problem with V8&lt;/a&gt;. I have no idea if it runs on IE9, since I don't have a Windows machine, but since IE9 has a fast JS engine and supports canvas, it should (please let me know if you try it there). &lt;span style="font-weight: bold; font-style: italic;"&gt;Edit&lt;/span&gt;&lt;span style="font-style: italic;"&gt;: Here's a &lt;/span&gt;&lt;a style="font-style: italic;" href="http://www.youtube.com/watch?v=WDUPZRQf7oc"&gt;screencast of the demo&lt;/a&gt;&lt;span style="font-style: italic;"&gt; running on Firefox Nightly if you can't run it yourself.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Highlights of Emscripten 1.2:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Many improvements to Emscripten's implementation of the SDL API in JavaScript, including support for color palettes (Doom uses a 256-color palette), input events (we translate normal web keyboard events into their SDL forms), and audio (for now, just using the Mozilla Audio Data API - it's the most straightforward API at this point. Patches are welcome for other ones).&lt;/li&gt;&lt;li&gt;Many improvements to the CHECK_* and CORRECT_* options, which are very important for generating optimized code using Emscripten. In particular, there is a new AUTO_OPTIMIZE option which will output a summary of which checks ran how any times, and how many of those checks failed, giving you a picture of which lines are important to be optimized, and which can be.&lt;/li&gt;&lt;li&gt;Some additional experimental work is ongoing about supporting OpenGL in WebGL. I don't know either OpenGL or WebGL very well, I'm learning as I go, and I'm not sure how feasible this project is. If you can help here, please do!&lt;/li&gt;&lt;li&gt;Various bug fixes. Thanks to all the people that submitted bug reports. In addition compiling Doom uncovered a few small bugs, for example we were not doing bit shifts on 64-bit integers properly.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-590018381820137005?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/590018381820137005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/05/emscripten-12-doom-on-web.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/590018381820137005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/590018381820137005'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/05/emscripten-12-doom-on-web.html' title='Emscripten 1.2, Doom on the Web'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-3907205633515465549</id><published>2011-05-01T18:27:00.000-07:00</published><updated>2011-05-01T19:24:52.228-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 1.1!</title><content type='html'>&lt;a href="http://emscripten.org/"&gt;Emscripten&lt;/a&gt; is an LLVM to JavaScript compiler, allowing you to run code written in C or C++ on the web. I released version 1.1 today, with the following updates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A much improved &lt;a style="font-weight: bold;" href="http://syntensity.com/static/bullet.html"&gt;Bullet demo&lt;/a&gt; - check it out! This version is much faster. The main differences are use of memory compression (see below), LLVM optimizations, and CubicVR.js for rendering.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;QUANTUM_SIZE == 1, a.k.a memory compression. This is an advanced, and somewhat risky, optimization technique. I see speedups of around 25%, but take note, this must be used carefully. See the &lt;a href="https://github.com/kripken/emscripten/wiki/Memory-compression"&gt;docs&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Dead function elimination tool: A Python script that scrubs an .ll file to remove unneeded functions. This is useful to reduce the size of the generated code and speed up compilation. Note though that if you want to compile a library, then this tool will remove functions that you probably want left in - it removes everything that cannot be reached by main(). The test runner now uses this by default.&lt;/li&gt;&lt;li&gt;Various performance improvements and bug fixes.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-3907205633515465549?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/3907205633515465549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/05/emscripten-11.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3907205633515465549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3907205633515465549'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/05/emscripten-11.html' title='Emscripten 1.1!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8248180398731138144</id><published>2011-04-10T15:28:00.000-07:00</published><updated>2011-04-10T16:03:50.593-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten Moves to GitHub</title><content type='html'>After starting on Google Code, and later adding a git mirror, Emscripten has now moved entirely &lt;a style="font-weight: bold;" href="https://github.com/kripken/emscripten"&gt;to GitHub&lt;/a&gt;. &lt;span style="font-family: courier new;"&gt;emscripten.org&lt;/span&gt; and so forth should now forward to there.&lt;br /&gt;&lt;br /&gt;The main reason for the change is the inconvenience in maintaining two clones. hg-git helped greatly, &lt;a href="http://syntensity.blogspot.com/2011/02/synchronizing-git-mirror-with-hg-git.html"&gt;but it remained a constant hassle&lt;/a&gt;. Meanwhile GitHub has been getting more popular and more useful. The last straw was GitHub's recent addition of a &lt;a href="https://github.com/blog/831-issues-2-0-the-next-generation"&gt;much nicer issue tracker&lt;/a&gt;. So I decided to make the move today, which coincides nicely with the &lt;a href="http://syntensity.blogspot.com/2011/04/emscripten-10.html"&gt;release of Emscripten 1.0&lt;/a&gt;: A fresh start on the road ahead to 2.0.&lt;br /&gt;&lt;br /&gt;Code will not be updated in the Google Code page anymore, and I pushed a final commit there to warn people they are running old code if they get there by mistake. I moved the important wiki pages to GitHub, which leaves only one thing left behind, the open issues. If you have an open issue on Google Code that you care about, please either open a new issue on GitHub for it, or tell me and I'll do it for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8248180398731138144?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8248180398731138144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/04/emscripten-moves-to-github.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8248180398731138144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8248180398731138144'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/04/emscripten-moves-to-github.html' title='Emscripten Moves to GitHub'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5190252268752378588</id><published>2011-04-09T13:34:00.000-07:00</published><updated>2011-04-10T13:41:30.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 1.0!</title><content type='html'>It's been almost a year since I started Emscripten (which, if you haven't heard of it, is a tool to compile LLVM to JavaScript), during which it took up much of my spare time. So I am very pleased to announce that today Emscripten has reached the 1.0 milestone. This release comes with a &lt;a style="font-weight: bold;" href="http://syntensity.com/static/poppler.html"&gt;demo of rendering PDFs on the web&lt;/a&gt; (warning: that page downloads &amp;gt;12MB, since it includes Poppler and FreeType. It's like downloading an entire desktop app, almost).&lt;br /&gt;&lt;br /&gt;Other highlights in this release:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Very significant optimization of memory use in the compiler. This was necessary for the PDF demo to build, since it is far larger than previous demos.&lt;/li&gt;&lt;li&gt;Full support for the recently released LLVM 2.9.&lt;/li&gt;&lt;li&gt;The &lt;a href="https://github.com/kripken/emscripten/blob/8a6e2d67c156d9eaedf88b752be4d1cf4242e088/docs/paper.pdf?raw=true"&gt;Emscripten documentation paper&lt;/a&gt; is finished. It explains how Emscripten works, so you might be interested in it if you care what Emscripten does under the hood (but if you just want to use Emscripten you don't need to read it).&lt;/li&gt;&lt;/ul&gt;Overall Emscripten is now in very good shape. It can probably compile most any C/C++ project out there, subject to some limitations (like JS not allowing C-style multithreading). At times some manual intervention is needed, like changing the project's settings so it doesn't generate inline assembly, and of course bugs probably still exist, but recently the code I have compiled has tended to just work (hence the rate of commits has greatly decreased recently).&lt;br /&gt;&lt;br /&gt;The speed of the generated code can be quite good. By default Emscripten compiles with very conservative settings, so the code will be slow, but &lt;a href="http://code.google.com/p/emscripten/wiki/OptimizingCode"&gt;optimizing the code&lt;/a&gt; is not that hard to do. Optimized code tends to run around 10x slower than gcc -O3, which is obviously not great, but on the other hand fairly decent and more than good enough for many purposes. And of course, that ratio will improve along with advancements in JavaScript engines, LLVM, and the Closure Compiler.&lt;br /&gt;&lt;br /&gt;So, Emscripten 1.0 is in my opinion pretty solid. There are no major outstanding bugs, and no major missing features. (But I do have plans for some major improvements, which are difficult, but should end up with code that runs at least twice as fast.) Now that Emscripten is at 1.0, I am hoping to see it used in more places. I'm starting to propose at Mozilla that we use it in various ways, and also I'd love to see things like GTK or Qt ported to the web - if anyone wants to collaborate on that, let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5190252268752378588?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5190252268752378588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/04/emscripten-10.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5190252268752378588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5190252268752378588'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/04/emscripten-10.html' title='Emscripten 1.0!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5838411261218375796</id><published>2011-03-19T10:02:00.000-07:00</published><updated>2011-03-19T10:10:35.419-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='llvm'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten moving to LLVM 2.9</title><content type='html'>LLVM 2.9 will be released very soon, and Emscripten has just been updated to support it.&lt;br /&gt;&lt;br /&gt;Emscripten has a lot of automatic tests - they take over 2 hours to run on my laptop - so I won't be running tests for LLVM 2.8 anymore (that would double the time the tests take). Until LLVM 2.9 is formally released with binary builds, you can build LLVM from svn source (the instructions on the Emscripten wiki are useful), or use LLVM 2.8 with Emscripten 0.9 (the last release of Emscripten that supports 2.8).&lt;br /&gt;&lt;br /&gt;If you do build LLVM 2.9 and put it in a different location than 2.8 was, don't forget to update your ~/.emscripten file so it uses the version you want. Also, if you update LLVM to 2.9 and want to use llvm-gcc, you need to update that to their current svn as well.&lt;br /&gt;&lt;br /&gt;There were not a lot of changes for Emscripten to support 2.9, so it is possible 2.8 will still work. But as mentioned above, I am not testing it, so I can't say for sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5838411261218375796?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5838411261218375796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/03/emscripten-moving-to-llvm-29.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5838411261218375796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5838411261218375796'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/03/emscripten-moving-to-llvm-29.html' title='Emscripten moving to LLVM 2.9'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7046727466201028344</id><published>2011-03-06T11:20:00.000-08:00</published><updated>2011-03-06T11:28:29.763-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Puzzles on the Web</title><content type='html'>Check out this &lt;a href="http://paddavis.s3-website-us-east-1.amazonaws.com/jspuzzles/"&gt;&lt;span style="font-weight: bold;"&gt;very cool port&lt;/span&gt;&lt;/a&gt; of &lt;a href="http://www.chiark.greenend.org.uk/%7Esgtatham/puzzles/"&gt;Simon Tatham's Portable Puzzle Collection&lt;/a&gt; to the web, by Jacques Le Roux, using Emscripten.&lt;br /&gt;&lt;br /&gt;Nice quote from there:&lt;br /&gt;&lt;blockquote&gt;This was basically just an experiment to see how hard it would        be to port C code to a web application running entirely on the        client (turns out not that hard).&lt;br /&gt;&lt;/blockquote&gt;:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7046727466201028344?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7046727466201028344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/03/puzzles-on-web.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7046727466201028344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7046727466201028344'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/03/puzzles-on-web.html' title='Puzzles on the Web'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2483185323032859367</id><published>2011-03-05T19:36:00.000-08:00</published><updated>2011-03-05T19:50:15.289-08:00</updated><title type='text'>Emscripten 0.9!</title><content type='html'>The demo this time is &lt;a href="http://syntensity.com/static/openjpeg.html"&gt;&lt;span style="font-weight: bold;"&gt;OpenJPEG: JPEG 2000 decoding in JavaScript&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Aside from OpenJPEG, lots of stuff in this release, including&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Line number debugging&lt;/span&gt;: Emscripten can optionally add the original source file and line to the generated JavaScript (if you compiled the source using '-g'). Useful for debugging when things go wrong, especially with the new &lt;span style="font-weight: bold;"&gt;autodebugger tool&lt;/span&gt;, which rewrites an LLVM bitcode file to add printouts of every store to memory. Figuring out why generated code doesn't work is then as simple as running that same code in lli (the LLVM interpreter) and in JavaScript, and diff'ing the output, then seeing which original source code line is responsible.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Line-specific CORRECT'ing&lt;/span&gt;: The main speed issue with Emscripten is that JavaScript and C have different semantics. For example, -5/2 in C is -2, while +5/2 is +2, whereas in JavaScript, naive division gives floating point numbers, but worse, there is no single operator that will create the same behavior as C (Math.floor on -5/2 gives -3, and Math.ceil on +5/2 gives +3). So in this example (unless we have a trick we can use, like |0 if the value is 32-bit and signed), we must check the sign of the value, and round accordingly - and that is slow. Similar things happen not just in rounding, but also with signedness and numerical overflows, and therefore Emscripten has the CORRECT_SIGNS, CORRECT_OVERFLOWS and CORRECT_ROUNDINGS options.&lt;br /&gt;&lt;br /&gt;With line-specific correcting in the 0.9 release, you can find out which lines actually run into such problems, and tell Emscripten to generate the 100% correct code only in them. Most of the time, the slow and correct code isn't needed, so this option is very useful. I will write a wiki page soon to give more examples of how to use it to optimize the generated code (meanwhile, check out the &lt;span style="font-weight: bold;"&gt;linespecific&lt;/span&gt; test).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;20% faster compilation&lt;/span&gt;, mainly from optimizing the analyzer pass.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Strict mode JavaScript&lt;/span&gt;. The compiler will now generate &lt;a href="http://hacks.mozilla.org/2011/01/ecmascript-5-strict-mode-in-firefox-4/"&gt;strict mode JavaScript&lt;/a&gt;, which is simpler, less bug-prone, and in the future will allow JS engines to run it more quickly.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2483185323032859367?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2483185323032859367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/03/emscripten-09.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2483185323032859367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2483185323032859367'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/03/emscripten-09.html' title='Emscripten 0.9!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-3659387720460465397</id><published>2011-02-12T17:02:00.001-08:00</published><updated>2011-02-12T17:09:43.491-08:00</updated><title type='text'>Synchronizing a git mirror with hg-git</title><content type='html'>Posting this since it might save someone else the time it took me to figure out.&lt;br /&gt;&lt;br /&gt;There are several tutorials for creating a git repo from an hg one using hg-git. But none of them go much into how to keep the git repo up to date when the hg one changes (assuming work is done in the hg repo). And, just doing a push with hg-git to github fails... silently :( (But it succeeded the first time, to create the repo.) Even adding &lt;span style="font-weight: bold;"&gt;-v --debug&lt;/span&gt; in hopes of getting some useful information is no help.&lt;br /&gt;&lt;br /&gt;The solution is to push to a local git repo first, then push from there to github. But even pushing to a local git repo won't just work - you will get&lt;br /&gt;&lt;blockquote&gt;error: refusing to update checked out branch: refs/heads/master&lt;br /&gt;error: By default, updating the current branch in a non-bare repository&lt;br /&gt;error: is denied, because it will make the index and work tree inconsistent&lt;br /&gt;error: with what you pushed,&lt;br /&gt;&lt;/blockquote&gt;To get around that, create another branch in the local git repo (&lt;span style="font-weight: bold;"&gt;git branch side&lt;/span&gt;), switch to it (&lt;span style="font-weight: bold;"&gt;git checkout side&lt;/span&gt;), then push to it using hg-git. Then switch back to master (&lt;span style="font-weight: bold;"&gt;git checkout master&lt;/span&gt;) and finally push that to github.&lt;br /&gt;&lt;br /&gt;I think it might also work to make the local git repo into a bare repo, but the above worked for me so I stopped there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-3659387720460465397?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/3659387720460465397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/02/synchronizing-git-mirror-with-hg-git.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3659387720460465397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3659387720460465397'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/02/synchronizing-git-mirror-with-hg-git.html' title='Synchronizing a git mirror with hg-git'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-9177035484406823680</id><published>2011-02-11T17:50:00.000-08:00</published><updated>2011-02-11T18:01:06.123-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Git Mirror for Emscripten</title><content type='html'>We now have a &lt;strong&gt;&lt;a href="https://github.com/kripken/emscripten" rel="nofollow"&gt;git mirror&lt;/a&gt;&lt;/strong&gt; on GitHub! Getting the Emscripten code is now as easy as&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 11.1111px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;b&gt;git clone git://github.com/kripken/emscripten.git&lt;/b&gt;&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Code will be mirrored there, so you can either use git with that GitHub repo, or hg with the Google Code repo, and the result will be the same. (However for project stuff - issues, wiki, etc. - we will continue to use the Google Code project page.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-9177035484406823680?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/9177035484406823680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/02/git-mirror-for-emscripten.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/9177035484406823680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/9177035484406823680'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/02/git-mirror-for-emscripten.html' title='Git Mirror for Emscripten'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-3521707866386760244</id><published>2011-02-08T19:17:00.000-08:00</published><updated>2011-02-08T19:18:58.058-08:00</updated><title type='text'>FreeType Demo</title><content type='html'>A simple demo of FreeType in JavaScript can be seen &lt;a style="font-weight: bold;" href="http://www.syntensity.com/static/freetype.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-3521707866386760244?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/3521707866386760244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/02/freetype-demo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3521707866386760244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3521707866386760244'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/02/freetype-demo.html' title='FreeType Demo'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-4401331523896288219</id><published>2011-02-06T20:05:00.000-08:00</published><updated>2011-02-06T20:11:54.867-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 0.8!</title><content type='html'>The main highlights of this release are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Tests for FreeType and zlib&lt;/span&gt;, two important real-world codebases. Aside from all the fixes and improvements necessary to get them to work, the test infrastructure now runs the entire build procedure (using emmaken) for those two tests, giving even more complete test coverage.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;File emulation&lt;/span&gt;. Just enough to let compiled C/C++ code think it is accessing a filesystem. For example, the FreeType test loads a TrueType font from a file (but really it's a virtual filesystem, set up in JavaScript).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Additional compilation options for overflows and signedness&lt;/span&gt; (CHECK_OVERFLOWS, CORRECT_OVERFLOWS, CHECK_SIGNS). These allow even more C/C++ code to be compiled and run properly, but are switchable, so code that doesn't need them can run fast.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I'll post a web demo soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-4401331523896288219?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/4401331523896288219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/02/emscripten-08.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4401331523896288219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4401331523896288219'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/02/emscripten-08.html' title='Emscripten 0.8!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2464403702187418100</id><published>2011-01-20T20:30:00.001-08:00</published><updated>2011-01-20T20:43:52.059-08:00</updated><title type='text'>Emscripten Overview Writeup</title><content type='html'>If you're interested in how Emscripten works, then &lt;a style="font-weight: bold;" href="http://emscripten.googlecode.com/hg/docs/paper.pdf"&gt;this writeup&lt;/a&gt; I am working on may interest you. It is currently the best explanation of the underlying techniques Emscripten uses to compile LLVM to JavaScript, including the memory model, the Relooper algorithm, etc.&lt;br /&gt;&lt;br /&gt;It isn't meant to be a manual or a practical guide. For that, as always see &lt;a href="http://code.google.com/p/emscripten/wiki/GettingStarted"&gt;the wiki&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2464403702187418100?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2464403702187418100/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/01/emscripten-overview-writeup.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2464403702187418100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2464403702187418100'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/01/emscripten-overview-writeup.html' title='Emscripten Overview Writeup'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7314508061349656997</id><published>2011-01-18T17:48:00.000-08:00</published><updated>2011-01-18T17:58:39.346-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='demo'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>LIL browser demo</title><content type='html'>I just saw &lt;a href="http://badsector.github.com/lil/trylil.html"&gt;&lt;b&gt;this demo&lt;/b&gt;&lt;/a&gt; of &lt;a href="https://github.com/badsector/lil"&gt;LIL&lt;/a&gt; (a Little Interpreted Language) running in the browser, compiled from C to JavaScript using Emscripten. Cool stuff!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7314508061349656997?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7314508061349656997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/01/lil-browser-demo.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7314508061349656997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7314508061349656997'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/01/lil-browser-demo.html' title='LIL browser demo'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8019629562090629164</id><published>2011-01-15T11:17:00.000-08:00</published><updated>2011-01-15T12:58:43.427-08:00</updated><title type='text'>A Completely Speculative History &amp; Future of H.264 and WebM</title><content type='html'>&lt;ol&gt;&lt;li&gt;Several years ago, Google decides something needs to be done about web video, because (1) H.264 requires royalties, which means that parts of the web are proprietary (even if it is a standard), and Google believes an open web is in its best interest, and (2) for similar reasons, H.264 is incompatible with the W3C, Mozilla's Firefox, and Opera, so it will never become universal anyhow. Google is willing to go to great lengths to solve this issue, including large sums of money and developer time.&lt;/li&gt;&lt;li&gt;Google approaches MPEG-LA (or major entities that are members), and quietly floats the idea of 'freeing' H.264, by way of a large one-time payment from Google, after which H.264 will be royalty-free, and can then be blessed by the W3C.&lt;/li&gt;&lt;li&gt;Negotiations fail. Google offers large amounts of cash, but it isn't enough for MPEG-LA, which believes it is close to having a complete lock on the market, which it can leverage for even more cash later on.&lt;/li&gt;&lt;li&gt;Google threatens to support a competing format with all its resources, thereby threatening the future profitability of H.264.&lt;/li&gt;&lt;li&gt;MPEG-LA decides to call Google's bluff.&lt;/li&gt;&lt;li&gt;Google makes good on its threat, buying On2 and freeing its VP8 video codec as part of WebM, a royalty-free format for web video. (Note: I'll use 'WebM' to refer to 'VP8', a lot of the time.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mozilla, Opera, etc. naturally support this move, as it is good for the open web. Apple and Microsoft, whose motivations are otherwise, do not support this move - they are both already heavily invested in H.264, and for them life would be simplest if WebM never existed.&lt;/li&gt;&lt;li&gt;As a reaction to WebM, MPEG-LA makes H.264's licensing less expensive, and for a longer period of time.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google makes good on another part of its threat to MPEG-LA, removing H.264 support from Chrome. MPEG-LA is surprised Google is willing to hobble its own browser in order to get a leg up in this fight.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(This brings us to the present time.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Nothing much changes, at first. Most web video is seen through Flash anyhow. However, the block of WebM supporters, which is now Firefox, Chrome and Opera - whose share in the market is large, and growing - gets video providers on the web to pay close attention to WebM.&lt;/li&gt;&lt;li&gt;Flash introduces WebM support. Most video encoded for desktop viewing can now be encoded in WebM, and viewable through Flash or an HTML5 video element in Firefox, Chrome and Opera. Even video shown with DRM can be encoded in WebM, but must be shown in Flash. On the other hand, in the mobile space, a complete stack of hardware&amp;amp;software support is still really just present for H.264, and Apple doesn't support anything else, so video encoded for mobile viewing is primarily done in H.264.&lt;/li&gt;&lt;li&gt;WebM's video quality improves, in part benefiting from the fact that while open source and royalty-free, WebM is not a formal specification or standard, so rapid development and changes are possible. WebM becomes equivalent or superior to H.264.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google switches YouTube to primarily use WebM for encoding video meant for desktop use. There is hardly any impact on users, due to most video being shown in Flash anyhow (which now supports WebM). However, video for mobile viewing remains encoded in H.264.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Hardware support for WebM begins to ship in a great deal of new mobile devices, and eventually in a majority of new mobile devices.&lt;/li&gt;&lt;li&gt;As a reaction to WebM's rise, MPEG-LA once more lessens the royalties for H.264, in an attempt to make it more competitive.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A new version of Google's Android ships, on a new flagship phone from Google, that has complete hardware and software support for WebM. The device primarily views YouTube video in WebM format.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Google, stating WebM's superior quality, begins to 'favor' WebM over H.264 on YouTube, for mobile content. More specifically, while both WebM and H.264 are supported, WebM content is encoded at higher quality levels (this is accomplished not by decreasing H.264 quality, but by adding a higher level of quality exclusively for WebM). The result is that mobile devices viewing YouTube give a better user experience if the device does so using WebM.&lt;/li&gt;&lt;li&gt;Apple makes the rational decision and supports WebM on new iOS devices - hardware support is already there, and Apple cannot compromise on user experience. Whatever monetary benefit Apple gains from MPEG-LA from H.264 is completely eclipsed by Apple's iOS business, so this is a no-brainer.&lt;/li&gt;&lt;li&gt;With the majority of new mobile devices shipping with WebM support (Android and iOS), smaller players (Blackberry, WebOS, Windows Phone) are forced to support it as well.&lt;/li&gt;&lt;li&gt;The online video market has its anti-DRM moment, just like online audio already had. Video is shown without DRM, which simplifies delivery and cuts costs, and piracy remains at the same levels as before (just as with audio).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Once it is clear H.264 has lost in the mobile space, and that DRM is no longer needed, there is no reason for Microsoft and Apple not to support WebM in the HTML5 video element, on Windows and OS X respectively, in order to ensure their users the best experience.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;With DRM no longer an issue and widespread support for WebM in the HTML5 video element, WebM becomes the universal standard for video on the web, on both desktop and mobile. Content producers have little reason to even support a fallback to Flash - some do, but many do not, at little detriment to them or their users.&lt;/li&gt;&lt;li&gt;Google wins the fight, and the open web greatly benefits.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Some things that can change this future history:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MPEG-LA deciding to make H.264 100% royalty-free. This will kill MPEG-LA's profits, but may still be worthwhile for MPEG-LA members, since if done properly - and &lt;span style="font-weight: bold;"&gt;promptly&lt;/span&gt; - it can ensure H.264 becomes the standard for web video. Whether there remains enough profit from H.264 (from hardware, services, etc.) for this move to make sense, is not clear. But if this does happen, WebM loses, but really Google wins, since it got what it set out to get.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A new video format can appear, or a newer version of an existing format, which requires new hardware support but has benefits to justify the switch. Given the battle between H.264 and WebM, I would expect the new format's backers to learn the lessons of the past and make it free on the web (or, if they are not willing to do that - then to not even bother to create a new format). If such a new format appears, and becomes the universal standard for web video, the result is that Google wins in this case as well.&lt;/li&gt;&lt;li&gt;The fight gets taken to the courts. I doubt a simple injunction will be granted to either side, as both are powerful, influential, and have many patents to back up their claims - so there is no quick victory. Instead there is a lengthy court battle. To justify the cost, there must be a significant chance of large future profits, and if H.264 is already in decline, that might not be the case. However, it might still make sense for MPEG-LA to take Google to court, just to get it to settle for some amount of money, in which case Google wins overall, but MPEG-LA gets a little more money than otherwise. However, if the goal &lt;span style="font-weight: bold;"&gt;isn't&lt;/span&gt; a settlement, but an actual attempt to kill WebM, then things can get interesting. I don't think anyone can say for sure how that fight would turn out - does WebM infringe on H.264 patents? Does H.264 infringe on WebM patents (VP8 patents, granted to On2, and now owned by Google, which would countersue)? Perhaps both? Such a 'fight to the death' in the courts seems unlikely, in part due to that unpredictability, so all we can say for sure in this case is that several law firms will greatly benefit.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;DISCLAIMER: I have no inside knowledge about any of this.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8019629562090629164?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8019629562090629164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/01/completely-speculative-history-future.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8019629562090629164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8019629562090629164'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/01/completely-speculative-history-future.html' title='A Completely Speculative History &amp; Future of H.264 and WebM'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6066947789159016293</id><published>2011-01-14T22:49:00.000-08:00</published><updated>2011-01-14T22:55:35.890-08:00</updated><title type='text'>Emscripten Usage Change</title><content type='html'>I refactored the python scripts in Emscripten to make them more sane. There is one difference in how Emscripten is used: If ~/.emscripten does not exist, it will copy tests/settings.py to ~/.emscripten, at which point you would edit the paths etc. in ~/.emscripten - &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; in tests/settings.py, which is how things were before (and that was bad).&lt;br /&gt;&lt;br /&gt;If you already have a file at ~/.emscripten, and you probably do if you already ran Emscripten in the past, then that file will not contain all the necessary information. The simplest thing is for you to copy your edited tests/settings.py into ~/.emscripten. Or, you can delete ~/.emscripten and run the tests (python tests/runner.py), which will copy tests/settings.py for you into ~/.emscripten (but remember to change the paths, if you need to).&lt;br /&gt;&lt;br /&gt;Sorry for the inconvenience, but the previous way things were was just a hack, which had to be fixed.&lt;br /&gt;&lt;br /&gt;Wiki pages on the project site have been updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6066947789159016293?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6066947789159016293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/01/emscripten-usage-change.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6066947789159016293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6066947789159016293'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/01/emscripten-usage-change.html' title='Emscripten Usage Change'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1696729591488598309</id><published>2011-01-01T18:59:00.000-08:00</published><updated>2011-01-01T19:05:59.771-08:00</updated><title type='text'>JavaScript, Native Client, and Emscripten</title><content type='html'>&lt;span class="Apple-style-span" style="border-collapse: separate; color: rgb(0, 0, 0); font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; font-size: medium; "&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;This is a response to this&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://chadaustin.me/2011/01/mozillas-rejection-of-nativeclient-hurts-the-open-web/"&gt;blog post&lt;/a&gt;, which is titled "Mozilla’s Rejection of NativeClient Hurts the Open Web", which appeared prominently on&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://news.ycombinator.com/item?id=2057415"&gt;Hacker News&lt;/a&gt;.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;I disagree with the thesis in that blog post. My reasons are entirely technical.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;First off, NaCl is not portable yet. PNaCl is working towards that, but it will take time. Until it is portable, comparing it to JavaScript is comparing apples and oranges. They simply do very different things - one is fast, the other is portable.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Second, while PNaCl is being worked on, at the same time a lot of effort is being put into making JavaScript engines faster. Now, for purposes of comparison to PNaCl, we don't need&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;b&gt;all&lt;/b&gt; JavaScript code to run as fast as native code. For our purposes here, we can care only about 'implicitly statically typed' JavaScript code - the code that&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;b&gt;can&lt;/b&gt;, in theory, be compiled so it runs as fast as native code. Implicitly statically typed code is code that uses a single type for each variable, and even though it's written in a dynamic language, could correspond almost 1-to-1 to code in a fast statically typed language like C.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Such code can be created automatically from C or C++ using something like&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://code.google.com/p/emscripten/"&gt;Emscripten&lt;/a&gt;. Or, you can write such code on purpose, for example, PyPy is written in RPython, which is basically implicitly statically typed Python. More generally, you might write the performance-sensitive parts of a JavaScript application in an implicitly statically typed manner, while the rest can have fun with dynamic typing and the benefits that gives.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;The important issue is that JavaScript engines can optimize implicitly statically typed code very well, both theoretically and practically. Techniques like tracing, type analysis, etc. are already being used in JavaScript engines like SpiderMonkey and V8, and progress is very fast. Also, PyPy can&lt;span class="Apple-converted-space"&gt; &lt;/span&gt;&lt;a href="http://mozakai.blogspot.com/2010/07/experiments-with-static-javascript-as.html"&gt;give us an idea&lt;/a&gt; of the long-term potential in such an approach.&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;So, while NaCl is working towards portability, JavaScript is working on speed. To clarify, again, I'm not talking about running all JavaScript code at native speed. But there is a big, relevant subset which can be run very quickly. Once JavaScript engines achieve the goal of running that code at native speed, then the performance advantage of NaCl will have vanished. At that point both NaCl and JavaScript will be fast (and, if PNaCl is completed, they will both also be portable).&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Once we get there, I believe JavaScript will be preferable for the simple fact that it has a natural fallback built in - implicitly statically typed JavaScript is perfectly valid JavaScript, so even if your JS engine doesn't achieve the full speed of native code, at least it can run it. Whereas NaCl will simply not run at all unless the NaCl plugin is installed (and that may never happen on iOS devices, and may never happen by default on any desktop browser but Chrome).&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Note that one might devise a fallback for NaCl by writing an emulator, or even a compiler, for PNaCl in JavaScript - perhaps using Emscripten (which does exactly what is needed - convert LLVM into JavaScript). If the speed-intensive parts of the code in that approach are implicitly statically typed, then we have come full circle, and the two approaches of JavaScript+Emscripten or PNaCl+Emscripten essentially converge, with a minor disadvantage to NaCl for being more complex (a special NaCl compiler, and a special NaCl runtime).&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1696729591488598309?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1696729591488598309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2011/01/javascript-native-client-and-emscripten.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1696729591488598309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1696729591488598309'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2011/01/javascript-native-client-and-emscripten.html' title='JavaScript, Native Client, and Emscripten'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1188446050604842189</id><published>2010-12-23T23:31:00.001-08:00</published><updated>2010-12-26T13:16:06.988-08:00</updated><title type='text'>Is the Web Ready for Compiled Code?</title><content type='html'>&lt;a href="http://syntensity.com/static/python.html"&gt;CPython compiled to JavaScript &lt;/a&gt;is now reasonably fast on Firefox 4 and Chrome. Startup takes a few seconds, but it could be done in a web worker, so as not to stall a loading page. Executing code afterwards is far slower than native CPython, but already fast enough to be useful for some things, and getting faster all the time. (There are other limitations, like importing of modules, but I'm mainly focusing on speed for now.) So, from the perspective of those two browsers, we might be able to use Python on the web.&lt;br /&gt;&lt;br /&gt;However, for it to make sense in general, it needs to work well on all or almost all browsers people use. So, what's the situation with other browsers?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The Python demo tends to run very slowly in older browsers, that don't have a modern JavaScript engine. But, those people will upgrade eventually, so this will be solved (except perhaps for a minority using IE6...).&lt;/li&gt;&lt;li&gt;Currently Python will not run on Opera, due to a bug in their JS engine. They have been notified of the problem. As Opera has a quite fast JS engine, I am hopeful that compiled code will work there at some point.&lt;/li&gt;&lt;li&gt;IE9 has a fast JS engine as well, but I don't have a Windows machine to test on. Has anyone tried to run the Python demo there? &lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://code.google.com/p/emscripten/issues/detail?id=22"&gt;Issue 22&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Safari has had a fast JS engine for a while (these days perhaps not as fast as the other open source ones, given recent speedups in Firefox and Chrome, but still quite good). As in the previous point, I lack a machine to test on - has anyone tried there? &lt;span style="font-weight: bold;"&gt;Update: Works in Safari and even iPads.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1188446050604842189?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1188446050604842189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/12/is-web-ready-for-compiled-code.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1188446050604842189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1188446050604842189'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/12/is-web-ready-for-compiled-code.html' title='Is the Web Ready for Compiled Code?'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-863138672829110172</id><published>2010-12-18T17:38:00.000-08:00</published><updated>2010-12-18T17:46:35.291-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 0.7!</title><content type='html'>Main changes in this release:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lots of minor fixes and additions, in order to get CPython working. As a result there is now a &lt;a style="font-weight: bold;" href="http://syntensity.com/static/python.html"&gt;web demo&lt;/a&gt; of Python, which seems to work quite well aside for being very slow in Chrome.&lt;/li&gt;&lt;li&gt;Figuring out what to do with LLVM optimizations. It looks like all of them generate suitable code except for &lt;span style="font-weight: bold; font-family: courier new;"&gt;-instcombine&lt;/span&gt;, which apparently combines instructions in a CPU-specific way (so, it isn't portable, and confuses Emscripten). All the tests now pass with LLVM optimizations enabled (all but the problematic one just mentioned).&lt;/li&gt;&lt;/ul&gt;So, not much in the way of new features: As mentioned before, we are already pretty much feature complete at this point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-863138672829110172?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/863138672829110172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/12/emscripten-07.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/863138672829110172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/863138672829110172'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/12/emscripten-07.html' title='Emscripten 0.7!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7117217516455429975</id><published>2010-12-12T22:55:00.000-08:00</published><updated>2010-12-12T23:09:08.031-08:00</updated><title type='text'>Python Demo</title><content type='html'>With help from rasjidw, there is now a &lt;a style="font-weight: bold;" href="http://syntensity.com/static/python.html"&gt;web demo&lt;/a&gt; of Python. Check it out, and let me know if you find a bug!&lt;br /&gt;&lt;br /&gt;The demo is of CPython, the original/standard Python implementation, compiled from C to JavaScript. What's cool about compiling CPython itself is that we get all the language features 'for free', both the common stuff you'd expect and think of first, and also things that if you were writing a new implementation, you might leave for last.&lt;br /&gt;&lt;br /&gt;Known limitations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No &lt;span style="font-weight: bold; font-family: courier new;"&gt;import&lt;/span&gt; of modules - just the core language works. It should be possible to get imports working, of both C modules and Python ones, but it would require writing code for dynamic linking etc.&lt;/li&gt;&lt;li&gt;I tested in Firefox 4 beta and Chrome 8, and for some reason the demo runs very slowly in Chrome 8 (perhaps related to V8 &lt;a href="http://code.google.com/p/v8/issues/detail?id=947"&gt;Issue 947&lt;/a&gt;?). Firefox 4 runs much faster but still obviously slower than native CPython. In any case that should improve once we get LLVM optimizations working.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7117217516455429975?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7117217516455429975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/12/python-demo.html#comment-form' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7117217516455429975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7117217516455429975'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/12/python-demo.html' title='Python Demo'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-175041536626160889</id><published>2010-12-11T13:17:00.000-08:00</published><updated>2010-12-11T13:31:09.964-08:00</updated><title type='text'>A Ridiculously Recursive Bug</title><content type='html'>&lt;a href="http://code.google.com/p/emscripten/issues/detail?id=11"&gt;Work has been going on&lt;/a&gt; to get Emscripten to compile CPython (the standard implementation of Python) into JavaScript. It's very close to working, so I started to write an automatic test. But the test failed even though running the test manually worked.&lt;br /&gt;&lt;br /&gt;That's weird, I thought.&lt;br /&gt;&lt;br /&gt;Turns out that something quite amusing was happening. The automatic test system and other scripts are written in Python, and the test runner checks for script crashes and failures by scanning for the text that appears in a Python stack trace, which is to say something like '&lt;span style="font-weight: bold; font-family: courier new;"&gt;Traceback (most recent call last)&lt;/span&gt;' etc.&lt;br /&gt;&lt;br /&gt;Now, when Emscripten compiles &lt;span style="font-weight: bold;"&gt;Python itself&lt;/span&gt;, it generates JavaScript code that includes, unsurprisingly, all the constant strings in Python - including that very string! So the right output was erroneously detected as a failure.&lt;br /&gt;&lt;br /&gt;I guess that's what can happen if your test compiles the very same runtime in which the test infrastructure is built... ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-175041536626160889?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/175041536626160889/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/12/ridiculously-recursive-bug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/175041536626160889'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/175041536626160889'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/12/ridiculously-recursive-bug.html' title='A Ridiculously Recursive Bug'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6574604597114423822</id><published>2010-11-28T18:47:00.000-08:00</published><updated>2010-11-28T18:52:33.380-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lua'/><title type='text'>Lua Demo += Skywriter</title><content type='html'>The &lt;a href="http://syntensity.com/static/lua.html"&gt;Lua demo&lt;/a&gt; now has a nicer interface using &lt;a href="https://mozillalabs.com/skywriter/"&gt;Skywriter&lt;/a&gt;, and some additional bugfixes under the hood.&lt;br /&gt;&lt;br /&gt;Check it out, and let me know if you find any problems!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6574604597114423822?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6574604597114423822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/11/lua-demo-skywriter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6574604597114423822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6574604597114423822'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/11/lua-demo-skywriter.html' title='Lua Demo += Skywriter'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-221011673450512568</id><published>2010-11-26T17:20:00.000-08:00</published><updated>2010-11-26T17:34:30.993-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lua'/><title type='text'>Lua Improvements</title><content type='html'>It seems there are people interested in running Lua on the web :) The &lt;a href="http://syntensity.com/static/lua.html"&gt;Lua demo&lt;/a&gt; was on &lt;a href="http://news.ycombinator.com/item?id=1941405"&gt;Hacker News&lt;/a&gt;, and some people noticed that certain things don't work - thanks for the feedback! - so I spent a few hours figuring out what was wrong. After some small fixes, the demo will now handle these statements:&lt;br /&gt;&lt;ul style="font-family: courier new; font-weight: bold;"&gt;&lt;li&gt;for k,v in pairs({'foo','bar'}) do print(k,v) end&lt;/li&gt;&lt;li&gt;f&lt;span class="comment"&gt;&lt;span style="color:#000000;"&gt;or x = 1,10 do print(x) end&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="comment"&gt;&lt;span style="color:#000000;"&gt;for k,v in pairs(_G) do print("-&gt;", k,v) end&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;which people mentioned did not work before.&lt;br /&gt;&lt;br /&gt;The output seems ok, but I'm not totally sure that it's 100% correct, since my Lua skills are pretty rusty. That's also why I didn't notice the issues in the beginning - I saw that 'hello world' worked, and thought all was well ;)&lt;br /&gt;&lt;br /&gt;If people really want to see this work properly, let me know about any other problems. I'm happy to work on it, I just can't do it without feedback since I don't know where to start testing. (Is there a standard test suite for Lua?)&lt;br /&gt;&lt;br /&gt;The issues that had to be fixed in Emscripten were&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lua uses varargs in ways that the existing code didn't support. So I improved that. Varargs are now emulated in a way that is basically identical to C.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;A few missing stdlib functions.&lt;/li&gt;&lt;/ul&gt;So, small stuff. In fact I'd be surprised if there were any big issues left, at this point, given the amount of code known to compile properly, but there are probably a lot of small things left to fix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-221011673450512568?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/221011673450512568/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/11/lua-improvements.html#comment-form' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/221011673450512568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/221011673450512568'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/11/lua-improvements.html' title='Lua Improvements'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1217555942819582717</id><published>2010-11-25T17:09:00.000-08:00</published><updated>2010-11-25T17:19:38.074-08:00</updated><title type='text'>Emscripten 0.6!</title><content type='html'>Demo: &lt;a style="font-weight: bold;" href="http://syntensity.com/static/lua.html"&gt;Lua&lt;/a&gt;. Thanks to rasjidw and puffnfresh!&lt;br /&gt;&lt;br /&gt;Other major changes since the last release:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SAFE_HEAP checks for invalid reads/writes and nonportable LLVM bitcode. This is important as LLVM optimizations can lead to nonportable bitcode. We need to figure out which optimizations are at fault, so we can use the other optimizations - they should make us much faster.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Much more optimized compilation of very large projects - both in terms of memory and speed. I am now able to compile Sauerbraten without the JS engine giving up ;) - still a very long way from getting it to run, though.&lt;/li&gt;&lt;/ul&gt;See the Changelog file for additional updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1217555942819582717?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1217555942819582717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/11/emscripten-06.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1217555942819582717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1217555942819582717'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/11/emscripten-06.html' title='Emscripten 0.6!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1146329586748361277</id><published>2010-11-16T20:24:00.000-08:00</published><updated>2010-11-16T20:28:17.463-08:00</updated><title type='text'>Worth mentioning...</title><content type='html'>First &lt;a href="http://code.google.com/p/emscripten/issues/detail?id=2"&gt;committed patch&lt;/a&gt; by someone other than me! Thanks puffnfresh :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1146329586748361277?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1146329586748361277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/11/worth-mentioning.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1146329586748361277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1146329586748361277'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/11/worth-mentioning.html' title='Worth mentioning...'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-349752358460001533</id><published>2010-11-12T19:54:00.001-08:00</published><updated>2010-11-12T22:41:50.253-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Now What?</title><content type='html'>For several months I've known that when I get home at night, I have tasks X and Y to do in Emscripten in order to move it forward. Last night, however, I took out the guitar instead. Suddenly, there is not much to do - basically the goals of the project have been achieved, Emscripten can compile things like the &lt;a href="http://syntensity.blogspot.com/2010/11/bulletwebgl-demo.html"&gt;Bullet physics engine&lt;/a&gt; and run it on the web. As far as the core code-generating capabilities are concerned, Emscripten is pretty much complete.&lt;br /&gt;&lt;br /&gt;So, what now?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There are some additional optimizations and enhancements that can be done, like nativizing structures or emulating multithreaded code.&lt;/li&gt;&lt;li&gt;There are various tooling improvements that can be done, like making it easier to glue together web code and compiled code.&lt;/li&gt;&lt;li&gt;Emscripten could be used in other ways, for example, it could be combined with something like Rubinius that generates LLVM code from Ruby, allowing running Ruby code on the web.&lt;/li&gt;&lt;li&gt;Various code cleanups and refactorings could be done.&lt;/li&gt;&lt;/ul&gt;I'm not in a rush to do any of these - none is urgent or essential. I guess I'll get around to them eventually, or perhaps someone else will.&lt;br /&gt;&lt;br /&gt;Right now, I'm considering doing one or both of the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Return to my original goal, that of bringing Syntensity to the web. In other words, to compile a version of Syntensity using Emscripten. The time of 3D-environments-on-the-web is almost upon us, and when it is, we need to make sure that the main tools for it are open source and platform agnostic. Sadly, currently the main contenders are not such.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Some other side project, got at least two ideas in my head of things I'd like to hack up. They are very experimental and speculative though, so they may end up a waste of time. But if they succeed...&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-349752358460001533?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/349752358460001533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/11/now-what.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/349752358460001533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/349752358460001533'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/11/now-what.html' title='Now What?'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5258376040790762278</id><published>2010-11-09T20:46:00.000-08:00</published><updated>2010-11-09T20:55:24.848-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webgl'/><category scheme='http://www.blogger.com/atom/ns#' term='bullet'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Bullet/WebGL Demo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://syntensity.com/static/bullet.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 219px;" src="http://3.bp.blogspot.com/_F6KhIbZluDM/TNolR1_TLDI/AAAAAAAAADI/zkYWb4CTm7A/s400/Screenshot.png" alt="" id="BLOGGER_PHOTO_ID_5537779680286026802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Click on the screenshot for a live demo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5258376040790762278?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5258376040790762278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/11/bulletwebgl-demo.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5258376040790762278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5258376040790762278'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/11/bulletwebgl-demo.html' title='Bullet/WebGL Demo'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_F6KhIbZluDM/TNolR1_TLDI/AAAAAAAAADI/zkYWb4CTm7A/s72-c/Screenshot.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6589076161375440213</id><published>2010-11-01T19:44:00.000-07:00</published><updated>2010-11-02T22:27:10.135-07:00</updated><title type='text'>Emscripten 0.5!</title><content type='html'>Another Emscripten release has arrived, this time the focus was on building a large real-world library: &lt;a href="http://www.bulletphysics.org/wordpress"&gt;Bullet Physics&lt;/a&gt;. For those unfamiliar with it, Bullet is an awesome physics library written in C++, which has been used in many places, including commercial games and movies.&lt;br /&gt;&lt;br /&gt;Here is the demo for this release:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-weight: bold;"&gt;----------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=" font-weight: bold;font-family:courier new;" &gt;Ran 168 tests in 1060.329s&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=" font-weight: bold;font-family:courier new;" &gt;OK&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;:P Just kidding, a real demo will follow. I'm working on something with Bullet and WebGL, but didn't want to delay the release for it.&lt;br /&gt;&lt;br /&gt;About the work in this release: Bullet is much larger than other projects Emscripten was tested on before, and a large part of the work was to speed up the compiler. The result is that Emscripten now takes a reasonable amount of time - if it takes 10 minutes to build the Bullet C++ sources into LLVM bitcode, then it takes a similar amount of time to convert that into JavaScript using Emscripten (and it takes an even longer amount of time to run that through the Closure Compiler for additional optimization). So at this point there isn't much more reason to optimize for speed of compilation - it's in very good shape, fitting into the build process without slowing things down noticeably.&lt;br /&gt;&lt;br /&gt;As expected, various small bugs were found while building Bullet, and a few additional tests were added to check for specific issues. There is also an automatic test for Bullet as a whole.&lt;br /&gt;&lt;br /&gt;Overall, at this point Emscripten is capable of compiling large projects effectively; quite a lot of the original goals of this project have been achieved. Still lots of cool stuff left, though! More about plans for the near future in another blog post very soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6589076161375440213?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6589076161375440213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/11/emscripten-05.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6589076161375440213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6589076161375440213'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/11/emscripten-05.html' title='Emscripten 0.5!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2921705611939789196</id><published>2010-10-17T10:50:00.000-07:00</published><updated>2010-10-17T14:27:07.021-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 0.4!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_F6KhIbZluDM/TLs3zV8r2iI/AAAAAAAAADA/ZttjnPsL-ys/s1600/benchmark-emscripten-0.4.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 136px;" src="http://2.bp.blogspot.com/_F6KhIbZluDM/TLs3zV8r2iI/AAAAAAAAADA/ZttjnPsL-ys/s400/benchmark-emscripten-0.4.png" alt="" id="BLOGGER_PHOTO_ID_5529074322731948578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The focus of this release was on making the generated code faster. As the chart shows, we went from being 100X slower than hand-optimized JavaScript code, to around 5X slower. You can see the difference in the &lt;a style="font-weight: bold;" href="http://www.syntensity.com/static/raytrace.html"&gt;raytrace demo&lt;/a&gt;, which has been updated to use all the current optimizations.&lt;br /&gt;&lt;br /&gt;5X slower is still slower. It will be hard to do much better, though, without either better JS engine support, or much more clever code analysis. Both will hopefully happen over time. Meanwhile, 5X slower is not &lt;span style="font-style: italic;"&gt;too&lt;/span&gt; terrible, and there are some advantages over hand-written code - we hardly use garbage collection, so no GC pauses. Also, the speed really depends on the code - the comparison in the chart above uses benchmarks for which we have comparable code in both C++ and JavaScript. But the most interesting uses of Emscripten are to convert code for which we &lt;span style="font-style: italic;"&gt;don't&lt;/span&gt; have a JavaScript equivalent. Also worth mentioning is that it is perfectly possible to hand-optimize the crucial parts of the code that Emscripten generates.&lt;br /&gt;&lt;br /&gt;Some technical details about the optimizations implemented in this release:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use typed arrays, if available in the JS engine (thanks to pcwalton and njn for the idea)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Optimize after the relooper runs, removing unneeded code flow overhead&lt;/li&gt;&lt;li&gt;Nativize many more variables than before (i.e., move them off the emulated stack, and into native JS variables)&lt;/li&gt;&lt;li&gt;Optimized stack emulation&lt;/li&gt;&lt;li&gt;Inlining of various runtime code fragments&lt;/li&gt;&lt;li&gt;Integration with the &lt;a href="http://code.google.com/closure/compiler/"&gt;Closure Compiler&lt;/a&gt;: We generate output that it is very good at optimizing (thanks to Anders Riggelsen for the idea)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Also added in this release is support for the brand-new LLVM 2.8. That is now the version being tested against.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2921705611939789196?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2921705611939789196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/10/emscripten-04.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2921705611939789196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2921705611939789196'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/10/emscripten-04.html' title='Emscripten 0.4!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_F6KhIbZluDM/TLs3zV8r2iI/AAAAAAAAADA/ZttjnPsL-ys/s72-c/benchmark-emscripten-0.4.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5139836453602181553</id><published>2010-10-05T20:07:00.000-07:00</published><updated>2010-10-05T21:01:38.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten 0.3!</title><content type='html'>Demo for this release: &lt;a style="font-weight: bold;" href="http://www.syntensity.com/static/raytrace.html"&gt;Raytracing&lt;/a&gt;. It isn't very fast, since the focus hasn't been on code speed yet, but it does show that a ray tracer written in C++, using SDL, can be emscriptened and run on the web.&lt;br /&gt;&lt;br /&gt;So, I ended up doing more in this release than I had intended, causing it to take longer than planned. But it was for the best. Major changes include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Clang support&lt;/span&gt;: All tests now work in both llvm-gcc and Clang. The two produce somewhat different llvm bitcode, to the degree that different methods are needed with Clang, causing it to run 1/2 as fast as llvm-gcc code. That is mainly because llvm-gcc is more explicit with what it does, while Clang uses memcpy and such, with hardcoded C size values (4 bytes for an int, etc.).&lt;br /&gt;&lt;br /&gt;Emscripten therefore now supports optional 'C memory layout' (&lt;span style="font-family: courier new;"&gt;QUANTUM_SIZE&lt;/span&gt; in settings.js). For example, an array of ints of values 1,2,3 with that enabled is [1,0,0,0,2,0,0,0,3,0,0,0] (since each int is 4 bytes), and when it is disabled, [1,2,3]. The latter works fine with llvm-gcc-generated llvm bitcode. Note that things get even more complicated with structures here, which need to be aligned and so forth. Anyhow, after that effort Emscripten should now be able to support anything that C/C++ can throw at it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Faster compilation speed&lt;/span&gt;: The original goal of the release. Compilation speed is 2-3 times faster now. Still lots of room for improvement, but it isn't a major nuisance like it was.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Proper memory management&lt;/span&gt;: A call stack is implemented, and static memory allocation (for global variables, etc.) is also possible. sbrk() is emulated as well, allowing dlmalloc, a popular malloc() implementation, to be emscriptened properly. In particular that lets you use a real malloc() in your emscriptened code.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Much better native flow regeneration (the 'relooper')&lt;/span&gt;: A major challenge of translating LLVM to JavaScript is to implement native flow structures - if, while, for, etc. LLVM bitcode only provides chunks of code (I call them 'labels', but that's not the right name) and branchings between then. So Emscripten needs to figure out from that low-level data the high-level code flow patterns. Native flow structures are extremely important for good performance of the generated code.&lt;br /&gt;&lt;br /&gt;The first relooper worked on most tests, but was slow and buggy. I wrote a new version almost from scratch, and it now properly processes all the test code. It isn't very fast, though, I didn't focus on that. For that reason it is off by default, which means that Emscripten will not generate native flow structures (instead it will emulate code flow using a switch in a loop, which is very slow - but trivial to generate).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;The above-mentioned raytracing demo&lt;/span&gt;: For this, initial work was done on supporting SDL - just showing video data so far. The SDL Surface is implemented in JavaScript using a Canvas. I found this very amusing, to write C++ code with SDL, compile and run it natively using gcc, and be able to run that same unmodified code on the web through Emscripten ;)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Lots more tests&lt;/span&gt;: There are now 37 separate tests, from small LLVM features to high-level tests like the CubeScript engine, dlmalloc, and raytracing; each test is run through both Clang and llvm-gcc, and with relooping&amp;amp;optimization both on and off, for a total of 148 tests. This takes 7 minutes on my slow laptop, which is starting to be significant, but it's extremely important in a project like this.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Next goals include performance of the generated code - lots, lots of low-hanging fruit there - and compiling yet more real-world code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5139836453602181553?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5139836453602181553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/10/emscripten-03.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5139836453602181553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5139836453602181553'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/10/emscripten-03.html' title='Emscripten 0.3!'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6695322329360308308</id><published>2010-09-21T21:10:00.001-07:00</published><updated>2010-09-21T21:10:48.132-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clang'/><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten, Now With More Clang</title><content type='html'>Emscripten can now work with Clang. It turns out that the llvm bitcode that Clang generates is slightly different from that of llvm-gcc, which uncovered various minor bugs and missing elements in Emscripten (for example, the 'phi' command).&lt;br /&gt;&lt;br /&gt;All the tests now pass both llvm-gcc and Clang, and with both optimization and relooping on (however, relooping has been weakened, due to some bugs that were discovered).&lt;br /&gt;&lt;br /&gt;The benefits of allowing Clang to be used is that having two sources of LLVM bitcode is better than one - more chances to catch bugs (but even more important would be to add non-C/C++ sources of LLVM bitcode as well!). Another benefit is that Clang is simpler to build so it will allow more people to play with Emscripten.&lt;br /&gt;&lt;br /&gt;The wiki has been updated with &lt;a href="http://code.google.com/p/emscripten/wiki/GettingStarted"&gt;full instructions&lt;/a&gt;, so you can get Clang and try it out with Emscripten right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6695322329360308308?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6695322329360308308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/09/emscripten-now-with-more-clang.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6695322329360308308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6695322329360308308'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/09/emscripten-now-with-more-clang.html' title='Emscripten, Now With More Clang'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6452254662854238642</id><published>2010-09-11T21:16:00.001-07:00</published><updated>2010-09-12T09:23:50.267-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>CubeScript on the Web</title><content type='html'>Emscripten 0.2 is out, and here's a &lt;a href="http://www.syntensity.com/static/cubescript.html"&gt;&lt;span style="font-weight: bold;"&gt;silly demo&lt;/span&gt;&lt;/a&gt;: the CubeScript engine from Sauerbraten, compiled from C++ to JavaScript, and running in a web page. Finally, you can use a script language on the web ;P&lt;br /&gt;&lt;br /&gt;A few more details about the demo appear on that page. Other details about the 0.2 release are in the &lt;a href="http://code.google.com/p/emscripten/source/browse/ChangeLog"&gt;changelog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After successfully compiling the CubeScript engine (which was mainly to see if Emscripten could do it - fixed a lot of bugs on the way), I think most C/C++ stuff should work (but there are probably a lot of minor corner cases left). The next steps are something like this:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Version 0.3&lt;/span&gt;: Optimize the compiler for speed. Right now compiling CubeScript, about 2,500 lines of code, takes a minute on my (slow) laptop. The goal is to compile large projects, so this needs to be much faster.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Version 0.4&lt;/span&gt;: Optimize the generated code for speed. Some radical solutions for making it faster are possible, but might take a lot of time, so maybe post-1.0. But some straightforward optimizations should be done in the near future.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Version 0.5&lt;/span&gt;: Tools and integration. Make it easy to build multi-file projects, and to connect the generated code to web JavaScript (calling functions both ways).&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;???&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;1.0!&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6452254662854238642?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6452254662854238642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/09/cubescript-on-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6452254662854238642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6452254662854238642'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/09/cubescript-on-web.html' title='CubeScript on the Web'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1942934305711195004</id><published>2010-08-29T10:22:00.000-07:00</published><updated>2010-09-11T21:25:42.333-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emscripten'/><title type='text'>Emscripten</title><content type='html'>As mentioned in the last post, I am checking out ways to bring Syntensity to the web. As part of that, I just put up &lt;a style="font-weight: bold;" href="http://code.google.com/p/emscripten/"&gt;Emscripten&lt;/a&gt; on Google Code. Emscripten is an LLVM-to-JavaScript compiler. Combined with llvm-gcc, it lets you compile C/C++ code into JavaScript, and run that on the web.&lt;br /&gt;&lt;br /&gt;Emscripten is still in an early stage, but can already compile some benchmarks. At this point I think I will start to try to port code I am interested in, and fix bugs along the way as I find them. I'll probably begin with a tiny subset of sauerbraten (probably one out of command.cpp, rendermodel.cpp, or physics.cpp) and see how that works, then continue from there.&lt;br /&gt;&lt;br /&gt;The long-term goal is to run Syntensity, or a smaller version of it, on the web. Aside from Emscripten this will require some other tools, and probably a lot of hard work, so I can't say when I expect this to be done. Also I am working on it in my spare time, so that will vary depending on other stuff I'm doing. But now that Emscripten is in good enough shape to start using, the fun part can begin.&lt;br /&gt;&lt;br /&gt;Side note: I'll post updates on this blog regarding using Emscripten for porting Syntensity to the web. I'll probably post stuff about Emscripten itself, that isn't related just to Syntensity, on my more general blog, &lt;a href="http://mozakai.blogspot.com/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1942934305711195004?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1942934305711195004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/08/emscripten.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1942934305711195004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1942934305711195004'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/08/emscripten.html' title='Emscripten'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-9171811224716123426</id><published>2010-08-14T20:09:00.000-07:00</published><updated>2010-08-14T20:34:43.707-07:00</updated><title type='text'>Update on Where Things are Going</title><content type='html'>It looks like the Syntensity codebase (and community) is going in two directions:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A few community members (quaker, BiosElement) have started CubeCreate, a fork of Syntensity that is not afraid of breaking compatibility with Sauerbraten, in that they will rewrite Sauer code and add major new features. It definitely looks very interesting and they are putting a lot of effort into it. For more details, visit their IRC channel (#cubecreate on FreeNode), or &lt;a href="http://forum.cubecreate.com/"&gt;forums&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;As for me, I have been thinking about something sort of in the opposite direction. I think gaming should move to the web - like everything else pretty much already has or is in the process of doing. To do that, things need to be - at least in the near future - lighter and simpler, to make moving to the web easier. So I've been working in my spare time on tools for that. One tool is an LLVM-to-JS compiler, which lets you run (some) C++ code inside of a web browser, by compiling it to LLVM and then to JavaScript. My goal is to move existing C++ code - Sauer, Syntensity, Bullet, etc. (or maybe simplified versions of those) - to the web that way. The tool is far from finished but already can run various benchmarks, I'll probably put the project up on some open source hosting site soon.&lt;/li&gt;&lt;/ul&gt;So those are the main directions in which things are going. They sort of go in opposite ways, but of course there's nothing wrong with that. The more the merrier ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-9171811224716123426?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/9171811224716123426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/08/update-on-where-things-are-going.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/9171811224716123426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/9171811224716123426'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/08/update-on-where-things-are-going.html' title='Update on Where Things are Going'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-842558808397212109</id><published>2010-06-20T10:23:00.001-07:00</published><updated>2010-06-20T10:34:07.864-07:00</updated><title type='text'>Plan for Next Release: Metallblech</title><content type='html'>gk has a great concept for the next game, which you can see &lt;a style="font-weight: bold;" href="http://forum.freegamedev.net/viewtopic.php?f=28&amp;amp;t=476&amp;amp;start=0"&gt;here&lt;/a&gt;. That game will be part of a new release.&lt;br /&gt;&lt;br /&gt;Help from community members would be great, and let us get to the release faster. Stuff we will need help with includes&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Coding the new gk game linked to above. Mainly we will use existing scripts and customize them, but there will also be a few new things as well&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Testing that game&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Need to decide if to merge from the development branch for this release - if so, will require more testing time. Opinions?&lt;/li&gt;&lt;li&gt;Making binary builds for Linux, Windows, OS X&lt;/li&gt;&lt;/ul&gt;There is no timeline, it really depends on how much help we get. But it will be awesome when it arrives! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-842558808397212109?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/842558808397212109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/06/plan-for-next-release-metallblech.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/842558808397212109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/842558808397212109'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/06/plan-for-next-release-metallblech.html' title='Plan for Next Release: Metallblech'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8076785665362552877</id><published>2010-06-13T10:39:00.000-07:00</published><updated>2010-06-13T11:02:01.294-07:00</updated><title type='text'>Development Update</title><content type='html'>After the recent changes, we have been working out how to move forward. This is what makes sense for now.&lt;br /&gt;&lt;br /&gt;Regarding code branches:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The &lt;a style="font-weight: bold;" href="http://github.com/kripken/intensityengine"&gt;main github repo&lt;/a&gt; will remain as the &lt;span style="font-weight: bold;"&gt;stable&lt;/span&gt; branch. It will always be in sync with the running servers at syntensity.com, so if you want to connect to there, you should run that code.&lt;/li&gt;&lt;li&gt;quaker66 has been doing excellent work on &lt;a style="font-weight: bold;" href="http://github.com/quaker66/intensityengine/"&gt;his branch&lt;/a&gt;, which is now the official &lt;span style="font-weight: bold;"&gt;development&lt;/span&gt; ('unstable') branch. quaker66 has worked very hard to port all the recent features from sauer svn (lots of great stuff that eihrul has been doing there) as well as awesome new features like flashlights, better cutscene management, etc. You can see videos of that stuff on his &lt;a href="http://www.youtube.com/user/quaker6667"&gt;YouTube channel&lt;/a&gt;. In addition, T7g and BiosElement have been doing very interesting work as well, some of which has already been merged into quaker66's branch. New stuff should likewise be added to that branch.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Regarding versioning: The current version is still 1.1.6. For a new release, we would merge from the development branch, bringing all the changes from there. To do so, we would need:&lt;ul&gt;&lt;li&gt;For the code to be stable and well-tested - after a reasonable code freeze. We might also want to wait for a short while after a new sauer release.&lt;/li&gt;&lt;li&gt;At least one new cool game, to showcase the latest features&lt;/li&gt;&lt;li&gt;To update the syntensity.com servers&lt;/li&gt;&lt;li&gt;To have binaries for people to download&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8076785665362552877?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8076785665362552877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/06/development-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8076785665362552877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8076785665362552877'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/06/development-update.html' title='Development Update'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2459606261462286016</id><published>2010-05-07T11:15:00.000-07:00</published><updated>2010-05-15T15:29:42.357-07:00</updated><title type='text'>Short Absence - Almost Over</title><content type='html'>I just wanted to clarify why I haven't been around much the last 2 weeks. I relocated to Mountain View, California, and I started my new job at Mozilla. All very exciting stuff, but also kept me very busy.&lt;br /&gt;&lt;br /&gt;However, I still would have been on IRC etc. on the weekend and possibly evenings, but I have had some trouble in getting my apartment connected to the internet (in silicon valley - somewhat ironic, heh). But that should be resolved in less than a week and I will finally be internet-enabled.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EDIT&lt;/span&gt;: AT&amp;amp;T fail - I am still without internet. They hope to get it working next week though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2459606261462286016?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2459606261462286016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/05/short-absence-almost-over.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2459606261462286016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2459606261462286016'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/05/short-absence-almost-over.html' title='Short Absence - Almost Over'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8301035373994372470</id><published>2010-04-24T08:07:00.001-07:00</published><updated>2010-04-24T08:10:09.084-07:00</updated><title type='text'>Windows Installer</title><content type='html'>Thanks to community members gk and rapiscan, we now have a proper installer for Windows. It includes the latest code (1.1.6). You can check it out on our &lt;a href="http://www.syntensity.com/toplevel/download/"&gt;download page&lt;/a&gt;, which links to &lt;a style="font-weight: bold;" href="http://www.moddb.com/downloads/syntensity-116"&gt;Mod DB&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you do try it, please let us know how it works.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8301035373994372470?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8301035373994372470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/04/windows-installer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8301035373994372470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8301035373994372470'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/04/windows-installer.html' title='Windows Installer'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5560173756796709334</id><published>2010-04-14T13:23:00.001-07:00</published><updated>2010-04-14T13:25:09.853-07:00</updated><title type='text'>2 Interesting Videos</title><content type='html'>Two interesting Syntensity-related videos are &lt;a href="http://blog.biosinteractive.com/2010/04/syntensity-sunrise/"&gt;embedded on the Bios Interactive blog&lt;/a&gt;, worth taking a look at.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5560173756796709334?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5560173756796709334/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/04/2-interesting-videos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5560173756796709334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5560173756796709334'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/04/2-interesting-videos.html' title='2 Interesting Videos'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2620137815558819196</id><published>2010-04-12T00:35:00.000-07:00</published><updated>2010-04-12T00:43:08.466-07:00</updated><title type='text'>New License: MIT</title><content type='html'>Today I changed the license on all my code in Syntensity/the Intensity Engine to the MIT (X11) license, for the reasons previously discussed in this blog.&lt;br /&gt;&lt;br /&gt;The MIT license is a permissive software license, compatible with the GPL, and similar to the BSD. It it simpler than the BSD license in that the BSD has several variants, some of which have clauses that are not immediately clear - which was recently pointed out to me. (What does "Neither the name of the &lt;organization&gt; nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission" mean, exactly?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2620137815558819196?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2620137815558819196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/04/new-license-mit.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2620137815558819196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2620137815558819196'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/04/new-license-mit.html' title='New License: MIT'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2596158773481555988</id><published>2010-04-11T03:53:00.000-07:00</published><updated>2010-04-11T06:50:03.784-07:00</updated><title type='text'>Mapmodel Mesh Collisions</title><content type='html'>&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/DHrfLF_RatE&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/DHrfLF_RatE&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;The video shows a mapmodel with mesh collisions - so the player can collide with the mapmodel properly, and not with a bounding box. Note how the player can move through the holes in the model (but not through where the model is solid).&lt;br /&gt;&lt;br /&gt;The mesh data is read from the sauer model, and converted and passed to Bullet, which handles the collisions. Scripts can also, optionally, create collision meshes on the fly.&lt;br /&gt;&lt;br /&gt;EDIT: Btw, this is still a little buggy. For example, you need to rotate the mapmodel 180 degrees, and it doesn't notice other rotations for now. Use the bullet debugging option to see what is going on (/bulletdebug 1). EDIT 2: Fixed.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2596158773481555988?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2596158773481555988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/04/mapmodel-mesh-collisions.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2596158773481555988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2596158773481555988'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/04/mapmodel-mesh-collisions.html' title='Mapmodel Mesh Collisions'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-4626299650886706695</id><published>2010-04-06T04:46:00.000-07:00</published><updated>2010-04-07T10:13:56.596-07:00</updated><title type='text'>Personal and Project Changes</title><content type='html'>Some of you may have noticed that I have been less active on IRC (and in general) recently. The reason is that I was in the US for some job interviews. And the reason for that is that, as already mentioned on this blog, it looks like the business side of Syntensity won't work out, at least for me. So I can't continue to work on it fulltime as I have been for almost 2 years.&lt;br /&gt;&lt;br /&gt;I still believe there is a lot of business potential here. But it would take someone with more industry contacts, business development skills, and money in the bank, than I do. Syntensity's technology works very well - I am very happy with it, and I think others are too - but I guess I was too optimistic about finding business partners and people to invest money in the venture and so forth.&lt;br /&gt;&lt;br /&gt;Syntensity is open source, though, and that means anyone else can try to use it for a profitable business. And in fact some people are, and more will probably follow. (For more on that, and licensing changes, see below.)&lt;br /&gt;&lt;br /&gt;I just signed a contract with one of the companies I interviewed at, and I'm going to start that job very soon, which I am very excited about (this blog post isn't about my new job, though, so I won't go into more detail now). But I am by no means leaving this open source project - I will continue to work on it in my spare time. I feel that this is a reasonable time for me to decrease my involvement, as&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;The engine is feature-complete, at least for v1.0&lt;/span&gt;. More stuff would be nice, and will be added (in particular I'll work on finishing experimental stuff like Bullet, but also entirely new stuff that can be useful), but actually there is a &lt;span style="font-weight: bold;"&gt;lot&lt;/span&gt; of potential not even used by the current games. I have said it on IRC several times, what Syntensity really needs now is not more features, but more games.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;The engine is stable&lt;/span&gt;. Bugs are found, but most are in experimental features. The core stuff has been used daily for several months now, with few issues (and what issues did arise, have been resolved).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;More people are getting involved in development&lt;/span&gt;, in various ways. Hopefully the dev team will expand.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;There is a growing group of users that are helping others&lt;/span&gt;, which is a very good thing.&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Basically, the engine is in a fairly mature state, and the community has come a long way from where it began. I would have been worried had I decreased my involvement before or around the 1.0 launch (and in fact that is one reason why I only started looking for a job recently), but now I have a very good feeling about the future of the project. And it is a healthy thing for the project as well, not to rely too much on a single person, at least once it gets to the proper stage - which I think it has. Also, after almost 2 years, it is time for a change for me personally, and I believe the new job I will soon start will be a great opportunity for me to do both interesting and important work, alongside some great people.&lt;br /&gt;&lt;br /&gt;Some important stuff about Syntensity:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Now that my personal business goals are irrelevant, the Syntensity/Intensity Engine name split is not really necessary (it was inspired by things like StatusNet/identi.ca, which clearly separate the open source project from a commercial use of it). So, henceforth &lt;span style="font-weight: bold;"&gt;the Intensity Engine may also be called the Syntensity Engine or just Syntensity&lt;/span&gt;. I won't bother to go through all the code and docs to change every reference to "Intensity Engine" to "Syntensity", but Syntensity is now the preferred name (it's shorter, and easier to google for). Note that syntensity.com will remain up of course, as a 'hub' for Syntensity game development, hosted by me, without change.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;I will be changing the licensing of the Intensity Engine/Syntensity, from GPL3 to the (new) BSD.&lt;/span&gt; Some of the reasons have already been mentioned in previous blog posts. Another is for the following reason: Allowing commercial use is a major goal of Syntensity, but for games that means non-GPL licenses are a must (you can't run GPL code on consoles, etc.). Dual-licensing with the GPL is possible, and was the general idea so far. But since I will have significantly less time for this project, and the business opportunities of dual-licensing no longer relevant for me, it doesn't make sense to deal with the complexities of dual-licensing (copyright assignment to some central entity, etc.). It is just simpler to move to the BSD license for all involved.&lt;/li&gt;&lt;li&gt;Once I start working, I will be much less on IRC. However, I will of course continue to be active on the &lt;a style="font-weight: bold;" href="http://forum.freegamedev.net/viewforum.php?f=26"&gt;Forums&lt;/a&gt;, so feel free to use that in order to contact me, for stuff both important and nonimportant.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-4626299650886706695?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/4626299650886706695/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/04/personal-and-project-changes.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4626299650886706695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4626299650886706695'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/04/personal-and-project-changes.html' title='Personal and Project Changes'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1475585884389626129</id><published>2010-03-18T04:12:00.000-07:00</published><updated>2010-03-18T04:15:56.089-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='docs'/><category scheme='http://www.blogger.com/atom/ns#' term='scripting'/><title type='text'>New Script Tutorial/Docs</title><content type='html'>Continuing the recent trend of writing docs, I wrote a new scripting tutorial, which is now present in the git repo. See&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://github.com/kripken/intensityengine/blob/master/docs/scripting.markdown" class="postlink"&gt;docs/scripting.markdown&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That document refers to the example scripts in&lt;br /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://github.com/kripken/intensityengine/tree/master/docs/scripting_examples/" class="postlink"&gt;docs/scripting_examples/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This should be a clear and easy way to get started with scripting in the Intensity Engine. I'll add more examples later on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1475585884389626129?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1475585884389626129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/03/new-script-tutorialdocs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1475585884389626129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1475585884389626129'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/03/new-script-tutorialdocs.html' title='New Script Tutorial/Docs'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-103804370213607104</id><published>2010-03-16T07:47:00.001-07:00</published><updated>2010-03-16T07:51:23.297-07:00</updated><title type='text'>'Making a Game' Tutorial</title><content type='html'>There is an increasing amount of interest in using the Intensity Engine separately from syntensity.com, in some cases without a master server at all (like, say, for a singleplayer game). The engine supports this very well, but documentation has been lacking. So, I started to write a &lt;a style="font-weight: bold;" href="http://github.com/kripken/intensityengine/blob/master/docs/tutorial_making_a_game.markdown"&gt;tutorial for that&lt;/a&gt;. Feedback is welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-103804370213607104?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/103804370213607104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/03/making-game-tutorial.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/103804370213607104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/103804370213607104'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/03/making-game-tutorial.html' title='&apos;Making a Game&apos; Tutorial'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2657781889530623790</id><published>2010-03-14T10:10:00.000-07:00</published><updated>2010-03-14T10:18:04.496-07:00</updated><title type='text'>Rain Effect</title><content type='html'>Somebody on IRC mentioned today that a rain effect would look nice, so I made a quick one:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Er4lYlqCGT0&amp;hl=en_US&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Er4lYlqCGT0&amp;hl=en_US&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Note how the rain is realistic in that it falls until it hits something, then shows a splash. So there is no rain inside the castle or underneath the scenery. This takes a little CPU, so very heavy rain (thousands of drops at once) might slow you down. In the video there are about 1,000 and speed seems ok.&lt;br /&gt;&lt;br /&gt;The effect is about 40 lines of code, in library/1_3/CustomEffect.js. You can see it in action if you run the latest git, and play the storming_test map.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2657781889530623790?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2657781889530623790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/03/rain-effect.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2657781889530623790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2657781889530623790'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/03/rain-effect.html' title='Rain Effect'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-4908036518576820049</id><published>2010-03-14T04:39:00.000-07:00</published><updated>2010-03-14T04:52:56.846-07:00</updated><title type='text'>Editing Tools in JavaScript</title><content type='html'>&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/acWI1KyR0_8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/acWI1KyR0_8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The video shows a 'slope tool' that makes it easy to create sloped surfaces in cube geometry. It isn't finished, but it shows what can be achieved by this approach, I think.&lt;br /&gt;&lt;br /&gt;Basically, this is done using new JavaScript API bindings to editing code that works on the cube octree. Actually the editing code is fairly old - it was &lt;a href="http://www.youtube.com/watch?v=2Wiob-UaqQ8"&gt;used already&lt;/a&gt; in a very early version of the Intensity Engine - but it was not enabled in the current JavaScript API until this week.&lt;br /&gt;&lt;br /&gt;Using the expressive power of JavaScript, it is easy to create editing tools like this one, for all sorts of purposes. For example it can be used to import maze files to create maps with them, etc.&lt;br /&gt;&lt;br /&gt;You need to run the latest compiled engine for this. The code is in &lt;span style="font-weight: bold;"&gt;library/1_3/Editing.js&lt;/span&gt;, and you can see it in action in &lt;span style="font-weight: bold;"&gt;kripken/editdemo&lt;/span&gt;, which you can run by entering that name into the server_runner plugin GUI, after logging in to the master (see &lt;span style="font-weight: bold;"&gt;README-standalone.txt&lt;/span&gt;). To see it work as in the video, do /actionkey0 when hovering on one corner, then the same command when hovering on the opposite corner (this is just for demo purposes, not how the final controls should be).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-4908036518576820049?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/4908036518576820049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/03/editing-tools-in-javascript.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4908036518576820049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4908036518576820049'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/03/editing-tools-in-javascript.html' title='Editing Tools in JavaScript'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-3316106730911431746</id><published>2010-03-12T00:37:00.001-08:00</published><updated>2010-03-13T01:55:12.808-08:00</updated><title type='text'>Move to a Permissive License? (Part 2)</title><content type='html'>This is a followup to &lt;a style="font-weight: bold;" href="http://syntensity.blogspot.com/2010/03/move-to-permissive-license.html"&gt;this post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Following the previous post, I got some feedback in comments and on IRC. Here are some of the points raised, and comments on them:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It was pointed out to me that zlib is the most permissive license of those mentioned, allowing binary copies to be made without attribution, whereas BSD still requires that you keep the copyright notice in that case (so you don't need to distribute the source, but you do need to document that you are using code written by whomever wrote it). It seems MIT does the same thing, but the wording is slightly less clear - BSD explicitly mentions source and binary distributions, while MIT just talks about 'copies of the software' (which many people seem to interpret as intending both source and binaries, but I would have expected to see something like 'copies or transformations of the software', where 'transformations' means compilation to binary form, etc.). So, out of zlib/BSD/MIT, I lean towards ('new') BSD.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I should clarify my goals with the license change. There are basically two: First, I want the code to be useful for people, however it can be, which includes making money off of it in commercial games. My second goal is to improve the situation of open source in gaming - which is currently one of the last fields of software almost entirely dominated by proprietary code (compare the situation to operating systems, web browsers, web servers, databases, programming languages, etc. - open source is doing very well in all of those). I guess the two goals are not necessarily in perfect alignment, hence the need to think carefully about the license.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Also I should clarify my own personal goals&amp;amp;status: I am looking for a job right now, so I will likely have less time for this project than I have had, but I certainly intend to continue contributing. Anyhow since we are past a stable 1.0 release, and the engine is in very good shape, really what we need now is more people creating games with it rather than more engine features that I add.&lt;br /&gt;&lt;br /&gt;About my role in the project, I would be very happy if the development team were to expand, and have more sharing of responsibilities. I've been talking to related projects and various people about that, and hopefully there will be progress on that front soon. Permissive licensing might make that easier, since with GPL projects it matters who owns copyright, whether you have copyright assignment or not, and all that, whereas in permissively licensed projects it is far less of an issue.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I've been looking at open source code that &lt;span style="font-weight: bold;"&gt;is&lt;/span&gt; successful in gaming, for inspiration. Basically three projects come to mind, detailed below. I'm not sure what lesson to learn from them yet, but they are worth thinking about.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Quake Engine(s)&lt;/span&gt;: Released as open source some time after the commercial releases, GPL with dual licensing. The GPL option has been used extensively in the open source community. However, the GPL uses did not become a significant force in gaming. Basically the GPL code releases play catchup, always being behind the closed code. Also, it is not certain that GPL code releases will continue after id Software was acquired by ZeniMax.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Ogre 3D&lt;/span&gt;: Used to be LGPL + optional commercial licenses, has moved to MIT. It is not clear yet if moving to the MIT license will change anything, as Ogre 3D was already doing very well before, including being used in commercial games. I am guessing that Ogre 3D has support for consoles, but that code isn't in the public repo (likely it can't be, because of the console SDK terms of use), which leads to a quasi-dual licensing model: Free for use (MIT) on regular computers, requires a license for consoles (or, implement all the console integration yourself, in theory).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Bullet&lt;/span&gt;: zlib licensed. The Bullet physics library is very popular, and has been used in many commercial applications, including ones that significantly modified Bullet, presumably without contributing changes back (but not sure). Unlike Ogre 3D, Bullet can be used on consoles freely, as there is really no need for special console integration code.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-3316106730911431746?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/3316106730911431746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/03/move-to-permissive-license-part-2.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3316106730911431746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3316106730911431746'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/03/move-to-permissive-license-part-2.html' title='Move to a Permissive License? (Part 2)'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6191193214724994305</id><published>2010-03-11T07:14:00.000-08:00</published><updated>2010-03-13T01:55:44.380-08:00</updated><title type='text'>Move to a Permissive License?</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;I am considering relicensing all the code I wrote in &lt;a style="font-weight: bold;" href="http://www.syntensity.com/toplevel/intensityengine/"&gt;this project&lt;/a&gt; to something more permissive, like zlib, BSD, Apache, etc. - basically, to let people use the code entirely freely. Please let me know whether you think that is a good idea or not, and if it is, which license we should switch to. This is a big decision - involving some 65,000 lines of code (about the same as Cube 2, btw) - so it should be done carefully.&lt;br /&gt;&lt;br /&gt;As background, I chose the AGPL when I started, because I wanted to keep open the possibility of dual-licensing (to generate income for the project), and to make fragmentation of the community less likely. The situation with both of these has changed: I don't intend to make money myself from this project anymore (I still think it can be done - but it would take time, and before that time arrives, I will have run out of money myself...), and so far there seems little worry of fragmentation and incompatible forks.&lt;br /&gt;&lt;br /&gt;So, I am considering moving to a license like zlib/BSD/etc., which are simpler and make life easier for people using the code - clear benefits, and could lead to more people using the code. Of course the flip side is that the code could then be used and modified in closed source projects without returning anything to the community. These are the usual tradeoffs between the BSD and GPL approaches.&lt;br /&gt;&lt;br /&gt;Some thoughts on possible licenses:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;zlib&lt;/span&gt;: Same license as Cube 2, so kind of simple in that respect - a single license for almost the entire project (almost, because things like V8, ENet, Django, etc., have other licenses).&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;BSD&lt;/span&gt;: Probably the most common permissive license out there, and the most familiar to people. Also worth mentioning, zlib is not an option on Google Code, while BSD is.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Apache&lt;/span&gt;: Permissive, while adding some patent protections, which is useful. However, it does make the license text quite long and complex compared to zlib/BSD/MIT, which is a downside. Another downside is Apache is not compatible with GPL2, but is with GPL3. There are many codebases out there that are GPL2-only (including ones relevant to this project) so that is an issue.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;LGPL, MPL, etc&lt;/span&gt;.: More permissive than GPL&amp;amp;AGPL, but still some requirement of giving back, at least for changes to existing code. If the license &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; to be changed, I kind of tend not to go this route, because the current license is already quite close to it, since we don't consider games to be derivative works anyhow, which makes our AGPL sort of like the LGPL in that respect (a good comparison is how the Linux kernel is GPL, but you can run apps in userspace that are not GPLed). So really the actual change in going to one of these licenses is the removal of the 'A' from AGPL, that is, removing the condition of providing the source even if running over a network.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So, again, I am looking for feedback on this topic. We can also hold a vote if there are strong opinions and that makes sense. One thing though: Please let's not make this into a GPL vs. BSD flamewar with all the usual arguments we have all heard before - I ask that the discussion be about &lt;span style="font-weight: bold;"&gt;this&lt;/span&gt; project, which license makes sense for it (and not which license in general is 'better').&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EDIT: Followups in &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://syntensity.blogspot.com/2010/03/move-to-permissive-license-part-2.html"&gt;this post&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6191193214724994305?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6191193214724994305/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/03/move-to-permissive-license.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6191193214724994305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6191193214724994305'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/03/move-to-permissive-license.html' title='Move to a Permissive License?'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-537686263650702509</id><published>2010-03-03T00:46:00.000-08:00</published><updated>2010-03-03T01:16:28.515-08:00</updated><title type='text'>Running Locally &amp; Singleplayer</title><content type='html'>The &lt;a href="http://syntensity.blogspot.com/2010/03/local-server-runner-plugin.html"&gt;server runner plugin&lt;/a&gt; can now work entirely offline - without connecting to anything remote, not even a master. In such a case it will run using the local files. Basically, running a map is now as easy as entering the name of the map in the GUI and clicking 'start'.&lt;br /&gt;&lt;br /&gt;In such a situation you don't have any of the benefits of the master server, like getting the latest version of the game, being able to upload changes, play multiplayer or co-op games, etc. But, it is useful for when you don't have a network connection, for demos, or if you just want to run entirely standalone - like for a singleplayer game.&lt;br /&gt;&lt;br /&gt;Speaking of singleplayer games, in a few lines of script the client can now be set up to automatically run a certain map using the plugin, which would basically turn the client into a single-purpose game: Start the client, and that game runs. If you also change the branding (logo, menus, etc.), it is now easy to use the Intensity Engine for your own singleplayer games.&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;br /&gt;(The underlying functionality for these new features is that you can set &lt;span style="font-weight: bold;"&gt;[Activity] force_location&lt;/span&gt; on the server, and it will run the map with that location, without querying the master. It will also communicate that fact to the client, so it does the same. The server runner plugin basically runs the server in a transparent way, with that feature enabled.)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-537686263650702509?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/537686263650702509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/03/running-locally-singleplayer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/537686263650702509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/537686263650702509'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/03/running-locally-singleplayer.html' title='Running Locally &amp; Singleplayer'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6696057003463846576</id><published>2010-03-01T06:15:00.000-08:00</published><updated>2010-03-01T09:10:12.417-08:00</updated><title type='text'>Local Server Runner Plugin</title><content type='html'>People have complained that local editing and playing were harder than it should be. A plugin that I finished writing today, server_runner, should help with that. When the plugin is active, you can start a local server with just a few clicks in the GUI. The plugin will run the server in a separate process (so if your scripts crash the server, the client won't crash - kind of like how modern web browsers run plugins in separate processes).&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Activate the plugin: Add intensity.components.server_runner to &lt;span style="font-weight: bold;"&gt;[Components] list &lt;/span&gt;in your settings.cfg&lt;/li&gt;&lt;li&gt;After logging in to the master, click on 'plugins...' in the main menu. You will then see the status of the local server.&lt;/li&gt;&lt;li&gt;Tell the plugin which map to run (simply by writing the location of the map, e.g. "racetrack" for the racing map). Then click &lt;span style="font-weight: bold;"&gt;start&lt;/span&gt;, and wait a bit while the server is started up for you. As soon as it is ready you will automatically connect to it.&lt;/li&gt;&lt;li&gt;The server will be shut down automatically when you close the client, or connect to another server, so no need to worry about that. You can also shut it down in the GUI if you want (which is necessary to start it up with a different map).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Limitations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Requires you to be logged in to the master, but allowing master-less running would be possible if people want it.&lt;/li&gt;&lt;li&gt;If the server crashes, output is saved to ~/.intensityengine_client/out_server.txt (note: not in the install directory, but the engine home directory). A nice GUI for viewing the output should be added later.&lt;/li&gt;&lt;li&gt;You can't write the location of a map that you never played on before, as it only looks locally for translating the map location to the asset info.&lt;/li&gt;&lt;li&gt;Tested on Linux. Should work on other OSes (it is 99% pure Python), but not tested yet.&lt;/li&gt;&lt;li&gt;The server still uses a network port, so your firewall may ask about that. It would be possible to move to a pure IPC solution later, without that problem, but it would be additional work.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;You must be running the latest git source code to use the plugin. If you do, I'd be happy to hear feedback on how things work.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Background:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Sauerbraten, the engine that the Intensity Engine is based on, lets you easily run a local server - it runs the server &lt;span style="font-weight: bold;"&gt;inside&lt;/span&gt; the client, in fact. This makes sense, since the Sauerbraten server is very simple, it is basically a network message router.&lt;br /&gt;&lt;br /&gt;However, the Intensity Engine lets you run scripts and physics on the server, which raises the possibility of the server crashing (due to bugs in scripts, etc.). The server also can take a lot more CPU and RAM because of that. Consequently, the server is strictly separated from the client - there is no option to run it inside the client. Another reason is since the server now does a lot of the things the client does (scripts, physics), then maintaining a single codebase with the server defined as separate - and not two options, separate or internal - is much easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6696057003463846576?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6696057003463846576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/03/local-server-runner-plugin.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6696057003463846576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6696057003463846576'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/03/local-server-runner-plugin.html' title='Local Server Runner Plugin'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7493676187923866801</id><published>2010-02-15T08:42:00.000-08:00</published><updated>2010-02-15T08:49:48.699-08:00</updated><title type='text'>Bullet Physics</title><content type='html'>&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1vvsVkdJiSQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/1vvsVkdJiSQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The embedded video shows the &lt;a href="http://bulletphysics.org/"&gt;Bullet&lt;/a&gt; physics library being used in a Syntensity world. 100 boxes are simulated, as well as the static world geometry. As you can see, the boxes behave in a physically realistic way.&lt;br /&gt;&lt;br /&gt;This is just an early demo - it would take more work to get this ready for actual games. But the hard integration part is now finished.&lt;br /&gt;&lt;br /&gt;If you're curious to run this yourself, then instructions are at the end of the COMPILE.txt file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7493676187923866801?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7493676187923866801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/02/bullet-physics.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7493676187923866801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7493676187923866801'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/02/bullet-physics.html' title='Bullet Physics'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5163079241824891767</id><published>2010-02-10T06:43:00.001-08:00</published><updated>2010-02-10T06:54:14.598-08:00</updated><title type='text'>Windows Building Improvements</title><content type='html'>Building on Windows should now be much easier:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SDL (all parts) is bundled in the git repo in binary form, so you don't need to get that or set it up. These are the latest versions of SDL, which include some useful bugfixes.&lt;/li&gt;&lt;li&gt;Likewise the latest zlib is bundled in binary form.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Boost.Python is bundled in source code form, and compiles correctly, which prevents the need to get or set up Boost at all. This is very nice as the precompiled Boost we previously used assumed you were using Python 2.5. Consequently, the engine will now build using Python 2.6.&lt;/li&gt;&lt;/ul&gt;The process should now be very easy, basically just&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get git, scons, CMake and Python.&lt;/li&gt;&lt;li&gt;Get the Intensity Engine source code.&lt;/li&gt;&lt;li&gt;Build V8.&lt;/li&gt;&lt;li&gt;Run CMake to generate a VC++ project file.&lt;/li&gt;&lt;li&gt;Build the project in VC++.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;For specific details, as usual see the &lt;a href="http://github.com/kripken/intensityengine/blob/master/COMPILE.txt"&gt;COMPILE.txt&lt;/a&gt; file.&lt;br /&gt;&lt;br /&gt;I develop on Linux, so sometimes the Windows stuff gets delayed, sorry about that. Speaking of which, volunteers willing to help with Windows and OS X stuff would be very welcome.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5163079241824891767?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5163079241824891767/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/02/windows-building-improvements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5163079241824891767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5163079241824891767'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/02/windows-building-improvements.html' title='Windows Building Improvements'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-4170031316517071712</id><published>2010-02-02T06:22:00.000-08:00</published><updated>2010-02-02T07:48:55.189-08:00</updated><title type='text'>Browser Plugin: Proof of Concept</title><content type='html'>In the following video you can see Syntensity being run inside a browser, as a plugin:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/BcDeJq38oVA&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/BcDeJq38oVA&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;This is a followup to my post from last week, &lt;a href="http://syntensity.blogspot.com/2010/01/3d-and-open-web.html"&gt;3D and the Open Web&lt;/a&gt;. After the speculation in that post, I got to coding, and the result is a working proof of concept.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Status&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The plugin works, as you can see in the video, and you can enter Intensity Engine servers (including Syntensity's) normally, just as you would with the regular client. This is still in early stages, however, so you should expect some limitations:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The plugin will currently only build on Linux (where I develop). However the code on which I worked is cross-platform (see below), so this should not be a problem to remedy later. Meanwhile, Linux users can try it out for themselves using the instructions at the end of the COMPILE.txt file.&lt;/li&gt;&lt;li&gt;Works in Firefox and Chrome, not tested elsewhere (that's Chrome you see in the video).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mouse input works reasonably well. Keyboard input should work as well, but doesn't, probably for some minor GDK reason I will look into later.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Technical Details&lt;/span&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt; and Notes&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Built using the O3D plugin code (which in turn is closely related to the Chrome codebase). The O3D code is not meant to be a general-purpose basis for browser plugins in general, so it took some hacking to get things working, especially to integrate with SDL (which we use for rendering and input). Not surprising I guess. Anyhow, the O3D code was very useful here, thank you to the authors!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The implementation I wrote runs client instances in separate processes, which is good for security and stability. In other words, the browser plugin is a small component that runs actual clients (that render, run physics etc. etc.) in separate processes.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Interprocess communication is done using boost::interprocess (Chrome's more powerful IPC turned out to be more complicated to set up, and anyhow it's probably overkill for what we need).&lt;/li&gt;&lt;li&gt;Very few modifications were necessary in the main Intensity Engine codebase. Rendering is still done using SDL, etc. A couple of minor tweaks were needed here and there, though.&lt;/li&gt;&lt;li&gt;A combination of Firefox and Chrome turned out to be useful during development - Firefox is easier to use in debug mode, to figure out crashes, while Chrome is more resilient to crashes bringing down the entire browser (although I hear Firefox will be adding a similar feature soon).&lt;/li&gt;&lt;li&gt;Overall, my conclusion is that the browser plugin approach is not easy (there were several technical hurdles that I ran into, like &lt;a href="http://bugs.python.org/issue4434"&gt;this&lt;/a&gt;) - but it is possible.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Other Approaches&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As an experiment, I think it is now clear that the browser plugin way is feasible. It's still an open question of whether it is the best approach, or whether one of the alternatives (mentioned in the previous post) would make more sense. I tend to favor this approach though (making our own browser plugin), for the following reasons.&lt;br /&gt;&lt;br /&gt;I have gotten no response on the O3D mailing list, where I asked about possible collaboration (like contributing our code to there, to add features games need like networking, physics, etc.). I guess it isn't relevant for them. In that case, it probably doesn't make sense for us to move to O3D - porting the rendering engine would be a lot of work, and it turns out that making our own browser plugin (in part using their non-rendering code) is feasible.&lt;br /&gt;&lt;br /&gt;WebGL seems to be favored by some people in the virtual worlds community. It's definitely an interesting technology, but I am doubtful it would work for games, or more specifically action games like we have in Syntensity, for several reasons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;WebGL is not complete, and WebGL's performance limitations are not yet clear (and not sure when they will be).&lt;/li&gt;&lt;li&gt;WebGL + JavaScript - a pure web implementation - would be too slow for very complex clientside physics. NaCl might help with that, eventually.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Network protocol-wise, TCP (even with nifty things like Comet, etc.) can't give the performance that UDP can, in terms of realtime updates.&lt;/li&gt;&lt;li&gt;Also, it is unclear if WebGL will ever make its way into Internet Explorer. After all, WebGL is based on OpenGL, which Microsoft has been trying to kill. A related issue is that not only is a major browser hostile to WebGL, but also a major desktop operating system - users often need to manually install OpenGL drivers from the manufacturer's website, which is no better than installing a browser plugin (in some ways worse).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That said, the Intensity Engine has always been a web-oriented project, what with JavaScript used for scripting, HTTP for asset downloads, asset and server management done using a web interface (on Django), etc., so if later on WebGL matures into something relevant for us, we can certainly consider moving to it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Bottom Line&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;The open source community can have something like a FOSS Quake Live, or more generally a proper open solution for 3D content on the web, from casual stuff to multiplayer action games. The potential here is vast, and it is within reach, basically right now.&lt;br /&gt;&lt;br /&gt;If we are to go forward with this, we will need help from the open source community, as browser plugins need a lot of testing on all the different operating systems and browsers and so forth. So, help is welcome. Also, ideas on how to do things would be appreciated, in particular about how to get the licensing issue right - as mentioned in the previous post, if changing our license will get more people on board, we are open to discussing that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-4170031316517071712?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/4170031316517071712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/02/browser-plugin-proof-of-concept.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4170031316517071712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4170031316517071712'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/02/browser-plugin-proof-of-concept.html' title='Browser Plugin: Proof of Concept'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-3134880068273233590</id><published>2010-01-24T05:35:00.000-08:00</published><updated>2010-01-26T10:14:13.504-08:00</updated><title type='text'>3D and the Open Web</title><content type='html'>This post is a call for feedback, about Syntensity's engine (the Intensity Engine) being used on the web. The basic idea is that we - people on the web - should avoid what happened with Flash, a single vendor controlling a closed technology, which became the de facto standard for video and interactive content for many years. Instead, we need an open source solution, not controlled by any one corporation. I think the Intensity Engine is close to being suitable for that, and am looking for feedback on this idea, and help in achieving it.&lt;br /&gt;&lt;br /&gt;A big part of the success of the web is its openness: We can run websites on any of several webservers, some of them open source (Apache, lighttpd, nginx, etc.), and visit those websites using likewise open source web browsers (Firefox, Chromium, etc.). That's an amazing achievement. And let's not forget that just a few years ago Internet Explorer was dangerously close to a choke hold on the web browser side.&lt;br /&gt;&lt;br /&gt;Video, these days, is often in the tech news: Specifically, using open, standardized technologies to play video on the web, using HTML5. There are some problems along the way, but overall we might be close to getting past video on the web being entirely reliant on Flash - a closed-source product controlled by a single company, and one that doesn't necessarily perform as well or the same on all platforms.&lt;br /&gt;&lt;br /&gt;Here I'd like to talk about the "3D Web". The term was overhyped in the past, but really all I mean here is 3D content, mainly games and virtual worlds, that are accessible on the web. This is currently a smaller area than the web in general, or even video on the web, but it is growing in importance. My concern is that the open web should avoid 'Flashification' of 3D content, where a single closed-source product becomes the de-facto standard in the area, like Flash had (and mostly still has) in video, 2D gaming and interactive content. If we want to avoid that, the time is now.&lt;br /&gt;&lt;br /&gt;There are some open technologies that show promise, mainly WebGL and Google's O3D. These may well end up succeeding. However, neither is a complete game engine, like for example the Unity 3D web plugin. There is a lot more that is necessary over what is present in WebGL and O3D - physics, content creation tools, a proper API and useful libraries, network protocols (for multiplayer), etc. etc. Some of that might be added to WebGL and O3D using JavaScript. However, many games are too computationally intensive, even with the best JavaScript engines out there.&lt;br /&gt;&lt;br /&gt;Perhaps at some point Google Native Client (NaCl) will allow running game engines on the web. But instead of entirely relying on that, I think the open web needs an open source 3D gaming engine. The time to do it is now, before something else non-open comes to dominate the field. I'd like to suggest the Intensity Engine for that purpose: It is a complete, stable, cross-platform game engine. It works right now (outside of browsers) and has been in production for several months, successfully, on syntensity.com. It is 100% open source, and the current license, the AGPL, can be modified immediately to something else, like the BSD license, if that makes sense for this purpose. Also, the Intensity Engine was built with something like the web in mind - we use JavaScript to create games (Google V8 right now, and we also did some tests with SpiderMonkey), for example. In our mind, the ability to download and run games was always in parallel to how web browsers download and run web pages.&lt;br /&gt;&lt;br /&gt;One concrete idea among others is to port the Intensity Engine's rendering system to O3D, and build a browser plugin of the result. The benefit being O3D is already set up as a browser plugin, while the Intensity Engine provides all the other game engine stuff. Alternatively, we can just port the Intensity Engine as-is to be a web browser plugin, assuming that would work with SDL (if not, would need to work on replacing that).&lt;br /&gt;&lt;br /&gt;So, I'm looking for feedback about this topic, and ideas and help for how to move it forward. I really feel it isn't just us over here (in 3D gaming) that care about this stuff - lots of people want the web to remain open, and that should include 3D content and games.&lt;br /&gt;&lt;br /&gt;Thanks for your responses!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Edit&lt;/span&gt;: I posted on relevant mailing lists about this,&lt;a href="https://www.khronos.org/webgl/public-mailing-list/archives/1001/msg00190.html"&gt;&lt;br /&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/o3d-discuss/browse_thread/thread/4873e584533eec58"&gt;o3d-discuss&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.khronos.org/webgl/public-mailing-list/archives/1001/msg00190.html"&gt;WebGL&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/mozilla-labs/browse_thread/thread/b42ad1dbb7b01cc2#"&gt;mozilla-labs&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-3134880068273233590?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/3134880068273233590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/01/3d-and-open-web.html#comment-form' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3134880068273233590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3134880068273233590'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/01/3d-and-open-web.html' title='3D and the Open Web'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-3899185756504745562</id><published>2010-01-24T03:26:00.000-08:00</published><updated>2010-01-24T03:44:43.291-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intensityengine'/><title type='text'>Local Storage Plugin</title><content type='html'>A new plugin has just been committed, local storage, which lets you store key-value pairs locally. It's currently being used to persist the high scores in the Racing game.&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add &lt;span style="font-weight: bold;"&gt;intensity.components.local_storage&lt;/span&gt; to the proper place ([Components] list) in your settings.cfg, so the plugin will be loaded.&lt;/li&gt;&lt;li&gt;In your scripts, do &lt;span style="font-weight: bold;"&gt;CAPI.signalComponent('LocalStorage', 'read|KEY');&lt;/span&gt; to read the value for KEY. You will get in response a string (all output from signalComponent is in string form), so do eval() on that. The result will be a list of responses from components. Normally you will have only one storage component, so just get the value at index [0].&lt;/li&gt;&lt;li&gt;To write values, do &lt;span style="font-weight: bold;"&gt;CAPI.signalComponent('LocalStorage', 'write|KEY|VALUE');&lt;/span&gt; to write that KEY-VALUE pair.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;That's basically it. See also the source file for some technical docs and notes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-3899185756504745562?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/3899185756504745562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/01/local-storage-plugin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3899185756504745562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/3899185756504745562'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/01/local-storage-plugin.html' title='Local Storage Plugin'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5751634875143765080</id><published>2010-01-18T09:33:00.001-08:00</published><updated>2010-01-18T09:48:45.541-08:00</updated><title type='text'>New Forums on FreeGameDev</title><content type='html'>We have recently been given a space on the FreeGameDev Forums, which is a much better place for community discussion than our current forum page. You can check out our new forums there &lt;a style="font-weight: bold;" href="http://forum.freegamedev.net/viewforum.php?f=26"&gt;at this link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Aside from a more standard and useful forum approach - subforums, topics, etc. - it also makes a lot of sense for us to do it on FreeGameDev, because we share their approach about combining free and open source software with gaming. Gaming is, sadly, one of the last areas to which open source has not yet made a big impression. Most game engines are entirely closed source, and in fact many games also run entirely on locked-down hardware (consoles).&lt;br /&gt;&lt;br /&gt;But that isn't how things need to be, and I predict they will change. The are reasons that led to our having open source operating systems, web browsers, web servers, and so forth, that are either better than or equivalent to competing closed source products, and those reasons are essentially the same in gaming.&lt;br /&gt;&lt;br /&gt;So, having forums as part of the FreeGameDev Forums makes a lot of sense, and I hope it will lead to more interaction between Syntensity people and other open source game creators.&lt;br /&gt;&lt;br /&gt;Thanks to the FreeGameDev people for agreeing to host our forums there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5751634875143765080?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5751634875143765080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/01/new-forums-on-freegamedev.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5751634875143765080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5751634875143765080'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/01/new-forums-on-freegamedev.html' title='New Forums on FreeGameDev'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5296258411422380511</id><published>2010-01-17T23:31:00.000-08:00</published><updated>2010-01-17T23:36:56.091-08:00</updated><title type='text'>Progress on Mac OS X support</title><content type='html'>Thanks to abs1nth, the client now compiles on Snow Leopard (and possibly other versions). To do so, get the latest git source and follow the &lt;a href="http://github.com/kripken/intensityengine/blob/master/COMPILE.txt#L131"&gt;OS X section in the COMPILE.txt file&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The move to CMake, and removing the external dependency on Boost, made this more feasible than before (and they also make building on Windows easier).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5296258411422380511?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5296258411422380511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/01/progress-on-mac-os-x-support.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5296258411422380511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5296258411422380511'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/01/progress-on-mac-os-x-support.html' title='Progress on Mac OS X support'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5246081675179572804</id><published>2010-01-15T08:45:00.000-08:00</published><updated>2010-01-15T12:29:47.067-08:00</updated><title type='text'>HOWTO: Make your own Razanak maps/levels</title><content type='html'>In Syntensity everything is moddable. That includes &lt;a href="http://syntensity.blogspot.com/2010/01/razanak-aka-swarm.html"&gt;Razanak&lt;/a&gt;, the game we launched recently. Below is a step-by-step guide to starting your own Razanak-type map.&lt;br /&gt;&lt;br /&gt;"Razanak-type map" means: Everything will be exactly the same as in Razanak - gameplay, entity types, HUD, etc. etc. - except for the map itself and entities in it. That means you can create the level however you want: You can add corridors, caverns, water, spawnpoints for the spider robots, rocket turrets, doors, keycards, pickups, and so forth, however you want. You can make levels similar to the existing one, or entirely different ones - it's up to you.&lt;br /&gt;&lt;br /&gt;Here are the steps to follow, to prepare a new map based on Razanak:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Click on Razanak in the &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://www.syntensity.com:8888/tracker/instances/"&gt;list of running servers and activities&lt;/a&gt;.&lt;span style="font-weight: normal;"&gt; This gets you into the Razanak activity.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;Click on the map asset&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;. &lt;/span&gt;&lt;span style="font-weight: normal;"&gt;This gets you into the actual asset containing the map. (You could have gone here directly if you had a link, instead of through the activity, so step 1 isn't really needed. But it's how you might usually do things.)&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Click 'clone'. &lt;span style="font-weight: normal;"&gt;You now have a copy of the map that you can edit, as its owner. (Note that to do this step you need to be logged in on the master website.)&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Change the 'location' of the asset. &lt;span style="font-weight: normal;"&gt;The location is where it will be downloaded to in the asset storage areas on the client and server. If you don't change it, it will stay the same as Razanak itself, which means that you will re-download Razanak and this map if you play one and then the other (since each such download will overwrite the one before it). Instead, change the location to something like &lt;span style="font-family:courier new;"&gt;base/USERNAME/mapname.tar.gz&lt;/span&gt; where USERNAME is your username (you don't need to do it that way, but it is nice and orderly).&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;Click "Create an activity based on this asset" to create an activity&lt;/span&gt;. You now have an activity, which you can run on servers (assets by themselves cannot be run).&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Rename the activity,&lt;span style="font-weight: normal;"&gt; to something you like&lt;/span&gt;.&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;Click "Requisition a server instance to run this activity"&lt;span style="font-weight: normal;"&gt;. One of the Syntensity servers will then run your copy of the map. You should see it in the list of your requisitioned servers.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;Connect to the running server instance&lt;/span&gt;. The simplest way is to run the client, login, enter the lobby, and look in the side room on the right. It will have portals to all the currently running servers. Walk into the one running your new map. You should then see the familiar Razanak map load.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;Press 'e' to enter edit mode&lt;/span&gt;. You can't do that on Razanak, but you are an owner of this copy, so you can do it now.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;Do /clearallents&lt;/span&gt;. That will erase all the entities in the map. Razanak has about 1,000 entities, and some of them require CPU to manage, so after doing this you will probably see the frame rate go nicely up.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;Do /newmap&lt;/span&gt;. That will erase all the world geometry. Note that you might not see any ground at all, but don't worry about that right now. Also, the map textures have been erased, so you shouldn't try to actually do any editing right now. Just go on to the next step.&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;Edit the map.js for your new map, as follows&lt;/span&gt;. You can edit it with an editor of your choice, the file is in ~/.intensityengine_client/packages/base/LOCATION-OF-YOUR-MAP (that you decided on in step 4). (Note that you should edit the map.js in the directory with the name of the location - and without .tar.gz - and not the archive ending in tar.gz.) (In Windows, replace ~ with C:\Users\USER or C:\Documents and Settings\USER, etc.). Or, you can use the in-game editor, press Escape and then editing commands...-&gt;cfg (then do 'load'). The actual editing you need to do is to add these two lines at the *top* of the very short map.js already there:&lt;br /&gt;&lt;br /&gt;  Global.entitiesFile = './entities.json';&lt;br /&gt;  Global.noCutscenes = true;&lt;br /&gt;&lt;br /&gt;The first line tells the map to use &lt;/span&gt;&lt;span style="font-weight: normal;"&gt;your &lt;/span&gt;&lt;span style="font-weight: normal;"&gt;entities data (not Razanak's), and the second tells the map not to use Razanak's cutscenes. Again, be sure to place these two lines *before* the existing line.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;span style="font-weight: bold;"&gt;Do 'upload map...'&lt;/span&gt; (press Escape first for the menu). When the upload finishes, the new version of the map will run on the server and you will be placed in it automatically.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;You can now start mapping! More details about mapping and creating in general are on the &lt;a href="http://wiki.syntensity.com/creating/"&gt;wiki&lt;/a&gt;, and as usual feel free to ask for help on IRC (#syntensity on FreeNode) and the forum.&lt;br /&gt;&lt;br /&gt;Tip: To get started, you might want to add a WorldMarker (press F8 in edit mode, and select WorldMarker in the second tab), for which you edit the 'tags' field (rightclick on the entity) to &lt;span style="font-weight: bold;"&gt;[start_red]&lt;/span&gt; (note the [, ] symbols). That will be the position where the players start ('red' is the name of the team, which should really be named something else, but the default team names are 'red' and 'blue').&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5246081675179572804?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5246081675179572804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/01/howto-make-your-own-razanak-mapslevels.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5246081675179572804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5246081675179572804'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/01/howto-make-your-own-razanak-mapslevels.html' title='HOWTO: Make your own Razanak maps/levels'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-732347199118484685</id><published>2010-01-08T23:18:00.000-08:00</published><updated>2010-01-09T00:57:57.330-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='launch'/><category scheme='http://www.blogger.com/atom/ns#' term='razanak'/><title type='text'>Razanak a.k.a Swarm</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_F6KhIbZluDM/S0g1GyJymQI/AAAAAAAAACo/W2XsPRNzHM4/s1600-h/screenshot_226138.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_F6KhIbZluDM/S0g1GyJymQI/AAAAAAAAACo/W2XsPRNzHM4/s400/screenshot_226138.jpg" alt="" id="BLOGGER_PHOTO_ID_5424644141826087170" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;After much work, 'Swarm' has been launched, and is in the lobby. It is now named &lt;span style="font-weight: bold;"&gt;Razanak&lt;/span&gt; (thanks BiosElement!), which is 'Swarm' in Hungarian (give or take a few letters).&lt;br /&gt;&lt;br /&gt;To see all the visuals correctly, you need the 1.1.5 or 1.1.6 builds. You can currently log in with older versions, but that will be disabled very soon (possibly by the time you read this). The latest builds can be downloaded from the &lt;a href="http://www.syntensity.com/toplevel/download/"&gt;download page&lt;/a&gt; (optionally, you can also compile from source if you want). We hope to have builds with nicer installers, and for more platforms, soon.&lt;br /&gt;&lt;br /&gt;Currently there is one (big) level, with a boss at the end (that can be quite hard to kill). We plan to add more levels soon, they should be much faster to create now that the code is all ready.&lt;br /&gt;&lt;br /&gt;Have fun, and let us know what you think!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-732347199118484685?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/732347199118484685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/01/razanak-aka-swarm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/732347199118484685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/732347199118484685'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/01/razanak-aka-swarm.html' title='Razanak a.k.a Swarm'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_F6KhIbZluDM/S0g1GyJymQI/AAAAAAAAACo/W2XsPRNzHM4/s72-c/screenshot_226138.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1748951735490325291</id><published>2010-01-04T09:18:00.001-08:00</published><updated>2010-01-04T09:33:51.704-08:00</updated><title type='text'>Help us name and test 'Swarm'</title><content type='html'>We're almost finished with 'Swarm', and we'd really appreciate some help with naming it, and playtesting. So, if you want to help, check it out here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.syntensity.com:8888/tracker/activity/view/46183c34_3b4f_44dd_9a63_4ca498603bf1/"&gt;http://www.syntensity.com:8888/tracker/activity/view/46183c34_3b4f_44dd_9a63_4ca498603bf1/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and here is a video:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1M80DN-5Xgk&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/1M80DN-5Xgk&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;'Swarm' isn't in the lobby world yet, since it isn't finished. To test it, you need to requisition a server. If you need help in doing that, there are usually people on IRC (#syntensity on FreeNode) that can assist you.&lt;br /&gt;&lt;br /&gt;So, as already mentioned, at this point we are looking for a final name for this map ('Swarm' is just the codename). Feel free to suggest any and all names that you think make sense!&lt;br /&gt;&lt;br /&gt;Also, the map is ready for playtesting - everything should basically work, except for the boss at the end, which works but wasn't tested much yet. So if you find a bug or have a suggestion for how to improve something, that would be great (we probably won't change anything major at this point, though - just minor stuff. Big changes will wait for after we release the stable version of the game).&lt;br /&gt;&lt;br /&gt;Note that a recent build of the engine is necessary, preferably from source. Otherwise the visuals might not look as good as they should. We should have new builds available soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1748951735490325291?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1748951735490325291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2010/01/help-us-name-and-test-swarm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1748951735490325291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1748951735490325291'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2010/01/help-us-name-and-test-swarm.html' title='Help us name and test &apos;Swarm&apos;'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1292517188648676794</id><published>2009-12-31T01:32:00.001-08:00</published><updated>2009-12-31T07:22:33.687-08:00</updated><title type='text'>CMake and Git</title><content type='html'>This week the Intensity Engine has undergone a minor 'reboot': I moved it from SCons to CMake, and from bazaar+Launchpad to git+GitHub. The reasons are as follows.&lt;br /&gt;&lt;br /&gt;SCons is a really cool tool, especially for Python lovers like me, but CMake's ability to produce 'native' project files and makefiles is quite important. Basically, on Windows it is easier to make proper builds and installers if you use a Visual C++ project file, as opposed to SCons. I wasn't fully aware of this when I started the Intensity Engine a year and a half ago (being a Linux guy). Also, this will help on OS X, as CMake can produce Xcode project files. So, it made sense to move to CMake.&lt;br /&gt;&lt;br /&gt;Moving from bazaar to git was for related reasons. While bazaar works well in my experience, on both Linux and Windows, more than one person has told me it is very problematic for them on OS X. So, since working on OS X is very important to us, and also since in general people seem to prefer git, the switch was done. Basically, I prefer bazaar, but my personal preference isn't enough of a reason to stick with it. Anyhow, after finishing the move, I admit it is nice how fast git is, and GitHub has some nice features as well.&lt;br /&gt;&lt;br /&gt;So, the overall goal with these changes is to allow more people to more easily use and contribute to the Intensity Engine. The project is growing, in both lines of code and users, and it makes sense to use the best tools for the most people.&lt;br /&gt;&lt;br /&gt;For people currently compiling from source, the &lt;a href="http://github.com/kripken/intensityengine/blob/master/COMPILE.txt"&gt;COMPILE.txt&lt;/a&gt; file explains how to get the source using git and compile it using CMake. If you have any trouble, as usual feel free to ask for help on IRC (#syntensity on FreeNode) or on the &lt;a href="http://www.syntensity.com:8888/tracker/forum/"&gt;forum page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1292517188648676794?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1292517188648676794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/12/cmake-and-git.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1292517188648676794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1292517188648676794'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/12/cmake-and-git.html' title='CMake and Git'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2009300402886358621</id><published>2009-12-24T06:37:00.000-08:00</published><updated>2009-12-24T12:35:06.045-08:00</updated><title type='text'>Slower Languages for Faster Code</title><content type='html'>This post is both an update on performance improvements in the engine, and a general comment about how slower languages can lead to faster code, in a somewhat ironic way.&lt;br /&gt;&lt;br /&gt;So, the next game (codename 'swarm') has really pushed the Intensity Engine to new limits: the map is huge, both in terms of raw size (4096 cube units on each side, so imagine something like 500x500x500 meters), geometry (the compressed binary octree is 1.1MB), entities (about 1,000 of them), and includes several new gameplay elements (new bot types, new plot triggers and items, etc.).&lt;br /&gt;&lt;br /&gt;So, it initially ran very slowly, which was not really surprising. At first glance, this could lead someone to speculate that the engine, with its approach of doing as much as possible in a script language - JavaScript on Google V8 - simply isn't a good idea. After all, Cube 2, the engine we are a mod of, is written entirely in C++ (well, with cubescript in a very, very minor role), and therefore our engine should be much slower than where we started from. So didn't we just make things slower, needlessly?&lt;br /&gt;&lt;br /&gt;First of all, that isn't an apples-to-apples comparison, simply because Cube 2 can't run the new gameplay elements that we have. But more importantly to the current topic, &lt;span style="font-weight: bold;"&gt;if you &lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;did&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; mod Cube 2 to run the new gameplay elements, it&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;would almost certainly run this map more slowly&lt;/span&gt;. That seems strange at first, but it really isn't. The reason is that, while code-for-code JavaScript is slower than C++ (even with the best JavaScript engines like V8), using JavaScript lets you implement optimizations that don't make sense in C++.&lt;br /&gt;&lt;br /&gt;For example, if you have a fixed engine written in C++, you can of course tune it quite a lot, but there are additional things you can do if each map/game/level can customize things through scripts. For example, the swarm map has a lot of mapmodels, and the profiling tool reported that they were in fact a significant factor in slowing down the frame rate. Since the code that renders them is a script, I was able to easily customize it to run faster, by applying some heuristics that work well in this map (like certain ways of deciding when &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; to render a mapmodel). Those tricks might not work well in other maps, but that is exactly the beauty of a secure scripting language - each map can have its own scripts, downloaded on demand with the map. Also, I customized how physics for collision checks and so forth is done, and various other things.&lt;br /&gt;&lt;br /&gt;Basically, you don't want to download a whole new engine for each map. But that is what modding the C++ code would require. With a script language, on the other hand, you can code a lot of optimizations and distribute them with the map, in an easy way. So you end up being able to optimize a lot more.&lt;br /&gt;&lt;br /&gt;(There is another factor here, of lesser importance, but also worth mentioning: It is also simply easier to write those optimizations in a script language than C++, because script languages are faster to code with.)&lt;br /&gt;&lt;br /&gt;Of course, C++ has its place - the core engine has to be written in C++. Even Java or C# wouldn't be possible, because while being slower by a factor of 2 is fine for 95% of applications, that is &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; the case with game engines. Half the frame rate is not acceptable! But on top of a 'core' C++ engine, I believe it really makes sense to integrate a script language, as we do, and not just because it lets you run more types of games, but also for performance.&lt;br /&gt;&lt;br /&gt;Anyhow, to get back to the swarm game, at this point performance is good: On my not-powerful-at-all machine I get 60fps in the slower areas, dropping perhaps to 50fps with a lot of action. But in most of the map the frame rate is actually much higher. So, the optimization phase is almost over. What is left is to write the scripts for the final boss battle, and then to do a lot of playtesting and tweaking of the gameplay.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2009300402886358621?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2009300402886358621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/12/slower-languages-for-faster-code.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2009300402886358621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2009300402886358621'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/12/slower-languages-for-faster-code.html' title='Slower Languages for Faster Code'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8762747679587359318</id><published>2009-12-18T22:51:00.001-08:00</published><updated>2009-12-18T23:00:02.277-08:00</updated><title type='text'>Adding Plot Elements</title><content type='html'>I made a small video to demonstrate how plot elements are added to Syntensity games:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/f2w2GzPgvo0&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/f2w2GzPgvo0&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Plot elements are things like doors that need to be opened somehow, or platforms that appear so you can cross otherwise impassable areas. They are typically used in single-player games like Doom. Note that in Syntensity they function in multiplayer mode as well (there is no 'singleplayer mode' or 'multiplayer mode' in Syntensity - all games are always multiplayer-ready. But you can also play them locally with just one player, if you want).&lt;br /&gt;&lt;br /&gt;As the video shows, when in edit mode you can see some visualization hints, like effects connecting doors and platforms to the triggers that activate them. The visualization hints show both what is connected to what and in what direction.&lt;br /&gt;&lt;br /&gt;There are some other features of plot elements not shown in the video:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You can have multiple triggers for a door or a platform, so the player(s) need to trigger them all before it opens.&lt;/li&gt;&lt;li&gt;A trigger can also be defined to hold an item. In that case, to open the thing it is connected to, the player must reach the trigger, at which point they get the item, and then they must bring it to the right place.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8762747679587359318?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8762747679587359318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/12/adding-plot-elements.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8762747679587359318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8762747679587359318'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/12/adding-plot-elements.html' title='Adding Plot Elements'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-442633389290982053</id><published>2009-12-16T09:39:00.001-08:00</published><updated>2009-12-17T05:33:42.299-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='communityupdate'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Community Update: Ubuntu Lobby</title><content type='html'>One of our community members, TheAncientGoat, has been working on a nice &lt;a href="http://www.syntensity.com:8888/tracker/activity/view/ad405f72_6ced_49a9_a393_b06c8f1ea141/"&gt;Ubuntu-themed map&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_F6KhIbZluDM/SykbfnohjpI/AAAAAAAAACg/eQmZdhCTFqk/s1600-h/screenshot_74357.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_F6KhIbZluDM/SykbfnohjpI/AAAAAAAAACg/eQmZdhCTFqk/s400/screenshot_74357.jpg" alt="" id="BLOGGER_PHOTO_ID_5415890256918580882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Besides looking cool, the map includes some web pages, of the Ubuntu homepage etc. (for which you need to enable the experimental web browser plugin). With the web pages updating live, it can be a nice way to keep up to date on Ubuntu news for people inside Syntensity.&lt;br /&gt;&lt;br /&gt;Definitely an interesting project to watch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-442633389290982053?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/442633389290982053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/12/community-update-ubuntu-lobby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/442633389290982053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/442633389290982053'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/12/community-update-ubuntu-lobby.html' title='Community Update: Ubuntu Lobby'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_F6KhIbZluDM/SykbfnohjpI/AAAAAAAAACg/eQmZdhCTFqk/s72-c/screenshot_74357.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8805435045452498553</id><published>2009-12-04T09:46:00.000-08:00</published><updated>2009-12-04T10:09:41.048-08:00</updated><title type='text'>Media Plugins</title><content type='html'>I've been working on media plugins recently, here are short videos of the results:&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pue-wRGa6yU&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/pue-wRGa6yU&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;That is the VLC media player, playing on a surface inside a Syntensity map. Note that sound works, but I didn't record it for this video.&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/tV7ei1Z40fQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/tV7ei1Z40fQ&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;And this video shows embedded web browser windows that you can interact with. The plugin for that might be useful for other projects, so I spun it off as a separate project, &lt;span style="font-weight: bold;"&gt;&lt;a href="http://code.google.com/p/qtonium/"&gt;Qtonium&lt;/a&gt;&lt;/span&gt;. The name is inspired by Awesomium and Berkelium, two projects doing similar things.&lt;br /&gt;&lt;br /&gt;As to why a new project and not to use Awesomium or Berkelium: Awesomium is apparently going closed-source, or at least that is the only way I can interpret their taking down the code and mentioning 'new licensing terms coming soon'. Berkelium is open source, but it is unclear if it is functional or useful outside of Sirikata, the project in which it is being developed and used.&lt;br /&gt;&lt;br /&gt;And in any case, both are based on the approach of taking Chromium and hacking it to work in an embedded manner. In Qtonium I took a very different approach: No C++ at all, and no hacking of a massive and rapidly-changing codebase. Instead, PyQt is used in a straightforward manner, that is, Qtonium is written in Python. It's dependencies are Qt and PyQt.&lt;br /&gt;&lt;br /&gt;The only downsides I can see to the Qtonium approach are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Qt WebKit isn't a complete browser, just a 'widget'. For example, when embedding Chromium as a whole, you get plugins (Flash, etc.), caching, various default behaviors (handling page load errors, etc. etc.). That stuff is obviously useful, so this is a clear downside. But the cost (hacking Chromium) is also very high in my opinion. In any case, over time those things can be implemented in Qtonium if people want.&lt;/li&gt;&lt;li&gt;Qtonium doesn't share Chromium's separate process security model. This is true at the moment, but it would actually be very simple to adopt, due to Qtonium being written in Python, and Python 2.6's improved support for handing separate processes. In fact if you look at the code, how to do this becomes quite obvious.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Note that this is part of the approach of having all plugins be Python modules. Those modules can of course load C++ code if they need to (like Qtonium loads Qt through PyQt), so this isn't a limitation, but actually the hope is that a lot of things can be done with pure Python (including ctypes). That way, plugins don't need to be compiled, and it's generally very easy to make them work on multiple platforms. C++ plugin systems tend to be much more complex to work with.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8805435045452498553?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8805435045452498553/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/12/media-plugins.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8805435045452498553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8805435045452498553'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/12/media-plugins.html' title='Media Plugins'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8772360247798183226</id><published>2009-11-25T07:09:00.001-08:00</published><updated>2009-11-25T07:14:25.287-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intensityengine'/><title type='text'>Per-Client Variables</title><content type='html'>By default state variables are synchronized between all clients: changes to data are reflected everywhere. This is simple and appropriate for most FPS games. However, some information should only be sent to some clients, like say the inventory in an RPG game. Library 1.3 now allows such state variables, which are called &lt;span style="font-weight: bold;"&gt;clientPrivate&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;A clientPrivate state variable is only sent to the client whose avatar that is. In other words, clientPrivate variables on a player entity are only updated to that player - other clients will not see a value for that variable on that entity. (Note that clientPrivate has no effect on non-player entities.) Of course, the server sees all of the values (and when it updates one, the update is only sent to that player).&lt;br /&gt;&lt;br /&gt;Here is an example of how to add such a variable to a logic entity class:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;secretItem: new StateString({ clientPrivate: true }),&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8772360247798183226?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8772360247798183226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/11/per-client-variables.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8772360247798183226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8772360247798183226'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/11/per-client-variables.html' title='Per-Client Variables'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2604123508948279592</id><published>2009-11-25T01:45:00.000-08:00</published><updated>2009-11-25T02:04:22.198-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='library'/><category scheme='http://www.blogger.com/atom/ns#' term='intensityengine'/><title type='text'>Library 1.3</title><content type='html'>library/1_2 has been forked into library/1_3. The goal is to keep 1_2 as it is, so all the older games still work, while development moves on to 1_3 (which may include API changes, etc.). So, for new games, 1_3 should be used, especially if you will need new library features, as those will be added to library/1_3.&lt;br /&gt;&lt;br /&gt;To migrate a map to 1_3, currently the following is necessary:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Remove the map asset dependency on &lt;span style="font-weight: bold;"&gt;library/1_2&lt;/span&gt; and add one for &lt;span style="font-weight: bold;"&gt;library/1_3&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The map script should include the following line before any other Library.include commands:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new; font-weight: bold;"&gt;Library.include('library/1_3/');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Imports of 1_2 libraries should be changed as follows:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Library.include('library/1_2/Projectiles');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;should become&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Library.include('library/' + Global.LIBRARY_VERSION + '/Projectiles');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(this way of doing things will help make future library migrations much easier).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;After doing those, the map should work exactly as it did with library/1_2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2604123508948279592?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2604123508948279592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/11/library-13.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2604123508948279592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2604123508948279592'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/11/library-13.html' title='Library 1.3'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7557423639259954328</id><published>2009-11-19T09:18:00.000-08:00</published><updated>2009-11-19T09:28:23.897-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='new game'/><title type='text'>New Game: Racing</title><content type='html'>A new game is ready, you can get to it from the lobby and play it right now. Here are some screenshots and videos:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_F6KhIbZluDM/SwV-xBNUl5I/AAAAAAAAACM/zomgU7THd4w/s1600/screenshot_430540.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_F6KhIbZluDM/SwV-xBNUl5I/AAAAAAAAACM/zomgU7THd4w/s400/screenshot_430540.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5405866308331149202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kXqbdwFirJA&amp;hl=en_US&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/kXqbdwFirJA&amp;hl=en_US&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/WuCVDMfjxbY&amp;hl=en_US&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/WuCVDMfjxbY&amp;hl=en_US&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_F6KhIbZluDM/SwV-xusBALI/AAAAAAAAACU/upb0mfsN9Dk/s1600/screenshot_363149.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_F6KhIbZluDM/SwV-xusBALI/AAAAAAAAACU/upb0mfsN9Dk/s400/screenshot_363149.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5405866320539484338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see, this is a racing game. We wanted to do something different than the current games (first/third person shooters, etc.), to show the flexibility of the engine, so this is that. Another difference is that this game can be played in both single player or multiplayer, so you can have fun even if people aren't online at the same time (but it's even more fun with them).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7557423639259954328?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7557423639259954328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/11/new-game-racing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7557423639259954328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7557423639259954328'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/11/new-game-racing.html' title='New Game: Racing'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_F6KhIbZluDM/SwV-xBNUl5I/AAAAAAAAACM/zomgU7THd4w/s72-c/screenshot_430540.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-252088312223435922</id><published>2009-11-17T03:38:00.000-08:00</published><updated>2009-11-17T03:50:20.756-08:00</updated><title type='text'>IRC Plugin + Integration</title><content type='html'>A server plugin for IRC has been written, and is now used in the main servers - the lobby and the three games it has portals to.&lt;br /&gt;&lt;br /&gt;This basically integrates text chat in the game servers with #syntensity on FreeNode, so that:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;All text messages sent in the game servers are shown on #syntensity&lt;/li&gt;&lt;li&gt;Messages sent to the server bots (syntensity0 to syntensity3) in #syntensity will relay the message to people on that game server&lt;/li&gt;&lt;/ul&gt;This should be useful in several ways. Perhaps mainly in that it lets people on a game server, that have questions, be heard on IRC. So we can give technical support very quickly from there.&lt;br /&gt;&lt;br /&gt;The implementation was fairly simple: A plugin in Python that integrates python-irclib. We can probably write similar plugins for other instant messaging systems, if it makes sense.&lt;br /&gt;&lt;br /&gt;Thanks to TheAncientGoat for the idea.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-252088312223435922?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/252088312223435922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/11/irc-plugin-integration.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/252088312223435922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/252088312223435922'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/11/irc-plugin-integration.html' title='IRC Plugin + Integration'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-4557081213499665563</id><published>2009-11-15T00:54:00.000-08:00</published><updated>2009-11-15T01:02:09.775-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='intensityengine'/><title type='text'>1.1 Release</title><content type='html'>Revision 1190 is tagged as version 1.1. Binaries for Windows and Ubuntu 9.10 are on the &lt;b&gt;&lt;a href="http://www.moddb.com/engines/syntensity/downloads"&gt;Syntensity Mod DB downloads page&lt;/a&gt;&lt;/b&gt;. I'll link to them from the main website's download page after a little more testing (if you test them yourself, please say how it went, here, on IRC, or in the forum - thanks!).&lt;br /&gt;&lt;br /&gt;The new version has many changes, but most won't be noticeable until maps use the new features. The improvements include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Enable maps to customize move, strafe and jump&lt;/li&gt;&lt;li&gt;Support for cutscenes&lt;/li&gt;&lt;li&gt;WoW-like mouse movement in Mouselook mode - cursor at borders will rotate the view&lt;/li&gt;&lt;li&gt;Allow client and server to (naively) share their home dirs, and do this by default when the server does not specify a home dir explicitly. This makes it much easier to set up a local server.&lt;/li&gt;&lt;li&gt;ZeroG module, allowing maps to have zero gravity, custom gravity effects, etc.&lt;/li&gt;&lt;li&gt;Vehicles module, to let entities move like simple vehicles (pitch based on floor, thrust for movement, etc.)&lt;/li&gt;&lt;li&gt;World.getSurfaceNormal, which allows doing bouncing physics entirely in scripts, + Grenade example&lt;/li&gt;&lt;li&gt;WorldSequences module - lets you track players progression through areas&lt;/li&gt;&lt;li&gt;WorldSignals module - lets you emit and listen for signals that are relevant to areas in space&lt;/li&gt;&lt;li&gt;New Steering module for bot movement control&lt;/li&gt;&lt;li&gt;Add absolute x,y to clientClick, allowing maps to have menus&lt;/li&gt;&lt;li&gt;Allow scripts on the server to intercept and handle text messages (e.g. can be used as a simple way to let people issue commands to the server, etc.)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-4557081213499665563?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/4557081213499665563/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/11/11-release.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4557081213499665563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4557081213499665563'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/11/11-release.html' title='1.1 Release'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5832608266700844592</id><published>2009-11-12T01:43:00.000-08:00</published><updated>2009-11-13T08:45:15.894-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='communityupdate'/><title type='text'>Community Update</title><content type='html'>Since we launched Syntensity a month and a half ago, we posted on some online forums to let people know about this project, but we have been very low-key about it. The reason is that we are trying to do things gradually: Both with building the technology, and with spreading the word. The idea is to get feedback from people about Syntensity, and then to improve it, after which it makes sense to show it to more people, get even more feedback, and so forth.&lt;br /&gt;&lt;br /&gt;This approach is appropriate for us, with our open source development model. It is very different from what people do with closed source development, which is usually to build something behind closed doors for a long time, and then release it in a big public launch, at which point they hope to get a large amount of users as fast as possible.&lt;br /&gt;&lt;br /&gt;With that background, I'm happy to report that Syntensity has now reached over 500 registered accounts. So, even though we've been low-key about spreading the word, things are heating up. Another sign of increasing activity can be seen on our &lt;a href="http://www.syntensity.com:8888/tracker/forum/"&gt;forum&lt;/a&gt;. This is therefore an appropriate time to make a 'Community Update' post on this blog, to take a look at a few of the neat things people in the Syntensity community have been doing. From time to time I'll make more of these posts.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://www.syntensity.com:8888/tracker/activity/view/3b3b36f9_787d_46b4_bc00_1b56a725d0ed/"&gt;Psycho v1.0&lt;/a&gt; by Psychosilocybin is an interesting work-in-progress map with an attacker-defender gameplay: Only one team has an object to protect. That team gets points for keeping it safe, the other team gets points for stealing it. Accordingly, the map has an asymmetrical structure, unlike typical CTF maps (that are usually very symmetrical). Here are some screenshots:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_F6KhIbZluDM/Svvc_a3zTMI/AAAAAAAAACE/ZViq2GTXeq0/s1600-h/screenshot_397035.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_F6KhIbZluDM/Svvc_a3zTMI/AAAAAAAAACE/ZViq2GTXeq0/s400/screenshot_397035.jpg" alt="" id="BLOGGER_PHOTO_ID_5403155160064281794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_F6KhIbZluDM/Svvc_SMX3yI/AAAAAAAAAB8/shy9XnGqGO4/s1600-h/screenshot_346664.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_F6KhIbZluDM/Svvc_SMX3yI/AAAAAAAAAB8/shy9XnGqGO4/s400/screenshot_346664.jpg" alt="" id="BLOGGER_PHOTO_ID_5403155157734645538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_F6KhIbZluDM/Svvc_C1D_MI/AAAAAAAAAB0/X_sdKJbe5Zg/s1600-h/screenshot_316317.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_F6KhIbZluDM/Svvc_C1D_MI/AAAAAAAAAB0/X_sdKJbe5Zg/s400/screenshot_316317.jpg" alt="" id="BLOGGER_PHOTO_ID_5403155153610341570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;a style="font-weight: bold;" href="http://www.syntensity.com:8888/tracker/activity/view/7a056f29_824b_4aa5_88e1_6ce601efb26a/"&gt;Realm Arena&lt;/a&gt; is a mod of Map2 by adrix89, which adds some movement capabilities, like double tapping to move in order to 'dash' in that direction ('dash' means to move quickly for a brief time). I think it makes for very interesting gameplay, with much more control of your character.&lt;br /&gt;&lt;br /&gt;(Note that currently this requires that you edit your autoexec.cfg, as the map says to do. This will not be necessary with the upcoming release, which makes customizing movement easier.)&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;&lt;br /&gt;(The two things mentioned in this blog post are by no means a complete list - I hope I am not offending anybody by leaving them out. These are just two things that happened to recently impress me.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5832608266700844592?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5832608266700844592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/11/community-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5832608266700844592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5832608266700844592'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/11/community-update.html' title='Community Update'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_F6KhIbZluDM/Svvc_a3zTMI/AAAAAAAAACE/ZViq2GTXeq0/s72-c/screenshot_397035.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1035476729955554593</id><published>2009-11-08T00:39:00.000-08:00</published><updated>2009-11-08T00:45:52.419-08:00</updated><title type='text'>4-Weapon CTF Update</title><content type='html'>The 4-Weapon CTF game, also known as 'Map 2', has been updated to Map 2.1. When you enter that game from the lobby you will be playing the new version.&lt;br /&gt;&lt;br /&gt;The changes are mainly bugfixes and minor improvements, in response to feedback we've been getting. They include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Headshot notifications are now shown to everyone, not just the shooter (so you will know if a headshot was done to you, or to anyone else).&lt;/li&gt;&lt;li&gt;The sound for scoring a point now always plays when points are scored (before it was done unreliably).&lt;/li&gt;&lt;li&gt;Fixed an annoying bug where fragged characters could, in some cases, change their animation and not look fragged (even though they were).&lt;/li&gt;&lt;li&gt;Rockets now do twice as much damage as before (making it possible to frag people with a single direct hit).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;More updates and new games are coming soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1035476729955554593?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1035476729955554593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/11/4-weapon-ctf-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1035476729955554593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1035476729955554593'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/11/4-weapon-ctf-update.html' title='4-Weapon CTF Update'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-4638902649772800031</id><published>2009-10-30T08:04:00.000-07:00</published><updated>2009-10-30T08:07:50.008-07:00</updated><title type='text'>Cutscenes</title><content type='html'>Cutscenes are now possible:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PYeFS747HdM&amp;hl=en&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PYeFS747HdM&amp;hl=en&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Cutscenes can be written in scripts, so you can have different ones in each map.&lt;br /&gt;&lt;br /&gt;See packages/library/1_2/Cutscenes.js for the code and some examples. This is in /trunk, and will be in the upcoming 1.0.3 release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-4638902649772800031?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/4638902649772800031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/cutscenes.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4638902649772800031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/4638902649772800031'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/cutscenes.html' title='Cutscenes'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1356176190005197295</id><published>2009-10-29T01:51:00.000-07:00</published><updated>2009-10-29T02:52:01.168-07:00</updated><title type='text'>Syntensity Celebrates Ubuntu 9.10</title><content type='html'>If you read this blog then you probably already know that I am a big fan of open source, and of Linux in particular. I'm also an Ubuntu user, so today the Syntensity lobby world is lighting up with fireworks to celebrate the release of Ubuntu 9.10, Karmic Koala:&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/LJHkpXbGDLA&amp;hl=en&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/LJHkpXbGDLA&amp;hl=en&amp;fs=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Log in to the lobby world to see it in person. (The fireworks effect, btw, like everything else is reusable for your own Syntensity worlds. See packages/base/welcome/KarmicKoala.js in your home directory for example code. Note that that file will only be there after you connect to the lobby world, at which point it will be automatically downloaded.)&lt;br /&gt;&lt;br /&gt;I've been using Ubuntu 9.10 for a while now, and it was definitely worth the upgrade for me: It feels significantly faster, and also better supports my hardware. Thank you to the Ubuntu people, and all the open source projects that are included in Ubuntu (the Linux kernel, etc. etc.)!&lt;br /&gt;&lt;br /&gt;Btw, speaking of Ubuntu 9.10, the nice people at &lt;a href="http://www.playdeb.net/"&gt;Playdeb&lt;/a&gt; have &lt;a href="http://www.playdeb.net/updates/Syntensity"&gt;packaged Syntensity for Ubuntu 9.04 and 9.10, 32- and 64-bit&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1356176190005197295?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1356176190005197295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/syntensity-celebrates-ubuntu-910.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1356176190005197295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1356176190005197295'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/syntensity-celebrates-ubuntu-910.html' title='Syntensity Celebrates Ubuntu 9.10'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7815456221462377232</id><published>2009-10-27T02:40:00.000-07:00</published><updated>2009-10-27T02:52:36.472-07:00</updated><title type='text'>Easier to Run Your Own Server</title><content type='html'>Some improvements to server setup have just been committed, which make it much easier to run your own server. The improvements are already available if you are running the latest source code, otherwise, they will be in the 1.0.3 release.&lt;br /&gt;&lt;br /&gt;The improvements are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Interactive setup wizard, which you can run by adding --wizard to the commandline when you run the server,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;   Linux: ./intensity_client.sh --wizard&lt;/span&gt;&lt;br /&gt;   Windows:&lt;span style="font-family: arial;"&gt; intensity_client.bat --wizard&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The wizard will ask some questions and create a settings.cfg for you.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You can now tell the server what activity to run in a much easier way. Simply paste the URL to the activity (which you can find on the &lt;a href="http://www.syntensity.com:8888/tracker/activities/"&gt;activities page&lt;/a&gt;) into the settings.cfg file, specifically into &lt;span style="font-weight: bold;"&gt;[Activities] force_activity_id&lt;/span&gt;. The server will then autodiscover the activity and the map asset IDs for you. (You can still use an actual activity ID, for backwards compatibility.)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;For more info, see the wiki page on &lt;a href="http://wiki.syntensity.com/creating/running-a-local-server"&gt;running a local server&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7815456221462377232?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7815456221462377232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/easier-to-run-your-own-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7815456221462377232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7815456221462377232'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/easier-to-run-your-own-server.html' title='Easier to Run Your Own Server'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7859730672534503720</id><published>2009-10-24T01:47:00.001-07:00</published><updated>2009-10-24T02:02:59.071-07:00</updated><title type='text'>New Lobby</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_F6KhIbZluDM/SuLAOLeSsNI/AAAAAAAAABs/zalg98WmeuA/s1600-h/screenshot_lobby.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_F6KhIbZluDM/SuLAOLeSsNI/AAAAAAAAABs/zalg98WmeuA/s400/screenshot_lobby.jpg" alt="" id="BLOGGER_PHOTO_ID_5396086653373821138" border="0" /&gt;&lt;/a&gt;(click for a bigger version)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The default world is now the new lobby, shown above. It has portals to other games, and also an interactive tutorial.&lt;br /&gt;&lt;br /&gt;You will enter the lobby if you do '&lt;span style="font-weight: bold;"&gt;connect to selected...&lt;/span&gt;' (and you haven't selected another world), or if you do '&lt;span style="font-weight: bold;"&gt;connect to lobby...&lt;/span&gt;' in the latest build (1.0.2, available on the &lt;a href="http://www.syntensity.com/toplevel/download/"&gt;download page&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Live changes and improvements to the lobby will be happening fairly frequently.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7859730672534503720?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7859730672534503720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/new-lobby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7859730672534503720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7859730672534503720'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/new-lobby.html' title='New Lobby'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_F6KhIbZluDM/SuLAOLeSsNI/AAAAAAAAABs/zalg98WmeuA/s72-c/screenshot_lobby.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8992934512219991864</id><published>2009-10-22T09:52:00.000-07:00</published><updated>2009-10-22T10:03:11.940-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>1.0.2 Release</title><content type='html'>Revision 1082 is tagged as version 1.0.2. A new build for Windows and a .deb installer for Ubuntu 9.10 are on the &lt;a href="http://www.syntensity.com/toplevel/download/"&gt;download page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is a minor, recommended but &lt;span style="font-weight: bold;"&gt;non&lt;/span&gt;-mandatory update (which means you can continue to use the previous version - the network protocol has not changed, nor anything else that would be a problem for you). It includes the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;'connect to lobby...' option in the main menu, for directly connecting to a lobby world (which has portals to other ones)&lt;/li&gt;&lt;li&gt;Interactive tutorial example code (that is, a map which interactively teaches you the controls)&lt;/li&gt;&lt;li&gt;Better debug traces from JavaScript&lt;/li&gt;&lt;li&gt;Various improvements and additions to library 1.2 (Roles/Classes, WorldNotices, etc.)&lt;/li&gt;&lt;li&gt;Support for CherryPy 3.1+&lt;/li&gt;&lt;li&gt;Support for gcc 4.4+&lt;/li&gt;&lt;li&gt;A few minor bugfixes&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8992934512219991864?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8992934512219991864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/102-release.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8992934512219991864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8992934512219991864'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/102-release.html' title='1.0.2 Release'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6665837151985955498</id><published>2009-10-18T07:01:00.000-07:00</published><updated>2009-10-18T07:09:35.644-07:00</updated><title type='text'>Portals and the Welcome World</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_F6KhIbZluDM/Stsf-mNVZ_I/AAAAAAAAABc/_cYRW6C1O9g/s1600-h/screenshot_305827.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_F6KhIbZluDM/Stsf-mNVZ_I/AAAAAAAAABc/_cYRW6C1O9g/s400/screenshot_305827.jpg" alt="" id="BLOGGER_PHOTO_ID_5393940138975127538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Support for jumping between worlds was added just before version 1.0. To make it useful, I wrote a 'Portal' class which is basically a screenshot of a world, that when you move into (that is, when your avatar walks into the portal), you are sent to that world. In the screenshot above you can see two such portals, which lead to map2 and sketchworld.&lt;br /&gt;&lt;br /&gt;This will be used in the 'welcome world', the first world people encounter when they log into Syntensity. The welcome world will be a map with portals to the most important/popular maps, and will also have an interactive tutorial for learning the controls. The tutorial isn't written yet, but you can check out the portals by doing a manual connection to www.syntensity.com:10000 in the Syntensity client.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6665837151985955498?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6665837151985955498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/portals-and-welcome-world.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6665837151985955498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6665837151985955498'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/portals-and-welcome-world.html' title='Portals and the Welcome World'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_F6KhIbZluDM/Stsf-mNVZ_I/AAAAAAAAABc/_cYRW6C1O9g/s72-c/screenshot_305827.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-7688859868574082149</id><published>2009-10-14T08:06:00.000-07:00</published><updated>2009-10-14T08:19:12.598-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>1.0.1</title><content type='html'>Two weeks after 1.0, we are now releasing 1.0.1, which adds several new features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New example content: A new, bigger map, and new gameplay elements including homing missiles, rockets, a shotgun, headshots with the sniper gun, nicer jumppads, etc. (It was kind of our goal to see how much new stuff we could add in a short time, as a test of the API.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Script API support for displaying HUD text and images&lt;/li&gt;&lt;li&gt;Various minor bugfixes and polish&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;You can see some of this in our new video:&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube.com/v/7GSi3X5hCdw&amp;amp;hl=en&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/7GSi3X5hCdw&amp;amp;hl=en&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;or better yet, try it out yourself. Note that this is an engine update, so you need to download the latest build,&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.syntensity.com/toplevel/download/"&gt;http://www.syntensity.com/toplevel/download/&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;As always, if you haven't already signed up for Syntensity, you need to do so, which takes just a few seconds. See the links on the &lt;a href="http://www.syntensity.com/"&gt;main page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you are copying the new version into an existing directory with the old version, you will &lt;span style="font-weight: bold;"&gt;NOT&lt;/span&gt; get the new keybindings (see next note). It is simplest to just unpack the new download into a new directory. (Or, you can delete syntensity/client/config.cfg, which will then be created from scratch the next time the client is run, and you will get the new keybindings and so forth.)&lt;/li&gt;&lt;li&gt;Change weapons with 1-4, or cycle by pressing the middle mouse button. H shows a little help.&lt;/li&gt;&lt;li&gt;The homing missiles can only be shot if you are locked on a target (another player). The lock remains for a short while after your crosshair is no longer over the target (a notification appears at the top of the HUD).&lt;/li&gt;&lt;li&gt;This is an early release, we will probably adjust the weapon strengths, ranges, etc., depending on feedback (we can push those updates between releases). So, let us know what you think needs changing.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;P.S. I was very impressed by &lt;a href="http://www.openshotvideo.com/"&gt;OpenShot&lt;/a&gt;, the open source video editor I used to make the video. Kudos to the OpenShot team for making a very useful program.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-7688859868574082149?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/7688859868574082149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/101.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7688859868574082149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/7688859868574082149'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/101.html' title='1.0.1'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-8274736235393543203</id><published>2009-10-11T02:35:00.000-07:00</published><updated>2009-10-11T02:46:09.189-07:00</updated><title type='text'>New Weapons</title><content type='html'>The second game is almost finished, and it will include several new weapons, a new map, as well as various other features, many of them in response to the feedback we received so far.&lt;br /&gt;&lt;br /&gt;You can see the current state of the new game if you run the latest from the source code repo (do a manual connect to www.syntensity.com:10002). Otherwise, binary builds will be available soon. Meanwhile here is a screenshot of some rocket fire:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_F6KhIbZluDM/StGo37dwquI/AAAAAAAAABU/vqhEydJD4UA/s1600-h/screenshot_583179.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_F6KhIbZluDM/StGo37dwquI/AAAAAAAAABU/vqhEydJD4UA/s400/screenshot_583179.jpg" alt="" id="BLOGGER_PHOTO_ID_5391275907747982050" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-8274736235393543203?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/8274736235393543203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/new-weapons.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8274736235393543203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/8274736235393543203'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/new-weapons.html' title='New Weapons'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_F6KhIbZluDM/StGo37dwquI/AAAAAAAAABU/vqhEydJD4UA/s72-c/screenshot_583179.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-599894087969873246</id><published>2009-10-05T05:30:00.000-07:00</published><updated>2009-10-05T05:39:55.556-07:00</updated><title type='text'>Updates and Updating</title><content type='html'>We have a new &lt;a href="http://twitter.com/syntensity"&gt;Twitter account&lt;/a&gt; that we are starting to use for real-time updates, things like&lt;br /&gt;&lt;ul&gt;&lt;li&gt;New features notifications as they go live&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Server status reports&lt;/li&gt;&lt;/ul&gt;Speaking of new features, I might as well take this opportunity to explain a little about how that works in Syntensity (and of course the Intensity Engine): We are able to add new features between releases, without people needing to download a new version of the client, since&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The master server is a website, so adding things like the new &lt;a href="http://wiki.syntensity.com/creating/creat"&gt;map creation wizard&lt;/a&gt; is possible just like updating any website.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Game content is downloaded automatically using our asset system, which will get whatever content you need. And as game logic is written in JavaScript, this includes entire games, not just textures, models, etc. (but also those, of course).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Aside from the map creation wizard already mentioned, we have been working on adding new weapons, weapon recoil, and fixing some bugs with animation speeds and other minor things. Note that the default map you enter is still the original version of the gk1 map, so you won't see these things unless you specifically connect to a server running gk1_a.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-599894087969873246?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/599894087969873246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/updates-and-updating.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/599894087969873246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/599894087969873246'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/updates-and-updating.html' title='Updates and Updating'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2744317348418533355</id><published>2009-10-03T01:12:00.000-07:00</published><updated>2009-10-03T07:38:39.957-07:00</updated><title type='text'>Server Requisitioning Issues / Logs</title><content type='html'>People are already starting to requisition server instances, and sometimes there are problems, like if an asset or a script isn't set up correctly. That will cause the server instance to shut down, and an error log is uploaded to the master server - but we don't yet have a convenient interface for non-admin users to view it. So we are seeing the error logs arrive, but sadly they don't get to you yet.&lt;br /&gt;&lt;br /&gt;We are working on improving this. In the meantime, if you requisition a server and don't see it start up, this might be the reason. You can do the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ask an admin for your server logs, on IRC (#syntensity on FreeNode).&lt;/li&gt;&lt;li&gt;&lt;a href="http://wiki.syntensity.com/creating/running-a-local-server"&gt;Run a local server&lt;/a&gt; instead of requisitioning a remote one. You will be able to see exactly what output it gives, which should help fix any problems with assets or scripts.&lt;/li&gt;&lt;/ul&gt;We apologize for this inconvenience. That's the nature of the early stages of an open beta - problems are found, and fixed. Bear with us :)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Edit&lt;/span&gt;: This issue has now been mostly resolved. You can view the last server log on your &lt;a href="http://www.syntensity.com:8888/tracker/account/"&gt;account page&lt;/a&gt; (you must be logged in), by clicking on "View last error log from requisitioned server." So, if you requisition a server and it doesn't appear in the list of servers, check the server log there for what caused the problem. A comment about this has also been added beside the 'requisition' button. We are evaluating ways to make this even easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2744317348418533355?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2744317348418533355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/server-requisitioning-issues-logs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2744317348418533355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2744317348418533355'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/server-requisitioning-issues-logs.html' title='Server Requisitioning Issues / Logs'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5538808501615979998</id><published>2009-10-02T10:32:00.000-07:00</published><updated>2009-10-02T10:34:47.890-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='launch'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='intensityengine'/><title type='text'>Launch: Syntensity Open Beta, Intensity Engine 1.0</title><content type='html'>Today we are officially launching Syntensity's open beta, as well as releasing version 1.0 of the Intensity Engine. This brings to a close an intensive year of development, but is also just the beginning for this project.&lt;br /&gt;&lt;br /&gt;Instructions for getting started with Syntensity can be found &lt;a style="font-weight: bold;" href="http://www.syntensity.com/"&gt;on the main page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Syntensity's open beta launches with one complete game (the gk1 map, which is an insta ctf-type game that also has some automatic gun turrets). But Syntensity is really more of a &lt;span style="font-style: italic;"&gt;platform&lt;/span&gt; for game creation, not one or two games that we created ourselves. This initial game is just to show what the engine can do, and also to be a basis people can work from (by modding gk1). We'll be making some more example games during the beta (to show more of the engine's capabilities - gk1 covers only a small part of that), but our main focus will be to help people use the engine to create the games they want.&lt;br /&gt;&lt;br /&gt;Regarding the Intensity Engine (the open source project that comprises Syntensity's code), it is now at 1.0. It's basically feature-complete for our initial goals, and decently stable - enough for people to start using it, both for Syntensity and other projects. There are some bugs we are aware of, and testing will probably uncover more, but overall things are in fairly good shape. In the near future we will focus on fixing bugs and polish, later on, there are a lot of engine features on our roadmap.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5538808501615979998?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5538808501615979998/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/launch-syntensity-open-beta-intensity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5538808501615979998'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5538808501615979998'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/launch-syntensity-open-beta-intensity.html' title='Launch: Syntensity Open Beta, Intensity Engine 1.0'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1918061951257388488</id><published>2009-10-01T10:33:00.000-07:00</published><updated>2009-10-01T11:54:45.154-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='intensityengine'/><title type='text'>Automatic Testing: Client and Server</title><content type='html'>(This will be a mostly technical post.)&lt;br /&gt;&lt;br /&gt;There is a lot of work planned for the engine after the launch of the open beta (which is, btw, just about here), so automatic testing is crucial to prevent regressions. Basically, every time you commit a change, you want to be able to run a completely automatic battery of tests that checks you didn't break anything. So far in the Intensity Engine only the master server had automatic tests for it, using Django's test client. Those tests are actually very comprehensive, and have already come in handy. There are also some unit tests for the JavaScript API. But for the client and server as a whole, writing automatic tests isn't as easy: They don't have nice test setups like Django, and what's more, the client is a GUI program, using OpenGL (if it were using a GUI like GTK or Qt, there would actually be some tools to help out).&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family: courier new;"&gt;tests/&lt;/span&gt; directory contains what I did so far towards this goal, over the last few days. The test setup uses &lt;a href="http://pexpect.sourceforge.net/pexpect.html"&gt;pexpect&lt;/a&gt;, a very useful Python module that lets you communicate with processes, sending them input and checking their output. This, combined with the server's Python console, lets the server be tested in a nice fashion: Start the server in a separate process, issue it commands - for example, check such and such state variable of such and such logic entity - and validate the output. Using Python's unittest module, in each test the server environment (home directory, with downloaded assets and so forth) is created from scratch. So all of this together gives an appropriate way to test the server.&lt;br /&gt;&lt;br /&gt;The client was a little harder. First off, I added an option to run a Python console, just like on the server (which took some refactoring of the console code). Then, I had to write bindings for 'injecting' user events. That is, by issuing commands through the Python console, the test runner can manipulate the client as if it were an actual person: Move the mouse, click, press a key, and so forth. This took some time to get working correctly, due to how SDL events behave and how the engine processes them. But it appears to now be working as it should.&lt;br /&gt;&lt;br /&gt;Currently there are 4 tests. Each of them starts up a master, a server, and a client, runs a map ('storming') and then does one of the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Modify a state variable on the client and see that it propagates to the server&lt;/li&gt;&lt;li&gt;Modify a state variable on the server and see that it propagates to the client&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Modify a state variable, restart the map, and see that it returned to the original value&lt;/li&gt;&lt;li&gt;Modify a state variable, upload the map, and see that the new value is used&lt;/li&gt;&lt;/ul&gt;In other words, these are high-level functional tests, and they already cover most of the basics: Starting up the client and server, loading a map in each, network synchronization, and map uploading. In particular, they cover basically what someone starting out with the Intensity Engine would do (if they follow README-standalone.txt). So these tests are a good start, while of course many more should be added over time.&lt;br /&gt;&lt;br /&gt;The tests take about a minute to run, what with creating an entirely new environment for the master, server and client for each test, and starting them all. (Also, for some reason the injected SDL events are slower than I would expect.) But it's actually kind of funny to watch the tests running, with the mouse jumping around, clicking and keypress sounds, and so forth. (Although I imagine I will get tired of it soon enough, and just go do something else while the tests run...)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1918061951257388488?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1918061951257388488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/10/automatic-testing-client-and-server.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1918061951257388488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1918061951257388488'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/10/automatic-testing-client-and-server.html' title='Automatic Testing: Client and Server'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-6713749017276912838</id><published>2009-09-27T03:18:00.000-07:00</published><updated>2009-09-27T04:03:14.035-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='release'/><title type='text'>Release Candidate</title><content type='html'>I'm happy to announce that there is a release candidate :)&lt;br /&gt;&lt;br /&gt;The goal is to check that the download binaries work (that is, to check if I didn't forget some DLL, asset file, etc.), and also to check for any major bugs that I missed.&lt;br /&gt;&lt;br /&gt;To try the release candidate, do the following:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Download it:&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;Windows&lt;/span&gt;: &lt;a href="http://download.syntensity.com/windows_1.0.zip"&gt;http://download.syntensity.com/windows_1.0.zip&lt;/a&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;Ubuntu 9.04&lt;/span&gt;: &lt;a href="http://download.syntensity.com/ubuntu9.04_1.0.tar.gz"&gt;http://download.syntensity.com/ubuntu9.04_1.0.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For Ubuntu 9.04 you also need to get some deps, with a simple&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-family: courier new;"&gt;sudo apt-get install libsdl1.2debian libsdl-image1.2 libsdl-mixer1.2 python libboost-python1.35.0 zlib1g&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Note that the Ubuntu 9.04 version probably will NOT work on other Ubuntu versions (except *K*ubuntu 9.04, etc.) or other Linuxes - you would need to compile from source so it links correctly against your distro's libraries. Compiling from source is actually very easy on Linux, see instructions on &lt;a href="http://www.syntensity.com/toplevel/intensityengine/"&gt;http://www.syntensity.com/toplevel/intensityengine/&lt;/a&gt; and of course feel free to ask for help (here or on IRC, #intensityengine or #syntensity on FreeNode).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Unpack the download and run intensity_client.bat (Windows) or intensity_client.sh (Linux).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You also need to sign up for a user account, for the release candidate you should do that here:&lt;br /&gt;&lt;br /&gt;    &lt;a href="http://www.syntensity.com:8888/accounts/releasecandidate/register/"&gt;http://www.syntensity.com:8888/accounts/releasecandidate/register/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Aside from that, instructions for how to do stuff (log in, join a game, etc.) are on the wiki, in particular you should read&lt;br /&gt;&lt;br /&gt;    &lt;a href="4.%20%20http://wiki.syntensity.com/introduction"&gt;&lt;/a&gt;&lt;a href="http://wiki.syntensity.com/introduction"&gt;http://wiki.syntensity.com/introduction&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Note that I am announcing the release candidate here, and &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; on the main website, because I don't want too many people to try it (since there might be a problem with the binaries) - I'm just looking for a small amount of feedback on the release candidate for now. Then if all is well with the release candidate, the release itself can be in a few days. So, until the release, please don't tell anybody about the release candidate, I'd rather their first impression be of the actual release (which will have an announcement on the main website, new video and screenshots, etc. etc.).&lt;br /&gt;&lt;br /&gt;Thanks in advance for testing the release candidate!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-6713749017276912838?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/6713749017276912838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/09/release-candidate.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6713749017276912838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/6713749017276912838'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/09/release-candidate.html' title='Release Candidate'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-1192615932090802337</id><published>2009-09-22T09:51:00.000-07:00</published><updated>2009-09-24T03:30:06.710-07:00</updated><title type='text'>Licensing</title><content type='html'>In this post I'll clarify some things regarding licensing.&lt;br /&gt;&lt;br /&gt;First of all, there are two separate topics here: Licensing for the Intensity Engine and for Syntensity. The Intensity Engine is an open source project, while Syntensity is one particular project built using the Intensity Engine (that happens to be run by the same team).&lt;br /&gt;&lt;br /&gt;Regarding the Intensity Engine, it uses the AGPL license. I recently elaborated a little more on the &lt;a href="http://www.syntensity.com/toplevel/intensityengine/#licensing"&gt;website&lt;/a&gt; about this, mainly that game content is &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; considered a derivative work. That is, if you write a game using the API, the game does &lt;span style="font-weight: bold;"&gt;not&lt;/span&gt; need to be AGPL licensed. It's yours and you can license it however you want. Only if you modify the engine itself, as opposed to creating a game using it, does the  AGPL license become an issue. It's pretty much how Blender licensing works - make something with Blender and license it however you want; modify Blender itself, and you need to be GPL licensed.&lt;br /&gt;&lt;br /&gt;Regarding Syntensity, my original idea was to require that all content be under a creative commons license or something similar, since I see Syntensity as closely related to the participatory culture movement (but in the context of gaming). By requiring such licensing, all the content on Syntensity would be free for use, in Syntensity and elsewhere. But it turned out that wasn't workable - not everyone is willing to use the same license (some artists insist on -NC licenses, for example). So by picking any one license, it would leave a lot of people out. And by picking several incompatible ones, there would be a lot of confusion. So in the end Syntensity will use the most minimalistic and generic licensing for user-created content: Whatever you create in Syntensity is yours, to do with as you want, but you grant everyone a license to use it freely &lt;span style="font-weight: bold;"&gt;within&lt;/span&gt; Syntensity. So how you let your content be used outside of Syntensity is entirely up to you (and you can completely disallow such use), while inside Syntensity we uphold the idea of everyone working together to create more and better games.&lt;br /&gt;&lt;br /&gt;(If granting a license to people to use your content within Syntensity is a problem, then don't upload that content into Syntensity - use the Intensity Engine by yourself to run your content however you want, and with whatever license you want. It's open source, and that's what it's for.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-1192615932090802337?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/1192615932090802337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/09/licensing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1192615932090802337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/1192615932090802337'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/09/licensing.html' title='Licensing'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-5594934094648230923</id><published>2009-09-22T05:57:00.000-07:00</published><updated>2009-09-22T06:09:25.720-07:00</updated><title type='text'>Intensity Engine 0.9.8</title><content type='html'>I just tagged version 0.9.8 of the engine, which might end up as our release candidate. Changes include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An apparent fix for the &lt;a href="https://bugs.launchpad.net/intensityengine/+bug/380153"&gt;big, worrying bug&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Smoother camera movement (even in mouselook mode)&lt;/li&gt;&lt;li&gt;Flag model (4 colors)&lt;/li&gt;&lt;li&gt;Some optional, for-future-use API features (action keys, server teleport)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Various tool improvements (texture converter &amp;amp; packager, mass texture replacer, etc.)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Various bug fixes&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-5594934094648230923?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/5594934094648230923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/09/intensity-engine-098.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5594934094648230923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/5594934094648230923'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/09/intensity-engine-098.html' title='Intensity Engine 0.9.8'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5248616490907735528.post-2958969941066018325</id><published>2009-09-17T02:43:00.000-07:00</published><updated>2010-02-22T01:27:25.994-08:00</updated><title type='text'>Intensity Engine API Documentation</title><content type='html'>A first version of documentation for the scripting API - the API you write games/activities in, also known as "&lt;span style="font-weight: bold;"&gt;the&lt;/span&gt; API" ;)  - has been uploaded to docs/. You can see it &lt;a href="http://bazaar.launchpad.net/%7Ekripkenstein/intensityengine/0.9/download/head%3A/scripting_docs.html-20090917093625-jd7m05hzq8cpuvd3-1/scripting_docs.html"&gt;here&lt;/a&gt;. It has a 'hello world' example, a tutorial, and a few big examples of actual working code (a plugin, an activity, etc.) with detailed explanations. This should be enough for people to get started with scripting.&lt;br /&gt;&lt;br /&gt;We don't expect to have complete documentation in time for the launch, but with this document and the work-in-progress &lt;a href="http://wiki.syntensity.com/"&gt;wiki&lt;/a&gt;, we should have enough for now. (The source code itself also has comments, particularly in the important places, and the example games and activities are helpful as well.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EDIT&lt;/span&gt;: We moved to github meanwhile, the latest docs are here: &lt;a href="http://github.com/kripken/intensityengine/blob/master/docs/scripting_docs.html"&gt;http://github.com/kripken/intensityengine/blob/master/docs/scripting_docs.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5248616490907735528-2958969941066018325?l=syntensity.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://syntensity.blogspot.com/feeds/2958969941066018325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://syntensity.blogspot.com/2009/09/intensity-engine-api-documentation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2958969941066018325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5248616490907735528/posts/default/2958969941066018325'/><link rel='alternate' type='text/html' href='http://syntensity.blogspot.com/2009/09/intensity-engine-api-documentation.html' title='Intensity Engine API Documentation'/><author><name>kripken</name><uri>http://www.blogger.com/profile/06468064783634443137</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
