<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://opensimulator.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://opensimulator.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Misterblue</id>
		<title>OpenSimulator - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://opensimulator.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Misterblue"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Special:Contributions/Misterblue"/>
		<updated>2026-04-21T18:22:28Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/wiki/ExtendedPhysics</id>
		<title>ExtendedPhysics</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/ExtendedPhysics"/>
				<updated>2023-05-25T17:28:55Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Add description of axis lock functions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ExtendedPhysics =&lt;br /&gt;
&lt;br /&gt;
'''ExtendedPhysics''' is an OpenSimulator module that adds&lt;br /&gt;
LSL functions and constants that provide&lt;br /&gt;
physics engine extension functions.&lt;br /&gt;
&lt;br /&gt;
The module is designed so to work with any physics engine&lt;br /&gt;
but, at the moment, only '''BulletSim''' implements these functions.&lt;br /&gt;
These functions can be called when using any physics engine but&lt;br /&gt;
nothing will change.&lt;br /&gt;
&lt;br /&gt;
The OpenSimulator default configuration has '''ExtendedPhysics'''&lt;br /&gt;
disabled. To enable '''ExtendedPhysics''', add the following&lt;br /&gt;
to any of the configuration INI files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [ExtendedPhysics]&lt;br /&gt;
    Enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Informational Functions ==&lt;br /&gt;
&lt;br /&gt;
This request returns the type of the physics engine. &lt;br /&gt;
This function returns the same as &amp;lt;code&amp;gt;osGetPhysicsEngineType&amp;lt;/code&amp;gt;&lt;br /&gt;
which is a string identifying the type of the physics engine.&lt;br /&gt;
&lt;br /&gt;
The BulletSim physics engine returns the string &amp;quot;BulletSim&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The function &amp;lt;code&amp;gt;osGetPhysicsEngineName&amp;lt;/code&amp;gt; returns a string&lt;br /&gt;
that has additional information than just the type.&lt;br /&gt;
For instance, version numbers or types of accelerators being used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    string physType = physGetEngineType();&lt;br /&gt;
    string morePhysType = osGetPhysicsEngineName();&lt;br /&gt;
    llOwnerSay(0, &amp;quot;Physics engine type = &amp;quot; + physType);&lt;br /&gt;
    llOwnerSay(0, &amp;quot;Physics engine type again = &amp;quot; + morePhysType);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable Deactivation Function ==&lt;br /&gt;
&lt;br /&gt;
Disable physics deactivation on the containing physical object.&lt;br /&gt;
&lt;br /&gt;
The Bullet physics engine saves CPU cycles by only&lt;br /&gt;
checking &amp;quot;active&amp;quot; physical objects. Physical objects start out&lt;br /&gt;
active and are deactivated when their linear or angular velocity&lt;br /&gt;
falls below some threshold. For instance, if a scene has 100&lt;br /&gt;
physical balls that are dropped and roll around, the physics&lt;br /&gt;
engine has to test each of the 100 balls multiple times a second&lt;br /&gt;
to compute their movement. As some of the balls slow down and&lt;br /&gt;
stop moving, the balls are stopped and &amp;quot;deactivated&amp;quot; and thus&lt;br /&gt;
the physics engine doesn't need to check the stopped physical&lt;br /&gt;
object any more.&lt;br /&gt;
&lt;br /&gt;
Physical objects are re-activated when another physical object&lt;br /&gt;
bumps into them but otherwise, they stay still.&lt;br /&gt;
&lt;br /&gt;
This deactivation is usually a great CPU saver but there are cases&lt;br /&gt;
where it causes objects with small movements or movements that are&lt;br /&gt;
effected by non-physical objects. A ball on a tilting surface, for&lt;br /&gt;
instance.&lt;br /&gt;
&lt;br /&gt;
This function disables deactivation -- setting &amp;quot;true&amp;quot; means the object&lt;br /&gt;
will never be deactivated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    physDisableDeactivation(TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Axis Lock Functions ==&lt;br /&gt;
&lt;br /&gt;
These requests effect the movement of a physical object around its&lt;br /&gt;
various axis. &lt;br /&gt;
&lt;br /&gt;
The effect of these requests is to create a constraint on one or more&lt;br /&gt;
of the axis of the physics object.&lt;br /&gt;
&lt;br /&gt;
The constraints are given as a list of parameters. Some of the functions&lt;br /&gt;
take no parameters and some take two. Multiple constraints can be set in&lt;br /&gt;
one request and they are processed from left to right.&lt;br /&gt;
&lt;br /&gt;
For instance, the following request constrains a physical object to&lt;br /&gt;
only move along its local Z axis with no rotation:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    physAxisLock(PHYS_AXIS_LOCK_ANGULAR, PHYS_AXIS_LOCK_LINEAR_Y, PHYS_AXIS_LOCK_LINEAR_X);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are code that clear all of the settings -- &amp;lt;code&amp;gt;PHYS_AXIS_UNLOCK&amp;lt;/code&amp;gt; unlocks all the linear&lt;br /&gt;
and angular constraints, for instance.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! Code || Description&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LOCK_LINEAR || Lock all linear motion. No parameters.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LOCK_LINEAR_X || Lock all linear motion along the local X axis. No parameters.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LIMIT_LINEAR_X || Limit linear motion along the local X axis. Two parameters giving low and high relative X position.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LOCK_LINEAR_Y || Lock all linear motion along the local Y axis. No parameters.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LIMIT_LINEAR_Y || Limit linear motion along the local Y axis. Two parameters giving low and high relative Y position.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LOCK_LINEAR_Z || Lock all linear motion along the local Z axis. No parameters.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LIMIT_LINEAR_Z || Limit linear motion along the local Y axis. Two parameters giving low and high relative Z position.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LOCK_ANGULAR || Lock all angular motion. No parameters.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LOCK_ANGULAR_X || Lock all angular motion around the local X axis. No parameters.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LIMIT_ANGULAR_X || Limit angular motion around the local X axis. Two parameters giving low and high values in radians.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LOCK_ANGULAR_Y || Lock all angular motion around the local Y axis. No parameters.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LIMIT_ANGULAR_Y || Limit angular motion around the local Y axis. Two parameters giving low and high values in radians.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LOCK_ANGULAR_Z || Lock all angular motion around the local Z axis. No parameters.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_LIMIT_ANGULAR_Z || Limit angular motion around the local Z axis. Two parameters giving low and high values in radians.&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK_LINEAR || Unlock all linear motion constraints&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK_LINEAR_X || Unlock any linear motion constraint on the X axis&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK_LINEAR_Y || Unlock any linear motion constraint on the Y axis&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK_LINEAR_Z || Unlock any linear motion constraint on the Z axis&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK_ANGULAR || Unlock all angular motion constraints&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK_ANGULAR_X || Unlock any angular motion constraints around the X axis&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK_ANGULAR_Y || Unlock any angular motion constraints around the Y axis&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK_ANGULAR_Z || Unlock any angular motion constraints around the Z axis&lt;br /&gt;
|-&lt;br /&gt;
| PHYS_AXIS_UNLOCK || Unlock all linear and angular constraints&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For instance, constraining &lt;br /&gt;
movement along the X axis,&lt;br /&gt;
not allowing any movement on the Z axis,&lt;br /&gt;
and limiting rotation around the Y axis&lt;br /&gt;
would be accomplished with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    physLockAxis(PHYS_AXIS_LIMIT_LINEAR_X, 0, 5.5, PHYS_AXIS_LOCK_LINEAR_Z, PHYS_LIMIT_ANGULAR_Y, -0.785, 0.785);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Linkset Manipulation Functions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        PHYS_LINKSET_TYPE_CONSTRAINT  = 0;&lt;br /&gt;
        PHYS_LINKSET_TYPE_COMPOUND    = 1;&lt;br /&gt;
        PHYS_LINKSET_TYPE_MANUAL      = 2;&lt;br /&gt;
&lt;br /&gt;
        public int physSetLinksetType(int linksetType)&lt;br /&gt;
&lt;br /&gt;
        int lsType = physGetLinksetType();&lt;br /&gt;
&lt;br /&gt;
        PHYS_LINK_TYPE_FIXED  = 1234;&lt;br /&gt;
        PHYS_LINK_TYPE_HINGE  = 4;&lt;br /&gt;
        PHYS_LINK_TYPE_SPRING = 9;&lt;br /&gt;
        PHYS_LINK_TYPE_6DOF   = 6;&lt;br /&gt;
        PHYS_LINK_TYPE_SLIDER = 7;&lt;br /&gt;
&lt;br /&gt;
        physChangeLinkType(int linkNum, int lType)&lt;br /&gt;
&lt;br /&gt;
        physGetLinkType(int linkNum)&lt;br /&gt;
&lt;br /&gt;
        physChangeLinkFixed(int linkNum)&lt;br /&gt;
&lt;br /&gt;
        PHYS_PARAM_FRAMEINA_LOC           = 14401;&lt;br /&gt;
        PHYS_PARAM_FRAMEINA_ROT           = 14402;&lt;br /&gt;
        PHYS_PARAM_FRAMEINB_LOC           = 14403;&lt;br /&gt;
        PHYS_PARAM_FRAMEINB_ROT           = 14404;&lt;br /&gt;
        PHYS_PARAM_LINEAR_LIMIT_LOW       = 14405;&lt;br /&gt;
        PHYS_PARAM_LINEAR_LIMIT_HIGH      = 14406;&lt;br /&gt;
        PHYS_PARAM_ANGULAR_LIMIT_LOW      = 14407;&lt;br /&gt;
        PHYS_PARAM_ANGULAR_LIMIT_HIGH     = 14408;&lt;br /&gt;
        PHYS_PARAM_USE_FRAME_OFFSET       = 14409;&lt;br /&gt;
        PHYS_PARAM_ENABLE_TRANSMOTOR      = 14410;&lt;br /&gt;
        PHYS_PARAM_TRANSMOTOR_MAXVEL      = 14411;&lt;br /&gt;
        PHYS_PARAM_TRANSMOTOR_MAXFORCE    = 14412;&lt;br /&gt;
        PHYS_PARAM_CFM                    = 14413;&lt;br /&gt;
        PHYS_PARAM_ERP                    = 14414;&lt;br /&gt;
        PHYS_PARAM_SOLVER_ITERATIONS      = 14415;&lt;br /&gt;
        PHYS_PARAM_SPRING_AXIS_ENABLE     = 14416;&lt;br /&gt;
        PHYS_PARAM_SPRING_DAMPING         = 14417;&lt;br /&gt;
        PHYS_PARAM_SPRING_STIFFNESS       = 14418;&lt;br /&gt;
        PHYS_PARAM_LINK_TYPE              = 14419;&lt;br /&gt;
        PHYS_PARAM_USE_LINEAR_FRAMEA      = 14420;&lt;br /&gt;
        PHYS_PARAM_SPRING_EQUILIBRIUM_POINT = 14421;&lt;br /&gt;
&lt;br /&gt;
        PHYS_AXIS_ALL = -1;&lt;br /&gt;
        PHYS_AXIS_LINEAR_ALL = -2;&lt;br /&gt;
        PHYS_AXIS_ANGULAR_ALL = -3;&lt;br /&gt;
        PHYS_AXIS_LINEAR_X  = 0;&lt;br /&gt;
        PHYS_AXIS_LINEAR_Y  = 1;&lt;br /&gt;
        PHYS_AXIS_LINEAR_Z  = 2;&lt;br /&gt;
        PHYS_AXIS_ANGULAR_X = 3;&lt;br /&gt;
        PHYS_AXIS_ANGULAR_Y = 4;&lt;br /&gt;
        PHYS_AXIS_ANGULAR_Z = 5;&lt;br /&gt;
&lt;br /&gt;
        physChangeLinkParams(params ....)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/ExtendedPhysics</id>
		<title>ExtendedPhysics</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/ExtendedPhysics"/>
				<updated>2023-05-25T14:52:58Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: ExtendedPhysics module documentation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ExtendedPhysics =&lt;br /&gt;
&lt;br /&gt;
'''ExtendedPhysics''' is an OpenSimulator module that adds&lt;br /&gt;
LSL functions and constants that provide&lt;br /&gt;
physics engine extension functions.&lt;br /&gt;
&lt;br /&gt;
The module is designed so to work with any physics engine&lt;br /&gt;
but, at the moment, only '''BulletSim''' implements these functions.&lt;br /&gt;
These functions can be called when using any physics engine but&lt;br /&gt;
nothing will change.&lt;br /&gt;
&lt;br /&gt;
The OpenSimulator default configuration has '''ExtendedPhysics'''&lt;br /&gt;
disabled. To enable '''ExtendedPhysics''', add the following&lt;br /&gt;
to any of the configuration INI files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [ExtendedPhysics]&lt;br /&gt;
    Enabled = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Informational Functions ==&lt;br /&gt;
&lt;br /&gt;
This request returns the type of the physics engine. &lt;br /&gt;
This function returns the same as &amp;lt;code&amp;gt;osGetPhysicsEngineType&amp;lt;/code&amp;gt;&lt;br /&gt;
which is a string identifying the type of the physics engine.&lt;br /&gt;
&lt;br /&gt;
The BulletSim physics engine returns the string &amp;quot;BulletSim&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The function &amp;lt;code&amp;gt;osGetPhysicsEngineName&amp;lt;/code&amp;gt; returns a string&lt;br /&gt;
that has additional information than just the type.&lt;br /&gt;
For instance, version numbers or types of accelerators being used.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    string physType = physGetEngineType();&lt;br /&gt;
    string morePhysType = osGetPhysicsEngineName();&lt;br /&gt;
    llOwnerSay(0, &amp;quot;Physics engine type = &amp;quot; + physType);&lt;br /&gt;
    llOwnerSay(0, &amp;quot;Physics engine type again = &amp;quot; + morePhysType);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable Deactivation Function ==&lt;br /&gt;
&lt;br /&gt;
Disable physics deactivation on the containing physical object.&lt;br /&gt;
&lt;br /&gt;
The Bullet physics engine saves CPU cycles by only&lt;br /&gt;
checking &amp;quot;active&amp;quot; physical objects. Physical objects start out&lt;br /&gt;
active and are deactivated when their linear or angular velocity&lt;br /&gt;
falls below some threshold. For instance, if a scene has 100&lt;br /&gt;
physical balls that are dropped and roll around, the physics&lt;br /&gt;
engine has to test each of the 100 balls multiple times a second&lt;br /&gt;
to compute their movement. As some of the balls slow down and&lt;br /&gt;
stop moving, the balls are stopped and &amp;quot;deactivated&amp;quot; and thus&lt;br /&gt;
the physics engine doesn't need to check the stopped physical&lt;br /&gt;
object any more.&lt;br /&gt;
&lt;br /&gt;
Physical objects are re-activated when another physical object&lt;br /&gt;
bumps into them but otherwise, they stay still.&lt;br /&gt;
&lt;br /&gt;
This deactivation is usually a great CPU saver but there are cases&lt;br /&gt;
where it causes objects with small movements or movements that are&lt;br /&gt;
effected by non-physical objects. A ball on a tilting surface, for&lt;br /&gt;
instance.&lt;br /&gt;
&lt;br /&gt;
This function disables deactivation -- setting &amp;quot;true&amp;quot; means the object&lt;br /&gt;
will never be deactivated.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    physDisableDeactivation(TRUE);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Axis Lock Functions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
physAxisLock(int lockFlags, ...)&lt;br /&gt;
        PHYS_AXIS_LOCK_LINEAR     = 14700;&lt;br /&gt;
        PHYS_AXIS_LOCK_LINEAR_X   = 14701;&lt;br /&gt;
        PHYS_AXIS_LIMIT_LINEAR_X  = 14702;&lt;br /&gt;
        PHYS_AXIS_LOCK_LINEAR_Y   = 14703;&lt;br /&gt;
        PHYS_AXIS_LIMIT_LINEAR_Y  = 14704;&lt;br /&gt;
        PHYS_AXIS_LOCK_LINEAR_Z   = 14705;&lt;br /&gt;
        PHYS_AXIS_LIMIT_LINEAR_Z  = 14706;&lt;br /&gt;
        PHYS_AXIS_LOCK_ANGULAR    = 14707;&lt;br /&gt;
        PHYS_AXIS_LOCK_ANGULAR_X  = 14708;&lt;br /&gt;
        PHYS_AXIS_LIMIT_ANGULAR_X = 14709;&lt;br /&gt;
        PHYS_AXIS_LOCK_ANGULAR_Y  = 14710;&lt;br /&gt;
        PHYS_AXIS_LIMIT_ANGULAR_Y = 14711;&lt;br /&gt;
        PHYS_AXIS_LOCK_ANGULAR_Z  = 14712;&lt;br /&gt;
        PHYS_AXIS_LIMIT_ANGULAR_Z = 14713;&lt;br /&gt;
        PHYS_AXIS_UNLOCK_LINEAR   = 14714;&lt;br /&gt;
        PHYS_AXIS_UNLOCK_LINEAR_X = 14715;&lt;br /&gt;
        PHYS_AXIS_UNLOCK_LINEAR_Y = 14716;&lt;br /&gt;
        PHYS_AXIS_UNLOCK_LINEAR_Z = 14717;&lt;br /&gt;
        PHYS_AXIS_UNLOCK_ANGULAR  = 14718;&lt;br /&gt;
        PHYS_AXIS_UNLOCK_ANGULAR_X = 14719;&lt;br /&gt;
        PHYS_AXIS_UNLOCK_ANGULAR_Y = 14720;&lt;br /&gt;
        PHYS_AXIS_UNLOCK_ANGULAR_Z = 14721;&lt;br /&gt;
        PHYS_AXIS_UNLOCK           = 14722;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Linkset Manipulation Functions ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
        PHYS_LINKSET_TYPE_CONSTRAINT  = 0;&lt;br /&gt;
        PHYS_LINKSET_TYPE_COMPOUND    = 1;&lt;br /&gt;
        PHYS_LINKSET_TYPE_MANUAL      = 2;&lt;br /&gt;
&lt;br /&gt;
        public int physSetLinksetType(int linksetType)&lt;br /&gt;
&lt;br /&gt;
        int lsType = physGetLinksetType();&lt;br /&gt;
&lt;br /&gt;
        PHYS_LINK_TYPE_FIXED  = 1234;&lt;br /&gt;
        PHYS_LINK_TYPE_HINGE  = 4;&lt;br /&gt;
        PHYS_LINK_TYPE_SPRING = 9;&lt;br /&gt;
        PHYS_LINK_TYPE_6DOF   = 6;&lt;br /&gt;
        PHYS_LINK_TYPE_SLIDER = 7;&lt;br /&gt;
&lt;br /&gt;
        physChangeLinkType(int linkNum, int lType)&lt;br /&gt;
&lt;br /&gt;
        physGetLinkType(int linkNum)&lt;br /&gt;
&lt;br /&gt;
        physChangeLinkFixed(int linkNum)&lt;br /&gt;
&lt;br /&gt;
        PHYS_PARAM_FRAMEINA_LOC           = 14401;&lt;br /&gt;
        PHYS_PARAM_FRAMEINA_ROT           = 14402;&lt;br /&gt;
        PHYS_PARAM_FRAMEINB_LOC           = 14403;&lt;br /&gt;
        PHYS_PARAM_FRAMEINB_ROT           = 14404;&lt;br /&gt;
        PHYS_PARAM_LINEAR_LIMIT_LOW       = 14405;&lt;br /&gt;
        PHYS_PARAM_LINEAR_LIMIT_HIGH      = 14406;&lt;br /&gt;
        PHYS_PARAM_ANGULAR_LIMIT_LOW      = 14407;&lt;br /&gt;
        PHYS_PARAM_ANGULAR_LIMIT_HIGH     = 14408;&lt;br /&gt;
        PHYS_PARAM_USE_FRAME_OFFSET       = 14409;&lt;br /&gt;
        PHYS_PARAM_ENABLE_TRANSMOTOR      = 14410;&lt;br /&gt;
        PHYS_PARAM_TRANSMOTOR_MAXVEL      = 14411;&lt;br /&gt;
        PHYS_PARAM_TRANSMOTOR_MAXFORCE    = 14412;&lt;br /&gt;
        PHYS_PARAM_CFM                    = 14413;&lt;br /&gt;
        PHYS_PARAM_ERP                    = 14414;&lt;br /&gt;
        PHYS_PARAM_SOLVER_ITERATIONS      = 14415;&lt;br /&gt;
        PHYS_PARAM_SPRING_AXIS_ENABLE     = 14416;&lt;br /&gt;
        PHYS_PARAM_SPRING_DAMPING         = 14417;&lt;br /&gt;
        PHYS_PARAM_SPRING_STIFFNESS       = 14418;&lt;br /&gt;
        PHYS_PARAM_LINK_TYPE              = 14419;&lt;br /&gt;
        PHYS_PARAM_USE_LINEAR_FRAMEA      = 14420;&lt;br /&gt;
        PHYS_PARAM_SPRING_EQUILIBRIUM_POINT = 14421;&lt;br /&gt;
&lt;br /&gt;
        PHYS_AXIS_ALL = -1;&lt;br /&gt;
        PHYS_AXIS_LINEAR_ALL = -2;&lt;br /&gt;
        PHYS_AXIS_ANGULAR_ALL = -3;&lt;br /&gt;
        PHYS_AXIS_LINEAR_X  = 0;&lt;br /&gt;
        PHYS_AXIS_LINEAR_Y  = 1;&lt;br /&gt;
        PHYS_AXIS_LINEAR_Z  = 2;&lt;br /&gt;
        PHYS_AXIS_ANGULAR_X = 3;&lt;br /&gt;
        PHYS_AXIS_ANGULAR_Y = 4;&lt;br /&gt;
        PHYS_AXIS_ANGULAR_Z = 5;&lt;br /&gt;
&lt;br /&gt;
        physChangeLinkParams(params ....)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Next_Gen</id>
		<title>Next Gen</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Next_Gen"/>
				<updated>2022-02-15T17:17:03Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Initial talking about what should be done by Misterblue&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A wiki area to discuss a possible next generation OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
There are many people and groups who have forks and OpenSim side projects. &lt;br /&gt;
MisterBlue on 14-Feb-2022 suggested puling these side projects together and&lt;br /&gt;
make a new and improved future OpenSimulator. &lt;br /&gt;
&lt;br /&gt;
MisterBlue is creating a new protocol and viewer that initially works with OpenSim.&lt;br /&gt;
A new viewer is a first step toward breaking away from the chains of Second Life&lt;br /&gt;
compatibility.&lt;br /&gt;
&lt;br /&gt;
The list of requested features from attendees of [http://conference.opensimulator.org/2021/ OpenSimulator Community Conference 2021 (OSCC21)] is a good starting point.&lt;br /&gt;
&lt;br /&gt;
* [[OSCC21_Suggestions|OSCC21 Audience Feature Suggestions]]&lt;br /&gt;
&lt;br /&gt;
Misterblue 20220215: This effort is to invigorate and advance OpenSimulator for the most recent rediscovery of metaverses.&lt;br /&gt;
The goal is not to re-engineer everything to create the ultimate metaverse.&lt;br /&gt;
The goal is to address large features that are limiting OpenSimulator's deployment and use.&lt;br /&gt;
In the end, there will be a divergence from complete mimicking of SL.&lt;br /&gt;
&lt;br /&gt;
There will be incorporation of technologies like:&lt;br /&gt;
&lt;br /&gt;
* popular asset creation tools (mesh editors, UI designers, etc.),&lt;br /&gt;
* standards (identity, avatar formats, asset formats, etc.),&lt;br /&gt;
* modern infrastructures (containers, monitors, etc),&lt;br /&gt;
* encryption (end-to-end encrypted chat, signed storage, etc), and&lt;br /&gt;
* storage systems.&lt;br /&gt;
&lt;br /&gt;
That's all grand vision, but on more practical grounds, the OSCC21 feature suggestions break into:&lt;br /&gt;
&lt;br /&gt;
* Use of popular asset formats for world and avatars (FBX, GLTF, VRM, etc)&lt;br /&gt;
* Use of popular external asset creation tools (Blender, etc)&lt;br /&gt;
* Updated user documentation&lt;br /&gt;
* Improved in-world asset representations (trees, PBM materials, etc)&lt;br /&gt;
* Incorporation of hyped metaverse tech (VR, text-to-speech, etc)&lt;br /&gt;
&lt;br /&gt;
And add to these operational features:&lt;br /&gt;
&lt;br /&gt;
* Easy to install and operate (db management, etc)&lt;br /&gt;
* Better access control (connection control, user management, etc)&lt;br /&gt;
* Security (for inter-grid and inter-user communication)&lt;br /&gt;
&lt;br /&gt;
== Standards and Metaverse Standard Groups That Might Be Interesting ==&lt;br /&gt;
&lt;br /&gt;
* [https://vrm-consortium.org VRM Avatars], [https://github.com/vrm-c Github]: humanoid avatar format popular with vtubers, VRChat, etc&lt;br /&gt;
* [http://infinitemetaverse.com/ Infinite Metaverse Alliance]&lt;br /&gt;
* [https://omigroup.org/home/ Open Metaverse Interoperability Group]&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Development_Team</id>
		<title>Development Team</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Development_Team"/>
				<updated>2017-04-11T18:51:48Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Quicklinks}} &lt;br /&gt;
&lt;br /&gt;
== Active Core Developers ==&lt;br /&gt;
&lt;br /&gt;
Developers who have commit access to our central server, are [http://www.ohloh.net/projects/4753/contributors regular contributors] to the codebase, and have voting rights over development and process issues of the OpenSimulator project. See [[Organization]]. &lt;br /&gt;
&lt;br /&gt;
* '''Only voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Melanie T|Melanie_T]] &lt;br /&gt;
| Melanie &lt;br /&gt;
| Melanie Milland &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +1 &lt;br /&gt;
| Independent &lt;br /&gt;
| Scripting, Prims/Scene, Life, The Universe, and Everything&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Diva|Diva]] &lt;br /&gt;
| Crista Lopes &lt;br /&gt;
| Diva Canto &lt;br /&gt;
| Crista Lopes / Diva Canto &lt;br /&gt;
| -8 &lt;br /&gt;
| University of California, Irvine &lt;br /&gt;
| Everything, except databases&lt;br /&gt;
|-&lt;br /&gt;
| [[User:BlueWall|BlueWall]] &lt;br /&gt;
| James Hughes &lt;br /&gt;
| BlueWall Slade &lt;br /&gt;
| BlueWall Slade &lt;br /&gt;
| -5 &lt;br /&gt;
| BlueWall Information Technologies, LLC &lt;br /&gt;
| Various parts&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nebadon|Nebadon]] &lt;br /&gt;
| Michael Emory Cerquoni &lt;br /&gt;
| Nebadon Izumi &lt;br /&gt;
| Nebadon Izumi &lt;br /&gt;
| -5 New Jersey &lt;br /&gt;
| Oni Kenkon Creations, Encitra, 4Dialog, Avacon&lt;br /&gt;
| Building, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| misterblue&lt;br /&gt;
| Robert Adams&lt;br /&gt;
| misterblue waves&lt;br /&gt;
| misterblue waves&lt;br /&gt;
| -8 Oregon, USA&lt;br /&gt;
| self &lt;br /&gt;
| simulator devel, physics (BulletSim), protocol, alt viewers&lt;br /&gt;
|-&lt;br /&gt;
| orenh&lt;br /&gt;
| Oren Hurvitz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
| Kitely&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Plugh&lt;br /&gt;
| Kevin Cozens&lt;br /&gt;
| Andrew Hellershanks&lt;br /&gt;
| Andrew Hellershanks&lt;br /&gt;
| -5&lt;br /&gt;
| Virtual Highway&lt;br /&gt;
| Building, Scripting&lt;br /&gt;
|-&lt;br /&gt;
| AliciaRaven&lt;br /&gt;
| Alicia Richardson &lt;br /&gt;
| ClaudiaDLioncourt&lt;br /&gt;
| Alicia Raven (Spellscape) &lt;br /&gt;
| 0 GMT&lt;br /&gt;
| Spellscape Ltd&amp;lt;br /&amp;gt;http://www.spellscape.co.uk&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Ubit&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Core Developers Following the White Rabbit ==&lt;br /&gt;
&lt;br /&gt;
Core developers who have temporarily (we hope) gone chasing the white rabbit. They are in all similar to the active core developers, except that they haven't been that active lately, so their voting rights are awaiting their come back. &lt;br /&gt;
&lt;br /&gt;
* '''Only voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Lbsa71|lbsa71]] &lt;br /&gt;
| Stefan Andersson &lt;br /&gt;
| Tribal Skytower &lt;br /&gt;
| OSG:Stefan Andersson&amp;lt;br /&amp;gt;TN:Stefan Andersson &lt;br /&gt;
| +1 &lt;br /&gt;
| [http://tribalmedia.se/ Tribal Media AB] &lt;br /&gt;
| Web Integration&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MW|MW]] &lt;br /&gt;
| Darren &lt;br /&gt;
| Wright Juran &lt;br /&gt;
| &lt;br /&gt;
| 0 &lt;br /&gt;
| &lt;br /&gt;
| Everything&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Adam Frisby|Adam Frisby]] &lt;br /&gt;
| Adam Frisby &lt;br /&gt;
| Adam Zaius &lt;br /&gt;
| &lt;br /&gt;
| +8 &lt;br /&gt;
| DeepThink Pty Ltd &lt;br /&gt;
| Terrain, Performance&lt;br /&gt;
|-&lt;br /&gt;
| ckrinke &lt;br /&gt;
| Charles&amp;amp;nbsp;Krinke &lt;br /&gt;
| Charlesk&amp;amp;nbsp;Bing &lt;br /&gt;
| &lt;br /&gt;
| -8 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Reliability/Grid servers/ll-functions&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mikem|mikem]] &lt;br /&gt;
| Mike Mazur &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| Independent &lt;br /&gt;
| Patches, scripting improvements, LSL compiler&lt;br /&gt;
|-&lt;br /&gt;
| [[User:HomerHorwitz|homerh]] &lt;br /&gt;
| Homer Horwitz &lt;br /&gt;
| Homer Horwitz &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +2 &lt;br /&gt;
| Independent &lt;br /&gt;
| Rev. engineering, &amp;quot;now, that's funny&amp;quot; problems, but still interested in all parts of it&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nlin|nlin]] &lt;br /&gt;
| N Lin &lt;br /&gt;
| Standard Drucker &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| [http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br /&amp;gt;http://www.3di.jp/en/ &lt;br /&gt;
| Physics, scripting, more to come&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Arthursv|arthursv]] &lt;br /&gt;
| Arthur Valadares &lt;br /&gt;
| &lt;br /&gt;
| NONE &lt;br /&gt;
| -8 &lt;br /&gt;
| University of California, Irvine &lt;br /&gt;
| Unit testing, database plugins, bug fixes, general&lt;br /&gt;
|-&lt;br /&gt;
| [[User:DrScofield|drscofld]] &lt;br /&gt;
| Dirk Husemann &lt;br /&gt;
| Dr Scofield &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| [http://xyzzyxyzzy.net/ xyzzyxyzzy.net] &lt;br /&gt;
| Reliability, networking protocols, inventory, assets, remote control, voice, and pretty much everything else&amp;amp;nbsp;:-) &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:Teravus|Teravus]] &lt;br /&gt;
| Daniel Olivares &lt;br /&gt;
| Teravus Ousley &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| W3z &lt;br /&gt;
| Physics &amp;amp;amp; Admin tools, A working sim.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Chi11ken|chi11ken]] &lt;br /&gt;
| Jeff Ames &lt;br /&gt;
| Chillken Proto &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| [http://www.genkii.com Genkii] &lt;br /&gt;
| &amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Marck|Marck00]] &lt;br /&gt;
| M. Kirsch &lt;br /&gt;
| Marck Kjeller &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| Independent &lt;br /&gt;
| Everything that catches my attention and that I can get my head around. &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:Snoopy2|Snoopy2]] &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
|&lt;br /&gt;
| [http://www.dreamlandmetaverse.com/ http://www.dreamlandmetaverse.com/] &lt;br /&gt;
| OpenSim region and grid hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Justincc|justincc]] &lt;br /&gt;
| Justin Clark-Casey &lt;br /&gt;
| Lulworth Beaumont &lt;br /&gt;
| Justin Clark-Casey (all other grids) &lt;br /&gt;
| 0 &lt;br /&gt;
| OSVW Consulting&amp;lt;br /&amp;gt;[http://justincc.org/blog justincc's OpenSimulator blog] &lt;br /&gt;
| Grid, performance &amp;amp;amp; reliability, inventory (avatar and object), assets, scenes, OARs, etc. Generally speaking, my main interest is to create infrastructure that other people can build on top of.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Dslake|dslake]] &lt;br /&gt;
| Dan Lake &lt;br /&gt;
| Dan Lake &lt;br /&gt;
| ScienceSim &lt;br /&gt;
| -8 / -7 &lt;br /&gt;
| Intel &lt;br /&gt;
| Scalability, Performance, Network stack&lt;br /&gt;
|-&lt;br /&gt;
| cmickeyb &lt;br /&gt;
| Mic Bowman &lt;br /&gt;
| Mic Bowman &lt;br /&gt;
| ScienceSim &lt;br /&gt;
| -8 / -7 &lt;br /&gt;
| Intel &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retired Core Developers ==&lt;br /&gt;
&lt;br /&gt;
Core developers who have transcended our mortal plane, i.e. they are no longer directly engaged with the project. Thank you forever for your contributions! &lt;br /&gt;
&lt;br /&gt;
* '''Only formerly voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Babblefrog|babblefrog]] &lt;br /&gt;
| Brian McBee &lt;br /&gt;
| Dogen Coldstream &lt;br /&gt;
| Babblefrog Ballistic (osgrid) &lt;br /&gt;
| -8 &lt;br /&gt;
| Disorganized &lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Danx0r|danx0r]] &lt;br /&gt;
| Dan Miller &lt;br /&gt;
| Albert Pascal &lt;br /&gt;
| &lt;br /&gt;
| -8 &lt;br /&gt;
| squiggle.com &lt;br /&gt;
| PHEEZIKS; everything&lt;br /&gt;
|-&lt;br /&gt;
| Tleiades &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Tleiades&amp;amp;nbsp;Hax &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Grid servers/Database&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Darok|Darok]] &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Darok Kaminski &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Physics engines (especially BulletX)&lt;br /&gt;
|-&lt;br /&gt;
| Gareth / Gwen &lt;br /&gt;
| Gareth Nelson &lt;br /&gt;
| Gareth Ellison &lt;br /&gt;
| Gareth Nelson (on everywhere but SL) &lt;br /&gt;
| BST (UTC+1) &lt;br /&gt;
| Litesim Ltd &lt;br /&gt;
| Grid servers, sim border crossing, avatar animations&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Dalien|dalien]] &lt;br /&gt;
| Dalien Talbot &lt;br /&gt;
| Dalien Talbot &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| Mostly TCP-based &lt;br /&gt;
| Small fixes; rev.eng./prototyping; nightlies; git-keeper&lt;br /&gt;
|-&lt;br /&gt;
| [[Alondria]] &lt;br /&gt;
| &lt;br /&gt;
| Alondria LeFay &lt;br /&gt;
| Alondria LeFay (OSGrid) &lt;br /&gt;
| -8 &lt;br /&gt;
| Independent &lt;br /&gt;
| Implementation of LSL functions and other scripting tidbits.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:SeanDague|sdague]] &lt;br /&gt;
| Sean Dague &lt;br /&gt;
| Neas Bade &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Database, Linux, Testing, Misc&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MingChen|MingChen]] &lt;br /&gt;
| Mike/Michael Ortman &lt;br /&gt;
| Ming Chen &lt;br /&gt;
| &lt;br /&gt;
| -6 (-5 in Summer) &lt;br /&gt;
| DeepThink Pty Ltd &lt;br /&gt;
| Estate/Parcel Support/Modules/Keeping things all neat and tidy.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Tedd|Tedd]] &lt;br /&gt;
| Tedd Hansen &lt;br /&gt;
| Tedd Maa &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| Tedd Hansen &lt;br /&gt;
| Programming/Scripting/Architecture&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Adjohn|adjohn]] &lt;br /&gt;
| Adam Johnson &lt;br /&gt;
| Zeuz Zenovka &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| [http://www.genkii.com Genkii] &lt;br /&gt;
| &amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Joha1|joha1]] &lt;br /&gt;
| Johan Berntsson &lt;br /&gt;
| Joppi Brandenburg &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Performance, packet handling/libSL&lt;br /&gt;
|-&lt;br /&gt;
| jhurliman &lt;br /&gt;
| John Hurliman &lt;br /&gt;
| John Hurliman &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Dahlia|dahlia]] &lt;br /&gt;
| T. Hoff &lt;br /&gt;
| Dahlia Trimble &lt;br /&gt;
| &lt;br /&gt;
| -8 / -7 &lt;br /&gt;
| Independent &lt;br /&gt;
| Collision geometry, various math and physics issues, occasional bug fixes and random enhancements&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wiki Sysops ==&lt;br /&gt;
&lt;br /&gt;
Along with the core developers, these people help manage the OpenSimulator wiki as well as make other contributions (see Areas of Interest). &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Makopoppo|Makopoppo]] &lt;br /&gt;
| Makiko Nomura &lt;br /&gt;
| Mako Nozaki &lt;br /&gt;
| Everywhere &lt;br /&gt;
| +9 Tokyo, Japan &lt;br /&gt;
| As an individual developer &lt;br /&gt;
| Everything for improving usability and connectability - wiki/issue management, documentation, localization(Japanese), modifying the interface mainly of core modules&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Fritigern|Fritigern]] &lt;br /&gt;
| S-E-C-R-E-T &lt;br /&gt;
| Fritigern Gothly &lt;br /&gt;
| SecondLife, OSGrid &lt;br /&gt;
| +1 GMT &lt;br /&gt;
| &lt;br /&gt;
| My interests are many, and extremely varied. One thing that i am very interested in, is seeing OpenSimulator grow, mature, and develop into something that really does rival SL/LL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Additional Developers/Testers/Contributors ==&lt;br /&gt;
&lt;br /&gt;
These people have contributed and/or are contributing bug reports, patches, testing, and all sorts of other goodies to the project. &amp;lt;br /&amp;gt; '''Newcomers please add yourself to bottom of the list!''' &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jtclark48|jclark4]] &lt;br /&gt;
| Jay Clark &lt;br /&gt;
| Jay Clarke &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Physics, Grid Host, AI, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| [[User:AdamStevenson|BigFootAg]] &lt;br /&gt;
| Adam Stevenson &lt;br /&gt;
| Adamus Petrov &lt;br /&gt;
| &lt;br /&gt;
| -6 &lt;br /&gt;
| Texas A&amp;amp;amp;M University &lt;br /&gt;
| AI, Skynet, Evolving Systems, Biology&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jeff1564|Jeff1564]] &lt;br /&gt;
| Jeff &lt;br /&gt;
| Potter Taurog &lt;br /&gt;
| Potter Taurog &lt;br /&gt;
| -8 &lt;br /&gt;
| http://myopengrid.com &lt;br /&gt;
| Building, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| Rock_Vacirca &lt;br /&gt;
| Colin Withers &lt;br /&gt;
| Rock Vacirca &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +1 &lt;br /&gt;
| http://rock-vacirca.blogspot.com &lt;br /&gt;
| Testing, building, scripting, maintaining an opensim blog.&lt;br /&gt;
|-&lt;br /&gt;
| simsim &lt;br /&gt;
| caocao &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +9 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Testing whole functions of OpenSimulator system,working with OpenSim-Engine,reporting on OpenSimulator&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Vicero Lambert|Vicero Lambert]] &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Magi|Magi]] &lt;br /&gt;
| Andy Agnew &lt;br /&gt;
| Magi Merlin &lt;br /&gt;
| &lt;br /&gt;
| +10 &lt;br /&gt;
| Spun Pty Ltd &lt;br /&gt;
| 3D Web Integration, Database stuff and playing with the odds and ends box.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:ClarkZone|ClarkZone]] &lt;br /&gt;
| Troy Admin(@ClarkZone) &lt;br /&gt;
| Troy Childs &lt;br /&gt;
| Troy Admin (ClarkZone) &lt;br /&gt;
| -5 &lt;br /&gt;
| Http://clarkzone.dyndns.org &lt;br /&gt;
| Tester and Grid Host&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Aiaustin|aiaustin]] &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| +0 &lt;br /&gt;
| AIAI, Virtual University of Edinburgh&amp;lt;br /&amp;gt;http://www.aiai.ed.ac.uk/~ai/&amp;lt;br /&amp;gt;http://vue.ed.ac.uk/openvue/ &lt;br /&gt;
| Windows tests&amp;lt;br /&amp;gt;Content testing&amp;lt;br /&amp;gt;Use of multiple VWs&lt;br /&gt;
|-&lt;br /&gt;
| Marc Manders &lt;br /&gt;
| Marc Manders &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +6 &lt;br /&gt;
| marcmanders@gmail.com &lt;br /&gt;
| Creative features&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Balthazar|balthazar]] &lt;br /&gt;
| Trevor Brooks &lt;br /&gt;
| Balthazar Sin &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| None &lt;br /&gt;
| Terrains, testing and some small coding tasks&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jimbo2120|jimbo2120]] &lt;br /&gt;
| Michael Osias &lt;br /&gt;
| Illuminous Beltran &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Grid, AI, Skynet, coding and testing&lt;br /&gt;
|-&lt;br /&gt;
| ZeroPoint &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Guilderoy&amp;amp;nbsp;Dench &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Programming/Database&lt;br /&gt;
|-&lt;br /&gt;
| [[User:DerekTang|DerekTang]] &lt;br /&gt;
| Derek Tang &lt;br /&gt;
| Derek Timeless &lt;br /&gt;
| Derek Tang (ChineseGrid) &lt;br /&gt;
| +8 &lt;br /&gt;
| http://ChineseGrid.net &lt;br /&gt;
| Running a public WINDOWS sim for testing, Docs, Helping Chinese users to enjoy OpenSim; building Chinese OpenSimulator communities. In construction...&lt;br /&gt;
|-&lt;br /&gt;
| [[User:TayB|TayB]] &lt;br /&gt;
| Earl Balai &lt;br /&gt;
| Taylor Dae &lt;br /&gt;
| &lt;br /&gt;
| -10 &lt;br /&gt;
| WhynGrid &lt;br /&gt;
| Grid Host,Networking,Contributions &amp;amp;amp; Testing.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:JamieDav|JamieDav]] &lt;br /&gt;
| Jamie David &lt;br /&gt;
| Jamie David &lt;br /&gt;
| &lt;br /&gt;
| +7 &lt;br /&gt;
| Forum &lt;br /&gt;
| Grid, Sim, Avitar, Functionality&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Krtaylor|Krtaylor]] &lt;br /&gt;
| Kurt Taylor &lt;br /&gt;
| Kurt Stringer &lt;br /&gt;
| &lt;br /&gt;
| -6 &lt;br /&gt;
| IBM &lt;br /&gt;
| Grid, Networking, Monitoring, Scripting, Inventory, Testing&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nink|Nink]] &lt;br /&gt;
| Peter Finn &lt;br /&gt;
| Nink Noonan &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Disruptive Influence.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Bruce|Bruce]] &lt;br /&gt;
| Bruce Meerson &lt;br /&gt;
| Bruce Meerson &lt;br /&gt;
| &lt;br /&gt;
| +8 &lt;br /&gt;
| HiPiHi &lt;br /&gt;
| Watching.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Darb|DarbD]] &lt;br /&gt;
| Brian B. Quinn &lt;br /&gt;
| Darb Dabney &lt;br /&gt;
| regions&amp;lt;br /&amp;gt;near Marin &lt;br /&gt;
| PST/SLT (-7 or -8) &lt;br /&gt;
| County of Marin, California&amp;lt;br /&amp;gt; http://blog.3dmap.me &lt;br /&gt;
| LiDAR-based sculpties, real-world terrain, &amp;lt;br /&amp;gt;pursuit of civic paraverses, virtual Emergency Operations Centers&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Charlie Omega|CharlieO]] &lt;br /&gt;
| Dan &lt;br /&gt;
| Charlie Omega &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Mild coding/tweaking/simple feature adds, Stress testing/break stuff, Testing limits of existing code. Making sure [[LSL Status]] is up to date&lt;br /&gt;
|-&lt;br /&gt;
| oobscure &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Opensource Obscure &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.opensim.it &lt;br /&gt;
| Running a public Linux sim for testing, Docs, Helping italian users, Building opensim communities, Watching&lt;br /&gt;
|-&lt;br /&gt;
| pitman &lt;br /&gt;
| Mike Pitman &lt;br /&gt;
| Rez Tone &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| IBM &lt;br /&gt;
| Scientific visualization schemes, virt world product design, persistant workspaces, virt world based big biz&lt;br /&gt;
|-&lt;br /&gt;
| Shenlei &lt;br /&gt;
| Shenlei Winkler &lt;br /&gt;
| Shenlei Flasheart, Shenlei Winkler &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Fashion Research Institute &lt;br /&gt;
| Product Design and Development, Apparel industry, and o yes, I wrote the book&amp;amp;nbsp;;)&lt;br /&gt;
|-&lt;br /&gt;
| cmu &lt;br /&gt;
| Christopher Mumme &lt;br /&gt;
| Snook Destiny &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.cmu-develop.de/ and research group &amp;quot;Collaboration Systems and CSCW&amp;quot; at Clausthal University of Technology &lt;br /&gt;
| Testing OpenSim, working with OpenSim-Engine, reporting on OpenSimulator&lt;br /&gt;
|-&lt;br /&gt;
| [[Silpol]] &lt;br /&gt;
| Andriy Tymchenko &lt;br /&gt;
| Andy Tir &lt;br /&gt;
| &lt;br /&gt;
| EET (+2/3) &lt;br /&gt;
| http://silpol.blogspot.com/ (also visible at Nokia) &lt;br /&gt;
| Highly uncoordinated mess with elements of palace games, under-table diplomacy, rebellion, coup d'état and mutiny. optionally pirate&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Grumly|Grumly]] &lt;br /&gt;
| &lt;br /&gt;
| Forest Klaar &lt;br /&gt;
| Grumly TheBear &lt;br /&gt;
| GMT+1 &lt;br /&gt;
| .NET MCAD Dev/Arch/Trainer http://www.devoteam.com &lt;br /&gt;
| Trying to get into OpenSimulator code for now. Particularly interrested in data persistence. blog (Hello, Avatar!): http://lslblog.free.fr&lt;br /&gt;
|-&lt;br /&gt;
| [[User:DaTwitch|DaTwitch]] &lt;br /&gt;
| James G. Stallings II &lt;br /&gt;
| &amp;lt;br /&amp;gt;Lazarus Longstaff &lt;br /&gt;
| Hiro Protagonist (OSGrid) &lt;br /&gt;
| -5 &lt;br /&gt;
| House Husband &lt;br /&gt;
| OSGrid Region owner, OSGrid Operator,&amp;lt;br /&amp;gt;Forum Admin, sometime wiki editor&lt;br /&gt;
|-&lt;br /&gt;
| gryc &lt;br /&gt;
| Gryc Ueusp &lt;br /&gt;
| Gryc Uriza &lt;br /&gt;
| Gryc Uriza(OSGrid) &lt;br /&gt;
| -6 &lt;br /&gt;
| &lt;br /&gt;
| PHP scripting, web interfaces, interconnectivity, cross-platformedness&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Phrearch|Phrearch]] &lt;br /&gt;
| Jeroen van Veen &lt;br /&gt;
| Phrearch Miles &lt;br /&gt;
| Phrearch Miles(OSGrid) &lt;br /&gt;
| Amsterdam/Paris &lt;br /&gt;
| &lt;br /&gt;
| HWIOS, WiXTD, Wikidoc, Moo, User interfaces&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Burnman|Burnman]] &lt;br /&gt;
| Allen &lt;br /&gt;
| Burnman Bedlam &lt;br /&gt;
| &lt;br /&gt;
| Boston, USA &lt;br /&gt;
| &lt;br /&gt;
| Testing, testing, and more testing! Getting familiar with the source, interested in all aspects of the project.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Krisbfunk|krisbfunk]] &lt;br /&gt;
| Kris Bulman &lt;br /&gt;
| Krisbfunk Vought &lt;br /&gt;
| Krisbfunk Nocturnal(OSGrid) &lt;br /&gt;
| PE, Canada (-4) &lt;br /&gt;
| Edactive Technologies&amp;lt;br /&amp;gt;NocturnalEye Productions&amp;lt;br /&amp;gt;UPEI &lt;br /&gt;
| Currently: Testing, bug reports, wiki updating, building on OSGrid&lt;br /&gt;
|-&lt;br /&gt;
| [[User:HashBox|HashBox]] &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Sibariel Darkstone &lt;br /&gt;
| Sibariel Darkstone (OSGrid) &lt;br /&gt;
| New Zealand (+12) &lt;br /&gt;
| &lt;br /&gt;
| Testing, bug reports, and updating the wiki.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Kinoc|Kinoc]] &lt;br /&gt;
| Kino Coursey &lt;br /&gt;
| Daxxon Jaxxon &lt;br /&gt;
| Daxxon Kinoc (OSgrid) &lt;br /&gt;
| -6 &lt;br /&gt;
| Daxtron Laboratories &amp;lt;br /&amp;gt; http://www.daxtron.com&amp;lt;br /&amp;gt; University of North Texas &lt;br /&gt;
| AI, Semantic web, Ontologies, Natural Laanguage Processing, Cyc, Bots, NPC&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Trapuh|trapuh]] &lt;br /&gt;
| Pedro Ribeiro &lt;br /&gt;
| Vaiten Forder &lt;br /&gt;
| &lt;br /&gt;
| GMT &lt;br /&gt;
| University Student, Escola Superior de Educação de Viseu, Portugal &lt;br /&gt;
| Testing, eventual bug reports and wiki. Music, web/digital arts and php+sql.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:SonicViz|SonicViz]] &lt;br /&gt;
| Paul Cohen &lt;br /&gt;
| Komuso Tokugawa &lt;br /&gt;
| &lt;br /&gt;
| +9 &lt;br /&gt;
| Http://sonicviz.com &lt;br /&gt;
| Audio/Music, Interactive Music, Control Protocols, Interfaces, VisualFX, Procedural animation/Generative systems + testing and general dev&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mokele|mokele]] &lt;br /&gt;
| Scott Norman &lt;br /&gt;
| Mokelembembe Mokeev &lt;br /&gt;
| &lt;br /&gt;
| -8 (Southern California) &lt;br /&gt;
| Web Developer (PHP and MySQL) &lt;br /&gt;
| Interested in seeing running on PowerPC Macs which it is. So, when I can, I'll compile and test on PowerPC Mac (PowerBook G4) and submit reports and then update the wiki if need on installing on Mac. Also have a Ubuntu 7.10 server that I can do testing on too.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Devalnor|devalnor]] &lt;br /&gt;
| Devalnor &lt;br /&gt;
| M. Watkin &lt;br /&gt;
| &lt;br /&gt;
| +1 (Belgium) &lt;br /&gt;
| &lt;br /&gt;
| Small Patch code, bug reports, and updating the wiki.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Ezekiel|Ezekiel]] &lt;br /&gt;
| Ezekiel &lt;br /&gt;
| Ezekiel Zabelin &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.yosims.com &lt;br /&gt;
| Concepts, business aspects of virtual worlds - web developer (PHP, MySQL, Javascript, LSL)&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Buggmaster|Buggmaster]] &lt;br /&gt;
| Mike D &lt;br /&gt;
| Bug Master &lt;br /&gt;
| None &lt;br /&gt;
| -8 &lt;br /&gt;
| http://www.adultmetaverse.com &lt;br /&gt;
| Grid, Data/Web PHP/PERL/MySQL&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nixnerd|nixnerd]] &lt;br /&gt;
| &lt;br /&gt;
| Dangerously Moody &lt;br /&gt;
| None &lt;br /&gt;
| GMT &lt;br /&gt;
| http://www.integratedtechnologies.eu &lt;br /&gt;
| Cross Platform Testing, Feedback, Bug Reporting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MoHax|mohax]] &lt;br /&gt;
| Mo Hax &lt;br /&gt;
| Mo Hax &lt;br /&gt;
| &lt;br /&gt;
| -5 Eastern &lt;br /&gt;
| IBM &lt;br /&gt;
| Testing, Feedback, Content Contributions, Bug Reporting, Documenting, Development&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Webmage|webmage]] &lt;br /&gt;
| webmage &lt;br /&gt;
| Leyla Masala &lt;br /&gt;
| Web Mage &lt;br /&gt;
| +1 &lt;br /&gt;
| IBM &lt;br /&gt;
| Testing, terrain&lt;br /&gt;
|-&lt;br /&gt;
| [[User:NLStitch|NLStitch]] &lt;br /&gt;
| Marijn Oosterveld &lt;br /&gt;
| Stitch Seale &lt;br /&gt;
| NYA &lt;br /&gt;
| GMT +1 Amsterdam &lt;br /&gt;
| Twingate Systems (http://www.twingate.nl)&amp;lt;br /&amp;gt;HanzeHogeschool Groningen, Netherlands &lt;br /&gt;
| Programming, Photography, AI&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Ideia Boa|Ideia Boa]] &lt;br /&gt;
| Joao Lopes &lt;br /&gt;
| Ideia Boa &lt;br /&gt;
| Ideia Boa or Boa Ideia in some grids &lt;br /&gt;
| GTM+1 Stockholm/Sweden &lt;br /&gt;
| WorldSimTERRA - Virtual World that speaks Portuguese too&amp;lt;br /&amp;gt;http://www.worldsimterra.com &lt;br /&gt;
| Testing and more testing! Updating the original wiki and translating the OpenSimulator Wiki into Portuguese and reporting on OpenSimulator&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Lulurun|lulurun]] &lt;br /&gt;
| liu &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| 3Di Inc, Japan &amp;lt;br /&amp;gt;http://www.3di.jp &lt;br /&gt;
| Patches, openid, server performance, UGAI&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Carlosroundel|Carlosrounde]] &lt;br /&gt;
| Carlosroundel &lt;br /&gt;
| Carlos Roundel &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +1 &lt;br /&gt;
| Cyberlandia Italy&amp;lt;br /&amp;gt;http://www.cyberlandia.net &lt;br /&gt;
| Grid, programmer, database, tester&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mikebert|Mikebert]] &lt;br /&gt;
| Michael Strunck &lt;br /&gt;
| Mikebert Miles &lt;br /&gt;
| Mikebert M34 &lt;br /&gt;
| +1 &lt;br /&gt;
| OpenSIM Wiki, Germany&amp;lt;br /&amp;gt;http://www.opensim.de &lt;br /&gt;
| German Wiki, Translater, Server Performance (Linux/Windows), Tester, Feedback, Bug Reporting, Server-Hosting&lt;br /&gt;
|-&lt;br /&gt;
| Taoki &lt;br /&gt;
| Mircea Kitsune / Taoki Vixen &lt;br /&gt;
| Mircea Kitsune (OSGrid) / Mircea Lobo (LL grid) &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| GMT +2 &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| Usually testing and bug reporting but I also make smaller patches where I know what to do.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Patnad|Patnad]] &lt;br /&gt;
| Patrick &lt;br /&gt;
| Patnad Babii &lt;br /&gt;
| Patnad Babii (OSGrid) &lt;br /&gt;
| GMT -5 &lt;br /&gt;
| RezzMe Technologies&amp;lt;br /&amp;gt;http://www.rezzme.com &lt;br /&gt;
| Bug testing and reporting, I code C# and have submitted a few patches&lt;br /&gt;
|-&lt;br /&gt;
| [[User:^DarkMan|^DarkMan]] &lt;br /&gt;
| Brian Adair &lt;br /&gt;
| Patrick Ouachita &lt;br /&gt;
| Brian Adair &amp;amp;#124; Patrick Meta &lt;br /&gt;
| -6 CST &lt;br /&gt;
| RealMetaLife &amp;amp;#124; B&amp;amp;amp;H Networking &lt;br /&gt;
| Building, Scripting, Testing, etc.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Tlaukkan|Tommi Laukkanen]] &lt;br /&gt;
| Tommi Laukkanen &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Tommi Laukkanen &lt;br /&gt;
| +2 GMT &lt;br /&gt;
| http://www.bubblecloud.org &lt;br /&gt;
| Protocols ([http://www.bubblecloud.org MXP]), NHibernate, Scrip API, Map Generation, Bug Fixes, Grid Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mystical|Mystical]] &lt;br /&gt;
| Kevin Tweedy &lt;br /&gt;
| Mystical Demina &lt;br /&gt;
| Mystical Demina &lt;br /&gt;
| -5 &lt;br /&gt;
| Extreme Reality Grid&amp;lt;br /&amp;gt;http://www.XRGrid.com &lt;br /&gt;
| Windows Communication Framework, Windows Workflow,Entity Framework, MSSQL&amp;lt;br /&amp;gt;Enhancements,Commerce, Content,DotNetNuke based portal, development services&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Godfrey|Godfrey]] &lt;br /&gt;
| Jeff Lee &lt;br /&gt;
| Warin Cascabel &lt;br /&gt;
| &lt;br /&gt;
| -5 (EST5EDT) &lt;br /&gt;
| &lt;br /&gt;
| Testing, minor bugfixes. Scripting, building, animating&lt;br /&gt;
|-&lt;br /&gt;
| Jamenai &lt;br /&gt;
| Christopher Händler &lt;br /&gt;
| Jamenai Luik &lt;br /&gt;
| Jamenai Luik &lt;br /&gt;
| +1 &lt;br /&gt;
| Playneko Grid &amp;amp;#124; XIMDEX Jamenai&amp;lt;br /&amp;gt;http://www.playneko.de&amp;lt;br /&amp;gt;http://www.ximdex.de &lt;br /&gt;
| Performance,Bug Reporting, Hosting, Grid-Owner,(PHP, MySQL, Perl, JavaScript, LSL)&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Bikcmp|bikcmp]] &lt;br /&gt;
| Jason &lt;br /&gt;
| Jake1500 Allen &lt;br /&gt;
| Jason Helios (The Helios Grid) &lt;br /&gt;
| EST &lt;br /&gt;
| Blue Software &lt;br /&gt;
| Search, groups, land, and currency&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mark.malewski|Slipaway]] &lt;br /&gt;
| Mark Malewski &lt;br /&gt;
| Chris Rock &lt;br /&gt;
| &lt;br /&gt;
| -6 (-5 during summer - CDT) &lt;br /&gt;
| NexTECH / Joopla &lt;br /&gt;
| Web development &amp;amp;amp; systems integration, terrain, WIKI documentation, tutorials, testing, bug reporting and feedback.&lt;br /&gt;
|-&lt;br /&gt;
| barakademi &lt;br /&gt;
| Steve Topp &lt;br /&gt;
| barakademi Barzane &lt;br /&gt;
| same avi on baragrid OSgrid Grid4us sciencesim &lt;br /&gt;
| utc+1 (CET) paris &lt;br /&gt;
| http://xbot-sl.barakademi.org http://vps.barakademi.org/oswi http://vps.barakademi.org/oswi/loginscreen.php &lt;br /&gt;
| Music LiveMusic MetaverseMusic Opensim Libomv Mono-2.4 Linux (suse,debian,ubuntu) Admin Scripting Automating Development Intergration php mysql bash nant +++&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Robert d|robert_d]] &lt;br /&gt;
| Robert Dzikowski &lt;br /&gt;
| &lt;br /&gt;
| OSGrid: robert_d 13 &lt;br /&gt;
| UTC+1 &lt;br /&gt;
| [http://blog.rd-it.net http://blog.rd-it.net] &lt;br /&gt;
| Region Modules, Tutorials&lt;br /&gt;
|-&lt;br /&gt;
| john_ &lt;br /&gt;
| John&amp;amp;nbsp;Moyer &lt;br /&gt;
| VAJohn&amp;amp;nbsp;GeekSquad or&amp;amp;nbsp;Matthew&amp;amp;nbsp;Kendal &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| Best&amp;amp;nbsp;Buy/Geek&amp;amp;nbsp;Squad &lt;br /&gt;
| Tester&lt;br /&gt;
|-&lt;br /&gt;
| [[User:W!cKeD|_WicKeD]] &lt;br /&gt;
| Maik &lt;br /&gt;
| Maik Galaxy &lt;br /&gt;
| El Diablo &lt;br /&gt;
| +1 Germany &lt;br /&gt;
| Creatio Inc. / [http://www.OpenSimGerman.us/ OpenSimGerman.us] &lt;br /&gt;
| German Support, Translator, Building, Scripting, Testing, Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Stevie Wakowski|Stevie Wakowksi]] &lt;br /&gt;
| Steve Roberts &lt;br /&gt;
| Stevie Wakowski &lt;br /&gt;
| &lt;br /&gt;
| +10 Australia &lt;br /&gt;
| IBM &lt;br /&gt;
| OpenSimulator builds, Linux, Modrex, bug reporting, evangalist for OpenSimulator in business applications.&lt;br /&gt;
|-&lt;br /&gt;
| Revolution &lt;br /&gt;
| Matthew &lt;br /&gt;
| Revolution Smythe &lt;br /&gt;
| Revolution Smythe &lt;br /&gt;
| -6 Central USA &lt;br /&gt;
| None &lt;br /&gt;
| Script engine, physics engine, general odd bugs, interesting and odd things&lt;br /&gt;
|-&lt;br /&gt;
| [[User:ClemsonGS|clemsonGS]] &lt;br /&gt;
| Brian Cass &lt;br /&gt;
| BC Sands &lt;br /&gt;
| Brian Cass (VWC Grid) &lt;br /&gt;
| -5 &lt;br /&gt;
| http://www.cvwconline.org/ &lt;br /&gt;
| Developing virtual worlds for use in higher education&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| AlexRa &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Independent &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Mikko Pallari &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Realxtend &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| StrawberryFride &lt;br /&gt;
| Chris Hart &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ReactionGrid &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:RemedyTomm|RemedyTomm]] &lt;br /&gt;
| Tom Grimshaw &lt;br /&gt;
| Tomm Remedy &lt;br /&gt;
| KGrid: Casper Warden OSGrid: Tomm Remedy &lt;br /&gt;
| UTC+0 (BST) &lt;br /&gt;
| Remedy Communications &lt;br /&gt;
| Texture pipeline, Groups, ObjectUpdates&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Rob Smart &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| IBM &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MicheilMerlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| -6 &lt;br /&gt;
| Independent &amp;lt;br /&amp;gt; [http://www.iliveisl.com/ http://www.iliveisl.com/] &lt;br /&gt;
| Scripting, patches, and testcases&lt;br /&gt;
|-&lt;br /&gt;
| Pato Donald &lt;br /&gt;
| Pato Donald &lt;br /&gt;
| Morgam Biedermann &lt;br /&gt;
| Pato Donald &lt;br /&gt;
| -3 &lt;br /&gt;
| Independent [http://www.matheusmk3.co.cc/ http://www.matheusmk3.co.cc/ &lt;br /&gt;
| Groups, Scripts, Physics, Communication, Integration&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Sera Marx &lt;br /&gt;
| Darkfire Soulstar &lt;br /&gt;
| &lt;br /&gt;
| +12 &lt;br /&gt;
| Radiance promotions &lt;br /&gt;
| Grid Host, Commissioner. ~ Anyone looking for work related to the development of Opensimulator or Viewers please contact me. Any work undertaken for me will be returned to Opensimulator unless made strictly for my Grid&lt;br /&gt;
|-&lt;br /&gt;
|[[User:dz|dz]]  &lt;br /&gt;
| Doug Osborn &lt;br /&gt;
| ydoo magic&lt;br /&gt;
| delta zed @ OSGRID Doug Osborn @ ScienceSim &amp;amp; MOSES grids&lt;br /&gt;
| PST/SLT (-7 or -8) &lt;br /&gt;
| CEO OpenSimian &lt;br /&gt;
| Performance testing, advanced scripting, high prim count builds,  Client and server side bots, Animation Overrides, MANTIS maintenance.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Hallow Palmer|Hallow Palmer]] &lt;br /&gt;
| Markus &lt;br /&gt;
| Hallow Palmer &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +1 &lt;br /&gt;
| Grid4Us&amp;lt;br /&amp;gt;http://www.grid4us.net &lt;br /&gt;
| Server Performance (Windows), Tester, Feedback, Business concepts,Bug Reporting, Server-Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:LenaVanilli|LenaVanilli]] &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| +1 Germany &lt;br /&gt;
| [http://www.hypergrid.org http://www.hypergrid.org] &lt;br /&gt;
| Grid-Management, Testing Testing Testing, Region Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Aduffy70|aduffy70]] &lt;br /&gt;
| Aaron Duffy &lt;br /&gt;
| Aeran Stipe &lt;br /&gt;
| Aaron Duffy @ScienceSim &lt;br /&gt;
| -7 &lt;br /&gt;
| USU &lt;br /&gt;
| Scientific visualization &amp;amp;amp; education, Region modules, Heavily scripted regions&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Erich Bremer &lt;br /&gt;
| Erich Bremer &lt;br /&gt;
| &lt;br /&gt;
Erich Bremer@OSGrid &lt;br /&gt;
&lt;br /&gt;
| -5 &lt;br /&gt;
| http://www.ebremer.com &lt;br /&gt;
| Semantic Web, Data Visualization&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MarkIDCAS|MarkIDCAS]] &lt;br /&gt;
| Mark Bannon &lt;br /&gt;
| Mark IDCAS &lt;br /&gt;
| 3D Grid Association, AtMeeting, Valhalla Virtual and IDCAS. &lt;br /&gt;
| GMT &lt;br /&gt;
| [http://www.valhallavirtual.com http://www.valhallavirtual.com] &lt;br /&gt;
| Grid Management &amp;amp;amp; systems integration. Scripting. WIKI documentation, tutorials, bug reporting and feedback.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Allquixotic|allquixotic]] &lt;br /&gt;
| Sean McNamara &lt;br /&gt;
| Tiyuk Quellmalz &lt;br /&gt;
| OSG: Tiyuk Quellmalz &lt;br /&gt;
| -5 &lt;br /&gt;
| None &lt;br /&gt;
| Bugfixing; networking; performance; data integrity; LSL; auto-backup; null DB (eventual consistency).&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Orenh|orenh]] &lt;br /&gt;
| Oren Hurvitz &lt;br /&gt;
| &lt;br /&gt;
| Oren Hurvitz (Kitely) &lt;br /&gt;
| +2 &lt;br /&gt;
| Kitely &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:Randomhuman|randomhuman]] &lt;br /&gt;
| Kevin Houlihan &lt;br /&gt;
| random Radikal &lt;br /&gt;
| random human (OSGrid) &lt;br /&gt;
| WET/IST &lt;br /&gt;
| CrimsonCookie &lt;br /&gt;
| RemoteAdmin module; On-demand grids; web integration.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Oddball Otoole|oddball otoole]]&lt;br /&gt;
| J.v.Hogeloon&lt;br /&gt;
| Oddball Otoole&lt;br /&gt;
| Oddball Otoole (OSGrid&lt;br /&gt;
| +1 (The Netherlands&lt;br /&gt;
| None&lt;br /&gt;
| Building, scripting, testing, social stuff.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Pixel|Pixel Tomsen]]&lt;br /&gt;
| Christian Kurzhals&lt;br /&gt;
| Pixel Tomsen&lt;br /&gt;
| Pixel Tomsen OSGrid&lt;br /&gt;
| +1 (Germany&lt;br /&gt;
| see my profil&lt;br /&gt;
| Dev, Building, scripting, sim-hosting, some modules, patches, osgrid&lt;br /&gt;
|-&lt;br /&gt;
| [[User:kenearlg|kenearlg]]&lt;br /&gt;
| Ken Grunke&lt;br /&gt;
| Key Grau&lt;br /&gt;
| Key Gruin (Osgrid)&lt;br /&gt;
| -6 CST&lt;br /&gt;
| http://www.osgrid.org/&lt;br /&gt;
| testing, moderating, inworld games &amp;amp; recreation, wiki spam control&lt;br /&gt;
|-&lt;br /&gt;
| [[User:CG4Life|CG4Life]]&lt;br /&gt;
| CG Anderson&lt;br /&gt;
| Cyn Hak&lt;br /&gt;
| &lt;br /&gt;
| -8 PST&lt;br /&gt;
| Little Dogs Media&lt;br /&gt;
| Networking, Security, Performance (parallelization, compression, encryption), physics, 3D manipulation, bugfixing, documentation.  Just getting into the code base, so will start with compression/parallelizatoin ideas and bugfixing, then other stuff later.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:vegaslon|vegaslon]]&lt;br /&gt;
| Adam Ivie&lt;br /&gt;
| vegaslon plutonian&lt;br /&gt;
| &lt;br /&gt;
| -5 EST&lt;br /&gt;
| Independent &lt;br /&gt;
| Physics, Vehicles, Advanced Scripting, Testing, Advanced Land Usage.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:AliciaRaven|AliciaRaven]] &lt;br /&gt;
| Alicia Richardson &lt;br /&gt;
| ClaudiaDLioncourt&lt;br /&gt;
| Alicia Raven (Spellscape) &lt;br /&gt;
| 0 GMT&lt;br /&gt;
| Spellscape Ltd&amp;lt;br /&amp;gt;http://www.spellscape.co.uk&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retired Additional Developers ==&lt;br /&gt;
&lt;br /&gt;
Additional developers who are no longer working on the OpenSimulator project. Thank you forever for your contributions! &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Fly-man-|Fly-Man-]] &lt;br /&gt;
| Laurence &lt;br /&gt;
| &lt;br /&gt;
| OSGrid: Fly Man &lt;br /&gt;
| GMT +1 &lt;br /&gt;
| Private Company&lt;br /&gt;
| Testing, OpenSimSearch, OpenSimProfile&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tech Reference]]&lt;br /&gt;
[[Category:Help]]&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Development_Team</id>
		<title>Development Team</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Development_Team"/>
				<updated>2017-04-11T18:50:48Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: update 'misterblue' entry from 'radams'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Quicklinks}} &lt;br /&gt;
&lt;br /&gt;
== Active Core Developers ==&lt;br /&gt;
&lt;br /&gt;
Developers who have commit access to our central server, are [http://www.ohloh.net/projects/4753/contributors regular contributors] to the codebase, and have voting rights over development and process issues of the OpenSimulator project. See [[Organization]]. &lt;br /&gt;
&lt;br /&gt;
* '''Only voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Melanie T|Melanie_T]] &lt;br /&gt;
| Melanie &lt;br /&gt;
| Melanie Milland &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +1 &lt;br /&gt;
| Independent &lt;br /&gt;
| Scripting, Prims/Scene, Life, The Universe, and Everything&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Diva|Diva]] &lt;br /&gt;
| Crista Lopes &lt;br /&gt;
| Diva Canto &lt;br /&gt;
| Crista Lopes / Diva Canto &lt;br /&gt;
| -8 &lt;br /&gt;
| University of California, Irvine &lt;br /&gt;
| Everything, except databases&lt;br /&gt;
|-&lt;br /&gt;
| [[User:BlueWall|BlueWall]] &lt;br /&gt;
| James Hughes &lt;br /&gt;
| BlueWall Slade &lt;br /&gt;
| BlueWall Slade &lt;br /&gt;
| -5 &lt;br /&gt;
| BlueWall Information Technologies, LLC &lt;br /&gt;
| Various parts&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nebadon|Nebadon]] &lt;br /&gt;
| Michael Emory Cerquoni &lt;br /&gt;
| Nebadon Izumi &lt;br /&gt;
| Nebadon Izumi &lt;br /&gt;
| -5 New Jersey &lt;br /&gt;
| Oni Kenkon Creations, Encitra, 4Dialog, Avacon&lt;br /&gt;
| Building, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| misterblue&lt;br /&gt;
| Robert Adams&lt;br /&gt;
| misterblue waves&lt;br /&gt;
| misterblue waves&lt;br /&gt;
| -8 Oregon, USA&lt;br /&gt;
| self &lt;br /&gt;
| simulator devel&lt;br /&gt;
|-&lt;br /&gt;
| orenh&lt;br /&gt;
| Oren Hurvitz&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| +2&lt;br /&gt;
| Kitely&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Plugh&lt;br /&gt;
| Kevin Cozens&lt;br /&gt;
| Andrew Hellershanks&lt;br /&gt;
| Andrew Hellershanks&lt;br /&gt;
| -5&lt;br /&gt;
| Virtual Highway&lt;br /&gt;
| Building, Scripting&lt;br /&gt;
|-&lt;br /&gt;
| AliciaRaven&lt;br /&gt;
| Alicia Richardson &lt;br /&gt;
| ClaudiaDLioncourt&lt;br /&gt;
| Alicia Raven (Spellscape) &lt;br /&gt;
| 0 GMT&lt;br /&gt;
| Spellscape Ltd&amp;lt;br /&amp;gt;http://www.spellscape.co.uk&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| Ubit&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Core Developers Following the White Rabbit ==&lt;br /&gt;
&lt;br /&gt;
Core developers who have temporarily (we hope) gone chasing the white rabbit. They are in all similar to the active core developers, except that they haven't been that active lately, so their voting rights are awaiting their come back. &lt;br /&gt;
&lt;br /&gt;
* '''Only voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Lbsa71|lbsa71]] &lt;br /&gt;
| Stefan Andersson &lt;br /&gt;
| Tribal Skytower &lt;br /&gt;
| OSG:Stefan Andersson&amp;lt;br /&amp;gt;TN:Stefan Andersson &lt;br /&gt;
| +1 &lt;br /&gt;
| [http://tribalmedia.se/ Tribal Media AB] &lt;br /&gt;
| Web Integration&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MW|MW]] &lt;br /&gt;
| Darren &lt;br /&gt;
| Wright Juran &lt;br /&gt;
| &lt;br /&gt;
| 0 &lt;br /&gt;
| &lt;br /&gt;
| Everything&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Adam Frisby|Adam Frisby]] &lt;br /&gt;
| Adam Frisby &lt;br /&gt;
| Adam Zaius &lt;br /&gt;
| &lt;br /&gt;
| +8 &lt;br /&gt;
| DeepThink Pty Ltd &lt;br /&gt;
| Terrain, Performance&lt;br /&gt;
|-&lt;br /&gt;
| ckrinke &lt;br /&gt;
| Charles&amp;amp;nbsp;Krinke &lt;br /&gt;
| Charlesk&amp;amp;nbsp;Bing &lt;br /&gt;
| &lt;br /&gt;
| -8 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Reliability/Grid servers/ll-functions&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mikem|mikem]] &lt;br /&gt;
| Mike Mazur &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| Independent &lt;br /&gt;
| Patches, scripting improvements, LSL compiler&lt;br /&gt;
|-&lt;br /&gt;
| [[User:HomerHorwitz|homerh]] &lt;br /&gt;
| Homer Horwitz &lt;br /&gt;
| Homer Horwitz &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +2 &lt;br /&gt;
| Independent &lt;br /&gt;
| Rev. engineering, &amp;quot;now, that's funny&amp;quot; problems, but still interested in all parts of it&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nlin|nlin]] &lt;br /&gt;
| N Lin &lt;br /&gt;
| Standard Drucker &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| [http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br /&amp;gt;http://www.3di.jp/en/ &lt;br /&gt;
| Physics, scripting, more to come&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Arthursv|arthursv]] &lt;br /&gt;
| Arthur Valadares &lt;br /&gt;
| &lt;br /&gt;
| NONE &lt;br /&gt;
| -8 &lt;br /&gt;
| University of California, Irvine &lt;br /&gt;
| Unit testing, database plugins, bug fixes, general&lt;br /&gt;
|-&lt;br /&gt;
| [[User:DrScofield|drscofld]] &lt;br /&gt;
| Dirk Husemann &lt;br /&gt;
| Dr Scofield &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| [http://xyzzyxyzzy.net/ xyzzyxyzzy.net] &lt;br /&gt;
| Reliability, networking protocols, inventory, assets, remote control, voice, and pretty much everything else&amp;amp;nbsp;:-) &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:Teravus|Teravus]] &lt;br /&gt;
| Daniel Olivares &lt;br /&gt;
| Teravus Ousley &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| W3z &lt;br /&gt;
| Physics &amp;amp;amp; Admin tools, A working sim.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Chi11ken|chi11ken]] &lt;br /&gt;
| Jeff Ames &lt;br /&gt;
| Chillken Proto &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| [http://www.genkii.com Genkii] &lt;br /&gt;
| &amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Marck|Marck00]] &lt;br /&gt;
| M. Kirsch &lt;br /&gt;
| Marck Kjeller &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| Independent &lt;br /&gt;
| Everything that catches my attention and that I can get my head around. &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:Snoopy2|Snoopy2]] &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
|&lt;br /&gt;
| [http://www.dreamlandmetaverse.com/ http://www.dreamlandmetaverse.com/] &lt;br /&gt;
| OpenSim region and grid hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Justincc|justincc]] &lt;br /&gt;
| Justin Clark-Casey &lt;br /&gt;
| Lulworth Beaumont &lt;br /&gt;
| Justin Clark-Casey (all other grids) &lt;br /&gt;
| 0 &lt;br /&gt;
| OSVW Consulting&amp;lt;br /&amp;gt;[http://justincc.org/blog justincc's OpenSimulator blog] &lt;br /&gt;
| Grid, performance &amp;amp;amp; reliability, inventory (avatar and object), assets, scenes, OARs, etc. Generally speaking, my main interest is to create infrastructure that other people can build on top of.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Dslake|dslake]] &lt;br /&gt;
| Dan Lake &lt;br /&gt;
| Dan Lake &lt;br /&gt;
| ScienceSim &lt;br /&gt;
| -8 / -7 &lt;br /&gt;
| Intel &lt;br /&gt;
| Scalability, Performance, Network stack&lt;br /&gt;
|-&lt;br /&gt;
| cmickeyb &lt;br /&gt;
| Mic Bowman &lt;br /&gt;
| Mic Bowman &lt;br /&gt;
| ScienceSim &lt;br /&gt;
| -8 / -7 &lt;br /&gt;
| Intel &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retired Core Developers ==&lt;br /&gt;
&lt;br /&gt;
Core developers who have transcended our mortal plane, i.e. they are no longer directly engaged with the project. Thank you forever for your contributions! &lt;br /&gt;
&lt;br /&gt;
* '''Only formerly voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Babblefrog|babblefrog]] &lt;br /&gt;
| Brian McBee &lt;br /&gt;
| Dogen Coldstream &lt;br /&gt;
| Babblefrog Ballistic (osgrid) &lt;br /&gt;
| -8 &lt;br /&gt;
| Disorganized &lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Danx0r|danx0r]] &lt;br /&gt;
| Dan Miller &lt;br /&gt;
| Albert Pascal &lt;br /&gt;
| &lt;br /&gt;
| -8 &lt;br /&gt;
| squiggle.com &lt;br /&gt;
| PHEEZIKS; everything&lt;br /&gt;
|-&lt;br /&gt;
| Tleiades &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Tleiades&amp;amp;nbsp;Hax &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Grid servers/Database&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Darok|Darok]] &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Darok Kaminski &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Physics engines (especially BulletX)&lt;br /&gt;
|-&lt;br /&gt;
| Gareth / Gwen &lt;br /&gt;
| Gareth Nelson &lt;br /&gt;
| Gareth Ellison &lt;br /&gt;
| Gareth Nelson (on everywhere but SL) &lt;br /&gt;
| BST (UTC+1) &lt;br /&gt;
| Litesim Ltd &lt;br /&gt;
| Grid servers, sim border crossing, avatar animations&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Dalien|dalien]] &lt;br /&gt;
| Dalien Talbot &lt;br /&gt;
| Dalien Talbot &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| Mostly TCP-based &lt;br /&gt;
| Small fixes; rev.eng./prototyping; nightlies; git-keeper&lt;br /&gt;
|-&lt;br /&gt;
| [[Alondria]] &lt;br /&gt;
| &lt;br /&gt;
| Alondria LeFay &lt;br /&gt;
| Alondria LeFay (OSGrid) &lt;br /&gt;
| -8 &lt;br /&gt;
| Independent &lt;br /&gt;
| Implementation of LSL functions and other scripting tidbits.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:SeanDague|sdague]] &lt;br /&gt;
| Sean Dague &lt;br /&gt;
| Neas Bade &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Database, Linux, Testing, Misc&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MingChen|MingChen]] &lt;br /&gt;
| Mike/Michael Ortman &lt;br /&gt;
| Ming Chen &lt;br /&gt;
| &lt;br /&gt;
| -6 (-5 in Summer) &lt;br /&gt;
| DeepThink Pty Ltd &lt;br /&gt;
| Estate/Parcel Support/Modules/Keeping things all neat and tidy.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Tedd|Tedd]] &lt;br /&gt;
| Tedd Hansen &lt;br /&gt;
| Tedd Maa &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| Tedd Hansen &lt;br /&gt;
| Programming/Scripting/Architecture&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Adjohn|adjohn]] &lt;br /&gt;
| Adam Johnson &lt;br /&gt;
| Zeuz Zenovka &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| [http://www.genkii.com Genkii] &lt;br /&gt;
| &amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Joha1|joha1]] &lt;br /&gt;
| Johan Berntsson &lt;br /&gt;
| Joppi Brandenburg &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Performance, packet handling/libSL&lt;br /&gt;
|-&lt;br /&gt;
| jhurliman &lt;br /&gt;
| John Hurliman &lt;br /&gt;
| John Hurliman &lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Dahlia|dahlia]] &lt;br /&gt;
| T. Hoff &lt;br /&gt;
| Dahlia Trimble &lt;br /&gt;
| &lt;br /&gt;
| -8 / -7 &lt;br /&gt;
| Independent &lt;br /&gt;
| Collision geometry, various math and physics issues, occasional bug fixes and random enhancements&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Wiki Sysops ==&lt;br /&gt;
&lt;br /&gt;
Along with the core developers, these people help manage the OpenSimulator wiki as well as make other contributions (see Areas of Interest). &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Makopoppo|Makopoppo]] &lt;br /&gt;
| Makiko Nomura &lt;br /&gt;
| Mako Nozaki &lt;br /&gt;
| Everywhere &lt;br /&gt;
| +9 Tokyo, Japan &lt;br /&gt;
| As an individual developer &lt;br /&gt;
| Everything for improving usability and connectability - wiki/issue management, documentation, localization(Japanese), modifying the interface mainly of core modules&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Fritigern|Fritigern]] &lt;br /&gt;
| S-E-C-R-E-T &lt;br /&gt;
| Fritigern Gothly &lt;br /&gt;
| SecondLife, OSGrid &lt;br /&gt;
| +1 GMT &lt;br /&gt;
| &lt;br /&gt;
| My interests are many, and extremely varied. One thing that i am very interested in, is seeing OpenSimulator grow, mature, and develop into something that really does rival SL/LL.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Additional Developers/Testers/Contributors ==&lt;br /&gt;
&lt;br /&gt;
These people have contributed and/or are contributing bug reports, patches, testing, and all sorts of other goodies to the project. &amp;lt;br /&amp;gt; '''Newcomers please add yourself to bottom of the list!''' &amp;lt;br /&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jtclark48|jclark4]] &lt;br /&gt;
| Jay Clark &lt;br /&gt;
| Jay Clarke &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Physics, Grid Host, AI, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| [[User:AdamStevenson|BigFootAg]] &lt;br /&gt;
| Adam Stevenson &lt;br /&gt;
| Adamus Petrov &lt;br /&gt;
| &lt;br /&gt;
| -6 &lt;br /&gt;
| Texas A&amp;amp;amp;M University &lt;br /&gt;
| AI, Skynet, Evolving Systems, Biology&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jeff1564|Jeff1564]] &lt;br /&gt;
| Jeff &lt;br /&gt;
| Potter Taurog &lt;br /&gt;
| Potter Taurog &lt;br /&gt;
| -8 &lt;br /&gt;
| http://myopengrid.com &lt;br /&gt;
| Building, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| Rock_Vacirca &lt;br /&gt;
| Colin Withers &lt;br /&gt;
| Rock Vacirca &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +1 &lt;br /&gt;
| http://rock-vacirca.blogspot.com &lt;br /&gt;
| Testing, building, scripting, maintaining an opensim blog.&lt;br /&gt;
|-&lt;br /&gt;
| simsim &lt;br /&gt;
| caocao &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +9 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Testing whole functions of OpenSimulator system,working with OpenSim-Engine,reporting on OpenSimulator&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Vicero Lambert|Vicero Lambert]] &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Magi|Magi]] &lt;br /&gt;
| Andy Agnew &lt;br /&gt;
| Magi Merlin &lt;br /&gt;
| &lt;br /&gt;
| +10 &lt;br /&gt;
| Spun Pty Ltd &lt;br /&gt;
| 3D Web Integration, Database stuff and playing with the odds and ends box.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:ClarkZone|ClarkZone]] &lt;br /&gt;
| Troy Admin(@ClarkZone) &lt;br /&gt;
| Troy Childs &lt;br /&gt;
| Troy Admin (ClarkZone) &lt;br /&gt;
| -5 &lt;br /&gt;
| Http://clarkzone.dyndns.org &lt;br /&gt;
| Tester and Grid Host&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Aiaustin|aiaustin]] &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| +0 &lt;br /&gt;
| AIAI, Virtual University of Edinburgh&amp;lt;br /&amp;gt;http://www.aiai.ed.ac.uk/~ai/&amp;lt;br /&amp;gt;http://vue.ed.ac.uk/openvue/ &lt;br /&gt;
| Windows tests&amp;lt;br /&amp;gt;Content testing&amp;lt;br /&amp;gt;Use of multiple VWs&lt;br /&gt;
|-&lt;br /&gt;
| Marc Manders &lt;br /&gt;
| Marc Manders &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +6 &lt;br /&gt;
| marcmanders@gmail.com &lt;br /&gt;
| Creative features&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Balthazar|balthazar]] &lt;br /&gt;
| Trevor Brooks &lt;br /&gt;
| Balthazar Sin &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| None &lt;br /&gt;
| Terrains, testing and some small coding tasks&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jimbo2120|jimbo2120]] &lt;br /&gt;
| Michael Osias &lt;br /&gt;
| Illuminous Beltran &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Grid, AI, Skynet, coding and testing&lt;br /&gt;
|-&lt;br /&gt;
| ZeroPoint &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Guilderoy&amp;amp;nbsp;Dench &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Programming/Database&lt;br /&gt;
|-&lt;br /&gt;
| [[User:DerekTang|DerekTang]] &lt;br /&gt;
| Derek Tang &lt;br /&gt;
| Derek Timeless &lt;br /&gt;
| Derek Tang (ChineseGrid) &lt;br /&gt;
| +8 &lt;br /&gt;
| http://ChineseGrid.net &lt;br /&gt;
| Running a public WINDOWS sim for testing, Docs, Helping Chinese users to enjoy OpenSim; building Chinese OpenSimulator communities. In construction...&lt;br /&gt;
|-&lt;br /&gt;
| [[User:TayB|TayB]] &lt;br /&gt;
| Earl Balai &lt;br /&gt;
| Taylor Dae &lt;br /&gt;
| &lt;br /&gt;
| -10 &lt;br /&gt;
| WhynGrid &lt;br /&gt;
| Grid Host,Networking,Contributions &amp;amp;amp; Testing.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:JamieDav|JamieDav]] &lt;br /&gt;
| Jamie David &lt;br /&gt;
| Jamie David &lt;br /&gt;
| &lt;br /&gt;
| +7 &lt;br /&gt;
| Forum &lt;br /&gt;
| Grid, Sim, Avitar, Functionality&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Krtaylor|Krtaylor]] &lt;br /&gt;
| Kurt Taylor &lt;br /&gt;
| Kurt Stringer &lt;br /&gt;
| &lt;br /&gt;
| -6 &lt;br /&gt;
| IBM &lt;br /&gt;
| Grid, Networking, Monitoring, Scripting, Inventory, Testing&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nink|Nink]] &lt;br /&gt;
| Peter Finn &lt;br /&gt;
| Nink Noonan &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Disruptive Influence.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Bruce|Bruce]] &lt;br /&gt;
| Bruce Meerson &lt;br /&gt;
| Bruce Meerson &lt;br /&gt;
| &lt;br /&gt;
| +8 &lt;br /&gt;
| HiPiHi &lt;br /&gt;
| Watching.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Darb|DarbD]] &lt;br /&gt;
| Brian B. Quinn &lt;br /&gt;
| Darb Dabney &lt;br /&gt;
| regions&amp;lt;br /&amp;gt;near Marin &lt;br /&gt;
| PST/SLT (-7 or -8) &lt;br /&gt;
| County of Marin, California&amp;lt;br /&amp;gt; http://blog.3dmap.me &lt;br /&gt;
| LiDAR-based sculpties, real-world terrain, &amp;lt;br /&amp;gt;pursuit of civic paraverses, virtual Emergency Operations Centers&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Charlie Omega|CharlieO]] &lt;br /&gt;
| Dan &lt;br /&gt;
| Charlie Omega &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Mild coding/tweaking/simple feature adds, Stress testing/break stuff, Testing limits of existing code. Making sure [[LSL Status]] is up to date&lt;br /&gt;
|-&lt;br /&gt;
| oobscure &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Opensource Obscure &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.opensim.it &lt;br /&gt;
| Running a public Linux sim for testing, Docs, Helping italian users, Building opensim communities, Watching&lt;br /&gt;
|-&lt;br /&gt;
| pitman &lt;br /&gt;
| Mike Pitman &lt;br /&gt;
| Rez Tone &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| IBM &lt;br /&gt;
| Scientific visualization schemes, virt world product design, persistant workspaces, virt world based big biz&lt;br /&gt;
|-&lt;br /&gt;
| Shenlei &lt;br /&gt;
| Shenlei Winkler &lt;br /&gt;
| Shenlei Flasheart, Shenlei Winkler &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Fashion Research Institute &lt;br /&gt;
| Product Design and Development, Apparel industry, and o yes, I wrote the book&amp;amp;nbsp;;)&lt;br /&gt;
|-&lt;br /&gt;
| cmu &lt;br /&gt;
| Christopher Mumme &lt;br /&gt;
| Snook Destiny &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.cmu-develop.de/ and research group &amp;quot;Collaboration Systems and CSCW&amp;quot; at Clausthal University of Technology &lt;br /&gt;
| Testing OpenSim, working with OpenSim-Engine, reporting on OpenSimulator&lt;br /&gt;
|-&lt;br /&gt;
| [[Silpol]] &lt;br /&gt;
| Andriy Tymchenko &lt;br /&gt;
| Andy Tir &lt;br /&gt;
| &lt;br /&gt;
| EET (+2/3) &lt;br /&gt;
| http://silpol.blogspot.com/ (also visible at Nokia) &lt;br /&gt;
| Highly uncoordinated mess with elements of palace games, under-table diplomacy, rebellion, coup d'état and mutiny. optionally pirate&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Grumly|Grumly]] &lt;br /&gt;
| &lt;br /&gt;
| Forest Klaar &lt;br /&gt;
| Grumly TheBear &lt;br /&gt;
| GMT+1 &lt;br /&gt;
| .NET MCAD Dev/Arch/Trainer http://www.devoteam.com &lt;br /&gt;
| Trying to get into OpenSimulator code for now. Particularly interrested in data persistence. blog (Hello, Avatar!): http://lslblog.free.fr&lt;br /&gt;
|-&lt;br /&gt;
| [[User:DaTwitch|DaTwitch]] &lt;br /&gt;
| James G. Stallings II &lt;br /&gt;
| &amp;lt;br /&amp;gt;Lazarus Longstaff &lt;br /&gt;
| Hiro Protagonist (OSGrid) &lt;br /&gt;
| -5 &lt;br /&gt;
| House Husband &lt;br /&gt;
| OSGrid Region owner, OSGrid Operator,&amp;lt;br /&amp;gt;Forum Admin, sometime wiki editor&lt;br /&gt;
|-&lt;br /&gt;
| gryc &lt;br /&gt;
| Gryc Ueusp &lt;br /&gt;
| Gryc Uriza &lt;br /&gt;
| Gryc Uriza(OSGrid) &lt;br /&gt;
| -6 &lt;br /&gt;
| &lt;br /&gt;
| PHP scripting, web interfaces, interconnectivity, cross-platformedness&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Phrearch|Phrearch]] &lt;br /&gt;
| Jeroen van Veen &lt;br /&gt;
| Phrearch Miles &lt;br /&gt;
| Phrearch Miles(OSGrid) &lt;br /&gt;
| Amsterdam/Paris &lt;br /&gt;
| &lt;br /&gt;
| HWIOS, WiXTD, Wikidoc, Moo, User interfaces&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Burnman|Burnman]] &lt;br /&gt;
| Allen &lt;br /&gt;
| Burnman Bedlam &lt;br /&gt;
| &lt;br /&gt;
| Boston, USA &lt;br /&gt;
| &lt;br /&gt;
| Testing, testing, and more testing! Getting familiar with the source, interested in all aspects of the project.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Krisbfunk|krisbfunk]] &lt;br /&gt;
| Kris Bulman &lt;br /&gt;
| Krisbfunk Vought &lt;br /&gt;
| Krisbfunk Nocturnal(OSGrid) &lt;br /&gt;
| PE, Canada (-4) &lt;br /&gt;
| Edactive Technologies&amp;lt;br /&amp;gt;NocturnalEye Productions&amp;lt;br /&amp;gt;UPEI &lt;br /&gt;
| Currently: Testing, bug reports, wiki updating, building on OSGrid&lt;br /&gt;
|-&lt;br /&gt;
| [[User:HashBox|HashBox]] &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Sibariel Darkstone &lt;br /&gt;
| Sibariel Darkstone (OSGrid) &lt;br /&gt;
| New Zealand (+12) &lt;br /&gt;
| &lt;br /&gt;
| Testing, bug reports, and updating the wiki.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Kinoc|Kinoc]] &lt;br /&gt;
| Kino Coursey &lt;br /&gt;
| Daxxon Jaxxon &lt;br /&gt;
| Daxxon Kinoc (OSgrid) &lt;br /&gt;
| -6 &lt;br /&gt;
| Daxtron Laboratories &amp;lt;br /&amp;gt; http://www.daxtron.com&amp;lt;br /&amp;gt; University of North Texas &lt;br /&gt;
| AI, Semantic web, Ontologies, Natural Laanguage Processing, Cyc, Bots, NPC&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Trapuh|trapuh]] &lt;br /&gt;
| Pedro Ribeiro &lt;br /&gt;
| Vaiten Forder &lt;br /&gt;
| &lt;br /&gt;
| GMT &lt;br /&gt;
| University Student, Escola Superior de Educação de Viseu, Portugal &lt;br /&gt;
| Testing, eventual bug reports and wiki. Music, web/digital arts and php+sql.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:SonicViz|SonicViz]] &lt;br /&gt;
| Paul Cohen &lt;br /&gt;
| Komuso Tokugawa &lt;br /&gt;
| &lt;br /&gt;
| +9 &lt;br /&gt;
| Http://sonicviz.com &lt;br /&gt;
| Audio/Music, Interactive Music, Control Protocols, Interfaces, VisualFX, Procedural animation/Generative systems + testing and general dev&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mokele|mokele]] &lt;br /&gt;
| Scott Norman &lt;br /&gt;
| Mokelembembe Mokeev &lt;br /&gt;
| &lt;br /&gt;
| -8 (Southern California) &lt;br /&gt;
| Web Developer (PHP and MySQL) &lt;br /&gt;
| Interested in seeing running on PowerPC Macs which it is. So, when I can, I'll compile and test on PowerPC Mac (PowerBook G4) and submit reports and then update the wiki if need on installing on Mac. Also have a Ubuntu 7.10 server that I can do testing on too.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Devalnor|devalnor]] &lt;br /&gt;
| Devalnor &lt;br /&gt;
| M. Watkin &lt;br /&gt;
| &lt;br /&gt;
| +1 (Belgium) &lt;br /&gt;
| &lt;br /&gt;
| Small Patch code, bug reports, and updating the wiki.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Ezekiel|Ezekiel]] &lt;br /&gt;
| Ezekiel &lt;br /&gt;
| Ezekiel Zabelin &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.yosims.com &lt;br /&gt;
| Concepts, business aspects of virtual worlds - web developer (PHP, MySQL, Javascript, LSL)&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Buggmaster|Buggmaster]] &lt;br /&gt;
| Mike D &lt;br /&gt;
| Bug Master &lt;br /&gt;
| None &lt;br /&gt;
| -8 &lt;br /&gt;
| http://www.adultmetaverse.com &lt;br /&gt;
| Grid, Data/Web PHP/PERL/MySQL&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nixnerd|nixnerd]] &lt;br /&gt;
| &lt;br /&gt;
| Dangerously Moody &lt;br /&gt;
| None &lt;br /&gt;
| GMT &lt;br /&gt;
| http://www.integratedtechnologies.eu &lt;br /&gt;
| Cross Platform Testing, Feedback, Bug Reporting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MoHax|mohax]] &lt;br /&gt;
| Mo Hax &lt;br /&gt;
| Mo Hax &lt;br /&gt;
| &lt;br /&gt;
| -5 Eastern &lt;br /&gt;
| IBM &lt;br /&gt;
| Testing, Feedback, Content Contributions, Bug Reporting, Documenting, Development&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Webmage|webmage]] &lt;br /&gt;
| webmage &lt;br /&gt;
| Leyla Masala &lt;br /&gt;
| Web Mage &lt;br /&gt;
| +1 &lt;br /&gt;
| IBM &lt;br /&gt;
| Testing, terrain&lt;br /&gt;
|-&lt;br /&gt;
| [[User:NLStitch|NLStitch]] &lt;br /&gt;
| Marijn Oosterveld &lt;br /&gt;
| Stitch Seale &lt;br /&gt;
| NYA &lt;br /&gt;
| GMT +1 Amsterdam &lt;br /&gt;
| Twingate Systems (http://www.twingate.nl)&amp;lt;br /&amp;gt;HanzeHogeschool Groningen, Netherlands &lt;br /&gt;
| Programming, Photography, AI&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Ideia Boa|Ideia Boa]] &lt;br /&gt;
| Joao Lopes &lt;br /&gt;
| Ideia Boa &lt;br /&gt;
| Ideia Boa or Boa Ideia in some grids &lt;br /&gt;
| GTM+1 Stockholm/Sweden &lt;br /&gt;
| WorldSimTERRA - Virtual World that speaks Portuguese too&amp;lt;br /&amp;gt;http://www.worldsimterra.com &lt;br /&gt;
| Testing and more testing! Updating the original wiki and translating the OpenSimulator Wiki into Portuguese and reporting on OpenSimulator&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Lulurun|lulurun]] &lt;br /&gt;
| liu &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| 3Di Inc, Japan &amp;lt;br /&amp;gt;http://www.3di.jp &lt;br /&gt;
| Patches, openid, server performance, UGAI&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Carlosroundel|Carlosrounde]] &lt;br /&gt;
| Carlosroundel &lt;br /&gt;
| Carlos Roundel &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +1 &lt;br /&gt;
| Cyberlandia Italy&amp;lt;br /&amp;gt;http://www.cyberlandia.net &lt;br /&gt;
| Grid, programmer, database, tester&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mikebert|Mikebert]] &lt;br /&gt;
| Michael Strunck &lt;br /&gt;
| Mikebert Miles &lt;br /&gt;
| Mikebert M34 &lt;br /&gt;
| +1 &lt;br /&gt;
| OpenSIM Wiki, Germany&amp;lt;br /&amp;gt;http://www.opensim.de &lt;br /&gt;
| German Wiki, Translater, Server Performance (Linux/Windows), Tester, Feedback, Bug Reporting, Server-Hosting&lt;br /&gt;
|-&lt;br /&gt;
| Taoki &lt;br /&gt;
| Mircea Kitsune / Taoki Vixen &lt;br /&gt;
| Mircea Kitsune (OSGrid) / Mircea Lobo (LL grid) &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| GMT +2 &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| Usually testing and bug reporting but I also make smaller patches where I know what to do.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Patnad|Patnad]] &lt;br /&gt;
| Patrick &lt;br /&gt;
| Patnad Babii &lt;br /&gt;
| Patnad Babii (OSGrid) &lt;br /&gt;
| GMT -5 &lt;br /&gt;
| RezzMe Technologies&amp;lt;br /&amp;gt;http://www.rezzme.com &lt;br /&gt;
| Bug testing and reporting, I code C# and have submitted a few patches&lt;br /&gt;
|-&lt;br /&gt;
| [[User:^DarkMan|^DarkMan]] &lt;br /&gt;
| Brian Adair &lt;br /&gt;
| Patrick Ouachita &lt;br /&gt;
| Brian Adair &amp;amp;#124; Patrick Meta &lt;br /&gt;
| -6 CST &lt;br /&gt;
| RealMetaLife &amp;amp;#124; B&amp;amp;amp;H Networking &lt;br /&gt;
| Building, Scripting, Testing, etc.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Tlaukkan|Tommi Laukkanen]] &lt;br /&gt;
| Tommi Laukkanen &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Tommi Laukkanen &lt;br /&gt;
| +2 GMT &lt;br /&gt;
| http://www.bubblecloud.org &lt;br /&gt;
| Protocols ([http://www.bubblecloud.org MXP]), NHibernate, Scrip API, Map Generation, Bug Fixes, Grid Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mystical|Mystical]] &lt;br /&gt;
| Kevin Tweedy &lt;br /&gt;
| Mystical Demina &lt;br /&gt;
| Mystical Demina &lt;br /&gt;
| -5 &lt;br /&gt;
| Extreme Reality Grid&amp;lt;br /&amp;gt;http://www.XRGrid.com &lt;br /&gt;
| Windows Communication Framework, Windows Workflow,Entity Framework, MSSQL&amp;lt;br /&amp;gt;Enhancements,Commerce, Content,DotNetNuke based portal, development services&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Godfrey|Godfrey]] &lt;br /&gt;
| Jeff Lee &lt;br /&gt;
| Warin Cascabel &lt;br /&gt;
| &lt;br /&gt;
| -5 (EST5EDT) &lt;br /&gt;
| &lt;br /&gt;
| Testing, minor bugfixes. Scripting, building, animating&lt;br /&gt;
|-&lt;br /&gt;
| Jamenai &lt;br /&gt;
| Christopher Händler &lt;br /&gt;
| Jamenai Luik &lt;br /&gt;
| Jamenai Luik &lt;br /&gt;
| +1 &lt;br /&gt;
| Playneko Grid &amp;amp;#124; XIMDEX Jamenai&amp;lt;br /&amp;gt;http://www.playneko.de&amp;lt;br /&amp;gt;http://www.ximdex.de &lt;br /&gt;
| Performance,Bug Reporting, Hosting, Grid-Owner,(PHP, MySQL, Perl, JavaScript, LSL)&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Bikcmp|bikcmp]] &lt;br /&gt;
| Jason &lt;br /&gt;
| Jake1500 Allen &lt;br /&gt;
| Jason Helios (The Helios Grid) &lt;br /&gt;
| EST &lt;br /&gt;
| Blue Software &lt;br /&gt;
| Search, groups, land, and currency&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mark.malewski|Slipaway]] &lt;br /&gt;
| Mark Malewski &lt;br /&gt;
| Chris Rock &lt;br /&gt;
| &lt;br /&gt;
| -6 (-5 during summer - CDT) &lt;br /&gt;
| NexTECH / Joopla &lt;br /&gt;
| Web development &amp;amp;amp; systems integration, terrain, WIKI documentation, tutorials, testing, bug reporting and feedback.&lt;br /&gt;
|-&lt;br /&gt;
| barakademi &lt;br /&gt;
| Steve Topp &lt;br /&gt;
| barakademi Barzane &lt;br /&gt;
| same avi on baragrid OSgrid Grid4us sciencesim &lt;br /&gt;
| utc+1 (CET) paris &lt;br /&gt;
| http://xbot-sl.barakademi.org http://vps.barakademi.org/oswi http://vps.barakademi.org/oswi/loginscreen.php &lt;br /&gt;
| Music LiveMusic MetaverseMusic Opensim Libomv Mono-2.4 Linux (suse,debian,ubuntu) Admin Scripting Automating Development Intergration php mysql bash nant +++&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Robert d|robert_d]] &lt;br /&gt;
| Robert Dzikowski &lt;br /&gt;
| &lt;br /&gt;
| OSGrid: robert_d 13 &lt;br /&gt;
| UTC+1 &lt;br /&gt;
| [http://blog.rd-it.net http://blog.rd-it.net] &lt;br /&gt;
| Region Modules, Tutorials&lt;br /&gt;
|-&lt;br /&gt;
| john_ &lt;br /&gt;
| John&amp;amp;nbsp;Moyer &lt;br /&gt;
| VAJohn&amp;amp;nbsp;GeekSquad or&amp;amp;nbsp;Matthew&amp;amp;nbsp;Kendal &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| Best&amp;amp;nbsp;Buy/Geek&amp;amp;nbsp;Squad &lt;br /&gt;
| Tester&lt;br /&gt;
|-&lt;br /&gt;
| [[User:W!cKeD|_WicKeD]] &lt;br /&gt;
| Maik &lt;br /&gt;
| Maik Galaxy &lt;br /&gt;
| El Diablo &lt;br /&gt;
| +1 Germany &lt;br /&gt;
| Creatio Inc. / [http://www.OpenSimGerman.us/ OpenSimGerman.us] &lt;br /&gt;
| German Support, Translator, Building, Scripting, Testing, Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Stevie Wakowski|Stevie Wakowksi]] &lt;br /&gt;
| Steve Roberts &lt;br /&gt;
| Stevie Wakowski &lt;br /&gt;
| &lt;br /&gt;
| +10 Australia &lt;br /&gt;
| IBM &lt;br /&gt;
| OpenSimulator builds, Linux, Modrex, bug reporting, evangalist for OpenSimulator in business applications.&lt;br /&gt;
|-&lt;br /&gt;
| Revolution &lt;br /&gt;
| Matthew &lt;br /&gt;
| Revolution Smythe &lt;br /&gt;
| Revolution Smythe &lt;br /&gt;
| -6 Central USA &lt;br /&gt;
| None &lt;br /&gt;
| Script engine, physics engine, general odd bugs, interesting and odd things&lt;br /&gt;
|-&lt;br /&gt;
| [[User:ClemsonGS|clemsonGS]] &lt;br /&gt;
| Brian Cass &lt;br /&gt;
| BC Sands &lt;br /&gt;
| Brian Cass (VWC Grid) &lt;br /&gt;
| -5 &lt;br /&gt;
| http://www.cvwconline.org/ &lt;br /&gt;
| Developing virtual worlds for use in higher education&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| AlexRa &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Independent &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Mikko Pallari &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Realxtend &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| StrawberryFride &lt;br /&gt;
| Chris Hart &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ReactionGrid &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:RemedyTomm|RemedyTomm]] &lt;br /&gt;
| Tom Grimshaw &lt;br /&gt;
| Tomm Remedy &lt;br /&gt;
| KGrid: Casper Warden OSGrid: Tomm Remedy &lt;br /&gt;
| UTC+0 (BST) &lt;br /&gt;
| Remedy Communications &lt;br /&gt;
| Texture pipeline, Groups, ObjectUpdates&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Rob Smart &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| IBM &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MicheilMerlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| -6 &lt;br /&gt;
| Independent &amp;lt;br /&amp;gt; [http://www.iliveisl.com/ http://www.iliveisl.com/] &lt;br /&gt;
| Scripting, patches, and testcases&lt;br /&gt;
|-&lt;br /&gt;
| Pato Donald &lt;br /&gt;
| Pato Donald &lt;br /&gt;
| Morgam Biedermann &lt;br /&gt;
| Pato Donald &lt;br /&gt;
| -3 &lt;br /&gt;
| Independent [http://www.matheusmk3.co.cc/ http://www.matheusmk3.co.cc/ &lt;br /&gt;
| Groups, Scripts, Physics, Communication, Integration&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Sera Marx &lt;br /&gt;
| Darkfire Soulstar &lt;br /&gt;
| &lt;br /&gt;
| +12 &lt;br /&gt;
| Radiance promotions &lt;br /&gt;
| Grid Host, Commissioner. ~ Anyone looking for work related to the development of Opensimulator or Viewers please contact me. Any work undertaken for me will be returned to Opensimulator unless made strictly for my Grid&lt;br /&gt;
|-&lt;br /&gt;
|[[User:dz|dz]]  &lt;br /&gt;
| Doug Osborn &lt;br /&gt;
| ydoo magic&lt;br /&gt;
| delta zed @ OSGRID Doug Osborn @ ScienceSim &amp;amp; MOSES grids&lt;br /&gt;
| PST/SLT (-7 or -8) &lt;br /&gt;
| CEO OpenSimian &lt;br /&gt;
| Performance testing, advanced scripting, high prim count builds,  Client and server side bots, Animation Overrides, MANTIS maintenance.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Hallow Palmer|Hallow Palmer]] &lt;br /&gt;
| Markus &lt;br /&gt;
| Hallow Palmer &lt;br /&gt;
| &amp;lt;br /&amp;gt; &lt;br /&gt;
| +1 &lt;br /&gt;
| Grid4Us&amp;lt;br /&amp;gt;http://www.grid4us.net &lt;br /&gt;
| Server Performance (Windows), Tester, Feedback, Business concepts,Bug Reporting, Server-Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:LenaVanilli|LenaVanilli]] &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| +1 Germany &lt;br /&gt;
| [http://www.hypergrid.org http://www.hypergrid.org] &lt;br /&gt;
| Grid-Management, Testing Testing Testing, Region Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Aduffy70|aduffy70]] &lt;br /&gt;
| Aaron Duffy &lt;br /&gt;
| Aeran Stipe &lt;br /&gt;
| Aaron Duffy @ScienceSim &lt;br /&gt;
| -7 &lt;br /&gt;
| USU &lt;br /&gt;
| Scientific visualization &amp;amp;amp; education, Region modules, Heavily scripted regions&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Erich Bremer &lt;br /&gt;
| Erich Bremer &lt;br /&gt;
| &lt;br /&gt;
Erich Bremer@OSGrid &lt;br /&gt;
&lt;br /&gt;
| -5 &lt;br /&gt;
| http://www.ebremer.com &lt;br /&gt;
| Semantic Web, Data Visualization&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MarkIDCAS|MarkIDCAS]] &lt;br /&gt;
| Mark Bannon &lt;br /&gt;
| Mark IDCAS &lt;br /&gt;
| 3D Grid Association, AtMeeting, Valhalla Virtual and IDCAS. &lt;br /&gt;
| GMT &lt;br /&gt;
| [http://www.valhallavirtual.com http://www.valhallavirtual.com] &lt;br /&gt;
| Grid Management &amp;amp;amp; systems integration. Scripting. WIKI documentation, tutorials, bug reporting and feedback.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Allquixotic|allquixotic]] &lt;br /&gt;
| Sean McNamara &lt;br /&gt;
| Tiyuk Quellmalz &lt;br /&gt;
| OSG: Tiyuk Quellmalz &lt;br /&gt;
| -5 &lt;br /&gt;
| None &lt;br /&gt;
| Bugfixing; networking; performance; data integrity; LSL; auto-backup; null DB (eventual consistency).&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Orenh|orenh]] &lt;br /&gt;
| Oren Hurvitz &lt;br /&gt;
| &lt;br /&gt;
| Oren Hurvitz (Kitely) &lt;br /&gt;
| +2 &lt;br /&gt;
| Kitely &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:Randomhuman|randomhuman]] &lt;br /&gt;
| Kevin Houlihan &lt;br /&gt;
| random Radikal &lt;br /&gt;
| random human (OSGrid) &lt;br /&gt;
| WET/IST &lt;br /&gt;
| CrimsonCookie &lt;br /&gt;
| RemoteAdmin module; On-demand grids; web integration.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Oddball Otoole|oddball otoole]]&lt;br /&gt;
| J.v.Hogeloon&lt;br /&gt;
| Oddball Otoole&lt;br /&gt;
| Oddball Otoole (OSGrid&lt;br /&gt;
| +1 (The Netherlands&lt;br /&gt;
| None&lt;br /&gt;
| Building, scripting, testing, social stuff.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Pixel|Pixel Tomsen]]&lt;br /&gt;
| Christian Kurzhals&lt;br /&gt;
| Pixel Tomsen&lt;br /&gt;
| Pixel Tomsen OSGrid&lt;br /&gt;
| +1 (Germany&lt;br /&gt;
| see my profil&lt;br /&gt;
| Dev, Building, scripting, sim-hosting, some modules, patches, osgrid&lt;br /&gt;
|-&lt;br /&gt;
| [[User:kenearlg|kenearlg]]&lt;br /&gt;
| Ken Grunke&lt;br /&gt;
| Key Grau&lt;br /&gt;
| Key Gruin (Osgrid)&lt;br /&gt;
| -6 CST&lt;br /&gt;
| http://www.osgrid.org/&lt;br /&gt;
| testing, moderating, inworld games &amp;amp; recreation, wiki spam control&lt;br /&gt;
|-&lt;br /&gt;
| [[User:CG4Life|CG4Life]]&lt;br /&gt;
| CG Anderson&lt;br /&gt;
| Cyn Hak&lt;br /&gt;
| &lt;br /&gt;
| -8 PST&lt;br /&gt;
| Little Dogs Media&lt;br /&gt;
| Networking, Security, Performance (parallelization, compression, encryption), physics, 3D manipulation, bugfixing, documentation.  Just getting into the code base, so will start with compression/parallelizatoin ideas and bugfixing, then other stuff later.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:vegaslon|vegaslon]]&lt;br /&gt;
| Adam Ivie&lt;br /&gt;
| vegaslon plutonian&lt;br /&gt;
| &lt;br /&gt;
| -5 EST&lt;br /&gt;
| Independent &lt;br /&gt;
| Physics, Vehicles, Advanced Scripting, Testing, Advanced Land Usage.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:AliciaRaven|AliciaRaven]] &lt;br /&gt;
| Alicia Richardson &lt;br /&gt;
| ClaudiaDLioncourt&lt;br /&gt;
| Alicia Raven (Spellscape) &lt;br /&gt;
| 0 GMT&lt;br /&gt;
| Spellscape Ltd&amp;lt;br /&amp;gt;http://www.spellscape.co.uk&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retired Additional Developers ==&lt;br /&gt;
&lt;br /&gt;
Additional developers who are no longer working on the OpenSimulator project. Thank you forever for your contributions! &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br /&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Fly-man-|Fly-Man-]] &lt;br /&gt;
| Laurence &lt;br /&gt;
| &lt;br /&gt;
| OSGrid: Fly Man &lt;br /&gt;
| GMT +1 &lt;br /&gt;
| Private Company&lt;br /&gt;
| Testing, OpenSimSearch, OpenSimProfile&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Tech Reference]]&lt;br /&gt;
[[Category:Help]]&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/0.9_Bug_List</id>
		<title>0.9 Bug List</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/0.9_Bug_List"/>
				<updated>2016-06-23T17:39:34Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Count down to 0.9 release&lt;br /&gt;
&lt;br /&gt;
Generic bugs:&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7908 HG TP problems with newer version of mono] (maybe a different root cause?)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7872 CHANGED_OWNER is not triggered on rez after changing object's ownership] Problem with CHANGED (i have not tested myself)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7848 Timestamps and potential wrong use by groups v2 core module of Unix timestamps in OpenSim MySql databases] (ongoing bug)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7904 Long delays when accessing task inventory] (ongoing bug, low priority)&lt;br /&gt;
* (WIP) Check [http://opensimulator.org/mantis/view.php?id=7910 Setting PRIM_FLEXIBLE with llSetPrimitiveParams corrupts PRIM_TYPE] related to [http://opensimulator.org/mantis/view.php?id=7896 this] has patch incl&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7932 llRezObject with vel] (ongoing bug)&amp;lt;/strike&amp;gt; (not a bug)&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7929 Deeding full perm object to group makes it not available for sale] (ongoing bug)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7861 llEdgeOfWorld fails most of the time in a 1x1 region] also an issue in varregions. [http://opensimulator.org/mantis/view.php?id=7860 Here] (ongoing bug)&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regressions (worked in 0.8.2 but doesn't work in 0.9 dev):&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7819 volume detect and collisions do not work proprely]&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7836 Next owner permissions are not able to be set in inventory] Should work either way: on rezzed object or from inventory&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7933 UserTitle is not working] (regression)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7934 Telehubs and grid gods/ region owners] (regression)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7935 Assets not being transferred on HG TPs] (regression)&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7928 show grid size reporting 0 km squared] This works in 0.8 but fails in 0.9 (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7858 llDie() leaves prim in region] Seems the prims are deleted but the viewer isn't getting updated. (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7874 Parcel properties don't take effect when entering parcel] should be an easy fix, solution in mantis. (regression)&amp;lt;/strike&amp;gt; &lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7915 Objects are not set to the group, when they are rezzed or created] Noticed this and also some llDetectedGroup issues (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7923 Edit particle beam is missing again] (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7917 PrimLimitsModule does not work correctly after selling land] Previously worked fine on 0.8.x (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7920 Joined group does not display in viewer until after a relog] More group issues. another update issue? (regression)&amp;lt;/strike&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/0.9_Bug_List</id>
		<title>0.9 Bug List</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/0.9_Bug_List"/>
				<updated>2016-06-23T17:39:04Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: add #7819&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Count down to 0.9 release&lt;br /&gt;
&lt;br /&gt;
Generic bugs:&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7908 HG TP problems with newer version of mono] (maybe a different root cause?)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7872 CHANGED_OWNER is not triggered on rez after changing object's ownership] Problem with CHANGED (i have not tested myself)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7848 Timestamps and potential wrong use by groups v2 core module of Unix timestamps in OpenSim MySql databases] (ongoing bug)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7904 Long delays when accessing task inventory] (ongoing bug, low priority)&lt;br /&gt;
* (WIP) Check [http://opensimulator.org/mantis/view.php?id=7910 Setting PRIM_FLEXIBLE with llSetPrimitiveParams corrupts PRIM_TYPE] related to [http://opensimulator.org/mantis/view.php?id=7896 this] has patch incl&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7932 llRezObject with vel] (ongoing bug)&amp;lt;/strike&amp;gt; (not a bug)&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7929 Deeding full perm object to group makes it not available for sale] (ongoing bug)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7861 llEdgeOfWorld fails most of the time in a 1x1 region] also an issue in varregions. [http://opensimulator.org/mantis/view.php?id=7860 Here] (ongoing bug)&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regressions (worked in 0.8.2 but doesn't work in 0.9 dev):&lt;br /&gt;
* Check http://opensimulator.org/mantis/view.php?id=7819 volume detect and collisions do not work proprely]&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7836 Next owner permissions are not able to be set in inventory] Should work either way: on rezzed object or from inventory&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7933 UserTitle is not working] (regression)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7934 Telehubs and grid gods/ region owners] (regression)&lt;br /&gt;
* Check [http://opensimulator.org/mantis/view.php?id=7935 Assets not being transferred on HG TPs] (regression)&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7928 show grid size reporting 0 km squared] This works in 0.8 but fails in 0.9 (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7858 llDie() leaves prim in region] Seems the prims are deleted but the viewer isn't getting updated. (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7874 Parcel properties don't take effect when entering parcel] should be an easy fix, solution in mantis. (regression)&amp;lt;/strike&amp;gt; &lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7915 Objects are not set to the group, when they are rezzed or created] Noticed this and also some llDetectedGroup issues (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7923 Edit particle beam is missing again] (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7917 PrimLimitsModule does not work correctly after selling land] Previously worked fine on 0.8.x (regression)&amp;lt;/strike&amp;gt;&lt;br /&gt;
* &amp;lt;strike&amp;gt;Check [http://opensimulator.org/mantis/view.php?id=7920 Joined group does not display in viewer until after a relog] More group issues. another update issue? (regression)&amp;lt;/strike&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Monitoring_Module</id>
		<title>Monitoring Module</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Monitoring_Module"/>
				<updated>2016-06-21T21:25:25Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Add note about this module being deprecated with a pointer to the pages for the newer interfaces.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
=Introduction=&lt;br /&gt;
&lt;br /&gt;
This facility provides a way to retrieve data per region.&lt;br /&gt;
&lt;br /&gt;
NOTE: This feature is deprecated and may be removed in future versions of the simulator. Refer to [[Monitoring]] for information on the current monitoring interfaces.&lt;br /&gt;
&lt;br /&gt;
= Enabling =&lt;br /&gt;
&lt;br /&gt;
In OpenSimulator 0.7.2 it is always active. In current development code it is active by default but can be disabled by setting&lt;br /&gt;
&lt;br /&gt;
 [Monitoring]&lt;br /&gt;
 Enabled = false&lt;br /&gt;
&lt;br /&gt;
= Retrieving data =&lt;br /&gt;
== OpenSimulator 0.7.2 and earlier ==&lt;br /&gt;
In OpenSimulator 0.7.2 and earlier, each region will register a URL on the built-in OpenSimulator HTTP server with the format&lt;br /&gt;
&lt;br /&gt;
 /monitorstats/&amp;lt;region-uuid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you type &lt;br /&gt;
&lt;br /&gt;
 show http-handlers&lt;br /&gt;
&lt;br /&gt;
on the region console you'll see something like this in the HTTP section&lt;br /&gt;
&lt;br /&gt;
 /monitorstats/dd5b77f8-bf88-45ac-aace-35bd76426c81 &lt;br /&gt;
 /SStats/ &lt;br /&gt;
 /CAPS/VS/ &lt;br /&gt;
 regionImagedd5b77f8bf8845acaace35bd76426c81 &lt;br /&gt;
 /monitorstats/dd5b77f8-bf88-45ac-aace-35bd76426c82 &lt;br /&gt;
 regionImagedd5b77f8bf8845acaace35bd76426c82&lt;br /&gt;
&lt;br /&gt;
where the UUID following monitorstats corresponds to the region ID.&lt;br /&gt;
&lt;br /&gt;
== OpenSimulator development code ==&lt;br /&gt;
In OpenSimulator development code, the region data can also be accessed via region name. Therefore, typing &lt;br /&gt;
&lt;br /&gt;
 show http-handlers&lt;br /&gt;
&lt;br /&gt;
will return something like&lt;br /&gt;
&lt;br /&gt;
 /monitorstats/dd5b77f8-bf88-45ac-aace-35bd76426c81 &lt;br /&gt;
 /monitorstats/test &lt;br /&gt;
 /SStats/ &lt;br /&gt;
 /CAPS/VS/ &lt;br /&gt;
 regionImagedd5b77f8bf8845acaace35bd76426c81 &lt;br /&gt;
 /monitorstats/dd5b77f8-bf88-45ac-aace-35bd76426c82 &lt;br /&gt;
 /monitorstats/test2 &lt;br /&gt;
 regionImagedd5b77f8bf8845acaace35bd76426c82 &lt;br /&gt;
&lt;br /&gt;
where the data can also be retrieved via region name (test and test2).&lt;br /&gt;
&lt;br /&gt;
= Retrieved data =&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 ! Stat name              !! Descriptoin&lt;br /&gt;
 |-&lt;br /&gt;
 | AgentCountMonitor      || Number of avatars in the region.&lt;br /&gt;
 |-&lt;br /&gt;
 | ChildAgentCountMonitor || Number of child agents in the region.  These are used by viewers with avatars in neighbouring regions in order to see into and effect the neighbouring region.&lt;br /&gt;
 |-&lt;br /&gt;
 | GCMemoryMonitor        || Amount of memory currently allocated to the virtual machine garbage collector.&lt;br /&gt;
 |-&lt;br /&gt;
 | ObjectCountMonitor     || Number of prims in the region.&lt;br /&gt;
 |-&lt;br /&gt;
 | PWSMemoryMonitor       || Virtual Machine Private Working Set memory&lt;br /&gt;
 |-&lt;br /&gt;
 | ThreadCountMonitor     || Number of threads used by the current process.  May be unimplemented (hence always zero) on Mono.&lt;br /&gt;
 |-&lt;br /&gt;
 | TotalFrameMonitor      || Time taken in milliseconds for the last frame.  In OpenSimulator 0.7.3.1 and before this did not include the spare frame time.  In later versions of OpenSimulator this does include the spare frame time.&lt;br /&gt;
 |-&lt;br /&gt;
 | EventFrameMonitor      || Event processing time in milliseconds for the last frame.&lt;br /&gt;
 |-&lt;br /&gt;
 | LandFrameMonitor       || Land related processing time in milliseconds for the last frame.&lt;br /&gt;
 |-&lt;br /&gt;
 | LastFrameTimeMonitor   || The number of milliseconds since the last region frame was completed.&lt;br /&gt;
 |-&lt;br /&gt;
 | TimeDilationMonitor    || Time dilation of physics processing compared to main scene processing.&lt;br /&gt;
 |-&lt;br /&gt;
 | SimFPSMonitor          || Frames per second processed by the scene.&lt;br /&gt;
 |-&lt;br /&gt;
 | AgentUpdatesPerSecondMonitor || Updates sent to viewers per second.&lt;br /&gt;
 |- &lt;br /&gt;
 | ActiveObjectCountMonitor || Objects subject to physics.&lt;br /&gt;
 |-&lt;br /&gt;
 | ActiveScriptsMonitor   || Scripts running in the region&lt;br /&gt;
 |-&lt;br /&gt;
 | ScriptEventsPerSecondMonitor || Script events processed per second.&lt;br /&gt;
 |-&lt;br /&gt;
 | InPacketsPerSecondMonitor || UDP packets from viewers processed per second.&lt;br /&gt;
 |-&lt;br /&gt;
 | OutPacketsPerSecondMonitor || UDP packets sent to viewers per second&lt;br /&gt;
 |-&lt;br /&gt;
 | UnackedBytesMonitor    || Bytes that haven't yet been acked by viewers.  A persistent high number indicates poor network connections between the viewers and the simulator.&lt;br /&gt;
 |-&lt;br /&gt;
 | PendingDownloadsMonitor || Downloads pending from simulator to viewers.  Not currently implemented, will always be zero.&lt;br /&gt;
 |- &lt;br /&gt;
 | PendingUploadsMonitor   || Pending uploads from viewers to simulator.  Not currently implemented, will always be zero.&lt;br /&gt;
 |-&lt;br /&gt;
 | TotalFrameTimeMonitor      || Average time taken in milliseconds for frames in the last 3 seconds.  In OpenSimulator 0.7.3.1 and before this did not include the spare frame time and wrongly referred to the total amount of a second that constituted non-spare frame time.  In later versions of OpenSimulator this correctly refers to the frame time and includes the spare frame time.&lt;br /&gt;
 |-&lt;br /&gt;
 | NetFrameTimeMonitor        || Average time taken in milliseconds for network activities in frames in the last 3 seconds.  Not currently used.&lt;br /&gt;
 |-&lt;br /&gt;
 | SimulationFrameTimeMonitor || Average time taken in milliseconds for frame-related simulation activity in the last 3 seconds.  In OpenSimulator 0.7.3.1 and before this wrongly referred to the total amount of a second that constituted simulation time.&lt;br /&gt;
 |-&lt;br /&gt;
 | AgentFrameTimeMonitor      || Average time taken in milliseconds for agent-related activity in the last 3 seconds.  In OpenSimulator 0.7.3.1 and before this wrongly referred to the total amount of a second that constituted agent time.&lt;br /&gt;
 |-&lt;br /&gt;
 | ImagesFrameTimeMonitor     || Not used by OpenSimulator&lt;br /&gt;
 |-&lt;br /&gt;
 | LastReportedObjectUpdates  || Currently unused.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== Physics ==&lt;br /&gt;
&lt;br /&gt;
All per frame times here relate to an average taken over the last 3 second period.&lt;br /&gt;
&lt;br /&gt;
The following stats are always present.&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 | PhysicsFPSMonitor       || Frames per second processed by physics code.&lt;br /&gt;
 |-&lt;br /&gt;
 | PhysicsFrameMonitor     || Obsolete.  Same as PhysicsFrameTimeMonitor&lt;br /&gt;
 |-&lt;br /&gt;
 | PhysicsFrameTimeMonitor || Average time taken by physics processing.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
The following stats are only present if collect_stats = true in the [ODEPhysicsSettings] section of OpenSim.ini as of git master 6375db1 (post OpenSimulator 0.7.3.1 development code).  These statistics are experimental and may change.&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot;&lt;br /&gt;
 | ODETotalFrameMS         || ODE physics processing.  This should match PhysicsFrameTimeMonitor.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEAvatarTaintFrameMS   || Avatar taint processing.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEPrimTaintFrameMS     || Prim taint processing.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEAvatarForcesFrameMS  || Avatar forces calculations.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEPrimForcesFrameMS    || Prim forces calculations.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODERaycastingFrameMS    || Raycasting.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODENativeStepFrameMS    || Time taken to perform a physics step by ODE native code.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODENativeSpaceCollisionFrameMS || Calculation of possible collisions via spaces in ODE native code.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODENativeGeomCollisionFrameMS  || Resolution of actual collisions between geometries in ODE native code.&lt;br /&gt;
 |- &lt;br /&gt;
 | ODEOtherCollisionFrameMS       || Processing of collisions not covered by the other 'Native' measures.  This mainly covers operations done in the OpenSimulator's plugin itself, though some calls to native ODE functions are still made.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODECollisionNotificationFrameMS || Notification of other parts of OpenSimulator of collisions that is performed outside of the ODE plugin.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEAvatarUpdateFrameMS          || Time taken to process avatar updates from the physics code.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEPrimUpdateFrameMS            || Time taken to process prim updates from the physics code.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEAvatarContacts               || Number of avatar caused collision contacts in the last 3 second period.  There can be more than one contact per collision.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEPrimContacts                 || Number of prim caused collision contacts in the last 3 second period.  There can be more than one contact per collision.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODETotalAvatars                 || Number of avatars modelled by physics.  This should match AgentCountMonitor. &lt;br /&gt;
 |-&lt;br /&gt;
 | ODETotalPrims                   || Number of non-phantom prims.  This covers both physics prims and prims which are not subject to physics but are still collidable.  It does not cover phantom prims as these have no representation in the physics scene.&lt;br /&gt;
 |-&lt;br /&gt;
 | ODEActivePrims                  || Number of prims subject to physics.  This should match ActiveObjectCountMonitor.&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
=== OpenSimulator 0.7.2 and earlier ===&lt;br /&gt;
On OpenSimulator 0.7.2 and earlier, fetching&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;http://192.168.1.2:9000/dd5b77f8-bf88-45ac-aace-35bd76426c81&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will return something like&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;data&amp;gt;&lt;br /&gt;
  &amp;lt;AgentCountMonitor&amp;gt;0&amp;lt;/AgentCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ChildAgentCountMonitor&amp;gt;0&amp;lt;/ChildAgentCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;GCMemoryMonitor&amp;gt;32358400&amp;lt;/GCMemoryMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ObjectCountMonitor&amp;gt;0&amp;lt;/ObjectCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PhysicsFrameMonitor&amp;gt;0&amp;lt;/PhysicsFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PhysicsUpdateFrameMonitor&amp;gt;0&amp;lt;/PhysicsUpdateFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PWSMemoryMonitor&amp;gt;354172928&amp;lt;/PWSMemoryMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ThreadCountMonitor&amp;gt;0&amp;lt;/ThreadCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;TotalFrameMonitor&amp;gt;1&amp;lt;/TotalFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;EventFrameMonitor&amp;gt;0&amp;lt;/EventFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;LandFrameMonitor&amp;gt;0&amp;lt;/LandFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;LastFrameTimeMonitor&amp;gt;87&amp;lt;/LastFrameTimeMonitor&amp;gt;&lt;br /&gt;
&amp;lt;/data&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OpenSimulator 0.7.3 and later ===&lt;br /&gt;
In current development code, more statistics have been added, so instead you'll see something like&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;data&amp;gt;&lt;br /&gt;
  &amp;lt;AgentCountMonitor&amp;gt;0&amp;lt;/AgentCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ChildAgentCountMonitor&amp;gt;0&amp;lt;/ChildAgentCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;GCMemoryMonitor&amp;gt;32358400&amp;lt;/GCMemoryMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ObjectCountMonitor&amp;gt;0&amp;lt;/ObjectCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PhysicsFrameMonitor&amp;gt;0&amp;lt;/PhysicsFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PhysicsUpdateFrameMonitor&amp;gt;0&amp;lt;/PhysicsUpdateFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PWSMemoryMonitor&amp;gt;354172928&amp;lt;/PWSMemoryMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ThreadCountMonitor&amp;gt;0&amp;lt;/ThreadCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;TotalFrameMonitor&amp;gt;1&amp;lt;/TotalFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;EventFrameMonitor&amp;gt;0&amp;lt;/EventFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;LandFrameMonitor&amp;gt;0&amp;lt;/LandFrameMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;LastFrameTimeMonitor&amp;gt;87&amp;lt;/LastFrameTimeMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;TimeDilationMonitor&amp;gt;1&amp;lt;/TimeDilationMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;SimFPSMonitor&amp;gt;56.6666679382324&amp;lt;/SimFPSMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PhysicsFPSMonitor&amp;gt;46.9475212097168&amp;lt;/PhysicsFPSMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;AgentUpdatesPerSecondMonitor&amp;gt;0&amp;lt;/AgentUpdatesPerSecondMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ActiveObjectCountMonitor&amp;gt;0&amp;lt;/ActiveObjectCountMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ActiveScriptsMonitor&amp;gt;0&amp;lt;/ActiveScriptsMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ScriptEventsPerSecondMonitor&amp;gt;0&amp;lt;/ScriptEventsPerSecondMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;InPacketsPerSecondMonitor&amp;gt;0&amp;lt;/InPacketsPerSecondMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;OutPacketsPerSecondMonitor&amp;gt;0&amp;lt;/OutPacketsPerSecondMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;UnackedBytesMonitor&amp;gt;0&amp;lt;/UnackedBytesMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PendingDownloadsMonitor&amp;gt;0&amp;lt;/PendingDownloadsMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PendingUploadsMonitor&amp;gt;0&amp;lt;/PendingUploadsMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;TotalFrameTimeMonitor&amp;gt;0&amp;lt;/TotalFrameTimeMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;NetFrameTimeMonitor&amp;gt;0&amp;lt;/NetFrameTimeMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;PhysicsFrameTimeMonitor&amp;gt;0&amp;lt;/PhysicsFrameTimeMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;SimulationFrameTimeMonitor&amp;gt;0&amp;lt;/SimulationFrameTimeMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;AgentFrameTimeMonitor&amp;gt;0&amp;lt;/AgentFrameTimeMonitor&amp;gt;&lt;br /&gt;
  &amp;lt;ImagesFrameTimeMonitor&amp;gt;0&amp;lt;/ImagesFrameTimeMonitor&amp;gt;&lt;br /&gt;
&amp;lt;/data&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/BulletSim</id>
		<title>BulletSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/BulletSim"/>
				<updated>2015-03-01T01:29:15Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: /* Adjusting Avatar Height */ Changing default values to zero to reflect OpenSimDefaults.ini settings&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BulletSim'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
BulletSim is the module for OpenSimulator that creates virtual world physics using the [http://bulletphysics.org Bullet Physics Engine]. This module provides high performance physics as well as physical vehicle performance compatible with [http://secondlife.com Second Life].&lt;br /&gt;
&lt;br /&gt;
== Project Information ==&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/Functionality]] lists the possible physical operations, their implementation state and any notes on their use. This is particularly useful for vehicle operations.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
== BulletSim Architecture ==&lt;br /&gt;
&lt;br /&gt;
=== BSScene ===&lt;br /&gt;
Stuff on simulation stepper. Step events (pre-step event, post-step event).&lt;br /&gt;
&lt;br /&gt;
Requirement for controlling physics engine modifications with taint system (regular taints, post-taint taints).&lt;br /&gt;
&lt;br /&gt;
Detail logging system.&lt;br /&gt;
&lt;br /&gt;
Parameter system.&lt;br /&gt;
&lt;br /&gt;
=== BSPhysObject ===&lt;br /&gt;
&lt;br /&gt;
Children classes of BSPrim and BSCharacter.&lt;br /&gt;
&lt;br /&gt;
=== Terrain ===&lt;br /&gt;
&lt;br /&gt;
=== Constraints ===&lt;br /&gt;
&lt;br /&gt;
=== Bullet Implementations ===&lt;br /&gt;
BulletSim is a wrapper for the Bullet physics engine. The interface from the virtual world adapting BulletSim to the physics engine is described by the abstract class &amp;lt;code&amp;gt;BSAPITemplate&amp;lt;/code&amp;gt;. There are two instances of this class, &amp;lt;code&amp;gt;BSAPIXNA&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;BSAPIUnman&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BSAPIUnman&amp;lt;/code&amp;gt; contains the connection to the unmanaged DLL/SO that is the C++ version of the Bullet physics engine. The sources and build instructions are available at &amp;lt;code&amp;gt;git://opensimulator.org/git/opensim-libs/trunk/unmanaged/BulletSim&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BSAPIXNA&amp;lt;/code&amp;gt; is the connection to a C# version of Bullet the sources of which are hosted at &amp;lt;code&amp;gt;https://code.google.com/p/bullet-xna/&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The selection of physics engine happens at region start time. It is specified per simulator with the following INI settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [Startup]&lt;br /&gt;
    physics = BulletSim&lt;br /&gt;
    [BulletSim]&lt;br /&gt;
    BulletEngine = BulletUnmanaged  ; The default&lt;br /&gt;
    ; BulletEngine = BulletXNA      ; uncomment this line for C# version of Bullet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managed/Unmanaged Interface ===&lt;br /&gt;
&lt;br /&gt;
== Linksets ==&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Actor&amp;quot; Architecture and the Actors ==&lt;br /&gt;
Each BulletSim physical object can have any number of &amp;quot;actors&amp;quot; attached to it. The actors register for simulation events (usually to be called before each simulation step) and change the physical parameters of the object. The currently implemented actors are:&lt;br /&gt;
* BSActorAvatarMove: controls movement and stairs walking of avatars;&lt;br /&gt;
* BSActorHover: implements vertical hovering for objects and avatars;&lt;br /&gt;
* BSActorLockAxis: applies a constraint to physical objects to lock one or more angular axis movement;&lt;br /&gt;
* BSActorMoveToTarget: moves a physical object to a location;&lt;br /&gt;
* BSActorSetForce: applies a continuous force to a physical object;&lt;br /&gt;
* BSActorSetTorque: applies a continuous torque to a physical object;&lt;br /&gt;
* BSDynamic (name will change): implements SecondLife(r) vehicle model.&lt;br /&gt;
&lt;br /&gt;
== Vehicles ==&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/Vehicles]]&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/VehicleTuning]]&lt;br /&gt;
&lt;br /&gt;
== BulletSim Script Extension Functions ==&lt;br /&gt;
&lt;br /&gt;
The physics extension interface is used by BulletSim to implement many new physics functions. The [[OSSL_Script_Library/ModInvoke|mod_invoke]] interface must be enabled for these functions to work.&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/ScriptFunctions]]&lt;br /&gt;
&lt;br /&gt;
== Avatar Walking Up Stairs ==&lt;br /&gt;
The avatar movement actor include special checks to allow avatars to move up stepped objects (think stairs). The code works by checking for collisions close to the avatar's feet and, if trying to walk forward and not flying, pushing the avatar up to get over the object. This is a different algorithm than ODE which relies on the curvature of the avatar's capsule to move up and over low obstacles.&lt;br /&gt;
&lt;br /&gt;
There are five INI parameters that control stairs:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; |&lt;br /&gt;
|AvatarStepHeight&lt;br /&gt;
|The maximum height of a step. If the avatar collides with something of less than this height, it will be considered a step and the avatar will consider moving up to get over it;&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepAngle&lt;br /&gt;
|The maximum angle of the collision surface to consider it a step. If set to zero, for instance, the step faces must be perfectly vertical before it would be considered a step surface. Typical value is 0.3f which allows some step variability;&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepGroundFudge&lt;br /&gt;
|A small fudge factor subtracted from the computed base of the avatar when checking if the collision is close to the avatar's feet. The base of the avatar computation can be a little high (above the ground) so this factor allows comparing lower for the step. This can prevent small bumps on the ground being too small to be considered a step (which causes the bump to act like a wall);&lt;br /&gt;
|-&lt;br /&gt;
|AvatarApproachFactor&lt;br /&gt;
|The angle the step must be approached. This is the radians of the angle between the avatar and the colliding step surface. This prevents walking up things when approached from a wide angle. The default of 0.6 is about a 45 degree approach angle. Setting this down to 0.3, for instance, requires the avatar to be walking nearly directly into the step to get the up actions.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepUpCorrectionFactor&lt;br /&gt;
|A multiplication factor for changing the avatar's position to get over the step. The height of the collision with the step is multiplied by this factor and that number is added to the avatar's Z coordinate. This moves the avatar up in relation to the step. If this factor is less than zero, the AvatarStepHeight is used.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepForceFactor&lt;br /&gt;
|A force factor to push the avatar up to get over the step. An up force of the step collision height times the avatar mass times this factor is applied to the avatar. These last two factors can be used in combination for moving the avatar when a step is collided with.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepSmoothingSteps&lt;br /&gt;
|when an avatar walks up the steps, collisions go on and off as the steps are hit and moved over. This is the number of simulator ticks (about 10 per second) that walking up steps will still be performed after the last step collision is sensed. This smooths out the action a little.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default values are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    AvatarStepHeight = 0.6&lt;br /&gt;
    AvatarStepGroundFudge = 0.1&lt;br /&gt;
    AvatarStepApproachFactor = 0.6&lt;br /&gt;
    AvatarStepUpCorrectionFactor = 1.0&lt;br /&gt;
    AvatarStepForceFactor = 2.0&lt;br /&gt;
    AvatarStepSmoothingSteps = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Notes ==&lt;br /&gt;
&lt;br /&gt;
=== Adjusting Avatar Height ===&lt;br /&gt;
&lt;br /&gt;
As of May 13, 2013, BulletSim uses the Bullet capsule shape to approximate a standing avatar. One oddity of the capsule is its height which doesn't scale nicely in the way OpenSimulator would like. To fix this, several adjustment parameters are available to correct the avatar capsule height so that an avatar properly appears to be standing on the ground rather than floating over or sunk into the ground.&lt;br /&gt;
&lt;br /&gt;
These parameters are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
! INI varaible&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightMidFudge&lt;br /&gt;
| 0.0&lt;br /&gt;
| This is a fudge factor added to the 50% avatar height (about 1.87 meters). This number is added to the total height so adjusting this number moves the whole capsule up and down by roughly this distance.&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightLowFudge&lt;br /&gt;
| 0.0&lt;br /&gt;
| This factor is added to the height at the low end of the height scale (&amp;quot;0%&amp;quot; height which is about 1.62 meters). This number is scaled proportionally from the mid height to the low height. Adjusting this number adjusts the height of the capsule for small shapes.&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightHighFudge&lt;br /&gt;
| 0.0&lt;br /&gt;
| This is similar to AvatarHeightLowFudge but it is applied to the high end of height (&amp;quot;100%&amp;quot; height which is about 2.12 meters). It is also added proportionally from the mid height to the large height.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/BulletSim</id>
		<title>BulletSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/BulletSim"/>
				<updated>2015-01-07T14:37:09Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Added AvatarStepAngle to walking up steps description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BulletSim'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
BulletSim is the module for OpenSimulator that creates virtual world physics using the [http://bulletphysics.org Bullet Physics Engine]. This module provides high performance physics as well as physical vehicle performance compatible with [http://secondlife.com Second Life].&lt;br /&gt;
&lt;br /&gt;
== Project Information ==&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/Functionality]] lists the possible physical operations, their implementation state and any notes on their use. This is particularly useful for vehicle operations.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
== BulletSim Architecture ==&lt;br /&gt;
&lt;br /&gt;
=== BSScene ===&lt;br /&gt;
Stuff on simulation stepper. Step events (pre-step event, post-step event).&lt;br /&gt;
&lt;br /&gt;
Requirement for controlling physics engine modifications with taint system (regular taints, post-taint taints).&lt;br /&gt;
&lt;br /&gt;
Detail logging system.&lt;br /&gt;
&lt;br /&gt;
Parameter system.&lt;br /&gt;
&lt;br /&gt;
=== BSPhysObject ===&lt;br /&gt;
&lt;br /&gt;
Children classes of BSPrim and BSCharacter.&lt;br /&gt;
&lt;br /&gt;
=== Terrain ===&lt;br /&gt;
&lt;br /&gt;
=== Constraints ===&lt;br /&gt;
&lt;br /&gt;
=== Bullet Implementations ===&lt;br /&gt;
BulletSim is a wrapper for the Bullet physics engine. The interface from the virtual world adapting BulletSim to the physics engine is described by the abstract class &amp;lt;code&amp;gt;BSAPITemplate&amp;lt;/code&amp;gt;. There are two instances of this class, &amp;lt;code&amp;gt;BSAPIXNA&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;BSAPIUnman&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BSAPIUnman&amp;lt;/code&amp;gt; contains the connection to the unmanaged DLL/SO that is the C++ version of the Bullet physics engine. The sources and build instructions are available at &amp;lt;code&amp;gt;git://opensimulator.org/git/opensim-libs/trunk/unmanaged/BulletSim&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BSAPIXNA&amp;lt;/code&amp;gt; is the connection to a C# version of Bullet the sources of which are hosted at &amp;lt;code&amp;gt;https://code.google.com/p/bullet-xna/&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The selection of physics engine happens at region start time. It is specified per simulator with the following INI settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [Startup]&lt;br /&gt;
    physics = BulletSim&lt;br /&gt;
    [BulletSim]&lt;br /&gt;
    BulletEngine = BulletUnmanaged  ; The default&lt;br /&gt;
    ; BulletEngine = BulletXNA      ; uncomment this line for C# version of Bullet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managed/Unmanaged Interface ===&lt;br /&gt;
&lt;br /&gt;
== Linksets ==&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Actor&amp;quot; Architecture and the Actors ==&lt;br /&gt;
Each BulletSim physical object can have any number of &amp;quot;actors&amp;quot; attached to it. The actors register for simulation events (usually to be called before each simulation step) and change the physical parameters of the object. The currently implemented actors are:&lt;br /&gt;
* BSActorAvatarMove: controls movement and stairs walking of avatars;&lt;br /&gt;
* BSActorHover: implements vertical hovering for objects and avatars;&lt;br /&gt;
* BSActorLockAxis: applies a constraint to physical objects to lock one or more angular axis movement;&lt;br /&gt;
* BSActorMoveToTarget: moves a physical object to a location;&lt;br /&gt;
* BSActorSetForce: applies a continuous force to a physical object;&lt;br /&gt;
* BSActorSetTorque: applies a continuous torque to a physical object;&lt;br /&gt;
* BSDynamic (name will change): implements SecondLife(r) vehicle model.&lt;br /&gt;
&lt;br /&gt;
== Vehicles ==&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/Vehicles]]&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/VehicleTuning]]&lt;br /&gt;
&lt;br /&gt;
== BulletSim Script Extension Functions ==&lt;br /&gt;
&lt;br /&gt;
The physics extension interface is used by BulletSim to implement many new physics functions. The [[OSSL_Script_Library/ModInvoke|mod_invoke]] interface must be enabled for these functions to work.&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/ScriptFunctions]]&lt;br /&gt;
&lt;br /&gt;
== Avatar Walking Up Stairs ==&lt;br /&gt;
The avatar movement actor include special checks to allow avatars to move up stepped objects (think stairs). The code works by checking for collisions close to the avatar's feet and, if trying to walk forward and not flying, pushing the avatar up to get over the object. This is a different algorithm than ODE which relies on the curvature of the avatar's capsule to move up and over low obstacles.&lt;br /&gt;
&lt;br /&gt;
There are five INI parameters that control stairs:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; |&lt;br /&gt;
|AvatarStepHeight&lt;br /&gt;
|The maximum height of a step. If the avatar collides with something of less than this height, it will be considered a step and the avatar will consider moving up to get over it;&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepAngle&lt;br /&gt;
|The maximum angle of the collision surface to consider it a step. If set to zero, for instance, the step faces must be perfectly vertical before it would be considered a step surface. Typical value is 0.3f which allows some step variability;&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepGroundFudge&lt;br /&gt;
|A small fudge factor subtracted from the computed base of the avatar when checking if the collision is close to the avatar's feet. The base of the avatar computation can be a little high (above the ground) so this factor allows comparing lower for the step. This can prevent small bumps on the ground being too small to be considered a step (which causes the bump to act like a wall);&lt;br /&gt;
|-&lt;br /&gt;
|AvatarApproachFactor&lt;br /&gt;
|The angle the step must be approached. This is the radians of the angle between the avatar and the colliding step surface. This prevents walking up things when approached from a wide angle. The default of 0.6 is about a 45 degree approach angle. Setting this down to 0.3, for instance, requires the avatar to be walking nearly directly into the step to get the up actions.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepUpCorrectionFactor&lt;br /&gt;
|A multiplication factor for changing the avatar's position to get over the step. The height of the collision with the step is multiplied by this factor and that number is added to the avatar's Z coordinate. This moves the avatar up in relation to the step. If this factor is less than zero, the AvatarStepHeight is used.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepForceFactor&lt;br /&gt;
|A force factor to push the avatar up to get over the step. An up force of the step collision height times the avatar mass times this factor is applied to the avatar. These last two factors can be used in combination for moving the avatar when a step is collided with.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepSmoothingSteps&lt;br /&gt;
|when an avatar walks up the steps, collisions go on and off as the steps are hit and moved over. This is the number of simulator ticks (about 10 per second) that walking up steps will still be performed after the last step collision is sensed. This smooths out the action a little.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default values are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    AvatarStepHeight = 0.6&lt;br /&gt;
    AvatarStepGroundFudge = 0.1&lt;br /&gt;
    AvatarStepApproachFactor = 0.6&lt;br /&gt;
    AvatarStepUpCorrectionFactor = 1.0&lt;br /&gt;
    AvatarStepForceFactor = 2.0&lt;br /&gt;
    AvatarStepSmoothingSteps = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Notes ==&lt;br /&gt;
&lt;br /&gt;
=== Adjusting Avatar Height ===&lt;br /&gt;
&lt;br /&gt;
As of May 13, 2013, BulletSim uses the Bullet capsule shape to approximate a standing avatar. One oddity of the capsule is its height which doesn't scale nicely in the way OpenSimulator would like. To fix this, several adjustment parameters are available to correct the avatar capsule height so that an avatar properly appears to be standing on the ground rather than floating over or sunk into the ground.&lt;br /&gt;
&lt;br /&gt;
These parameters are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
! INI varaible&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightMidFudge&lt;br /&gt;
| 0.1&lt;br /&gt;
| This is a fudge factor added to the 50% avatar height (about 1.87 meters). This number is added to the total height so adjusting this number moves the whole capsule up and down by roughly this distance.&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightLowFudge&lt;br /&gt;
| -0.2&lt;br /&gt;
| This factor is added to the height at the low end of the height scale (&amp;quot;0%&amp;quot; height which is about 1.62 meters). This number is scaled proportionally from the mid height to the low height. Adjusting this number adjusts the height of the capsule for small shapes.&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightHighFudge&lt;br /&gt;
| 0.1&lt;br /&gt;
| This is similar to AvatarHeightLowFudge but it is applied to the high end of height (&amp;quot;100%&amp;quot; height which is about 2.12 meters). It is also added proportionally from the mid height to the large height.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/BulletSim</id>
		<title>BulletSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/BulletSim"/>
				<updated>2015-01-07T04:38:58Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: fix table formatting error (hate markdown)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BulletSim'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
BulletSim is the module for OpenSimulator that creates virtual world physics using the [http://bulletphysics.org Bullet Physics Engine]. This module provides high performance physics as well as physical vehicle performance compatible with [http://secondlife.com Second Life].&lt;br /&gt;
&lt;br /&gt;
== Project Information ==&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/Functionality]] lists the possible physical operations, their implementation state and any notes on their use. This is particularly useful for vehicle operations.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
== BulletSim Architecture ==&lt;br /&gt;
&lt;br /&gt;
=== BSScene ===&lt;br /&gt;
Stuff on simulation stepper. Step events (pre-step event, post-step event).&lt;br /&gt;
&lt;br /&gt;
Requirement for controlling physics engine modifications with taint system (regular taints, post-taint taints).&lt;br /&gt;
&lt;br /&gt;
Detail logging system.&lt;br /&gt;
&lt;br /&gt;
Parameter system.&lt;br /&gt;
&lt;br /&gt;
=== BSPhysObject ===&lt;br /&gt;
&lt;br /&gt;
Children classes of BSPrim and BSCharacter.&lt;br /&gt;
&lt;br /&gt;
=== Terrain ===&lt;br /&gt;
&lt;br /&gt;
=== Constraints ===&lt;br /&gt;
&lt;br /&gt;
=== Bullet Implementations ===&lt;br /&gt;
BulletSim is a wrapper for the Bullet physics engine. The interface from the virtual world adapting BulletSim to the physics engine is described by the abstract class &amp;lt;code&amp;gt;BSAPITemplate&amp;lt;/code&amp;gt;. There are two instances of this class, &amp;lt;code&amp;gt;BSAPIXNA&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;BSAPIUnman&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BSAPIUnman&amp;lt;/code&amp;gt; contains the connection to the unmanaged DLL/SO that is the C++ version of the Bullet physics engine. The sources and build instructions are available at &amp;lt;code&amp;gt;git://opensimulator.org/git/opensim-libs/trunk/unmanaged/BulletSim&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BSAPIXNA&amp;lt;/code&amp;gt; is the connection to a C# version of Bullet the sources of which are hosted at &amp;lt;code&amp;gt;https://code.google.com/p/bullet-xna/&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The selection of physics engine happens at region start time. It is specified per simulator with the following INI settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [Startup]&lt;br /&gt;
    physics = BulletSim&lt;br /&gt;
    [BulletSim]&lt;br /&gt;
    BulletEngine = BulletUnmanaged  ; The default&lt;br /&gt;
    ; BulletEngine = BulletXNA      ; uncomment this line for C# version of Bullet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managed/Unmanaged Interface ===&lt;br /&gt;
&lt;br /&gt;
== Linksets ==&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Actor&amp;quot; Architecture and the Actors ==&lt;br /&gt;
Each BulletSim physical object can have any number of &amp;quot;actors&amp;quot; attached to it. The actors register for simulation events (usually to be called before each simulation step) and change the physical parameters of the object. The currently implemented actors are:&lt;br /&gt;
* BSActorAvatarMove: controls movement and stairs walking of avatars;&lt;br /&gt;
* BSActorHover: implements vertical hovering for objects and avatars;&lt;br /&gt;
* BSActorLockAxis: applies a constraint to physical objects to lock one or more angular axis movement;&lt;br /&gt;
* BSActorMoveToTarget: moves a physical object to a location;&lt;br /&gt;
* BSActorSetForce: applies a continuous force to a physical object;&lt;br /&gt;
* BSActorSetTorque: applies a continuous torque to a physical object;&lt;br /&gt;
* BSDynamic (name will change): implements SecondLife(r) vehicle model.&lt;br /&gt;
&lt;br /&gt;
== Vehicles ==&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/Vehicles]]&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/VehicleTuning]]&lt;br /&gt;
&lt;br /&gt;
== BulletSim Script Extension Functions ==&lt;br /&gt;
&lt;br /&gt;
The physics extension interface is used by BulletSim to implement many new physics functions. The [[OSSL_Script_Library/ModInvoke|mod_invoke]] interface must be enabled for these functions to work.&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/ScriptFunctions]]&lt;br /&gt;
&lt;br /&gt;
== Avatar Walking Up Stairs ==&lt;br /&gt;
The avatar movement actor include special checks to allow avatars to move up stepped objects (think stairs). The code works by checking for collisions close to the avatar's feet and, if trying to walk forward and not flying, pushing the avatar up to get over the object. This is a different algorithm than ODE which relies on the curvature of the avatar's capsule to move up and over low obstacles.&lt;br /&gt;
&lt;br /&gt;
There are five INI parameters that control stairs:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; |&lt;br /&gt;
|AvatarStepHeight&lt;br /&gt;
|The maximum height of a step. If the avatar collides with something of less than this height, it will be considered a step and the avatar will consider moving up to get over it;&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepGroundFudge&lt;br /&gt;
|A small fudge factor subtracted from the computed base of the avatar when checking if the collision is close to the avatar's feet. The base of the avatar computation can be a little high (above the ground) so this factor allows comparing lower for the step. This can prevent small bumps on the ground being too small to be considered a step (which causes the bump to act like a wall);&lt;br /&gt;
|-&lt;br /&gt;
|AvatarApproachFactor&lt;br /&gt;
|The angle the step must be approached. This is the radians of the angle between the avatar and the colliding step surface. This prevents walking up things when approached from a wide angle. The default of 0.6 is about a 45 degree approach angle. Setting this down to 0.3, for instance, requires the avatar to be walking nearly directly into the step to get the up actions.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepUpCorrectionFactor&lt;br /&gt;
|A multiplication factor for changing the avatar's position to get over the step. The height of the collision with the step is multiplied by this factor and that number is added to the avatar's Z coordinate. This moves the avatar up in relation to the step. If this factor is less than zero, the AvatarStepHeight is used.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepForceFactor&lt;br /&gt;
|A force factor to push the avatar up to get over the step. An up force of the step collision height times the avatar mass times this factor is applied to the avatar. These last two factors can be used in combination for moving the avatar when a step is collided with.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepSmoothingSteps&lt;br /&gt;
|when an avatar walks up the steps, collisions go on and off as the steps are hit and moved over. This is the number of simulator ticks (about 10 per second) that walking up steps will still be performed after the last step collision is sensed. This smooths out the action a little.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default values are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    AvatarStepHeight = 0.6&lt;br /&gt;
    AvatarStepGroundFudge = 0.1&lt;br /&gt;
    AvatarStepApproachFactor = 0.6&lt;br /&gt;
    AvatarStepUpCorrectionFactor = 1.0&lt;br /&gt;
    AvatarStepForceFactor = 2.0&lt;br /&gt;
    AvatarStepSmoothingSteps = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Notes ==&lt;br /&gt;
&lt;br /&gt;
=== Adjusting Avatar Height ===&lt;br /&gt;
&lt;br /&gt;
As of May 13, 2013, BulletSim uses the Bullet capsule shape to approximate a standing avatar. One oddity of the capsule is its height which doesn't scale nicely in the way OpenSimulator would like. To fix this, several adjustment parameters are available to correct the avatar capsule height so that an avatar properly appears to be standing on the ground rather than floating over or sunk into the ground.&lt;br /&gt;
&lt;br /&gt;
These parameters are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
! INI varaible&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightMidFudge&lt;br /&gt;
| 0.1&lt;br /&gt;
| This is a fudge factor added to the 50% avatar height (about 1.87 meters). This number is added to the total height so adjusting this number moves the whole capsule up and down by roughly this distance.&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightLowFudge&lt;br /&gt;
| -0.2&lt;br /&gt;
| This factor is added to the height at the low end of the height scale (&amp;quot;0%&amp;quot; height which is about 1.62 meters). This number is scaled proportionally from the mid height to the low height. Adjusting this number adjusts the height of the capsule for small shapes.&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightHighFudge&lt;br /&gt;
| 0.1&lt;br /&gt;
| This is similar to AvatarHeightLowFudge but it is applied to the high end of height (&amp;quot;100%&amp;quot; height which is about 2.12 meters). It is also added proportionally from the mid height to the large height.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/BulletSim</id>
		<title>BulletSim</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/BulletSim"/>
				<updated>2015-01-07T03:46:25Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Add description of AvatarStepGroundFudge. Correct default values to match code.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''BulletSim'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
BulletSim is the module for OpenSimulator that creates virtual world physics using the [http://bulletphysics.org Bullet Physics Engine]. This module provides high performance physics as well as physical vehicle performance compatible with [http://secondlife.com Second Life].&lt;br /&gt;
&lt;br /&gt;
== Project Information ==&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/Functionality]] lists the possible physical operations, their implementation state and any notes on their use. This is particularly useful for vehicle operations.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
== BulletSim Architecture ==&lt;br /&gt;
&lt;br /&gt;
=== BSScene ===&lt;br /&gt;
Stuff on simulation stepper. Step events (pre-step event, post-step event).&lt;br /&gt;
&lt;br /&gt;
Requirement for controlling physics engine modifications with taint system (regular taints, post-taint taints).&lt;br /&gt;
&lt;br /&gt;
Detail logging system.&lt;br /&gt;
&lt;br /&gt;
Parameter system.&lt;br /&gt;
&lt;br /&gt;
=== BSPhysObject ===&lt;br /&gt;
&lt;br /&gt;
Children classes of BSPrim and BSCharacter.&lt;br /&gt;
&lt;br /&gt;
=== Terrain ===&lt;br /&gt;
&lt;br /&gt;
=== Constraints ===&lt;br /&gt;
&lt;br /&gt;
=== Bullet Implementations ===&lt;br /&gt;
BulletSim is a wrapper for the Bullet physics engine. The interface from the virtual world adapting BulletSim to the physics engine is described by the abstract class &amp;lt;code&amp;gt;BSAPITemplate&amp;lt;/code&amp;gt;. There are two instances of this class, &amp;lt;code&amp;gt;BSAPIXNA&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;BSAPIUnman&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BSAPIUnman&amp;lt;/code&amp;gt; contains the connection to the unmanaged DLL/SO that is the C++ version of the Bullet physics engine. The sources and build instructions are available at &amp;lt;code&amp;gt;git://opensimulator.org/git/opensim-libs/trunk/unmanaged/BulletSim&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;BSAPIXNA&amp;lt;/code&amp;gt; is the connection to a C# version of Bullet the sources of which are hosted at &amp;lt;code&amp;gt;https://code.google.com/p/bullet-xna/&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
The selection of physics engine happens at region start time. It is specified per simulator with the following INI settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [Startup]&lt;br /&gt;
    physics = BulletSim&lt;br /&gt;
    [BulletSim]&lt;br /&gt;
    BulletEngine = BulletUnmanaged  ; The default&lt;br /&gt;
    ; BulletEngine = BulletXNA      ; uncomment this line for C# version of Bullet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Managed/Unmanaged Interface ===&lt;br /&gt;
&lt;br /&gt;
== Linksets ==&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;Actor&amp;quot; Architecture and the Actors ==&lt;br /&gt;
Each BulletSim physical object can have any number of &amp;quot;actors&amp;quot; attached to it. The actors register for simulation events (usually to be called before each simulation step) and change the physical parameters of the object. The currently implemented actors are:&lt;br /&gt;
* BSActorAvatarMove: controls movement and stairs walking of avatars;&lt;br /&gt;
* BSActorHover: implements vertical hovering for objects and avatars;&lt;br /&gt;
* BSActorLockAxis: applies a constraint to physical objects to lock one or more angular axis movement;&lt;br /&gt;
* BSActorMoveToTarget: moves a physical object to a location;&lt;br /&gt;
* BSActorSetForce: applies a continuous force to a physical object;&lt;br /&gt;
* BSActorSetTorque: applies a continuous torque to a physical object;&lt;br /&gt;
* BSDynamic (name will change): implements SecondLife(r) vehicle model.&lt;br /&gt;
&lt;br /&gt;
== Vehicles ==&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/Vehicles]]&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/VehicleTuning]]&lt;br /&gt;
&lt;br /&gt;
== BulletSim Script Extension Functions ==&lt;br /&gt;
&lt;br /&gt;
The physics extension interface is used by BulletSim to implement many new physics functions. The [[OSSL_Script_Library/ModInvoke|mod_invoke]] interface must be enabled for these functions to work.&lt;br /&gt;
&lt;br /&gt;
[[BulletSim/ScriptFunctions]]&lt;br /&gt;
&lt;br /&gt;
== Avatar Walking Up Stairs ==&lt;br /&gt;
The avatar movement actor include special checks to allow avatars to move up stepped objects (think stairs). The code works by checking for collisions close to the avatar's feet and, if trying to walk forward and not flying, pushing the avatar up to get over the object. This is a different algorithm than ODE which relies on the curvature of the avatar's capsule to move up and over low obstacles.&lt;br /&gt;
&lt;br /&gt;
There are five INI parameters that control stairs:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; |&lt;br /&gt;
|AvatarStepHeight&lt;br /&gt;
|The maximum height of a step. If the avatar collides with something of less than this height, it will be considered a step and the avatar will consider moving up to get over it;&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepGroundFudge&lt;br /&gt;
|A small fudge factor subtracted from the computed base of the avatar when checking if the collision is close to the avatar's feet. The base of the avatar computation can be a little high (above the ground) so this factor allows comparing lower for the step. This can prevent small bumps on the ground being too small to be considered a step (which causes the bump to act like a wall);&lt;br /&gt;
|-|AvatarApproachFactor&lt;br /&gt;
|The angle the step must be approached. This is the radians of the angle between the avatar and the colliding step surface. This prevents walking up things when approached from a wide angle. The default of 0.6 is about a 45 degree approach angle. Setting this down to 0.3, for instance, requires the avatar to be walking nearly directly into the step to get the up actions.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepUpCorrectionFactor&lt;br /&gt;
|A multiplication factor for changing the avatar's position to get over the step. The height of the collision with the step is multiplied by this factor and that number is added to the avatar's Z coordinate. This moves the avatar up in relation to the step. If this factor is less than zero, the AvatarStepHeight is used.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepForceFactor&lt;br /&gt;
|A force factor to push the avatar up to get over the step. An up force of the step collision height times the avatar mass times this factor is applied to the avatar. These last two factors can be used in combination for moving the avatar when a step is collided with.&lt;br /&gt;
|-&lt;br /&gt;
|AvatarStepSmoothingSteps&lt;br /&gt;
|when an avatar walks up the steps, collisions go on and off as the steps are hit and moved over. This is the number of simulator ticks (about 10 per second) that walking up steps will still be performed after the last step collision is sensed. This smooths out the action a little.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The default values are:&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    AvatarStepHeight = 0.6&lt;br /&gt;
    AvatarStepGroundFudge = 0.1&lt;br /&gt;
    AvatarStepApproachFactor = 0.6&lt;br /&gt;
    AvatarStepUpCorrectionFactor = 1.0&lt;br /&gt;
    AvatarStepForceFactor = 2.0&lt;br /&gt;
    AvatarStepSmoothingSteps = 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Notes ==&lt;br /&gt;
&lt;br /&gt;
=== Adjusting Avatar Height ===&lt;br /&gt;
&lt;br /&gt;
As of May 13, 2013, BulletSim uses the Bullet capsule shape to approximate a standing avatar. One oddity of the capsule is its height which doesn't scale nicely in the way OpenSimulator would like. To fix this, several adjustment parameters are available to correct the avatar capsule height so that an avatar properly appears to be standing on the ground rather than floating over or sunk into the ground.&lt;br /&gt;
&lt;br /&gt;
These parameters are:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
! INI varaible&lt;br /&gt;
! Default&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightMidFudge&lt;br /&gt;
| 0.1&lt;br /&gt;
| This is a fudge factor added to the 50% avatar height (about 1.87 meters). This number is added to the total height so adjusting this number moves the whole capsule up and down by roughly this distance.&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightLowFudge&lt;br /&gt;
| -0.2&lt;br /&gt;
| This factor is added to the height at the low end of the height scale (&amp;quot;0%&amp;quot; height which is about 1.62 meters). This number is scaled proportionally from the mid height to the low height. Adjusting this number adjusts the height of the capsule for small shapes.&lt;br /&gt;
|-&lt;br /&gt;
| AvatarHeightHighFudge&lt;br /&gt;
| 0.1&lt;br /&gt;
| This is similar to AvatarHeightLowFudge but it is applied to the high end of height (&amp;quot;100%&amp;quot; height which is about 2.12 meters). It is also added proportionally from the mid height to the large height.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Stats_Manager</id>
		<title>Stats Manager</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Stats_Manager"/>
				<updated>2015-01-01T17:25:34Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: example of JSON response&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The OpenSimulator stats manager system is the most modern stats implementation in OpenSimulator and will eventually replace all legacy systems.  It allows statistics to be added, updated and removed at runtime.  Statistics can be viewed via the console &amp;quot;[[show stats]]&amp;quot; command and recorded periodically to file for later analysis.&lt;br /&gt;
&lt;br /&gt;
=General Concepts=&lt;br /&gt;
StatsManager acts as the interface between code that have statistics and modules that want to access and display those statistics. At startup, code register their statistics with StatsManager. Then, any code that wishes to access the statistics (whether to display them on the console, put them in databases, or make them available over the network) requests the values from StatsManager. This architecture allows multiple statistic display and analysis systems while also removing the burden of code instrumentation from the display systems. Also, once code is instrumented and registering statistics, those statistics are available to all display systems.&lt;br /&gt;
&lt;br /&gt;
At initialization, code registers its statistics with StatsManager. The full name of a stat has three components, separated by periods (.).  In order, these are&lt;br /&gt;
&lt;br /&gt;
* '''category''' - The category of the stat (e.g. server, scene)&lt;br /&gt;
* '''container''' - The containing object for this stat.  For example, on scene this is the scene name (e.g. region 1).  For server, this is the component to which the stat relates (e.g. memory, processor).&lt;br /&gt;
* '''name''' - The stat itself.  For example, ClientLogoutsDueToNoReceives or SimFPS.&lt;br /&gt;
&lt;br /&gt;
Full names must be unique.&lt;br /&gt;
&lt;br /&gt;
Registered statistics are generally of two types:&lt;br /&gt;
* '''pull''' - the value of the statistic is &amp;quot;pulled&amp;quot; when the value is requested (using a closure to access the true value location); and&lt;br /&gt;
* '''push''' - the value is periodically stored in the statistic by the monitored code. There are two types of &amp;quot;push&amp;quot; statistics - the kind that just store a value and those that record events.&lt;br /&gt;
&lt;br /&gt;
In the namespace &amp;lt;tt&amp;gt;Opensim.Framework.Monitoring&amp;lt;/tt&amp;gt;, there is the basic &amp;lt;tt&amp;gt;Stats&amp;lt;/tt&amp;gt; class (invocation described below) that provides the basic push or pull statistic. There is also a &amp;lt;tt&amp;gt;CounterStat&amp;lt;/tt&amp;gt; class designed for routines that want to track events. &amp;lt;tt&amp;gt;CounterStats&amp;lt;/tt&amp;gt; can have &amp;lt;tt&amp;gt;EventHistogram&amp;lt;/tt&amp;gt; classes added to keep histograms of events over time. This latter feature is good for tracking statistics that can change more quickly than any external sampling.&lt;br /&gt;
&lt;br /&gt;
= Programmatic Interface =&lt;br /&gt;
== Creating a stat ==&lt;br /&gt;
A statistic is represented by an instance of the OpenSim.Framework.Monitoring.Stat class or one of its descendant classes.  Here's an example that creates a stat for recording all the HTTP requests served by the webserver embedded in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
m_requestsProcessedStat &lt;br /&gt;
    = new Stat(&lt;br /&gt;
        &amp;quot;HTTPRequestsServed&amp;quot;,&lt;br /&gt;
        &amp;quot;Number of inbound HTTP requests processed&amp;quot;,&lt;br /&gt;
        &amp;quot;The number of inbound HTTP requests processed by the builtin HTTP server.&amp;quot;,&lt;br /&gt;
        &amp;quot;requests&amp;quot;,&lt;br /&gt;
        &amp;quot;httpserver&amp;quot;,&lt;br /&gt;
        Port.ToString(),&lt;br /&gt;
        StatType.Pull,&lt;br /&gt;
        MeasuresOfInterest.AverageChangeOverTime,&lt;br /&gt;
        stat =&amp;gt; stat.Value = RequestNumber,&lt;br /&gt;
        StatVerbosity.Debug);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This breaks down as follows&lt;br /&gt;
&lt;br /&gt;
* '''HTTPRequestsServed''' - The short name of this stat.  This is the name used when the stat is displayed or recorded.&lt;br /&gt;
* '''Number of inbound HTTP requests processed''' - The full name of this stat.&lt;br /&gt;
* '''The number of inbound HTTP requests processed by the builtin HTTP server.''' - A description of this stat.&lt;br /&gt;
* '''requests''' - The unit name for this stat.&lt;br /&gt;
* '''httpserver''' - The category for this stat.&lt;br /&gt;
* '''container''' - The container for this stat within the category.  In this case, we use the port number as the &amp;quot;container&amp;quot; since this distinguishes this data from similar stats on other ports.  Another example of a distinguishing container is the region name.&lt;br /&gt;
* '''StatType.Pull''' - The statistic type.  This is either Pull or Push.  If Pull, then when a stat is required (e.g. if the user requests the information or it needs to be recorded), then it is gathered by the given pullAction (of which more below).  If a statistic if push, then the pull action is null (or will be ignored) and the code registering the stat is responsible for updating the value directly on an ongoing basis.&lt;br /&gt;
* '''MeasuresOfInterest.AverageChangeOverTime''' - This can be None or ChangeOverTime.  If None, then only the raw stat is recorded.  If ChangeOverTime, then StatsManager also derives the moving average over the last 24 samples.&lt;br /&gt;
* '''stat =&amp;gt; stat.Value = RequestNumber''' - This is the anonymous function used to generate the stat on a pull request.  In this case, the RequestNumber within the HTTP management code is inserted into the stat value.&lt;br /&gt;
* '''StatVerbosity.Debug''' - StatVerbosity can be Debug or Info.  Info should be used for stats that the user will always be interested in seeing (e.g. number of users on a region) and Debug for debugging stats (such as HTTP requests served).  However, right now stat display is not filtered on verbosity.&lt;br /&gt;
&lt;br /&gt;
== Registering a stat==&lt;br /&gt;
A created stat must then be registered with the StatsManager.  In the case of our example above, this is done as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.RegisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Deregistering a stat==&lt;br /&gt;
If your code is never disabled during runtime then you don't need to worry about deregistering the stat.  However, if it can be removed (e.g. because it is in a region module) then you can deregister a stat as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.DeregisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fetching stats ==&lt;br /&gt;
There are several interfaces for fetching stats. The easiest is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.TryGetStats(string category, string container, string shortStatName, out Stat)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
which accepts the name of a category, container, and the short version of the stat name and returns the statistic. Null is returned if the stat is not found.&lt;br /&gt;
&lt;br /&gt;
There are also methods to return all of the stats within a category (&amp;lt;tt&amp;gt;TryGetStatsForCategory&amp;lt;/tt&amp;gt;) and within a container (&amp;lt;tt&amp;gt;GetStatsForEachContainer&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Statistics from the console =&lt;br /&gt;
&lt;br /&gt;
From the console, there are several ways to display the stats:&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats&amp;lt;/tt&amp;gt; returns simulator statistics in a legacy format&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats all&amp;lt;/tt&amp;gt; displays all the registered stats one line per stat.&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats category container&amp;lt;/tt&amp;gt; displays all the stats within a particular category/container&lt;br /&gt;
&lt;br /&gt;
= Web access to stats =&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;tt&amp;gt;[Startup]ManagedStatsRemoteFetchURI&amp;lt;/tt&amp;gt; is defined and set to some value, the simulator statistics are available over the web via HTTP GET operations. The URL is the simulator's HTTP server URL appended with the value in &amp;lt;tt&amp;gt;ManagedStatsRemoteFetchURI&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The URL fetched accepts four different query parameters:&lt;br /&gt;
&lt;br /&gt;
* '''cat''' which specifies a category to fetch. If no category is given, the special category &amp;quot;all&amp;quot; is use which return all categories;&lt;br /&gt;
* '''cont''' specified a container. If not specified, the special container &amp;quot;all&amp;quot; is used to return all containers&lt;br /&gt;
* '''stat''' specifies the name of the particular stat. If not specified, the stat &amp;quot;all&amp;quot; is used to return all stats.&lt;br /&gt;
* '''callback''' specifies if the returned JSON data is to be wrapped in a callback function.&lt;br /&gt;
&lt;br /&gt;
For instance, for a simulator at IP address 10.1.1.4 with the INI settings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[network]&lt;br /&gt;
   http_listener_port=9000&lt;br /&gt;
[Startup]&lt;br /&gt;
   ManagedStatsremoteFetchURI=ManagedStats&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
example data fetches are:&lt;br /&gt;
&lt;br /&gt;
; wget http://10.1.1.4:9000/ManagedStats/&lt;br /&gt;
: returns all stats registered in the simulator&lt;br /&gt;
; wget http://10.1.1.4:9000/ManagedStats/?cat=server&lt;br /&gt;
: returns all stats registered with the category &amp;quot;server&amp;quot;&lt;br /&gt;
; wget http://10.1.1.4:9000/ManagedStats/?cat=server&amp;amp;cont=threadpool&lt;br /&gt;
: returns all stats for the &amp;quot;threadpool&amp;quot; container within the &amp;quot;server&amp;quot; category&lt;br /&gt;
; wget http://10.1.1.4:9000/ManagedStats/?cat=server&amp;amp;cont=threadpool&amp;amp;stat=STPMinThreads&lt;br /&gt;
: returns the value for the specific stat&lt;br /&gt;
&lt;br /&gt;
The data is returned in JSON format grouped as you might expect with maps of categories containing maps of containers containing maps of stats. For instance, the response to &amp;lt;tt&amp;gt;http://10.1.1.4:9000/ManagedStats/?cat=server&amp;amp;cont=threadpool&amp;lt;/tt&amp;gt; might look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&amp;quot;server&amp;quot;:&lt;br /&gt;
    {&amp;quot;threadpool&amp;quot;:&lt;br /&gt;
        {&amp;quot;BuiltinThreadpoolIOCPThreadsAvailable&amp;quot;:&lt;br /&gt;
            {&amp;quot;StatType&amp;quot;:&amp;quot;Stat&amp;quot;,&lt;br /&gt;
            &amp;quot;Category&amp;quot;:&amp;quot;server&amp;quot;,&lt;br /&gt;
            &amp;quot;Container&amp;quot;:&amp;quot;threadpool&amp;quot;,&lt;br /&gt;
            &amp;quot;ShortName&amp;quot;:&amp;quot;BuiltinThreadpoolIOCPThreadsAvailable&amp;quot;,&lt;br /&gt;
            &amp;quot;Name&amp;quot;:&amp;quot;BuiltinThreadpoolIOCPThreadsAvailable&amp;quot;,&lt;br /&gt;
            &amp;quot;Description&amp;quot;:&amp;quot;BuiltinThreadpoolIOCPThreadsAvailable&amp;quot;,&lt;br /&gt;
            &amp;quot;UnitName&amp;quot;:&amp;quot;threads&amp;quot;,&lt;br /&gt;
            &amp;quot;Value&amp;quot;:1000.0&lt;br /&gt;
            },&lt;br /&gt;
        &amp;quot;BuiltinThreadpoolWorkerThreadsAvailable&amp;quot;:&lt;br /&gt;
            {&amp;quot;StatType&amp;quot;:&amp;quot;Stat&amp;quot;,&lt;br /&gt;
            &amp;quot;Category&amp;quot;:&amp;quot;server&amp;quot;,&lt;br /&gt;
            &amp;quot;Container&amp;quot;:&amp;quot;threadpool&amp;quot;,&lt;br /&gt;
            &amp;quot;ShortName&amp;quot;:&amp;quot;BuiltinThreadpoolWorkerThreadsAvailable&amp;quot;,&lt;br /&gt;
            &amp;quot;Name&amp;quot;:&amp;quot;BuiltinThreadpoolWorkerThreadsAvailable&amp;quot;,&lt;br /&gt;
            &amp;quot;Description&amp;quot;:&amp;quot;BuiltinThreadpoolWorkerThreadsAvailable&amp;quot;,&lt;br /&gt;
            &amp;quot;UnitName&amp;quot;:&amp;quot;threads&amp;quot;,&lt;br /&gt;
            &amp;quot;Value&amp;quot;:499.0&lt;br /&gt;
            },&lt;br /&gt;
        &amp;quot;STPActiveThreads&amp;quot;:&lt;br /&gt;
            {&amp;quot;StatType&amp;quot;:&amp;quot;Stat&amp;quot;,&lt;br /&gt;
            &amp;quot;Category&amp;quot;:&amp;quot;server&amp;quot;,&lt;br /&gt;
            &amp;quot;Container&amp;quot;:&amp;quot;threadpool&amp;quot;,&lt;br /&gt;
            &amp;quot;ShortName&amp;quot;:&amp;quot;STPActiveThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;Name&amp;quot;:&amp;quot;STPActiveThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;Description&amp;quot;:&amp;quot;STPActiveThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;UnitName&amp;quot;:&amp;quot;threads&amp;quot;,&lt;br /&gt;
            &amp;quot;Value&amp;quot;:15.0&lt;br /&gt;
            },&lt;br /&gt;
        &amp;quot;STPConcurrency&amp;quot;:&lt;br /&gt;
            {&amp;quot;StatType&amp;quot;:&amp;quot;Stat&amp;quot;,&lt;br /&gt;
            &amp;quot;Category&amp;quot;:&amp;quot;server&amp;quot;,&lt;br /&gt;
            &amp;quot;Container&amp;quot;:&amp;quot;threadpool&amp;quot;,&lt;br /&gt;
            &amp;quot;ShortName&amp;quot;:&amp;quot;STPConcurrency&amp;quot;,&lt;br /&gt;
            &amp;quot;Name&amp;quot;:&amp;quot;STPConcurrency&amp;quot;,&lt;br /&gt;
            &amp;quot;Description&amp;quot;:&amp;quot;STPConcurrency&amp;quot;,&lt;br /&gt;
            &amp;quot;UnitName&amp;quot;:&amp;quot;threads&amp;quot;,&lt;br /&gt;
            &amp;quot;Value&amp;quot;:45.0&lt;br /&gt;
            },&lt;br /&gt;
        &amp;quot;STPInUseThreads&amp;quot;:&lt;br /&gt;
            {&amp;quot;StatType&amp;quot;:&amp;quot;Stat&amp;quot;,&lt;br /&gt;
            &amp;quot;Category&amp;quot;:&amp;quot;server&amp;quot;,&lt;br /&gt;
            &amp;quot;Container&amp;quot;:&amp;quot;threadpool&amp;quot;,&lt;br /&gt;
            &amp;quot;ShortName&amp;quot;:&amp;quot;STPInUseThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;Name&amp;quot;:&amp;quot;STPInUseThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;Description&amp;quot;:&amp;quot;STPInUseThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;UnitName&amp;quot;:&amp;quot;threads&amp;quot;,&lt;br /&gt;
            &amp;quot;Value&amp;quot;:0.0&lt;br /&gt;
            },&lt;br /&gt;
        &amp;quot;STPMaxThreads&amp;quot;:&lt;br /&gt;
            {&amp;quot;StatType&amp;quot;:&amp;quot;Stat&amp;quot;,&lt;br /&gt;
            &amp;quot;Category&amp;quot;:&amp;quot;server&amp;quot;,&lt;br /&gt;
            &amp;quot;Container&amp;quot;:&amp;quot;threadpool&amp;quot;,&lt;br /&gt;
            &amp;quot;ShortName&amp;quot;:&amp;quot;STPMaxThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;Name&amp;quot;:&amp;quot;STPMaxThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;Description&amp;quot;:&amp;quot;STPMaxThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;UnitName&amp;quot;:&amp;quot;threads&amp;quot;,&lt;br /&gt;
            &amp;quot;Value&amp;quot;:45.0&lt;br /&gt;
            },&lt;br /&gt;
        &amp;quot;STPMinThreads&amp;quot;:&lt;br /&gt;
            {&amp;quot;StatType&amp;quot;:&amp;quot;Stat&amp;quot;,&lt;br /&gt;
            &amp;quot;Category&amp;quot;:&amp;quot;server&amp;quot;,&lt;br /&gt;
            &amp;quot;Container&amp;quot;:&amp;quot;threadpool&amp;quot;,&lt;br /&gt;
            &amp;quot;ShortName&amp;quot;:&amp;quot;STPMinThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;Name&amp;quot;:&amp;quot;STPMinThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;Description&amp;quot;:&amp;quot;STPMinThreads&amp;quot;,&lt;br /&gt;
            &amp;quot;UnitName&amp;quot;:&amp;quot;threads&amp;quot;,&lt;br /&gt;
            &amp;quot;Value&amp;quot;:15.0&lt;br /&gt;
            },&lt;br /&gt;
        &amp;quot;STPWorkItemsWaiting&amp;quot;:&lt;br /&gt;
            {&amp;quot;StatType&amp;quot;:&amp;quot;Stat&amp;quot;,&lt;br /&gt;
            &amp;quot;Category&amp;quot;:&amp;quot;server&amp;quot;,&lt;br /&gt;
            &amp;quot;Container&amp;quot;:&amp;quot;threadpool&amp;quot;,&lt;br /&gt;
            &amp;quot;ShortName&amp;quot;:&amp;quot;STPWorkItemsWaiting&amp;quot;,&lt;br /&gt;
            &amp;quot;Name&amp;quot;:&amp;quot;STPWorkItemsWaiting&amp;quot;,&lt;br /&gt;
            &amp;quot;Description&amp;quot;:&amp;quot;STPWorkItemsWaiting&amp;quot;,&lt;br /&gt;
            &amp;quot;UnitName&amp;quot;:&amp;quot;threads&amp;quot;,&lt;br /&gt;
            &amp;quot;Value&amp;quot;:0.0&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Stats_Manager</id>
		<title>Stats Manager</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Stats_Manager"/>
				<updated>2015-01-01T17:22:11Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: examples of fetching from web&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The OpenSimulator stats manager system is the most modern stats implementation in OpenSimulator and will eventually replace all legacy systems.  It allows statistics to be added, updated and removed at runtime.  Statistics can be viewed via the console &amp;quot;[[show stats]]&amp;quot; command and recorded periodically to file for later analysis.&lt;br /&gt;
&lt;br /&gt;
=General Concepts=&lt;br /&gt;
StatsManager acts as the interface between code that have statistics and modules that want to access and display those statistics. At startup, code register their statistics with StatsManager. Then, any code that wishes to access the statistics (whether to display them on the console, put them in databases, or make them available over the network) requests the values from StatsManager. This architecture allows multiple statistic display and analysis systems while also removing the burden of code instrumentation from the display systems. Also, once code is instrumented and registering statistics, those statistics are available to all display systems.&lt;br /&gt;
&lt;br /&gt;
At initialization, code registers its statistics with StatsManager. The full name of a stat has three components, separated by periods (.).  In order, these are&lt;br /&gt;
&lt;br /&gt;
* '''category''' - The category of the stat (e.g. server, scene)&lt;br /&gt;
* '''container''' - The containing object for this stat.  For example, on scene this is the scene name (e.g. region 1).  For server, this is the component to which the stat relates (e.g. memory, processor).&lt;br /&gt;
* '''name''' - The stat itself.  For example, ClientLogoutsDueToNoReceives or SimFPS.&lt;br /&gt;
&lt;br /&gt;
Full names must be unique.&lt;br /&gt;
&lt;br /&gt;
Registered statistics are generally of two types:&lt;br /&gt;
* '''pull''' - the value of the statistic is &amp;quot;pulled&amp;quot; when the value is requested (using a closure to access the true value location); and&lt;br /&gt;
* '''push''' - the value is periodically stored in the statistic by the monitored code. There are two types of &amp;quot;push&amp;quot; statistics - the kind that just store a value and those that record events.&lt;br /&gt;
&lt;br /&gt;
In the namespace &amp;lt;tt&amp;gt;Opensim.Framework.Monitoring&amp;lt;/tt&amp;gt;, there is the basic &amp;lt;tt&amp;gt;Stats&amp;lt;/tt&amp;gt; class (invocation described below) that provides the basic push or pull statistic. There is also a &amp;lt;tt&amp;gt;CounterStat&amp;lt;/tt&amp;gt; class designed for routines that want to track events. &amp;lt;tt&amp;gt;CounterStats&amp;lt;/tt&amp;gt; can have &amp;lt;tt&amp;gt;EventHistogram&amp;lt;/tt&amp;gt; classes added to keep histograms of events over time. This latter feature is good for tracking statistics that can change more quickly than any external sampling.&lt;br /&gt;
&lt;br /&gt;
= Programmatic Interface =&lt;br /&gt;
== Creating a stat ==&lt;br /&gt;
A statistic is represented by an instance of the OpenSim.Framework.Monitoring.Stat class or one of its descendant classes.  Here's an example that creates a stat for recording all the HTTP requests served by the webserver embedded in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
m_requestsProcessedStat &lt;br /&gt;
    = new Stat(&lt;br /&gt;
        &amp;quot;HTTPRequestsServed&amp;quot;,&lt;br /&gt;
        &amp;quot;Number of inbound HTTP requests processed&amp;quot;,&lt;br /&gt;
        &amp;quot;The number of inbound HTTP requests processed by the builtin HTTP server.&amp;quot;,&lt;br /&gt;
        &amp;quot;requests&amp;quot;,&lt;br /&gt;
        &amp;quot;httpserver&amp;quot;,&lt;br /&gt;
        Port.ToString(),&lt;br /&gt;
        StatType.Pull,&lt;br /&gt;
        MeasuresOfInterest.AverageChangeOverTime,&lt;br /&gt;
        stat =&amp;gt; stat.Value = RequestNumber,&lt;br /&gt;
        StatVerbosity.Debug);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This breaks down as follows&lt;br /&gt;
&lt;br /&gt;
* '''HTTPRequestsServed''' - The short name of this stat.  This is the name used when the stat is displayed or recorded.&lt;br /&gt;
* '''Number of inbound HTTP requests processed''' - The full name of this stat.&lt;br /&gt;
* '''The number of inbound HTTP requests processed by the builtin HTTP server.''' - A description of this stat.&lt;br /&gt;
* '''requests''' - The unit name for this stat.&lt;br /&gt;
* '''httpserver''' - The category for this stat.&lt;br /&gt;
* '''container''' - The container for this stat within the category.  In this case, we use the port number as the &amp;quot;container&amp;quot; since this distinguishes this data from similar stats on other ports.  Another example of a distinguishing container is the region name.&lt;br /&gt;
* '''StatType.Pull''' - The statistic type.  This is either Pull or Push.  If Pull, then when a stat is required (e.g. if the user requests the information or it needs to be recorded), then it is gathered by the given pullAction (of which more below).  If a statistic if push, then the pull action is null (or will be ignored) and the code registering the stat is responsible for updating the value directly on an ongoing basis.&lt;br /&gt;
* '''MeasuresOfInterest.AverageChangeOverTime''' - This can be None or ChangeOverTime.  If None, then only the raw stat is recorded.  If ChangeOverTime, then StatsManager also derives the moving average over the last 24 samples.&lt;br /&gt;
* '''stat =&amp;gt; stat.Value = RequestNumber''' - This is the anonymous function used to generate the stat on a pull request.  In this case, the RequestNumber within the HTTP management code is inserted into the stat value.&lt;br /&gt;
* '''StatVerbosity.Debug''' - StatVerbosity can be Debug or Info.  Info should be used for stats that the user will always be interested in seeing (e.g. number of users on a region) and Debug for debugging stats (such as HTTP requests served).  However, right now stat display is not filtered on verbosity.&lt;br /&gt;
&lt;br /&gt;
== Registering a stat==&lt;br /&gt;
A created stat must then be registered with the StatsManager.  In the case of our example above, this is done as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.RegisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Deregistering a stat==&lt;br /&gt;
If your code is never disabled during runtime then you don't need to worry about deregistering the stat.  However, if it can be removed (e.g. because it is in a region module) then you can deregister a stat as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.DeregisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fetching stats ==&lt;br /&gt;
There are several interfaces for fetching stats. The easiest is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.TryGetStats(string category, string container, string shortStatName, out Stat)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
which accepts the name of a category, container, and the short version of the stat name and returns the statistic. Null is returned if the stat is not found.&lt;br /&gt;
&lt;br /&gt;
There are also methods to return all of the stats within a category (&amp;lt;tt&amp;gt;TryGetStatsForCategory&amp;lt;/tt&amp;gt;) and within a container (&amp;lt;tt&amp;gt;GetStatsForEachContainer&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Statistics from the console =&lt;br /&gt;
&lt;br /&gt;
From the console, there are several ways to display the stats:&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats&amp;lt;/tt&amp;gt; returns simulator statistics in a legacy format&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats all&amp;lt;/tt&amp;gt; displays all the registered stats one line per stat.&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats category container&amp;lt;/tt&amp;gt; displays all the stats within a particular category/container&lt;br /&gt;
&lt;br /&gt;
= Web access to stats =&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;tt&amp;gt;[Startup]ManagedStatsRemoteFetchURI&amp;lt;/tt&amp;gt; is defined and set to some value, the simulator statistics are available over the web via HTTP GET operations. The URL is the simulator's HTTP server URL appended with the value in &amp;lt;tt&amp;gt;ManagedStatsRemoteFetchURI&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The URL fetched accepts four different query parameters:&lt;br /&gt;
&lt;br /&gt;
* '''cat''' which specifies a category to fetch. If no category is given, the special category &amp;quot;all&amp;quot; is use which return all categories;&lt;br /&gt;
* '''cont''' specified a container. If not specified, the special container &amp;quot;all&amp;quot; is used to return all containers&lt;br /&gt;
* '''stat''' specifies the name of the particular stat. If not specified, the stat &amp;quot;all&amp;quot; is used to return all stats.&lt;br /&gt;
* '''callback''' specifies if the returned JSON data is to be wrapped in a callback function.&lt;br /&gt;
&lt;br /&gt;
For instance, for a simulator at IP address 10.1.1.4 with the INI settings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[network]&lt;br /&gt;
   http_listener_port=9000&lt;br /&gt;
[Startup]&lt;br /&gt;
   ManagedStatsremoteFetchURI=ManagedStats&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
example data fetches are:&lt;br /&gt;
&lt;br /&gt;
; wget http://10.1.1.4:9000/ManagedStats/&lt;br /&gt;
: returns all stats registered in the simulator&lt;br /&gt;
; wget http://10.1.1.4:9000/ManagedStats/?cat=server&lt;br /&gt;
: returns all stats registered with the category &amp;quot;server&amp;quot;&lt;br /&gt;
; wget http://10.1.1.4:9000/ManagedStats/?cat=server&amp;amp;cont=threadpool&lt;br /&gt;
: returns all stats for the &amp;quot;threadpool&amp;quot; container within the &amp;quot;server&amp;quot; category&lt;br /&gt;
; wget http://10.1.1.4:9000/ManagedStats/?cat=server&amp;amp;cont=threadpool&amp;amp;stat=STPMinThreads&lt;br /&gt;
: returns the value for the specific stat&lt;br /&gt;
&lt;br /&gt;
The data is returned in JSON format grouped as you might expect with maps of categories containing maps of containers containing maps of stats.&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Stats_Manager</id>
		<title>Stats Manager</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Stats_Manager"/>
				<updated>2015-01-01T06:25:44Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: more info on fetching stats&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The OpenSimulator stats manager system is the most modern stats implementation in OpenSimulator and will eventually replace all legacy systems.  It allows statistics to be added, updated and removed at runtime.  Statistics can be viewed via the console &amp;quot;[[show stats]]&amp;quot; command and recorded periodically to file for later analysis.&lt;br /&gt;
&lt;br /&gt;
=General Concepts=&lt;br /&gt;
StatsManager acts as the interface between code that have statistics and modules that want to access and display those statistics. At startup, code register their statistics with StatsManager. Then, any code that wishes to access the statistics (whether to display them on the console, put them in databases, or make them available over the network) requests the values from StatsManager. This architecture allows multiple statistic display and analysis systems while also removing the burden of code instrumentation from the display systems. Also, once code is instrumented and registering statistics, those statistics are available to all display systems.&lt;br /&gt;
&lt;br /&gt;
At initialization, code registers its statistics with StatsManager. The full name of a stat has three components, separated by periods (.).  In order, these are&lt;br /&gt;
&lt;br /&gt;
* '''category''' - The category of the stat (e.g. server, scene)&lt;br /&gt;
* '''container''' - The containing object for this stat.  For example, on scene this is the scene name (e.g. region 1).  For server, this is the component to which the stat relates (e.g. memory, processor).&lt;br /&gt;
* '''name''' - The stat itself.  For example, ClientLogoutsDueToNoReceives or SimFPS.&lt;br /&gt;
&lt;br /&gt;
Full names must be unique.&lt;br /&gt;
&lt;br /&gt;
Registered statistics are generally of two types:&lt;br /&gt;
* '''pull''' - the value of the statistic is &amp;quot;pulled&amp;quot; when the value is requested (using a closure to access the true value location); and&lt;br /&gt;
* '''push''' - the value is periodically stored in the statistic by the monitored code. There are two types of &amp;quot;push&amp;quot; statistics - the kind that just store a value and those that record events.&lt;br /&gt;
&lt;br /&gt;
In the namespace &amp;lt;tt&amp;gt;Opensim.Framework.Monitoring&amp;lt;/tt&amp;gt;, there is the basic &amp;lt;tt&amp;gt;Stats&amp;lt;/tt&amp;gt; class (invocation described below) that provides the basic push or pull statistic. There is also a &amp;lt;tt&amp;gt;CounterStat&amp;lt;/tt&amp;gt; class designed for routines that want to track events. &amp;lt;tt&amp;gt;CounterStats&amp;lt;/tt&amp;gt; can have &amp;lt;tt&amp;gt;EventHistogram&amp;lt;/tt&amp;gt; classes added to keep histograms of events over time. This latter feature is good for tracking statistics that can change more quickly than any external sampling.&lt;br /&gt;
&lt;br /&gt;
= Programmatic Interface =&lt;br /&gt;
== Creating a stat ==&lt;br /&gt;
A statistic is represented by an instance of the OpenSim.Framework.Monitoring.Stat class or one of its descendant classes.  Here's an example that creates a stat for recording all the HTTP requests served by the webserver embedded in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
m_requestsProcessedStat &lt;br /&gt;
    = new Stat(&lt;br /&gt;
        &amp;quot;HTTPRequestsServed&amp;quot;,&lt;br /&gt;
        &amp;quot;Number of inbound HTTP requests processed&amp;quot;,&lt;br /&gt;
        &amp;quot;The number of inbound HTTP requests processed by the builtin HTTP server.&amp;quot;,&lt;br /&gt;
        &amp;quot;requests&amp;quot;,&lt;br /&gt;
        &amp;quot;httpserver&amp;quot;,&lt;br /&gt;
        Port.ToString(),&lt;br /&gt;
        StatType.Pull,&lt;br /&gt;
        MeasuresOfInterest.AverageChangeOverTime,&lt;br /&gt;
        stat =&amp;gt; stat.Value = RequestNumber,&lt;br /&gt;
        StatVerbosity.Debug);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This breaks down as follows&lt;br /&gt;
&lt;br /&gt;
* '''HTTPRequestsServed''' - The short name of this stat.  This is the name used when the stat is displayed or recorded.&lt;br /&gt;
* '''Number of inbound HTTP requests processed''' - The full name of this stat.&lt;br /&gt;
* '''The number of inbound HTTP requests processed by the builtin HTTP server.''' - A description of this stat.&lt;br /&gt;
* '''requests''' - The unit name for this stat.&lt;br /&gt;
* '''httpserver''' - The category for this stat.&lt;br /&gt;
* '''container''' - The container for this stat within the category.  In this case, we use the port number as the &amp;quot;container&amp;quot; since this distinguishes this data from similar stats on other ports.  Another example of a distinguishing container is the region name.&lt;br /&gt;
* '''StatType.Pull''' - The statistic type.  This is either Pull or Push.  If Pull, then when a stat is required (e.g. if the user requests the information or it needs to be recorded), then it is gathered by the given pullAction (of which more below).  If a statistic if push, then the pull action is null (or will be ignored) and the code registering the stat is responsible for updating the value directly on an ongoing basis.&lt;br /&gt;
* '''MeasuresOfInterest.AverageChangeOverTime''' - This can be None or ChangeOverTime.  If None, then only the raw stat is recorded.  If ChangeOverTime, then StatsManager also derives the moving average over the last 24 samples.&lt;br /&gt;
* '''stat =&amp;gt; stat.Value = RequestNumber''' - This is the anonymous function used to generate the stat on a pull request.  In this case, the RequestNumber within the HTTP management code is inserted into the stat value.&lt;br /&gt;
* '''StatVerbosity.Debug''' - StatVerbosity can be Debug or Info.  Info should be used for stats that the user will always be interested in seeing (e.g. number of users on a region) and Debug for debugging stats (such as HTTP requests served).  However, right now stat display is not filtered on verbosity.&lt;br /&gt;
&lt;br /&gt;
== Registering a stat==&lt;br /&gt;
A created stat must then be registered with the StatsManager.  In the case of our example above, this is done as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.RegisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Deregistering a stat==&lt;br /&gt;
If your code is never disabled during runtime then you don't need to worry about deregistering the stat.  However, if it can be removed (e.g. because it is in a region module) then you can deregister a stat as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.DeregisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Fetching stats ==&lt;br /&gt;
There are several interfaces for fetching stats. The easiest is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.TryGetStats(string category, string container, string shortStatName, out Stat)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
which accepts the name of a category, container, and the short version of the stat name and returns the statistic. Null is returned if the stat is not found.&lt;br /&gt;
&lt;br /&gt;
There are also methods to return all of the stats within a category (&amp;lt;tt&amp;gt;TryGetStatsForCategory&amp;lt;/tt&amp;gt;) and within a container (&amp;lt;tt&amp;gt;GetStatsForEachContainer&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Statistics from the console =&lt;br /&gt;
&lt;br /&gt;
From the console, there are several ways to display the stats:&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats&amp;lt;/tt&amp;gt; returns simulator statistics in a legacy format&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats all&amp;lt;/tt&amp;gt; displays all the registered stats one line per stat.&lt;br /&gt;
* &amp;lt;tt&amp;gt;show stats category container&amp;lt;/tt&amp;gt; displays all the stats within a particular category/container&lt;br /&gt;
&lt;br /&gt;
= Web access to stats =&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;tt&amp;gt;[Startup]ManagedStatsRemoteFetchURI&amp;lt;/tt&amp;gt; is defined and set to some value, the simulator statistics are available over the web via HTTP GET operations. The URL is the simulator's HTTP server URL appended with the value in &amp;lt;tt&amp;gt;ManagedStatsRemoteFetchURI&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The URL fetched accepts four different query parameters:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For instance, a simulator at IP address 10.1.1.4 with the INI settings:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[network]&lt;br /&gt;
   http_listener_port=9000&lt;br /&gt;
[Startup]&lt;br /&gt;
   ManagedStatsremoteFetchURI=ManagedStats&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
the URL k&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Stats_Manager</id>
		<title>Stats Manager</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Stats_Manager"/>
				<updated>2014-12-31T21:21:34Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: description of two stats types&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The OpenSimulator stats manager system is the most modern stats implementation in OpenSimulator and will eventually replace all legacy systems.  It allows statistics to be added, updated and removed at runtime.  Statistics can be viewed via the console &amp;quot;[[show stats]]&amp;quot; command and recorded periodically to file for later analysis.&lt;br /&gt;
&lt;br /&gt;
=General Concepts=&lt;br /&gt;
StatsManager acts as the interface between code that have statistics and modules that want to access and display those statistics. At startup, code register their statistics with StatsManager. Then, any code that wishes to access the statistics (whether to display them on the console, put them in databases, or make them available over the network) requests the values from StatsManager. This architecture allows multiple statistic display and analysis systems while also removing the burden of code instrumentation from the display systems. Also, once code is instrumented and registering statistics, those statistics are available to all display systems.&lt;br /&gt;
&lt;br /&gt;
At initialization, code registers its statistics with StatsManager. The full name of a stat has three components, separated by periods (.).  In order, these are&lt;br /&gt;
&lt;br /&gt;
* '''category''' - The category of the stat (e.g. server, scene)&lt;br /&gt;
* '''container''' - The containing object for this stat.  For example, on scene this is the scene name (e.g. region 1).  For server, this is the component to which the stat relates (e.g. memory, processor).&lt;br /&gt;
* '''name''' - The stat itself.  For example, ClientLogoutsDueToNoReceives or SimFPS.&lt;br /&gt;
&lt;br /&gt;
Full names must be unique.&lt;br /&gt;
&lt;br /&gt;
Registered statistics are generally of two types:&lt;br /&gt;
* '''pull''' - the value of the statistic is &amp;quot;pulled&amp;quot; when the value is requested (using a closure to access the true value location); and&lt;br /&gt;
* '''push''' - the value is periodically stored in the statistic by the monitored code. There are two types of &amp;quot;push&amp;quot; statistics - the kind that just store a value and those that record events.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Operations=&lt;br /&gt;
== Creating a stat ==&lt;br /&gt;
A statistic is represented by an instance of the OpenSim.Framework.Monitoring.Stat class or one of its descendant classes.  Here's an example that creates a stat for recording all the HTTP requests served by the webserver embedded in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
m_requestsProcessedStat &lt;br /&gt;
    = new Stat(&lt;br /&gt;
        &amp;quot;HTTPRequestsServed&amp;quot;,&lt;br /&gt;
        &amp;quot;Number of inbound HTTP requests processed&amp;quot;,&lt;br /&gt;
        &amp;quot;The number of inbound HTTP requests processed by the builtin HTTP server.&amp;quot;,&lt;br /&gt;
        &amp;quot;requests&amp;quot;,&lt;br /&gt;
        &amp;quot;httpserver&amp;quot;,&lt;br /&gt;
        Port.ToString(),&lt;br /&gt;
        StatType.Pull,&lt;br /&gt;
        MeasuresOfInterest.AverageChangeOverTime,&lt;br /&gt;
        stat =&amp;gt; stat.Value = RequestNumber,&lt;br /&gt;
        StatVerbosity.Debug);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This breaks down as follows&lt;br /&gt;
&lt;br /&gt;
* '''HTTPRequestsServed''' - The short name of this stat.  This is the name used when the stat is displayed or recorded.&lt;br /&gt;
* '''Number of inbound HTTP requests processed''' - The full name of this stat.&lt;br /&gt;
* '''The number of inbound HTTP requests processed by the builtin HTTP server.''' - A description of this stat.&lt;br /&gt;
* '''requests''' - The unit name for this stat.&lt;br /&gt;
* '''httpserver''' - The category for this stat.&lt;br /&gt;
* '''container''' - The container for this stat within the category.  In this case, we use the port number as the &amp;quot;container&amp;quot; since this distinguishes this data from similar stats on other ports.  Another example of a distinguishing container is the region name.&lt;br /&gt;
* '''StatType.Pull''' - The statistic type.  This is either Pull or Push.  If Pull, then when a stat is required (e.g. if the user requests the information or it needs to be recorded), then it is gathered by the given pullAction (of which more below).  If a statistic if push, then the pull action is null (or will be ignored) and the code registering the stat is responsible for updating the value directly on an ongoing basis.&lt;br /&gt;
* '''MeasuresOfInterest.AverageChangeOverTime''' - This can be None or ChangeOverTime.  If None, then only the raw stat is recorded.  If ChangeOverTime, then StatsManager also derives the moving average over the last 24 samples.&lt;br /&gt;
* '''stat =&amp;gt; stat.Value = RequestNumber''' - This is the anonymous function used to generate the stat on a pull request.  In this case, the RequestNumber within the HTTP management code is inserted into the stat value.&lt;br /&gt;
* '''StatVerbosity.Debug''' - StatVerbosity can be Debug or Info.  Info should be used for stats that the user will always be interested in seeing (e.g. number of users on a region) and Debug for debugging stats (such as HTTP requests served).  However, right now stat display is not filtered on verbosity.&lt;br /&gt;
&lt;br /&gt;
== Registering a stat==&lt;br /&gt;
A created stat must then be registered with the StatsManager.  In the case of our example above, this is done as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.RegisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Deregistering a stat==&lt;br /&gt;
If your code is never disabled during runtime then you don't need to worry about deregistering the stat.  However, if it can be removed (e.g. because it is in a region module) then you can deregister a stat as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.DeregisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Stats_Manager</id>
		<title>Stats Manager</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Stats_Manager"/>
				<updated>2014-12-31T21:14:03Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: General architectural description added to 'General Concepts'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Introduction=&lt;br /&gt;
The OpenSimulator stats manager system is the most modern stats implementation in OpenSimulator and will eventually replace all legacy systems.  It allows statistics to be added, updated and removed at runtime.  Statistics can be viewed via the console &amp;quot;[[show stats]]&amp;quot; command and recorded periodically to file for later analysis.&lt;br /&gt;
&lt;br /&gt;
=General Concepts=&lt;br /&gt;
StatsManager acts as the interface between code that have statistics and modules that want to access and display those statistics. At startup, code register their statistics with StatsManager. Then, any code that wishes to access the statistics (whether to display them on the console, put them in databases, or make them available over the network) requests the values from StatsManager. This architecture allows multiple statistic display and analysis systems while also removing the burden of code instrumentation from the display systems. Also, once code is instrumented and registering statistics, those statistics are available to all display systems.&lt;br /&gt;
&lt;br /&gt;
At initialization, code registers its statistics with StatsManager. The full name of a stat has three components, separated by periods (.).  In order, these are&lt;br /&gt;
&lt;br /&gt;
* '''category''' - The category of the stat (e.g. server, scene)&lt;br /&gt;
* '''container''' - The containing object for this stat.  For example, on scene this is the scene name (e.g. region 1).  For server, this is the component to which the stat relates (e.g. memory, processor).&lt;br /&gt;
* '''name''' - The stat itself.  For example, ClientLogoutsDueToNoReceives or SimFPS.&lt;br /&gt;
&lt;br /&gt;
Full names must be unique.&lt;br /&gt;
&lt;br /&gt;
=Operations=&lt;br /&gt;
== Creating a stat ==&lt;br /&gt;
A statistic is represented by an instance of the OpenSim.Framework.Monitoring.Stat class or one of its descendant classes.  Here's an example that creates a stat for recording all the HTTP requests served by the webserver embedded in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
m_requestsProcessedStat &lt;br /&gt;
    = new Stat(&lt;br /&gt;
        &amp;quot;HTTPRequestsServed&amp;quot;,&lt;br /&gt;
        &amp;quot;Number of inbound HTTP requests processed&amp;quot;,&lt;br /&gt;
        &amp;quot;The number of inbound HTTP requests processed by the builtin HTTP server.&amp;quot;,&lt;br /&gt;
        &amp;quot;requests&amp;quot;,&lt;br /&gt;
        &amp;quot;httpserver&amp;quot;,&lt;br /&gt;
        Port.ToString(),&lt;br /&gt;
        StatType.Pull,&lt;br /&gt;
        MeasuresOfInterest.AverageChangeOverTime,&lt;br /&gt;
        stat =&amp;gt; stat.Value = RequestNumber,&lt;br /&gt;
        StatVerbosity.Debug);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This breaks down as follows&lt;br /&gt;
&lt;br /&gt;
* '''HTTPRequestsServed''' - The short name of this stat.  This is the name used when the stat is displayed or recorded.&lt;br /&gt;
* '''Number of inbound HTTP requests processed''' - The full name of this stat.&lt;br /&gt;
* '''The number of inbound HTTP requests processed by the builtin HTTP server.''' - A description of this stat.&lt;br /&gt;
* '''requests''' - The unit name for this stat.&lt;br /&gt;
* '''httpserver''' - The category for this stat.&lt;br /&gt;
* '''container''' - The container for this stat within the category.  In this case, we use the port number as the &amp;quot;container&amp;quot; since this distinguishes this data from similar stats on other ports.  Another example of a distinguishing container is the region name.&lt;br /&gt;
* '''StatType.Pull''' - The statistic type.  This is either Pull or Push.  If Pull, then when a stat is required (e.g. if the user requests the information or it needs to be recorded), then it is gathered by the given pullAction (of which more below).  If a statistic if push, then the pull action is null (or will be ignored) and the code registering the stat is responsible for updating the value directly on an ongoing basis.&lt;br /&gt;
* '''MeasuresOfInterest.AverageChangeOverTime''' - This can be None or ChangeOverTime.  If None, then only the raw stat is recorded.  If ChangeOverTime, then StatsManager also derives the moving average over the last 24 samples.&lt;br /&gt;
* '''stat =&amp;gt; stat.Value = RequestNumber''' - This is the anonymous function used to generate the stat on a pull request.  In this case, the RequestNumber within the HTTP management code is inserted into the stat value.&lt;br /&gt;
* '''StatVerbosity.Debug''' - StatVerbosity can be Debug or Info.  Info should be used for stats that the user will always be interested in seeing (e.g. number of users on a region) and Debug for debugging stats (such as HTTP requests served).  However, right now stat display is not filtered on verbosity.&lt;br /&gt;
&lt;br /&gt;
== Registering a stat==&lt;br /&gt;
A created stat must then be registered with the StatsManager.  In the case of our example above, this is done as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.RegisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Deregistering a stat==&lt;br /&gt;
If your code is never disabled during runtime then you don't need to worry about deregistering the stat.  However, if it can be removed (e.g. because it is in a region module) then you can deregister a stat as follows.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
StatsManager.DeregisterStat(m_requestsProcessedStat);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/PhysicsEngines</id>
		<title>PhysicsEngines</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/PhysicsEngines"/>
				<updated>2014-06-08T17:57:09Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Added note that BulletSim is now the default physics engine&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
== Introduction ==&lt;br /&gt;
'''Note: Much of this page was written in November 2009.  The OpenDynamicsEngine OpenSimulator plugin is not currently under any significant active development as the [[BulletSim]] physics plugin will likely become the default in the next release of OpenSimulator.  However, as of OpenSimulator 0.7.6, [[BulletSim]] is still considered experimental.''' -- [[User:Justincc|Justincc]] 20:45, 19 November 2013 (UTC)&lt;br /&gt;
&lt;br /&gt;
'''Note: [[BulletSim]] has become the default. Refer to the [[BulletSim]] pages for setup and operation''' -- [[User:Misterblue|Misterblue]] 17:54, 06 June 2014 (UTC)&lt;br /&gt;
&lt;br /&gt;
The physics engines currently available for use in OpenSimulator are &amp;quot;basicphysics&amp;quot;, &amp;quot;POS&amp;quot; and &amp;quot;OpenDynamicsEngine&amp;quot;. As of OpenSimulator 0.6.9, the plugin &amp;quot;OpenDynamicsEngine&amp;quot; is the default and can be seen in the &amp;lt;tt&amp;gt;OpenSim.ini&amp;lt;/tt&amp;gt; file. &lt;br /&gt;
&lt;br /&gt;
ODE has received the bulk of testing. As of 2010 it supports collisions with all prims (cubes, spheres, cylinders etc) with any combination of distortions including hollow, taper, twist, path cut etc. In combination with Meshmerizer it also supports correctly colliding with sculpted prims.&lt;br /&gt;
&lt;br /&gt;
== ODE Plugin ==&lt;br /&gt;
'''In Linux you should consider using included shell script, &amp;lt;tt&amp;gt;opensim-ode.sh&amp;lt;/tt&amp;gt; or type &amp;lt;tt&amp;gt;ulimit -s 262144&amp;lt;/tt&amp;gt; before running mono OpenSim.exe if you plan on having a large number of physics objects (each avatar is a physics object, as well as those which have the physics flag set on the simulator). The ulimit -s 262144 in Linux protects you against stack collisions and corrupted memory when there are a large amount of physical objects roaming around.'''&lt;br /&gt;
&lt;br /&gt;
Currently, the ODE Plugin suports collisions Av2Av, Av2Prim and Prim2Prim. Avies and (active)physical prim movement supported. &lt;br /&gt;
&lt;br /&gt;
The currently collision behavior is:&lt;br /&gt;
* For avies, a capsule of .2m of radius and a length based on the avatar height and 80Kg of mass&lt;br /&gt;
* For prims, like a Box or Sphere with a mass of a Box of = 0.5Kg/l = 0.5Kg/dm3 = 500Kg/m3.&lt;br /&gt;
&lt;br /&gt;
* Prim are separated into ~30m space islands with their own bounding box to speed 'near' calculation.&lt;br /&gt;
&lt;br /&gt;
* friction is reduced on avatar to object/ground collisions when the avatar is moving&lt;br /&gt;
&lt;br /&gt;
=== To-do list (next changes) ===&lt;br /&gt;
* This plugin is not currently under active development.  However, patches which implement extra functionality without any danger of regressions are still welcome.&lt;br /&gt;
&lt;br /&gt;
=== Known bugs ===&lt;br /&gt;
* Vehicle support is incomplete.&lt;br /&gt;
&lt;br /&gt;
=== Recent changes ===&lt;br /&gt;
&lt;br /&gt;
=== Compiling from source ===&lt;br /&gt;
&lt;br /&gt;
OpenSimulator currently bundles r1755 of ODE (a revision post 0.11.1). The code is in the [[Opensim-libs git repository]], in the trunk/unmanaged/OpenDynamicsEngine-r1755/ directory. This directory has a few patches applied to ODE specifically for OpenSimulator (&amp;quot;git log&amp;quot; to see information about these). It also has instructions on how to build the code and install for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==== Old compile instructions ====&lt;br /&gt;
&lt;br /&gt;
(Kept for now for comparison and historical purposes).&lt;br /&gt;
&lt;br /&gt;
===== Linux =====&lt;br /&gt;
&lt;br /&gt;
Ensure that the file ../ou/bootstrap is executable and then bootstrap the build process as follows:&lt;br /&gt;
&lt;br /&gt;
It might be necessary to make the bootstrap file executable(if it is not) with this optional next step:&lt;br /&gt;
&lt;br /&gt;
 $ cd ou&lt;br /&gt;
 $ chmod +x bootstrap&lt;br /&gt;
&lt;br /&gt;
Now get ready and run autogen&lt;br /&gt;
&lt;br /&gt;
 $ sh autogen.sh&lt;br /&gt;
&lt;br /&gt;
and compile it as shown below. Depending on how permissions are setup, you may need to sudo for the make install step:&lt;br /&gt;
&lt;br /&gt;
 ./configure --enable-shared --disable-demos --disable-asserts&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
 cp /usr/local/lib/libode.so /my/opensim/production/dir&lt;br /&gt;
&lt;br /&gt;
If you run into issues after doing this try the debug library by using the following line;&lt;br /&gt;
&lt;br /&gt;
 ./configure --enable-shared --disable-demos&lt;br /&gt;
&lt;br /&gt;
(I used to suggest --with-trimesh=gimpact, but no longer. As of ODE 0.9, Opcode is the preferred and best-supported collision library)&lt;br /&gt;
&lt;br /&gt;
This should create a &amp;lt;tt&amp;gt;libode.a&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lidode.so&amp;lt;/tt&amp;gt; file in the &amp;lt;tt&amp;gt;src/ode&amp;lt;/tt&amp;gt; subdirectory. Copy these two files to the opensim &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; directory (after having backed up the original files there). [er, I don't think the .a file is necessary to put in bin!]&lt;br /&gt;
&lt;br /&gt;
Try to play a bit with the avatar-settings in OpenSim.ini, if the avatar has it's feet stick in the terrain or if the basic-position is crouching.&lt;br /&gt;
These settings seem to work on Linux64: (Note that these are old settings and may not work with the latest OpenSimulator versions)&lt;br /&gt;
 av_capsule_radius = 0.68&lt;br /&gt;
 av_capsule_standup_tensor_linux = 1900000&lt;br /&gt;
 av_density = 90&lt;br /&gt;
&lt;br /&gt;
===== Mac OS X =====&lt;br /&gt;
&lt;br /&gt;
You can use essentially the same build process on OS X as on Linux,&lt;br /&gt;
but there are a couple of minor differences.&lt;br /&gt;
&lt;br /&gt;
First, the &amp;lt;tt&amp;gt;autogen.sh&amp;lt;/tt&amp;gt; script tries to automatically determine&lt;br /&gt;
the name of the libtoolize binary (which is named glibtoolize on OS&lt;br /&gt;
X). To do this, it uses the &amp;lt;tt&amp;gt;which&amp;lt;/tt&amp;gt; command under bash, but&lt;br /&gt;
the error code returned by &amp;lt;tt&amp;gt;which&amp;lt;/tt&amp;gt; is always 0 in bash. If you&lt;br /&gt;
see an error message like this:&lt;br /&gt;
&lt;br /&gt;
 autogen.sh: line 44: no: command not found&lt;br /&gt;
&lt;br /&gt;
then open autogen.sh in a text editor and change the first&lt;br /&gt;
&amp;lt;pre&amp;gt;LIBTOOLIZE=`which libtoolize`&amp;lt;/pre&amp;gt; to &amp;lt;pre&amp;gt;LIBTOOLIZE=`which glibtoolize`&amp;lt;/pre&amp;gt;&lt;br /&gt;
and re-run it.&lt;br /&gt;
&lt;br /&gt;
Also, you must have automake 1.10 or later. You can check your&lt;br /&gt;
current version with:&lt;br /&gt;
&lt;br /&gt;
 automake --version&lt;br /&gt;
&lt;br /&gt;
You can get version 1.10 from [http://www.macports.org/ MacPorts] or&lt;br /&gt;
[http://www.finkproject.org/ fink] if yours is older. Be sure to&lt;br /&gt;
place the new binary directories ahead of your system binary&lt;br /&gt;
directories in your PATH. You may have to open a new shell for your&lt;br /&gt;
changes to take effect.&lt;br /&gt;
&lt;br /&gt;
Then you can follow the Linux instructions to build the library. When it has built, copy the &amp;lt;tt&amp;gt;ode/src/.libs/libode.dylib&amp;lt;/tt&amp;gt; file to the OpenSimulator &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
===== Windows =====&lt;br /&gt;
&lt;br /&gt;
The standard distribution has a build directory, in which you will find subdirs for several Microsoft compilers. &lt;br /&gt;
&lt;br /&gt;
The standard .sln files (at least for VS2005) compile ode.dll such that it depends on at least two Microsoft runtime dll's. This can cause failure and confusion, so do the following:&lt;br /&gt;
Right-click on ode in Solution Explorer, and select properties.&lt;br /&gt;
under Configuration Properties/General, change &amp;quot;Use of MFC&amp;quot; to read &amp;quot;Use MFC in a Static Library&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Under Configuration Properties/Linker/System. Change Stack Reserve Size to 262144000. Click the OK button then compile as usual.&lt;br /&gt;
&lt;br /&gt;
== POS Plugin ==&lt;br /&gt;
POS is Physics Of Simplicity. It is BasicPhysics with collisions.&lt;br /&gt;
&lt;br /&gt;
I took out my old wiki stuff because it was just plain wrong. The algorithm which is implemented in POS does ''not'' model the avatar as a sphere; rather, it models it as a rectilinear solid, same as the prims. However, collision detection is always done in the rotational frame of the prim, so depending on which prim you check against, the avatar is actually oriented differently.&lt;br /&gt;
&lt;br /&gt;
=== To-do list (next changes) ===&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
=== Known bugs ===&lt;br /&gt;
* TODO&lt;br /&gt;
&lt;br /&gt;
== Old plugins ==&lt;br /&gt;
&lt;br /&gt;
These are plugins that are no longer maintained and have been removed from OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
=== BulletX Plugin in OpenSim: Modified BulletX ===&lt;br /&gt;
As of 2007 Bullet supported box-shaped prims and appears stable; there had been little testing, and it is known to have issues with friction (you skate around on non-level surfaces)&lt;br /&gt;
&lt;br /&gt;
BulletX Plugin in OpenSimulator runs the modified version of BulletX. The original version of BulletX runs under and has code-dependencies with MS.XNA. The orginal BulletX can be found at [http://www.codeplex.com/xnadevru XNADev.ru]. The modified version removes all code dependencies with MS.XNA. On the other hand, it needs another library to work. This library is based on Mono.Xna and it's called MonoCompactMaths. The modified BulletX and the MonoXnaCompactMaths can be found on the svn of OpenSimulator. Because its code independency of MS.XNA, the modified BulletX should can be run under either MS.Net or Mono and, therefore, either Windows or Linux (obviously you can combine Windows + Mono)&lt;br /&gt;
&lt;br /&gt;
Currently, BulletX Plugin suports collisions Av2Av, Av2Prim and Prim2Prim. Prims and avies movement supported. By the way, collisions needs tunning. The currently collision's behavoir are:&lt;br /&gt;
* For avies, like and sphere of 1m of radious and 50Kg of mass&lt;br /&gt;
* For prims, like a Box of the prim-size and a mass that it depends of its sizes. The mass it's the mass of Box of water with density = 1Kg/l = 1Kg/dm3 = 1000Kg/m3 (Be water my friend! :D).&lt;br /&gt;
&lt;br /&gt;
==== To-do list (next changes) ====&lt;br /&gt;
* Tune collision&lt;br /&gt;
* Introduce Prim Shape Type to have more than the box shape.&lt;br /&gt;
* More than 1 region in a Sim and then more than 1 sim (grid)&lt;br /&gt;
* Fix bugs&lt;br /&gt;
&lt;br /&gt;
==== Known bugs ====&lt;br /&gt;
* Icy bug: ''an avatar acts like it is on ice and tends to drift off the edge of the sim after a while''&lt;br /&gt;
* Crash on BulletX. You will find the next message in console sometimes: ''Overflow in AABB, object removed from simulation If you can reproduce this, please email bugs@continuousphysics.com Please include above information, your Platform, version of OS. Thanks.''&lt;br /&gt;
* &amp;lt;del&amp;gt;Rotation doesn't seem to work&amp;lt;/del&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Physics Testing Videos ==&lt;br /&gt;
&lt;br /&gt;
=== ODE ===&lt;br /&gt;
* ODE 25 Physical Spheres on Windows Server 2008 Dual Pentium 3 1000mhz with 1 gb of ram. [01/24/2008 rev.3170]&lt;br /&gt;
  QuickTime &amp;gt; http://www.nebadonizumi.com/vid/opensim/windows2008_ODE_2.mov&lt;br /&gt;
  YouTube &amp;gt; http://www.youtube.com/watch?v=DGyhne2llRI&lt;br /&gt;
* 360 Physical Prims (Sim Crashes) [11/08/2007 rev.2308]&amp;lt;br /&amp;gt;&lt;br /&gt;
  QuickTime &amp;gt; http://www.nebadonizumi.com/vid/opensim/opensim_ODE_physics_test_01.mov&lt;br /&gt;
  Stage6 &amp;gt; http://stage6.divx.com/user/3dlibre/video/1847652/&lt;br /&gt;
  YouTube &amp;gt; http://www.youtube.com/watch?v=Y0olsWlTc0A&lt;br /&gt;
* 180 Physical Prims (Sim Does Not Crash) [11/08/2007 rev.2308]&amp;lt;br /&amp;gt;&lt;br /&gt;
  QuickTime &amp;gt; http://www.nebadonizumi.com/vid/opensim/opensim_ODE_physics_test_02.mov&lt;br /&gt;
  Stage6 &amp;gt; http://stage6.divx.com/user/3dlibre/video/1847715/&lt;br /&gt;
  YouTube &amp;gt; http://www.youtube.com/watch?v=9lR_2H7VODU&lt;br /&gt;
* 90 Physical Prims (Sim Does Not Crash) [11/08/2007 rev.2308]&amp;lt;br /&amp;gt;&lt;br /&gt;
  Quicktime &amp;gt; http://www.nebadonizumi.com/vid/opensim/opensim_ODE_physics_test_03.mov&lt;br /&gt;
  Stage6 &amp;gt; http://stage6.divx.com/user/3dlibre/video/1847731/&lt;br /&gt;
  YouTube &amp;gt; http://www.youtube.com/watch?v=t9ulYO8I26Q&lt;br /&gt;
&lt;br /&gt;
=== BulletX ===&lt;br /&gt;
* 360 Physical Prims (Sim Crashes) [11/08/2007 rev.2308]&amp;lt;br /&amp;gt;&lt;br /&gt;
  QuickTime &amp;gt; http://www.nebadonizumi.com/vid/opensim/opensim_BulletX_physics_test_01.mov&lt;br /&gt;
  Stage6 &amp;gt; http://stage6.divx.com/user/3dlibre/video/1847745/&lt;br /&gt;
* 180 Physical Prims (Sim Crashes) [11/08/2007 rev.2308]&amp;lt;br /&amp;gt;&lt;br /&gt;
  QuickTime &amp;gt; http://www.nebadonizumi.com/vid/opensim/opensim_BulletX_physics_test_02.mov&lt;br /&gt;
* 90 Physical Prims (Sim Crashes) [11/08/2007 rev.2308]&amp;lt;br /&amp;gt;&lt;br /&gt;
  QuickTime &amp;gt; http://www.nebadonizumi.com/vid/opensim/opensim_BulletX_physics_test_03.mov&lt;br /&gt;
&lt;br /&gt;
=== Second Life Havok 1 ===&lt;br /&gt;
* 360 Physical Prims [11/08/2007]&amp;lt;br /&amp;gt;&lt;br /&gt;
  http://www.nebadonizumi.com/vid/opensim/SecondLife_physics_test_01.mov&lt;br /&gt;
&lt;br /&gt;
=== Second Life Havok 4 ===&lt;br /&gt;
* 360 Physical Prims [11/08/2007]&amp;lt;br /&amp;gt;&lt;br /&gt;
  http://www.nebadonizumi.com/vid/opensim/SecondLifeBetaHavok_physics_test_01.mov&lt;br /&gt;
* 1000 Physical Prims [11/09/2007]&amp;lt;br /&amp;gt;&lt;br /&gt;
  http://www.nebadonizumi.com/vid/opensim/SecondLifeBetaHavok_physics_test_02.mov&lt;br /&gt;
* 1000 Physical Prims [11/09/2007]&amp;lt;br /&amp;gt;&lt;br /&gt;
  http://www.nebadonizumi.com/vid/opensim/SecondLifeBetaHavok_physics_test_03.mov&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2014-06-08T17:50:13Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Update 'todo' list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{MainPageQuicklinks}}&lt;br /&gt;
&lt;br /&gt;
'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
This is different from the older [[Megaregions]] large region feature which does not require extra viewer support (above that already implemented by Linden Lab) but which relies on a number of fragile hacks to make a viewer work in a way that Linden Lab never supported.  Megaregions also contain a number of extant simulator-side bugs.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256 and less than or equal to 8192.&lt;br /&gt;
* The dimensions must be square (as of 20131104)&lt;br /&gt;
* Adjacent regions must be the same size. For instance, you can have multiple 512x512 regions adjacent (and see into the other region and border cross). There seems to be a viewer problem where, if regions of different size are within view distance, crashes can happen. Consider having regions of only the same size 'in view'. Remember that the region coordinates are specified in 256m region count so a group of four 512x512 regions would be specified at 8000/8000, 8000/8002, 8002/8000, and 8002/8002, for instance.&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. As of 20140128, BulletSim has been modified to force heightmap terrain implementation if region size is greater than 256 on any side. The setting can be forced by adding to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Because there is a lot of terrain in a varregion, it can take a while for  the terrain to load into the viewer. You should set the following parameter so terrain is only loaded within an avatar's view distance and so the terrain is loaded from the avatar's position outward (rather than the 'lawn mower' pattern from the outside of the region:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Terrain]&lt;br /&gt;
    SendTerrainUpdatesByViewDistance = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
For llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 512.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
The usual terrain console commands work with varregions. If you have set up a larger region, you can load BMP/RAW/PNG heightmap files of the dimensions of the region and fill the whole region. For instance, a 1024x1024 region terrain would be completely initialized by &amp;quot;terrain load 1024.bmp&amp;quot; if '1024.bmp is a 1024x1024 bitmap.&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
The objects and terrain are stored in an OAR file as if it was one region. That is, if you save a 1024x1024 region in an OAR file, you can later restore the objects and terrain into a 1024x1024 sized region. If you load an OAR file from a smaller region into a larger region, the unspecified terrain space will default to 25m.&lt;br /&gt;
&lt;br /&gt;
To make conversion to varregions easier, [[Load_Oar|load oar]] now has a '--displacement &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;' parameter. This displaces all of the objects and the terrain from the oar file when loading them into the new region.  For instance, say you have four OAR files from four adjacent 256x256 regions (oar00.oar, oar01.oar, oar10.oar, and oar11.oar). You create a new 512x512 varregion named 'bigregion'. The following commands place the four regions of objects, terrains and parcels&lt;br /&gt;
into the new larger region:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
change region bigregion&lt;br /&gt;
load oar oar00.oar&lt;br /&gt;
load oar oar01.oar --displacement &amp;quot;&amp;lt;0,256,0&amp;gt;&amp;quot; --merge --force-terrain --force-parcel&lt;br /&gt;
load oar oar10.oar --displacement &amp;quot;&amp;lt;256,0,0&amp;gt;&amp;quot; --merge --force-terrain --force-parcel&lt;br /&gt;
load oar oar11.oar --displacement &amp;quot;&amp;lt;256,256,0&amp;gt;&amp;quot; --merge --force-terrain --force-parcel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the new &amp;quot;--force-terrain&amp;quot; and &amp;quot;--force-parcel&amp;quot; parameters. &amp;quot;--merge&amp;quot;, used by itself, is for merging together the objects from multiple OARs. Merging also suppresses the loading of terrain and parcel data which is just what you want when merging objects. But, if loading multiple OARs to create a new, larger region, the terrain and parcel information  must be loaded. Thus the new parameters.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* There is some problem with teleporting in an out of larger region. It works for some configurations and not others.&lt;br /&gt;
* While adjacent regions are usually viewable, sometimes they are not. They appear when you cross over into the region.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
As of January 27, 2014, varregion is a feature of the 'master' repository branch.&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations (mostly done)&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
**	New overlay types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
** consider creating structures for world and region coordinates so there can be compile time checking&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2014-06-08T17:38:26Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Add note about setting SendTerrainUpdatesByViewDistance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{MainPageQuicklinks}}&lt;br /&gt;
&lt;br /&gt;
'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
This is different from the older [[Megaregions]] large region feature which does not require extra viewer support (above that already implemented by Linden Lab) but which relies on a number of fragile hacks to make a viewer work in a way that Linden Lab never supported.  Megaregions also contain a number of extant simulator-side bugs.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256 and less than or equal to 8192.&lt;br /&gt;
* The dimensions must be square (as of 20131104)&lt;br /&gt;
* Adjacent regions must be the same size. For instance, you can have multiple 512x512 regions adjacent (and see into the other region and border cross). There seems to be a viewer problem where, if regions of different size are within view distance, crashes can happen. Consider having regions of only the same size 'in view'. Remember that the region coordinates are specified in 256m region count so a group of four 512x512 regions would be specified at 8000/8000, 8000/8002, 8002/8000, and 8002/8002, for instance.&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. As of 20140128, BulletSim has been modified to force heightmap terrain implementation if region size is greater than 256 on any side. The setting can be forced by adding to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** Because there is a lot of terrain in a varregion, it can take a while for  the terrain to load into the viewer. You should set the following parameter so terrain is only loaded within an avatar's view distance and so the terrain is loaded from the avatar's position outward (rather than the 'lawn mower' pattern from the outside of the region:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Terrain]&lt;br /&gt;
    SendTerrainUpdatesByViewDistance = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
For llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 512.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
The usual terrain console commands work with varregions. If you have set up a larger region, you can load BMP/RAW/PNG heightmap files of the dimensions of the region and fill the whole region. For instance, a 1024x1024 region terrain would be completely initialized by &amp;quot;terrain load 1024.bmp&amp;quot; if '1024.bmp is a 1024x1024 bitmap.&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
The objects and terrain are stored in an OAR file as if it was one region. That is, if you save a 1024x1024 region in an OAR file, you can later restore the objects and terrain into a 1024x1024 sized region. If you load an OAR file from a smaller region into a larger region, the unspecified terrain space will default to 25m.&lt;br /&gt;
&lt;br /&gt;
To make conversion to varregions easier, 'load oar' now has a '--displacement &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;' parameter. This displaces all of the objects and the terrain from the oar file when loading them into the new region.  For instance, say you have four&lt;br /&gt;
OAR files from four adjacent 256x256 regions (oar00.oar, oar01.oar, oar10.oar, and oar11.oar). You create a new 512x512 varregion named 'bigregion'. The following commands place the four regions of objects, terrains and parcels&lt;br /&gt;
into the new larger region:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
change region bigregion&lt;br /&gt;
load oar oar00.oar&lt;br /&gt;
load oar oar01.oar --displacement &amp;quot;&amp;lt;0,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel&lt;br /&gt;
load oar oar10.oar --displacement &amp;quot;&amp;lt;256,0,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel&lt;br /&gt;
load oar oar11.oar --displacement &amp;quot;&amp;lt;256,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the new &amp;quot;--forceterrain&amp;quot; and &amp;quot;--forceparcel&amp;quot; parameters. &amp;quot;--merge&amp;quot;, used by itself, is for merging together the objects from multiple OARs. Merging also suppresses the loading of terrain and parcel data which is just what you want when merging objects. But, if loading multiple OARs to create a new, larger region, the terrain and parcel information  must be loaded. Thus the new parameters.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* There is some problem with teleporting in an out of larger region. It works for some configurations and not others.&lt;br /&gt;
* While adjacent regions are usually viewable, sometimes they are not. They appear when you cross over into the region.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
As of January 27, 2014, varregion is a feature of the 'master' repository branch.&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region. (mostly done)&lt;br /&gt;
* ITerrainLoader implementations (mostly done)&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide if to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use in ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
* Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New overlay types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
** consider creating structures for world and region coordinates so there can be compile time checking&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;br /&gt;
&lt;br /&gt;
==Tips on Migrating Existing Sims to VarRegions==&lt;br /&gt;
* When you start the sim, you have to have either no regions nearby, or identical sized regions. otherwise, it locks your movement to the size of the smallest region&lt;br /&gt;
* When you load your oars, it's like Aurora sim.  You need to load them by displacement first, load each one in place to get the terrains.&lt;br /&gt;
* When you merge, you lose the terrain.&lt;br /&gt;
* The second round, you reload each oar, this time with merge to load the objects.&lt;br /&gt;
* If you don't use merge, you lose all the objects with each oar load.&lt;br /&gt;
* When you load your oars, in format &amp;quot;&amp;lt;0,0,0&amp;gt;&amp;quot; the first number is east/west, or x, the second number is north/south, or y, and the third number is up or down, or z.&lt;br /&gt;
* The location must be in increments of 256.&lt;br /&gt;
* Using ROBUST for xbakes takes a significant load off the server; textures load quickly&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Load_Oar</id>
		<title>Load Oar</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Load_Oar"/>
				<updated>2014-06-08T17:19:15Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Added examples of using 'load oar'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
= Load Oar Console Command =&lt;br /&gt;
Once you have saved regions in OAR files, the 'load oar' console command will load the OAR file into the current region. There are many parameters that enable replacing the region's current contents or merging the OAR file's contents with the objects and terrain already in the region.&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
The load oar command has the format:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tt&amp;gt;load oar [parameters] OARFILE&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;quot;OARFILE&amp;quot; is the path to the OAR file to read in, and &amp;quot;[parameters]&amp;quot; is zero or more optional parameters from the following list:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 10em&amp;quot; | Parameter&lt;br /&gt;
! Since&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| --merge&lt;br /&gt;
| 0.6.8&lt;br /&gt;
| Specify to merge the contents of the reading OAR with the existing contents in the region.&lt;br /&gt;
|-&lt;br /&gt;
| --skip-assets&lt;br /&gt;
| 0.6.9&lt;br /&gt;
| If set, this will not load any of the assets from the OAR, though all other data will be loaded. This saves a lot of time and database operations if loading an OAR multiple times on a grid -- specify &amp;lt;tt&amp;gt;--skip-assets&amp;lt;/tt&amp;gt; after the first time the OAR is loaded on a grid as the assets would have already been loaded the first time the OAR files was loaded.&lt;br /&gt;
|-&lt;br /&gt;
| --displacement&lt;br /&gt;
| dev&lt;br /&gt;
| Specify a displacement that is added to all objects in the OAR file as they are added to the region. The displacement MUST be specified as &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;. So, for instance, to load an OAR from a 256x256 region into the middle of a larger 512x512 region, the parameter would be &amp;lt;tt&amp;gt;--displacement &amp;quot;&amp;lt;128,128,0&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;. Note that you can specify a &amp;quot;Z&amp;quot; displacement which will move the objects up or down. Thus &amp;lt;tt&amp;gt;--displacement &amp;quot;&amp;lt;0,0,1000&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt; will put all the OAR's objects up high for a sky box.&lt;br /&gt;
&lt;br /&gt;
The displacement is also applied to the terrain if it is included. The 'z' component is added to the terrain's heights.&lt;br /&gt;
|-&lt;br /&gt;
| --rotation&lt;br /&gt;
| dev&lt;br /&gt;
| The degrees to rotate all the objects loaded from the OAR. &lt;br /&gt;
|-&lt;br /&gt;
| --rotation-center&lt;br /&gt;
| dev&lt;br /&gt;
| The center around which to rotate objects on load.&lt;br /&gt;
|-&lt;br /&gt;
| --no-objects&lt;br /&gt;
| dev&lt;br /&gt;
| Don't load any scene objects.&lt;br /&gt;
|-&lt;br /&gt;
| --force-terrain&lt;br /&gt;
| dev&lt;br /&gt;
| Force terrain loading on --merge.  Normally, --merge does not overwrite the existing region's terrain.&lt;br /&gt;
|-&lt;br /&gt;
| --force-parcels&lt;br /&gt;
| dev&lt;br /&gt;
| Force parcel loading on --merge.  Normally, --merge does not overwrite the existing region's parcel data.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes On Regions of Different Sizes ==&lt;br /&gt;
With the addition of [[VarRegions]] there is the possibility of loading OARs to and from regions of different sizes. In general, loading an OAR from a smaller region into a larger region will do what you expect. Trying to load a larger region into a smaller region will generate many errors although, if you have adjacent smaller regions, some of the objects will be loaded into the adjacent regions. Try at your own risk.&lt;br /&gt;
&lt;br /&gt;
= Example Uses =&lt;br /&gt;
&lt;br /&gt;
== Replacing a region's contents with what's in an OAR file ==&lt;br /&gt;
Replacing a region with an OAR file for a region of the same size is as simple as:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tt&amp;gt;load oar NewRegion.oar&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Merging together four region's worth of contents ==&lt;br /&gt;
Say you have four adjacent 256x256 region ('Region00.oar', 'Region01.oar', ...) and you want to load them into a new 512x512 [[VarRegion]] ('BiggerRegion'). The commands would be:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tt&amp;gt;change region BiggerRegion&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &amp;lt;tt&amp;gt;load oar Region0.oar&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &amp;lt;tt&amp;gt;load oar --merge --force-terrain --displacement &amp;lt;0,256,0&amp;gt; Region01.oar&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &amp;lt;tt&amp;gt;load oar --merge --force-terrain --displacement &amp;lt;256,0,0&amp;gt; Region10.oar&amp;lt;/tt&amp;gt;&lt;br /&gt;
 &amp;lt;tt&amp;gt;load oar --merge --force-terrain --displacement &amp;lt;256,256,0&amp;gt; Region11.oar&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Loading a 256x256 region's contents into the middle of a 512x512 sized region ==&lt;br /&gt;
If you have an OAR file for a 256x256 region ('LegacyRegion.oar' for instance) and you want to set it into the middle of a 512x512 region with the loaded region rotated by 30 degrees without messing up the rest of the larger region, the command would be:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;tt&amp;gt;load oar --merge --force-terrain --force-parcels --displacement &amp;lt;128,128,0&amp;gt; --rotation 30.0 --rotation-center &amp;lt;128,128,0&amp;gt; LegacyRegion.oar&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Load_Oar</id>
		<title>Load Oar</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Load_Oar"/>
				<updated>2014-02-03T06:22:50Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Clean up table. Add --no-objects parameter.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
= Load Oar Console Command =&lt;br /&gt;
Once you have saved regions in OAR files, the 'load oar' console command will load the OAR file into the current region. There are many parameters that enable replacing the region's current contents or merging the OAR file's contents with the objects and terrain already in the region.&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
The load oar command has the format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;load oar [parameters] OARFILE&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;quot;OARFILE&amp;quot; is the path to the OAR file to read in, and &amp;quot;[parameters]&amp;quot; is zero or more optional parameters from the following list:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! style=&amp;quot;width: 10em&amp;quot; | Parameter&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| --merge&lt;br /&gt;
| Specify to merge the contents of the reading OAR with the existing contents in the region.&lt;br /&gt;
|-&lt;br /&gt;
| --skip-assets&lt;br /&gt;
| If set, this will not load any of the assets from the OAR, though all other data will be loaded. This saves a lot of time and database operations if loading an OAR multiple times on a grid -- specify &amp;lt;tt&amp;gt;--skip-assets&amp;lt;/tt&amp;gt; after the first time the OAR is loaded on a grid as the assets would have already been loaded the first time the OAR files was loaded.&lt;br /&gt;
|-&lt;br /&gt;
| --displacement&lt;br /&gt;
| Specify a displacement that is added to all objects in the OAR file as they are added to the region. The displacement MUST be specified as &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;. So, for instance, to load an OAR from a 256x256 region into the middle of a larger 512x512 region, the parameter would be &amp;lt;tt&amp;gt;--displacement &amp;quot;&amp;lt;128,128,0&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;. Note that you can specify a &amp;quot;Z&amp;quot; displacement which will move the objects up or down. Thus &amp;lt;tt&amp;gt;--displacement &amp;quot;&amp;lt;0,0,1000&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt; will put all the OAR's objects up high for a sky box.&lt;br /&gt;
&lt;br /&gt;
The displacement is also applied to the terrain if it is included. The 'z' component is added to the terrain's heights.&lt;br /&gt;
|-&lt;br /&gt;
| --rotation&lt;br /&gt;
| The degrees to rotate all the objects loaded from the OAR. &lt;br /&gt;
|-&lt;br /&gt;
| --rotation-center&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --no-objects&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --force-terrain&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --force-parcels&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes On Regions of Different Sizes ==&lt;br /&gt;
&lt;br /&gt;
= Example Uses =&lt;br /&gt;
&lt;br /&gt;
== Replacing a region's contents with what's in an OAR file ==&lt;br /&gt;
&lt;br /&gt;
== Merging together two region's worth of contents ==&lt;br /&gt;
&lt;br /&gt;
== Loading a 256x256 region's contents into the middle of a 512x512 sized region ==&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Load_Oar</id>
		<title>Load Oar</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Load_Oar"/>
				<updated>2014-02-03T03:51:51Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: description of some of the parameters&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
= Load Oar Console Command =&lt;br /&gt;
Once you have saved regions in OAR files, the 'load oar' console command will load the OAR file into the current region. There are many parameters that enable replacing the region's current contents or merging the OAR file's contents with the objects and terrain already in the region.&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
The load oar command has the format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;load oar [parameters] OARFILE&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;quot;OARFILE&amp;quot; is the path to the OAR file to read in, and &amp;quot;[parameters]&amp;quot; is zero or more optional parameters from the following list:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| --merge&lt;br /&gt;
| Specify to merge the contents of the reading OAR with the existing contents in the region.&lt;br /&gt;
|-&lt;br /&gt;
| --skip-assets&lt;br /&gt;
| If set, this will not load any of the assets from the OAR, though all other data will be loaded. This saves a lot of time and database operations if loading an OAR multiple times on a grid -- specify &amp;lt;tt&amp;gt;--skip-assets&amp;lt;/tt&amp;gt; after the first time the OAR is loaded on a grid as the assets would have already been loaded the first time the OAR files was loaded.&lt;br /&gt;
|-&lt;br /&gt;
| --displacement&lt;br /&gt;
| Specify a displacement that is added to all objects in the OAR file as they are added to the region. The displacement MUST be specified as &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;. So, for instance, to load an OAR from a 256x256 region into the middle of a larger 512x512 region, the parameter would be &amp;lt;tt&amp;gt;--displacement &amp;quot;&amp;lt;128,128,0&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt;. Note that you can specify a &amp;quot;Z&amp;quot; displacement which will move the objects up or down. Thus &amp;lt;tt&amp;gt;--displacement &amp;quot;&amp;lt;0,0,1000&amp;gt;&amp;quot;&amp;lt;/tt&amp;gt; will put all the OAR's objects up high for a sky box.&lt;br /&gt;
&lt;br /&gt;
The displacement is also applied to the terrain if it is included. The 'z' component is added to the terrain's heights.&lt;br /&gt;
|-&lt;br /&gt;
| --rotation&lt;br /&gt;
| The degrees to rotate all the objects loaded from the OAR. &lt;br /&gt;
|-&lt;br /&gt;
| --rotation-center&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --force-terrain&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --force-parcels&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes On Regions of Different Sizes ==&lt;br /&gt;
&lt;br /&gt;
= Example Uses =&lt;br /&gt;
&lt;br /&gt;
== Replacing a region's contents with what's in an OAR file ==&lt;br /&gt;
&lt;br /&gt;
== Merging together two region's worth of contents ==&lt;br /&gt;
&lt;br /&gt;
== Loading a 256x256 region's contents into the middle of a 512x512 sized region ==&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Load_Oar</id>
		<title>Load Oar</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Load_Oar"/>
				<updated>2014-02-03T03:06:00Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Initial version of page for 'load oar'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
= Load Oar Console Command =&lt;br /&gt;
Once you have saved regions in OAR files, the 'load oar' console command will load the OAR file into the current region. There are many parameters that enable replacing the region's current contents or merging the OAR file's contents with the objects and terrain already in the region.&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
The load oar command has the format:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;load oar [parameters] OARFILE&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where &amp;quot;OARFILE&amp;quot; is the path to the OAR file to read in, and &amp;quot;[parameters]&amp;quot; is zero or more optional parameters from the following list:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| --merge&lt;br /&gt;
| Specify to merge the contents of the reading OAR with the existing contents in the region.&lt;br /&gt;
|-&lt;br /&gt;
| --skip-assets&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --displacement&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --rotation&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --rotation-center&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --force-terrain&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| --force-parcels&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Notes On Regions of Different Sizes ==&lt;br /&gt;
&lt;br /&gt;
= Example Uses =&lt;br /&gt;
&lt;br /&gt;
== Replacing a region's contents with what's in an OAR file ==&lt;br /&gt;
&lt;br /&gt;
== Merging together two region's worth of contents ==&lt;br /&gt;
&lt;br /&gt;
== Loading a 256x256 region's contents into the middle of a 512x512 sized region ==&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/OpenSim_Archives</id>
		<title>OpenSim Archives</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/OpenSim_Archives"/>
				<updated>2014-02-03T02:51:15Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: add references and links to 'Load Oar' page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
= How do I use the OpenSimulator Archive Function? =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The OpenSimulator Archive (OAR) function has existed since OpenSimulator 0.5.9. The facility does a similar job to load-xml2/save-xml2 in that it saves prims so that they can be later reloaded. However, OpenSimulator archives (OAR) go a step further in that they can save all the necessary asset data so that you may fully restore the terrain, region parcel data, the textures of objects and their inventories when loaded onto a completely different system using a different asset database.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
From the region console, one can type &lt;br /&gt;
&lt;br /&gt;
 save oar [--noassets] [-h|--home=&amp;amp;lt;url&amp;amp;gt;] [--publish] [--perm=&amp;amp;lt;permissions&amp;amp;gt;] [--all] [&amp;amp;lt;filename&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
to save an OpenSimulator archive. If no filename is given, then the name region.oar is used in the current directory. &lt;br /&gt;
&lt;br /&gt;
'''EXAMPLES:'''&lt;br /&gt;
 save oar&lt;br /&gt;
 save oar my.oar&lt;br /&gt;
 save oar c:/mybackups/filename.oar&lt;br /&gt;
 save oar oars/11nov.oar&lt;br /&gt;
&lt;br /&gt;
To load an archive, type &lt;br /&gt;
&lt;br /&gt;
 load oar [--merge] [--skip-assets] [&amp;amp;lt;location&amp;amp;gt;]&lt;br /&gt;
&lt;br /&gt;
at the console. The location can be a filesystem path (as for &amp;quot;save oar&amp;quot;) or an HTTP address to load an oar directly over the web. If no location is given, then the server looks for a file called region.oar in the current directory. See detailed &amp;quot;load oar&amp;quot; documentation at [[Load Oar]].&lt;br /&gt;
&lt;br /&gt;
'''EXAMPLES:'''&lt;br /&gt;
 load oar&lt;br /&gt;
 load oar my.oar&lt;br /&gt;
 load oar my.oar&lt;br /&gt;
 load oar --merge oars/3rd-party.oar&lt;br /&gt;
 load oar http://path.to/oarfile.oar&lt;br /&gt;
&lt;br /&gt;
By default, loading an archive will delete all the existing objects in the regions and replace them with the archive contents. It's like being in the Matrix (when they swap environments), except much slower (all the scene objects are slowly deleted before the new environment is loaded&amp;amp;nbsp;:-) &lt;br /&gt;
&lt;br /&gt;
When an archive is loaded, owners will be restored if the relevant uuids can be found in the OpenSimulator installation's user database. Otherwise, prim ownership will default to the master avatar for the region. &lt;br /&gt;
&lt;br /&gt;
I recommend that you use filenames with the extension '''.oar'''. The filename extension of the download links on this page is '''.tar.gz''' which illustrates that the '''.oar''' format is actually a zipped tar file.&lt;br /&gt;
&lt;br /&gt;
=== Switches ===&lt;br /&gt;
==== Saving ====&lt;br /&gt;
&lt;br /&gt;
===== --publish =====&lt;br /&gt;
&lt;br /&gt;
If set, then objects in the saved oar are stripped of owner and last owner information, though not of creator information.&lt;br /&gt;
&lt;br /&gt;
This is useful if you are publishing OARs (rather than using them for backup) where those OARs might be loaded to the same grid from which you published.&lt;br /&gt;
&lt;br /&gt;
As of OpenSimulator 0.7.4, this switch will also strip ownership information from land parcels.&lt;br /&gt;
&lt;br /&gt;
===== --noassets =====&lt;br /&gt;
&lt;br /&gt;
If the --noassets option is specified then the oar will be saved without assets. This can be handy if you're backing up the asset database separately and don't want the expense of including all the assets in each OAR.&lt;br /&gt;
&lt;br /&gt;
===== --home =====&lt;br /&gt;
&lt;br /&gt;
(formerly known as --profile up to 0.7.3)&lt;br /&gt;
&lt;br /&gt;
If the --home option is specified then all names of creators from this world will be appended with links to their home world. It is not required that the service be operational; the information will be added and it will be available in all worlds that import this OAR.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;url&amp;gt; is the URL of this world's profile service. &lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
  save oar --home=http://mygrid.com my.oar&lt;br /&gt;
&lt;br /&gt;
===== --perm =====&lt;br /&gt;
&lt;br /&gt;
If the --perm option is specified then objects with insufficient permissions will not be saved to the OAR. The user whose permissions are checked is the estate owner. This can be useful for grids that allow their customers to export their regions to OARs, because it ensures that exporting to OAR can't be used to bypass content permissions.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;permissions&amp;gt; specifies which permissions are required. It's a string that contains one or more of these characters:&lt;br /&gt;
* &amp;quot;C&amp;quot; = Copy&lt;br /&gt;
* &amp;quot;T&amp;quot; = Transfer&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
  save oar --perm=CT my.oar&lt;br /&gt;
&lt;br /&gt;
===== --all =====&lt;br /&gt;
&lt;br /&gt;
If the --all option is specified then the OAR will contain all the regions in the simulator. If this option isn't specified (which is the default) then the OAR will contain only the current region.&lt;br /&gt;
&lt;br /&gt;
==== Loading ====&lt;br /&gt;
This is an overview of the most common parameters. There are many more documented at [[Load Oar]].&lt;br /&gt;
&lt;br /&gt;
===== --skip-assets =====&lt;br /&gt;
&lt;br /&gt;
If set, this will not attempt to load any of the assets from the OAR, though all other data will be loaded.  This can be useful if you are loading the OAR back into a grid that you know already contains the assets.&lt;br /&gt;
&lt;br /&gt;
===== --merge =====&lt;br /&gt;
&lt;br /&gt;
If the --merge option is specified then the oar will be merged with the existing region objects rather than replace them. The existing terrain, region settings and parcels will be left in place.&lt;br /&gt;
&lt;br /&gt;
== Multi-Region OARs ==&lt;br /&gt;
&lt;br /&gt;
By default, the save-oar command saves only the current region into the OAR (using OAR Format 0.8). However, if the --all option is specified then all the regions in the simulator are saved into a multi-region OAR file (using OAR Format 1.0). This is useful when saving a build that spans multiple regions.&lt;br /&gt;
&lt;br /&gt;
The load-oar command supports both OAR formats (0.x and 1.x). When it's given a 1.x OAR file it loads all the regions in the OAR into the corresponding regions in the simulator, according to their position relative to the root region. If the simulator doesn't have a region in a location that is present in the OAR then that region isn't loaded.&lt;br /&gt;
&lt;br /&gt;
For historical context, see [[Feature_Proposals/Multi-Region_OARs]] and [http://opensimulator.org/mantis/view.php?id=6105 Mantis 6105]&lt;br /&gt;
&lt;br /&gt;
==== OAR Format Compatibility ====&lt;br /&gt;
&lt;br /&gt;
OAR Format 1.0 isn't backwards-compatible, so it can only be read in OpenSim 0.7.5 and above. However, since most current instances of OpenSim can't read this format, there is a transition period in which OpenSim still saves single-region OARs using OAR Format 0.8. This means that the most common behavior (save-oar for a single region) creates OARs that are readable by all instances of OpenSim. The new OAR Format 1.0 is only used when using the --all option.&lt;br /&gt;
&lt;br /&gt;
== Example OARs ==&lt;br /&gt;
&lt;br /&gt;
[http://www.secondlifelab.it/downloads/cyberlandia.tar.gz cyberlandia.tar.gz] - cyberlandia landscape designed by the architect Simone Riccardi aka turboy. Contemporary architecture surrounded with a natural/synthetic context [http://www.flickr.com/photos/8905571@N05/3182585775/ image_1] [http://www.flickr.com/photos/8905571@N05/3171070049/ image_2] (work under [http://creativecommons.org/licenses/by/3.0/us/ Creative Commons by attribution]).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== OpenVCE 3D Assets OAR ===&lt;br /&gt;
&lt;br /&gt;
The [http://openvce.net OpenVCE.net] virtual worlds assets described at http://openvce.net/vwassets provided by Clever Zebra and the OpenVCE.net team at AIAI in the University of Edinburgh are available as an OAR (Opensim Archive) file.&lt;br /&gt;
&lt;br /&gt;
 http://openvce.net/resources/downloads/&lt;br /&gt;
&lt;br /&gt;
Get file &amp;quot;opensim-openvce.oar&amp;quot; from there (right click on the file in the above directory in your browser, and select download is the easiest way to obtain the materials). A &amp;quot;full&amp;quot; set of the buildings with a large 400 seat amphitheatre intended to be placed on the corner of 4 sims is also available via &amp;quot;opensim-openvce-full.oar&amp;quot;. Images of the buildings in place in Opensim are at:&lt;br /&gt;
[http://openvce.net/resources/downloads/opensim-openvce-1.jpg Image 1],&lt;br /&gt;
[http://openvce.net/resources/downloads/opensim-openvce-2.jpg Image 2]&lt;br /&gt;
&lt;br /&gt;
=== Others ===&lt;br /&gt;
&lt;br /&gt;
Please feel free to place links to other environments here, though unfortunately you'll have to host them on some other site. &lt;br /&gt;
&lt;br /&gt;
[http://www.hypergridbusiness.com/2011/06/where-to-get-content-for-opensim/ Where to get content for OpenSim]&amp;amp;nbsp;-- Hypergrid Business page, regularly updated, containing links to major OAR sites. Also has download links to individual OAR files. &lt;br /&gt;
&lt;br /&gt;
[http://www.lindakellie.com/myoars.htm LindaKellie.com] &lt;br /&gt;
&lt;br /&gt;
[http://opensim-creations.com/category/regions/oars/ OpenSimulator Creations] &lt;br /&gt;
&lt;br /&gt;
[http://www.opensimworlds.com/index.php?part=worlds http://www.opensimworlds.com/index.php?part=worlds]&lt;br /&gt;
&lt;br /&gt;
[http://forums.osgrid.org/viewforum.php?f=20 http://forums.osgrid.org/viewforum.php]&lt;br /&gt;
&lt;br /&gt;
== Further Information ==&lt;br /&gt;
&lt;br /&gt;
* [http://justincc.org/blog/category/oars/ http://justincc.org/blog/category/oars/] - various OAR related articles from justincc, including background information and possible future development.&lt;br /&gt;
&lt;br /&gt;
== Use cases ==&lt;br /&gt;
&lt;br /&gt;
Possible current uses are&lt;br /&gt;
&lt;br /&gt;
1. To migrate data from an SQLite region database to one based on MySQL&lt;br /&gt;
&lt;br /&gt;
2. To distribute entire regions to other people.&lt;br /&gt;
&lt;br /&gt;
== Current limitations ==&lt;br /&gt;
&lt;br /&gt;
* Performance is not very good, especially with large archives. This will be addressed in the future&lt;br /&gt;
* Loading large OARs using the default SQLite database plugin will take a very very long time (in the order of many hours). I highly recommend that you switch to MySQL if you want to load large archives.&lt;br /&gt;
&lt;br /&gt;
== OAR Format ==&lt;br /&gt;
&lt;br /&gt;
The region [[OpenSim Archives|OpenSimulator Archive (OAR)]] format is designed with three aims in mind:&lt;br /&gt;
&lt;br /&gt;
# Make it easy for people to read and change individual objects, assets, etc. within an archive.&lt;br /&gt;
# Make it easy to compose two region archives into a single region archive.&lt;br /&gt;
# Make it easy to compose archives from scratch.&lt;br /&gt;
&lt;br /&gt;
Therefore, all the different entities (assets, objects, terrains, etc.) are packaged in individual files (e.g. one for each asset) with human readable filenames and machine readable extensions (e.g. .jp2 for textures, .txt for notecards).&lt;br /&gt;
&lt;br /&gt;
* [[OAR Format 0.1]]&lt;br /&gt;
* [[OAR Format 0.2]]&lt;br /&gt;
* [[OAR Format 0.6]]&lt;br /&gt;
* [[OAR Format 0.7]]&lt;br /&gt;
* [[OAR Format 0.8]] - the current default OAR save format.&lt;br /&gt;
* [[OAR Format 1.0]]&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
1. What is this .tar.gz format you are using for the internal OAR format? Why not zip?&lt;br /&gt;
&lt;br /&gt;
.tar.gz is a standard unix way of zipping up files into a single larger compressed file for distribution. Windows users should be able to open these files using freeware programs such as [http://www.7-zip.org/ 7-zip]. &lt;br /&gt;
&lt;br /&gt;
I'm using .tar.gz because all the zip (and tar) libraries for .net are licensed either under the GPL (with exception) or under the MSPL. Unfortunately, not all members of the OpenSimulator development team are comfortable with the MSPL, so these libaries are not currently an option. It is also significantly easier to write code to create and read tar archives than zip archives.&lt;br /&gt;
&lt;br /&gt;
Also, if you're only ever loading and saving oars (rather than pulling them apart and putting them back together), then you don't need to worry about the internal format at all :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Can you load and save multiple regions to an archive?&lt;br /&gt;
&lt;br /&gt;
Yes, since OpenSim 0.7.5. See [[OpenSim Archives#Multi-Region OARs]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Can you load and save parts of a region to an archive?&lt;br /&gt;
&lt;br /&gt;
Not yet.&lt;br /&gt;
&lt;br /&gt;
== Bugs ==&lt;br /&gt;
&lt;br /&gt;
* Due to a possible bug in the Mono 1.2.4 libraries, this feature may cause a debug dump when used (the problem appears to be in writing out a compressed stream). Mono 1.2.6 is okay. Since Mono 1.2.4 is fairly old now, this bug will not be addressed.&lt;br /&gt;
&lt;br /&gt;
== Current Status ==&lt;br /&gt;
&lt;br /&gt;
Operational. Bug reports are appreciated [[User:Justincc|Justincc]] 14:53, 14 September 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Though we will strive to maintain compatibilty for old archives with newer OpenSimulator versions, please don't rely on these archives as the only backup for regions.&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
[[Category:Support]]&lt;br /&gt;
[[Category:Tech Reference]]&lt;br /&gt;
[[Category:Help]]&lt;br /&gt;
[[Category:Configuration]]&lt;br /&gt;
[[Category:Getting Started]]&lt;br /&gt;
[[Category:Development]]&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2014-02-02T15:01:20Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Updated confusing restriction on adjacent regions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256 and less than or equal to 8192.&lt;br /&gt;
* The dimensions must be square (as of 20131104)&lt;br /&gt;
* Adjacent regions must be the same size. For instance, you can have multiple 512x512 regions adjacent (and see into the other region and border cross). There seems to be a viewer problem where, if regions of different size are within view distance, crashes can happen. Consider having regions of only the same size 'in view'. Remember that the region coordinates are specified in 256m region count so a group of four 512x512 regions would be specified at 8000/8000, 8000/8002, 8002/8000, and 8002/8002, for instance.&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. As of 20140128, BulletSim has been modified to force heightmap terrain implementation if region size is greater than 256 on any side. The setting can be forced by adding to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
The usual terrain console commands work with varregions. If you have set up a larger region, you can load BMP/RAW/PNG heightmap files of the dimensions of the region and fill the whole region. For instance, a 1024x1024 region terrain would be completely initialized by &amp;quot;terrain load 1024.bmp&amp;quot; if '1024.bmp is a 1024x1024 bitmap.&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
The objects and terrain are stored in an OAR file as if it was one region. That is, if you save a 1024x1024 region in an OAR file, you can later restore the objects and terrain into a 1024x1024 sized region. If you load an OAR file from a smaller region into a larger region, the unspecified terrain space will default to 25m.&lt;br /&gt;
&lt;br /&gt;
To make conversion to varregions easier, 'load oar' now has a '--displacement &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;' parameter. This displaces all of the objects and the terrain from the oar file when loading them into the new region.  For instance, say you have four&lt;br /&gt;
OAR files from four adjacent 256x256 regions (oar00.oar, oar01.oar, oar10.oar, and oar11.oar). You create a new 512x512 varregion named 'bigregion'. The following commands place the four regions of objects, terrains and parcels&lt;br /&gt;
into the new larger region:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
change region bigregion&lt;br /&gt;
load oar oar00.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;0,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar01.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,0,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar10.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar11.oar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the new &amp;quot;--forceterrain&amp;quot; and &amp;quot;--forceparcel&amp;quot; parameters. &amp;quot;--merge&amp;quot;, used by itself, is for merging together the objects from multiple OARs. Merging also suppresses the loading of terrain and parcel data which is just what you want when merging objects. But, if loading multiple OARs to create a new, larger region, the terrain and parcel information  must be loaded. Thus the new parameters.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* There is some problem with teleporting in an out of larger region. It works for some configurations and not others.&lt;br /&gt;
* While adjacent regions are usually viewable, sometimes they are not. They appear when you cross over into the region.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
As of January 27, 2014, varregion is a feature of the 'master' repository branch.&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region. (mostly done)&lt;br /&gt;
* ITerrainLoader implementations (mostly done)&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
* Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New overlay types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
** consider creating structures for world and region coordinates so there can be compile time checking&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2014-01-30T16:42:22Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: /* Restrictions */  comment about BulletSim forcing terrain heightmap implementation for large regions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256 and less than or equal to 8192.&lt;br /&gt;
* The dimensions must be square (as of 20131104)&lt;br /&gt;
* Adjacent regions must be the same size. For instance, you can have multiple 512x512 regions adjacent (and see into the other region and border cross). There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region). Remember that the region coordinates are specified in 256m region count so a group of four 512x512 regions would be specified at 8000/8000, 8000/8002, 8002/8000, and 8002/8002, for instance.&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. As of 20140128, BulletSim has been modified to force heightmap terrain implementation if region size is greater than 256 on any side. The setting can be forced by adding to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
The usual terrain console commands work with varregions. If you have set up a larger region, you can load BMP/RAW/PNG heightmap files of the dimensions of the region and fill the whole region. For instance, a 1024x1024 region terrain would be completely initialized by &amp;quot;terrain load 1024.bmp&amp;quot; if '1024.bmp is a 1024x1024 bitmap.&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
The objects and terrain are stored in an OAR file as if it was one region. That is, if you save a 1024x1024 region in an OAR file, you can later restore the objects and terrain into a 1024x1024 sized region. If you load an OAR file from a smaller region into a larger region, the unspecified terrain space will default to 25m.&lt;br /&gt;
&lt;br /&gt;
To make conversion to varregions easier, 'load oar' now has a '--displacement &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;' parameter. This displaces all of the objects and the terrain from the oar file when loading them into the new region.  For instance, say you have four&lt;br /&gt;
OAR files from four adjacent 256x256 regions (oar00.oar, oar01.oar, oar10.oar, and oar11.oar). You create a new 512x512 varregion named 'bigregion'. The following commands place the four regions of objects, terrains and parcels&lt;br /&gt;
into the new larger region:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
change region bigregion&lt;br /&gt;
load oar oar00.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;0,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar01.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,0,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar10.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar11.oar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the new &amp;quot;--forceterrain&amp;quot; and &amp;quot;--forceparcel&amp;quot; parameters. &amp;quot;--merge&amp;quot;, used by itself, is for merging together the objects from multiple OARs. Merging also suppresses the loading of terrain and parcel data which is just what you want when merging objects. But, if loading multiple OARs to create a new, larger region, the terrain and parcel information  must be loaded. Thus the new parameters.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* There is some problem with teleporting in an out of larger region. It works for some configurations and not others.&lt;br /&gt;
* While adjacent regions are usually viewable, sometimes they are not. They appear when you cross over into the region.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
As of January 27, 2014, varregion is a feature of the 'master' repository branch.&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region. (mostly done)&lt;br /&gt;
* ITerrainLoader implementations (mostly done)&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
* Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New overlay types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
** consider creating structures for world and region coordinates so there can be compile time checking&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2014-01-30T16:39:44Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: /* Implementation Notes */ remove 'branch in the repository' since varregion is now in mastert&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256 and less than or equal to 8192.&lt;br /&gt;
* The dimensions must be square (as of 20131104)&lt;br /&gt;
* Adjacent regions must be the same size. For instance, you can have multiple 512x512 regions adjacent (and see into the other region and border cross). There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region). Remember that the region coordinates are specified in 256m region count so a group of four 512x512 regions would be specified at 8000/8000, 8000/8002, 8002/8000, and 8002/8002, for instance.&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
The usual terrain console commands work with varregions. If you have set up a larger region, you can load BMP/RAW/PNG heightmap files of the dimensions of the region and fill the whole region. For instance, a 1024x1024 region terrain would be completely initialized by &amp;quot;terrain load 1024.bmp&amp;quot; if '1024.bmp is a 1024x1024 bitmap.&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
The objects and terrain are stored in an OAR file as if it was one region. That is, if you save a 1024x1024 region in an OAR file, you can later restore the objects and terrain into a 1024x1024 sized region. If you load an OAR file from a smaller region into a larger region, the unspecified terrain space will default to 25m.&lt;br /&gt;
&lt;br /&gt;
To make conversion to varregions easier, 'load oar' now has a '--displacement &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;' parameter. This displaces all of the objects and the terrain from the oar file when loading them into the new region.  For instance, say you have four&lt;br /&gt;
OAR files from four adjacent 256x256 regions (oar00.oar, oar01.oar, oar10.oar, and oar11.oar). You create a new 512x512 varregion named 'bigregion'. The following commands place the four regions of objects, terrains and parcels&lt;br /&gt;
into the new larger region:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
change region bigregion&lt;br /&gt;
load oar oar00.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;0,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar01.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,0,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar10.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar11.oar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the new &amp;quot;--forceterrain&amp;quot; and &amp;quot;--forceparcel&amp;quot; parameters. &amp;quot;--merge&amp;quot;, used by itself, is for merging together the objects from multiple OARs. Merging also suppresses the loading of terrain and parcel data which is just what you want when merging objects. But, if loading multiple OARs to create a new, larger region, the terrain and parcel information  must be loaded. Thus the new parameters.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* There is some problem with teleporting in an out of larger region. It works for some configurations and not others.&lt;br /&gt;
* While adjacent regions are usually viewable, sometimes they are not. They appear when you cross over into the region.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
As of January 27, 2014, varregion is a feature of the 'master' repository branch.&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region. (mostly done)&lt;br /&gt;
* ITerrainLoader implementations (mostly done)&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
* Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New overlay types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
** consider creating structures for world and region coordinates so there can be compile time checking&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2014-01-27T17:53:40Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: removed map problems from /* Things Known to be Broken */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256 and less than or equal to 8192.&lt;br /&gt;
* The dimensions must be square (as of 20131104)&lt;br /&gt;
* Adjacent regions must be the same size. For instance, you can have multiple 512x512 regions adjacent (and see into the other region and border cross). There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region). Remember that the region coordinates are specified in 256m region count so a group of four 512x512 regions would be specified at 8000/8000, 8000/8002, 8002/8000, and 8002/8002, for instance.&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
The usual terrain console commands work with varregions. If you have set up a larger region, you can load BMP/RAW/PNG heightmap files of the dimensions of the region and fill the whole region. For instance, a 1024x1024 region terrain would be completely initialized by &amp;quot;terrain load 1024.bmp&amp;quot; if '1024.bmp is a 1024x1024 bitmap.&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
The objects and terrain are stored in an OAR file as if it was one region. That is, if you save a 1024x1024 region in an OAR file, you can later restore the objects and terrain into a 1024x1024 sized region. If you load an OAR file from a smaller region into a larger region, the unspecified terrain space will default to 25m.&lt;br /&gt;
&lt;br /&gt;
To make conversion to varregions easier, 'load oar' now has a '--displacement &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;' parameter. This displaces all of the objects and the terrain from the oar file when loading them into the new region.  For instance, say you have four&lt;br /&gt;
OAR files from four adjacent 256x256 regions (oar00.oar, oar01.oar, oar10.oar, and oar11.oar). You create a new 512x512 varregion named 'bigregion'. The following commands place the four regions of objects, terrains and parcels&lt;br /&gt;
into the new larger region:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
change region bigregion&lt;br /&gt;
load oar oar00.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;0,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar01.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,0,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar10.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar11.oar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the new &amp;quot;--forceterrain&amp;quot; and &amp;quot;--forceparcel&amp;quot; parameters. &amp;quot;--merge&amp;quot;, used by itself, is for merging together the objects from multiple OARs. Merging also suppresses the loading of terrain and parcel data which is just what you want when merging objects. But, if loading multiple OARs to create a new, larger region, the terrain and parcel information  must be loaded. Thus the new parameters.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* There is some problem with teleporting in an out of larger region. It works for some configurations and not others.&lt;br /&gt;
* While adjacent regions are usually viewable, sometimes they are not. They appear when you cross over into the region.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of January 17, 2014, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region. (mostly done)&lt;br /&gt;
* ITerrainLoader implementations (mostly done)&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
* Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New overlay types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
** consider creating structures for world and region coordinates so there can be compile time checking&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2014-01-20T05:11:56Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Updated OAR section. Updated list of TODO and 'Known Not To Work'&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256 and less than or equal to 8192.&lt;br /&gt;
* The dimensions must be square (as of 20131104)&lt;br /&gt;
* Adjacent regions must be the same size. For instance, you can have multiple 512x512 regions adjacent (and see into the other region and border cross). There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region). Remember that the region coordinates are specified in 256m region count so a group of four 512x512 regions would be specified at 8000/8000, 8000/8002, 8002/8000, and 8002/8002, for instance.&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
The usual terrain console commands work with varregions. If you have set up a larger region, you can load BMP/RAW/PNG heightmap files of the dimensions of the region and fill the whole region. For instance, a 1024x1024 region terrain would be completely initialized by &amp;quot;terrain load 1024.bmp&amp;quot; if '1024.bmp is a 1024x1024 bitmap.&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
The objects and terrain are stored in an OAR file as if it was one region. That is, if you save a 1024x1024 region in an OAR file, you can later restore the objects and terrain into a 1024x1024 sized region. If you load an OAR file from a smaller region into a larger region, the unspecified terrain space will default to 25m.&lt;br /&gt;
&lt;br /&gt;
To make conversion to varregions easier, 'load oar' now has a '--displacement &amp;quot;&amp;lt;x,y,z&amp;gt;&amp;quot;' parameter. This displaces all of the objects and the terrain from the oar file when loading them into the new region.  For instance, say you have four&lt;br /&gt;
OAR files from four adjacent 256x256 regions (oar00.oar, oar01.oar, oar10.oar, and oar11.oar). You create a new 512x512 varregion named 'bigregion'. The following commands place the four regions of objects, terrains and parcels&lt;br /&gt;
into the new larger region:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
change region bigregion&lt;br /&gt;
load oar oar00.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;0,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar01.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,0,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar10.oar&lt;br /&gt;
load oar --displacement &amp;quot;&amp;lt;256,256,0&amp;gt;&amp;quot; --merge --forceterrain --forceparcel oar11.oar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note the new &amp;quot;--forceterrain&amp;quot; and &amp;quot;--forceparcel&amp;quot; parameters. &amp;quot;--merge&amp;quot;, used by itself, is for merging together the objects from multiple OARs. Merging also suppresses the loading of terrain and parcel data which is just what you want when merging objects. But, if loading multiple OARs to create a new, larger region, the terrain and parcel information  must be loaded. Thus the new parameters.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* There is some problem with teleporting in an out of larger region. It works for some configurations and not others.&lt;br /&gt;
* The viewer Map dialog cannot specify locations outside of 256x256 in larger regions&lt;br /&gt;
* While adjacent regions are usually viewable, sometimes they are not. They appear when you cross over into the region.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of January 17, 2014, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region. (mostly done)&lt;br /&gt;
* ITerrainLoader implementations (mostly done)&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
* Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New overlay types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
** consider creating structures for world and region coordinates so there can be compile time checking&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2014-01-19T23:53:13Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Update to restrictions and information on loading terrain with console commands&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256 and less than or equal to 8192.&lt;br /&gt;
* The dimensions must be square (as of 20131104)&lt;br /&gt;
* Adjacent regions must be the same size. For instance, you can have multiple 512x512 regions adjacent (and see into the other region and border cross). There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region). Remember that the region coordinates are specified in 256m region count so a group of four 512x512 regions would be specified at 8000/8000, 8000/8002, 8002/8000, and 8002/8002, for instance.&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
The usual terrain console commands work with varregions. If you have set up a larger region, you can load BMP/RAW/PNG heightmap files of the dimensions of the region and fill the whole region. For instance, a 1024x1024 region terrain would be completely initialized by &amp;quot;terrain load 1024.bmp&amp;quot; if '1024.bmp is a 1024x1024 bitmap.&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion/Protocol</id>
		<title>Varregion/Protocol</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion/Protocol"/>
				<updated>2013-12-29T18:37:14Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: add HelloNeighbor sim-to-sim message&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion Protocol'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
The communication protocols need extensions to pass around the size of the regions. These extensions are in the simulator to client protocols, the simulator to simulator protocols and the simulator to grid service protocols. This page documents most of the changes.&lt;br /&gt;
&lt;br /&gt;
==Simulator to Client Protocol==&lt;br /&gt;
&lt;br /&gt;
* EnableSimulator event message: add integers 'RegionSizeX' and 'RegionSizeY'&lt;br /&gt;
* CrossRegion event message: add integers 'RegionSizeX' and 'RegionSizeY' to 'RegionData' section.&lt;br /&gt;
* TeleportFinish event message: add integers 'RegionSizeX' and 'RegionSizeY' to 'Info' section.&lt;br /&gt;
* EstablishAgentCommunication event message: add integers 'region-size-x' and 'region-size-y'.&lt;br /&gt;
&lt;br /&gt;
===Terrain Patch===&lt;br /&gt;
===Cloud Patch===&lt;br /&gt;
===Wind Patch===&lt;br /&gt;
&lt;br /&gt;
==Simulator to Grid Service Protocol==&lt;br /&gt;
&lt;br /&gt;
==Simulator to Simulator Protocol==&lt;br /&gt;
&lt;br /&gt;
* HelloNeighbor message: add 'region_size_x' and 'region_size_y' to region info.&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion/Protocol</id>
		<title>Varregion/Protocol</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion/Protocol"/>
				<updated>2013-12-29T17:46:35Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: info on EstablishAgentCommunication&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion Protocol'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
The communication protocols need extensions to pass around the size of the regions. These extensions are in the simulator to client protocols, the simulator to simulator protocols and the simulator to grid service protocols. This page documents most of the changes.&lt;br /&gt;
&lt;br /&gt;
==Simulator to Client Protocol==&lt;br /&gt;
&lt;br /&gt;
* EnableSimulator event message: add integers 'RegionSizeX' and 'RegionSizeY'&lt;br /&gt;
* CrossRegion event message: add integers 'RegionSizeX' and 'RegionSizeY' to 'RegionData' section.&lt;br /&gt;
* TeleportFinish event message: add integers 'RegionSizeX' and 'RegionSizeY' to 'Info' section.&lt;br /&gt;
* EstablishAgentCommunication event message: add integers 'region-size-x' and 'region-size-y'.&lt;br /&gt;
&lt;br /&gt;
===Terrain Patch===&lt;br /&gt;
===Cloud Patch===&lt;br /&gt;
===Wind Patch===&lt;br /&gt;
&lt;br /&gt;
==Simulator to Grid Service Protocol==&lt;br /&gt;
&lt;br /&gt;
==Simulator to Simulator Protocol==&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion/Protocol</id>
		<title>Varregion/Protocol</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion/Protocol"/>
				<updated>2013-12-29T17:44:53Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: event message additions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion Protocol'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
The communication protocols need extensions to pass around the size of the regions. These extensions are in the simulator to client protocols, the simulator to simulator protocols and the simulator to grid service protocols. This page documents most of the changes.&lt;br /&gt;
&lt;br /&gt;
==Simulator to Client Protocol==&lt;br /&gt;
&lt;br /&gt;
* EnableSimulator event message: add integers 'RegionSizeX' and 'RegionSizeY'&lt;br /&gt;
* CrossRegion event message: add integers 'RegionSizeX' and 'RegionSizeY' to 'RegionData' section.&lt;br /&gt;
* TeleportFinish event message: add integers 'RegionSizeX' and 'RegionSizeY' to 'Info' section.&lt;br /&gt;
&lt;br /&gt;
===Terrain Patch===&lt;br /&gt;
===Cloud Patch===&lt;br /&gt;
===Wind Patch===&lt;br /&gt;
&lt;br /&gt;
==Simulator to Grid Service Protocol==&lt;br /&gt;
&lt;br /&gt;
==Simulator to Simulator Protocol==&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-12-29T16:25:13Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: add link to Singularity commit for varregion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Singularity commit for varregion: https://github.com/singularity-viewer/SingularityViewer/commit/ad8ea07a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion/Protocol</id>
		<title>Varregion/Protocol</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion/Protocol"/>
				<updated>2013-12-29T16:21:56Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: structure of page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion Protocol'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
The communication protocols need extensions to pass around the size of the regions. These extensions are in the simulator to client protocols, the simulator to simulator protocols and the simulator to grid service protocols. This page documents most of the changes.&lt;br /&gt;
&lt;br /&gt;
==Simulator to Client Protocol==&lt;br /&gt;
&lt;br /&gt;
===Terrain Patch===&lt;br /&gt;
===Cloud Patch===&lt;br /&gt;
===Wind Patch===&lt;br /&gt;
&lt;br /&gt;
==Simulator to Grid Service Protocol==&lt;br /&gt;
&lt;br /&gt;
==Simulator to Simulator Protocol==&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-12-29T16:16:52Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Add link to varregion protocol page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
A growing list of protocol changes to implement &amp;quot;varregion&amp;quot; is at [[varregion/Protocol|Varregion Protocol]].&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-12-29T16:12:06Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Add section on region crossing.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
===Sensing Border Crossing===&lt;br /&gt;
Most of the ‘move to new region’ code is based on checking boundaries. There is much code related to computing if an object or avatar has crossed a region boundary and then computing the address of the next region from same. Introducing variable sized regions messes a lot of this computation up. That is, the code doing the arithmetic usually assumes it knows the address of the next region based on a known region size and them can compute the location of the next region based on that. With varregions those assumptions no longer hold. Varregion implementation means that the computation of region base locations and border locations moves to the GridService who is the entity who really knows the size of all the regions and what is adjacent to what.&lt;br /&gt;
&lt;br /&gt;
The realization that location to region computation is really a GridService operation lead me to totally rip apart the grid boundary checking code and replace it with two functions: &amp;lt;tt&amp;gt;Scene.PositionIsInCurrentRegion(Vector3 pos)&amp;lt;/tt&amp;gt; and then &amp;lt;tt&amp;gt;EntityTransferModule.GetRegionContainingWorldLocation(double X, double Y)&amp;lt;/tt&amp;gt;. The former function tests to see if the object/avatar has moved out of the current region and the latter gets the region moved into. (Side note: &amp;lt;tt&amp;gt;GetRegionContainingWorldLocation&amp;lt;/tt&amp;gt; should really be a function on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt; but that exercise is left for future hacking).&lt;br /&gt;
&lt;br /&gt;
These changes leave all the 'border' code in limbo -- the generation of the border lists is still there but it is not being used. This should eventually be cleaned up. Also, the computation of neighbor regions is scattered around with routines on &amp;lt;tt&amp;gt;IGridService&amp;lt;/tt&amp;gt;, in &amp;lt;tt&amp;gt;EntityTransferModule&amp;lt;/tt&amp;gt; and a bunch of bookkeeping in &amp;lt;tt&amp;gt;Scene&amp;lt;/tt&amp;gt;. This too should be cleaned up.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Consolidate neighbor region computation code (Scene, EntityTransferModule and IGridService all have 'get neighbor' code)&lt;br /&gt;
* Clean up/eliminate border list creation and use code&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-12-27T01:17:33Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: fixed 2618 to 2816 number wrongness&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
for llRezObject to work beyond 256m set &amp;quot;ScriptDistanceLimitFactor = 52.0&amp;quot; (for 512mx512m) in the [Xengine] section of OpenSim.ini.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2816x2816 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-26T16:59:06Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: note on setting 'CombineContiguousRegions=false' when converting from mega-regions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
If converting from a mega-region, remember to set &amp;quot;&amp;lt;tt&amp;gt;CombineContiguousRegions = false&amp;lt;/tt&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2618x2618 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-25T21:24:54Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Notes on viewer work&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2618x2618 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
&lt;br /&gt;
====Viewer====&lt;br /&gt;
* LLSurface is wired to expect adjacent regions of same size&lt;br /&gt;
* Terrain surface image is sized with a 'static&amp;quot;: &amp;quot;    static S32  sTextureSize;               // Size of the surface texture&amp;quot;&lt;br /&gt;
* From FreeNode:#SingularityViewer 20131125:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Aleric&amp;gt; radams1, SianaGearz, frnic : I couldn't help myself doing a profile anyway..  The reason the viewer is slow is because it's busy &amp;quot;drawing&amp;quot; the terrain. &amp;quot;drawing&amp;quot; between quotes because my guess is that it is trying to draw ALL terrain and then clip that afterwards to the frustrum... &lt;br /&gt;
&amp;lt;Aleric&amp;gt; So, this could be greatly improved by disregarding terrain way way earlier when it is beyond the drawing range anyway.&lt;br /&gt;
&amp;lt;SianaGearz&amp;gt; OK&lt;br /&gt;
&amp;lt;Aleric&amp;gt; I disabled all rendering, even added a 'return' in terrain render&lt;br /&gt;
&amp;lt;Aleric&amp;gt; but.. no improvement of FPS!&lt;br /&gt;
&amp;lt;frnic&amp;gt; oops&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurfacePatch::updateVisibility() is still eating a lot of cpu.&lt;br /&gt;
&amp;lt;Aleric&amp;gt; LLSurface::updatePatchVisibilities does 97% of the calls to LLSurfacePatch::updateVisibility&lt;br /&gt;
&amp;lt;Aleric&amp;gt; which then spends most of it's time calling LLCamera::AABBInFrustumNoFarClip&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-24T20:08:45Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Region coords to uints work item&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2618x2618 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
* Region coords are sometimes 'int' and sometimes 'uint' with conversions EVERYWHERE&lt;br /&gt;
** pass over everything and convert region coordinates it 'uint's&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-24T20:04:40Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: more stuff to work on&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must be a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2618x2618 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* Region handles are world coords and also the base of the region&lt;br /&gt;
** verify that everyone who converts coords to handle (Util.RegionWorldLocToHandle) is supplying the base of the region.&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-10T20:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: note on setting up database parameters for large heightmaps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
The terrain heightmap is stored in the database as an array of 'shorts' (two bytes) so, if you have a very large region you might need to set the database maximum size to a larger value. For instance, a 2618x2618 region (11x11 legacy regions) turns into a 56 megabyte heightmap and, for MySQL, you would need to set &amp;lt;tt&amp;gt;max_allowed_packet&amp;lt;/tt&amp;gt; to something like 64M.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-10T19:46:03Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
*** Save five parcel region as OAR. Clear database. Restart region. Load oar. Verify 5 parcels of correct location, name and features.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
** Changing land from 256 to 768&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-10T17:56:51Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
*** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
*** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
** 768x768 standalone region&lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-10T17:18:18Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: adding testing info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;br /&gt;
&lt;br /&gt;
==Testing==&lt;br /&gt;
* Terrain/parcel operations&lt;br /&gt;
** Clean database. Start single standalone region. Verify 'pimple' region. Verify one parcel. Flatten region.&lt;br /&gt;
** Create parcels adjacent to each edge and standalone in middle. Change names of each parcel and verify. Restart simulator and verify parcels exist and work correctly.&lt;br /&gt;
&lt;br /&gt;
** Default 256 standalone region&lt;br /&gt;
** Adjacent 256 standalone regions &lt;br /&gt;
* Teleporting&lt;br /&gt;
* Adjacency&lt;br /&gt;
* Hypergrid&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-07T13:58:35Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Add note about SendParcelOverlay&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* LandManagementModule.SendParcelOverlay sends land sale/ownership info for 4x4m areas&lt;br /&gt;
**  Looks like it expects to send exactly one 1024 byte block (for the 256x256 legacy region&lt;br /&gt;
**  Check viewer code for what will happen for larger regions&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-06T06:25:02Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* LLClientView.SendMapBlockSplit() needs to have region size to send with the map info&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-05T23:41:30Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Note on using heightmap BulletSim terrain implementation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
** You must use BulletSim's height map terrain implementation. Add to your INI files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[BulletSim]&lt;br /&gt;
    TerrainImplementation = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Varregion</id>
		<title>Varregion</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Varregion"/>
				<updated>2013-11-05T22:08:30Z</updated>
		
		<summary type="html">&lt;p&gt;Misterblue: Add instructions for varregion branch in source repository&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Varregion'''&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;quot;Varregion&amp;quot; is a feature of OpenSimulator that enables region sizes larger than 256x256. The region is just larger so it acts like a regular region but with borders farther apart.&lt;br /&gt;
&lt;br /&gt;
The implementation uses the [http://aurora-sim.org Aurora] large region protocol extensions so the existing [http://firestormviewer.org Firestorm] and [http://singularityviewer.org Singularity] Aurora support will now work for OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
==Restrictions==&lt;br /&gt;
Some restrictions apply:&lt;br /&gt;
* The dimensions must a multiple of 256&lt;br /&gt;
* The dimensions must be square if used with Singularity (as of 20131104)&lt;br /&gt;
* There must be no adjacent regions (at least one empty 256m space bordering all sides of the large region)&lt;br /&gt;
* You must use BulletSim (as of 20131104, ODE has not been modified for varregions)&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
The size is be specified in the &amp;lt;tt&amp;gt;Region.ini&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    [MyRegionName]&lt;br /&gt;
    RegionUUID = 95ec77ec-58c5-4ce2-9ff3-b6d1900d78a2&lt;br /&gt;
    Location = 1000,1000&lt;br /&gt;
    SizeX = 1024&lt;br /&gt;
    SizeY = 1024&lt;br /&gt;
    InternalAddress = 0.0.0.0&lt;br /&gt;
    InternalPort = 9200&lt;br /&gt;
    AllowAlternatePorts = False&lt;br /&gt;
    ExternalHostName = SYSTEMIP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If size is not specified, it will, of course, default to the legacy size of 256.&lt;br /&gt;
&lt;br /&gt;
If the given dimensions do not fit the restrictions, acceptable values are computed and warning and error messages are output into the log.&lt;br /&gt;
&lt;br /&gt;
==Loading Terrain==&lt;br /&gt;
TODO: discussion of reading in terrain information&lt;br /&gt;
&lt;br /&gt;
==Varregions and OAR Files==&lt;br /&gt;
TODO: Discussion on saving and restoring varregions.&lt;br /&gt;
&lt;br /&gt;
==Implementation Discussion==&lt;br /&gt;
Since this will be a major change to OpenSimulator that touches a&lt;br /&gt;
lot of different parts, subsequent posts, will discuss the changes I'm making.&lt;br /&gt;
&lt;br /&gt;
===TerrainData===&lt;br /&gt;
One major problem is passing the terrain data from the region to the&lt;br /&gt;
protocol stack. The existing implementation passed an array of floats&lt;br /&gt;
that were presumed to be a 256x256 array of region terrain heights.&lt;br /&gt;
The&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
class is an attempt to hide the terrain implementation&lt;br /&gt;
from&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainModule&amp;lt;/tt&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
can't be passed into the protocol&lt;br /&gt;
stack (LLClientView) because&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;&lt;br /&gt;
is defined as part of&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Region.Framework&amp;lt;/tt&amp;gt;&lt;br /&gt;
which is not visible to the protocol code.&lt;br /&gt;
&lt;br /&gt;
My solution is to create the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
class in&lt;br /&gt;
&amp;lt;tt&amp;gt;OpenSim.Framework.&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;&lt;br /&gt;
just wraps the data structure for the terrain and additionally has&lt;br /&gt;
the attributes giving X and Y size.&lt;br /&gt;
&lt;br /&gt;
I didn't want to change the signature of IClientAPI since so many external modules&lt;br /&gt;
rely on it.&lt;br /&gt;
It should be changed to pass &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; rather than a &amp;lt;tt&amp;gt;float[]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I decided to not change IClientAPI but rather have &amp;lt;tt&amp;gt;LLClientView&amp;lt;/tt&amp;gt; ignore&lt;br /&gt;
the passed array and instead reach back into the associated scene and fetch the&lt;br /&gt;
&amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt; instance.&lt;br /&gt;
&lt;br /&gt;
There is one subclass of &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;: &amp;lt;tt&amp;gt;HeightmapTerrainData&amp;lt;/tt&amp;gt; which keeps the terrain as a compressed heightmap. The height of each point is stored as a &amp;lt;tt&amp;gt;short&amp;lt;/tt&amp;gt; which is &amp;lt;tt&amp;gt;height * compressionFactor&amp;lt;/tt&amp;gt; where &amp;lt;tt&amp;gt;compressionFactor&amp;lt;/tt&amp;gt; is usually &amp;quot;100&amp;quot;. This creates a compact storage of the terrain heights with two decimal points of resolution.&lt;br /&gt;
&lt;br /&gt;
The LLLP (&amp;quot;Linden Lab Legacy Protocol&amp;quot;) sends terrain height data in&lt;br /&gt;
compressed &amp;quot;patches&amp;quot; of 16x16 areas of the terrain&lt;br /&gt;
height. This is a protocol feature that is implemented in &amp;lt;tt&amp;gt;TerrainChannel&amp;lt;/tt&amp;gt;.&lt;br /&gt;
I feel that underlying protocol optimizations shouldn't appear up the&lt;br /&gt;
stack so, in creating &amp;lt;tt&amp;gt;TerrainData&amp;lt;/tt&amp;gt;, I tried to hide terrain patches.&lt;br /&gt;
I mean, someday terrain will be generalized meshes. Right?&lt;br /&gt;
&lt;br /&gt;
===Terrain in the Database===&lt;br /&gt;
Previously, terrain height maps were saved in the database as a blob of 256x256 doubles. To have different region sizes, that format had to change. There is an existing database field &amp;lt;tt&amp;gt;revision&amp;lt;/tt&amp;gt; that stored the time the terrain was saved. This revision information wasn't used for anything so this field was co-opted to contain a revision code for the height field blob.&lt;br /&gt;
&lt;br /&gt;
There are three forms for the height map blob: legacy, compressed2D and regular2D. &amp;quot;legacy&amp;quot; is, of course, the previous 256x256 collections of doubles. &amp;quot;regular2D&amp;quot; contains the X, Y dimensions and enough floats for that area's heights. &amp;quot;compressed2D&amp;quot; contains the X,Y and compressionFactor followed by enough shorts for the height map.&lt;br /&gt;
&lt;br /&gt;
The database readers and writers default to the legacy format and, if the region happens to have the dimensions 256x256, it is stored using the legacy format. This is an attempt to keep downward compatibility.&lt;br /&gt;
&lt;br /&gt;
All of the database modules (MySQL, SQLite, MSSQL and PSQL) have been modified to store terrain this new way.&lt;br /&gt;
&lt;br /&gt;
==Things Known to be Broken==&lt;br /&gt;
* Rezzing a prim from inventory at greater than &amp;lt;256,256&amp;gt;&lt;br /&gt;
* Saving/restoring heightmap when restarting region&lt;br /&gt;
**	Start large region, edit large part, restart region, see that edits are not saved&lt;br /&gt;
&lt;br /&gt;
==Implementation Notes==&lt;br /&gt;
&lt;br /&gt;
===Branch in the Repository===&lt;br /&gt;
As of November 4, 2013, the varregion implementation is in the 'varregion' branch in the OpenSimulator git source repository. This branch is periodically merged with the 'master' branch so it is roughly the 'master' branch plus the varregion functionality.&lt;br /&gt;
&lt;br /&gt;
Since the varregion implementation is supposed to be 100% downward compatible, this branch will eventually be merged into the 'master' branch once the not-breaking-existing-configuration feature is tested and verified.&lt;br /&gt;
&lt;br /&gt;
In an existing clone of the OpenSimulator git source repository, do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# setup local branch that tracks the remote repository branch&lt;br /&gt;
git branch --track varregion origin/varregion&lt;br /&gt;
# update the working set with the varregion sources&lt;br /&gt;
git checkout varregion&lt;br /&gt;
&lt;br /&gt;
# after you are done testing varregion, restore the 'master' sources with:&lt;br /&gt;
git checkout master&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Stuff to Work On===&lt;br /&gt;
What follows are notes I am making as things that might need work are found in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
* ITerrainLoader implementations&lt;br /&gt;
**	How to handle tiles.&lt;br /&gt;
**	How to handle large regions sizes.&lt;br /&gt;
**	Terrain/FileLoaders/*.cs all return an ITerrainChannel&lt;br /&gt;
**	Need to fix all the file reader/writers&lt;br /&gt;
**	FileLoaders/LLRAW.cs has several &amp;quot;256&amp;quot;s rather than constant references&lt;br /&gt;
* Teleporting: should be able to teleport to anywhere in a large region&lt;br /&gt;
** &amp;quot;MyRegion/550/687/40&amp;quot;&lt;br /&gt;
* HG code needs to allow addresses anywhere into large regions&lt;br /&gt;
* When GridService return adjacent regions, make sure it does the right thing for large regions&lt;br /&gt;
* Consider moving terrain XML serialization into TerrainData&lt;br /&gt;
* Consider removing all instances of TerrainChannel.GetFloatsSerialized()&lt;br /&gt;
**	Replace with passing around TerrainData&lt;br /&gt;
* Code in EntityTransferModule that checks distance to decide of to make new connection&lt;br /&gt;
**	search for references to 'Constants.RegionSize'&lt;br /&gt;
**	Consider removing the distance code and replacing with call to grid service&lt;br /&gt;
* WorldMapModule.cs does a lot of arithmetic depending on constants that are really Contants.RegionSize&lt;br /&gt;
* Util.IsOutsideView uses Constants.RegionSize. Is use is ScenePresence a problem?&lt;br /&gt;
**	Used in ScenePresence.AdjustKnownSeeds()&lt;br /&gt;
**	Is this another instance like EntityTransferModule that needs to goto the grid service?&lt;br /&gt;
*Move all the short[] heightmap representation stuff into TerrainData.cs (partially done)&lt;br /&gt;
**	Is it possible to move all the patch stuff out of TerrainModule/TerrainChannel?&lt;br /&gt;
**	Clean up the use of m_revert. It looks like it is not saved after terrain is modified.&lt;br /&gt;
* Need to look through RegionCombinerModule.cs and see what safety checks are needed&lt;br /&gt;
**	Maybe just prevent combination if not legacy region size&lt;br /&gt;
* In LSL_Api.cs, llEdgeOfWorld() does some neighbor computation. Check for ok'ness.&lt;br /&gt;
* Blog entry on moving terrain info into class&lt;br /&gt;
**	Moving class from OpenSim.Region.Framework into OpenSim.Framework&lt;br /&gt;
* The code for cloud and wind needs to be enhanced for larger regions&lt;br /&gt;
**	New layer types added&lt;br /&gt;
* Ward3DMap/TerrainSplat.cs is filled with &amp;quot;256&amp;quot;s.&lt;br /&gt;
**	Doesn't even bother to use the symbolic constants.&lt;br /&gt;
* Warp3DMap/Warp3DImageModule.cs is filled with &amp;quot;256&amp;quot;s&lt;br /&gt;
* WorldMap/WorldMapModules.cs is filled with &amp;quot;256&amp;quot;S&lt;br /&gt;
* Services/MapImageService/MapImageService.cs relies on a constant width of 256&lt;br /&gt;
* Region/Framework/Scenes/Tests/BorderTests.cs might need work if non-standard regions are tested&lt;br /&gt;
* Verify terrain tests still work (for 256m regions)&lt;/div&gt;</summary>
		<author><name>Misterblue</name></author>	</entry>

	</feed>