<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Adam Frisby</title>
	<atom:link href="http://www.adamfrisby.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.adamfrisby.com/blog</link>
	<description>ZOMGWTFHAI</description>
	<pubDate>Wed, 19 Nov 2008 06:39:44 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>OpenSim 0.6 Goals - IClientAPI Overhaul</title>
		<link>http://www.adamfrisby.com/blog/2008/11/opensim-06-goals-iclientapi-overhaul/</link>
		<comments>http://www.adamfrisby.com/blog/2008/11/opensim-06-goals-iclientapi-overhaul/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 06:39:44 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[OpenSim]]></category>

		<category><![CDATA[IClientAPI]]></category>

		<category><![CDATA[IClientCore]]></category>

		<category><![CDATA[internals]]></category>

		<category><![CDATA[porting]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=84</guid>
		<description><![CDATA[One of the goals of the 0.6.0 release is to replace the current IClientAPI interface with something that will improve compatibility down the road with alternative clients. Instead of our current model where we dictate the features that clients must support, the new model will allow clients to pick and choose features we handle, and [...]]]></description>
			<content:encoded><![CDATA[<p>One of the goals of the 0.6.0 release is to replace the current IClientAPI interface with something that will improve compatibility down the road with alternative clients. Instead of our current model where we dictate the features that clients must support, the new model will allow clients to pick and choose features we handle, and then implement them.</p>
<p>The basic way this is handled, is through the new &#8216;IClientCore&#8217; interface. We introduced the IClientCore interface within a few hours of version 0.6.0 being tagged - however switching to the interface internally will take some time - probably a month or two, so any projects using IClientAPI are still safe.</p>
<p>As many of you who have played with writing region modules will know, IClientAPI represents everything you can do to every possible client - as one may guess, this doesnt scale when you begin adding multiple different clients into the mix. It also makes things difficult when two clients have the same feature in radically different ways.</p>
<p><img src="http://www.gwala.net/iclientapi.png" alt="A diagram of IClientAPI" width="549" height="135" /></p>
<p>As you can see in the diagram above - all the particulars of IClientAPI are bundled up together as one common interface. It is convenient - but it&#8217;s also problematic when it comes to implementing a new client, as you need to stub out every single function - and modules cannot tell whether a particular event or function was simply ignored by the client as unsupported.</p>
<h3>Enter IClientCore</h3>
<p>IClientCore is presently a very narrow interface - we&#8217;re defining it as everything a client must support, whether it likes it or not. As a consequence - we&#8217;re sticking to things that every single client has and implements in a common manner.</p>
<p>In practice - this means IClientCore dictates only the Name, ID and other very common internal parameters. It also needs to support two new &#8217;special&#8217; interfaces - Get&lt;IFace&gt;() and TryGet&lt;IFace&gt;(IFace out). These last two are the keys to how the new system works.</p>
<p><img src="http://www.gwala.net/iclientcore.png" alt="IClientCore" width="549" height="174" /></p>
<p>Under the new system - we implement interfaces for Chat, Primitives, and each seperate functionality group. It&#8217;s then possible to use, &#8216;IClientCore.TryGet&lt;IClientChat&gt;(&#8230;)&#8217; which returns an interface to this clients IChat interface. If the client doesnt support chatting - then TryGet returns false.</p>
<p>The first most obvious question to arise here is related to how this looks more complicated than it used to be, and that&#8217;s definetely true - where we differ is that the new model means you need to check a client supports something before attempting to use it.</p>
<p>Previously we had no way from modules to indicate whether a feature was supported on clients - and we also had no way of handling extensions. This also means that if you choose to implement a new Client adapter for OpenSim, you dont need to implement the previous 350 functions and ignore any custom ones. You can write new interfaces for your custom features, and only implement interfaces from the Linden Viewer where you think you share enough functionality to make it useful.</p>
<p>In most cases - the changes arent fairly significant, you can see a comparison of two functions under the old and the new in the <a href="http://opensimulator.org/wiki/OpenSim_0.6_IClientAPI">porting guide I wrote</a>.</p>
<p>If anyone has any comments or questions relating to this, please let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/11/opensim-06-goals-iclientapi-overhaul/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Logging into an OpenSim via realXtend accounts</title>
		<link>http://www.adamfrisby.com/blog/2008/11/logging-into-an-opensim-via-realxtend-accounts/</link>
		<comments>http://www.adamfrisby.com/blog/2008/11/logging-into-an-opensim-via-realxtend-accounts/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 04:21:54 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[DeepThink]]></category>

		<category><![CDATA[OpenSim]]></category>

		<category><![CDATA[modrex]]></category>

		<category><![CDATA[modular]]></category>

		<category><![CDATA[modules]]></category>

		<category><![CDATA[realxtend]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=83</guid>
		<description><![CDATA[
Previously&#8230;
For those who havent been reading up on the OpenSim IRC channels or mailing list, your probably not aware of the work we&#8217;re doing at DeepThink for the realXtend team.
For the last month and a half, we&#8217;ve been working with the realXtend team to convert their version of OpenSimulator, to something that closer resembles a [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.gwala.net/modular_rex2.png" alt="Modular realXtend Login" width="680" height="300" /></p>
<h3>Previously&#8230;</h3>
<p>For those who havent been reading up on the OpenSim IRC channels or mailing list, your probably not aware of the work we&#8217;re doing at DeepThink for the realXtend team.</p>
<p>For the last month and a half, we&#8217;ve been working with the realXtend team to convert their version of OpenSimulator, to something that closer resembles a suite of OpenSim plugins rather than a fork. Part of this work has been some sponsored contributions to improving the modularity of OpenSim itself with alternate clients (like the IClientAPI changes that are currently in progress), the other part has been conversion of the current realXtend server into a single plugin DLL called &#8216;ModularRex.dll&#8217; which encompasses all the previous internal changes.</p>
<p>The single biggest bit of news however is, once this is done - realXtend is no longer a fork of OpenSim. It&#8217;s not opensim stock, but it&#8217;s not a seperate codebase either. Patches from realXtend can be applied fairly smoothly towards OpenSim-trunk and vice-versa, because the core files are unchanged.</p>
<p>Now we&#8217;re not done yet, but we&#8217;re making some pretty steady progress to getting there by the end of the year - today marks the date at which the core architectural bits and pieces are mostly done and the realXtend <a href="http://www.adminotech.com">server developers</a> can get onboard and help finish the rest.</p>
<p>The code for the modular rex DLL&#8217;s is located on the <a href="http://forge.opensimulator.org/gf/project/modrex/">forge project for it</a>. It may not always represent the latest testing versions (since we&#8217;re working offline a lot), but we&#8217;re doing checkins every now and then - if you&#8217;re interested in following progress, that&#8217;s the best spot to go. Future development will be going on on the forge exclusively however.</p>
<h3>Multiple Concurrent Clients</h3>
<p>One of the largest feature&#8217;s we&#8217;ve now got with the latest version is the ability to insert clients into the scene while bypassing the normal login routines. This may not sound like much - but the technology needed to support this, is the same technology that will allow you to login with two completely different virtual world clients and have a conversation between them, while viewing potentially the same content.</p>
<p>The new ModularRex code skips all the current login methods and actually has a new subclassed and derived version which it enables entirely through a shared region module. In future - we may be able to take this same methodology and convert the current login and protocol handling routines into their own modules which allows them to be replaced without effort.</p>
<h3>ModRex Support Table</h3>
<p>Features</p>
<ul>
<li><strong>Rex Avatars </strong>- We support all the packeting for the avatars now, however we do not automatically send this on login <em>yet</em>. If you know your rexav address, you can just type &#8220;/rexav http://somewhere.com/myav&#8221; in chat to set the parameter manually - or you can wait a few days now that we have login implemented and we can get to setting it automatically.</li>
<li><strong>Rex Logins</strong> - You can now login with a traditional rex username, that is you can login with &#8220;username@hostname.com&#8221;, and your authentication server will authorise you instead of a direct login.</li>
</ul>
<p>Infrastructure</p>
<ul>
<li><strong>Rex Packet Handling via RexClientView</strong> - We implement a IClientNetworkServer compatible interface which deals specifically with the modified realXtend protocol. This is subclassed from LLClientView / LLUDPServer / LLPacketServer but contains overrides and new methods to represent realXtend features.</li>
<li><strong>Rex Methods and Events on ClientView</strong> - We now process a number of the realXtend events and packets and fire new &#8216;OnRexXYZ&#8217; events that you can use to send specific things to users. This does not effect IClientAPI, rather these are members of RexClientView which means you need to check the client supports features before using them. Currently, we&#8217;re sitting at about 13 of 36 handlers - however we&#8217;re 13/13[?] if you exclude methods related to RexPython (as of 0.31, there are likely going to be new things to support with the upcoming Rex release).</li>
</ul>
<p>The TODO List</p>
<ul>
<li><strong>Conversion to IClientCore</strong> - We started a lot of the conversion work before 0.6.0 was tagged, this means that the realXtend modules use a older method for checking client capabilities. We need to convert it to the new IClientCore interface to allow us standardised access to extension capabilities in modules.</li>
<li><strong>Finish SceneObjectGroup/SceneObjectPart Overloads</strong> - We&#8217;re inheriting and extending from the SOG/SOP interfaces to add additional rex-only properties to objects. There&#8217;s a degree of difficulty involved here which may nessecitate additional metadata fields in SOG/SOP. A post to OpenSim-dev will be coming shortly no doubt with some suggestions there. This is needed to be able to get rex meshes and other special object features working.</li>
<li><strong>Provide RexCommsManager</strong> - One of the limitations right now with the modular rex code is that Rex Logins (see above) dont provide a valid UserProfile class, because the Rex protocol there is different to OGS1. We need to provide an additional comms manager to allow Rex avatars to be handled correctly, or abstract OpenSim to allow ClientView to indicate the type of CommsManager it needs. This will also allow the global inventory features to be re-enabled (however moving them to the client may be a smarter long term move).</li>
<li><strong>Write generic LibRexAuth</strong> - A problem with the current dealings with the authentication server are that they are fairly hard coded for specific features. It would be nice to add a library or static class which can provide simple functions such as &#8216;GetProfileByAccountName&#8217; or &#8216;IsUserAuthorised&#8217; - this allows us to communicate better with the authentication server, saving hassle and headache and centralising things so that problems are more easily fixable. A similar class may be useful for the avatar server - however the simulator&#8217;s dealings with that server are very limited.</li>
<li><strong>Python</strong> - This needs to be converted a module, but shouldnt be too difficult as most of the code is presently abstracted and modular. With a little bit of work it may be possible to make realXtend python scripts editable in a similar manner to the LSL/C#/etc scripts, which would be very cool.</li>
<li><strong>Voice</strong> - As with the above, the Rex Voice Daemon is fairly seperate from the main codebase, so porting this should be a fairly quick and painless job.</li>
<li><strong>Update protocols to 0.35</strong> - We&#8217;re currently sitting at the 0.31 release of realXtend which means there might be issues when the 0.35 realXtend viewer goes mainstream.</li>
<li><strong>Minor bits and bobs</strong> - Getting things such as the ODE Mesh Collisions working with realXtend collision meshes may nessecitate some additional work (and probably a subclassed version of our current ODE DLLs with additional functionality). There are probably a number of minor features and fixes that will need to be ported over once the main items on the TODO are done.</li>
</ul>
<p>So overall, we&#8217;ve still got a lot of work to do - but the great news is all the architectural bits are just about done, and we&#8217;ve proven that such advanced functionality can infact be done entirely with the current OpenSim region modules.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/11/logging-into-an-opensim-via-realxtend-accounts/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenSim Internals: Rebuilding SceneObjectGroup &#038; co.</title>
		<link>http://www.adamfrisby.com/blog/2008/11/opensim-internals-rebuilding-sceneobjectgroup-co/</link>
		<comments>http://www.adamfrisby.com/blog/2008/11/opensim-internals-rebuilding-sceneobjectgroup-co/#comments</comments>
		<pubDate>Sat, 08 Nov 2008 10:07:10 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[OpenSim]]></category>

		<category><![CDATA[internals]]></category>

		<category><![CDATA[proposal]]></category>

		<category><![CDATA[scenegraph]]></category>

		<category><![CDATA[sceneobject]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=81</guid>
		<description><![CDATA[Since we are on the verge of tagging the 0.6 OpenSim release, there&#8217;s a number of fundemental architectural changes we are investigating internally towards a path of more vendor neutrality. One of the changes I am proposing we make is to restructure SceneObjectGroup into part of the ClientStack heirachy rather than make assumptions about client [...]]]></description>
			<content:encoded><![CDATA[<p>Since we are on the verge of tagging the 0.6 OpenSim release, there&#8217;s a number of fundemental architectural changes we are investigating internally towards a path of more vendor neutrality. One of the changes I am proposing we make is to restructure SceneObjectGroup into part of the ClientStack heirachy rather than make assumptions about client representation models.</p>
<p>This is a proposal - it is not beyond reproach or comment.</p>
<h3>The Current Model: SceneObjectGroup</h3>
<p>Let&#8217;s begin by describing the current model - the largest limitation enforced on the current model is it dictates a method of heirachy which is fairly constrained. You have a parent who contains all the properties of the children, plus a few extra, then zero or more child primitives who are linked directly to the parent. The combined whole forms the &#8216;object&#8217;.</p>
<p>When you wish to modify a group property from a child, you need to check if you have a parent, if you do, modify the parent - but beware, certain things like the Position property mean different things as a child or root (why we also have AbsolutePosition and OffsetPosition properties to avoid confusion).</p>
<p><img src="http://www.gwala.net/sogsop/sogsop_current.png" alt="Current SceneObjectGroup" width="546" height="188" /></p>
<p>The obvious downsides of this approach are - we&#8217;ve made decisions that indicate that heirachical linking will never happen (something clients such as <a href="http://www.vastpark.com">VastPark</a> support via their nesting methods), neither is it possible to not have linking at all (ie say a standard Torque game). We&#8217;ve also got a mess of message routing which results in a very large number of if-null checks that perform different tasks depending on the outcome.</p>
<h4>What should a revision also contain?</h4>
<p>As part of the opportunity to fix this set of classes, we&#8217;ve got a chance to fix up some problems with SceneObjectGroup and SceneObjectPart - among them are, Vendor Neutrality (SOG/SOP is highly vendor specific), Multiple Linking models (ie not just Root-&gt;Children)</p>
<h3>Strengthen IEntity - Derive More.</h3>
<p>My personal favoured solution to this problem is to go back to IEntity and strengthen it up a bit. Right now, IEntity is a very minimalist interface dictating almost nothing about entities within the Scene, but it doesnt nessecarily need to be.</p>
<p>There are a number of properties which we can dictate as being universal about every entity regardless of the virtual world platform - these properties can be deemed as appropriate for a core interface, off the top of my head we can say the following are true of every type of &#8216;Entity&#8217; we want to implement.</p>
<ul>
<li>ID - The internal number used to indicate the object ID.</li>
<li>Position - The position of the entity inworld.</li>
<li>Serialised Version - A version of the object which can be imported/exported easily (XML?)</li>
<li>Physics Shell - The bounding box or triangle collection of this collection.</li>
<li><em>Name?</em></li>
<li><em>Scale?</em></li>
<li><em>Rotation?</em></li>
<li><em>BoundingBox?<br />
</em></li>
<li><em>etc&#8230;</em></li>
</ul>
<p>In the case of the Linden model specified above (SceneObjectGroup), the container becomes harder - we access our information about the object collection via the container. Physics shells are given for the container rather than every object inside, etc.</p>
<p>It also becomes possible to have multiple seperate models sharing the same scene simultaneously, each shares and communicates via the properties on IEntity. As a result, the scenegraph then resembles something like this.</p>
<p><img src="http://www.gwala.net/sogsop/sogsop_new.png" alt="New SceneObjectGroup" width="546" height="164" /></p>
<h4>A part overview</h4>
<p><strong>IEntity </strong>- Basic building block of objects contained in virtual worlds, it contains only properties which can be considered common to every virtual world platform.</p>
<p><strong>LLEntity</strong> - This forms a replaceemnt for the current SceneObjectGroup, it contains properties which are applicable to the entire object, such as Owner, Permissions, Position and others. It contains a list of Children in the form of LLPrimitive. Unlike the current SceneObjectGroup, we <strong>do not</strong> utilise the .Root property from children to store group parameters. For instance, LLEntity.Root.OffsetPosition does not dictate where the entire object is located - as the root object, it will always be [0,0,0].</p>
<p><strong>LLPrimitive</strong> - This contains a replacement for SceneObjectPart, unlike the current SOP it contains properties and methods only availible unique to the individual part. Properties which are shared among the group should be members of LLEntity instead. If you wish to access a group property it is <strong>always and only</strong> availible via LLEntity, and there are never members of LLPrimitive which simply act as &#8216;pass-thru&#8217;s to LLEntity. If you wish to access LLPrimitive - you must always access it via the parent group, it cannot be accessed via Entities directly.</p>
<p><strong>XYZEntity</strong> - This is another entity from another world platform, it may have a heirachical linking situation where multiple entities in scene are chained together and share properties between each other internally. To the OpenSim perspective however we only see multiple seperate objects.</p>
<h3>Potential Other IEntity Derivatives</h3>
<p>In line with the above stated goal of supporting greater vendor neutrality I would like to propose some examples of other representations used today, and how we would be able to implement them under the new scheme mentioned above.</p>
<p><strong>AWEntity</strong> (ActiveWorlds™) - While I&#8217;m not proposing to actually implement a AW Clientview, it&#8217;s representation of objects in scenegraph is fairly common and very similar to how game engines handle them. In ActiveWorlds, the world is a semi-finite plane divided into &#8216;cells&#8217;, each cell contains a number of objects however objects cannot link and have no notion of heirachy.</p>
<p>To implement AWEntity - we would implement all the common IEntity interfaces such as Position, Rotation, ID, etc. Then we would in addition implement some properties for the AW object parameters (Mesh Name, Object Name, Description, Client Script, etc).</p>
<p>We do not need to implement anything complex in terms of parents or children and the classes are without such properties. They contain a fairly &#8216;bare minimum&#8217; scenegraph representation. (Just to repeat above, I have no plans to implement any such AW entity - this is just a hypothetical example using real world object representations)</p>
<p><strong>Heirachical Entity</strong> (VastPark, Melanies Proposal, etc) - In this proposal, the same object consists of multiple independent parts. Each part has a collection of parents and children - however to Scene they are all independent seperate objects.</p>
<p>Each presents a seperate physics shell, each presents seperate property name and ID descriptions - however in special cases such as position or rotation, updating one reflects an update on the entire set simultaneously (or at least any descendants).</p>
<h3>Handling the new objects internally</h3>
<p>One of the largest problems of doing this (or any change) is that SceneObjectGroup is currently referenced in a very large number of places, making changes to it is likely going to result in a large number of structural changes needing to be done.</p>
<p>As an example of one of those changes - the following is a proposal on how to handle a single event in IClientAPI - OnNewEntity. The following represents the path that two independent IClientAPI implementations would follow in processing the same path.</p>
<p><img src="http://www.gwala.net/sogsop/sogsop_clientapioverview.png" alt="Client API Overview" width="586" height="202" /></p>
<p>The goal of this structure is to allow each client the opportunity to attempt to parse foreign object formats - if LLClientView understands XYZEntity enough to write a converter, then it can do so and send the converted result onto the Linden Viewer end user.</p>
<p>Likewise, if XYZClient understands Linden entities, then it can in turn write a converter to it&#8217;s internal packet representation and send the same object to it&#8217;s viewer.</p>
<p>In practice such converters will not be particularly easy to write - most Virtual Worlds use meshes in a variety of formats, so such converters may need to convert texture formats, mesh formats, etc. For LLClientView converters, it may simply be impossible to convert certain outside representations to something the viewer is capable of displaying and simply choose to display a lower detail representation, such as a bounding box of where the object should be.</p>
<p>To follow this process in detail, we&#8217;ll examine the LLClientView&#8217;s core processes.</p>
<p><img src="http://www.gwala.net/sogsop/sogsop_llclient.png" alt="Linden Clientview" width="599" height="116" /></p>
<p>In the first step (1), the Scene fires the OnNewEntity event which each client is listening for - as part of the event payload, the new entity is attached. This gets transmitted as a IEntity interface directly into the clientview.</p>
<p>Here the clientview needs to work out what kind of entity it is dealing with, it may do something like &#8220;if(IEntity is LLEntity) { &#8230; }&#8221; and handle appropriately (2).</p>
<p>As the LLClientStack is innately familiar with the structure of LLEntity, it can pretty much directly package it up to packets and prepare to send it to the end user (3).</p>
<p>However when it sees XYZEntity - XYZEntity is known to the ClientView, so it is capable of understanding it and potentially writing a converter (4) to the own internal packet formats. If we assume for a moment that XYZEntity is a AWEntity described above, then it may choose to create a temporary LLEntity which forms just a single box primitive and then package that up to the viewer.</p>
<p>Finally we&#8217;ve got something either in packets or close to it that we can quickly and easily send to the viewer (5). They are capable of seeing &#8217;something&#8217; for each Object in the scene, but naturally you need to be on a suitable client to see ever feature that platform supports.</p>
<h3>Things unmentioned</h3>
<p>One of the things I have left unmentioned is how to handle certain common tasks such as saving and restoring from the database. For the most part the infrastructure remains fairly similar - we can do a check &#8216;Is LLEntity&#8217; in the DB adapters and follow the current path, or if we dont have one, we can use the IEntity.Serialise() method to get a text string for each entity which can be saved in the DB fairly easily.</p>
<p>In the case of restoring from the database however we need to in addition implement a IEntityFactory which can take a set of data (such as a serialised version) and restore it to an object, these EntityFactories could be installed via a Application or Region module.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/11/opensim-internals-rebuilding-sceneobjectgroup-co/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Code Snippet: Converting OpenMetaverse.Primitive to OpenSimulator.SceneObjectPart</title>
		<link>http://www.adamfrisby.com/blog/2008/10/code-snippet-converting-openmetaverseprimitive-to-opensimulatorsceneobjectpart/</link>
		<comments>http://www.adamfrisby.com/blog/2008/10/code-snippet-converting-openmetaverseprimitive-to-opensimulatorsceneobjectpart/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 08:51:21 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[OpenSim]]></category>

		<category><![CDATA[openmetaverse]]></category>

		<category><![CDATA[primitive]]></category>

		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=79</guid>
		<description><![CDATA[Pardon this being a code-only post, but I figured it might be useful to anyone doing work with both OpenMetaverse and OpenSim - currently we store primitive data in a fairly different manner internally, this code converts between the two, and allows you to take a OpenMV.Primitive and get a OpenSim SOP out of it.

 [...]]]></description>
			<content:encoded><![CDATA[<p>Pardon this being a code-only post, but I figured it might be useful to anyone doing work with both OpenMetaverse and OpenSim - currently we store primitive data in a fairly different manner internally, this code converts between the two, and allows you to take a OpenMV.Primitive and get a OpenSim SOP out of it.</p>
<textarea name="code" class="C#:nocontrols" cols="60" rows="10">
        private SceneObjectPart FromPrim(Primitive orig)
        {
            bool root = orig.ParentID == 0;

            SceneObjectPart sop = new SceneObjectPart();
            sop.LastOwnerID = orig.OwnerID;
            sop.OwnerID = orig.OwnerID;
            sop.GroupID = orig.GroupID;

            sop.CreatorID = orig.Properties.CreatorID;

            sop.OwnershipCost = orig.Properties.OwnershipCost;
            sop.ObjectSaleType = (byte)orig.Properties.SaleType;
            sop.SalePrice = orig.Properties.SalePrice;
            sop.CreationDate = (int)Utils.DateTimeToUnixTime(orig.Properties.CreationDate);

            // Special
            sop.ParentID = 0;

            sop.OwnerMask = (uint)orig.Properties.Permissions.OwnerMask;
            sop.NextOwnerMask = (uint)orig.Properties.Permissions.NextOwnerMask;
            sop.GroupMask = (uint)orig.Properties.Permissions.GroupMask;
            sop.EveryoneMask = (uint)orig.Properties.Permissions.EveryoneMask;
            sop.BaseMask = (uint)orig.Properties.Permissions.BaseMask;

            sop.ParticleSystem = orig.ParticleSys.GetBytes();

            // OS only
            sop.TimeStampFull = 0;
            sop.TimeStampLastActivity = 0;
            sop.TimeStampTerse = 0;

            // Not sure nessecary
            sop.UpdateFlag = 2;

            sop.InventorySerial = 0;
            sop.UUID = orig.ID;
            sop.LocalId = orig.LocalID;
            sop.Name = orig.Properties.Name;
            sop.Flags = orig.Flags;
            sop.Material = 0;
            sop.RegionHandle = orig.RegionHandle;

            sop.GroupPosition = orig.Position;

            if (!root)
                sop.OffsetPosition = orig.Position;
            else
                sop.OffsetPosition = Vector3.Zero;

            sop.RotationOffset = orig.Rotation;
            sop.Velocity = orig.Velocity;
            sop.RotationalVelocity = Vector3.Zero;
            sop.AngularVelocity = Vector3.Zero;
            sop.Acceleration = Vector3.Zero;

            sop.Description = orig.Properties.Description;
            sop.Color = Color.White;
            sop.Text = orig.Text;
            sop.SitName = orig.Properties.SitName;
            sop.TouchName = orig.Properties.TouchName;
            sop.ClickAction = (byte)orig.ClickAction;

            sop.PayPrice = new int[1];

            sop.Shape = new PrimitiveBaseShape(true);
            sop.Shape.FlexiDrag = orig.Flexible.Drag;
            sop.Shape.FlexiEntry = false;
            sop.Shape.FlexiForceX = orig.Flexible.Force.X;
            sop.Shape.FlexiForceY = orig.Flexible.Force.Y;
            sop.Shape.FlexiForceZ = orig.Flexible.Force.Z;
            sop.Shape.FlexiGravity = orig.Flexible.Gravity;
            sop.Shape.FlexiSoftness = orig.Flexible.Softness;
            sop.Shape.FlexiTension = orig.Flexible.Tension;
            sop.Shape.FlexiWind = orig.Flexible.Wind;

            switch (orig.PrimData.ProfileHole)
            {
                case HoleType.Circle:
                    sop.Shape.HollowShape = HollowShape.Circle;
                    break;
                case HoleType.Square:
                    sop.Shape.HollowShape = HollowShape.Square;
                    break;
                case HoleType.Triangle:
                    sop.Shape.HollowShape = HollowShape.Triangle;
                    break;
                default:
                case HoleType.Same:
                    sop.Shape.HollowShape = HollowShape.Same;
                    break;
            }

            sop.Shape.LightColorA = orig.Light.Color.A;
            sop.Shape.LightColorB = orig.Light.Color.B;
            sop.Shape.LightColorG = orig.Light.Color.G;
            sop.Shape.LightColorR = orig.Light.Color.R;
            sop.Shape.LightCutoff = orig.Light.Cutoff;
            sop.Shape.LightEntry = false;
            sop.Shape.LightFalloff = orig.Light.Falloff;
            sop.Shape.LightIntensity = orig.Light.Intensity;
            sop.Shape.LightRadius = orig.Light.Radius;


            sop.Shape.PathBegin = Primitive.PackBeginCut(orig.PrimData.PathBegin);
            sop.Shape.PathCurve = (byte)orig.PrimData.PathCurve;
            sop.Shape.PathEnd = Primitive.PackEndCut(orig.PrimData.PathEnd);
            sop.Shape.PathRadiusOffset = Primitive.PackPathTwist(orig.PrimData.PathRadiusOffset);
            sop.Shape.PathRevolutions = Primitive.PackPathRevolutions(orig.PrimData.PathRevolutions);
            sop.Shape.PathScaleX = Primitive.PackPathScale(orig.PrimData.PathScaleX);
            sop.Shape.PathScaleY = Primitive.PackPathScale(orig.PrimData.PathScaleY);
            sop.Shape.PathShearX = (byte)Primitive.PackPathShear(orig.PrimData.PathShearX);
            sop.Shape.PathShearY = (byte)Primitive.PackPathShear(orig.PrimData.PathShearY);
            sop.Shape.PathSkew = Primitive.PackPathTwist(orig.PrimData.PathSkew);
            sop.Shape.PathTaperX = Primitive.PackPathTaper(orig.PrimData.PathTaperX);
            sop.Shape.PathTaperY = Primitive.PackPathTaper(orig.PrimData.PathTaperY);
            sop.Shape.PathTwist = Primitive.PackPathTwist(orig.PrimData.PathTwist);
            sop.Shape.PathTwistBegin = Primitive.PackPathTwist(orig.PrimData.PathTwistBegin);
            sop.Shape.PCode = (byte)orig.PrimData.PCode;
            sop.Shape.ProfileBegin = Primitive.PackBeginCut(orig.PrimData.ProfileBegin);
            sop.Shape.ProfileCurve = orig.PrimData.profileCurve;
            sop.Shape.ProfileEnd = Primitive.PackEndCut(orig.PrimData.ProfileEnd);
            sop.Shape.ProfileHollow = Primitive.PackProfileHollow(orig.PrimData.ProfileHollow);
            sop.Shape.ProfileShape = (ProfileShape)(byte)orig.PrimData.ProfileCurve;

            sop.Shape.Textures = orig.Textures;

            return sop;
        }
</textarea>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/10/code-snippet-converting-openmetaverseprimitive-to-opensimulatorsceneobjectpart/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Who visits OpenSimulator.org?</title>
		<link>http://www.adamfrisby.com/blog/2008/10/who-visits-opensimulatororg/</link>
		<comments>http://www.adamfrisby.com/blog/2008/10/who-visits-opensimulatororg/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 06:46:37 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[OpenSim]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=78</guid>
		<description><![CDATA[When the OpenSim website was changed recently by Sean, he installed some extra software to track visitors on the site and what content we need to improve. It also gives us some neat stats on who visits the website in terms of browser, country, etc.
I&#8217;d like to share some figures generated over the last month [...]]]></description>
			<content:encoded><![CDATA[<p>When the OpenSim website was changed recently by Sean, he installed some <a href="http://www.google.com/analytics">extra software</a> to track visitors on the site and what content we need to improve. It also gives us some neat stats on who visits the website in terms of browser, country, etc.</p>
<p>I&#8217;d like to share some figures generated over the last month since the change:</p>
<p>Between October 5th and October 27th, we have had 21,000 visits to the website with 82,500 pageviews - the average user spent approximately 5 minutes on the site. 50.7% of visits to the site are new visitors. 54.74% of the visitors to the site were using Firefox, and a whopping 14.61% were using Linux (OSX being 8.77%).</p>
<p>The most popular page on the website is the downloads page (suprise suprise), followed by user documentation, the grid list, configuration and build instructions. The top exit pages (where people stop reading or leave) are pretty much in the same order.</p>
<p>In terms of countries - the US has the largest share of visitors accounting for approximately 30% of our visitors, followed by the UK (10%), Germany (9%), France (7%), Japan (5%), Italy (5%), Spain (4%), China (3%), Netherlands (3%) and Australia (2.5%).</p>
<p>Interestingly, only 60% of our visitors come from English speaking countries - meaning we may actually want to start providing better support for foreign languages at some point in the near future.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/10/who-visits-opensimulatororg/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OpenSim Encrypted Asset Storage (&#8221;Cryptogrid&#8221;)</title>
		<link>http://www.adamfrisby.com/blog/2008/10/opensim-encrypted-asset-storage-cryptogrid/</link>
		<comments>http://www.adamfrisby.com/blog/2008/10/opensim-encrypted-asset-storage-cryptogrid/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 06:48:26 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=74</guid>
		<description><![CDATA[First a small preface - this isn&#8217;t DRM. Everything sent to the client is still accessible as far as rippers go (what can be seen, can still be copied - and DRM can&#8217;t fix that either)
With that being said - there are a number of cases where you may upload an asset onto a public [...]]]></description>
			<content:encoded><![CDATA[<p>First a small preface - this isn&#8217;t DRM. Everything sent to the client is still accessible as far as rippers go (what can be seen, can still be copied - and <a href="http://www.adamfrisby.com/blog/2008/07/virtual-worlds-why-drm-cannot-protect-you-for-long/">DRM can&#8217;t fix that</a> either)</p>
<p>With that being said - there are a number of cases where you may upload an asset onto a public grid for the purpose of transmitting it between a finite number of trusted regions. In this case, you dont want the grid operator to have full access to your content, nor do you want it transmitted onto untrusted regions.</p>
<p>What this allows you to do, is encrypt assets on upload - anyone can still download the assets, but only regions with the decryption key can access it. This effectively allows you to secure scripts and other content which is not transmitted to viewers - allowing if you tightly manage the decryption keys and combine with a tighter permissions module, to produce something like the way Second Life handles assets - even across a relatively untrusted and &#8220;open&#8221; grid.</p>
<p>You can install multiple decryption keys on one server - however only a single encryption key can be used at once (for obvious reasons - otherwise which key do you encrypt with when uploading?)</p>
<h3>Some notes on what this can and cannot do</h3>
<ul>
<li>First - <strong>this cannot protect assets once they hit the client</strong>, once they are on the client, all hands are untied and the content is potentially free. This does however let you limit the number of clients who can access the content on a public grid, by virtue of allowing you to have the asset only on a closed region within the public grid (therefor only a select number of users can see it.)</li>
<li>Your decryption keys become your content - protect them with your proverbial life. These keys can be duplicated, copied, etc - you should only hand your keys over when you are certain that the person recieving the keys is trustworthy (a contract may be useful here) - you also should change your encryption keys regularly, you just need to rename the file then OpenSim will generate you a new one on startup.</li>
<li>I would go so far as to say that having one key for every product may not be a bad idea - that way if the key leaks you dont lose everything - just whatever was signed with it.</li>
<li>If you choose to encrypt your content on upload, then you will need to sure to rename the key to &#8220;.deckey&#8221; (from &#8220;.enckey&#8221;) then give that to everyone who you want to be able to decrypt the assets. If you transmit the key - make sure to do so in a secure manner such as SFTP/SCP/PGP, and not send it in the clear.</li>
<li>Finally, if you lose your key, delete it or similar - you wont be able to unencrypt it (there&#8217;s no hardcoded backdoors or anything else), so make a safe backup of your keys somewhere</li>
</ul>
<h3>Final notes - archiver, etc</h3>
<p>This is not a magic bullet solution - it has a very specific set of areas where you can benefit (ie if you dont nessecarily trust a grid operator, or want to carve out a &#8216;protected area&#8217; within a larger grid and still use things like inventory without busting it up ala local assets) - that being said, in certain cases, it&#8217;s now possible to be &#8216;as secure&#8217; as Second Life (which really isnt that secure, but that&#8217;s another topic entirely).</p>
<p>It&#8217;s also worth noting that anything that downloads assets on the region server, where the region server has a decryption key, will be getting decoded assets - this means the region archiver, etc. will be getting copies of the unencrypted assets - you should treat archives with protected content in them as exactly that (ie dont go sending them around assuming they are secure).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/10/opensim-encrypted-asset-storage-cryptogrid/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OSGrid Pub Quiz - Summary</title>
		<link>http://www.adamfrisby.com/blog/2008/10/osgrid-pub-quiz-summary/</link>
		<comments>http://www.adamfrisby.com/blog/2008/10/osgrid-pub-quiz-summary/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 02:34:21 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=71</guid>
		<description><![CDATA[
The Inaugral Sinewave Pub Quiz on OSGrid.org
The initial pub quiz (pictured above) was a success, we got a lot of people to show up - many of whom who have never been onto OpenSim or OSGrid before. We&#8217;re so happy with the results that we&#8217;re going to go ahead and schedule another one - we&#8217;re [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.gwala.net/sinewavepubquiz_screenshot.jpg" alt="" width="500" height="253" /></p>
<h3>The Inaugral Sinewave Pub Quiz on OSGrid.org</h3>
<p>The initial pub quiz (pictured above) was a success, we got a lot of people to show up - many of whom who have never been onto OpenSim or OSGrid before. We&#8217;re so happy with the results that we&#8217;re going to go ahead and schedule another one - we&#8217;re aiming at <strong>Sunday, the <span style="text-decoration: line-through;">19th</span> 26th of October at 9PM GMT (1PM PST)</strong> with a Halloween theme. (Sorry, typo! - edit)</p>
<p>The structure of this event was a three part quiz - a picture round, including naming hollywood movies from a still image (some tougher than others), a music round (name the track from a small clip) and finally a &#8216;google fu&#8217; round with recent history. There were 24 questions in total - our two first place winners getting 19 of them right (and sharing the $500 in prize money).</p>
<p>Q&amp;A was handled by our bot-in-residence Chinzy Quizmaster running the <a href="http://www.sinewaverobots.com/home/auth.php">Sinewave Quizbot</a> code, some suggestions for improvements we&#8217;ve added to the development roadmap.</p>
<p>We hope to see everyone who participated at the next one - we had a lot of fun running it and want to make this a regular occurance.</p>
<h3>As Promised - The Technical Writeup</h3>
<p>Technically the Pub Quiz was overall a success - we got a <em>lot</em> of interesting data out of the test (and a 17mb log file), including the fact that OpenSim seems to scale pretty damn well under a tightly controlled environment. We also managed to isolate and fix three critical bugs with OpenSim which have been contributed back to OpenSim already. In addition we have some information about how OpenSim is handling packets internally which I&#8217;ll be interpreting this week to try improve general performance with.</p>
<p>We also learnt some other interesting things about running these kinds of profiled events in future which might be useful to other people</p>
<ul>
<li>JetBrain&#8217;s dotTrace profiler doesn&#8217;t work on OpenSim very well - infact the chances of getting a  &#8220;completely random MS Visual C Runtime error&#8221; while under their profiler goes up about infinity% (ie, from zero to once every minute). We&#8217;re going to try <a href="http://www.eqatec.com/tools/profiler">another profiler</a> next time around. A slight shame since we wanted to do a memory profile next time vs re-doing the performance one. That being said, if anything&#8217;s going to kill a profiler - we&#8217;re it, the Mono profilers dont even start when profiling OpenSim.</li>
<li>For the most part OpenSim seems to behave pretty well these days, however we do need to get some kind of mechanism inplace to handle when things do occasionally crash to somehow get users into another backup region. EventQueueGet makes this now rather difficult, but it might be possible to do still somehow.</li>
<li>We&#8217;ve still got &#8220;Grey Avatar Syndrome&#8221; showing up on a number of avatars - however we think these are being caused by simply not having an avatar equipped, or having an avatar that was built with local assets enabled. We definetely need to work on providing a nice default avatar in these cases as the simulator should be able to tell the avatar is using a inaccessible asset.</li>
<li>Windows 2003 still performs significantly better than Linux/Mono it seems. Our servers didnt hit above 5% CPU usage for the entire event, except during one stack heap (which was fixed). Memory use fluctuated a little bit, but for the most part was sitting comfortably around 230mb of RAM plus a little bit of page.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/10/osgrid-pub-quiz-summary/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SineWave/OSGrid Pub Quiz: $500 Grand Prize, this Friday</title>
		<link>http://www.adamfrisby.com/blog/2008/10/sinewaveosgrid-pub-quiz-500-grand-prize-this-friday/</link>
		<comments>http://www.adamfrisby.com/blog/2008/10/sinewaveosgrid-pub-quiz-500-grand-prize-this-friday/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 14:36:23 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[DeepThink]]></category>

		<category><![CDATA[OpenSim]]></category>

		<category><![CDATA[SineWave]]></category>

		<category><![CDATA[load]]></category>

		<category><![CDATA[pub quiz]]></category>

		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=70</guid>
		<description><![CDATA[SineWave (with a little bit of help from DeepThink) is running a big Pub Quiz, this Friday on OSGrid.org. For those who are outside of Britan, read the wikipedia article for an overview on what this is, the rules and format.
The short
It&#8217;s on OSGrid.org, in the SineWave Region - 5PM GMT / 12PM EST / [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.sinewavecompany.com">SineWave</a> (with a little bit of help from <a href="http://www.deepthink.com.au">DeepThink</a>) is running a big Pub Quiz, this Friday on OSGrid.org. For those who are outside of Britan, read the <a href="http://en.wikipedia.org/wiki/Pub_quiz">wikipedia article</a> for an overview on what this is, the rules and format.</p>
<h3>The short</h3>
<p>It&#8217;s on <a href="http://www.osgrid.org">OSGrid.org</a>, in the SineWave Region - 5PM GMT / 12PM EST / 9AM PST, Friday the 10th of October (<em>this friday!</em>). Total runtime is expected to be fourty minutes or so. You should register your avatar in advance on <a href="http://sinewavecompany.com/pubquiz">this page</a>.</p>
<h3>The rest</h3>
<p>You should try test logging into SineWave sometime before the event, as we&#8217;ll be trying to start promptly. There&#8217;ll be other prizes including some hosting from DeepThink and maybe a little more. Performance will be a little slower than usual since the region will be operating under a performance profiler, but should still be acceptable.</p>
<p>As usual, we&#8217;ll publish the profiler results to help other developers - if you want to bring friends, feel free as the more avatars logged in, the better the quality of the results we get.</p>
<h3>FAQ</h3>
<p><strong>Why are you running this, $500 is a lot to give away randomly?</strong> We&#8217;re doing this as a load test on OpenSim - we&#8217;re looking to get about 100 avatars or so and see where OpenSim stresses so we can optimise and fix those areas.</p>
<p><strong>I need to get onto OSGrid - how do I connect?</strong> We recommend you grab the <a href="http://opensim-viewer.sourceforge.net/">Hippo Viewer</a>, it&#8217;s free and will connect by default to OSGrid (although it has support for any modern opensim grid)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/10/sinewaveosgrid-pub-quiz-500-grand-prize-this-friday/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The Finite Manpower Problem: Or why we suprisingly cannot do everything at once</title>
		<link>http://www.adamfrisby.com/blog/2008/09/the-finite-manpower-problem-or-why-we-suprisingly-cannot-do-everything-at-once/</link>
		<comments>http://www.adamfrisby.com/blog/2008/09/the-finite-manpower-problem-or-why-we-suprisingly-cannot-do-everything-at-once/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 05:25:51 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[OpenSim]]></category>

		<category><![CDATA[Rants]]></category>

		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[open source]]></category>

		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=68</guid>
		<description><![CDATA[I&#8217;ve been afflicted by this very problem myself lately, which is why this post has been sitting in my head (along with a slight hangover) for the last few days.
It should go without saying that a single developer can only achieve X number of features/fixes/improvements in Y time (and not every value of X is [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been afflicted by this very problem myself lately, which is why this post has been sitting in my head (along with a slight hangover) for the last few days.</p>
<p>It should go without saying that a single developer can only achieve X number of features/fixes/improvements in Y time (and not every value of X is equal), but the moment you substitute &#8220;X&#8221; with specific feature names, it suddenly becomes urgent priority for everyone to stop work on it and get that done, <em>to hell with everything else - although we want that too &#8230; <strong>and a pony</strong>.</em></p>
<h3>The facts of life</h3>
<p>The reality is - we&#8217;ve got a finite number amount of time, a finite number of developers, and a not-quite-so-finite list of features and improvements we have to spend time on, this means we prioritise stuff. We say &#8220;We think stability is a prerequisite before you go about implementing an <a href="http://secondlife.reuters.com/stories/2008/09/06/virtual-currency-not-on-the-opensim-agenda/">example micropayments system</a>.&#8221; - and with good cause, if the system didnt have that prerequisite stability, why the hell would you trust it to handle important or sensitive information?</p>
<p>This is not to say some of us havnt devoted time to thinking about it, it&#8217;s just that we each have our own ideas about what we think is important, and unless you are actively assisting in some capacity (<em>food, booze, code, testing, etc</em>), your personal wish list probably isn&#8217;t going to get any attention.</p>
<p>It&#8217;s harsh - but there it is. At the end of the day, each developer has a finite amount of time to work on projects, and when they are working on things - there is a strong chance that a specific goal is in mind and needed. If you want to change that goal, you either must have a convincing reason that that person is interested in and agrees with, or you need to provide an incentive to compensate for time that would otherwise be spent elsewhere. It&#8217;s also quite possible to just get in there, and do it yourself then submit those changes back.</p>
<h3>Backseat Driving</h3>
<p>There&#8217;s a lot of developers working on the OpenSim project - and each of them has their own ideas, goals and projects. Some of them are working on commercial projects that rely on OpenSim - and hence have some very specific feature and stability requirements that they work on. Others have more free reign by virtue of doing this in their spare time. There is a common misconception that the OpenSim team has an agenda - there&#8217;s somewhere around 200 developers on the project which means there&#8217;s 200 sets of agenda&#8217;s.</p>
<p>Right now, my personal agenda (which by proxy does carry a little across to what the DeepThink developers are working on) looks something like this:</p>
<ul>
<li>Abstract login and client initialisation to a more generalised interface to allow third party login and authentication routines to be fitted more easily as loadable DLLs.</li>
<li>Find where we have remaining hard-coded references to LLClientView bits and bobs, and recode them in a more vendor neutral manner.</li>
<li>Have a look at some of the terrain control issues reported on the mailing list recently.</li>
</ul>
<p>It&#8217;s a pretty short list - this list gets revised, updated and changed pretty regularly based on what I need to do at the very moment, it&#8217;s the same for a lot of the other central developers - they are built on a task-by-task basis.</p>
<p>So - if you have a feature you really want to see happen, that you really think is important we tackle and address, your options include:</p>
<ul>
<li>Do it yourself - the code is there and we dont bite when it comes to new contributions. (Just as long as the code matches our other guidelines about quality, modularity, etc.)</li>
<li>Convince someone to do it for you - this it the hardest of the options since we&#8217;re already very busy as a group, but it&#8217;s certainly possible. Make a convincing argument - it helps if you can research it and break it down into specific tasks. (&#8221;Improve stability&#8221; is not a task - &#8220;Fix crashes when/while XYZ happens&#8221; is.)</li>
<li>Hire someone to do it for you - it&#8217;s an option on the table too. There&#8217;s a lot of developers familiar with the codebase now, lots of them are looking for beer money and can implement your pet project or ideas for a fee.</li>
</ul>
<p>So in conclusion - if you have something you really think is important, really want to see - think it through, ask yourself &#8220;Is this more important than what people are working on already&#8221;, &#8220;Is this something that OpenSim is ready to support&#8221;, &#8220;Is this important enough that I am willing to work to see it done?&#8221;, and finally &#8220;If no-one thinks it&#8217;s that important, ready or &lt;insert reason here&gt;, am I willing to pay to see it happen?&#8221;. Because at the end of the day, features take time, and time is a non-renewable resource - people like to see it invested wisely.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/09/the-finite-manpower-problem-or-why-we-suprisingly-cannot-do-everything-at-once/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The cat that caught the canary</title>
		<link>http://www.adamfrisby.com/blog/2008/09/the-cat-that-caught-the-canary/</link>
		<comments>http://www.adamfrisby.com/blog/2008/09/the-cat-that-caught-the-canary/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 20:18:29 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=66</guid>
		<description><![CDATA[
Click the above for a bigger picture with captions
(&#8221;What a bunch of nerds&#8221; - Zha) 
This year at the Virtual Worlds Expo in LA, several of the OpenSim and related developers (including RealXtend and others) decided to sponsor a booth and attend as a large contingent. We&#8217;ve been exhibiting, explaining and showing OpenSim to hundreds [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://opensimulator.org/images/c/cc/Opensim_award.png"><img src="http://opensimulator.org/images/4/44/Opensim_award_thumb.png" alt="Virtual Worlds Overall Innovation Award 08" width="500" height="150" /></a><em><br />
<strong>Click the above for a bigger picture with captions<br />
</strong></em><em>(&#8221;What a bunch of nerds&#8221; - Zha) </em></p>
<p>This year at the Virtual Worlds Expo in LA, several of the OpenSim and related developers (including RealXtend and others) decided to sponsor a booth and attend as a large contingent. We&#8217;ve been exhibiting, explaining and showing OpenSim to hundreds of managers, developers and users. What most of us did not expect was that we&#8217;d be coming home with the <a href="http://www.virtualworldsexpo.com/award/">VW08 Overall Innovation Award</a>.</p>
<p>It&#8217;s rather nice to poke our head up above the water and see that there is some interest in what we are doing, and the recognition doesnt hurt. We&#8217;ll post some more on this once the conference is over and I have a bit of time to collate the photos and feedback we&#8217;ve gotten.</p>
<h3>After long delay, the Screenshot Competition winners</h3>
<p>Big thanks to everyone who contributed screenshots for us to use for this event - we used images from the following people/groups in our promotional materials, we had so many pictures to choose from and only a limited amount of space to use (Over 100 screenshots were submitted)</p>
<h4>Images we used were from&#8230;</h4>
<p>RealXtend - Ludocraft and Adminotech - <a href="http://www.realxtend.org">www.realxtend.org</a><br />
Bin Chen and Tiantian Wang - <a href="http://www.SecondCampus.net.cn">SecondCampus.net.cn</a><br />
Myself / Deepthink - <a href="http://www.deepthink.com.au">www.deepthink.com.au</a><br />
Warin Cascabel - Escapon on OSGrid.org<br />
United Grid - <a href="http://www.unitedgrid.com">www.unitedgrid.com</a></p>
<h4>Prizes and everyone else&#8230;</h4>
<p>You will be able to download the PDFs of the banners and printed materials we made for the booth shortly. Everyone who contributed (<em>not just the winners!</em>) and wants to take advantage of our offer for 6 months free hosting on osgrid.org, please contact me and I&#8217;ll get you setup.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/09/the-cat-that-caught-the-canary/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
