<?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-9148893400862147211</id><updated>2011-07-31T13:05:06.133+02:00</updated><category term='C#'/><category term='xengine'/><category term='SECS'/><category term='Visual Studio'/><category term='3Di'/><category term='ScriptEngine'/><category term='LSO'/><category term='64-bit'/><category term='ScriptServer'/><category term='MSIL'/><category term='Vacation'/><category term='OpenSim'/><category term='DotNetEngine'/><category term='OSSL'/><category term='LSL'/><title type='text'>Tedd Maa</title><subtitle type='html'>Tedd Maa is the cyberego of Tedd Hansen living in Second Life.
Involved in OpenSim project.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4488470007580494903</id><published>2010-06-25T22:07:00.002+02:00</published><updated>2010-06-25T22:08:44.705+02:00</updated><title type='text'>Blog moved</title><content type='html'>Blog moved to &lt;a href="http://blog.tedd.no/"&gt;http://blog.tedd.no/&lt;/a&gt;&lt;br /&gt;OpenSim stuff: &lt;a href="http://blog.tedd.no/index.php/category/opensim"&gt;http://blog.tedd.no/index.php/category/opensim&lt;/a&gt;&lt;br /&gt;OpenSim RSS Feed: &lt;a href="http://blog.tedd.no/index.php/category/opensim/feed"&gt;http://blog.tedd.no/index.php/category/opensim/feed&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4488470007580494903?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.tedd.no/' title='Blog moved'/><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4488470007580494903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4488470007580494903&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4488470007580494903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4488470007580494903'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2010/06/blog-moved-to-httpblog.html' title='Blog moved'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4821811620411157920</id><published>2008-12-05T19:00:00.002+01:00</published><updated>2008-12-05T19:09:18.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='64-bit'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>OpenSim in Visual Studio on Win64</title><content type='html'>&lt;strong&gt;Note! Article applies to developers using Visual Studio on 64-bit Windows.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Visual Studio is a great tool. Most developers who can use it should.&lt;br /&gt;&lt;br /&gt;Currently OpenSim has some problems with 64-bit mode. This is because we have some native .dll's and .so's such as:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SQlite&lt;/li&gt;&lt;li&gt;ODE&lt;/li&gt;&lt;li&gt;OpenJpeg&lt;/li&gt;&lt;li&gt;+ more&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;SQLite you can do without by choosing MySQL or similar. But the rest is a bit more difficult.&lt;br /&gt;See &lt;a href="http://www.adamfrisby.com/blog/2008/08/running-opensim-under-a-64-bit-environment/"&gt;http://www.adamfrisby.com/blog/2008/08/running-opensim-under-a-64-bit-environment/&lt;/a&gt; for more info.&lt;/p&gt;&lt;p&gt;To solve this problem we have a file named "OpenSim.32BitLaunch.exe" which is compiled with CPU target set to 32-bit. This in term loads OpenSim.exe as a standard module and executes it.&lt;/p&gt;&lt;p&gt;But this is only from command line. If you want all the glory of debugging that Visual Studio provides then this workaround will work:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Download the OpenSim source as usual, run prebuild as usual.&lt;/li&gt;&lt;li&gt;Open OpenSim.sln in Visual Studio.&lt;/li&gt;&lt;li&gt;Right click solution and choose Add-&gt;Existing Project...&lt;/li&gt;&lt;li&gt;Browse to "OpenSim\Tools\OpenSim.32BitLaunch" and add the project "OpenSim.32BitLaunch".&lt;/li&gt;&lt;li&gt;Right click project called "OpenSim.32BitLaunch" and choose "Set as StartUp Project".&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And OpenSim will run from Visual Studio on 64-bit Windows...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4821811620411157920?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4821811620411157920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4821811620411157920&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4821811620411157920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4821811620411157920'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/12/opensim-in-visual-studio-on-win64.html' title='OpenSim in Visual Studio on Win64'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-5009832658156370490</id><published>2008-10-01T15:59:00.003+02:00</published><updated>2008-10-01T16:08:49.344+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SECS'/><title type='text'>SECS in technicolor</title><content type='html'>Just a model of the pipeline. Work in progress. Boxes that share same color are related.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_rculTBw7Cnk/SOOD84UrkrI/AAAAAAAAADc/iGidE1XoexU/s1600-h/20081001+Script+Engine+Component+System+Pipeline.png"&gt;&lt;img style="CURSOR: hand" id="BLOGGER_PHOTO_ID_5252186672378647218" border="0" alt="" src="http://4.bp.blogspot.com/_rculTBw7Cnk/SOOD84UrkrI/AAAAAAAAADc/iGidE1XoexU/s400/20081001+Script+Engine+Component+System+Pipeline.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-5009832658156370490?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/5009832658156370490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=5009832658156370490&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5009832658156370490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5009832658156370490'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/10/secs-in-technicolor.html' title='SECS in technicolor'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_rculTBw7Cnk/SOOD84UrkrI/AAAAAAAAADc/iGidE1XoexU/s72-c/20081001+Script+Engine+Component+System+Pipeline.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-3164918155848282158</id><published>2008-09-27T15:10:00.004+02:00</published><updated>2008-09-27T15:41:45.781+02:00</updated><title type='text'>Script Engine Component System (SECS)</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;strong&gt;What is a script engine?&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Currently I see people define a script engine very simply as: The thing that runs the scripts.&lt;br /&gt;This is a narrow definition that I never intended with DotNetEngine (see previous posts).&lt;br /&gt;&lt;br /&gt;Instead I would say the script engine is the most important component of OpenSim. I am a humble person when it comes to my own doing and do not see DotNetEngine as anything more than a script executor. The greatness lies in the potential and what other people will make if we can offer them some good interfaces.&lt;br /&gt;&lt;br /&gt;Instead of giving this complex explanation that required several of your neurons to connect I will use examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Second Life LSL2 script support. Events and commands. Execution.&lt;/li&gt;&lt;li&gt;OSSL script support. Other events and other commands. Execution.&lt;/li&gt;&lt;li&gt;Additional command modules to for example give scripts SQL-access, Webservice acces, shared memory, etc.&lt;/li&gt;&lt;li&gt;A plant module that grows grass/trees randomly around the region&lt;/li&gt;&lt;li&gt;A bombterrain module that makes holes in the ground when bombs are detonated and fill them slowly back up over time.&lt;/li&gt;&lt;li&gt;NPCs&lt;/li&gt;&lt;li&gt;Bridges: Examples: "Contact us" module that allows sending of e-mail when someone drops a message in your region, IRC chat bridge, MSN chat bridge, etc.&lt;/li&gt;&lt;li&gt;Complete game systems that allows a single system to control some or all aspect of the region/grid. Multiple modules can be loaded simultaneously to cover all aspects (one covers NPCs, others covers inventory stuff, swords, lazer guns, etc etc).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This was the original idea behind DotNetEngine, and the reason for the design of inheriting only what you need from the engine. I do not want OpenSim to be limited to in-world scripting only.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;SECS&lt;br /&gt;&lt;/strong&gt;&lt;span style="font-size:100%;"&gt;So how can we support all this?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note! This is work in progress!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I imagine in the future we will want to download a good NPC module and install it &lt;em&gt;independently&lt;/em&gt; of what script engine we are running. Lets face it, if each module had to be adapted to a certain script engine then it would put some heavy restrictions on us.&lt;/p&gt;&lt;p&gt;Instead I propose we redefine what a script engine actually is, and allow it to co-exist with other script engines. We may not want to run DotNetEngine and xengine simultaneously, but we may want to run a whole bunch of other "engines" (game control systems, AI-bots, etc) along with a script engine. And while these systems are running they should be able to benefit from the services the script engine already offers such as event hookups (into OpenSim) and the scheduler - IF they want.&lt;/p&gt;&lt;p&gt;To achieve this I have been looking at different models, all with their advantages and disadvantages. Though I have not landed at a perfect model yet I am closing in.&lt;/p&gt;&lt;p&gt;Basically it is a loader. It loads modules (.dll). The modules are registered in a central location with a name (string). Some of these modules will be of well-known base types (event hookups, schedulers, etc). Because they are well-known base types an alternate module should be able to utilize it even though it wasn't made for that distinct type.&lt;/p&gt;&lt;p&gt;When a script engine is loaded it will create instances of whatever it needs to do its job. This is pretty much exactly how the script engines work today. The only exception is that we (probably) need to register the instances globally.&lt;/p&gt;&lt;p&gt;Any other modules that are started are now free to either instanciate what modules they need. Example of what they may load: OSSL commands, SQL commands. They can also access main script engine scheduler if they want to associate a custom class with a prim for example.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note! This is work in progress!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-3164918155848282158?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/3164918155848282158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=3164918155848282158&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/3164918155848282158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/3164918155848282158'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/09/script-engine-component-system-secs.html' title='Script Engine Component System (SECS)'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-6711793645677745582</id><published>2008-09-27T14:32:00.006+02:00</published><updated>2008-09-27T15:10:06.177+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xengine'/><category scheme='http://www.blogger.com/atom/ns#' term='DotNetEngine'/><title type='text'>DotNetEngine and xengine</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;strong&gt;The realization&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Before my hands went bad I started the process of introducing a new common way of implementing script engines. This came from the realization of two things. First of all that many had difficulties understanding how to implement their own engine variations based on current engine, and second that not all developers are willing to conform to one structure.&lt;br /&gt;&lt;br /&gt;Developers are (often) skilled people and often have a clear understanding of what is right. Structure and rules on how to do things are key elements to write good code. And with the complexity of modular programming languages there is more than one way to get things done 'right'.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;DotNetEngine&lt;/span&gt; &lt;/strong&gt;&lt;br /&gt;The idea behind DotNetEngine was simple. We implement an engine consisting of a set of modules and a couple of classes to bind it all (main ScriptEngine and in-world ScriptLoader). Any new script engine could then inherit what it liked and ignore what it didn't like.&lt;br /&gt;&lt;br /&gt;DotNetEngine was made from the assumption that users are hostile (or stupid). They will run too many scripts, script may be harmful to system, etc. It works with a set of queues that ensures equal priority for all scripts and will drop loading/execution if system resources is exhausted (if you don't have a fast enough CPU). It allows things like regions themselves and physics to go in front of script execution.&lt;br /&gt;&lt;br /&gt;I felt this approach was correct for a generic engine as it would guarantee a smooth region execution.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;xengine&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;xengine is for the most part the effort of Melanie. It is targeted towards gaming in the sense that scripts essentially will have dominance over resources.&lt;br /&gt;&lt;br /&gt;With the introduction of xengine the DotNetEngine modular inheritance model was bypassed and most of DotNetEngine simply copied into xengine and made modifications to. This means that any patch needs to be applied to two places, which of course meant double work and ended in it not being done. This was especially bad for LSL implementation where steady progress has been over a long period of time and suddenly there were demands that new functions should be implemented only in xengine.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;DotNetEngine vs xengine&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;There has been an ongoing conflict between the developers on how to solve this problem. On one side we have the newly formed xengine mob which feels that DotNetEngine is inferior, and on the other side we have those who cheer for DotNetEngine and a revamp.&lt;br /&gt;&lt;br /&gt;I've personally chosen not to take part in this debate as I agree with Einstein (with a modification) - Politics lasts for about a month, code lasts forever. I have however seen a lot of false assumptions been spoken both about DotNetEngine and about my self and my intentions, as well as a few true ones. But I believe this is totally irrelevant. We have the power to fix anything, and frankly most of the ones pointed out in DotNetEngine are not that big. However I feel some sides in this case may have be pushing too strongly on the political side and not doing too enough the code side to solve the problem - and that is a WOMBAT. (Waste Of Money, Brains And Time)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;SECS&lt;/span&gt;&lt;br /&gt;&lt;/strong&gt;Now back to this common structure I mentioned at the start of this post.&lt;br /&gt;--- to be continued in next post ---&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-6711793645677745582?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/6711793645677745582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=6711793645677745582&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6711793645677745582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6711793645677745582'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/09/dotnetengine-and-xengine.html' title='DotNetEngine and xengine'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-711944820000293634</id><published>2008-09-27T14:17:00.004+02:00</published><updated>2008-09-27T14:32:27.009+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Vacation'/><title type='text'>Absent</title><content type='html'>&lt;div&gt;Hello... Is this thing still on?&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Ok, its a while between each post. The amount of time I have varies.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Lately I've been disabled by some inevitable hand-hurting as a result from effort in another project I worked on. I'm also in the startup phase with a new company, so time is still not something I have an abundance of - but who does.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;After a nice scenic vacation in north of Norway my hands are 70%-80% back to normal and here I am. :)&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_rculTBw7Cnk/SN4nsHZ9tII/AAAAAAAAADM/BDpefGZZ8kc/s1600-h/smines1.jpg"&gt;&lt;img style="CURSOR: hand" id="BLOGGER_PHOTO_ID_5250677854416254082" border="0" alt="" src="http://2.bp.blogspot.com/_rculTBw7Cnk/SN4nsHZ9tII/AAAAAAAAADM/BDpefGZZ8kc/s400/smines1.jpg" /&gt;&lt;/a&gt; &lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-711944820000293634?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/711944820000293634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=711944820000293634&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/711944820000293634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/711944820000293634'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/09/absent.html' title='Absent'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_rculTBw7Cnk/SN4nsHZ9tII/AAAAAAAAADM/BDpefGZZ8kc/s72-c/smines1.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-7560936078230441678</id><published>2008-03-04T21:02:00.004+01:00</published><updated>2008-03-04T21:20:16.026+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='3Di'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>OpenSim tackles high load</title><content type='html'>3Di have provided us with some new fancy features being added to OpenSim over the next few days.&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Region splitting&lt;/strong&gt;&lt;br /&gt;Allows multiple physical computers to cooperate on maintaining one region. This is good for scenarios where you would want a large amount of people in the same region (think large events). OpenSim has already proven the potential of holding well over a hundred users, and this patch increases that number many times.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Dynamic load balancing&lt;br /&gt;&lt;/strong&gt;Monitors the load (often related to number of users) a region is exposed to and can realtime move the region to a computer with less load (while it's running!). More efficient use of computer resources means we save electricity. No more empty regions occupying an idle server. So this is a green patch! :)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-7560936078230441678?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/7560936078230441678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=7560936078230441678&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7560936078230441678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7560936078230441678'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/03/new-opensim-features.html' title='OpenSim tackles high load'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-6816192332153011991</id><published>2008-02-25T18:34:00.005+01:00</published><updated>2008-02-25T18:46:43.941+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OSSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>Objectifying LSL</title><content type='html'>A few months ago we decided to make a distinction between SL's LSL2 and our own LSL implementation. This mainly because we were planning to add new features to the language. But also to make people understand that the compatibility may not be 100% - at least not for some time into the future. One thing is implementing all ll-commands. Another is to get them all right. So we decided to call our language OSSL (OpenSim Scripting Language.)&lt;br /&gt;&lt;br /&gt;Yesterday OSSL took a new turn. In addition to LSL2's straight forward function calls and our own similar os-calls I want to provide a modular aproach.&lt;br /&gt;&lt;br /&gt;So now OSSL has a new object "Prim" that can be used in the following ways:&lt;br /&gt;Prim.Position.x += 10;&lt;br /&gt;Prim.Rotation.x += 45;&lt;br /&gt;Prim.Text = "This text floats on top of a prim!";&lt;br /&gt;&lt;br /&gt;I'm planning to implement more functions. Especially looking forward to getting for example the particle-system into objectified managed code.&lt;br /&gt;&lt;br /&gt;Later down the road people can use Visual Studio to write scripts for OpenSim. If they include some OSSL.dll they will get the benefits of managed code and writing scripts should be a breeze.&lt;br /&gt;&lt;br /&gt;So, here is a sample script:&lt;br /&gt;&lt;blockquote&gt;//c#&lt;br /&gt;&lt;br /&gt;double x = 0;&lt;br /&gt;double y = 0;&lt;br /&gt;&lt;br /&gt;public&lt;br /&gt;void default_event_state_entry()&lt;br /&gt;{&lt;br /&gt;llSetTimerEvent(0.1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void default_event_timer() {&lt;br /&gt;x += 0.2;&lt;br /&gt;y += 0.1;&lt;br /&gt;&lt;br /&gt;Prim.Position.x = System.Math.Sin(x) * 10 + 100;&lt;br /&gt;Prim.Position.y = System.Math.Cos(y) * 10 + 100;&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-6816192332153011991?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/6816192332153011991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=6816192332153011991&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6816192332153011991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6816192332153011991'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/02/objectifying-lsl.html' title='Objectifying LSL'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-5774819715901297375</id><published>2008-02-11T14:04:00.000+01:00</published><updated>2008-02-11T14:07:44.917+01:00</updated><title type='text'>New languages</title><content type='html'>DotNetEngine has received a couple of new languages: VB.Net and JScript.&lt;br /&gt;Just add //vb or //js as the first characters of your script. Examples here: &lt;a href="http://opensimulator.org/wiki/OpenSim:Scripting_Languages"&gt;http://opensimulator.org/wiki/OpenSim:Scripting_Languages&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;LSL support has also been improved to support states and also a minor patch for functions inside &lt;x,y,z&gt;. It seems like LSL is starting to run ok now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-5774819715901297375?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/5774819715901297375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=5774819715901297375&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5774819715901297375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5774819715901297375'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/02/new-languages.html' title='New languages'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4445847312291902591</id><published>2008-02-11T13:52:00.001+01:00</published><updated>2008-02-11T13:59:35.076+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><category scheme='http://www.blogger.com/atom/ns#' term='ScriptEngine'/><title type='text'>New common framework</title><content type='html'>I have moved most of the code from OpenSim.Region.ScriptEngine.DotNetEngine to OpenSim.Region.ScriptEngine.Common.&lt;br /&gt;&lt;br /&gt;Right now we have only one ScriptEngine, and its purpose is to emulate a Second Life script engine by executing scripts put into prims. But in the future I expect different kinds of script engines such as controllers that manipulate in-world game rules or objects from a .dll that has nothing to do with prim scripts.&lt;br /&gt;&lt;br /&gt;Therefore I moved parts of DotNetEngine into Common so that Common is an execution framework.&lt;br /&gt;&lt;br /&gt;DotNetEngine now does LSL-&gt;C# convert and compile. But does not do anything else. It simply hands the compiled .dll back to Common when its done. Then Common does the actual execution of script.&lt;br /&gt;&lt;br /&gt;To quote &lt;a href="http://opensimulator.org/wiki/OpenSim.Region.ScriptEngine.Common"&gt;http://opensimulator.org/wiki/OpenSim.Region.ScriptEngine.Common&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;What do I get for free?&lt;/strong&gt;&lt;br /&gt;1. Loading/unloading of scripts are queued and executed in sequence. Only one load/unload at the time.&lt;br /&gt;&lt;br /&gt;2. What script belongs to what object is automatically taken care of. You just need to provide the scripts classes - nothing else.&lt;br /&gt;&lt;br /&gt;3. OpenSim events are translated and given to you as LSL events. Your script functions are executed automatically, no need to hook up to events or anything.If you want to implement your own event handlers, feel free to do so. Look in "OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.EventManager.cs" how its done. Your own events can run together with LSL events without any problem.&lt;br /&gt;&lt;br /&gt;4. Whenever an event is executed, the execution is queued. Only one event per script is ever executed simultaneous. But multithreading is used to run multiple scripts in parallel.&lt;br /&gt;&lt;br /&gt;5. Errors during script execution is automatically handled and relayed to users in-world.&lt;br /&gt;&lt;br /&gt;6. You get all LSL commands in an easy to use object, no need to keep track of scene or objects to execute functions. Running an LSL command from your script engine is as easy as running it from inside any LSL-script.&lt;br /&gt;&lt;br /&gt;7. Long LSL-commands that returns with an event is also handled.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4445847312291902591?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4445847312291902591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4445847312291902591&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4445847312291902591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4445847312291902591'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/02/new-common-framework.html' title='New common framework'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-1698279292058865940</id><published>2008-02-11T13:51:00.001+01:00</published><updated>2008-02-11T14:04:41.403+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><category scheme='http://www.blogger.com/atom/ns#' term='ScriptEngine'/><title type='text'>ScriptEngine with many regions per server</title><content type='html'>I have added a whole lot of detailed config options in OpenSim.ini.example that can be used to control DotNetEngine. Many of these are specific to Common, some are specific to DotNetEngine.&lt;br /&gt;&lt;br /&gt;You can now control a lot of detailed stuff that you usually wouldn't care about. The reason why these options are there now is because 1) Common will be sharing resources across different script engines (so we can support large amounts of script engines) and 2) who knows what you will be using OpenSim for.&lt;br /&gt;&lt;br /&gt;One of the most important new features is the capability of Common to share maintenance, load/unload and execution threads accross instances (read: regions). Today a new instance of ScriptEngine is created for each region. And with 3-4 threads per ScriptEngine ... I guess this is a severe limit to large scale use of OpenSim.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Note! The thread sharing is currently disabled due to some bugs that needs fixing.&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-1698279292058865940?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/1698279292058865940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=1698279292058865940&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/1698279292058865940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/1698279292058865940'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/02/scriptengine-with-many-regions-per.html' title='ScriptEngine with many regions per server'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-7428467790793333229</id><published>2008-02-11T13:46:00.000+01:00</published><updated>2008-02-11T13:51:05.278+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ScriptServer'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>ScriptServer</title><content type='html'>ScriptServer is "almost done". Meaning it is capable of doing everything except communicating from a script to OpenSim. For this I need to abstract the layer between llFunction() and the actual implementation. Which already is in part done.&lt;br /&gt;However ScriptServer has not been a priority lately.&lt;br /&gt;&lt;br /&gt;For those who dont know the difference: ScriptEngine is a .dll that OpenSim uses to run scripts. ScriptServer is 1) a ScriptEngine .dll, but instead of executing scripts it remotely communicated with a 2) ScriptServer that uses the same ScriptEngine .dll's as OpenSim to execute scripts.&lt;br /&gt;The advantage of this is that the script execution can happen on a remote machine (or same machine if you want) outside of OpenSim.exe.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-7428467790793333229?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/7428467790793333229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=7428467790793333229&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7428467790793333229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7428467790793333229'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/02/scriptserver.html' title='ScriptServer'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-9195476360927319926</id><published>2008-01-11T18:50:00.000+01:00</published><updated>2008-01-11T18:54:24.491+01:00</updated><title type='text'>Idling</title><content type='html'>I guess its that time of year again when I write my blog post...&lt;br /&gt;&lt;br /&gt;It's been a while... :) I've been busy with RL work. Sadly that work doesn't involve OpenSim just yet. But now I'm back and I thought I'd put some words here.&lt;br /&gt;&lt;br /&gt;I've picket up where I left off on ScriptServer. Not so much to report yet. TCP server/client implementation is ready, binary protocol and bindings are not. Server executable is ready, plugin module is ready. So what remains is mainly binary protocol and binding implementations.&lt;br /&gt;&lt;br /&gt;Depending on how much free time I have this shouldn't take too long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-9195476360927319926?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/9195476360927319926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=9195476360927319926&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/9195476360927319926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/9195476360927319926'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2008/01/idling.html' title='Idling'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-785134924129842613</id><published>2007-10-14T23:03:00.000+02:00</published><updated>2007-10-14T23:04:47.395+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>Script engine implementation</title><content type='html'>I just wrote this contribution to AWG: &lt;a href="http://wiki.secondlife.com/wiki/Tedds_stand-alone_script_engine"&gt;http://wiki.secondlife.com/wiki/Tedds_stand-alone_script_engine&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It explains how and why on my opinions on the future script engine implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-785134924129842613?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/785134924129842613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=785134924129842613&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/785134924129842613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/785134924129842613'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/10/script-engine-implementation.html' title='Script engine implementation'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-5874271760041178211</id><published>2007-10-14T17:27:00.000+02:00</published><updated>2007-10-14T17:38:54.726+02:00</updated><title type='text'>Communication</title><content type='html'>Things are a bit quiet right now. But there are things happening behind the scenes.&lt;br /&gt;&lt;br /&gt;Some notes on communication between region and script engine.&lt;br /&gt;&lt;br /&gt;Region will be the initiator. That is, the one that contacts script server. If an object containing a script moves from one region to another then the next region will contact the script server.&lt;br /&gt;&lt;br /&gt;The communication protocol will be a custom binary protocol. As far as I know there are no RPC protocol designed for high volume async function calls. This will allow a continous stream of function calls in both directions. Any reply on commands will be done by attaching an reply ID to the function call package, a reply package refering this ID containing reply data  will be sent back.&lt;br /&gt;&lt;br /&gt;Scripts will be blocked while waiting for reply, but not while waiting for their command to be sent.&lt;br /&gt;&lt;br /&gt;Currently TCP client/server has been created, but the binary protocol is still in design stage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-5874271760041178211?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/5874271760041178211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=5874271760041178211&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5874271760041178211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5874271760041178211'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/10/communication.html' title='Communication'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-5073290551631216293</id><published>2007-10-01T19:11:00.000+02:00</published><updated>2007-10-01T19:25:23.564+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>A peek on new architecture</title><content type='html'>&lt;a href="http://bp2.blogger.com/_rculTBw7Cnk/RwErDoMJAuI/AAAAAAAAADE/F8myFqHIrnA/s1600-h/20071001+-+ScriptEngine+StandAlone+Layout.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5116417992997536482" style="CURSOR: hand" alt="" src="http://bp2.blogger.com/_rculTBw7Cnk/RwErDoMJAuI/AAAAAAAAADE/F8myFqHIrnA/s400/20071001+-+ScriptEngine+StandAlone+Layout.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is where my planning is at now.&lt;br /&gt;It was very complex, and after redrawing it a few times I neded up at this.&lt;br /&gt;Still not 100%, but getting there...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-5073290551631216293?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/5073290551631216293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=5073290551631216293&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5073290551631216293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5073290551631216293'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/10/peek-on-new-architecture.html' title='A peek on new architecture'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_rculTBw7Cnk/RwErDoMJAuI/AAAAAAAAADE/F8myFqHIrnA/s72-c/20071001+-+ScriptEngine+StandAlone+Layout.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-1988937472058739398</id><published>2007-09-27T18:21:00.000+02:00</published><updated>2007-09-27T18:34:16.690+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>Major rewrite number 2</title><content type='html'>I have been doing some thinking on the ScriptEngine. Actually a whole lot of thinking, and planning. Lots of alien squid-like drawings in my notebook.&lt;br /&gt;&lt;br /&gt;Trying to run through the process: Idea, required elements, architecture and finally simplification.&lt;br /&gt;&lt;br /&gt;The idea is simply: Moving ScriptEngine to a separate daemon, independent from the region.&lt;br /&gt;This has several big advantages and of course some drawbacks.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Script does not need to be moved between regions when object it is inside does.&lt;/li&gt;&lt;li&gt;Scripts can run on separate servers and even clusters of servers, offloading the main region server.&lt;/li&gt;&lt;li&gt;Script source (and binary) can be secured by running it from a trusted server. Even makes it possible with script rental. You can run your own ScriptEngine.&lt;/li&gt;&lt;li&gt;We can add the option to move script between regions as usual to avoid network lag on time-critical scripts.&lt;/li&gt;&lt;li&gt;It is easier to write alternative ScriptEngines, developers are not restricted to .Net.&lt;/li&gt;&lt;li&gt;ScriptEngines can be more complex and allow bigger and more complex scripts than the region would by default.&lt;/li&gt;&lt;li&gt;Regions can be more secure as they do not have to execute scripts locally.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Disadvantage:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Each region may have to speak to many different scriptengines.&lt;/li&gt;&lt;li&gt;Network latency will affect script performance.&lt;/li&gt;&lt;li&gt;Script reliability is much lower.&lt;/li&gt;&lt;li&gt;Various problems related to authentication.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Of course all the work done with implementing LSL commands so far will survive. That is independent of this rewrite.&lt;/p&gt;&lt;p&gt;I'll be back with more as it unfolds.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-1988937472058739398?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/1988937472058739398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=1988937472058739398&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/1988937472058739398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/1988937472058739398'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/09/major-rewrite-number-2.html' title='Major rewrite number 2'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-224986210297540884</id><published>2007-09-27T18:13:00.000+02:00</published><updated>2007-09-27T18:14:41.019+02:00</updated><title type='text'>Perfect code</title><content type='html'>The development process of a good program may often seem strange for an outsider. One can expect the development process to consist of planning, development and testing. A simple linear way to get from design to final product. In most commercial scenarios this is also how its done. Forcing an application from idea through design, programming and testing to the final product. And this is right, because in almost every case a program is design to do a specific task. There are rarely and demands on how the code looks or how secure it is. The application will be serving 1, 2 or 50 people for 2-3 years with little modifications once its has been developed.&lt;br /&gt;&lt;br /&gt;However when a programmer who loves to code is sitting at home developing something the process is very different. Programs are rarely finished, they are often only 70-80% done before scrapped and a new one is started. Debugging has been done during development, and the program is likely to contain lots of bugs. Because the program was not written for the purpose of being used. It was a practice... A practice in architecture, algorithms, API's and objects. The next time the a program is written the past experience is put into that program, and its slightly better. It's all about understanding the architectures and algorithms. Therefore, in search for the "perfect code", you find developers rewriting their applications - time after time. Sometimes it's major restructuring, sometimes major rewrites. Learning how to plan for change, so that you don't need to plan.&lt;br /&gt;&lt;br /&gt;Do I need to say more? nah.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-224986210297540884?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/224986210297540884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=224986210297540884&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/224986210297540884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/224986210297540884'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/09/perfect-code.html' title='Perfect code'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-6082174848842363818</id><published>2007-09-14T10:06:00.001+02:00</published><updated>2007-09-14T10:17:41.244+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>Pure C# support</title><content type='html'>&lt;p&gt;ScriptEngine supports both LSL and C# within the same script. Mainly this means that you can write LSL, but when you want you can use C# code. For example instead of using llToLower(mystring) you can use mystring.ToLower(), instead of llStringLength(mystring) you can use mystring.Length().&lt;/p&gt;  &lt;p&gt;But to make sure that we support pure C# code, I've added support for forcing the compiler to not use LSL preprocessor. This means skipping directly to compile without going through LSL to C# converter.&lt;/p&gt;  &lt;p&gt;Any script that starts with the 4 letters &amp;quot;//C#&amp;quot; or //c#&amp;quot; will be compiled as C# directly. This ensures that we have 100% C# support.&lt;/p&gt;  &lt;p&gt;There are a few rules you need to follow. Mainly:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Any LSL event needs to be renamed to &amp;lt;STATE&amp;gt;_event_&amp;lt;EVENTNAME&amp;gt;.      &lt;br /&gt;For example &amp;quot;start_entry()&amp;quot; in default state will be &amp;quot;public void default_event_state_entry()&amp;quot; &lt;/li&gt;    &lt;li&gt;LSL events needs to be public, of course. &lt;/li&gt;    &lt;li&gt;Script needs to start with &amp;quot;//C#&amp;quot; without the quotes and without space in front of it. &lt;em&gt;These 4 characters needs to be the first thing inside the script!&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;&lt;em&gt;You still have to use ll-commands for stuff that native C# doesn't support. But don't worry - the ll-commands are just the name, you are actually writing in C#. ;)&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;If you put a LSL script into an object in OpenSim, the C# code of that script will be debug-logged to the &amp;quot;bin\ScriptEngine\&amp;quot;-folder. So if you have any trouble, just write up a LSL code, put it into an object and you have a working C# script that does the same thing.&lt;/p&gt;  &lt;p&gt;Untested example:&lt;/p&gt; &lt;font color="#008000" size="2"&gt;   &lt;p&gt;//C#&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;   &lt;font color="#0000ff" size="2"&gt;namespace&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; SecondLife       &lt;br /&gt;&lt;/font&gt;{&lt;/font&gt;    &lt;p&gt;&lt;/p&gt;   &lt;font color="#0000ff" size="2"&gt;&amp;#xA0;&amp;#xA0; public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;class&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;Script&lt;/font&gt;&lt;font size="2"&gt; : OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.&lt;/font&gt;&lt;font color="#2b91af" size="2"&gt;LSL_BaseClass     &lt;br /&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0; &lt;/font&gt;{&lt;/font&gt;    &lt;p&gt;&lt;/p&gt;   &lt;font color="#0000ff" size="2"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; public&lt;/font&gt;&lt;font size="2"&gt; Script() { }&lt;/font&gt;&lt;/font&gt;  &lt;p&gt;&lt;font color="#008000" size="2"&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;// Your script goes here!      &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; int&lt;/font&gt;&lt;font size="2"&gt; touch_count = 0;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; int&lt;/font&gt;&lt;font size="2"&gt; tick_count = 0;     &lt;br /&gt;&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; int&lt;/font&gt;&lt;font size="2"&gt; objnum = 1;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; default_event_state_entry()     &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;{      &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;&amp;#xA0;&amp;#xA0; llSay(0, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Hello, Avatar! Starting timer...&amp;quot;&lt;/font&gt;&lt;font size="2"&gt;);     &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;&amp;#xA0;&amp;#xA0; llSetTimerEvent(10);      &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;}&lt;/font&gt;    &lt;p&gt;&lt;/p&gt;   &lt;font color="#0000ff" size="2"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; default_event_touch_start(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;int&lt;/font&gt;&lt;font size="2"&gt; total_number)     &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;{      &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;&amp;#xA0;&amp;#xA0; touch_count++;      &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;&amp;#xA0;&amp;#xA0; llSay(0, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Object was touched. Touch count: &amp;quot;&lt;/font&gt;&lt;font size="2"&gt; + touch_count);     &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff" size="2"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; public&lt;/font&gt;&lt;font size="2"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; default_event_timer()     &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;{      &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;&amp;#xA0;&amp;#xA0; tick_count++;      &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;&amp;#xA0;&amp;#xA0; llSay(0, &lt;/font&gt;&lt;font color="#a31515" size="2"&gt;&amp;quot;Timer count: &amp;quot;&lt;/font&gt;&lt;font size="2"&gt; + tick_count);     &lt;br /&gt;&lt;font color="#0000ff"&gt;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0;&amp;#xA0; &lt;/font&gt;}      &lt;br /&gt;&amp;#xA0;&amp;#xA0; }      &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt; &lt;font size="2"&gt;&lt;/font&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-6082174848842363818?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/6082174848842363818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=6082174848842363818&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6082174848842363818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6082174848842363818'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/09/pure-c-support.html' title='Pure C# support'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-7812856150815830352</id><published>2007-09-09T10:32:00.000+02:00</published><updated>2007-09-09T10:51:16.179+02:00</updated><title type='text'>Starting my own company</title><content type='html'>Hi&lt;br /&gt;&lt;br /&gt;I'm currently in a period of less activity on the development front. Very sorry about that.&lt;br /&gt;At the end of last month I quit my job and started my own company as an independent consultant, and with this comes a lot of work setting up, getting customers, etc...&lt;br /&gt;&lt;br /&gt;The good news is that once this is through I will be back for full. The plan is that my company will support this project through my development effort, so there will be time set of specially for OpenSim. But the time I can put into it will of course vary a bit depending on what projects I'm on.&lt;br /&gt;&lt;br /&gt;But I'm looking very much forward to starting back up on OpenSim. The plan is tomorrow (monday) or tuseday, depending on finalization of current project. But my mind has not been completely absent, I've been thinking about the ScriptEngine allthough I haven't had time to do any coding.&lt;br /&gt;&lt;br /&gt;This is what I want to fix next:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Look into how to move ScriptEngine from Region to Sim-level with MW, changing object and script identifiers to LLUUID.&lt;br /&gt;This way a script can keep running even though it crosses local regions - a great benefit to both the script itself and the servers.&lt;/li&gt;&lt;li&gt;Document how so anyone who wants to take on the mission of creating llHttpRequest can do so. (this is one of those long commands that needs cleaning up if a script is removed)&lt;/li&gt;&lt;li&gt;Serialize/Deserialize code in AppDomains so we can move running scripts (that are inbetween executions) and keep their state when stopping/starting server.&lt;/li&gt;&lt;li&gt;Make scripts work in Grid-mode.&lt;/li&gt;&lt;/ul&gt;Also I have been playing with the idea of restructuring ScriptEngine so that it can easily be used in other projects too. But we'll have to wait and see...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-7812856150815830352?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/7812856150815830352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=7812856150815830352&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7812856150815830352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7812856150815830352'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/09/starting-my-own-company.html' title='Starting my own company'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-2783151836756417295</id><published>2007-08-30T09:48:00.000+02:00</published><updated>2007-08-30T09:51:00.552+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>WIKI updated with info on scripting</title><content type='html'>I've updated the &lt;a href="http://openmetaverse.org/wiki/Main_Page"&gt;OpenSim Wiki&lt;/a&gt; with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://openmetaverse.org/wiki/OpenSim:_Scripting"&gt;General info about scripting in OpenSim&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://openmetaverse.org/wiki/LlFunction_implementation_status"&gt;llFunction implementation status&lt;/a&gt;&lt;/li&gt;&lt;li&gt;And some information about the &lt;a href="http://openmetaverse.org/wiki/OpenSim.Region.ScriptEngine.DotNetEngine"&gt;DotNetScriptEngine internals&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-2783151836756417295?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='' href='http://openmetaverse.org/wiki/OpenSim:_Scripting' length='0'/><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/2783151836756417295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=2783151836756417295&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2783151836756417295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2783151836756417295'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/wiki-updated-with-info-on-scripting.html' title='WIKI updated with info on scripting'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-294824804839839953</id><published>2007-08-26T00:09:00.000+02:00</published><updated>2007-08-30T09:44:08.404+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>Small stresstest</title><content type='html'>114 scripts loaded. 1 script per AppDomain. Most scripts are alone inside a prim, except the big box over there that has something like 10 scripts in it (it is bigger so I could fit more scripts into it).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_rculTBw7Cnk/RtCpLv8IPFI/AAAAAAAAAAk/MBRDxBWZRDc/s1600-h/OpenSim+-+Running+114+scripts+-+in-world+screenshot.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5102764397123091538" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_rculTBw7Cnk/RtCpLv8IPFI/AAAAAAAAAAk/MBRDxBWZRDc/s400/OpenSim+-+Running+114+scripts+-+in-world+screenshot.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;My computer is a 2,8GHz Prescott with 2GB RAM and Windows Vista Ultimate.&lt;br /&gt;60 of the scripts run the timer event every 1 second. 50 run it every 5 seconds.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_rculTBw7Cnk/RtCpqv8IPGI/AAAAAAAAAAs/cya-NUyjhUU/s1600-h/OpenSim+-+Running+114+scripts+-+performance+screenshot.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5102764929699036258" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_rculTBw7Cnk/RtCpqv8IPGI/AAAAAAAAAAs/cya-NUyjhUU/s400/OpenSim+-+Running+114+scripts+-+performance+screenshot.png" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Basically this tells us that ScriptEngine uses a bit too much memory. This is expected. CPU usage while running 114 events every x seconds is almost nothing.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Increase from 38MB to 76MB RAM when creating objects and scripts, so ~10MB for 25 scripts+objects.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;The scripts don't do much work right now, but if they did the speed would still be high as they are compiled to CPU native code.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Results after running for 9 hours&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;OpenSim did not crash or eat any more CPU or memory over time. However the Second Life viewer did crash, so I had to log in again... Funny ;)&lt;/p&gt;&lt;a href="http://bp0.blogger.com/_rculTBw7Cnk/RtExxf8IPHI/AAAAAAAAAA0/bJLgultP08c/s1600-h/OpenSim+-+Running+114+scripts+-+in-world+screenshot+2.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5102914579244530802" style="CURSOR: hand" alt="" src="http://bp0.blogger.com/_rculTBw7Cnk/RtExxf8IPHI/AAAAAAAAAA0/bJLgultP08c/s400/OpenSim+-+Running+114+scripts+-+in-world+screenshot+2.png" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-294824804839839953?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/294824804839839953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=294824804839839953&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/294824804839839953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/294824804839839953'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/small-stresstest.html' title='Small stresstest'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_rculTBw7Cnk/RtCpLv8IPFI/AAAAAAAAAAk/MBRDxBWZRDc/s72-c/OpenSim+-+Running+114+scripts+-+in-world+screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-3900213177219876877</id><published>2007-08-25T22:55:00.000+02:00</published><updated>2007-08-30T09:44:08.404+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>So where are we now?</title><content type='html'>[Updated Monday 13:45 GMT+1]&lt;br /&gt;[Updated Wednesday 21:45 GMT+1]&lt;br /&gt;[Updated Saturday 22:45 GMT+1]&lt;br /&gt;&lt;br /&gt;As always its important with a summary for those who don't want to read techie details.&lt;br /&gt;&lt;br /&gt;Here is current status of LSL script support:&lt;br /&gt;+ We have LSL script support.&lt;br /&gt;+ We can run hundreds of scripts simlutaneously, probably not thousands (needs testing). We have confirmed 50 simultaneous scripts without any sign of trouble.&lt;br /&gt;+ We can utilize multicore CPU's for running scripts.&lt;br /&gt;+ We can to some degree unload scripts to free up memory. (if we use 1 AppDomain per script)&lt;br /&gt;+ Events from server are put into a queue, so server threads are released imediately.&lt;br /&gt;+ Some llFunctions are implemented.&lt;br /&gt;+ ScriptEngine is more or less ready to bind individual scripts to individual prims.&lt;br /&gt;+ We have implemented touch_start event when someone touches a prim.&lt;br /&gt;+ We have implemented llSetTimerEvent.&lt;br /&gt;+ Script compile errors are displayed in-world.&lt;br /&gt;&lt;strong&gt;+ We can put scripts into prims.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;- Can not run too many scripts that contain infinite loops or sleeps to long.&lt;br /&gt;- No memory/CPU sharing/limitation/throttling on scripts.&lt;br /&gt;- Almost no security implemented on scripts.&lt;br /&gt;- Can not move script between regions.&lt;br /&gt;- Missing 300+ llFunctions.&lt;br /&gt;- Missing most events.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_rculTBw7Cnk/RtCXS_8IPEI/AAAAAAAAAAc/jzb5V0tVUsQ/s1600-h/ScriptError.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5102744730467843138" style="MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp1.blogger.com/_rculTBw7Cnk/RtCXS_8IPEI/AAAAAAAAAAc/jzb5V0tVUsQ/s320/ScriptError.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;There is room for making scripts run 2-5 times faster, if not more. And same in memory usage. This is because of the development process.&lt;br /&gt;"Get it working, remove bugs, make it fast."&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There is much data related to each script. I suspect if we load too many scripts the &lt;a href="http://en.wikipedia.org/wiki/Working_set" target="_blank"&gt;working set&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Page_replacement_algorithm#WSClock" target="_blank"&gt;WSClock&lt;/a&gt;) will be too high. Meaning there is too much data to process, so the CPU and memory will be more occupied with looking at what to do than actually doing it.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-3900213177219876877?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/3900213177219876877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=3900213177219876877&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/3900213177219876877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/3900213177219876877'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/so-where-are-we-now.html' title='So where are we now?'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_rculTBw7Cnk/RtCXS_8IPEI/AAAAAAAAAAc/jzb5V0tVUsQ/s72-c/ScriptError.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-8167222303286114865</id><published>2007-08-25T22:45:00.000+02:00</published><updated>2007-08-30T09:45:04.751+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>Introduction of a new class</title><content type='html'>Some LL-commands takes longer to return. These often return with a event. For example llSetTimerEvent(10) will return a timer() event every 10 seconds. llHttpRequest() will return when it receives answer from HTTP-server.&lt;br /&gt;&lt;br /&gt;To handle these types of requests a new class has been added as a subclass of ScriptEngine. The class is named &lt;em&gt;LSLLongCmdHandler.cs.&lt;/em&gt; This class will contain handlers for adding/removing requests. Adding when script executes a command, removing when command is not complete yet but script is being moved to another region or otherwise removed.&lt;br /&gt;&lt;br /&gt;The class has a dedicated thread that will be working the different services, for example async HTTP requests and queueing of timer events at the correct intervals.&lt;br /&gt;&lt;em&gt;LSL_BuiltIn_Commands.cs&lt;/em&gt; accesses this class through ScriptEngine.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Example from &lt;em&gt;LSL_BuiltIn_Commands.cs&lt;/em&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void llSetTimerEvent(double sec)&lt;br /&gt;{&lt;br /&gt;  // Setting timer repeat&lt;br /&gt;  m_ScriptEngine.myLSLLongCmdHandler.SetTimerEvent(m_localID, m_itemID, sec);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-8167222303286114865?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/8167222303286114865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=8167222303286114865&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/8167222303286114865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/8167222303286114865'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/introduction-of-new-class.html' title='Introduction of a new class'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-2142442387631687022</id><published>2007-08-19T15:59:00.000+02:00</published><updated>2007-08-30T09:45:04.751+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>Speed</title><content type='html'>I've added support for multithreading execution of script events. Only one object will be processed at the time. This will benefit from MultiCore CPU's. Though it makes each call more expensive because we have to keep track of mutexed objects.&lt;br /&gt;&lt;br /&gt;Also added caching of event binding (function call) so we only use Reflection on first execution of a given event within a given state.&lt;br /&gt;&lt;br /&gt;Changed sleep time of inactive threads from 200ms to 50ms, so they are more responsive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-2142442387631687022?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/2142442387631687022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=2142442387631687022&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2142442387631687022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2142442387631687022'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/speed.html' title='Speed'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-2888126407040342606</id><published>2007-08-19T15:46:00.000+02:00</published><updated>2007-08-30T09:45:04.752+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>AppDomains</title><content type='html'>.Net does not allow unloading of assemblies. If you want to unload an assembly you have to unload the whole AppDomain.&lt;br /&gt;&lt;br /&gt;I've created AppDomainManager that handles creating AppDomain, finding a free AppDomain, loading scripts into it, and unloading AppDomains with no active scripts in them.&lt;br /&gt;&lt;br /&gt;Its purpose is to create AppDomains and put X number of scripts into each of them. Later when we get microthreading support we will add a feature to move scripts between AppDomains, so if one or more AppDomains has only a few active scripts we can move these to a fresh AppDomain and unload the old one.&lt;br /&gt;&lt;br /&gt;With the introduction of AppDomain there came a few changes to the source. Because of how communication between AppDomains (mainly between scripts AppDomain and the main AppDomain) works there has been made some changes.&lt;br /&gt;&lt;br /&gt;First of all a new assembly called OpenSim.Region.ScriptEngine.Common.dll has been introduced. It contains interface for scripts and some common code for all AppDomains to execute events inside scripts.&lt;br /&gt;&lt;br /&gt;Secondly the LSL BuiltIns (llFunctions) has been moved to a separate file (LSL_BuiltIn_Commands.cs) and are no longer part of the LSL_BaseClass.cs.&lt;br /&gt;&lt;br /&gt;Also OpenSim.Region.ScriptEngine.Common.LSL_Types that contains custom Vector and Rotation objects is now used throughout DotNetEngine/Compiler.&lt;br /&gt;&lt;br /&gt;Each AppDomain has only 2 references, OpenSim.Region.ScriptEngine.Common.dll and OpenSim.Region.ScriptEngine.DotNetEngine.dll.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-2888126407040342606?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/2888126407040342606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=2888126407040342606&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2888126407040342606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2888126407040342606'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/appdomains.html' title='AppDomains'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-803224889401481471</id><published>2007-08-17T23:42:00.000+02:00</published><updated>2007-08-30T09:45:04.752+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>llSay implemented</title><content type='html'>Picture of llSay() implemented.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_rculTBw7Cnk/RsYWnf8IPDI/AAAAAAAAAAU/RGgCSn8U6qA/s1600-h/ObjectTouched.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5099788495888071730" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; CURSOR: hand" alt="" src="http://bp1.blogger.com/_rculTBw7Cnk/RsYWnf8IPDI/AAAAAAAAAAU/RGgCSn8U6qA/s320/ObjectTouched.png" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-803224889401481471?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/803224889401481471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=803224889401481471&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/803224889401481471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/803224889401481471'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/llsay-implemented.html' title='llSay implemented'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_rculTBw7Cnk/RsYWnf8IPDI/AAAAAAAAAAU/RGgCSn8U6qA/s72-c/ObjectTouched.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-5191966773236064824</id><published>2007-08-14T21:12:00.000+02:00</published><updated>2007-08-30T09:45:04.752+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>llFunction interface/empty prototypes</title><content type='html'>Charles Krinkle has helped in adding interface and necessary empty prototype implementations of base class for the compiled script.&lt;br /&gt;&lt;br /&gt;Almost all functions has been implemented (they contain no code yet though). This helps me test the compiler on all kinds of scripts without getting errors.&lt;br /&gt;&lt;br /&gt;Thanks dude! :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-5191966773236064824?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/5191966773236064824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=5191966773236064824&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5191966773236064824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5191966773236064824'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/llfunction-interfaceempty-prototypes.html' title='llFunction interface/empty prototypes'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4519905832367769189</id><published>2007-08-14T09:00:00.000+02:00</published><updated>2007-08-30T09:45:04.753+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenSim'/><title type='text'>New status after Monday (and a milestone)</title><content type='html'>&lt;strong&gt;ScriptEngine has now been implemented!&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;We have a default script that is placed in all objects. We have a "touch_start" event. And we have llSay() with output to server console.&lt;br /&gt;&lt;br /&gt;Once inventory is working we can bind user made scripts to user made objects. So now we can start implementing all 350+ builtin ll-functions.&lt;br /&gt;&lt;br /&gt;We will be able to test the functions in-world as they are being implemented. Just modify the script "Default.lsl" under "bin\ScriptEngines\" folder to use the new command you are implementing.&lt;br /&gt;&lt;br /&gt;There may still be problems compiling some scripts. Please let me know about these problems so I can fix them!&lt;br /&gt;Next step for me is to implement error handling around ScriptEngine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4519905832367769189?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4519905832367769189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4519905832367769189&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4519905832367769189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4519905832367769189'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/new-status-after-monday-and-milestone.html' title='New status after Monday (and a milestone)'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-9080245605285912571</id><published>2007-08-12T22:19:00.000+02:00</published><updated>2007-08-30T09:42:28.130+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><title type='text'>Status of LSL compiler</title><content type='html'>&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Status update&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;LSL-&gt;C# Translator&lt;/strong&gt; is close to complete. Needs bigger/more scripts to bughunt.&lt;br /&gt;&lt;strong&gt;Compiler&lt;/strong&gt; is capable of compiling C# to .Net (invokes LSL-&gt;C# trans if needed).&lt;br /&gt;&lt;strong&gt;Script Manager&lt;/strong&gt; is capable of loading and initializing script .Net Assembly.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Missing:&lt;/strong&gt;&lt;br /&gt;LSL BuiltIn command implementation.&lt;br /&gt;Event implementation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-9080245605285912571?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/9080245605285912571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=9080245605285912571&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/9080245605285912571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/9080245605285912571'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/status-of-lsl-compiler.html' title='Status of LSL compiler'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-6844083167624311803</id><published>2007-08-12T20:20:00.000+02:00</published><updated>2007-08-30T09:42:28.130+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><title type='text'>How to contribute?</title><content type='html'>&lt;strong&gt;OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass.cs&lt;/strong&gt; contains a s*load of empty functions. These are all the LSL-functions. And all needs to be implemented. Implement most important/most used first.&lt;br /&gt;&lt;br /&gt;There is a "World" object available (scene).&lt;br /&gt;&lt;br /&gt;Example of implementation:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public void llSay(Int channelID, string text)&lt;br /&gt;{&lt;br /&gt;   World.Something.Somewhere.SendMessageToEveryoneAround(channelID, text);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-6844083167624311803?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/6844083167624311803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=6844083167624311803&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6844083167624311803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6844083167624311803'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/how-to-contribute.html' title='How to contribute?'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4866771911859264771</id><published>2007-08-12T20:15:00.001+02:00</published><updated>2007-08-30T09:42:28.131+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><title type='text'>LSL to C#</title><content type='html'>To compile LSL code I figured the best way would be to first translate it into C#.&lt;br /&gt;Since LL will be supporting both LSL and C# we can use the same translator on a web page or similar to help people who know LSL to understand C#.&lt;br /&gt;Also it is much simpler for other developers on OpenSim to contribute to the code when its C# instead of MSIL.&lt;br /&gt;&lt;br /&gt;The translator uses some regex and a couple of byte-by-byte passes over the code. Written in less than a day, no big magic involved.&lt;br /&gt;&lt;br /&gt;In-memory compile to assembly (that will be cached for later reuse).&lt;br /&gt;Assembly is dynamically loaded in same way as LSO.&lt;br /&gt;&lt;br /&gt;The script inherits from a LSL_BaseClass.cs that contains all the builtin-functions like llSay(), llWhisper, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4866771911859264771?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4866771911859264771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4866771911859264771&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4866771911859264771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4866771911859264771'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/lsl-to-c.html' title='LSL to C#'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4809262569264606502</id><published>2007-08-12T20:07:00.000+02:00</published><updated>2007-08-30T09:42:28.131+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSL'/><title type='text'>Changing tactics</title><content type='html'>After a meeting with Babbage Linden in Zero Lindens office hours on thursday I realized that with the new Mono/.Net compiler they are implementing we will have to make a few adjustments.&lt;br /&gt;&lt;br /&gt;It was earlier assume that compilation would be done at client of both LSL and LSO, therefore I focused on making a LSO (LSL virtual machine) ByteCode to .Net CIL (Assembly language) translator.&lt;br /&gt;&lt;br /&gt;But because of some security concerns in the .Net ByteCode LL has chosen to do compilation on server. LSL or C# code is sent to server where it is compiled and put into an object. The compiled code is never sent from the viewer.&lt;br /&gt;&lt;br /&gt;Therefore I am now writing a LSL compiler that will run on server.&lt;br /&gt;&lt;br /&gt;While waiting for Linden to update their client (probably 0,5-1 years) we will use the text-copy of LSL script sent by viewer and compile that. Meaning we are not using the LSO at all.&lt;br /&gt;&lt;br /&gt;So basically we are scrapping the LSO compiler, and going for a LSL compiler. There are many clear advantages to this, so I'm quite happy about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4809262569264606502?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4809262569264606502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4809262569264606502&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4809262569264606502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4809262569264606502'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/changing-tactics.html' title='Changing tactics'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-7012472795805079839</id><published>2007-08-05T16:26:00.000+02:00</published><updated>2007-08-30T09:43:10.054+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>Small milestone reach today</title><content type='html'>&lt;a href="http://bp3.blogger.com/_rculTBw7Cnk/RrXuWAkARqI/AAAAAAAAAAM/giI_3faU4Bc/s1600-h/LSL_EventTest.png"&gt;&lt;img id="BLOGGER_PHOTO_ID_5095240615315130018" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" height="379" alt="" src="http://bp3.blogger.com/_rculTBw7Cnk/RrXuWAkARqI/AAAAAAAAAAM/giI_3faU4Bc/s400/LSL_EventTest.png" width="492" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p&gt;Application is now able to:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Create Script Engine (SE)&lt;/li&gt;&lt;li&gt;SE hooks up to a temporary debug event in Test App&lt;/li&gt;&lt;li&gt;Test App asks SE to load LSO-file&lt;/li&gt;&lt;li&gt;SE compiles LSO-file into .Net Assembly&lt;/li&gt;&lt;li&gt;SE loads .Net Assembly&lt;/li&gt;&lt;li&gt;SE Initializes the .Net Assembly and hands over a "LSL BultIn Commands" object (this object is the scripts command-object)&lt;/li&gt;&lt;li&gt;Script Manager adds Script to an Object[].Script[] structure&lt;/li&gt;&lt;li&gt;&lt;strong&gt;By pressing a button in Test App an event is sent to SE&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;SE receives event and queues it to correct ObjectID + ScriptID&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Separate thread dequeues event and sends it to Script Manager&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Script Manager executes function&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;llSay() is displayed to debug console&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-7012472795805079839?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/7012472795805079839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=7012472795805079839&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7012472795805079839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7012472795805079839'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/small-milestone-reach-today.html' title='Small milestone reach today'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_rculTBw7Cnk/RrXuWAkARqI/AAAAAAAAAAM/giI_3faU4Bc/s72-c/LSL_EventTest.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-3092317694669666441</id><published>2007-08-05T09:53:00.000+02:00</published><updated>2007-08-30T09:43:10.055+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>Status on initial SE implementation</title><content type='html'>With the model described in the two prior postings we will have simple scripts support up and running fairly quickly.&lt;br /&gt;&lt;br /&gt;Other developers will be able to extend script support while I continue working on Compiler and ScriptEngine. Both incoming events and outgoing LSL builtin commands needs extending.&lt;br /&gt;&lt;br /&gt;We will lack script yield inserting. This is where the preparation of .dll for microthreading will happen.&lt;br /&gt;&lt;br /&gt;We will have a simplified version of Event Queue Manager that will use a custom threadpool to execute events and brutally kill any long-running events.&lt;br /&gt;&lt;br /&gt;We will havea simplified version of AppDomain handling that basically just loads all scripts into one AppDomain with no code security.&lt;br /&gt;&lt;br /&gt;We will have a basic LSL Compiler that can compile the simplest LSL scripts, but that others can extend command support for.&lt;br /&gt;&lt;br /&gt;In short, the scripts should be able to llSay() during rez. But can easily be extended by anyone to support the commands we need. The basic structure is in place, and we can build upon that bit by bit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-3092317694669666441?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/3092317694669666441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=3092317694669666441&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/3092317694669666441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/3092317694669666441'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/with-model-described-in-two-prior.html' title='Status on initial SE implementation'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-5952971169320624954</id><published>2007-08-05T08:25:00.000+02:00</published><updated>2007-08-30T09:43:10.055+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>ScriptEngine - Events</title><content type='html'>The builtin commands for SE is simple enough. But incoming events could need some more planning.&lt;br /&gt;&lt;br /&gt;SE will have a set of events that is fired based on stuff that happens in OpenSim (EventHandler). This EventHandler will translate the event into a LSL-compatible event, including picking up the required parameters.&lt;br /&gt;&lt;br /&gt;The EventHandler needs to know what object, and possibly what script, the event is for. Then it will queue this event for the correct script(s) (multiple scripts may subscribe to the same event in an object).&lt;br /&gt;&lt;br /&gt;A Event Queue Manager will process the event queue under a separate thread and execute the correct script functions with the correct parameters. By using a separate thread OpenSims event thread is free to return immediately.&lt;br /&gt;&lt;br /&gt;What scripts subscribe to what events is determined during script load. Either by dynamically identifying function names, or by having the script hook itself up during load. The functions will be stored by reference to avoid using expensive Reflection-calls for every script event.&lt;br /&gt;&lt;br /&gt;One possiblity for extra speed is to dynamically (using CIL) create a call object in same AppDomain as script is located that does some of Event Queue Managers work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-5952971169320624954?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/5952971169320624954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=5952971169320624954&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5952971169320624954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/5952971169320624954'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/scriptengine-events.html' title='ScriptEngine - Events'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-8008246150500760007</id><published>2007-08-04T20:43:00.000+02:00</published><updated>2007-08-30T09:43:10.055+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>ScriptEngine</title><content type='html'>The time has come to start implementing script support into OpenSim.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;ScriptEngine (SE)&lt;/strong&gt;&lt;br /&gt;OpenSim will have an interface for SE. It will load SE dynamically using reflection. SE will be in separate .dll Assembly.&lt;br /&gt;During load SE will hook itself up to the necessary events in OpenSim.&lt;br /&gt;This includes: Object rez (look for active scripts), object derez and all events relating to objects (touch, sit, etc).&lt;br /&gt;&lt;br /&gt;SE might also during startup need to iterate through existing objects to see what scripts it needs to start. This depends on at what point SE is loaded.&lt;br /&gt;&lt;br /&gt;All access to OpenSim from scripts will go through SE.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Compiler&lt;/strong&gt;&lt;br /&gt;When SE starts a script it will determine script type. If script type is LSO (LSL ByteCode) the script will be compiled into .Net Assembly .dll before load. Compiler is a separate .dll Assembly, but hardcoded into SE.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Loading scripts&lt;/strong&gt;&lt;br /&gt;* If script is LSO, compile to .Net Assembly&lt;br /&gt;* Modify .Net Assembly to support microthreading (will be done later in project)&lt;br /&gt;* Find available AppDomain for the script (currently only default appdomain)&lt;br /&gt;* Load script into AppDomain&lt;br /&gt;* Create a private instance of BuiltIn commands for the script&lt;br /&gt;* Create object of script handing it the private BuiltIn command instance&lt;br /&gt;&lt;br /&gt;Some BuiltIn functions will require information about who is executing them, for example for object permissions or feedback events. Because .Net Assembly can not be trusted (it is uploaded by users) ScriptEngine will create a private instance of BuiltIn commands. This instance will contain and pass on the necessary ID's to OpenSim - as well as work as a translator between LSL-functions and OpenSim API.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Operation&lt;/strong&gt;&lt;br /&gt;A script instance is made up of ScriptID and ObjectID. This should always result in an unique combination for any script.&lt;br /&gt;&lt;br /&gt;ScriptEngine will receive events from OpenSim and forward the events to the required scripts. During this forward it will also enforce microthreading.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Current Status&lt;/strong&gt;&lt;br /&gt;Class OpenSim.ScriptEngine.DotNetEngine.ScriptEngine has basic framework and is able to load and execute scripts. Only missing event hookups and actual implementation into OpenSim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-8008246150500760007?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/8008246150500760007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=8008246150500760007&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/8008246150500760007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/8008246150500760007'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/08/scriptengine.html' title='ScriptEngine'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4626046304088105597</id><published>2007-07-27T19:29:00.000+02:00</published><updated>2007-07-27T22:12:25.040+02:00</updated><title type='text'>Current status</title><content type='html'>Static and global variable support has been added. All push/pop functions added.&lt;br /&gt;&lt;br /&gt;Simple scripts that use variables, math and internal functions (like llSay) are now supported.&lt;br /&gt;Stack and all internal data are ready for serializing, so running script can be moved between servers - but no fibre/user space multitasking/microthreading has been implemented yet - so move has to happen between events.&lt;br /&gt;&lt;br /&gt;Missing support for local variables, custom functions, state, if-statements, jumps, receiving/pulling status on events, etc.&lt;br /&gt;&lt;br /&gt;So.. We can start implementation into server! :)&lt;br /&gt;In first version we'll run events using a thread. Maybe adding a timeout to the thread so that it will not run too long per script.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4626046304088105597?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4626046304088105597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4626046304088105597&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4626046304088105597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4626046304088105597'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/current-status.html' title='Current status'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4919606681559369241</id><published>2007-07-26T22:40:00.000+02:00</published><updated>2007-08-30T09:41:17.389+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>Current OPCODE implementation status</title><content type='html'>This is the current OPCODE implementation status:&lt;br /&gt;&lt;small&gt;&lt;pre&gt;&lt;br /&gt;OPCODE                  IL_Processor         Implemented&lt;br /&gt;&lt;br /&gt;NOOP                    *                    *&lt;br /&gt;POP                     *                    *&lt;br /&gt;POPS                    *                    *&lt;br /&gt;POPL                    *                    *&lt;br /&gt;POPV                    *                    *&lt;br /&gt;POPQ                    *                    *&lt;br /&gt;POPARG                  *                    *&lt;br /&gt;POPIP&lt;br /&gt;POPBP&lt;br /&gt;POPSP               &lt;br /&gt;POPSLR&lt;br /&gt;DUP&lt;br /&gt;DUPS&lt;br /&gt;DUPL&lt;br /&gt;DUPV&lt;br /&gt;DUPQ&lt;br /&gt;STORE                   *                    *&lt;br /&gt;STORES                  *                    *&lt;br /&gt;STOREL                  *                    *&lt;br /&gt;STOREV                  *                    *&lt;br /&gt;STOREQ                  *                    *&lt;br /&gt;STOREG                  *                    *&lt;br /&gt;STOREGS                 *                    *&lt;br /&gt;STOREGL                 *                    *&lt;br /&gt;STOREGV                 *                    *&lt;br /&gt;STOREGQ                 *                    *&lt;br /&gt;LOADP                   *                    *&lt;br /&gt;LOADSP                  *                    *&lt;br /&gt;LOADLP                  *                    *&lt;br /&gt;LOADVP                  *                    *&lt;br /&gt;LOADQP                  *                    *&lt;br /&gt;LOADGP                  *                    *&lt;br /&gt;LOADGSP                 *                    *&lt;br /&gt;LOADGLP                 *                    *&lt;br /&gt;LOADGVP                 *                    *&lt;br /&gt;LOADGQP                 *                    *&lt;br /&gt;PUSH                    *                    *&lt;br /&gt;PUSHS                   *                    *&lt;br /&gt;PUSHL                   *                    *&lt;br /&gt;PUSHV                   *                    *&lt;br /&gt;PUSHQ                   *                    *&lt;br /&gt;PUSHG                   *                    *&lt;br /&gt;PUSHGS                  *                    *&lt;br /&gt;PUSHGL                  *                    *&lt;br /&gt;PUSHGV                  *                    *&lt;br /&gt;PUSHGQ                  *                    *&lt;br /&gt;PUSHIP&lt;br /&gt;PUSHBP&lt;br /&gt;PUSHSP                  *                    *&lt;br /&gt;PUSHARGB&lt;br /&gt;PUSHARGI                *                    *&lt;br /&gt;PUSHARGF                *                    *&lt;br /&gt;PUSHARGS                *                    *&lt;br /&gt;PUSHARGV&lt;br /&gt;PUSHARGQ&lt;br /&gt;PUSHE                   *                    *&lt;br /&gt;PUSHEV&lt;br /&gt;PUSHEQ&lt;br /&gt;PUSHARGE                *&lt;br /&gt;ADD                     *                    *&lt;br /&gt;SUB                     *                    *&lt;br /&gt;MUL                     *                    *&lt;br /&gt;DIV                     *                    *&lt;br /&gt;MOD                     *                    *&lt;br /&gt;EQ                      *                    *&lt;br /&gt;NEQ                     *                    *&lt;br /&gt;LEQ                     *                    *&lt;br /&gt;GEQ                     *                    *&lt;br /&gt;LESS                    *                    *&lt;br /&gt;GREATER                 *                    *&lt;br /&gt;BITAND                  *                    *&lt;br /&gt;BITOR                   *                    *&lt;br /&gt;BITXOR                  *                    *&lt;br /&gt;BOOLAND                 *                    *&lt;br /&gt;BOOLOR                  *                    *&lt;br /&gt;NEG                     *                    *&lt;br /&gt;BITNOT                  *&lt;br /&gt;BOOLNOT                 *&lt;br /&gt;JUMP&lt;br /&gt;JUMPIF&lt;br /&gt;JUMPNIF&lt;br /&gt;STATE&lt;br /&gt;CALL&lt;br /&gt;RETURN                  *                    *&lt;br /&gt;CAST&lt;br /&gt;STACKTOS&lt;br /&gt;STACKTOL&lt;br /&gt;PRINT&lt;br /&gt;CALLLIB&lt;br /&gt;CALLLIB_TWO_BYTE        *                    *&lt;br /&gt;SHL&lt;br /&gt;SHR&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4919606681559369241?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4919606681559369241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4919606681559369241&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4919606681559369241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4919606681559369241'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/current-opcode-implementation-status.html' title='Current OPCODE implementation status'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-4996661816910637252</id><published>2007-07-26T09:30:00.000+02:00</published><updated>2007-07-26T09:32:51.008+02:00</updated><title type='text'>Book: CLR via C#, Second Edition</title><content type='html'>This morning I received the book I ordered from Amazon.com. 1 week before estimated arrival.&lt;br /&gt;&lt;br /&gt;The book is named CLR via C# (Second Edition) and is supposedly the bible of understanding CLR.&lt;br /&gt;&lt;br /&gt;So 648 pages from now I should be able to utilize my new skills in the LSO project... :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-4996661816910637252?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/4996661816910637252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=4996661816910637252&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4996661816910637252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/4996661816910637252'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/book-clr-via-c-second-edition.html' title='Book: CLR via C#, Second Edition'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-3587152380683895126</id><published>2007-07-21T21:26:00.001+02:00</published><updated>2007-08-30T09:39:36.345+02:00</updated><title type='text'>Looking ahead, fibres</title><content type='html'>&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Running&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;thousands&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;of&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;scripts&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;simultaneously&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;on&lt;/span&gt; a grid requires some special programming. We can not just issue one thread per script and let it run. The resources required by each OS thread,both in terms of memory and thread switching is too high.&lt;br /&gt;&lt;br /&gt;Instead we want to execute a few instructions of a script, then move to the next script. All status about execution location, memory, etc. must be kept within each script. So when the execution thread is moving between scripts it carries no payload from any of the scripts.&lt;br /&gt;&lt;br /&gt;An important thing about computer technology is learning about the past. Because old technology is recycled all the time. In this case one could look at the "multitasking" done in Windows 3.11 to pick up a few ideas. Or Windows NT's "fibre" support, a lightweight user space implementation of threads. And that is what it all boils down to, user space threading.&lt;br /&gt;&lt;br /&gt;The clue here is to insert code into the script that will save it's position, mark next spot with a "label" so it can jump to that position later, and exit execution. (details will follow once I get this far in the project)&lt;br /&gt;&lt;br /&gt;There are two points where I can insert this data. Either during convert, or before load. Before load would be preferred as we then could load any .Net Assembly - great for future .Net scripting support. But the easiest way is during convert. And since this is Version 1 I will follow the easiest road.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-3587152380683895126?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/3587152380683895126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=3587152380683895126&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/3587152380683895126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/3587152380683895126'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/looking-ahead-fibres.html' title='Looking ahead, fibres'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-844892986639679002</id><published>2007-07-21T21:16:00.000+02:00</published><updated>2007-08-30T09:41:17.390+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>Frames, heap and code pointers</title><content type='html'>LSL ByteCode uses a lot of pointers, both to memory (static frames, local/global, heap) as well as JUMP pointers.&lt;br /&gt;&lt;br /&gt;Some of these pointers exist during load, for example argument types, static data, jump positions, etc. While others are allocated and created dynamically during run-time. What they all have in common is that they point to a position in the 16k LSO ByteCode file.&lt;br /&gt;&lt;br /&gt;For memory pointers I'm planning to use a dictionary (or possibly an array), where key will be position and data the actual datastructure.&lt;br /&gt;&lt;br /&gt;For JUMP positions I will need to scan the code first for JUMP's, then create MSIL labels in the code at these positions. This might require a two-pass run on the ByteCode.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-844892986639679002?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/844892986639679002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=844892986639679002&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/844892986639679002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/844892986639679002'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/frames-heap-and-code-pointers.html' title='Frames, heap and code pointers'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-2065264093499406919</id><published>2007-07-21T21:07:00.000+02:00</published><updated>2007-08-30T09:41:17.390+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>Stack issues</title><content type='html'>In my first attempt I used the .Net stack and did a direct translation from the LSO ByteCode. I found that there are a couple of problems related to that.&lt;br /&gt;&lt;br /&gt;First of all is the obvious problem that I stated earlier, I don't know what datatype is in the stack - but many (most) .Net commands requires me to know that. Wherever LSO can provide datatype for me it is ok, but in many cases LSO is not providing me with that datatype. For example during casting.&lt;br /&gt;&lt;br /&gt;Next is the problem that .Net wants the stack served like "classlocation, param1, param2, call to command in classlocation". This means that I need to predict commands before PUSH'ing anything to the stack. Way to complex. I could of course juggle the stack, but not so cool.&lt;br /&gt;&lt;br /&gt;So I've made a few changes.&lt;br /&gt;&lt;br /&gt;First of all I'm now inheriting the compiled .Net assembly from a baseclass. In this baseclass I've added my own Stack(object), and created my own (generic) PUSH/POP/POPToStack commands. (PUSH to my stack, POP from my stack and POP from my stack to .Net's stack)&lt;br /&gt;&lt;br /&gt;Secondly I'm creating most OPCODES as commands in C# (the base class) that is called from the converted LSO ByteCode. This way I have full control of both stack and OPCODE behaviour.&lt;br /&gt;&lt;br /&gt;The bonus is that my stack now is in a single object that can be serialized.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-2065264093499406919?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/2065264093499406919/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=2065264093499406919&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2065264093499406919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2065264093499406919'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/stack-issues.html' title='Stack issues'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-6271981329583851669</id><published>2007-07-14T10:07:00.000+02:00</published><updated>2007-08-30T09:41:17.391+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>LSL scripting support -  Progress report</title><content type='html'>Ok, time for status update again...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Code is currently able to convert from LSL ByteCode to .Net IL, compile it and save it to disk.&lt;br /&gt;I've moved the code from a quick and dirty hack (that compiled the first script) to a bit more organized. It's still a mess, but that can be fixed later. The goal is simply "Version 1: Functional.".&lt;br /&gt;&lt;br /&gt;So basically I'm able to convert simple LSL ByteCode-files into .Net .dll. If you load the script (.dll) into Visual Studio you will see the events (from server to script). If you provide the script (.dll) with an object with the righ inheritance the script (.dll) will use that objects LL-functions. Currently only llSay(); is implemented (mapped to Console.WriteLine). This is how the script communicated with the server.&lt;br /&gt;&lt;br /&gt;I've added support for a few more OPCODES, so we support basic math and most PUSH/POP functions. Because LSL ByteCode based itself on pure memory addressing and .Net CLR/IL is object oriented a few of the functions will be tricky to implement. For example LSL wants to push a string followed by xx 0x000's to memory, then perform an operation and remove two bytes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Server to script&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For each event in the script I create one function that the server can execute. These functions needs to be late bound during load of .dll. I'm dynamically creating functions for each state+event combination. Because of the naming scheme, and the fact that a script seldonly listen on all events, I've not used any interface for this. The available events can be fetched through a GetEvents() functions that is hardcoded into the assembly when script is converted.&lt;br /&gt;Also the required parameters for each function is created dynamically from the information in the LSO-file.&lt;br /&gt;&lt;br /&gt;The naming scheme will be different once I'm done. Maybe something like a switch() inside each event to determine what code chunk should be executed based on what state number we are in.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;small&gt;&lt;br /&gt;UInt32 LSLObj.State; // Contains current state number&lt;br /&gt;public void 0_event_state_entry() {} // state_entry event in state number 0&lt;br /&gt;public void 1_event_state_entry() {} // state_entry event in state number 1&lt;br /&gt;public void 0_event_touch_start() {}  // touch_start event instate number 0&lt;br /&gt;&lt;/small&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Script to server&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I've created an interface for all LSL builtin commands, and another class that inherits the interface. All the functions are there, but they are empty and don't have the correct arguments. Anyone can help to add commands by changing this class. This is probably the single remaining area that requires most work. (not sure though)&lt;br /&gt;&lt;br /&gt;Since most PUSH/POP and math commands are supported already, we just need to map the builtin function calls to the above mentioned class. This is a simple Switch()-case hardcoding issue.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;TODO:&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;From the top of my head, not in any particular order.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Support custom functions (currently only LL server events gets compiled) &lt;/li&gt;&lt;ul&gt;&lt;li&gt;Compiling them is easy, but I need to be able to bind them to Call OPCODE somehow. (IL issue)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Figure out how to reference the LSL builtin commands C# class from IL (IL issue)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Then bind all ll* functions &lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Add support for remaining OPCODES (IL issue)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;This can be a bit tricky since LSL uses memory addressing in stack while .Net IL is object oriented. One possible solution is to implement same memory scheme as LL is using. Either way it's not a big problem, just a bit of work.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Figure out what OPCODES needs special (custom) commands in order to support interregional transfers and user space multitasking - instead of running CLR/IL OPCODE we run a C# function that does the required work.&lt;/li&gt;&lt;li&gt;Figure out how one can cast an element in CLR/IL stack without knowing its type, or - keeping track of all types in stack.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;LSL is a bit like "&lt;em&gt;push string, push long, convert to string, concat, push long(channel id), llSay()&lt;/em&gt;". Its asking me to cast whatever is on the stack, but CLR/IL requires me to know what type I'm casting from.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Figure out how to clear CLR/IL stack. CLR/IL requires stack to be empty on return. LSL sometimes leaves items in the stack. For now a Try:Catch is handling the issue.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The full source is here: &lt;a href="http://www.konge.net/OpenSim/OpenSim.Region.Scripting_r1.zip"&gt;http://www.konge.net/OpenSim/OpenSim.Region.Scripting_r1.zip&lt;/a&gt;.&lt;br /&gt;Please note that this source belongs to OpenSim project (&lt;a href="http://opensecondlife.org/wiki/OpenMetaverse"&gt;http://opensecondlife.org/wiki/OpenMetaverse&lt;/a&gt;) and is licensed thereafter.&lt;br /&gt;&lt;br /&gt;Download, run project, choose a LSO-file (for example CloseToDefault.LSO), then process it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="LSL running in .Net" src="http://www.konge.net/OpenSim/OpenSim.Region.Scripting_r1.jpg" border="0" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-6271981329583851669?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/6271981329583851669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=6271981329583851669&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6271981329583851669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/6271981329583851669'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/lovely-even-more.html' title='LSL scripting support -  Progress report'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-7226028881644608574</id><published>2007-07-12T22:48:00.001+02:00</published><updated>2007-08-30T09:41:17.391+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>Making some progress</title><content type='html'>Today I found a "final bug" in my LSL ByteCode parser, and was able to get read seemingly clean ByteCode. I also made a quick hack of merging the CLR RunTime code generator with the LSL ByteCode parser, and compiled my first small function.&lt;br /&gt;It works! :)&lt;br /&gt;&lt;br /&gt;Also writing the compiled script to a .dll-file. Necessary as the only way I know of to debug CLR is through the loveable PEVerifier.EXE.&lt;br /&gt;&lt;br /&gt;Of course most work remains. States are not supported, dynamic function names not supported, only one OPCODE (PUSHS - push string to stack) and only one BUILTIN command (llSay mapped to Debug.WriteLine) is supported.&lt;br /&gt;&lt;br /&gt;Not to mention user space multitasking and moving a running script between regions.&lt;br /&gt;&lt;br /&gt;Notice the last two lines of this log...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Debug: Opening filename: LSO\CloseToDefault.lso&lt;br /&gt;Debug: Reading HEADER BLOCK at: 0&lt;br /&gt;Debug: TM - Top of memory (size): 16384&lt;br /&gt;Debug: IP - Instruction Pointer (0=not running): 0&lt;br /&gt;Debug: VN - Version number: 512&lt;br /&gt;Debug: BP - Local Frame Pointer: 16383&lt;br /&gt;Debug: SP - Stack Pointer: 16383&lt;br /&gt;Debug: HR - Heap Register: 233&lt;br /&gt;Debug: HP - Heap Pointer: 240&lt;br /&gt;Debug: CS - Current State: 0&lt;br /&gt;Debug: NS - Next State: 0&lt;br /&gt;Debug: CE - Current Events: 0&lt;br /&gt;Debug: IE - In Event: 0&lt;br /&gt;Debug: ER - Event Register: 0&lt;br /&gt;Debug: FR - Fault Register: 0&lt;br /&gt;Debug: SLR - Sleep Register: 0&lt;br /&gt;Debug: GVR - Global Variable Register: 100&lt;br /&gt;Debug: GFR - Global Function Register: 100&lt;br /&gt;Debug: PR - Parameter Register: 0&lt;br /&gt;Debug: ESR - Energy Supply Register: 0&lt;br /&gt;Debug: SR - State Register: 100&lt;br /&gt;Debug: NCE - 64-bit Current Events: 1&lt;br /&gt;Debug: NIE - 64-bit In Events: 0&lt;br /&gt;Debug: NER - 64-bit Event Register: 5&lt;br /&gt;Debug: Read position when exiting HEADER BLOCK: 100&lt;br /&gt;Debug: Reading STATIC BLOCK at: 100&lt;br /&gt;Debug: Number of Static Blocks read: 0&lt;br /&gt;Debug: No FUNCTION BLOCK found&lt;br /&gt;Debug: Reading STATE BLOCK at: 100&lt;br /&gt;Debug: Reading STATE POINTER BLOCK 1 at: 104&lt;br /&gt;Debug: Pointer: 116&lt;br /&gt;Debug: Total potential EventMask bits: 64&lt;br /&gt;Debug: Reading STATE BLOCK 1 at: 116&lt;br /&gt;Debug: State block Start Pos: 116&lt;br /&gt;Debug: State block Header Size: 5&lt;br /&gt;Debug: State block Header End Pos: 121&lt;br /&gt;Debug: Reading STATE BLOCK 1 HANDLER matching EVENT MASK 0 (state_entry) at: 121&lt;br /&gt;Debug: Reading STATE BLOCK 1 HANDLER EVENT MASK 0 (state_entry) Code Chunk Pointer: 137&lt;br /&gt;Debug: Reading STATE BLOCK 1 HANDLER EVENT MASK 0 (state_entry) Call Frame Size: 0&lt;br /&gt;Debug: Reading STATE BLOCK 1 HANDLER matching EVENT MASK 2 (touch_start) at: 129&lt;br /&gt;Debug: Reading STATE BLOCK 1 HANDLER EVENT MASK 2 (touch_start) Code Chunk Pointer: 181&lt;br /&gt;Debug: Reading STATE BLOCK 1 HANDLER EVENT MASK 2 (touch_start) Call Frame Size: 4&lt;br /&gt;Debug: Reading Event Code Chunk state 0, event state_entry&lt;br /&gt;Debug: CLR:event_state_entry:MethodBuilder methodBuilder = typeBuilder.DefineMethod...&lt;br /&gt;Debug: CLR:event_state_entry:typeBuilder.DefineMethodOverride(methodBuilder...&lt;br /&gt;Debug: CLR:event_state_entry:ILGenerator il = methodBuilder.GetILGenerator();&lt;br /&gt;Debug: Reading Function Code Chunk at: 137&lt;br /&gt;Debug: CodeChunk Header Size: 5&lt;br /&gt;Debug: Function comment:&lt;br /&gt;Debug: Return type: 99&lt;br /&gt;Debug: Reading Code Chunk Argument 1&lt;br /&gt;Debug: Code Chunk Argument 1 return type: 94&lt;br /&gt;Debug: OPCODE: NOOP&lt;br /&gt;Debug: OPCODE: NOOP&lt;br /&gt;Debug: OPCODE: NOOP&lt;br /&gt;Debug: OPCODE: PUSHARGS&lt;br /&gt;Debug: Param1: Hello, Tedd!&lt;br /&gt;Debug: OPCODE: PUSHARGE&lt;br /&gt;Debug: Param1: 0&lt;br /&gt;Debug: OPCODE: PUSHSP&lt;br /&gt;Debug: OPCODE: PUSHARGI&lt;br /&gt;Debug: Param1: 8&lt;br /&gt;Debug: OPCODE: ADD&lt;br /&gt;Debug: Param1: 17&lt;br /&gt;Debug: OPCODE: POPBP&lt;br /&gt;Debug: OPCODE: CALLLIB_TWO_BYTE&lt;br /&gt;Debug: Param1: 23&lt;br /&gt;Debug: OPCODE: RETURN&lt;br /&gt;Debug: Last OPCODE was return command. Code chunk execution complete.&lt;br /&gt;Debug: CLR:event_state_entry:il.BeginCatchBlock(typeof(Exception));&lt;br /&gt;Debug: CLR:event_state_entry:il.Emit(OpCodes.Ldstr...&lt;br /&gt;Debug: CLR:event_state_entry:il.Emit(OpCodes.Call...&lt;br /&gt;Debug: CLR:event_state_entry:il.Emit(OpCodes.Callvirt...&lt;br /&gt;Debug: CLR:event_state_entry:il.Emit(OpCodes.Call...&lt;br /&gt;Debug: Reading Event Code Chunk state 0, event touch_start&lt;br /&gt;Debug: CLR:event_touch_start:MethodBuilder methodBuilder = typeBuilder.DefineMethod...&lt;br /&gt;Debug: CLR:event_touch_start:typeBuilder.DefineMethodOverride(methodBuilder...&lt;br /&gt;Debug: CLR:event_touch_start:ILGenerator il = methodBuilder.GetILGenerator();&lt;br /&gt;Debug: Reading Function Code Chunk at: 181&lt;br /&gt;Debug: CodeChunk Header Size: 5&lt;br /&gt;Debug: Function comment:&lt;br /&gt;Debug: Return type: 99&lt;br /&gt;Debug: Reading Code Chunk Argument 1&lt;br /&gt;Debug: Code Chunk Argument 1 return type: 94&lt;br /&gt;Debug: OPCODE: NOOP&lt;br /&gt;Debug: OPCODE: NOOP&lt;br /&gt;Debug: OPCODE: NOOP&lt;br /&gt;Debug: OPCODE: PUSHARGS&lt;br /&gt;Debug: Param1: Object was touched.&lt;br /&gt;Debug: OPCODE: PUSHARGE&lt;br /&gt;Debug: Param1: 0&lt;br /&gt;Debug: OPCODE: PUSHSP&lt;br /&gt;Debug: OPCODE: PUSHARGI&lt;br /&gt;Debug: Param1: 8&lt;br /&gt;Debug: OPCODE: ADD&lt;br /&gt;Debug: Param1: 17&lt;br /&gt;Debug: OPCODE: POPBP&lt;br /&gt;Debug: OPCODE: CALLLIB_TWO_BYTE&lt;br /&gt;Debug: Param1: 23&lt;br /&gt;Debug: OPCODE: POP&lt;br /&gt;Debug: OPCODE: RETURN&lt;br /&gt;Debug: Last OPCODE was return command. Code chunk execution complete.&lt;br /&gt;Debug: CLR:event_touch_start:il.BeginCatchBlock(typeof(Exception));&lt;br /&gt;Debug: CLR:event_touch_start:il.Emit(OpCodes.Ldstr...&lt;br /&gt;Debug: CLR:event_touch_start:il.Emit(OpCodes.Call...&lt;br /&gt;Debug: CLR:event_touch_start:il.Emit(OpCodes.Callvirt...&lt;br /&gt;Debug: CLR:event_touch_start:il.Emit(OpCodes.Call...&lt;br /&gt;Starting CLR dynamic execution of: event_state_entry&lt;br /&gt;Hello, Tedd!&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-7226028881644608574?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/7226028881644608574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=7226028881644608574&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7226028881644608574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/7226028881644608574'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/making-some-progress.html' title='Making some progress'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-607379321007879161</id><published>2007-07-12T10:44:00.000+02:00</published><updated>2007-08-30T09:41:17.391+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>.Net CLR Runtime</title><content type='html'>The first thing I did was to see if .Net CLR looked anything like LSL ByteCode at all. As expected it did. It should be possible to convert between the two. But because we need to have scripts cross sims, the standard way of doing things might not suffice.&lt;br /&gt;&lt;br /&gt;So, next question. How does one create CLR? Well, there are many ways. The ones I looked at as potential candidates was 1) creating an CLR code file and compiling and 2) creating CLR code run-time.&lt;br /&gt;I chose to go with the latter one.&lt;br /&gt;&lt;br /&gt;Here is the important part of my sample Hello World! run-time generated CLR program. The biggest Hello World! program I've ever made.&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;pre&gt;private void GenerateIL(ILGenerator il, OpenSimAPI.SimWorldAPI WorldAPI)&lt;br /&gt;{&lt;br /&gt;/*&lt;br /&gt; * TRY&lt;br /&gt; */&lt;br /&gt;il.BeginExceptionBlock();&lt;br /&gt;// Push "Hello World!" string to stack&lt;br /&gt;il.Emit(OpCodes.Ldstr, "Hello World!");&lt;br /&gt;Push Console.WriteLine command to stack ... Console.WriteLine("Hello World!");&lt;br /&gt;il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));&lt;br /&gt;&lt;br /&gt;il.ThrowException(typeof(NotSupportedException));&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt; * CATCH&lt;br /&gt; */&lt;br /&gt;il.BeginCatchBlock(typeof(Exception));&lt;br /&gt;// Push "Hello World!" string to stack&lt;br /&gt;il.Emit(OpCodes.Ldstr, "Something went wrong: ");&lt;br /&gt;//call void [mscorlib]System.Console::WriteLine(string)&lt;br /&gt;il.Emit(OpCodes.Call, typeof(Console).GetMethod("Write", new Type[] { typeof(string) }));&lt;br /&gt;//callvirt instance string [mscorlib]System.Exception::get_Message()&lt;br /&gt;il.Emit(OpCodes.Callvirt, typeof(Exception).GetMethod("get_Message"));&lt;br /&gt;//call void [mscorlib]System.Console::WriteLine(string)&lt;br /&gt;il.Emit(OpCodes.Call,&lt;br /&gt;typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));&lt;br /&gt;/*&lt;br /&gt; * END TRY&lt;br /&gt; */&lt;br /&gt;il.EndExceptionBlock();&lt;br /&gt;&lt;br /&gt;// Push "Return from current method, with return value if present" to stack&lt;br /&gt;il.Emit(OpCodes.Ret);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-607379321007879161?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/607379321007879161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=607379321007879161&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/607379321007879161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/607379321007879161'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/net-clr-runtime.html' title='.Net CLR Runtime'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-1126726230375805504</id><published>2007-07-12T10:32:00.000+02:00</published><updated>2007-08-30T09:41:17.392+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LSO'/><category scheme='http://www.blogger.com/atom/ns#' term='MSIL'/><title type='text'>LSO / LSL ByteCode</title><content type='html'>&lt;p&gt;The task I've taken on me is to create script support for the OpenSim server.&lt;/p&gt;&lt;p&gt;This involves reading the compiled LSL script (LSL ByteCode, machine code for those who haven't heard of ByteCode) and executing it somehow.&lt;/p&gt;The plan is to convert LSL ByteCode into .Net ByteCode, passing it through .Net CLR (MSIL/.Net Assembly Language) and having the JIT (Just In Time) compiler to optimizations.&lt;br /&gt;&lt;br /&gt;The result should be blazing fast execution (operating system specific native code) operating within the .Net Virtual Machine.&lt;br /&gt;&lt;br /&gt;Security will be through .Net's AppDomain restrictions. Powerfull enough in itself so we don't have to worry about anything security-related.&lt;br /&gt;&lt;br /&gt;LSL Builtin function implementation will be done through a C# middle layer, since it is mostly specific to LSL. This will also allow other developers to implement the functions while I continue hacking on the rest of LSL-support.&lt;br /&gt;&lt;br /&gt;There are two tricky parts to this project.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Running multiple scripts simultaneous&lt;/li&gt;&lt;li&gt;Allowing scripts to cross regions while running, thus moving script to another server.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Running multiple scripts simultaneous can not be done by assigning threads to scripts, because the number of scripts will be too high. Therefore user space threading (fibres) has to be implemented. The plan is to do this by inserting breakpoints into the CLR code that allows script execution to jump out and continue execution at a later point.&lt;/p&gt;&lt;p&gt;Solving multitasking in that manner also makes it easier solving the problem of allowing scripts to cross regions while running, since their current execution state can be saved to file and resumed later. The trick is to make sure that stack/heap/all memory is saved in the same manner.&lt;/p&gt;&lt;p&gt;So, let's see how it goes... :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-1126726230375805504?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/1126726230375805504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=1126726230375805504&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/1126726230375805504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/1126726230375805504'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/lso-lsl-bytecode.html' title='LSO / LSL ByteCode'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-2313844711143091295</id><published>2007-07-12T10:29:00.000+02:00</published><updated>2007-08-30T09:39:36.347+02:00</updated><title type='text'>Second Life</title><content type='html'>&lt;p&gt;Second Life is a virtual world created by you and me. It's like Web 2.0, only World 2.0. Meaning you can make, do and find anything there. And it is growing really fast.&lt;/p&gt;&lt;p&gt;Many many many years ago, back in the late 90's when I was still young, I played around with the thought of creating such world. I had it all figured out, but 3D programming has never been of much interest to me. I made some fun sin/cos algorithms and made my own name spin in 3D back in QBasic and DOS days. Played around with DirectX and WildTangent. But never anything serious. And now someone has made it (SL), even better than I imagined. Happy happy! :)&lt;/p&gt;&lt;p&gt;Safe to say, I like it. But its still very limited. I can make a few objects and a few scripts. But I want to make animals with artificial intelligence, even a full ecosystem. This would require a freedom LSL and Lindens servers can not offer at this time.&lt;/p&gt;&lt;p&gt;I played around a bit with libsecondlife to control my character, and sure it was fun enough, but not what I was looking for.&lt;/p&gt;&lt;p&gt;So I found out someone had started writing OpenSim. An Open Source implementation of Second Life server. And less than 2 weeks ago I joined the project.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-2313844711143091295?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/2313844711143091295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=2313844711143091295&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2313844711143091295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2313844711143091295'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/second-life.html' title='Second Life'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-314355772961625650</id><published>2007-07-12T10:19:00.001+02:00</published><updated>2007-08-30T09:39:07.108+02:00</updated><title type='text'>My Character</title><content type='html'>I'm Tedd Maa in Second Life.&lt;br /&gt;One of Tedd Hansens cyberegos.&lt;br /&gt;&lt;br /&gt;I joined Second Life aprox 1 year ago, and have been looking at what people have built, done some scripting and made my own bot using libsecondlife.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-314355772961625650?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/314355772961625650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=314355772961625650&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/314355772961625650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/314355772961625650'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/my-character.html' title='My Character'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9148893400862147211.post-2566470596372075975</id><published>2007-07-12T10:14:00.000+02:00</published><updated>2007-07-12T10:15:24.260+02:00</updated><title type='text'>Hello World!</title><content type='html'>Hello World!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9148893400862147211-2566470596372075975?l=teddmaa.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teddmaa.blogspot.com/feeds/2566470596372075975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9148893400862147211&amp;postID=2566470596372075975&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2566470596372075975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9148893400862147211/posts/default/2566470596372075975'/><link rel='alternate' type='text/html' href='http://teddmaa.blogspot.com/2007/07/hello-world.html' title='Hello World!'/><author><name>Tedd Hansen</name><uri>http://www.blogger.com/profile/00028723485251804736</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
