<?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-4578848417268948676</id><updated>2012-01-29T14:01:26.219+11:00</updated><title type='text'>Create Universes</title><subtitle type='html'>Assorted fun software creations of Greg Santucci</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>thecodewitch</name><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>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-8324101559491794171</id><published>2011-11-18T17:51:00.000+11:00</published><updated>2011-11-18T17:51:44.093+11:00</updated><title type='text'>The Cave - fugue @ Syntax 2011</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-rlop_i5g2vA/TsYAQ-8mJyI/AAAAAAAAAMg/K3sia520u-g/s1600/1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-rlop_i5g2vA/TsYAQ-8mJyI/AAAAAAAAAMg/K3sia520u-g/s320/1.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This demo uses an engine similar to wtf-atabimp, with a few new features, such as high speed OpenGL rendered voxels and a clean up of the mp3 playing code. All voxel operations (such as "adding" and "carving out" voxels) are done in constant time, with the "housekeeping" of the voxel render list occuring at render time.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cgv5Xt6OMo0/TsYATrX7l3I/AAAAAAAAAMo/gV_moHuVSbg/s1600/2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-cgv5Xt6OMo0/TsYATrX7l3I/AAAAAAAAAMo/gV_moHuVSbg/s320/2.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This demo is built on a framework that allows the entire demo to be driven by lua. The lua files are included, and can be modified freely. There is also a console available from the demo itself, providing a "live coding" environment which permits complete modification of the demo while it is running. There is an unmarked pane splitter at the bottom of the window which can be moved to reveal the console. The console now maintains a persistent session, so the command history is maintained between runs.&lt;br /&gt;&lt;br /&gt;Thanks to cTrix for his wizardry in creating this awesome music for the demo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-8324101559491794171?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/8324101559491794171/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2011/11/cave-fugue-syntax-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/8324101559491794171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/8324101559491794171'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2011/11/cave-fugue-syntax-2011.html' title='The Cave - fugue @ Syntax 2011'/><author><name>thecodewitch</name><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/-rlop_i5g2vA/TsYAQ-8mJyI/AAAAAAAAAMg/K3sia520u-g/s72-c/1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-1491588831565540064</id><published>2011-10-24T16:51:00.010+11:00</published><updated>2011-11-20T19:37:33.308+11:00</updated><title type='text'>WikiReader Forth Simulator - update</title><content type='html'>Now features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Stack window refreshes after every command&lt;/li&gt;&lt;li&gt;WikiReader style boot menu&lt;/li&gt;&lt;li&gt;New sample programs&lt;/li&gt;&lt;li&gt;Added SP@ word &lt;/li&gt;&lt;li&gt;WikiReader consistent implementation of PICK &lt;/li&gt;&lt;li&gt;Found and fixed a memory corrupting crash bug in Ficl Forth associated with the LOCALS| word. WikiReader Forth doesn't support LOCALS| so this is moot.&lt;/li&gt;&lt;li&gt;Includes a scroller sample which doesn't use LOCALS| or PICK&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-1491588831565540064?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/1491588831565540064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2011/10/wikireadersim-update-for-ozzy.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/1491588831565540064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/1491588831565540064'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2011/10/wikireadersim-update-for-ozzy.html' title='WikiReader Forth Simulator - update'/><author><name>thecodewitch</name><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-4578848417268948676.post-2492571315980792347</id><published>2011-10-24T15:08:00.007+11:00</published><updated>2011-11-20T19:37:54.370+11:00</updated><title type='text'>Nokia E71 live coding - update</title><content type='html'>This update features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Single application instead of 2 separate applications&lt;/li&gt;&lt;li&gt;Full use of E71 keyboard - all characters accessible using bottom left meta key, no need to use Nokia special character dialog&lt;/li&gt;&lt;li&gt;Tested on the Nokia C5&lt;/li&gt;&lt;li&gt;Trace window with go to error capability&lt;/li&gt;&lt;li&gt;Console with history and persistent session&lt;/li&gt;&lt;li&gt;Saving and loading console sessions&lt;/li&gt;&lt;li&gt;Integrated editor with go to line and search functions&lt;/li&gt;&lt;li&gt;Editor and Console use fixed width font&lt;/li&gt;&lt;li&gt;Several sample programs included with installation&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-2492571315980792347?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/2492571315980792347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2011/10/nokia-e71-live-coding-ozzy-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2492571315980792347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2492571315980792347'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2011/10/nokia-e71-live-coding-ozzy-update.html' title='Nokia E71 live coding - update'/><author><name>thecodewitch</name><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-4578848417268948676.post-8799455055707165884</id><published>2011-06-18T18:35:00.003+10:00</published><updated>2011-11-20T15:27:09.394+11:00</updated><title type='text'>Lua based live coding tools for the Nokia E71</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BOXvTjDeZEg/TfxbROO8buI/AAAAAAAAALo/M-IEeaaZczE/s1600/linecurve.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-BOXvTjDeZEg/TfxbROO8buI/AAAAAAAAALo/M-IEeaaZczE/s1600/linecurve.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-mbb2M-Mu0bM/TfxcyAlCmVI/AAAAAAAAAMM/4AhJwYjQ6QM/s1600/TextEd-menu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-mbb2M-Mu0bM/TfxcyAlCmVI/AAAAAAAAAMM/4AhJwYjQ6QM/s1600/TextEd-menu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Installing&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Using Nokia PC Suite, install the following .sis files:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;qt.sis&lt;/li&gt;&lt;li&gt;LiveCode.sis&lt;/li&gt;&lt;li&gt;TextEd.sis&lt;/li&gt;&lt;li&gt;spectrum.sis&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;They can be installed in any order.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;After installing, its handy to map the hardware buttons mapped so they start LiveCode, TextEd and spectrum to save you from having to traverse the menu every time you want to make a change to your lua code or see the effect of your change.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Running the tools&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;LiveCode&lt;/b&gt; and &lt;b&gt;TextEd&lt;/b&gt; together provides a basic and fun live coding environment for Nokia mobile phones. When you run LiveCode, it loads a file called &lt;b&gt;livecode.lua&lt;/b&gt; in the Root directory of the phone memory to retrieve the newest definitions of the &lt;b&gt;update&lt;/b&gt; and &lt;b&gt;render&lt;/b&gt; functions. Running the TextEd program after this will open &lt;b&gt;livecode.lua&lt;/b&gt; for editing in a basic text editor, where any lua code may be written and &lt;b&gt;update&lt;/b&gt; and &lt;b&gt;render&lt;/b&gt; can be redefined. After making your changes and saving, you can return to the running instance of LiveCode, and reload your definitions of &lt;b&gt;update&lt;/b&gt; and &lt;b&gt;render&lt;/b&gt; by hitting any key on your phone.&lt;br /&gt;&lt;br /&gt;I've included a small set of samples to get you started. Place them in the Root directory of the phone memory, rename one of them to &lt;b&gt;livecode.lua&lt;/b&gt; then start the LiveCode program to try it out! If you read the samples, you'll see the only callback currently defined is &lt;b&gt;drawLine&lt;/b&gt;, which takes 4 numbers to specify the endpoints of the line to be drawn. This function can only be called inside &lt;b&gt;render&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-VgAsF0U6RdQ/TfxcCvhZLhI/AAAAAAAAAL8/_zgaUE7wzPs/s1600/TextEd-livecode.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-VgAsF0U6RdQ/TfxcCvhZLhI/AAAAAAAAAL8/_zgaUE7wzPs/s1600/TextEd-livecode.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UPKJZQcXAT0/TfxcItSjchI/AAAAAAAAAMA/WGWdL_8JSvI/s1600/brat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UPKJZQcXAT0/TfxcItSjchI/AAAAAAAAAMA/WGWdL_8JSvI/s1600/brat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-UPKJZQcXAT0/TfxcItSjchI/AAAAAAAAAMA/WGWdL_8JSvI/s1600/brat.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-UPKJZQcXAT0/TfxcItSjchI/AAAAAAAAAMA/WGWdL_8JSvI/s1600/brat.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-se05hPOuMRo/TfxcfEQWDbI/AAAAAAAAAME/MQsWnvSxgcs/s1600/pie1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-se05hPOuMRo/TfxcfEQWDbI/AAAAAAAAAME/MQsWnvSxgcs/s1600/pie1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2b-S1GTCPUI/Tfxco-V83DI/AAAAAAAAAMI/Sv5lq6hoLNI/s1600/spin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-2b-S1GTCPUI/Tfxco-V83DI/AAAAAAAAAMI/Sv5lq6hoLNI/s1600/spin.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Audio coding with spectrum and lua&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I have also provided a version of the spectrum demo with a slight modification - this version allows the waveform to be specified from lua. The spectrum program reloads the file &lt;b&gt;spectrum.lua&lt;/b&gt; whenever the mode settings are changed to obtain the newest definition of the &lt;b&gt;calcsample&lt;/b&gt; function, which it uses to compute the waveform. If you open TextEd after opening spectrum, TextEd will allow you to edit the spectrum.lua file. Starting the LiveCode program will tell TextEd to go back to editing &lt;b&gt;livecode.lua&lt;/b&gt; the next time it starts.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-tU_cCK04VAA/TfxbdkbqBjI/AAAAAAAAALs/ubvNzrDGSx4/s1600/spectrum-square.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-tU_cCK04VAA/TfxbdkbqBjI/AAAAAAAAALs/ubvNzrDGSx4/s1600/spectrum-square.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-w2juL-KjNtY/TfxbiC71AkI/AAAAAAAAALw/XtZuyCskhxw/s1600/spectrum-tooth.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-w2juL-KjNtY/TfxbiC71AkI/AAAAAAAAALw/XtZuyCskhxw/s1600/spectrum-tooth.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TVjGuUntbVA/TfxbmhWkhsI/AAAAAAAAAL0/ZRbCvn2g1gY/s1600/spectrum-sine.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-TVjGuUntbVA/TfxbmhWkhsI/AAAAAAAAAL0/ZRbCvn2g1gY/s1600/spectrum-sine.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-TVjGuUntbVA/TfxbmhWkhsI/AAAAAAAAAL0/ZRbCvn2g1gY/s1600/spectrum-sine.png" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wKeOvMbNlaw/Tfxb48ff0-I/AAAAAAAAAL4/dhfT2frzmMs/s1600/TextEd-spectrum.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-wKeOvMbNlaw/Tfxb48ff0-I/AAAAAAAAAL4/dhfT2frzmMs/s1600/TextEd-spectrum.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The original version of the spectrum demo comes from the Qt SDK, available from &lt;a href="http://qt.nokia.com/"&gt;qt.nokia.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-8799455055707165884?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/8799455055707165884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2011/06/lua-based-live-coding-tools-for-nokia.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/8799455055707165884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/8799455055707165884'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2011/06/lua-based-live-coding-tools-for-nokia.html' title='Lua based live coding tools for the Nokia E71'/><author><name>thecodewitch</name><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/-BOXvTjDeZEg/TfxbROO8buI/AAAAAAAAALo/M-IEeaaZczE/s72-c/linecurve.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-2198527740815082410</id><published>2011-06-18T07:43:00.006+10:00</published><updated>2011-11-20T13:06:57.073+11:00</updated><title type='text'>wtf-atabimp - fugue @ Flashback 2011</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-42kvj8Kg3b4/TfvKXPWRDaI/AAAAAAAAALk/KDfMw81sGnY/s1600/wtf-atabimp.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://2.bp.blogspot.com/-42kvj8Kg3b4/TfvKXPWRDaI/AAAAAAAAALk/KDfMw81sGnY/s320/wtf-atabimp.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This demo is built on a framework that allows the entire demo to be driven by lua. The lua files are included, and can be modified freely. There is also a console available from the demo itself, providing a "live coding" environment which permits complete modification of the demo while it is running. There is an unmarked pane splitter at the bottom of the window which can be moved to reveal the console.&lt;br /&gt;&lt;br /&gt;This is my first demo, and I wrote it this way to permit the protoyping of different effects easily. In this demo, there are only 3 effects:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A 3D braitenberg vehicle simulation, where 200 randomly placed objects self organize into a group of 3D curves&lt;/li&gt;&lt;li&gt;An animated heightmap&lt;/li&gt;&lt;li&gt;A randomly generated group of polylines with a bunch of triangular guys moving along them.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/dGbNPqRDZVE" width="425"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-2198527740815082410?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/2198527740815082410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2011/06/flashback-2011-production-wtf-atabimp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2198527740815082410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2198527740815082410'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2011/06/flashback-2011-production-wtf-atabimp.html' title='wtf-atabimp - fugue @ Flashback 2011'/><author><name>thecodewitch</name><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/-42kvj8Kg3b4/TfvKXPWRDaI/AAAAAAAAALk/KDfMw81sGnY/s72-c/wtf-atabimp.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-7171816594084270008</id><published>2011-06-17T18:01:00.007+10:00</published><updated>2011-11-20T15:22:10.313+11:00</updated><title type='text'>Synthbench - Flashback update</title><content type='html'>I presented this version at &lt;a href="http://defame.com.au/flashback.php"&gt;Flashback 2011&lt;/a&gt;. It features:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Generator and controller elements that use lua specified waveforms&lt;/li&gt;&lt;li&gt;A continuously running tracker where instruments can be assigned to the tracks using "music" effect elements&lt;/li&gt;&lt;li&gt;Completely scriptable operation. From the lua console it is possible to construct the table, and manipulate all its controls including the data in the tracker or the waveforms in the lua generators and controllers over time.&lt;/li&gt;&lt;li&gt;Update callbacks which are called at 20Hz, and also after each note played by the tracker&lt;/li&gt;&lt;li&gt;The delay effect now mixes the input with a delayed version of itself&lt;/li&gt;&lt;li&gt;There are also 3 filter effects - band pass, high pass and low pass filters&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;I'm in the process of uploading some videos demonstrating the new features. They will appear in &lt;a href="http://www.youtube.com/user/paperwitch"&gt;this youtube channel.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are some example scripts which demonstrate how to use the scripting features. You can also refer to the readme file for further documentation.&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/b_b9laI_iw0" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="349" src="http://www.youtube.com/embed/GZB8vdto30s" width="425"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-7171816594084270008?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/7171816594084270008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2011/06/synthbench-flashback-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/7171816594084270008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/7171816594084270008'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2011/06/synthbench-flashback-update.html' title='Synthbench - Flashback update'/><author><name>thecodewitch</name><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://img.youtube.com/vi/b_b9laI_iw0/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-3382486958787651273</id><published>2011-03-19T18:56:00.019+11:00</published><updated>2011-11-20T15:29:17.239+11:00</updated><title type='text'>WikiReader Forth Simulator</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-Ow6gZIzWHsY/TYSmkUyObKI/AAAAAAAAAK8/xbxKuajTVHQ/s1600/ss1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh4.googleusercontent.com/-Ow6gZIzWHsY/TYSmkUyObKI/AAAAAAAAAK8/xbxKuajTVHQ/s320/ss1.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="https://lh3.googleusercontent.com/-EyR7s-jpveM/TYRhYKUqY7I/AAAAAAAAAKg/7CnjWUzod9c/s1600/ss3.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I bought a WikiReader recently, which apart from being a 4GB text only offline version of Wikipedia, comes with a fun feature where it can run any Forth programs which are placed on its internal mini SD card. I wrote this program so I could test my small Forth programs without having to swap the mini SD card in and out repeatedly. The current version can run most of the test programs exactly as they appear on the SD card very faithfully. This app uses a Forth interpreter provided by the open source embeddable Forth implementation &lt;a href="http://ficl.sourceforge.net/"&gt;FICL (http://ficl.sourceforge.net/)&lt;/a&gt;, and it works by providing device specific words as callbacks to a simulated WikiReader. It implements enough now to be useful, including the framebuffer functions, GDI functions (including text rendering using the device's font) and input functions, so I'm releasing it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Usage:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;See simlib.4th for the list of device specific words supported by this simulator, as well as simtest.4th for some simple examples. The other Forth programs included are the ones which come with the device and which I've tested on this simulator. Please refer to them for more reference material when writing your own programs.&lt;br /&gt;&lt;br /&gt;The console supports multi-line commands. To enter a multi-line command, press ctrl-enter for a new line. The console also keeps a history of all commands entered. To navigate the history, press ctrl-up or ctrl-down. Pressing up or down without ctrl will move the cursor around the console.&lt;br /&gt;&lt;br /&gt;To simulate moving your finger over the screen during the execution of your Forth command or program, move your mouse over the screen while holding down the left mouse button. To simulate hardware key presses, the hardware keys are mapped as follows:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="1" style="width: 300px;"&gt;&lt;tbody&gt;&lt;tr align="left"&gt; &lt;td&gt;Search&lt;/td&gt; &lt;td&gt;Q&lt;/td&gt; &lt;/tr&gt;&lt;tr align="left"&gt; &lt;td&gt;History&lt;/td&gt; &lt;td&gt;W&lt;/td&gt; &lt;/tr&gt;&lt;tr&gt; &lt;td style="text-align: left;"&gt;Random&lt;/td&gt; &lt;td style="text-align: left;"&gt;E&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;A note about the calculator progam, calc.4th:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The calculator program is not completely identical to the original version on the retail device, because the version on the device has a bug. I found the bug while writing this simulator, and submitted a bug report. &lt;a href="https://github.com/wikireader/wikireader/issues#issue/24"&gt;Here is a link to the bug report.&lt;/a&gt; To see the bug for yourself, on your device, try the following calculation: -75 + 5 =. The result it gives is gibberish, and when trying it on the simulator with the original calc.4th, a stack underflow occurs. Fortunately, I believe I have fixed the bug, and have included the fixed version of calc.4th in the simulator. You can transfer this fixed version to your device as well.&lt;br /&gt;&lt;br /&gt;Here are the downloads for the fixed calculator:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://createuniverses.googlecode.com/files/calc.4th"&gt;calc.4th&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://createuniverses.googlecode.com/files/calc.patch"&gt;calc.patch&lt;/a&gt; (so you can see what I changed more clearly)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Screenshots:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-bXvc2_5STH8/TYSmqU8JpoI/AAAAAAAAALE/spJeAa5-l_c/s1600/ss2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh3.googleusercontent.com/-bXvc2_5STH8/TYSmqU8JpoI/AAAAAAAAALE/spJeAa5-l_c/s320/ss2.PNG" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-mNFJy0qeYpM/TYSmq4O019I/AAAAAAAAALI/wQIddHxVgoE/s1600/ss3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh4.googleusercontent.com/-mNFJy0qeYpM/TYSmq4O019I/AAAAAAAAALI/wQIddHxVgoE/s320/ss3.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-gKQo-O_VV_w/TYSmrMNpcrI/AAAAAAAAALM/qHT07bZ4Myo/s1600/ss4.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh6.googleusercontent.com/-gKQo-O_VV_w/TYSmrMNpcrI/AAAAAAAAALM/qHT07bZ4Myo/s320/ss4.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-ifsQpYrwLDA/TYSmrkWOpPI/AAAAAAAAALQ/IQQbYpCUxIQ/s1600/ss5.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh5.googleusercontent.com/-ifsQpYrwLDA/TYSmrkWOpPI/AAAAAAAAALQ/IQQbYpCUxIQ/s320/ss5.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-W3du49sjZbY/TYSmrze8i6I/AAAAAAAAALU/5K5RLdWeeco/s1600/ss6.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh4.googleusercontent.com/-W3du49sjZbY/TYSmrze8i6I/AAAAAAAAALU/5K5RLdWeeco/s320/ss6.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh3.googleusercontent.com/-K_-nhA6QCHw/TYSmsT1V4lI/AAAAAAAAALY/5C8sRIDk6Wc/s1600/ss7.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh3.googleusercontent.com/-K_-nhA6QCHw/TYSmsT1V4lI/AAAAAAAAALY/5C8sRIDk6Wc/s320/ss7.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-buGwCgiyMvU/TYSms721oiI/AAAAAAAAALc/A-I-IK5As30/s1600/ss8.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh5.googleusercontent.com/-buGwCgiyMvU/TYSms721oiI/AAAAAAAAALc/A-I-IK5As30/s320/ss8.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-v_eFKqhTUOM/TYSmtM_EPTI/AAAAAAAAALg/FScYF2h3azo/s1600/ss9.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh5.googleusercontent.com/-v_eFKqhTUOM/TYSmtM_EPTI/AAAAAAAAALg/FScYF2h3azo/s320/ss9.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-ClDKJe4njAo/TYSmqBx0wiI/AAAAAAAAALA/G5jwkuFONPw/s1600/ss10.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://lh5.googleusercontent.com/-ClDKJe4njAo/TYSmqBx0wiI/AAAAAAAAALA/G5jwkuFONPw/s320/ss10.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-3382486958787651273?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/3382486958787651273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2011/03/wikireader-forth-simulator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/3382486958787651273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/3382486958787651273'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2011/03/wikireader-forth-simulator.html' title='WikiReader Forth Simulator'/><author><name>thecodewitch</name><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='https://lh4.googleusercontent.com/-Ow6gZIzWHsY/TYSmkUyObKI/AAAAAAAAAK8/xbxKuajTVHQ/s72-c/ss1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-5990870160526350938</id><published>2011-02-04T19:24:00.004+11:00</published><updated>2011-11-20T15:19:45.684+11:00</updated><title type='text'>Synthbench - A Reactable Simulator - Update 4</title><content type='html'>This is still a limited early  release. This update features sine and square wave generator and  controller nodes, as well as 2 effect nodes - a band pass filter, and a  delay effect. The output node now accepts multiple audio sources.&lt;br /&gt;&lt;br /&gt;I've modified the look so it is closer to the style of the Reactable.  Square nodes are generators, circular nodes are controllers, and square  nodes with rounded corners are effects. I'm still using text to label  the nodes though - the labels are "sin" for sine wave, "sqr" for square  wave, "del" for delay and "bpf" for band pass filter. I also haven't  bothered with rotating the nodes just yet. &lt;br /&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="390" src="http://www.youtube.com/embed/zwSc7Cs9ARg" title="YouTube video player" width="480"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-5990870160526350938?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/5990870160526350938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2011/02/synthbench-reactable-simulator-update-4.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5990870160526350938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5990870160526350938'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2011/02/synthbench-reactable-simulator-update-4.html' title='Synthbench - A Reactable Simulator - Update 4'/><author><name>thecodewitch</name><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://img.youtube.com/vi/zwSc7Cs9ARg/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-2002697901050922221</id><published>2010-12-23T14:56:00.019+11:00</published><updated>2010-12-23T15:52:50.235+11:00</updated><title type='text'>Synthbench usage video</title><content type='html'>&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Jl0PwX1WIRg?fs=1&amp;amp;hl=en_US"&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/Jl0PwX1WIRg?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-2002697901050922221?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/2002697901050922221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-usage-video.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2002697901050922221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2002697901050922221'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-usage-video.html' title='Synthbench usage video'/><author><name>thecodewitch</name><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-4578848417268948676.post-5298634252402672352</id><published>2010-12-16T23:24:00.002+11:00</published><updated>2011-11-20T19:21:32.854+11:00</updated><title type='text'>Synthbench - A Reactable Simulator - Update 3</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/TQmfHmvWWaI/AAAAAAAAAKI/OER9MpGHrHs/s1600/Synthbench.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_NFueSZG4S8E/TQmfHmvWWaI/AAAAAAAAAKI/OER9MpGHrHs/s400/Synthbench.PNG" width="327" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This is a bug fix release for the &lt;a href="http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator-update-2.html"&gt;Synthbench_2010_12_16&lt;/a&gt; version. The output node no longer auto connects when dragged. Prior to this fix, when the output node was dragged, it instantly tried connecting to itself, resulting in bizarre behaviour. Also, the output node is now labeled appropriately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-5298634252402672352?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/5298634252402672352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator-update-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5298634252402672352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5298634252402672352'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator-update-3.html' title='Synthbench - A Reactable Simulator - Update 3'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TQmfHmvWWaI/AAAAAAAAAKI/OER9MpGHrHs/s72-c/Synthbench.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-3460383542128041443</id><published>2010-12-16T16:13:00.004+11:00</published><updated>2011-11-20T19:21:40.290+11:00</updated><title type='text'>Synthbench - A Reactable Simulator - Update 2</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/TQmfHmvWWaI/AAAAAAAAAKI/OER9MpGHrHs/s1600/Synthbench.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/_NFueSZG4S8E/TQmfHmvWWaI/AAAAAAAAAKI/OER9MpGHrHs/s400/Synthbench.PNG" width="327" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This is a bug fix release for the &lt;a href="http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator_14.html"&gt;Synthbench_2010_12_14&lt;/a&gt; version. The program should no longer hang regardless of the node network you try to create.&lt;br /&gt;&lt;br /&gt;Whenever there is a cycle in the network, Synthbench no longer hangs - the nodes in the cycle merely stop updating.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-3460383542128041443?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/3460383542128041443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator-update-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/3460383542128041443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/3460383542128041443'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator-update-2.html' title='Synthbench - A Reactable Simulator - Update 2'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TQmfHmvWWaI/AAAAAAAAAKI/OER9MpGHrHs/s72-c/Synthbench.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-5379225004888468899</id><published>2010-12-14T16:16:00.004+11:00</published><updated>2011-11-20T19:21:47.979+11:00</updated><title type='text'>Synthbench - A Reactable Simulator - Update 1</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/TQb9EyDO5EI/AAAAAAAAAKE/Fjts0t_JTeA/s1600/Synthbench.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_NFueSZG4S8E/TQb9EyDO5EI/AAAAAAAAAKE/Fjts0t_JTeA/s400/Synthbench.PNG" width="327" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This program is inspired by the Reactable, and it attempts to simulate it. This is a very limited early version - the project is an excercise in audio programming.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Differences between this version (2010_12_14) and the previous version (2010_12_03):&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Its possible to add new nodes to the table by dragging them from the palette&lt;/li&gt;&lt;li&gt;The nodes auto-connect and disconnect as you drag them. Controller nodes connect to generators and other controllers, while generators only connect to the output node. Also, a node won't auto connect with a node further away from the output node than it is, encouraging radial node layouts. I may change this rule.&lt;/li&gt;&lt;li&gt;The nodes are labelled - generators are labelled "g", controllers are labelled "c".&lt;/li&gt;&lt;li&gt;The controller nodes modify a parameter away from the base setting, which means that manipulating the sliders will have an effect even if a controller node is connected.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Controls:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Move a node by dragging it with the left mouse button&lt;/li&gt;&lt;li&gt;Pan the view by dragging an empty spot with the left mouse button&lt;/li&gt;&lt;li&gt;Zoom the view by dragging an empty spot up and down with the right mouse button&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&lt;b&gt;Limitations and known bugs:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The output node doesn't do any mixing - it accepts only one input from a generator node&lt;/li&gt;&lt;li&gt;In fact, all the nodes accept only one input at the moment, which means the only thing you can make at the moment is a chain.&lt;/li&gt;&lt;li&gt;The only parameter a controller will modify is the period&lt;/li&gt;&lt;li&gt;The program might hang if you make a complex structure it can't support - only make a chain for now. &lt;/li&gt;&lt;/ul&gt;Despite these limitations, you can still achieve some interesting effects.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Coming up in the next version(s):&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Low/high/band pass filters nodes and other effect nodes&lt;/li&gt;&lt;li&gt;Sequencer nodes&lt;/li&gt;&lt;li&gt;Controller nodes affecting more parameters&lt;/li&gt;&lt;li&gt;Improving the look - possibly switching to 3D so effects can be added&lt;/li&gt;&lt;li&gt;Make more use of the Lua console&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/4578848417268948676-5379225004888468899?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/5379225004888468899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator_14.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5379225004888468899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5379225004888468899'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator_14.html' title='Synthbench - A Reactable Simulator - Update 1'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TQb9EyDO5EI/AAAAAAAAAKE/Fjts0t_JTeA/s72-c/Synthbench.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-6388550742119054519</id><published>2010-12-03T01:40:00.002+11:00</published><updated>2011-11-20T19:22:21.846+11:00</updated><title type='text'>Synthbench - A Reactable simulator</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/TPeuqgJVioI/AAAAAAAAAKA/x7zG8J2HL2Q/s1600/Synthbench.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_NFueSZG4S8E/TPeuqgJVioI/AAAAAAAAAKA/x7zG8J2HL2Q/s320/Synthbench.png" width="185" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This program is inspired by the &lt;a href="http://www.reactable.com/"&gt;Reactable&lt;/a&gt;,  and it attempts to simulate it. This is a very limited early version -  the project is more of a proof of concept which provides an excercise in  audio programming. You can still have some fun with it though. The table layout consists of a sinewave generator, with a sinewave controller controlling it. Selecting the sinewave controller (the node on the left) allows you to modify its parameters using the sliders at the top of the window.&lt;br /&gt;&lt;br /&gt;The Lua scripting pane is a functional Lua repl that allows you to enter multi-line Lua expressions and programs, although isn't tied to anything in the simulator yet.&lt;br /&gt;&lt;br /&gt;A better, actually useful version is coming soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-6388550742119054519?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/6388550742119054519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/6388550742119054519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/6388550742119054519'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/12/synthbench-reactable-simulator.html' title='Synthbench - A Reactable simulator'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TPeuqgJVioI/AAAAAAAAAKA/x7zG8J2HL2Q/s72-c/Synthbench.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-1244294650237181819</id><published>2010-11-20T19:19:00.003+11:00</published><updated>2010-11-20T19:23:31.947+11:00</updated><title type='text'>Syntax Party 2010</title><content type='html'>I attended &lt;a href="http://www.syntaxparty.org/"&gt;Syntax Party 2010&lt;/a&gt; this year. I've always admired the demoscene from afar, so when I heard there was going to be an event in Melbourne, I had to go and see it. I ended up having the time of my life! The venue was filled with like-minded, friendly, enthusiastic programmers and artists all eager to show their creations, and to query in detail about the creations of others. People from all over Australia arrived to code and party all weekend, and the atmosphere was relaxed and fun. Even though I didn't have a production prepared specifically for the event, I was encouraged to enter some of the programs I had been showing people during the event. They were &lt;a href="http://createuniverses.blogspot.com/2010/08/mechabach.html"&gt;Mechabach &lt;/a&gt;and &lt;a href="http://createuniverses.blogspot.com/2007/11/ball-game-simulation.html"&gt;Ball Game&lt;/a&gt;, and they were both well received. I've made some great new friends, including an ANSI artist named Ozzy who created a logo for my new handle, "fugue":&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/TOeEiMy5KuI/AAAAAAAAAJ0/JZkZ1lcttJY/s1600/fugue.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img  src="http://4.bp.blogspot.com/_NFueSZG4S8E/TOeEiMy5KuI/AAAAAAAAAJ0/JZkZ1lcttJY/s1600/fugue.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I look forward to next year's Syntax Party event in Sydney!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-1244294650237181819?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/1244294650237181819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/11/syntax-party-2010.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/1244294650237181819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/1244294650237181819'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/11/syntax-party-2010.html' title='Syntax Party 2010'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TOeEiMy5KuI/AAAAAAAAAJ0/JZkZ1lcttJY/s72-c/fugue.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-602918431322734020</id><published>2010-08-19T15:16:00.002+10:00</published><updated>2011-11-20T19:22:31.976+11:00</updated><title type='text'>Mechabach</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/TGy3AI9j6WI/AAAAAAAAAJk/qwghPafkG1k/s1600/mechabach.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_NFueSZG4S8E/TGy3AI9j6WI/AAAAAAAAAJk/qwghPafkG1k/s320/mechabach.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This program demonstrates a simple procedural composition technique for automatically generating contrapuntal compositions. Sounds completely crazy? Try it.&lt;br /&gt;&lt;br /&gt;When you run it, it generates a file called "test.mid", and proceeds to open it with the default midi playing program you have installed. I suggest using &lt;a href="http://www.musanim.com/player/"&gt;MAMPlayer&lt;/a&gt;, because of its visualisation of the midi file as it plays it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;What is it doing?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It generates several independent tracks, one note at a time. Notes inside beats 1 and 3 are always notes in the tonic chord, and notes inside beats 2 and 4 are always notes in the dominant 7th chord. Since it always works in C major, the tonic notes are C, E and G, and the dominant notes are G, B, D and F. Also the note that is chosen is either the nearest or 2nd nearest higher or lower note to the previous note that is part of the chord it is assigned to. The choice about whether the note is higher or lower, or is the nearest or 2nd nearest is a random choice. For example, if the previous note is C, and the next note falls inside the 2nd beat of the bar, then it may either choose the D or F above the C, or the B or G below the C. As for the rhythm, there are 3 rhythms, each 1 bar long. These are 4 crotchets, 8 quavers, or a hopping rhythm of 4 repeats of a dotted quaver and a semi-quaver. Every bar, it chooses randomly from these 3 rhythms.&lt;br /&gt;&lt;br /&gt;Will it ever end?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-602918431322734020?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/602918431322734020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/08/mechabach.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/602918431322734020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/602918431322734020'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/08/mechabach.html' title='Mechabach'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TGy3AI9j6WI/AAAAAAAAAJk/qwghPafkG1k/s72-c/mechabach.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-7763605402236820470</id><published>2010-08-11T15:42:00.005+10:00</published><updated>2011-11-20T19:28:29.379+11:00</updated><title type='text'>Assorted bits and pieces</title><content type='html'>&lt;b&gt;&lt;span style="font-size: large;"&gt;DominoSolver&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIsvlpxbVI/AAAAAAAAAHw/P2sE0vl74FQ/s1600/DominoSolver2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIsvlpxbVI/AAAAAAAAAHw/P2sE0vl74FQ/s320/DominoSolver2.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This is a small program which generates a Dominosa problem to solve, then uses my implementation of &lt;a href="http://en.wikipedia.org/wiki/Knuth%27s_Algorithm_X"&gt;Knuth's Algorithm X&lt;/a&gt; to solve it. The controls are:&lt;br /&gt;&lt;br /&gt;Press 'r' to generate a new puzzle&lt;br /&gt;Press 'p' to pause the solution search&lt;br /&gt;Press 's' to single step the solution search&lt;br /&gt;Press 'c' to continue the solution search&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Eternity2&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIu5Xo6kkI/AAAAAAAAAH4/gwb7S5tWLNU/s1600/Eternity2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIu5Xo6kkI/AAAAAAAAAH4/gwb7S5tWLNU/s320/Eternity2.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This started out as a utility to help explore the huge Eternity2 puzzle, but as usually happens with me, I became sidetracked by pretty objects. The puzzle solving aspect is a minor part of this tool - the major focus of it is in procedurally generating the designs of the tiles, and from a programming point of view getting practice using the OpenGL stencil buffer by using it to produce different designs, and learning how to render to many textures.&lt;br /&gt;&lt;br /&gt;To edit a design, pan over to the single tile view (its near the bottom right of the board), and press the spacebar. (To pan, drag with the right mouse button.) Labels will appear underneath some of the sliders, indicating they may be changed to alter the design. This is the area in question:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIu-jrpbpI/AAAAAAAAAIA/VSyczU6SGR0/s1600/Eternity22.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIu-jrpbpI/AAAAAAAAAIA/VSyczU6SGR0/s320/Eternity22.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you pan to the left, you'll see this design repeated on a grid, to give you an indication of how it looks when tesselated. You can continue editing here as well of course.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIwg2NEyVI/AAAAAAAAAIQ/2MbPU3OXBtM/s1600/Eternity24.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIwg2NEyVI/AAAAAAAAAIQ/2MbPU3OXBtM/s320/Eternity24.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;If you like, you can still "play" Eternity 2, and attempt to solve the puzzle - when you click on an empty part of the board (the large greyish area), candidate pieces are revealed on the top right, which you can click to place the tile. Tiles highlighted green have already been placed, and will be moved if you click them. I was going to investigate some simple auto placement strategies, but I got bored and moved on before I did this.&lt;br /&gt;&lt;br /&gt;Included is a file called e2dataset.txt. This is not the official Eternity 2 tile set - it is a randomly generated tile set which includes border and corner pieces.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;PegSolitaire&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIz-W2yBkI/AAAAAAAAAIY/vmNvTcDix7o/s1600/PegSolitaire.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_NFueSZG4S8E/TGIz-W2yBkI/AAAAAAAAAIY/vmNvTcDix7o/s320/PegSolitaire.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A simple implementation of Peg Solitaire. Right click to move a peg. There is some inactive AI code in the project.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;RenderToTexturePlay&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/TGI1dEDpVqI/AAAAAAAAAIw/blgjt5qcu3M/s1600/RenderToTexturePlay.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_NFueSZG4S8E/TGI1dEDpVqI/AAAAAAAAAIw/blgjt5qcu3M/s320/RenderToTexturePlay.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;A simple render to texture experiment. Not interactive, but the texture is animated, so it may have instructive value.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;FreewaySim&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A simple simulation to play with some of the dynamics of traffic and overtaking behaviours.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/TGI0vRyML7I/AAAAAAAAAIg/-tmMHpsM5TE/s1600/FreewaySim.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_NFueSZG4S8E/TGI0vRyML7I/AAAAAAAAAIg/-tmMHpsM5TE/s320/FreewaySim.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Some of the parameters are in the Freeway constructor if you want to play around.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/TGI017_GJ4I/AAAAAAAAAIo/dm3D1G53sAA/s1600/FreewaySim2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_NFueSZG4S8E/TGI017_GJ4I/AAAAAAAAAIo/dm3D1G53sAA/s320/FreewaySim2.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;EmptyWorld&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/TGI3476Nz3I/AAAAAAAAAI4/gA3jZx5VH7Y/s1600/EmptyWorld.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_NFueSZG4S8E/TGI3476Nz3I/AAAAAAAAAI4/gA3jZx5VH7Y/s320/EmptyWorld.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Its an empty world. Its a simple 3D environment complete with scene picking and an intuitive camera behaviour which you can use to render whatever thing you're working with in a 3D space instead of the usual console window.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-7763605402236820470?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/7763605402236820470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/08/assorted-bits-and-pieces.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/7763605402236820470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/7763605402236820470'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/08/assorted-bits-and-pieces.html' title='Assorted bits and pieces'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TGIsvlpxbVI/AAAAAAAAAHw/P2sE0vl74FQ/s72-c/DominoSolver2.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-8645664907349970638</id><published>2010-08-09T15:57:00.004+10:00</published><updated>2011-11-20T19:23:39.197+11:00</updated><title type='text'>AudioTest - a precursor to a Reactable simulator</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/TF-YowAndII/AAAAAAAAAHo/irgnmLR2CMI/s1600/AudioTest.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_NFueSZG4S8E/TF-YowAndII/AAAAAAAAAHo/irgnmLR2CMI/s320/AudioTest.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This application is a platform for some basic audio experiments and tests. It features:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A &lt;a href="http://www.lua.org/"&gt;Lua REPL&lt;/a&gt; which permits the generation and modification of a waveform&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Mouse modifiable waveform&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Regeneration of waveform from Lua expression during the sliding of the sliders&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The effects of modifications to the waveform are heard instantly, because it is being streamed as it is modified&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It is my first foray into audio programming. It is a precursor for a &lt;a href="http://en.wikipedia.org/wiki/Reactable"&gt;"Reactable"&lt;/a&gt; simulator, similar to &lt;a href="http://www.psychosynth.com/index.php/Main_Page"&gt;PsychoSynth.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Things to try&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;When the program starts, a sample expression appears, along with the resulting waveform, and the audio of the waveform should be heard.&lt;br /&gt;&lt;br /&gt;Slide the first slider to alter the pitch of the waveform.&lt;br /&gt;&lt;br /&gt;Slide the second slider, and notice the waveform and audio change according to the expression in the expression text box.&lt;br /&gt;&lt;br /&gt;In the expression text box, enter a Lua expression that sets the variable "result". Variables you can refer to in the expression are:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;x&lt;/b&gt;&lt;/i&gt; which is the time variable in the waveform, allowing you make "result" a function of time&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;&lt;b&gt;p2&lt;/b&gt;&lt;/i&gt;, which is the setting of the second slider (The first slider controls the pitch). To see the value of &lt;i&gt;&lt;b&gt;p2&lt;/b&gt;&lt;/i&gt;, run &lt;i&gt;&lt;b&gt;print(p2)&lt;/b&gt;&lt;/i&gt; in the provided Lua REPL.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;For example, the expression:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;result = 0.2 * math.sin(x * ((2.0 * math.pi) / p2))&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;produces a sine wave whose frequency is modifiable with the second slider.&lt;br /&gt;&lt;br /&gt;There are some more example expressions in audiooutput.cpp.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Building AudioTest from source&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To build AudioTest from source, you will need:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/express/Downloads/#Visual_Studio_2008_Express_Downloads"&gt;Visual Studio 2008 (I use Express Edition)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://qt.nokia.com/downloads/windows-cpp-vs2008"&gt;Qt for Windows VS 2008 (I'm using Qt 4.6.3)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The Visual Studio .vcproj file is generated from the Qt .pro file, and it uses relative paths in the "Additional Include Directories" and "Additional Dependencies" settings to find Qt headers and libs. Because of this, you will most likely need to regenerate the .vcproj before you load the .sln and start compiling. To do this, open a console, run vsvars32.bat (to set up Visual Studio environment variables), add the Qt bin directory to your path, then issue the command &lt;i&gt;&lt;b&gt;qmake -tp vc&lt;/b&gt;&lt;/i&gt;. This will generate a new .vcproj for your setup, and you will then be ready to load the .sln and start compiling.&lt;br /&gt;&lt;br /&gt;I have included a default .user file only for your convenience, because it contains an "Environment" setting so that Qt is added to the PATH environment variable when you run or debug. It assumes Qt is in C:\Qt\4.6.3\bin, so change this if it isn't.&lt;br /&gt;&lt;br /&gt;The source code includes the complete Lua distribution, so you don't need to download it separately.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-8645664907349970638?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/8645664907349970638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/08/audiotest-precursor-to-reactable.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/8645664907349970638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/8645664907349970638'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/08/audiotest-precursor-to-reactable.html' title='AudioTest - a precursor to a Reactable simulator'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TF-YowAndII/AAAAAAAAAHo/irgnmLR2CMI/s72-c/AudioTest.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-5978563982959266480</id><published>2010-08-07T21:55:00.008+10:00</published><updated>2011-11-20T19:24:07.971+11:00</updated><title type='text'>QtLuaImagine</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/TF1KZgoW33I/AAAAAAAAAHg/LhqSdvJfZB4/s1600/QtLuaImagine.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_NFueSZG4S8E/TF1KZgoW33I/AAAAAAAAAHg/LhqSdvJfZB4/s320/QtLuaImagine.PNG" width="265" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;This project demonstrates the use of scripting languages in a Qt project to enable a 3D "live coding" environment. The scripting languages supported are &lt;a href="http://www.lua.org/"&gt;Lua&lt;/a&gt; and Scheme (through &lt;a href="https://ccrma.stanford.edu/software/snd/snd/s7.html"&gt;s7 Scheme&lt;/a&gt;). For a version which uses Common Lisp (through &lt;a href="http://ecls.sourceforge.net/"&gt;ECL&lt;/a&gt;), see &lt;a href="http://createuniverses.blogspot.com/2009/09/qtimagine-skeleton-project-for-live.html"&gt;QtImagine&lt;/a&gt; and &lt;a href="http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html"&gt;QtCSG&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The system calls the functions "update" and "render" in both languages to update and render the frame respectively. These functions can be redefined at runtime at the &lt;a href="http://en.wikipedia.org/wiki/Read-eval-print_loop"&gt;REPL.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When QtLuaImagine first starts, press "Enter" or click the "Execute" button to load an example Lua source file containing example definitions of update() and render(). Then, load the source file into your favourite text editor, make some changes, then load your freshly edited source file from the REPL by issuing the appropriate load command (dofile("filename.lua") for Lua, or (load "filename.scm") for Scheme) to see the effect of your change instantly. Of course, you can also enter expressions and definitions at the REPL itself. The REPL features a command history.&lt;br /&gt;&lt;br /&gt;To build QtLuaImagine from source, you will need:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.microsoft.com/express/Downloads/#Visual_Studio_2008_Express_Downloads"&gt;Visual Studio 2008 (I use Express Edition)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://qt.nokia.com/downloads/windows-cpp-vs2008"&gt;Qt for Windows VS 2008 (I'm using Qt 4.6.3)&amp;nbsp;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The Visual Studio .vcproj file is generated from the Qt .pro file, and it uses relative paths in the "Additional Include Directories" and "Additional Dependencies" settings to find Qt headers and libs. Because of this, you will most likely need to regenerate the .vcproj before you load the .sln and start compiling. To do this, open a console, run vsvars32.bat (to set up Visual Studio environment variables), add the Qt bin directory to your path, then issue the command "qmake -tp vc". This will generate a new .vcproj for your setup, and you will then be ready to load the .sln and start compiling.&lt;br /&gt;&lt;br /&gt;I have included a default .user file only for your convenience, because it contains an "Environment" setting so that Qt is added to the PATH environment variable when you run or debug. It assumes Qt is in C:\Qt\4.6.3\bin, so change this if it isn't.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A note on compiling for linux: &lt;/b&gt;Unlike the earlier Qt projects, this project does not have a separate static library. It is completely described by the .pro file, so compiling this on linux should be as simple as running qmake then make. Even the s7 and lua sources are included, so all that is needed to compile this on your end is Qt.&lt;br /&gt;&lt;br /&gt;To see what other functions have been exposed to the REPL, and to see how to add your own, see luainterface.cpp/.h, and schemeinterface.cpp/.h for Lua and Scheme respectively.&lt;br /&gt;&lt;br /&gt;I hope this code provides a running start for programmers getting into live coding for the first time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-5978563982959266480?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/5978563982959266480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2010/08/qtluaimagine.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5978563982959266480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5978563982959266480'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2010/08/qtluaimagine.html' title='QtLuaImagine'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/TF1KZgoW33I/AAAAAAAAAHg/LhqSdvJfZB4/s72-c/QtLuaImagine.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-6283708931124561426</id><published>2009-09-08T14:58:00.018+10:00</published><updated>2011-12-01T12:32:51.087+11:00</updated><title type='text'>QtCSG - Constructive Solid Geometry scripted from ECL</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/SqXkvWYhEuI/AAAAAAAAAHE/UR3k2T1E-DA/s1600-h/QtCSG.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378956832077320930" src="http://2.bp.blogspot.com/_NFueSZG4S8E/SqXkvWYhEuI/AAAAAAAAAHE/UR3k2T1E-DA/s400/QtCSG.PNG" style="height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This project is the same as the earlier project, &lt;a href="http://createuniverses.blogspot.com/2009/09/qtimagine-skeleton-project-for-live.html"&gt;QtImagine&lt;/a&gt; except this also features an implementation of "Constructive Solid Geometry" operations that can be performed on 3D models such as difference, union and intersection. The algorithm for performing these operations comes from the &lt;a href="http://unbboolean.sourceforge.net/"&gt;UnBBoolean&lt;/a&gt;  (&lt;a href="http://unbboolean.sourceforge.net/"&gt;http://unbboolean.sourceforge.net/&lt;/a&gt;) Java CSG implementation.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/SqXmJ-lCNQI/AAAAAAAAAHM/v7-ZCdZEQPY/s1600-h/QtCSG2.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378958389055468802" src="http://1.bp.blogspot.com/_NFueSZG4S8E/SqXmJ-lCNQI/AAAAAAAAAHM/v7-ZCdZEQPY/s400/QtCSG2.PNG" style="height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;See the files csg-test.lisp, csg-test2.lisp and csg-test3.lisp for examples on how to use these features. To run them, note that they need to be loaded in order - first csg-test.lisp, then csg-test2.lisp, then finally csg-test3.lisp, since they reference objects that were created by earlier scripts.&lt;br /&gt;&lt;br /&gt;Similarly, see init.lisp and live-render.lisp for a live rendering example script.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/SqXmKT7JR8I/AAAAAAAAAHU/ZVSYz_vP3ys/s1600-h/QtCSG3.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5378958394785351618" src="http://2.bp.blogspot.com/_NFueSZG4S8E/SqXmKT7JR8I/AAAAAAAAAHU/ZVSYz_vP3ys/s400/QtCSG3.PNG" style="height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-6283708931124561426?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/6283708931124561426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/6283708931124561426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/6283708931124561426'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html' title='QtCSG - Constructive Solid Geometry scripted from ECL'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SqXkvWYhEuI/AAAAAAAAAHE/UR3k2T1E-DA/s72-c/QtCSG.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-6429179145853120322</id><published>2009-09-01T17:27:00.021+10:00</published><updated>2011-12-01T12:35:34.160+11:00</updated><title type='text'>QtImagine - a skeleton project for live coding using ECL</title><content type='html'>&lt;b&gt;QtImagine has been updated!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In the process of releasing &lt;a href="http://createuniverses.blogspot.com/2010/08/qtluaimagine.html"&gt;QtLuaImagine&lt;/a&gt;, I cleaned up the code for QtImagine. All lisp code is now run through a (handler-bind) block so that error messages can be captured. What this means is that error messages are displayed in the main window, so no more need to flip between the console and the main window when an error occurs. Also, grey streams have been used to redirect trace output to the main window as well.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/SpzN2abIqCI/AAAAAAAAAG8/KGXqJeIFWWo/s1600-h/Imagine.PNG" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5376398389863295010" src="http://4.bp.blogspot.com/_NFueSZG4S8E/SpzN2abIqCI/AAAAAAAAAG8/KGXqJeIFWWo/s400/Imagine.PNG" style="height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This project demonstrates the use of &lt;a href="http://ecls.sourceforge.net/"&gt;ECL&lt;/a&gt; in a &lt;a href="http://qt.nokia.com/"&gt;Qt&lt;/a&gt; project to enable a 3D "live coding" environment.&lt;br /&gt;&lt;br /&gt;The system calls the lisp functions (update) and (render) to update and render the frame respectively. These functions can be redefined at runtime at the &lt;a href="http://en.wikipedia.org/wiki/Read-eval-print_loop"&gt;REPL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When QtImagine first starts, click the "Execute" button to load an example lisp source file containing example definitions of (update) and (render) which will produce a simple animation. Then, load the source file into your favourite text editor, make some changes, then load your freshly edited source file from the REPL by issuing the load command (load "live-render.lisp") to see the effect of your change instantly. Of course, you can also enter expressions and definitions at the REPL itself. The REPL features a command history.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-6429179145853120322?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/6429179145853120322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2009/09/qtimagine-skeleton-project-for-live.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/6429179145853120322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/6429179145853120322'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2009/09/qtimagine-skeleton-project-for-live.html' title='QtImagine - a skeleton project for live coding using ECL'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SpzN2abIqCI/AAAAAAAAAG8/KGXqJeIFWWo/s72-c/Imagine.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-2210808747316769978</id><published>2009-08-20T08:18:00.013+10:00</published><updated>2011-11-20T19:24:27.718+11:00</updated><title type='text'>Scripting simulations with ECL</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SoyMPSybKSI/AAAAAAAAAGU/j1HibkkEdXg/s1600-h/01-craneloaded.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5371822649915418914" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SoyMPSybKSI/AAAAAAAAAGU/j1HibkkEdXg/s400/01-craneloaded.PNG" style="cursor: pointer; height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've been adding to the program mentioned &lt;a href="http://createuniverses.blogspot.com/2009/06/embedding-lisp-interpreter-into-qt-app.html"&gt;in a previous post&lt;/a&gt;. The circuit simulator and origami crease pattern editor are drivable from the lisp repl, and the verlet physics based paper simulator has been implemented and is manipulated from the repl.&lt;br /&gt;&lt;br /&gt;Also, the repl itself features command history.&lt;br /&gt;&lt;br /&gt;Here is the list of functions currently available from the repl:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%; font-weight: bold;"&gt;ORIGAMI CREASE EDITOR&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;origami-start&lt;/span&gt;&lt;br /&gt;Initialises origami crease editor with a plain sheet of paper consisting of 1 four sided facet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;origami-end&lt;/span&gt;&lt;br /&gt;Clears the origami crease editor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;origami-creasecoords&lt;/span&gt;&lt;br /&gt;Takes 4 parameters (x1 y1 x2 y2) representing the 2 endpoints of a crease line.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;origami-crease&lt;/span&gt;&lt;br /&gt;Takes 2 vertex ids (nodeA nodeB) and uses them as the 2 endpoints of a crease line.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;origami-creasepp&lt;/span&gt;&lt;br /&gt;Takes 2 vertex ids (nodeA nodeB) and forms the crease from "folding" one vertex on the other. The crease line is the perpendicular bisector.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;origami-creasell&lt;/span&gt;&lt;br /&gt;Takes 4 vertex ids (l1v1 l1v2 l2v1 l2v2) to describe the endpoints of 2 lines, and forms the crease from "folding" one line onto the other.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;origami-fold&lt;/span&gt;&lt;br /&gt;Takes 3 vertex ids (nodeF nodeA nodeB) and attempts to fold nodeF around the (nodeA nodeB) line by finding its mirror on the other side. It does the same with connected vertices as necessary.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;origami-makeverletpaper&lt;/span&gt;&lt;br /&gt;Makes a verlet physics representation of the current crease pattern, so it can be manipulated in the verlet physics environment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;VERLET PHYSICS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-lock&lt;/span&gt;&lt;br /&gt;Takes 1 vertex id, and fixes that node in space.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-free&lt;/span&gt;&lt;br /&gt;Takes 1 vertex id, and frees that node if it was fixed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-freeall&lt;/span&gt;&lt;br /&gt;Removes all position constraints&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-rotate&lt;/span&gt;&lt;br /&gt;Takes 4 parameters (nodeF nodeA nodeB angle) and rotates nodeF around the axis defined by nodeA and nodeB using the angle parameter. As the system resolves this attempt to do this rotation, you'll see whether the system currently permits or rejects such a motion.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-numnodes&lt;/span&gt;&lt;br /&gt;Returns the number of nodes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-numstruts&lt;/span&gt;&lt;br /&gt;Returns the number of struts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-show&lt;/span&gt;&lt;br /&gt;Not implemented - will show the given node id.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-hide&lt;/span&gt;&lt;br /&gt;Not implemented - will hide the given node id.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-showall&lt;/span&gt;&lt;br /&gt;Not implemented - will show all node ids.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-hideall&lt;/span&gt;&lt;br /&gt;Not implemented - will hide all node ids.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-addfstrut&lt;/span&gt;&lt;br /&gt;Not implemented - will add a folding strut, which is the same as the crease struts, but is marked as a folding strut, because it can be removed when a given fold is completed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-addsstrut&lt;/span&gt;&lt;br /&gt;Not implemented - will add a structural strut manually. For facets containing more than 3 edges, structural struts are necessary to keep those facets flat. For the crane model, all facets are triangular, so this isn't necessary yet.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-removefstruts&lt;/span&gt;&lt;br /&gt;Not implemented - will remove all folding struts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-removesstruts&lt;/span&gt;&lt;br /&gt;Not implemented - will remove all structural struts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-autoaddsstruts&lt;/span&gt;&lt;br /&gt;Not implemented - will automatically add structural struts where needed for facets containing more than 3 edges.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;verlet-satisfy&lt;/span&gt;&lt;br /&gt;Not implemented - will allow the user to manually invoke the verlet constraint resolver, rather than having it run all the time.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;CIRCUIT SIMULATOR&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-AddNode&lt;/span&gt;&lt;br /&gt;Takes 2 parameters (x y) and adds a new node at that location.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-AddResistor&lt;/span&gt;&lt;br /&gt;Takes 3 parameters (nodeA nodeB resistance) and creates a resistor connecting nodeA and nodeB using the resistance parameter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-AddVoltage&lt;/span&gt;&lt;br /&gt;Takes 3 parameters (nodeA nodeB voltage) and creates a voltage source connecting nodeA and nodeB using the voltage parameter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-AddCurrent&lt;/span&gt;&lt;br /&gt;Takes 3 parameters (nodeA nodeB voltage) and creates a current source connecting nodeA and nodeB using the current parameter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-SetTweenA&lt;/span&gt;&lt;br /&gt;Takes 3 parameters (component x y) and adds a tween vertex on one side of the component. For circuit rendering purposes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-SetTweenB&lt;/span&gt;&lt;br /&gt;Takes 3 parameters (component x y) and adds a tween vertex on one side of the component. For circuit rendering purposes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-DoLoops&lt;/span&gt;&lt;br /&gt;Automatically finds the loops in the circuit. It is necessary to call this once modifications to the circuit are complete for the circuit to be simulated correctly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-Clear&lt;/span&gt;&lt;br /&gt;Clears the current circuit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-ShowCurrent&lt;/span&gt;&lt;br /&gt;Turns on the animated rendering of the current.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-ShowComponents&lt;/span&gt;&lt;br /&gt;Turns on rendering of the components.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-ShowNodes&lt;/span&gt;&lt;br /&gt;Turns on rendering of the nodes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-ShowLoops&lt;/span&gt;&lt;br /&gt;Turns on rendering of the loops.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-HideCurrent&lt;/span&gt;&lt;br /&gt;Turns off the animated rendering of the current.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-HideComponents&lt;/span&gt;&lt;br /&gt;Turns off rendering of the components.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-HideNodes&lt;/span&gt;&lt;br /&gt;Turns off rendering of the nodes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-HideLoops&lt;/span&gt;&lt;br /&gt;Turns off rendering of the loops.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-Rewire&lt;/span&gt;&lt;br /&gt;Takes 3 parameters (componentID nodeFrom nodeTo) and disconnects the component from nodeFrom and connects it to nodeTo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-DeleteComponent&lt;/span&gt;&lt;br /&gt;Takes a componentID as a parameter and deletes it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;circuit-DeleteNode&lt;/span&gt;&lt;br /&gt;Takes a nodeID as a parameters and deletes it if there is nothing connected to it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;LIVE RENDERING&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ogl-renderon&lt;/span&gt;&lt;br /&gt;Turn on live rendering&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ogl-renderoff&lt;/span&gt;&lt;br /&gt;Turn off live rendering&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ogl-drawline&lt;/span&gt;&lt;br /&gt;Takes 6 parameters (x1 y1 z1 x2 y2 z2) that describe a 3D line, and renders it. This can only be called from within the paper-render function. Redefine the paper-render function at will at runtime.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%;"&gt;&lt;span style="font-weight: bold;"&gt;OLD TEST FUNCTIONS&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;myadd&lt;/span&gt;&lt;br /&gt;Takes 2 parameters and adds them&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;myaddlist&lt;/span&gt;&lt;br /&gt;Takes a list and adds the numbers in the list.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: 130%; font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Press "Execute" when the program starts to load the script which computes the crane crease pattern:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SoyMPSybKSI/AAAAAAAAAGU/j1HibkkEdXg/s1600-h/01-craneloaded.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5371822649915418914" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SoyMPSybKSI/AAAAAAAAAGU/j1HibkkEdXg/s400/01-craneloaded.PNG" style="cursor: pointer; height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Having a look at the crease pattern in the pattern editor:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/SoyMP0MWlXI/AAAAAAAAAGc/dgwFh7SkG84/s1600-h/02-cranecrease.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5371822658882540914" src="http://4.bp.blogspot.com/_NFueSZG4S8E/SoyMP0MWlXI/AAAAAAAAAGc/dgwFh7SkG84/s400/02-cranecrease.PNG" style="cursor: pointer; height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Verlet physics paper manipulation and live rendering: &lt;/span&gt;Calling verlet-rotate from the repl to rotate the 4 corner vertices at once, 0.1 degrees at a time (the rotation continues due to momentum), then calling ogl-renderon to turn on live rendering, and modifying the paper-render function live by loading live-render.lisp (the function simul-rotate has been defined for convenience to do the simultaneous rotation):&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/SoyMQeSZJjI/AAAAAAAAAGk/rGLuwmxMmfo/s1600-h/04-liverender.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5371822670182164018" src="http://1.bp.blogspot.com/_NFueSZG4S8E/SoyMQeSZJjI/AAAAAAAAAGk/rGLuwmxMmfo/s400/04-liverender.PNG" style="cursor: pointer; height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Circuit simulator: &lt;/span&gt;Switching to the circuit simulator and loading a circuit (block-circuit.lisp):&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/SoyMQ1p3iLI/AAAAAAAAAGs/QuHuctx1B-U/s1600-h/05-loadcircuit.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5371822676454639794" src="http://1.bp.blogspot.com/_NFueSZG4S8E/SoyMQ1p3iLI/AAAAAAAAAGs/QuHuctx1B-U/s400/05-loadcircuit.PNG" style="cursor: pointer; height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Loading the scripts "block-circuit2.lisp" and "block-circuit3.lisp" to modify the circuit:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/SoyMRdWxwVI/AAAAAAAAAG0/eGBCu9ct8dE/s1600-h/07-changecircuit.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5371822687111987538" src="http://1.bp.blogspot.com/_NFueSZG4S8E/SoyMRdWxwVI/AAAAAAAAAG0/eGBCu9ct8dE/s400/07-changecircuit.PNG" style="cursor: pointer; height: 400px; width: 325px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-2210808747316769978?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/2210808747316769978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2009/08/embedding-lisp-interpreter-into-qt-app.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2210808747316769978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2210808747316769978'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2009/08/embedding-lisp-interpreter-into-qt-app.html' title='Scripting simulations with ECL'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SoyMPSybKSI/AAAAAAAAAGU/j1HibkkEdXg/s72-c/01-craneloaded.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-4606028859111434157</id><published>2009-06-26T11:52:00.017+10:00</published><updated>2011-11-20T19:25:03.804+11:00</updated><title type='text'>Embedding a Lisp interpreter into a Qt app</title><content type='html'>&lt;div align="left" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/SkQv1Y-ssJI/AAAAAAAAAGE/CLLQP0gXue8/s1600-h/crease.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5351454851507990674" src="http://4.bp.blogspot.com/_NFueSZG4S8E/SkQv1Y-ssJI/AAAAAAAAAGE/CLLQP0gXue8/s400/crease.PNG" style="cursor: pointer; height: 387px; width: 400px;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="left" style="font-weight: normal;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="left" style="font-weight: normal;"&gt;I've been working on a few things these past few months. This includes:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;A crease pattern generator that can calculate the crease pattern a piece of paper will have based on the sequence of folds applied to it. Conceptualising the paper as a mesh of facets, and determining the operations that can be performed on facets such as splitting was the key to implementing this. &lt;/li&gt;&lt;li&gt;A circuit simulator that uses an iterative process to solve the circuit. Since Verlet physics is very successful at applying physical constraints (such as ensuring a point mass is fixed in space, or ensuring two point masses are always a fixed distance apart) using little more than repeatedly pushing objects according to the pressure that each constraint is applying, I thought I would try the same idea with electric circuits and the pressures of KVL and KCL. &lt;/li&gt;&lt;/ul&gt;&lt;div align="left" style="font-weight: normal;"&gt;When I managed to embed a Lisp interpreter into my app using ECL, I decided this is a suitable thing to tell other people about.&lt;/div&gt;&lt;div align="left" style="font-weight: normal;"&gt;The advantages of scripting using Lisp in this way are numerous and exciting:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Its an excellent way  to ease into the beauty of Lisp without abandoning my other work. &lt;/li&gt;&lt;li&gt;Initially, I can create Lisp bindings that manipulate the interface of the simulation such as adding components to the circuit, or applying specific folds. Doing this, I get loading/saving functionality for free, because my circuit/origami folds/other simulation configuration are defined in a lisp script. Also, I can manipulate my simulation “live” in the lisp repl while the simulation is running. &lt;/li&gt;&lt;li&gt;Gradually, I can transfer more and more of the simulation implementation to lisp. Doing so, I can enjoy a real “live coding” environment. I have &lt;a href="http://www.pawfal.org/fluxus/"&gt; fluxus&lt;/a&gt; to thank for the inspiration. &lt;/li&gt;&lt;li&gt;Lisp is a magnificent programming language. Having a Lisp repl in my app means I get a beautiful customisable programming language allowing me to describe a DSL without having to write a single line of parsing code. &lt;/li&gt;&lt;/ul&gt;&lt;div align="left" style="font-weight: normal;"&gt;The possibilities having a Lisp running in your app are breathtaking. In the past, the only thing that kept me from writing my own language to control my simulations was the mind numbing drudgery of writing parsers. Now, I get all the advantages of a custom language completely for free!&lt;/div&gt;&lt;div align="left" style="font-weight: normal;"&gt;The “Lisp” tab is initially active. It features the Lisp REPL. The only C++ function it is hooked to is myadd – not very exciting from the user's point of view, but VERY exciting for me, since it shows that I can have lisp control the whole show!&lt;/div&gt;&lt;div align="left" style="font-weight: normal;"&gt;Non lisp stuff (will be lispified later):&lt;/div&gt;&lt;ul&gt;&lt;li&gt;In the “Crease  Pattern” tab, press “Push button” repeatedly to see the effect  of applying a fold sequence. &lt;/li&gt;&lt;li&gt;In the “Circuit” tab, right click a component to select it, and drag the slider to change its parameter (voltage for voltage sources, current for current sources, resistance for resistors.). In between frames, the algorithm runs 100 passes to solve the circuit. You'll notice that the visualisation is inspired by &lt;a href="http://www.falstad.com/circuit/"&gt;Paul Falstad's circuit simulator&lt;/a&gt; –  I just wanted to add more interactivity! &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/SkQv1r75KUI/AAAAAAAAAGM/2KgkCakPNqo/s1600-h/lisp.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5351454856596498754" src="http://2.bp.blogspot.com/_NFueSZG4S8E/SkQv1r75KUI/AAAAAAAAAGM/2KgkCakPNqo/s400/lisp.PNG" style="cursor: pointer; height: 387px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/SkQv1Y-ssJI/AAAAAAAAAGE/CLLQP0gXue8/s1600-h/crease.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5351454851507990674" src="http://4.bp.blogspot.com/_NFueSZG4S8E/SkQv1Y-ssJI/AAAAAAAAAGE/CLLQP0gXue8/s400/crease.PNG" style="cursor: pointer; height: 387px; width: 400px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SkQv1AxAQlI/AAAAAAAAAF8/zbtIzlXEMTA/s1600-h/circuit.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5351454845008101970" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SkQv1AxAQlI/AAAAAAAAAF8/zbtIzlXEMTA/s400/circuit.PNG" style="cursor: pointer; height: 387px; width: 400px;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-4606028859111434157?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/4606028859111434157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2009/06/embedding-lisp-interpreter-into-qt-app.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/4606028859111434157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/4606028859111434157'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2009/06/embedding-lisp-interpreter-into-qt-app.html' title='Embedding a Lisp interpreter into a Qt app'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SkQv1Y-ssJI/AAAAAAAAAGE/CLLQP0gXue8/s72-c/crease.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-3374337840701404735</id><published>2008-09-02T14:18:00.016+10:00</published><updated>2011-11-20T19:25:18.971+11:00</updated><title type='text'>Constructive Solid Geometry program</title><content type='html'>&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;There is also an implementation using a Qt front end and scriptable with ECL. For more information visit the &lt;a href="http://createuniverses.blogspot.com/2009/09/qtcsg-constructive-solid-geometry.html"&gt;QtCSG page.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SLzBS_NRleI/AAAAAAAAADo/hw16M7yB4Q8/s1600-h/FirstPic.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5241276598301332962" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SLzBS_NRleI/AAAAAAAAADo/hw16M7yB4Q8/s400/FirstPic.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This program demonstrates an algorithm for performing CSG (Constructive Solid Geometry) operations, and it is based on the Java CSG implementation called &lt;a href="http://unbboolean.sourceforge.net/"&gt;UnBBoolean&lt;/a&gt; (&lt;a href="http://unbboolean.sourceforge.net/"&gt;http://unbboolean.sourceforge.net/&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;I found this excellent CSG implementation written in Java many months ago. Since it is very readable, and elucidates the concepts very clearly, I thought it may be worth translating this implementation into C++, so that this library can be used in C++ projects.&lt;br /&gt;&lt;br /&gt;After months of procrastination and occasional work, the translation is completed. This is thanks to the excellently designed, crystal clear architecture of the original Java code, and the helpful comments.&lt;br /&gt;&lt;br /&gt;Dealing with a large chunk of another programmer's source code is a very interesting excercise. There is an algorithm in the java code which implements the face cutting, but it runs all at once. If you want to figure out the reason for a particular problem, or simply want to peer into the inner workings of the algorithm, the standard line debugger is the wrong tool for the task. I found a simple and very useful technique for peering into code that runs all at once. I built a diagnostic object which allows me to take snapshots of the various geometric calculations it is performing, in order to "play it back" later, once the algorithm has finished. This was immensely helpful, and I will use this technique again. It is especially useful for reviewing algorithms that do things with geometry in 3D space.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Controls for the program&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The controls are subtly different from my other programs, to allow finer control of navigation through the 3D space.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Moving the camera with the mouse:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Left mouse + mouse move ROTATES the camera.&lt;br /&gt;Holding space + holding left mouse ROTATES the camera so it points to the selected location.&lt;br /&gt;Holding space + holding left mouse + mouse move ORBITS the camera around the selected location.&lt;br /&gt;Holding right mouse + mouse move PANS the camera along the camera plane, anchored on the selected point.&lt;br /&gt;Mouse wheel MOVES the camera forward and back, based on the distance to the selected location. This means that before using the mouse wheel, make sure the mouse is hovering over the object you are interested in, because the distance of the step is a proportion of the distance between the camera and the object the mouse is hovering over.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Controlling diagnostic tool playback:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;'d' toggles rendering of the diagnostic information.&lt;br /&gt;Left arrow key steps the diagnostic playback backward one step.&lt;br /&gt;Right arrow key steps the diagnostic playback forward one step.&lt;br /&gt;Up arrow key steps the diagnostic playback forward continuously. (~20 steps per second, 1 per frame)&lt;br /&gt;Down arrow key steps the diagnostic playback backward continuously. (~20 steps per second, 1 per frame)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A note on the diagnostic tool rendering:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Naturally it is up to the programmer what is being investigated, and I found myself frequently changing what the diagnostic tool should focus on. As you try to filter the volumes of data the diagnostic tool generates, I felt I had many options with how to proceed to learn more. I could either find some fancy ways to filter the data for the information I was interested in, leaving the snapshot taking as it was, or I could look at another aspect of the algorithm by modifying what I was choosing to record from the algorithm, and how I was going to present it.&lt;br /&gt;&lt;br /&gt;There are 4 "episodes" in the diagnostic tool playback in this program.&lt;br /&gt;1) Reveal the sequence of cuts made to the faces of the cone&lt;br /&gt;2) Reveal each facet indivudually and all the facets that have come before, to enable me to visually ensure that there are no duplicates, and to inspect weird constructions of the algorithm&lt;br /&gt;3) and 4), same as 1) and 2), except for the cube.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;All 3 models: difference, intersection and union:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SLzBS_NRleI/AAAAAAAAADo/hw16M7yB4Q8/s1600-h/FirstPic.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5241276598301332962" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SLzBS_NRleI/AAAAAAAAADo/hw16M7yB4Q8/s400/FirstPic.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Bird's eye view of the difference model:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SLzBTFRgGbI/AAAAAAAAADw/0rlbwOwnWj4/s1600-h/difference1.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5241276599929674162" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SLzBTFRgGbI/AAAAAAAAADw/0rlbwOwnWj4/s400/difference1.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;External of the intersection model:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/SLzBTLv5LLI/AAAAAAAAAD4/4gs1ruAt8yM/s1600-h/intersection1.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5241276601667759282" src="http://4.bp.blogspot.com/_NFueSZG4S8E/SLzBTLv5LLI/AAAAAAAAAD4/4gs1ruAt8yM/s400/intersection1.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The interior of the union model:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SLzBTRqX8eI/AAAAAAAAAEA/2xMIYnMxVmE/s1600-h/funkyroom.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5241276603255222754" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SLzBTRqX8eI/AAAAAAAAAEA/2xMIYnMxVmE/s400/funkyroom.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the diagnostic frames:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/SLzBTlBXu0I/AAAAAAAAAEI/VU7G6cPUyZI/s1600-h/debug0.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5241276608451951426" src="http://4.bp.blogspot.com/_NFueSZG4S8E/SLzBTlBXu0I/AAAAAAAAAEI/VU7G6cPUyZI/s400/debug0.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-3374337840701404735?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/3374337840701404735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2008/09/constructive-solid-geometry-program.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/3374337840701404735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/3374337840701404735'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2008/09/constructive-solid-geometry-program.html' title='Constructive Solid Geometry program'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SLzBS_NRleI/AAAAAAAAADo/hw16M7yB4Q8/s72-c/FirstPic.GIF' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-8634948398912000791</id><published>2008-05-14T10:14:00.012+10:00</published><updated>2011-11-20T19:25:26.527+11:00</updated><title type='text'>Lights Out puzzle experiment</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SCowEKSqy4I/AAAAAAAAADQ/d4nDrwladkY/s1600-h/2.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200021567792925570" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SCowEKSqy4I/AAAAAAAAADQ/d4nDrwladkY/s400/2.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wrote this program to see the effect of applying a simple rule for solving the light toggling puzzle.&lt;br /&gt;&lt;br /&gt;The idea is, because the toggle pattern is a cross shape, you can toggle one cell in a row at a time by pressing the one below it. Working your way down, you can clear each row separately this way. (According to the rules of the light puzzle, "pressing" a cell means toggling the cells that make up the cross centered on that cell individually.)&lt;br /&gt;&lt;br /&gt;Naturally, the interesting thing happens when you reach the bottom. Sometimes it will work itself out, sometimes it won't. When it doesn't, it can produce interesting patterns as you keep applying this algorithm. When the puzzle isn't solved, this program reapplies this technique, but in the other direction.&lt;br /&gt;&lt;br /&gt;Press 'r' to generate a new puzzle. (It regenerates a new puzzle by "pressing" 1000 cells at random)&lt;br /&gt;Press 'p' to pause the algorithm.&lt;br /&gt;Press 'c' to continue the algorithm. Pressing it again will modify the speed at which the algorithm runs - whole row per frame, or single cell per frame.&lt;br /&gt;&lt;br /&gt;Click to press the indicated cell (will toggle a cross shape at that position). You can do this during a solve as well. You can set up your own puzzle this way, and see how the algorithm handles it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/SCowD6Sqy3I/AAAAAAAAADI/V_4MydvyzUg/s1600-h/1.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200021563497958258" src="http://2.bp.blogspot.com/_NFueSZG4S8E/SCowD6Sqy3I/AAAAAAAAADI/V_4MydvyzUg/s400/1.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SCowEKSqy4I/AAAAAAAAADQ/d4nDrwladkY/s1600-h/2.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200021567792925570" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SCowEKSqy4I/AAAAAAAAADQ/d4nDrwladkY/s400/2.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SCowEKSqy5I/AAAAAAAAADY/MWWyHXwPLZE/s1600-h/3.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200021567792925586" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SCowEKSqy5I/AAAAAAAAADY/MWWyHXwPLZE/s400/3.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://createuniverses.googlecode.com/files/Lights_080205_1040.zip"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-8634948398912000791?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/8634948398912000791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2008/05/lights-out-puzzle-experiment.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/8634948398912000791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/8634948398912000791'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2008/05/lights-out-puzzle-experiment.html' title='Lights Out puzzle experiment'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SCowEKSqy4I/AAAAAAAAADQ/d4nDrwladkY/s72-c/2.GIF' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-836377190984697514</id><published>2008-05-14T10:03:00.010+10:00</published><updated>2011-11-20T19:25:35.059+11:00</updated><title type='text'>Simple tennis program</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/SCot0qSqy1I/AAAAAAAAAC4/R2Zql1iYdzE/s1600-h/1.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200019102481697618" src="http://1.bp.blogspot.com/_NFueSZG4S8E/SCot0qSqy1I/AAAAAAAAAC4/R2Zql1iYdzE/s400/1.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This program is the beginnings of a tennis simulation featuring some basic tennis mechanics.&lt;br /&gt;&lt;br /&gt;This program demonstrates a means of making the ball land anywhere with an arbitrary apex height, and a means of determining which part of the trajectory can be reached by the player.&lt;br /&gt;In this way, the program demonstrates a framework for staging all sorts of different scenarios and tennis playing strategies in the tennis universe.&lt;br /&gt;&lt;br /&gt;Description of AI behaviour:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;AI runs directly toward the ball to intercept it&lt;/li&gt;&lt;li&gt;AI runs to the center of its half of the court after hitting the ball and before its opponent does&lt;/li&gt;&lt;li&gt;AI decides on where it would like the ball to land by choosing a random spot in opponent's half of the court&lt;/li&gt;&lt;li&gt;AI may control the height of the apex of the ball's parabolic trajectory&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The parabola the AI desires is precomputed, and an appropriate initial velocity vector is computed for the ball so that the ball follows the desired trajectory under the influence of a physics model which only includes gravity.&lt;br /&gt;&lt;br /&gt;The physics ball is rendered as a white sphere, the "scripted" constant x-velocity ball is rendered as a yellow sphere.&lt;br /&gt;I render both to ensure that they match up precisely.&lt;br /&gt;&lt;br /&gt;The precomputed parabola is rendered as well. The green portion is the portion that can be reached by the player, the red portion is the portion that cannot be intercepted in time.&lt;br /&gt;&lt;br /&gt;In this version, I've made the camera follow the player, so there is no interactivity.&lt;br /&gt;&lt;br /&gt;Esc will close the program.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/SCot0qSqy1I/AAAAAAAAAC4/R2Zql1iYdzE/s1600-h/1.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200019102481697618" src="http://1.bp.blogspot.com/_NFueSZG4S8E/SCot0qSqy1I/AAAAAAAAAC4/R2Zql1iYdzE/s400/1.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/SCot0qSqy2I/AAAAAAAAADA/xAa4xRkv1XA/s1600-h/2.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200019102481697634" src="http://1.bp.blogspot.com/_NFueSZG4S8E/SCot0qSqy2I/AAAAAAAAADA/xAa4xRkv1XA/s400/2.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://createuniverses.googlecode.com/files/Tennis_080205_1040.zip"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-836377190984697514?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/836377190984697514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2008/05/simple-tennis-program.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/836377190984697514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/836377190984697514'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2008/05/simple-tennis-program.html' title='Simple tennis program'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SCot0qSqy1I/AAAAAAAAAC4/R2Zql1iYdzE/s72-c/1.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-1983154651267425579</id><published>2008-02-13T15:32:00.016+11:00</published><updated>2011-11-20T19:26:20.165+11:00</updated><title type='text'>MagicVines clone uploaded</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/R7J3HhIAp1I/AAAAAAAAACM/isehrdSUcJs/s1600-h/scr01.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5166322693582137170" src="http://3.bp.blogspot.com/_NFueSZG4S8E/R7J3HhIAp1I/AAAAAAAAACM/isehrdSUcJs/s400/scr01.PNG" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is my simplified clone of the PopCap game, MagicVines.&lt;br /&gt;&lt;br /&gt;While playing this game (the PopCap version), I was wondering whether strategic decisions about which group of 3 to clear really mattered, and whether a robot which will take the effort out of finding groups of 3 would change the game into a strategic one.&lt;br /&gt;&lt;br /&gt;So, I made this program initially to reveal how solvable randomly generated boards would be. In this way, it becomes a little clearer whether the game is sensitive to strategic choices, or whether the game was only about how rapidly the player can recognise groups of 3.&lt;br /&gt;&lt;br /&gt;If there is any strategy, it seems to be to try to clear the bottom cells first, because they are replenished less often than cells at the top.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/R7J3HRIAp0I/AAAAAAAAACE/o5ZDPf2U1uA/s1600-h/scr00.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5166322689287169858" src="http://2.bp.blogspot.com/_NFueSZG4S8E/R7J3HRIAp0I/AAAAAAAAACE/o5ZDPf2U1uA/s400/scr00.PNG" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/R7J3HhIAp1I/AAAAAAAAACM/isehrdSUcJs/s1600-h/scr01.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5166322693582137170" src="http://3.bp.blogspot.com/_NFueSZG4S8E/R7J3HhIAp1I/AAAAAAAAACM/isehrdSUcJs/s400/scr01.PNG" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/R7J3IBIAp2I/AAAAAAAAACU/v7eNshdllWY/s1600-h/scr02.PNG"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5166322702172071778" src="http://1.bp.blogspot.com/_NFueSZG4S8E/R7J3IBIAp2I/AAAAAAAAACU/v7eNshdllWY/s400/scr02.PNG" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are 2 executables in this zip file:&lt;br /&gt;- MagicVines.exe&lt;br /&gt;- MagicVines_Robot.exe&lt;br /&gt;&lt;br /&gt;Usage instructions for MagicVines.exe:&lt;br /&gt;&lt;br /&gt;Click a cell to flip it from horizontal - vertical, and vice versa.&lt;br /&gt;The board clears consecutive groups of 3 or more matching cells in the same column or row continuously in the background. If the board is still eliminating, your group may not get eliminated right away - it will eventually as the board resolves itself. Try to get cascading eliminations!&lt;br /&gt;&lt;br /&gt;Press 'r' at any time to reset the board for a new game.&lt;br /&gt;&lt;br /&gt;Usage instructions for MagicVines_Robot.exe:&lt;br /&gt;&lt;br /&gt;Clicking a cell will direct the focus of the robot player, so that it clears groups around the clicked cell first, before any other cell.&lt;br /&gt;&lt;br /&gt;Press 'r' at any time to reset the board for a new game.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-1983154651267425579?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/1983154651267425579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2008/02/magicvines-clone-uploaded.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/1983154651267425579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/1983154651267425579'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2008/02/magicvines-clone-uploaded.html' title='MagicVines clone uploaded'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/R7J3HhIAp1I/AAAAAAAAACM/isehrdSUcJs/s72-c/scr01.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-5050292408683180752</id><published>2008-01-27T02:55:00.018+11:00</published><updated>2011-11-20T19:26:26.755+11:00</updated><title type='text'>15 Puzzle solver</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SD-DaOLRO5I/AAAAAAAAADg/q6imiOOFz3Q/s1600-h/moving2.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5206024180768783250" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SD-DaOLRO5I/AAAAAAAAADg/q6imiOOFz3Q/s400/moving2.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This program depicts a method for solving the 15 puzzle.&lt;br /&gt;&lt;br /&gt;I wrote this to see if the explicit method I was using to solve this puzzle could be encoded, and whether there were puzzle instances my method would not work on.&lt;br /&gt;&lt;br /&gt;A ran a separate testbed app that did thousands of runs to determine the success rate of various methods for solving this puzzle. For each run, a random instance of the puzzle was produced by making over 100 random moves. In this way, it is clear that the instance of the puzzle would be solvable.&lt;br /&gt;&lt;br /&gt;An earlier method I used worked ~80% of the time for 100,000 runs. The method I present here was successful for all 100,000 runs, and then millions of runs after that.&lt;br /&gt;&lt;br /&gt;When you step through the algorithm, you'll be able to clearly see the method for solving the puzzle.&lt;br /&gt;&lt;br /&gt;Description of the method:&lt;br /&gt;&lt;br /&gt;1) Move 1 into position&lt;br /&gt;2) Move 2 into position&lt;br /&gt;3) Get 4 out of the way&lt;br /&gt;4) Move 3 to the top right&lt;br /&gt;5) Move 4 below the 3&lt;br /&gt;6) Slot in 3 and 4 in consecutive moves&lt;br /&gt;&lt;br /&gt;Top row is done. Top row tiles are never touched again.&lt;br /&gt;&lt;br /&gt;7) Move 5 into position (never touching the top row)&lt;br /&gt;8) Move 6 into position&lt;br /&gt;9) Move 8 out of the way&lt;br /&gt;10) Move 7 to the top right&lt;br /&gt;11) Move 8 below the 7&lt;br /&gt;12) Slot 7 and 8 in consecutive moves&lt;br /&gt;&lt;br /&gt;Top 2 rows are done. Top 2 rows are never touched again.&lt;br /&gt;&lt;br /&gt;13) Move 10 out the way&lt;br /&gt;14) Move 9 into position&lt;br /&gt;15) Move 10 next to the 9&lt;br /&gt;16) Slide 9 and 10 in consecutive moves so they are out of the way&lt;br /&gt;17) Move 11 next to 10&lt;br /&gt;18) Move 12 next to 11&lt;br /&gt;19) Move 9,10,11,12 in 4 consecutive moves so that they are in a solid block to the left&lt;br /&gt;20) Rotate the remaining tiles (13,14,15) until the 13 touches the 12&lt;br /&gt;21) Rotate all 8 tiles until they are all in position&lt;br /&gt;&lt;br /&gt;And now the puzzle should be solved.&lt;br /&gt;&lt;br /&gt;Here are the controls:&lt;br /&gt;&lt;br /&gt;'c' runs the algorithm continuously until the puzzle is solved&lt;br /&gt;'p' pauses the continuous run&lt;br /&gt;'s' Moves one tile (steps the algorithm until it moves a tile)&lt;br /&gt;'r' Generates a new puzzle&lt;br /&gt;'q' or Esc closes the program&lt;br /&gt;&lt;br /&gt;Notes on the implementation:&lt;br /&gt;&lt;br /&gt;This program is another demonstration of the value of moving an algorithm into an updatable object that can be queried. By this I mean that instead of implementing your algorithm in a function, you implement it as a state machine, with the various states corresponding to different stages of the algorithm. Local variables of the function become member variables of this object, and any recursive function calls are handled by using a stack. In this way, it is possible to observe the operation of the algorithm, and perhaps do other things in the meantime.&lt;br /&gt;&lt;br /&gt;From the caller, its the difference between doing this:&lt;br /&gt;&lt;br /&gt;RunAlgorithm(data);&lt;br /&gt;&lt;br /&gt;and this:&lt;br /&gt;&lt;br /&gt;Algorithm a;&lt;br /&gt;a.Reset(data);&lt;br /&gt;while(!a.Finished())&lt;br /&gt;{&lt;br /&gt;a.Update();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;You can see where the second approach would have many advantages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/R5tZC-K4JQI/AAAAAAAAAB0/1L9B8xtC7lE/s1600-h/puzzlestart.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5159815705666266370" src="http://1.bp.blogspot.com/_NFueSZG4S8E/R5tZC-K4JQI/AAAAAAAAAB0/1L9B8xtC7lE/s400/puzzlestart.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/R5tZC-K4JRI/AAAAAAAAAB8/OnY4KO4WjBI/s1600-h/moving.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5159815705666266386" src="http://1.bp.blogspot.com/_NFueSZG4S8E/R5tZC-K4JRI/AAAAAAAAAB8/OnY4KO4WjBI/s400/moving.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_NFueSZG4S8E/SD-DaOLRO5I/AAAAAAAAADg/q6imiOOFz3Q/s1600-h/moving2.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5206024180768783250" src="http://3.bp.blogspot.com/_NFueSZG4S8E/SD-DaOLRO5I/AAAAAAAAADg/q6imiOOFz3Q/s400/moving2.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-5050292408683180752?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/5050292408683180752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2008/01/15-puzzle-solver.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5050292408683180752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/5050292408683180752'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2008/01/15-puzzle-solver.html' title='15 Puzzle solver'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SD-DaOLRO5I/AAAAAAAAADg/q6imiOOFz3Q/s72-c/moving2.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-19550371436628840</id><published>2008-01-25T14:53:00.011+11:00</published><updated>2011-11-20T19:26:32.421+11:00</updated><title type='text'>Picture Logic solver</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/R5l_QeK4JNI/AAAAAAAAABc/E7HyXCwOH-E/s1600-h/solved.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5159294769082934482" src="http://1.bp.blogspot.com/_NFueSZG4S8E/R5l_QeK4JNI/AAAAAAAAABc/E7HyXCwOH-E/s400/solved.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This program solves picture logic puzzles, and demonstrates the algorithm for a single solving pass on an individual row or column in detail.&lt;br /&gt;&lt;br /&gt;PictureLogic.exe generates a random image, and solves it by repeatedly applying the solving passes alternately on all columns and rows.&lt;br /&gt;&lt;br /&gt;PictureLogic_RowColAlgorithm.exe demonstrates the algorithm for applying a single solving pass to a row or column.&lt;br /&gt;&lt;br /&gt;Controls for both PictureLogic.exe and PictureLogic_RowColAlgorithm.exe are:&lt;br /&gt;&lt;br /&gt;'c': Commences or resumes continuous updating of the solving algorithm&lt;br /&gt;'p': Pauses the continuous run.&lt;br /&gt;'s': Update the solver one step.&lt;br /&gt;'r': Generate a new puzzle instance.&lt;br /&gt;'q' or Esc: Closes the program.&lt;br /&gt;&lt;br /&gt;For the algorithm demonstration program, there is some basic logic guiding the generation of the puzzle instances, but it can still generate unsolvable instances. However, the algorithm will detect these.&lt;br /&gt;&lt;br /&gt;Screen layout for PictureLogic.exe:&lt;br /&gt;&lt;br /&gt;The only thing displayed is the picture logic puzzle. This consists of the grid and block sizes, as you would see in any puzzle book.&lt;br /&gt;&lt;br /&gt;Screen layout For PictureLogic_RowColAlgorithm.exe:&lt;br /&gt;&lt;br /&gt;The puzzle instance is displayed in the 1D grid at the bottom: Solid rectangles indicate a cell that must be filled, hollow rectangles indicate a cell that must remain empty. Above this 1D grid are the block sizes.&lt;br /&gt;&lt;br /&gt;Just above the puzzle instance is a 1D grid is where the results of the solving pass will appear at the end of the run.&lt;br /&gt;&lt;br /&gt;The algorithm will enumerate every possible placement of the blocks in this 1D space during the course of the algorithm, and you can see the results of its work in the middle of the window.&lt;br /&gt;&lt;br /&gt;At the top of the window are grids describing the "invariant" cells - the cells that stay the same for all possible placements of the blocks. These are then referred to to generate the result of the solving pass.&lt;br /&gt;&lt;br /&gt;I hope these programs are interesting for you, and perhaps teach you about this puzzle and one way of solving it, and perhaps show the benfit of encapsulating an algorithm into an object so that you may query it and control its execution from the outside.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/R5l_QeK4JMI/AAAAAAAAABU/vfvizhOlX3U/s1600-h/EmptyPuzzle.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5159294769082934466" src="http://1.bp.blogspot.com/_NFueSZG4S8E/R5l_QeK4JMI/AAAAAAAAABU/vfvizhOlX3U/s400/EmptyPuzzle.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/R5l_QeK4JNI/AAAAAAAAABc/E7HyXCwOH-E/s1600-h/solved.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5159294769082934482" src="http://1.bp.blogspot.com/_NFueSZG4S8E/R5l_QeK4JNI/AAAAAAAAABc/E7HyXCwOH-E/s400/solved.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/R5l_QuK4JOI/AAAAAAAAABk/E2CItmQOPFU/s1600-h/AlgorithmRunning.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5159294773377901794" src="http://2.bp.blogspot.com/_NFueSZG4S8E/R5l_QuK4JOI/AAAAAAAAABk/E2CItmQOPFU/s400/AlgorithmRunning.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/R5l_QuK4JPI/AAAAAAAAABs/8m7ft00hTDc/s1600-h/AlgorithmFinished.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5159294773377901810" src="http://2.bp.blogspot.com/_NFueSZG4S8E/R5l_QuK4JPI/AAAAAAAAABs/8m7ft00hTDc/s400/AlgorithmFinished.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-19550371436628840?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/19550371436628840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2008/01/picture-logic-solver.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/19550371436628840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/19550371436628840'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2008/01/picture-logic-solver.html' title='Picture Logic solver'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/R5l_QeK4JNI/AAAAAAAAABc/E7HyXCwOH-E/s72-c/solved.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-2986394035828983873</id><published>2008-01-23T09:38:00.010+11:00</published><updated>2011-11-20T19:26:37.201+11:00</updated><title type='text'>Domino placement game</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/R5aWdmxVxbI/AAAAAAAAAA8/vZHqJv6dsmk/s1600-h/candidates.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5158475858567349682" src="http://4.bp.blogspot.com/_NFueSZG4S8E/R5aWdmxVxbI/AAAAAAAAAA8/vZHqJv6dsmk/s400/candidates.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is an implementation of the domino placement puzzle. In this version, you are able to explore the puzzle in a new way - the program plays the puzzle with you!&lt;br /&gt;&lt;br /&gt;When you place a domino, the AI propagates the constraints of your new placement, allowing you to see the logical effects of your placement. You can very quickly see whether you'd get to a dead end or a solution with a particular placement, and there are unlimited levels of undo.&lt;br /&gt;&lt;br /&gt;You can have your puzzle loaded from a file, or watch as the placer generates a new puzzle for you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screen layout:&lt;/span&gt;&lt;br /&gt;The left grid shows the puzzle.&lt;br /&gt;The right grid is the solving area.&lt;br /&gt;The middle column shows all unplaced dominos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Controls:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Clicking once between 2 cells is sufficient to describe a domino placement.&lt;br /&gt;&lt;br /&gt;Left mouse in between 2 cells in the right grid will place a domino there.&lt;br /&gt;Right mouse in between 2 cells will reveal all the other places that same domino could be placed.&lt;br /&gt;&lt;br /&gt;Mouse wheel when the mouse is over the center column to scroll the available dominos awaiting placement.&lt;br /&gt;Right click on one of these available dominos to see where it could be placed.&lt;br /&gt;&lt;br /&gt;Press 'u' to undo your last placement (there are unlimited undo levels).&lt;br /&gt;Press 'l' to load the next level in the level file. (It loads from board_in_dominosa.txt).&lt;br /&gt;Press 'r' to reset the solution board and begin the puzzle again.&lt;br /&gt;Press 'n' to generate a new puzzle.&lt;br /&gt;&lt;br /&gt;The puzzles in board_in_dominosa.txt are in the format that dominosa.exe uses when you save a puzzle. Dominosa.exe comes from Simon Tatham's Portable Puzzle Collection, available from &lt;a href="http://www.chiark.greenend.org.uk/%7Esgtatham/puzzles/"&gt;http://www.chiark.greenend.org.uk/~sgtatham/puzzles/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/R5aWdmxVxbI/AAAAAAAAAA8/vZHqJv6dsmk/s1600-h/candidates.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5158475858567349682" src="http://4.bp.blogspot.com/_NFueSZG4S8E/R5aWdmxVxbI/AAAAAAAAAA8/vZHqJv6dsmk/s400/candidates.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/R5aWd2xVxcI/AAAAAAAAABE/tKbSlijWBu0/s1600-h/extra.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5158475862862316994" src="http://1.bp.blogspot.com/_NFueSZG4S8E/R5aWd2xVxcI/AAAAAAAAABE/tKbSlijWBu0/s400/extra.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/R5aWeGxVxdI/AAAAAAAAABM/bViAy26kXbo/s1600-h/generatedpuzzle.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5158475867157284306" src="http://2.bp.blogspot.com/_NFueSZG4S8E/R5aWeGxVxdI/AAAAAAAAABM/bViAy26kXbo/s400/generatedpuzzle.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-2986394035828983873?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/2986394035828983873/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2008/01/dominoplacement-game.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2986394035828983873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/2986394035828983873'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2008/01/dominoplacement-game.html' title='Domino placement game'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/R5aWdmxVxbI/AAAAAAAAAA8/vZHqJv6dsmk/s72-c/candidates.GIF' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-6640489667224277631</id><published>2007-11-20T15:53:00.010+11:00</published><updated>2011-11-20T19:26:59.488+11:00</updated><title type='text'>Ball game simulation</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/R0ZWLCRsvnI/AAAAAAAAAAk/XBgh2PpX8d8/s1600-h/ball3.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5135887172652285554" src="http://1.bp.blogspot.com/_NFueSZG4S8E/R0ZWLCRsvnI/AAAAAAAAAAk/XBgh2PpX8d8/s400/ball3.GIF" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/R0ZWLSRsvoI/AAAAAAAAAAs/qfisecUDicc/s1600-h/ball4.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5135887176947252866" src="http://2.bp.blogspot.com/_NFueSZG4S8E/R0ZWLSRsvoI/AAAAAAAAAAs/qfisecUDicc/s400/ball4.GIF" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/R0ZWLyRsvpI/AAAAAAAAAA0/2LEK1t1PAGg/s1600-h/ball5.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5135887185537187474" src="http://4.bp.blogspot.com/_NFueSZG4S8E/R0ZWLyRsvpI/AAAAAAAAAA0/2LEK1t1PAGg/s400/ball5.GIF" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Left mouse button + drag&lt;/span&gt; will orbit the camera around the cursor.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Right mouse button + drag&lt;/span&gt; will pan the camera anchored around the cursor.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Mouse wheel&lt;/span&gt; will move the camera forward or back.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Esc&lt;/span&gt; will close the program.&lt;br /&gt;&lt;br /&gt;I built this because it uses a basic AI team architecture I've wanted to try out in a simple ball game simulation. The AI architecture describes the concept of a team assigning roles to players, which in turn are implemented in terms of a basic reportoire of actions. The architecture is described in some more detail in the readme file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-6640489667224277631?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/6640489667224277631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2007/11/ball-game-simulation.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/6640489667224277631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/6640489667224277631'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2007/11/ball-game-simulation.html' title='Ball game simulation'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/R0ZWLCRsvnI/AAAAAAAAAAk/XBgh2PpX8d8/s72-c/ball3.GIF' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4578848417268948676.post-7754403255502304026</id><published>2007-11-02T14:50:00.015+11:00</published><updated>2011-11-20T19:27:06.148+11:00</updated><title type='text'>Verlet Origami</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Please note:&lt;/span&gt;&lt;span style="font-size: 100%;"&gt; There &lt;/span&gt;is a more advanced version of this program available &lt;a href="http://createuniverses.blogspot.com/2009/08/embedding-lisp-interpreter-into-qt-app.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/SCord6SqyyI/AAAAAAAAACg/KLLZriblIuQ/s1600-h/1.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200016512616418082" src="http://2.bp.blogspot.com/_NFueSZG4S8E/SCord6SqyyI/AAAAAAAAACg/KLLZriblIuQ/s400/1.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The program I am uploading here is called VerletOrigami.&lt;br /&gt;&lt;br /&gt;I'm using a basic verlet physics engine to simulate a ball and strut model of a pre-creased, rigid piece of paper.&lt;br /&gt;&lt;br /&gt;The paper has been pre-creased for a paper plane, and the simulation will "fold" the paper into a paper airplane in front of your eyes, demonstrating the viability of using verlet physics to simulate a piece of paper.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Screenshots:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_NFueSZG4S8E/SCord6SqyyI/AAAAAAAAACg/KLLZriblIuQ/s1600-h/1.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200016512616418082" src="http://2.bp.blogspot.com/_NFueSZG4S8E/SCord6SqyyI/AAAAAAAAACg/KLLZriblIuQ/s400/1.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_NFueSZG4S8E/SCoreaSqyzI/AAAAAAAAACo/p0T29gKQV8Y/s1600-h/2.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200016521206352690" src="http://4.bp.blogspot.com/_NFueSZG4S8E/SCoreaSqyzI/AAAAAAAAACo/p0T29gKQV8Y/s400/2.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_NFueSZG4S8E/SCoreqSqy0I/AAAAAAAAACw/BiEgmGoiuvk/s1600-h/3.GIF"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5200016525501320002" src="http://1.bp.blogspot.com/_NFueSZG4S8E/SCoreqSqy0I/AAAAAAAAACw/BiEgmGoiuvk/s400/3.GIF" style="cursor: pointer;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Left mouse button + drag&lt;/span&gt; will orbit the camera around the cursor.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Right mouse button + drag&lt;/span&gt; will pan the camera anchored around the cursor.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Mouse wheel&lt;/span&gt; will move the camera forward or back.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Esc&lt;/span&gt; will close the program.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.worldofsimulation.com/origami/origami-simulator/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4578848417268948676-7754403255502304026?l=createuniverses.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://createuniverses.blogspot.com/feeds/7754403255502304026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://createuniverses.blogspot.com/2007/11/first-upload-verlet-origami.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/7754403255502304026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4578848417268948676/posts/default/7754403255502304026'/><link rel='alternate' type='text/html' href='http://createuniverses.blogspot.com/2007/11/first-upload-verlet-origami.html' title='Verlet Origami'/><author><name>thecodewitch</name><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/_NFueSZG4S8E/SCord6SqyyI/AAAAAAAAACg/KLLZriblIuQ/s72-c/1.GIF' height='72' width='72'/><thr:total>2</thr:total></entry></feed>
