diff --git a/.nant/local.include b/.nant/local.include index b11c1e58c8..e5efb67055 100644 --- a/.nant/local.include +++ b/.nant/local.include @@ -8,6 +8,7 @@ + diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 239b884363..2620a20075 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -5,7 +5,7 @@ for your effort!) These folks represent the current core team for OpenSim, and are the people that make the day to day of OpenSim happen. -* justincc +* justincc (OSVW Consulting, justincc.org) * chi11ken (Genkii) * dahlia * Melanie Thielker @@ -15,6 +15,7 @@ people that make the day to day of OpenSim happen. * Mic Bowman (Intel) * BlueWall (James Hughes) * Snoopy Pfeffer +* Richard Adams (Intel) = Core Developers Following the White Rabbit = Core developers who have temporarily (we hope) gone chasing the white rabbit. @@ -119,6 +120,7 @@ what it is today. * openlifegrid.com * Oren Hurvitz (Kitely) * otakup0pe +* Pixel Tomsen * ralphos * RemedyTomm * Revolution diff --git a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs index e26c1d23b4..6e28eba1f4 100644 --- a/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs +++ b/OpenSim/ApplicationPlugins/LoadRegions/LoadRegionsPlugin.cs @@ -186,35 +186,5 @@ namespace OpenSim.ApplicationPlugins.LoadRegions return true; } - - public void LoadRegionFromConfig(OpenSimBase openSim, ulong regionhandle) - { - m_log.Info("[LOADREGIONS]: Load Regions addin being initialised"); - - IRegionLoader regionLoader; - if (openSim.ConfigSource.Source.Configs["Startup"].GetString("region_info_source", "filesystem") == "filesystem") - { - m_log.Info("[LOADREGIONS]: Loading Region Info from filesystem"); - regionLoader = new RegionLoaderFileSystem(); - } - else - { - m_log.Info("[LOADREGIONS]: Loading Region Info from web"); - regionLoader = new RegionLoaderWebServer(); - } - - regionLoader.SetIniConfigSource(openSim.ConfigSource.Source); - RegionInfo[] regionsToLoad = regionLoader.LoadRegions(); - for (int i = 0; i < regionsToLoad.Length; i++) - { - if (regionhandle == regionsToLoad[i].RegionHandle) - { - IScene scene; - m_log.Debug("[LOADREGIONS]: Creating Region: " + regionsToLoad[i].RegionName + " (ThreadID: " + - Thread.CurrentThread.ManagedThreadId.ToString() + ")"); - openSim.CreateRegion(regionsToLoad[i], true, out scene); - } - } - } } } diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index 86c0ac8f94..535712e09e 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs @@ -844,21 +844,30 @@ namespace OpenSim.ApplicationPlugins.RemoteController } // Create a new estate with the name provided - region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(region.RegionID, true); + region.EstateSettings = m_application.EstateDataService.CreateNewEstate(); region.EstateSettings.EstateName = (string) requestData["estate_name"]; region.EstateSettings.EstateOwner = userID; // Persistence does not seem to effect the need to save a new estate region.EstateSettings.Save(); + + if (!m_application.EstateDataService.LinkRegion(region.RegionID, (int) region.EstateSettings.EstateID)) + throw new Exception("Failed to join estate."); } else { int estateID = estateIDs[0]; - region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(estateID); + region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(region.RegionID, false); - if (!m_application.EstateDataService.LinkRegion(region.RegionID, estateID)) - throw new Exception("Failed to join estate."); + if (region.EstateSettings.EstateID != estateID) + { + // The region is already part of an estate, but not the one we want. + region.EstateSettings = m_application.EstateDataService.LoadEstateSettings(estateID); + + if (!m_application.EstateDataService.LinkRegion(region.RegionID, estateID)) + throw new Exception("Failed to join estate."); + } } // Create the region and perform any initial initialization @@ -2434,10 +2443,12 @@ namespace OpenSim.ApplicationPlugins.RemoteController /// UUID of the region /// region_name /// region name - /// profile + /// profile /// profile url /// noassets /// true if no assets should be saved + /// perm + /// C and/or T /// /// /// region_uuid takes precedence over @@ -2512,6 +2523,11 @@ namespace OpenSim.ApplicationPlugins.RemoteController options["noassets"] = (string)requestData["noassets"] ; } + if (requestData.Contains("perm")) + { + options["checkPermissions"] = (string)requestData["perm"]; + } + IRegionArchiverModule archiver = scene.RequestModuleInterface(); if (archiver != null) diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/tests/Remote.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/tests/Remote.cs index 1023108661..b53806c651 100644 --- a/OpenSim/ApplicationPlugins/Rest/Inventory/tests/Remote.cs +++ b/OpenSim/ApplicationPlugins/Rest/Inventory/tests/Remote.cs @@ -169,7 +169,7 @@ namespace OpenSim.ApplicationPlugins.Rest.Inventory.Tests float y = Convert.ToSingle(rdata.Parameters[PARM_MOVE_Y]); float z = Convert.ToSingle(rdata.Parameters[PARM_MOVE_Z]); Vector3 vector = new Vector3(x, y, z); - presence.MoveToTarget(vector, false); + presence.MoveToTarget(vector, false, false); } catch (Exception e) { diff --git a/OpenSim/Data/MSSQL/MSSQLEstateData.cs b/OpenSim/Data/MSSQL/MSSQLEstateData.cs index 9c54e77a23..1faa249aed 100644 --- a/OpenSim/Data/MSSQL/MSSQLEstateData.cs +++ b/OpenSim/Data/MSSQL/MSSQLEstateData.cs @@ -148,55 +148,10 @@ namespace OpenSim.Data.MSSQL } } - if (insertEstate && create) { - List names = new List(FieldList); - - names.Remove("EstateID"); - - sql = string.Format("insert into estate_settings ({0}) values ( @{1})", String.Join(",", names.ToArray()), String.Join(", @", names.ToArray())); - - //_Log.Debug("[DB ESTATE]: SQL: " + sql); - using (SqlConnection conn = new SqlConnection(m_connectionString)) - using (SqlCommand insertCommand = new SqlCommand(sql, conn)) - { - insertCommand.CommandText = sql + " SET @ID = SCOPE_IDENTITY()"; - - foreach (string name in names) - { - insertCommand.Parameters.Add(_Database.CreateParameter("@" + name, _FieldMap[name].GetValue(es))); - } - SqlParameter idParameter = new SqlParameter("@ID", SqlDbType.Int); - idParameter.Direction = ParameterDirection.Output; - insertCommand.Parameters.Add(idParameter); - conn.Open(); - insertCommand.ExecuteNonQuery(); - - es.EstateID = Convert.ToUInt32(idParameter.Value); - } - - sql = "INSERT INTO [estate_map] ([RegionID] ,[EstateID]) VALUES (@RegionID, @EstateID)"; - using (SqlConnection conn = new SqlConnection(m_connectionString)) - using (SqlCommand cmd = new SqlCommand(sql, conn)) - { - - cmd.Parameters.Add(_Database.CreateParameter("@RegionID", regionID)); - cmd.Parameters.Add(_Database.CreateParameter("@EstateID", es.EstateID)); - // This will throw on dupe key - try - { - conn.Open(); - cmd.ExecuteNonQuery(); - } - catch (Exception e) - { - m_log.DebugFormat("[ESTATE DB]: Error inserting regionID and EstateID in estate_map: {0}", e); - } - } - - //TODO check if this is needed?? - es.Save(); + DoCreate(es); + LinkRegion(regionID, (int)es.EstateID); } LoadBanList(es); @@ -210,6 +165,53 @@ namespace OpenSim.Data.MSSQL return es; } + public EstateSettings CreateNewEstate() + { + EstateSettings es = new EstateSettings(); + es.OnSave += StoreEstateSettings; + + DoCreate(es); + + LoadBanList(es); + + es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers"); + es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users"); + es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups"); + + return es; + } + + private void DoCreate(EstateSettings es) + { + List names = new List(FieldList); + + names.Remove("EstateID"); + + string sql = string.Format("insert into estate_settings ({0}) values ( @{1})", String.Join(",", names.ToArray()), String.Join(", @", names.ToArray())); + + //_Log.Debug("[DB ESTATE]: SQL: " + sql); + using (SqlConnection conn = new SqlConnection(m_connectionString)) + using (SqlCommand insertCommand = new SqlCommand(sql, conn)) + { + insertCommand.CommandText = sql + " SET @ID = SCOPE_IDENTITY()"; + + foreach (string name in names) + { + insertCommand.Parameters.Add(_Database.CreateParameter("@" + name, _FieldMap[name].GetValue(es))); + } + SqlParameter idParameter = new SqlParameter("@ID", SqlDbType.Int); + idParameter.Direction = ParameterDirection.Output; + insertCommand.Parameters.Add(idParameter); + conn.Open(); + insertCommand.ExecuteNonQuery(); + + es.EstateID = Convert.ToUInt32(idParameter.Value); + } + + //TODO check if this is needed?? + es.Save(); + } + /// /// Stores the estate settings. /// @@ -498,24 +500,43 @@ namespace OpenSim.Data.MSSQL public bool LinkRegion(UUID regionID, int estateID) { - string sql = "insert into estate_map values (@RegionID, @EstateID)"; + string deleteSQL = "delete from estate_map where RegionID = @RegionID"; + string insertSQL = "insert into estate_map values (@RegionID, @EstateID)"; using (SqlConnection conn = new SqlConnection(m_connectionString)) { conn.Open(); + SqlTransaction transaction = conn.BeginTransaction(); + try { - using (SqlCommand cmd = new SqlCommand(sql, conn)) + using (SqlCommand cmd = new SqlCommand(deleteSQL, conn)) { - cmd.Parameters.AddWithValue("@RegionID", regionID); + cmd.Transaction = transaction; + cmd.Parameters.AddWithValue("@RegionID", regionID.Guid); + + cmd.ExecuteNonQuery(); + } + + using (SqlCommand cmd = new SqlCommand(insertSQL, conn)) + { + cmd.Transaction = transaction; + cmd.Parameters.AddWithValue("@RegionID", regionID.Guid); cmd.Parameters.AddWithValue("@EstateID", estateID); int ret = cmd.ExecuteNonQuery(); + + if (ret != 0) + transaction.Commit(); + else + transaction.Rollback(); + return (ret != 0); } } catch (Exception ex) { m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message); + transaction.Rollback(); } } return false; diff --git a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs index f24b441c44..dd0689cb22 100644 --- a/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs +++ b/OpenSim/Data/MSSQL/MSSQLUserAccountData.cs @@ -218,23 +218,27 @@ namespace OpenSim.Data.MSSQL if (words.Length > 2) return new UserAccountData[0]; + string sql = ""; + using (SqlConnection conn = new SqlConnection(m_ConnectionString)) using (SqlCommand cmd = new SqlCommand()) { if (words.Length == 1) { - cmd.CommandText = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @search or [LastName] like @search)", m_Realm); + sql = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @search or [LastName] like @search)", m_Realm); cmd.Parameters.Add(m_database.CreateParameter("@scopeID", scopeID)); - cmd.Parameters.Add(m_database.CreateParameter("@search", "%" + words[0] + "%")); + cmd.Parameters.Add(m_database.CreateParameter("@search", "%" + words[0] + "%")); } else { - cmd.CommandText = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @searchFirst or [LastName] like @searchLast)", m_Realm); - cmd.Parameters.Add(m_database.CreateParameter("@searchFirst", "%" + words[0] + "%")); - cmd.Parameters.Add(m_database.CreateParameter("@searchLast", "%" + words[1] + "%")); - cmd.Parameters.Add(m_database.CreateParameter("@ScopeID", scopeID.ToString())); + sql = String.Format("select * from {0} where ([ScopeID]=@ScopeID or [ScopeID]='00000000-0000-0000-0000-000000000000') and ([FirstName] like @searchFirst or [LastName] like @searchLast)", m_Realm); + cmd.Parameters.Add(m_database.CreateParameter("@searchFirst", "%" + words[0] + "%")); + cmd.Parameters.Add(m_database.CreateParameter("@searchLast", "%" + words[1] + "%")); + cmd.Parameters.Add(m_database.CreateParameter("@ScopeID", scopeID.ToString())); } - + cmd.Connection = conn; + cmd.CommandText = sql; + conn.Open(); return DoQuery(cmd); } } diff --git a/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations index 4d8ab0f622..cc94c4e8cf 100644 --- a/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations +++ b/OpenSim/Data/MSSQL/Resources/FriendsStore.migrations @@ -19,4 +19,32 @@ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[userf INSERT INTO Friends (PrincipalID, Friend, Flags, Offered) SELECT [ownerID], [friendID], [friendPerms], 0 FROM userfriends; +COMMIT + +:VERSION 3 + +BEGIN TRANSACTION + +CREATE TABLE [Tmp_Friends] + ([PrincipalID] varchar(255) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', +[Friend] varchar(255) NOT NULL, +[Flags] char(16) NOT NULL DEFAULT '0', +[Offered] varchar(32) NOT NULL DEFAULT 0) +ON [PRIMARY] + + +IF EXISTS(SELECT * FROM dbo.Friends) + EXEC('INSERT INTO dbo.Tmp_Friends (PrincipalID, Friend, Flags, Offered) + SELECT CONVERT(varchar(255),PrincipalID), Friend, Flags, Offered FROM dbo.Friends WITH (HOLDLOCK TABLOCKX)') + +DROP TABLE dbo.Friends + +EXECUTE sp_rename N'dbo.Tmp_Friends', N'Friends', 'OBJECT' + +ALTER TABLE dbo.Friends ADD + PRIMARY KEY CLUSTERED +( + [PrincipalID] ASC, [Friend] ASC +)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] + COMMIT \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations index 4a3cb27312..4e436534fd 100644 --- a/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations +++ b/OpenSim/Data/MSSQL/Resources/InventoryStore.migrations @@ -244,4 +244,36 @@ ALTER TABLE inventoryitems ADD CONSTRAINT DF_inventoryitems_creatorID DEFAULT '00000000-0000-0000-0000-000000000000' FOR creatorID +:GO + +:VERSION 9 + +BEGIN TRANSACTION + +# CreatorID goes up to VARCHAR(255) + +exec sp_rename 'inventoryitems.CreatorID', 'cr_old', 'COLUMN' + +:GO + +alter table inventoryitems + add creatorID varchar(255) NULL + +:GO + +update inventoryitems set creatorID = cr_old + +alter table inventoryitems +drop CONSTRAINT DF_inventoryitems_creatorID +:GO + +alter table inventoryitems + drop column cr_old + :GO +COMMIT + +ALTER TABLE inventoryitems +ADD CONSTRAINT DF_inventoryitems_creatorID +DEFAULT '00000000-0000-0000-0000-000000000000' FOR creatorID + :GO \ No newline at end of file diff --git a/OpenSim/Data/MSSQL/Resources/OpenSim.Data.MSSQL.addin.xml b/OpenSim/Data/MSSQL/Resources/OpenSim.Data.MSSQL.addin.xml deleted file mode 100644 index 15fd29e57c..0000000000 --- a/OpenSim/Data/MSSQL/Resources/OpenSim.Data.MSSQL.addin.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OpenSim/Data/MySQL/MySQLEstateData.cs b/OpenSim/Data/MySQL/MySQLEstateData.cs index 9dcf5e2adc..3d647ca38c 100644 --- a/OpenSim/Data/MySQL/MySQLEstateData.cs +++ b/OpenSim/Data/MySQL/MySQLEstateData.cs @@ -149,6 +149,22 @@ namespace OpenSim.Data.MySQL } } + public EstateSettings CreateNewEstate() + { + EstateSettings es = new EstateSettings(); + es.OnSave += StoreEstateSettings; + + DoCreate(es); + + LoadBanList(es); + + es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers"); + es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users"); + es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups"); + + return es; + } + private EstateSettings DoLoad(MySqlCommand cmd, UUID regionID, bool create) { EstateSettings es = new EstateSettings(); @@ -188,54 +204,8 @@ namespace OpenSim.Data.MySQL if (!found && create) { - // Migration case - List names = new List(FieldList); - - names.Remove("EstateID"); - - string sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")"; - - using (MySqlCommand cmd2 = dbcon.CreateCommand()) - { - cmd2.CommandText = sql; - cmd2.Parameters.Clear(); - - foreach (string name in FieldList) - { - if (m_FieldMap[name].GetValue(es) is bool) - { - if ((bool)m_FieldMap[name].GetValue(es)) - cmd2.Parameters.AddWithValue("?" + name, "1"); - else - cmd2.Parameters.AddWithValue("?" + name, "0"); - } - else - { - cmd2.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString()); - } - } - - cmd2.ExecuteNonQuery(); - - cmd2.CommandText = "select LAST_INSERT_ID() as id"; - cmd2.Parameters.Clear(); - - using (IDataReader r = cmd2.ExecuteReader()) - { - r.Read(); - es.EstateID = Convert.ToUInt32(r["id"]); - } - - cmd2.CommandText = "insert into estate_map values (?RegionID, ?EstateID)"; - cmd2.Parameters.AddWithValue("?RegionID", regionID.ToString()); - cmd2.Parameters.AddWithValue("?EstateID", es.EstateID.ToString()); - - // This will throw on dupe key - try { cmd2.ExecuteNonQuery(); } - catch (Exception) { } - - es.Save(); - } + DoCreate(es); + LinkRegion(regionID, (int)es.EstateID); } } @@ -247,6 +217,54 @@ namespace OpenSim.Data.MySQL return es; } + private void DoCreate(EstateSettings es) + { + // Migration case + List names = new List(FieldList); + + names.Remove("EstateID"); + + string sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")"; + + using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) + { + dbcon.Open(); + using (MySqlCommand cmd2 = dbcon.CreateCommand()) + { + cmd2.CommandText = sql; + cmd2.Parameters.Clear(); + + foreach (string name in FieldList) + { + if (m_FieldMap[name].GetValue(es) is bool) + { + if ((bool)m_FieldMap[name].GetValue(es)) + cmd2.Parameters.AddWithValue("?" + name, "1"); + else + cmd2.Parameters.AddWithValue("?" + name, "0"); + } + else + { + cmd2.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString()); + } + } + + cmd2.ExecuteNonQuery(); + + cmd2.CommandText = "select LAST_INSERT_ID() as id"; + cmd2.Parameters.Clear(); + + using (IDataReader r = cmd2.ExecuteReader()) + { + r.Read(); + es.EstateID = Convert.ToUInt32(r["id"]); + } + + es.Save(); + } + } + } + public void StoreEstateSettings(EstateSettings es) { string sql = "replace into estate_settings (" + String.Join(",", FieldList) + ") values ( ?" + String.Join(", ?", FieldList) + ")"; @@ -477,7 +495,6 @@ namespace OpenSim.Data.MySQL } } - dbcon.Close(); } @@ -507,7 +524,6 @@ namespace OpenSim.Data.MySQL } } - dbcon.Close(); } @@ -519,16 +535,34 @@ namespace OpenSim.Data.MySQL using (MySqlConnection dbcon = new MySqlConnection(m_connectionString)) { dbcon.Open(); + MySqlTransaction transaction = dbcon.BeginTransaction(); try { + // Delete any existing association of this region with an estate. + using (MySqlCommand cmd = dbcon.CreateCommand()) + { + cmd.Transaction = transaction; + cmd.CommandText = "delete from estate_map where RegionID = ?RegionID"; + cmd.Parameters.AddWithValue("?RegionID", regionID); + + cmd.ExecuteNonQuery(); + } + using (MySqlCommand cmd = dbcon.CreateCommand()) { + cmd.Transaction = transaction; cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)"; cmd.Parameters.AddWithValue("?RegionID", regionID); cmd.Parameters.AddWithValue("?EstateID", estateID); int ret = cmd.ExecuteNonQuery(); + + if (ret != 0) + transaction.Commit(); + else + transaction.Rollback(); + dbcon.Close(); return (ret != 0); @@ -537,6 +571,7 @@ namespace OpenSim.Data.MySQL catch (MySqlException ex) { m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message); + transaction.Rollback(); } dbcon.Close(); diff --git a/OpenSim/Data/MySQL/Resources/OpenSim.Data.MySQL.addin.xml b/OpenSim/Data/MySQL/Resources/OpenSim.Data.MySQL.addin.xml deleted file mode 100644 index 9e995479d0..0000000000 --- a/OpenSim/Data/MySQL/Resources/OpenSim.Data.MySQL.addin.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OpenSim/Data/Null/NullEstateData.cs b/OpenSim/Data/Null/NullEstateData.cs index 8db8064cbe..d64136de8d 100755 --- a/OpenSim/Data/Null/NullEstateData.cs +++ b/OpenSim/Data/Null/NullEstateData.cs @@ -84,6 +84,11 @@ namespace OpenSim.Data.Null { return new EstateSettings(); } + + public EstateSettings CreateNewEstate() + { + return new EstateSettings(); + } public List LoadEstateSettingsAll() { diff --git a/OpenSim/Data/Null/NullSimulationData.cs b/OpenSim/Data/Null/NullSimulationData.cs index c33a6f2c43..b7889767da 100644 --- a/OpenSim/Data/Null/NullSimulationData.cs +++ b/OpenSim/Data/Null/NullSimulationData.cs @@ -77,8 +77,10 @@ namespace OpenSim.Data.Null } public RegionSettings LoadRegionSettings(UUID regionUUID) - { - return null; + { + RegionSettings rs = new RegionSettings(); + rs.RegionUUID = regionUUID; + return rs; } public void StoreObject(SceneObjectGroup obj, UUID regionUUID) diff --git a/OpenSim/Data/SQLite/Resources/OpenSim.Data.SQLite.addin.xml b/OpenSim/Data/SQLite/Resources/OpenSim.Data.SQLite.addin.xml deleted file mode 100644 index e6764facbd..0000000000 --- a/OpenSim/Data/SQLite/Resources/OpenSim.Data.SQLite.addin.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/OpenSim/Data/SQLite/SQLiteEstateData.cs b/OpenSim/Data/SQLite/SQLiteEstateData.cs index 65719a63fa..8db9262e18 100644 --- a/OpenSim/Data/SQLite/SQLiteEstateData.cs +++ b/OpenSim/Data/SQLite/SQLiteEstateData.cs @@ -151,59 +151,8 @@ namespace OpenSim.Data.SQLite } else if (create) { - r.Close(); - - List names = new List(FieldList); - - names.Remove("EstateID"); - - string sql = "insert into estate_settings ("+String.Join(",", names.ToArray())+") values ( :"+String.Join(", :", names.ToArray())+")"; - - cmd.CommandText = sql; - cmd.Parameters.Clear(); - - foreach (string name in FieldList) - { - if (m_FieldMap[name].GetValue(es) is bool) - { - if ((bool)m_FieldMap[name].GetValue(es)) - cmd.Parameters.AddWithValue(":"+name, "1"); - else - cmd.Parameters.AddWithValue(":"+name, "0"); - } - else - { - cmd.Parameters.AddWithValue(":"+name, m_FieldMap[name].GetValue(es).ToString()); - } - } - - cmd.ExecuteNonQuery(); - - cmd.CommandText = "select LAST_INSERT_ROWID() as id"; - cmd.Parameters.Clear(); - - r = cmd.ExecuteReader(); - - r.Read(); - - es.EstateID = Convert.ToUInt32(r["id"]); - - r.Close(); - - cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)"; - cmd.Parameters.AddWithValue(":RegionID", regionID.ToString()); - cmd.Parameters.AddWithValue(":EstateID", es.EstateID.ToString()); - - // This will throw on dupe key - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception) - { - } - - es.Save(); + DoCreate(es); + LinkRegion(regionID, (int)es.EstateID); } LoadBanList(es); @@ -214,6 +163,67 @@ namespace OpenSim.Data.SQLite return es; } + public EstateSettings CreateNewEstate() + { + EstateSettings es = new EstateSettings(); + es.OnSave += StoreEstateSettings; + + DoCreate(es); + + LoadBanList(es); + + es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers"); + es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users"); + es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups"); + + return es; + } + + private void DoCreate(EstateSettings es) + { + List names = new List(FieldList); + + SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand(); + IDataReader r = null; + + names.Remove("EstateID"); + + string sql = "insert into estate_settings ("+String.Join(",", names.ToArray())+") values ( :"+String.Join(", :", names.ToArray())+")"; + + cmd.CommandText = sql; + cmd.Parameters.Clear(); + + foreach (string name in FieldList) + { + if (m_FieldMap[name].GetValue(es) is bool) + { + if ((bool)m_FieldMap[name].GetValue(es)) + cmd.Parameters.AddWithValue(":"+name, "1"); + else + cmd.Parameters.AddWithValue(":"+name, "0"); + } + else + { + cmd.Parameters.AddWithValue(":"+name, m_FieldMap[name].GetValue(es).ToString()); + } + } + + cmd.ExecuteNonQuery(); + + cmd.CommandText = "select LAST_INSERT_ROWID() as id"; + cmd.Parameters.Clear(); + + r = cmd.ExecuteReader(); + + r.Read(); + + es.EstateID = Convert.ToUInt32(r["id"]); + + r.Close(); + + es.Save(); + } + public void StoreEstateSettings(EstateSettings es) { List fields = new List(FieldList); @@ -440,16 +450,36 @@ namespace OpenSim.Data.SQLite public bool LinkRegion(UUID regionID, int estateID) { - SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand(); + SqliteTransaction transaction = m_connection.BeginTransaction(); - cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)"; - cmd.Parameters.AddWithValue(":RegionID", regionID.ToString()); - cmd.Parameters.AddWithValue(":EstateID", estateID.ToString()); + // Delete any existing estate mapping for this region. + using(SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand()) + { + cmd.CommandText = "delete from estate_map where RegionID = :RegionID"; + cmd.Transaction = transaction; + cmd.Parameters.AddWithValue(":RegionID", regionID.ToString()); - if (cmd.ExecuteNonQuery() == 0) - return false; + cmd.ExecuteNonQuery(); + } - return true; + using(SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand()) + { + cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)"; + cmd.Transaction = transaction; + cmd.Parameters.AddWithValue(":RegionID", regionID.ToString()); + cmd.Parameters.AddWithValue(":EstateID", estateID.ToString()); + + if (cmd.ExecuteNonQuery() == 0) + { + transaction.Rollback(); + return false; + } + else + { + transaction.Commit(); + return true; + } + } } public List GetRegions(int estateID) diff --git a/OpenSim/Framework/AssetBase.cs b/OpenSim/Framework/AssetBase.cs index 06e040fc11..ff240bebb1 100644 --- a/OpenSim/Framework/AssetBase.cs +++ b/OpenSim/Framework/AssetBase.cs @@ -169,6 +169,7 @@ namespace OpenSim.Framework get { return m_metadata.FullID; } set { m_metadata.FullID = value; } } + /// /// Asset MetaData ID (transferring from UUID to string ID) /// diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 21e2233ad2..f147e14fdc 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs @@ -225,6 +225,8 @@ namespace OpenSim.Framework /// public virtual void ResetAppearance() { +// m_log.WarnFormat("[AVATAR APPEARANCE]: Reset appearance"); + m_serial = 0; SetDefaultTexture(); diff --git a/OpenSim/Framework/Console/LocalConsole.cs b/OpenSim/Framework/Console/LocalConsole.cs index eda41b8d5a..7c8626dac0 100644 --- a/OpenSim/Framework/Console/LocalConsole.cs +++ b/OpenSim/Framework/Console/LocalConsole.cs @@ -46,12 +46,11 @@ namespace OpenSim.Framework.Console // private readonly object m_syncRoot = new object(); private const string LOGLEVEL_NONE = "(none)"; - private int y = -1; - private int cp = 0; - private int h = 1; - private StringBuilder cmdline = new StringBuilder(); - private bool echo = true; - private List history = new List(); + private int m_cursorYPosition = -1; + private int m_cursorXPosition = 0; + private StringBuilder m_commandLine = new StringBuilder(); + private bool m_echo = true; + private List m_history = new List(); private static readonly ConsoleColor[] Colors = { // the dark colors don't seem to be visible on some black background terminals like putty :( @@ -81,10 +80,10 @@ namespace OpenSim.Framework.Console private void AddToHistory(string text) { - while (history.Count >= 100) - history.RemoveAt(0); + while (m_history.Count >= 100) + m_history.RemoveAt(0); - history.Add(text); + m_history.Add(text); } /// @@ -111,11 +110,11 @@ namespace OpenSim.Framework.Console } else { - int bw = System.Console.BufferWidth; + int bufferWidth = System.Console.BufferWidth; // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) - if (bw > 0 && left >= bw) - System.Console.CursorLeft = bw - 1; + if (bufferWidth > 0 && left >= bufferWidth) + System.Console.CursorLeft = bufferWidth - 1; } if (top < 0) @@ -124,11 +123,11 @@ namespace OpenSim.Framework.Console } else { - int bh = System.Console.BufferHeight; + int bufferHeight = System.Console.BufferHeight; // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) - if (bh > 0 && top >= bh) - top = bh - 1; + if (bufferHeight > 0 && top >= bufferHeight) + top = bufferHeight - 1; } System.Console.CursorTop = top; @@ -160,10 +159,10 @@ namespace OpenSim.Framework.Console } else { - int bh = System.Console.BufferHeight; + int bufferHeight = System.Console.BufferHeight; // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) - if (bh > 0 && top >= bh) - System.Console.CursorTop = bh - 1; + if (bufferHeight > 0 && top >= bufferHeight) + System.Console.CursorTop = bufferHeight - 1; } if (left < 0) @@ -172,11 +171,11 @@ namespace OpenSim.Framework.Console } else { - int bw = System.Console.BufferWidth; + int bufferWidth = System.Console.BufferWidth; // On Mono 2.4.2.3 (and possibly above), the buffer value is sometimes erroneously zero (Mantis 4657) - if (bw > 0 && left >= bw) - left = bw - 1; + if (bufferWidth > 0 && left >= bufferWidth) + left = bufferWidth - 1; } System.Console.CursorLeft = left; @@ -186,31 +185,30 @@ namespace OpenSim.Framework.Console private void Show() { - lock (cmdline) + lock (m_commandLine) { - if (y == -1 || System.Console.BufferWidth == 0) + if (m_cursorYPosition == -1 || System.Console.BufferWidth == 0) return; - int xc = prompt.Length + cp; + int xc = prompt.Length + m_cursorXPosition; int new_x = xc % System.Console.BufferWidth; - int new_y = y + xc / System.Console.BufferWidth; - int end_y = y + (cmdline.Length + prompt.Length) / System.Console.BufferWidth; - if (end_y / System.Console.BufferWidth >= h) - h++; + int new_y = m_cursorYPosition + xc / System.Console.BufferWidth; + int end_y = m_cursorYPosition + (m_commandLine.Length + prompt.Length) / System.Console.BufferWidth; + if (end_y >= System.Console.BufferHeight) // wrap { - y--; + m_cursorYPosition--; new_y--; SetCursorLeft(0); SetCursorTop(System.Console.BufferHeight - 1); System.Console.WriteLine(" "); } - y = SetCursorTop(y); + m_cursorYPosition = SetCursorTop(m_cursorYPosition); SetCursorLeft(0); - if (echo) - System.Console.Write("{0}{1}", prompt, cmdline); + if (m_echo) + System.Console.Write("{0}{1}", prompt, m_commandLine); else System.Console.Write("{0}", prompt); @@ -221,20 +219,20 @@ namespace OpenSim.Framework.Console public override void LockOutput() { - Monitor.Enter(cmdline); + Monitor.Enter(m_commandLine); try { - if (y != -1) + if (m_cursorYPosition != -1) { - y = SetCursorTop(y); + m_cursorYPosition = SetCursorTop(m_cursorYPosition); System.Console.CursorLeft = 0; - int count = cmdline.Length + prompt.Length; + int count = m_commandLine.Length + prompt.Length; while (count-- > 0) System.Console.Write(" "); - y = SetCursorTop(y); + m_cursorYPosition = SetCursorTop(m_cursorYPosition); SetCursorLeft(0); } } @@ -245,12 +243,12 @@ namespace OpenSim.Framework.Console public override void UnlockOutput() { - if (y != -1) + if (m_cursorYPosition != -1) { - y = System.Console.CursorTop; + m_cursorYPosition = System.Console.CursorTop; Show(); } - Monitor.Exit(cmdline); + Monitor.Exit(m_commandLine); } private void WriteColorText(ConsoleColor color, string sender) @@ -317,29 +315,29 @@ namespace OpenSim.Framework.Console public override void Output(string text, string level) { - lock (cmdline) + lock (m_commandLine) { - if (y == -1) + if (m_cursorYPosition == -1) { WriteLocalText(text, level); return; } - y = SetCursorTop(y); + m_cursorYPosition = SetCursorTop(m_cursorYPosition); SetCursorLeft(0); - int count = cmdline.Length + prompt.Length; + int count = m_commandLine.Length + prompt.Length; while (count-- > 0) System.Console.Write(" "); - y = SetCursorTop(y); + m_cursorYPosition = SetCursorTop(m_cursorYPosition); SetCursorLeft(0); WriteLocalText(text, level); - y = System.Console.CursorTop; + m_cursorYPosition = System.Console.CursorTop; Show(); } @@ -347,9 +345,9 @@ namespace OpenSim.Framework.Console private bool ContextHelp() { - string[] words = Parser.Parse(cmdline.ToString()); + string[] words = Parser.Parse(m_commandLine.ToString()); - bool trailingSpace = cmdline.ToString().EndsWith(" "); + bool trailingSpace = m_commandLine.ToString().EndsWith(" "); // Allow ? through while typing a URI // @@ -368,19 +366,18 @@ namespace OpenSim.Framework.Console public override string ReadLine(string p, bool isCommand, bool e) { - h = 1; - cp = 0; + m_cursorXPosition = 0; prompt = p; - echo = e; - int historyLine = history.Count; + m_echo = e; + int historyLine = m_history.Count; SetCursorLeft(0); // Needed for mono System.Console.Write(" "); // Needed for mono - lock (cmdline) + lock (m_commandLine) { - y = System.Console.CursorTop; - cmdline.Remove(0, cmdline.Length); + m_cursorYPosition = System.Console.CursorTop; + m_commandLine.Remove(0, m_commandLine.Length); } while (true) @@ -388,92 +385,95 @@ namespace OpenSim.Framework.Console Show(); ConsoleKeyInfo key = System.Console.ReadKey(true); - char c = key.KeyChar; + char enteredChar = key.KeyChar; - if (!Char.IsControl(c)) + if (!Char.IsControl(enteredChar)) { - if (cp >= 318) + if (m_cursorXPosition >= 318) continue; - if (c == '?' && isCommand) + if (enteredChar == '?' && isCommand) { if (ContextHelp()) continue; } - cmdline.Insert(cp, c); - cp++; + m_commandLine.Insert(m_cursorXPosition, enteredChar); + m_cursorXPosition++; } else { switch (key.Key) { case ConsoleKey.Backspace: - if (cp == 0) + if (m_cursorXPosition == 0) break; - cmdline.Remove(cp-1, 1); - cp--; + m_commandLine.Remove(m_cursorXPosition-1, 1); + m_cursorXPosition--; SetCursorLeft(0); - y = SetCursorTop(y); + m_cursorYPosition = SetCursorTop(m_cursorYPosition); - System.Console.Write("{0}{1} ", prompt, cmdline); + if (m_echo) + System.Console.Write("{0}{1} ", prompt, m_commandLine); + else + System.Console.Write("{0}", prompt); break; case ConsoleKey.End: - cp = cmdline.Length; + m_cursorXPosition = m_commandLine.Length; break; case ConsoleKey.Home: - cp = 0; + m_cursorXPosition = 0; break; case ConsoleKey.UpArrow: if (historyLine < 1) break; historyLine--; LockOutput(); - cmdline.Remove(0, cmdline.Length); - cmdline.Append(history[historyLine]); - cp = cmdline.Length; + m_commandLine.Remove(0, m_commandLine.Length); + m_commandLine.Append(m_history[historyLine]); + m_cursorXPosition = m_commandLine.Length; UnlockOutput(); break; case ConsoleKey.DownArrow: - if (historyLine >= history.Count) + if (historyLine >= m_history.Count) break; historyLine++; LockOutput(); - if (historyLine == history.Count) + if (historyLine == m_history.Count) { - cmdline.Remove(0, cmdline.Length); + m_commandLine.Remove(0, m_commandLine.Length); } else { - cmdline.Remove(0, cmdline.Length); - cmdline.Append(history[historyLine]); + m_commandLine.Remove(0, m_commandLine.Length); + m_commandLine.Append(m_history[historyLine]); } - cp = cmdline.Length; + m_cursorXPosition = m_commandLine.Length; UnlockOutput(); break; case ConsoleKey.LeftArrow: - if (cp > 0) - cp--; + if (m_cursorXPosition > 0) + m_cursorXPosition--; break; case ConsoleKey.RightArrow: - if (cp < cmdline.Length) - cp++; + if (m_cursorXPosition < m_commandLine.Length) + m_cursorXPosition++; break; case ConsoleKey.Enter: SetCursorLeft(0); - y = SetCursorTop(y); + m_cursorYPosition = SetCursorTop(m_cursorYPosition); System.Console.WriteLine(); //Show(); - lock (cmdline) + lock (m_commandLine) { - y = -1; + m_cursorYPosition = -1; } - string commandLine = cmdline.ToString(); + string commandLine = m_commandLine.ToString(); if (isCommand) { @@ -481,12 +481,12 @@ namespace OpenSim.Framework.Console if (cmd.Length != 0) { - int i; + int index; - for (i=0 ; i < cmd.Length ; i++) + for (index=0 ; index < cmd.Length ; index++) { - if (cmd[i].Contains(" ")) - cmd[i] = "\"" + cmd[i] + "\""; + if (cmd[index].Contains(" ")) + cmd[index] = "\"" + cmd[index] + "\""; } AddToHistory(String.Join(" ", cmd)); return String.Empty; @@ -494,7 +494,7 @@ namespace OpenSim.Framework.Console } // If we're not echoing to screen (e.g. a password) then we probably don't want it in history - if (echo && commandLine != "") + if (m_echo && commandLine != "") AddToHistory(commandLine); return commandLine; diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index ee3d6b6fde..f02543d3eb 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -53,8 +53,7 @@ namespace OpenSim.Framework public delegate ISceneEntity RezSingleAttachmentFromInv(IClientAPI remoteClient, UUID itemID, uint AttachmentPt); - public delegate void RezMultipleAttachmentsFromInv(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, - RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects); + public delegate void RezMultipleAttachmentsFromInv(IClientAPI remoteClient, List> rezlist ); public delegate void ObjectAttach( IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent); @@ -940,7 +939,7 @@ namespace OpenSim.Framework event ScriptReset OnScriptReset; event GetScriptRunning OnGetScriptRunning; event SetScriptRunning OnSetScriptRunning; - event Action OnAutoPilotGo; + event Action OnAutoPilotGo; event TerrainUnacked OnUnackedTerrain; event ActivateGesture OnActivateGesture; diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs index 8f7a2e5b4e..e0cb897e40 100644 --- a/OpenSim/Framework/IScene.cs +++ b/OpenSim/Framework/IScene.cs @@ -33,15 +33,12 @@ namespace OpenSim.Framework { public delegate void restart(RegionInfo thisRegion); - //public delegate void regionup (RegionInfo thisRegion); - public enum RegionStatus : int { Down = 0, Up = 1, Crashed = 2, Starting = 3, - SlaveScene = 4 }; /// diff --git a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs index 0aae4ff353..8332c14478 100644 --- a/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs +++ b/OpenSim/Framework/RegionLoader/Filesystem/RegionLoaderFileSystem.cs @@ -48,11 +48,13 @@ namespace OpenSim.Framework.RegionLoader.Filesystem public RegionInfo[] LoadRegions() { string regionConfigPath = Path.Combine(Util.configDir(), "Regions"); + bool allowRegionless = false; try { IConfig startupConfig = (IConfig)m_configSource.Configs["Startup"]; regionConfigPath = startupConfig.GetString("regionload_regionsdir", regionConfigPath).Trim(); + allowRegionless = startupConfig.GetBoolean("allow_regionless", false); } catch (Exception) { @@ -68,7 +70,7 @@ namespace OpenSim.Framework.RegionLoader.Filesystem string[] iniFiles = Directory.GetFiles(regionConfigPath, "*.ini"); // Create an empty Regions.ini if there are no existing config files. - if (configFiles.Length == 0 && iniFiles.Length == 0) + if (!allowRegionless && configFiles.Length == 0 && iniFiles.Length == 0) { new RegionInfo("DEFAULT REGION CONFIG", Path.Combine(regionConfigPath, "Regions.ini"), false, m_configSource); iniFiles = Directory.GetFiles(regionConfigPath, "*.ini"); diff --git a/OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs b/OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs index f0ffc2c577..c7caf6feb4 100644 --- a/OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs +++ b/OpenSim/Framework/RegionLoader/Web/RegionLoaderWebServer.cs @@ -60,6 +60,8 @@ namespace OpenSim.Framework.RegionLoader.Web { IConfig startupConfig = (IConfig) m_configSource.Configs["Startup"]; string url = startupConfig.GetString("regionload_webserver_url", String.Empty).Trim(); + bool allowRegionless = startupConfig.GetBoolean("allow_regionless", false); + if (url == String.Empty) { m_log.Error("[WEBLOADER]: Unable to load webserver URL - URL was empty."); @@ -67,39 +69,60 @@ namespace OpenSim.Framework.RegionLoader.Web } else { - while (tries > 0) - { - HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url); - webRequest.Timeout = 30000; //30 Second Timeout - m_log.Debug("[WEBLOADER]: Sending Download Request..."); - HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse(); - m_log.Debug("[WEBLOADER]: Downloading Region Information From Remote Server..."); - StreamReader reader = new StreamReader(webResponse.GetResponseStream()); - string xmlSource = String.Empty; - string tempStr = reader.ReadLine(); - while (tempStr != null) - { - xmlSource = xmlSource + tempStr; - tempStr = reader.ReadLine(); - } - m_log.Debug("[WEBLOADER]: Done downloading region information from server. Total Bytes: " + - xmlSource.Length); - XmlDocument xmlDoc = new XmlDocument(); - xmlDoc.LoadXml(xmlSource); - if (xmlDoc.FirstChild.Name == "Regions") - { - RegionInfo[] regionInfos = new RegionInfo[xmlDoc.FirstChild.ChildNodes.Count]; - int i; - for (i = 0; i < xmlDoc.FirstChild.ChildNodes.Count; i++) - { - m_log.Debug(xmlDoc.FirstChild.ChildNodes[i].OuterXml); - regionInfos[i] = - new RegionInfo("REGION CONFIG #" + (i + 1), xmlDoc.FirstChild.ChildNodes[i],false,m_configSource); - } + while(tries > 0) + { + RegionInfo[] regionInfos = new RegionInfo[] {}; + int regionCount = 0; + HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create(url); + webRequest.Timeout = 30000; //30 Second Timeout + m_log.DebugFormat("[WEBLOADER]: Sending download request to {0}", url); - if (i > 0) - return regionInfos; - } + try + { + HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse(); + m_log.Debug("[WEBLOADER]: Downloading region information..."); + StreamReader reader = new StreamReader(webResponse.GetResponseStream()); + string xmlSource = String.Empty; + string tempStr = reader.ReadLine(); + while (tempStr != null) + { + xmlSource = xmlSource + tempStr; + tempStr = reader.ReadLine(); + } + m_log.Debug("[WEBLOADER]: Done downloading region information from server. Total Bytes: " + + xmlSource.Length); + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.LoadXml(xmlSource); + if (xmlDoc.FirstChild.Name == "Regions") + { + regionCount = xmlDoc.FirstChild.ChildNodes.Count; + + if (regionCount > 0) + { + regionInfos = new RegionInfo[regionCount]; + int i; + for (i = 0; i < xmlDoc.FirstChild.ChildNodes.Count; i++) + { + m_log.Debug(xmlDoc.FirstChild.ChildNodes[i].OuterXml); + regionInfos[i] = + new RegionInfo("REGION CONFIG #" + (i + 1), xmlDoc.FirstChild.ChildNodes[i],false,m_configSource); + } + } + } + } + catch (WebException ex) + { + if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound) + { + if (!allowRegionless) + throw ex; + } + else + throw ex; + } + + if (regionCount > 0 | allowRegionless) + return regionInfos; m_log.Debug("[WEBLOADER]: Request yielded no regions."); tries--; @@ -108,8 +131,10 @@ namespace OpenSim.Framework.RegionLoader.Web m_log.Debug("[WEBLOADER]: Retrying"); System.Threading.Thread.Sleep(wait); } - } - return null; + } + + m_log.Error("[WEBLOADER]: No region configs were available."); + return null; } } } diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index c0d65ac511..a6bdc2d58c 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -442,7 +442,7 @@ namespace OpenSim.Framework.Servers.HttpServer string path = request.RawUrl; string handlerKey = GetHandlerKey(request.HttpMethod, path); - //m_log.DebugFormat("[BASE HTTP SERVER]: Handling {0} request for {1}", request.HttpMethod, path); +// m_log.DebugFormat("[BASE HTTP SERVER]: Handling {0} request for {1}", request.HttpMethod, path); if (TryGetStreamHandler(handlerKey, out requestHandler)) { diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 92ccb06925..9d3a1cd492 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -210,10 +210,6 @@ namespace OpenSim /// private void RegisterConsoleCommands() { - m_console.Commands.AddCommand("region", false, "clear assets", - "clear assets", - "Clear the asset cache", HandleClearAssets); - m_console.Commands.AddCommand("region", false, "force update", "force update", "Force the update of all objects on clients", @@ -509,11 +505,6 @@ namespace OpenSim } } - private void HandleClearAssets(string module, string[] args) - { - MainConsole.Instance.Output("Not implemented."); - } - /// /// Force resending of all updates to all clients in active region(s) /// diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index dd0ea67731..77f38ed96c 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -41,11 +41,15 @@ using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; using OpenSim.Framework.Statistics; using OpenSim.Region.ClientStack; +using OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts; using OpenSim.Region.Framework; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Physics.Manager; -using OpenSim.Server.Base; +using OpenSim.Server.Base; +using OpenSim.Services.Base; +using OpenSim.Services.Interfaces; +using OpenSim.Services.UserAccountService; namespace OpenSim { @@ -411,6 +415,9 @@ namespace OpenSim scene.SnmpService.BootInfo("Loading prins", scene); } + while (regionInfo.EstateSettings.EstateOwner == UUID.Zero && MainConsole.Instance != null) + SetUpEstateOwner(scene); + // Prims have to be loaded after module configuration since some modules may be invoked during the load scene.LoadPrimsFromStorage(regionInfo.originRegionID); @@ -494,6 +501,64 @@ namespace OpenSim return clientServer; } + /// + /// Try to set up the estate owner for the given scene. + /// + /// + /// The involves asking the user for information about the user on the console. If the user does not already + /// exist then it is created. + /// + /// + private void SetUpEstateOwner(Scene scene) + { + RegionInfo regionInfo = scene.RegionInfo; + + MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", regionInfo.EstateSettings.EstateName); + List excluded = new List(new char[1]{' '}); + string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); + string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); + + UserAccount account = scene.UserAccountService.GetUserAccount(regionInfo.ScopeID, first, last); + + if (account == null) + { + + // XXX: The LocalUserAccountServicesConnector is currently registering its inner service rather than + // itself! +// if (scene.UserAccountService is LocalUserAccountServicesConnector) +// { +// IUserAccountService innerUas +// = ((LocalUserAccountServicesConnector)scene.UserAccountService).UserAccountService; +// +// m_log.DebugFormat("B {0}", innerUas.GetType()); +// +// if (innerUas is UserAccountService) +// { + + if (scene.UserAccountService is UserAccountService) + { + string password = MainConsole.Instance.PasswdPrompt("Password"); + string email = MainConsole.Instance.CmdPrompt("Email", ""); + + account + = ((UserAccountService)scene.UserAccountService).CreateUser( + regionInfo.ScopeID, first, last, password, email); + } +// } + } + + if (account == null) + { + m_log.ErrorFormat( + "[OPENSIM]: Unable to store account. If this simulator is connected to a grid, you must create the estate owner account first."); + } + else + { + regionInfo.EstateSettings.EstateOwner = account.PrincipalID; + regionInfo.EstateSettings.Save(); + } + } + private void ShutdownRegion(Scene scene) { m_log.DebugFormat("[SHUTDOWN]: Shutting down region {0}", scene.RegionInfo.RegionName); diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index 139d8b8902..8d0c7a153a 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -179,9 +179,10 @@ namespace OpenSim.Region.ClientStack.Linden { Queue queue = GetQueue(avatarID); if (queue != null) - queue.Enqueue(ev); + lock (queue) + queue.Enqueue(ev); } - catch(NullReferenceException e) + catch (NullReferenceException e) { m_log.Error("[EVENTQUEUE] Caught exception: " + e); return false; @@ -338,12 +339,8 @@ namespace OpenSim.Region.ClientStack.Linden Queue queue = GetQueue(agentID); if (queue != null) lock (queue) - { - if (queue.Count > 0) - return true; - else - return false; - } + return queue.Count > 0; + return false; } @@ -358,8 +355,6 @@ namespace OpenSim.Region.ClientStack.Linden element = queue.Dequeue(); // 15s timeout } - - int thisID = 0; lock (m_ids) thisID = m_ids[pAgentId]; @@ -431,7 +426,10 @@ namespace OpenSim.Region.ClientStack.Linden // } Queue queue = TryGetQueue(agentID); - OSD element = queue.Dequeue(); // 15s timeout + OSD element; + + lock (queue) + element = queue.Dequeue(); // 15s timeout Hashtable responsedata = new Hashtable(); @@ -470,10 +468,14 @@ namespace OpenSim.Region.ClientStack.Linden else { array.Add(element); - while (queue.Count > 0) + + lock (queue) { - array.Add(queue.Dequeue()); - thisID++; + while (queue.Count > 0) + { + array.Add(queue.Dequeue()); + thisID++; + } } } @@ -520,6 +522,7 @@ namespace OpenSim.Region.ClientStack.Linden AvatarID = m_QueueUUIDAvatarMapping[capUUID]; } } + if (AvatarID != UUID.Zero) { return ProcessQueue(request, AvatarID, m_scene.CapsModule.GetCapsForUser(AvatarID)); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index db81fea0a8..575e5a2929 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -232,7 +232,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event ScriptReset OnScriptReset; public event GetScriptRunning OnGetScriptRunning; public event SetScriptRunning OnSetScriptRunning; - public event Action OnAutoPilotGo; + public event Action OnAutoPilotGo; public event TerrainUnacked OnUnackedTerrain; public event ActivateGesture OnActivateGesture; public event DeactivateGesture OnDeactivateGesture; @@ -4173,8 +4173,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP while (updatesThisCall < m_maxUpdates) { lock (m_entityProps.SyncRoot) - if (!m_entityProps.TryDequeue(out iupdate, out timeinqueue)) - break; + if (!m_entityProps.TryDequeue(out iupdate, out timeinqueue)) + break; ObjectPropertyUpdate update = (ObjectPropertyUpdate)iupdate; if (update.SendFamilyProps) @@ -6145,9 +6145,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP RezMultipleAttachmentsFromInv handlerRezMultipleAttachments = OnRezMultipleAttachmentsFromInv; if (handlerRezMultipleAttachments != null) { - RezMultipleAttachmentsFromInvPacket rez = (RezMultipleAttachmentsFromInvPacket)Pack; - handlerRezMultipleAttachments(this, rez.HeaderData, - rez.ObjectData); + List> rezlist = new List>(); + foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in ((RezMultipleAttachmentsFromInvPacket)Pack).ObjectData) + rezlist.Add(new KeyValuePair(obj.ItemID, obj.AttachmentPt)); + handlerRezMultipleAttachments(this, rezlist); } return true; @@ -11756,9 +11757,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP locy = Convert.ToSingle(args[1]) - (float)regionY; locz = Convert.ToSingle(args[2]); - Action handlerAutoPilotGo = OnAutoPilotGo; + Action handlerAutoPilotGo = OnAutoPilotGo; if (handlerAutoPilotGo != null) - handlerAutoPilotGo(new Vector3(locx, locy, locz), false); + handlerAutoPilotGo(new Vector3(locx, locy, locz), false, false); } /// diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs index fead4d91d9..d5b061b1f1 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs @@ -929,25 +929,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP UUID sessionID = useCircuitCode.CircuitCode.SessionID; uint circuitCode = useCircuitCode.CircuitCode.Code; - if (m_scene.RegionStatus != RegionStatus.SlaveScene) + AuthenticateResponse sessionInfo; + if (IsClientAuthorized(useCircuitCode, out sessionInfo)) { - AuthenticateResponse sessionInfo; - if (IsClientAuthorized(useCircuitCode, out sessionInfo)) - { - AddClient(circuitCode, agentID, sessionID, remoteEndPoint, sessionInfo); - } - else - { - // Don't create circuits for unauthorized clients - m_log.WarnFormat( - "[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}", - useCircuitCode.CircuitCode.ID, useCircuitCode.CircuitCode.Code, remoteEndPoint); - } + AddClient(circuitCode, agentID, sessionID, remoteEndPoint, sessionInfo); } else { - // Slave regions don't accept new clients - m_log.Debug("[LLUDPSERVER]: Slave region " + m_scene.RegionInfo.RegionName + " ignoring UseCircuitCode packet"); + // Don't create circuits for unauthorized clients + m_log.WarnFormat( + "[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}", + useCircuitCode.CircuitCode.ID, useCircuitCode.CircuitCode.Code, remoteEndPoint); } } diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs index ff4ec4c476..eed7cd590a 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs @@ -41,14 +41,13 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction /// public class AgentAssetTransactions { -// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // Fields private bool m_dumpAssetsToFile; private Scene m_Scene; - public UUID UserID; - public Dictionary XferUploaders = - new Dictionary(); + private UUID UserID; + private Dictionary XferUploaders = new Dictionary(); // Methods public AgentAssetTransactions(UUID agentID, Scene scene, @@ -59,36 +58,94 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction m_dumpAssetsToFile = dumpAssetsToFile; } - public AssetXferUploader RequestXferUploader(UUID transactionID) + /// + /// Return a xfer uploader if one does not already exist. + /// + /// + /// + /// We must transfer the new asset ID into the uploader on creation, otherwise + /// we can see race conditions with other threads which can retrieve an item before it is updated with the new + /// asset id. + /// + /// + /// The xfer uploader requested. Null if one is already in existence. + /// FIXME: This is a bizarre thing to do, and is probably meant to signal an error condition if multiple + /// transfers are made. Needs to be corrected. + /// + public AssetXferUploader RequestXferUploader(UUID transactionID, UUID assetID) { - if (!XferUploaders.ContainsKey(transactionID)) + lock (XferUploaders) { - AssetXferUploader uploader = new AssetXferUploader(m_Scene, - m_dumpAssetsToFile); - - lock (XferUploaders) + if (!XferUploaders.ContainsKey(transactionID)) { - XferUploaders.Add(transactionID, uploader); - } + AssetXferUploader uploader = new AssetXferUploader(this, m_Scene, assetID, m_dumpAssetsToFile); - return uploader; +// m_log.DebugFormat( +// "[AGENT ASSETS TRANSACTIONS]: Adding asset xfer uploader {0} since it didn't previously exist", transactionID); + + XferUploaders.Add(transactionID, uploader); + + return uploader; + } } + + m_log.WarnFormat("[AGENT ASSETS TRANSACTIONS]: Ignoring request for asset xfer uploader {0} since it already exists", transactionID); + return null; } public void HandleXfer(ulong xferID, uint packetID, byte[] data) { + AssetXferUploader foundUploader = null; + lock (XferUploaders) { foreach (AssetXferUploader uploader in XferUploaders.Values) { +// m_log.DebugFormat( +// "[AGENT ASSETS TRANSACTIONS]: In HandleXfer, inspect xfer upload with xfer id {0}", +// uploader.XferID); + if (uploader.XferID == xferID) { - uploader.HandleXferPacket(xferID, packetID, data); + foundUploader = uploader; break; } } } + + if (foundUploader != null) + { +// m_log.DebugFormat( +// "[AGENT ASSETS TRANSACTIONS]: Found xfer uploader for xfer id {0}, packet id {1}, data length {2}", +// xferID, packetID, data.Length); + + foundUploader.HandleXferPacket(xferID, packetID, data); + } + else + { + m_log.ErrorFormat( + "[AGENT ASSET TRANSACTIONS]: Could not find uploader for xfer id {0}, packet id {1}, data length {2}", + xferID, packetID, data.Length); + } + } + + public bool RemoveXferUploader(UUID transactionID) + { + lock (XferUploaders) + { + bool removed = XferUploaders.Remove(transactionID); + + if (!removed) + m_log.WarnFormat( + "[AGENT ASSET TRANSACTIONS]: Received request to remove xfer uploader with transaction ID {0} but none found", + transactionID); +// else +// m_log.DebugFormat( +// "[AGENT ASSET TRANSACTIONS]: Removed xfer uploader with transaction ID {0}", transactionID); + + return removed; + } } public void RequestCreateInventoryItem(IClientAPI remoteClient, @@ -96,36 +153,43 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction string description, string name, sbyte invType, sbyte type, byte wearableType, uint nextOwnerMask) { - if (XferUploaders.ContainsKey(transactionID)) + AssetXferUploader uploader = null; + + lock (XferUploaders) { - XferUploaders[transactionID].RequestCreateInventoryItem( - remoteClient, transactionID, folderID, - callbackID, description, name, invType, type, - wearableType, nextOwnerMask); + if (XferUploaders.ContainsKey(transactionID)) + uploader = XferUploaders[transactionID]; } + + if (uploader != null) + uploader.RequestCreateInventoryItem( + remoteClient, transactionID, folderID, + callbackID, description, name, invType, type, + wearableType, nextOwnerMask); + else + m_log.ErrorFormat( + "[AGENT ASSET TRANSACTIONS]: Could not find uploader with transaction ID {0} when handling request to create inventory item {1} from {2}", + transactionID, name, remoteClient.Name); } - - /// /// Get an uploaded asset. If the data is successfully retrieved, /// the transaction will be removed. /// /// /// The asset if the upload has completed, null if it has not. - public AssetBase GetTransactionAsset(UUID transactionID) + private AssetBase GetTransactionAsset(UUID transactionID) { - if (XferUploaders.ContainsKey(transactionID)) + lock (XferUploaders) { - AssetXferUploader uploader = XferUploaders[transactionID]; - AssetBase asset = uploader.GetAssetData(); - - lock (XferUploaders) + if (XferUploaders.ContainsKey(transactionID)) { - XferUploaders.Remove(transactionID); - } + AssetXferUploader uploader = XferUploaders[transactionID]; + AssetBase asset = uploader.GetAssetData(); + RemoveXferUploader(transactionID); - return asset; + return asset; + } } return null; @@ -135,7 +199,15 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction SceneObjectPart part, UUID transactionID, TaskInventoryItem item) { - if (XferUploaders.ContainsKey(transactionID)) + AssetXferUploader uploader = null; + + lock (XferUploaders) + { + if (XferUploaders.ContainsKey(transactionID)) + uploader = XferUploaders[transactionID]; + } + + if (uploader != null) { AssetBase asset = GetTransactionAsset(transactionID); @@ -161,44 +233,34 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction m_Scene.AssetService.Store(asset); } } + else + { + m_log.ErrorFormat( + "[AGENT ASSET TRANSACTIONS]: Could not find uploader with transaction ID {0} when handling request to update task inventory item {1} in {2}", + transactionID, item.Name, part.Name); + } } public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID, InventoryItemBase item) { - if (XferUploaders.ContainsKey(transactionID)) + AssetXferUploader uploader = null; + + lock (XferUploaders) { -// m_log.DebugFormat("[XFER]: Asked to update item {0} ({1})", -// item.Name, item.ID); + if (XferUploaders.ContainsKey(transactionID)) + uploader = XferUploaders[transactionID]; + } - // Here we need to get the old asset to extract the - // texture UUIDs if it's a wearable. - if (item.AssetType == (int)AssetType.Bodypart || - item.AssetType == (int)AssetType.Clothing) - { - AssetBase oldAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); - if (oldAsset != null) - XferUploaders[transactionID].SetOldData(oldAsset.Data); - } - - AssetBase asset = GetTransactionAsset(transactionID); - - if (asset != null) - { - asset.FullID = UUID.Random(); - asset.Name = item.Name; - asset.Description = item.Description; - asset.Type = (sbyte)item.AssetType; - item.AssetID = asset.FullID; - - m_Scene.AssetService.Store(asset); - - IInventoryService invService = m_Scene.InventoryService; - invService.UpdateItem(item); - -// m_log.DebugFormat("[XFER]: Updated item {0} ({1}) with asset {2}", -// item.Name, item.ID, asset.FullID); - } + if (uploader != null) + { + uploader.RequestUpdateInventoryItem(remoteClient, transactionID, item); + } + else + { + m_log.ErrorFormat( + "[AGENT ASSET TRANSACTIONS]: Could not find uploader with transaction ID {0} when handling request to update inventory item {1} for {2}", + transactionID, item.Name, remoteClient.Name); } } } diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs index 82558de8a3..a28d5d7611 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetTransactionModule.cs @@ -172,11 +172,12 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction /// /// Update an inventory item with data that has been received through a /// transaction. - /// + /// + /// /// This is called when clothing or body parts are updated (for /// instance, with new textures or colours). It may also be called in /// other situations. - /// + /// /// /// /// @@ -184,14 +185,12 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction UUID transactionID, InventoryItemBase item) { // m_log.DebugFormat( -// "[TRANSACTIONS MANAGER] Called HandleItemUpdateFromTransaction with item {0}", +// "[ASSET TRANSACTION MODULE]: Called HandleItemUpdateFromTransaction with item {0}", // item.Name); - AgentAssetTransactions transactions = - GetUserTransactions(remoteClient.AgentId); + AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); - transactions.RequestUpdateInventoryItem(remoteClient, - transactionID, item); + transactions.RequestUpdateInventoryItem(remoteClient, transactionID, item); } /// @@ -255,11 +254,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction } } - AgentAssetTransactions transactions = - GetUserTransactions(remoteClient.AgentId); - - AssetXferUploader uploader = - transactions.RequestXferUploader(transaction); + AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); + AssetXferUploader uploader = transactions.RequestXferUploader(transaction, assetID); if (uploader != null) { @@ -279,9 +275,8 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction public void HandleXfer(IClientAPI remoteClient, ulong xferID, uint packetID, byte[] data) { - //m_log.Debug("xferID: " + xferID + " packetID: " + packetID + " data!"); - AgentAssetTransactions transactions = - GetUserTransactions(remoteClient.AgentId); +// m_log.Debug("xferID: " + xferID + " packetID: " + packetID + " data length " + data.Length); + AgentAssetTransactions transactions = GetUserTransactions(remoteClient.AgentId); transactions.HandleXfer(xferID, packetID, data); } diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs index a5dcdccf56..4cedfe6154 100644 --- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs +++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AssetXferUploader.cs @@ -48,11 +48,21 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction }; private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + /// + /// Reference to the object that holds this uploader. Used to remove ourselves from it's list if we + /// are performing a delayed update. + /// + AgentAssetTransactions m_transactions; + private AssetBase m_asset; private UUID InventFolder = UUID.Zero; private sbyte invType = 0; + private bool m_createItem = false; private uint m_createItemCallback = 0; + private bool m_updateItem = false; + private InventoryItemBase m_updateItemData; + private string m_description = String.Empty; private bool m_dumpAssetToFile; private bool m_finished = false; @@ -67,9 +77,11 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction public ulong XferID; private Scene m_Scene; - public AssetXferUploader(Scene scene, bool dumpAssetToFile) + public AssetXferUploader(AgentAssetTransactions transactions, Scene scene, UUID assetID, bool dumpAssetToFile) { + m_transactions = transactions; m_Scene = scene; + m_asset = new AssetBase() { FullID = assetID }; m_dumpAssetToFile = dumpAssetToFile; } @@ -82,6 +94,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction /// True if the transfer is complete, false otherwise or if the xferID was not valid public bool HandleXferPacket(ulong xferID, uint packetID, byte[] data) { +// m_log.DebugFormat( +// "[ASSET XFER UPLOADER]: Received packet {0} for xfer {1} (data length {2})", +// packetID, xferID, data.Length); + if (XferID == xferID) { if (m_asset.Data.Length > 1) @@ -116,16 +132,20 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction /// /// /// - /// True if the transfer is complete, false otherwise - public bool Initialise(IClientAPI remoteClient, UUID assetID, + public void Initialise(IClientAPI remoteClient, UUID assetID, UUID transaction, sbyte type, byte[] data, bool storeLocal, bool tempFile) { +// m_log.DebugFormat( +// "[ASSET XFER UPLOADER]: Initialised xfer from {0}, asset {1}, transaction {2}, type {3}, storeLocal {4}, tempFile {5}, already received data length {6}", +// remoteClient.Name, assetID, transaction, type, storeLocal, tempFile, data.Length); + ourClient = remoteClient; - m_asset = new AssetBase(assetID, "blank", type, - remoteClient.AgentId.ToString()); - m_asset.Data = data; + m_asset.Name = "blank"; m_asset.Description = "empty"; + m_asset.Type = type; + m_asset.CreatorID = remoteClient.AgentId.ToString(); + m_asset.Data = data; m_asset.Local = storeLocal; m_asset.Temporary = tempFile; @@ -135,21 +155,22 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction if (m_asset.Data.Length > 2) { SendCompleteMessage(); - return true; } else { RequestStartXfer(); } - - return false; } protected void RequestStartXfer() { XferID = Util.GetNextXferID(); - ourClient.SendXferRequest(XferID, m_asset.Type, m_asset.FullID, - 0, new byte[0]); + +// m_log.DebugFormat( +// "[ASSET XFER UPLOADER]: Requesting Xfer of asset {0}, type {1}, transfer id {2} from {3}", +// m_asset.FullID, m_asset.Type, XferID, ourClient.Name); + + ourClient.SendXferRequest(XferID, m_asset.Type, m_asset.FullID, 0, new byte[0]); } protected void SendCompleteMessage() @@ -157,18 +178,32 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction ourClient.SendAssetUploadCompleteMessage(m_asset.Type, true, m_asset.FullID); - m_finished = true; - if (m_createItem) + // We must lock in order to avoid a race with a separate thread dealing with an inventory item or create + // message from other client UDP. + lock (this) { - DoCreateItem(m_createItemCallback); - } - else if (m_storeLocal) - { - m_Scene.AssetService.Store(m_asset); + m_finished = true; + if (m_createItem) + { + DoCreateItem(m_createItemCallback); + } + else if (m_updateItem) + { + StoreAssetForItemUpdate(m_updateItemData); + + // Remove ourselves from the list of transactions if completion was delayed until the transaction + // was complete. + // TODO: Should probably do the same for create item. + m_transactions.RemoveXferUploader(TransactionID); + } + else if (m_storeLocal) + { + m_Scene.AssetService.Store(m_asset); + } } m_log.DebugFormat( - "[ASSET TRANSACTIONS]: Uploaded asset {0} for transaction {1}", + "[ASSET XFER UPLOADER]: Uploaded asset {0} for transaction {1}", m_asset.FullID, TransactionID); if (m_dumpAssetToFile) @@ -214,18 +249,66 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction m_asset.Description = description; m_asset.Type = type; + // We must lock to avoid a race with a separate thread uploading the asset. + lock (this) + { + if (m_finished) + { + DoCreateItem(callbackID); + } + else + { + m_createItem = true; //set flag so the inventory item is created when upload is complete + m_createItemCallback = callbackID; + } + } + } + } + + public void RequestUpdateInventoryItem(IClientAPI remoteClient, UUID transactionID, InventoryItemBase item) + { + // We must lock to avoid a race with a separate thread uploading the asset. + lock (this) + { + m_asset.Name = item.Name; + m_asset.Description = item.Description; + m_asset.Type = (sbyte)item.AssetType; + + // We must always store the item at this point even if the asset hasn't finished uploading, in order + // to avoid a race condition when the appearance module retrieves the item to set the asset id in + // the AvatarAppearance structure. + item.AssetID = m_asset.FullID; + m_Scene.InventoryService.UpdateItem(item); + if (m_finished) { - DoCreateItem(callbackID); + StoreAssetForItemUpdate(item); } else { - m_createItem = true; //set flag so the inventory item is created when upload is complete - m_createItemCallback = callbackID; +// m_log.DebugFormat( +// "[ASSET XFER UPLOADER]: Holding update inventory item request {0} for {1} pending completion of asset xfer for transaction {2}", +// item.Name, remoteClient.Name, transactionID); + + m_updateItem = true; + m_updateItemData = item; } } } + /// + /// Store the asset for the given item. + /// + /// + private void StoreAssetForItemUpdate(InventoryItemBase item) + { +// m_log.DebugFormat( +// "[ASSET XFER UPLOADER]: Storing asset {0} for earlier item update for {1} for {2}", +// m_asset.FullID, item.Name, ourClient.Name); + + m_Scene.AssetService.Store(m_asset); + } + private void DoCreateItem(uint callbackID) { ValidateAssets(); diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index a130ed2f6d..09781c7279 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -45,29 +45,47 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "AttachmentsModule")] public class AttachmentsModule : IAttachmentsModule, INonSharedRegionModule { + #region INonSharedRegionModule private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private Scene m_scene; private IDialogModule m_dialogModule; + + /// + /// Are attachments enabled? + /// + public bool Enabled { get; private set; } public string Name { get { return "Attachments Module"; } } public Type ReplaceableInterface { get { return null; } } - public void Initialise(IConfigSource source) {} + public void Initialise(IConfigSource source) + { + IConfig config = source.Configs["Attachments"]; + if (config != null) + Enabled = config.GetBoolean("Enabled", true); + else + Enabled = true; + } public void AddRegion(Scene scene) { m_scene = scene; m_dialogModule = m_scene.RequestModuleInterface(); m_scene.RegisterModuleInterface(this); - m_scene.EventManager.OnNewClient += SubscribeToClientEvents; + + if (Enabled) + m_scene.EventManager.OnNewClient += SubscribeToClientEvents; + // TODO: Should probably be subscribing to CloseClient too, but this doesn't yet give us IClientAPI } public void RemoveRegion(Scene scene) { m_scene.UnregisterModuleInterface(this); - m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; + + if (Enabled) + m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; } public void RegionLoaded(Scene scene) {} @@ -76,26 +94,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments { RemoveRegion(m_scene); } - - public void SubscribeToClientEvents(IClientAPI client) - { - client.OnRezSingleAttachmentFromInv += RezSingleAttachmentFromInventory; - client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachmentsFromInventory; - client.OnObjectAttach += AttachObject; - client.OnObjectDetach += DetachObject; - client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv; - client.OnObjectDrop += DetachSingleAttachmentToGround; - } - - public void UnsubscribeFromClientEvents(IClientAPI client) - { - client.OnRezSingleAttachmentFromInv -= RezSingleAttachmentFromInventory; - client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachmentsFromInventory; - client.OnObjectAttach -= AttachObject; - client.OnObjectDetach -= DetachObject; - client.OnDetachAttachmentIntoInv -= DetachSingleAttachmentToInv; - client.OnObjectDrop -= DetachSingleAttachmentToGround; - } + + #endregion + + #region IAttachmentsModule /// /// RezAttachments. This should only be called upon login on the first region. @@ -103,6 +105,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments /// public void RezAttachments(IScenePresence sp) { + if (!Enabled) + return; + if (null == sp.Appearance) { m_log.WarnFormat("[ATTACHMENTS MODULE]: Appearance has not been initialized for agent {0}", sp.UUID); @@ -133,7 +138,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments if (sp.PresenceType == PresenceType.Npc) RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p, null); else - RezSingleAttachmentFromInventory(sp.ControllingClient, attach.ItemID, p); + RezSingleAttachmentFromInventory(sp, attach.ItemID, p); } catch (Exception e) { @@ -146,13 +151,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments { // m_log.DebugFormat("[ATTACHMENTS MODULE]: Saving changed attachments for {0}", sp.Name); + if (!Enabled) + return; + foreach (SceneObjectGroup grp in sp.GetAttachments()) { // if (grp.HasGroupChanged) // Resizer scripts? // { grp.IsAttachment = false; grp.AbsolutePosition = grp.RootPart.AttachedPos; - UpdateKnownItem(sp.ControllingClient, grp); + UpdateKnownItem(sp, grp); grp.IsAttachment = true; // } } @@ -164,6 +172,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // "[ATTACHMENTS MODULE]: Deleting attachments from scene {0} for {1}, silent = {2}", // m_scene.RegionInfo.RegionName, sp.Name, silent); + if (!Enabled) + return; + foreach (SceneObjectGroup sop in sp.GetAttachments()) { sop.Scene.DeleteSceneObject(sop, silent); @@ -172,87 +183,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments sp.ClearAttachments(); } - /// - /// Called by client - /// - /// - /// - /// - /// - public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent) - { -// m_log.DebugFormat( -// "[ATTACHMENTS MODULE]: Attaching object local id {0} to {1} point {2} from ground (silent = {3})", -// objectLocalID, remoteClient.Name, AttachmentPt, silent); - - try - { - ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); - - if (sp == null) - { - m_log.ErrorFormat( - "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1}", remoteClient.Name, remoteClient.AgentId); - return; - } - - // If we can't take it, we can't attach it! - SceneObjectPart part = m_scene.GetSceneObjectPart(objectLocalID); - if (part == null) - return; - - if (!m_scene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId)) - { - remoteClient.SendAgentAlertMessage( - "You don't have sufficient permissions to attach this object", false); - - return; - } - - if (part.OwnerID != remoteClient.AgentId) // Not ours - { - remoteClient.SendAgentAlertMessage( - "You don't have sufficient permissions to attach this object", false); - return; - } - - // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should - // be removed when that functionality is implemented in opensim - AttachmentPt &= 0x7f; - - // Calls attach with a Zero position - if (AttachObject(sp, part.ParentGroup, AttachmentPt, false)) - { - m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); - - // Save avatar attachment information - m_log.Debug( - "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId - + ", AttachmentPoint: " + AttachmentPt); - - } - } - catch (Exception e) - { - m_log.ErrorFormat("[ATTACHMENTS MODULE]: exception upon Attach Object {0}{1}", e.Message, e.StackTrace); - } - } - - public bool AttachObject(IClientAPI remoteClient, SceneObjectGroup group, uint AttachmentPt, bool silent) - { - ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); - - if (sp == null) - { - m_log.ErrorFormat( - "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1}", remoteClient.Name, remoteClient.AgentId); - return false; - } - - return AttachObject(sp, group, AttachmentPt, silent); - } - - private bool AttachObject(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent) + public bool AttachObject(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent) { lock (sp.AttachmentsSyncLock) { @@ -313,7 +244,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments UUID oldAttachmentItemID = attachments[0].GetFromItemID(); if (oldAttachmentItemID != UUID.Zero) - DetachSingleAttachmentToInv(oldAttachmentItemID, sp); + DetachSingleAttachmentToInvInternal(sp, oldAttachmentItemID); else m_log.WarnFormat( "[ATTACHMENTS MODULE]: When detaching existing attachment {0} {1} at point {2} to make way for {3} {4} for {5}, couldn't find the associated item ID to adjust inventory attachment record!", @@ -323,7 +254,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // Add the new attachment to inventory if we don't already have it. UUID newAttachmentItemID = group.GetFromItemID(); if (newAttachmentItemID == UUID.Zero) - newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp.ControllingClient, group).ID; + newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID; ShowAttachInUserInventory(sp, attachmentPt, newAttachmentItemID, group); } @@ -334,55 +265,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments return true; } - public void RezMultipleAttachmentsFromInventory( - IClientAPI remoteClient, - RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, - RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects) + public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt) + { + return RezSingleAttachmentFromInventory(sp, itemID, AttachmentPt, true, null); + } + + public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc) { - ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); - - if (sp == null) - { - m_log.ErrorFormat( - "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1} in RezMultipleAttachmentsFromInventory()", - remoteClient.Name, remoteClient.AgentId); - return; - } - - lock (sp.AttachmentsSyncLock) - { -// m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing multiple attachments from inventory for {0}", sp.Name); - - foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects) - { - RezSingleAttachmentFromInventory(sp, obj.ItemID, obj.AttachmentPt); - } - } - } - - public ISceneEntity RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) - { - return RezSingleAttachmentFromInventory(remoteClient, itemID, AttachmentPt, true, null); - } - - public ISceneEntity RezSingleAttachmentFromInventory( - IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc) - { - ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); - - if (sp == null) - { - m_log.ErrorFormat( - "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1} in RezSingleAttachmentFromInventory()", - remoteClient.Name, remoteClient.AgentId); + if (!Enabled) return null; - } - return RezSingleAttachmentFromInventory(sp, itemID, AttachmentPt); - } - - public ISceneEntity RezSingleAttachmentFromInventory(ScenePresence sp, UUID itemID, uint AttachmentPt) - { // m_log.DebugFormat( // "[ATTACHMENTS MODULE]: RezSingleAttachmentFromInventory to point {0} from item {1} for {2}", // (AttachmentPoint)AttachmentPt, itemID, sp.Name); @@ -417,14 +309,393 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments return null; } - SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt, null); + SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt, doc); if (att == null) - DetachSingleAttachmentToInv(itemID, sp.ControllingClient); + DetachSingleAttachmentToInv(sp, itemID); return att; } + public void RezMultipleAttachmentsFromInventory(IScenePresence sp, List> rezlist) + { + if (!Enabled) + return; + + // m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing multiple attachments from inventory for {0}", sp.Name); + lock (sp.AttachmentsSyncLock) + { + foreach (KeyValuePair rez in rezlist) + { + RezSingleAttachmentFromInventory(sp, rez.Key, rez.Value); + } + } + } + + public void DetachSingleAttachmentToGround(IScenePresence sp, uint soLocalId) + { + if (!Enabled) + return; + +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: DetachSingleAttachmentToGround() for {0}, object {1}", +// sp.UUID, soLocalId); + + SceneObjectGroup so = m_scene.GetGroupByPrim(soLocalId); + + if (so == null) + return; + + if (so.AttachedAvatar != sp.UUID) + return; + + UUID inventoryID = so.GetFromItemID(); + +// m_log.DebugFormat( +// "[ATTACHMENTS MODULE]: In DetachSingleAttachmentToGround(), object is {0} {1}, associated item is {2}", +// so.Name, so.LocalId, inventoryID); + + lock (sp.AttachmentsSyncLock) + { + if (!m_scene.Permissions.CanRezObject( + so.PrimCount, sp.UUID, sp.AbsolutePosition)) + return; + + bool changed = sp.Appearance.DetachAttachment(inventoryID); + if (changed && m_scene.AvatarFactory != null) + m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID); + + sp.RemoveAttachment(so); + + SceneObjectPart rootPart = so.RootPart; + rootPart.FromItemID = UUID.Zero; + so.AbsolutePosition = sp.AbsolutePosition; + so.AttachedAvatar = UUID.Zero; + rootPart.SetParentLocalId(0); + so.ClearPartAttachmentData(); + rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive, m_scene.m_physicalPrim); + so.HasGroupChanged = true; + rootPart.Rezzed = DateTime.Now; + rootPart.RemFlag(PrimFlags.TemporaryOnRez); + so.AttachToBackup(); + m_scene.EventManager.TriggerParcelPrimCountTainted(); + rootPart.ScheduleFullUpdate(); + rootPart.ClearUndoState(); + + List uuids = new List(); + uuids.Add(inventoryID); + m_scene.InventoryService.DeleteItems(sp.UUID, uuids); + sp.ControllingClient.SendRemoveInventoryItem(inventoryID); + } + + m_scene.EventManager.TriggerOnAttach(so.LocalId, so.UUID, UUID.Zero); + } + + public void DetachSingleAttachmentToInv(IScenePresence sp, UUID itemID) + { + lock (sp.AttachmentsSyncLock) + { + // Save avatar attachment information + m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + sp.UUID + ", ItemID: " + itemID); + + bool changed = sp.Appearance.DetachAttachment(itemID); + if (changed && m_scene.AvatarFactory != null) + m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID); + + DetachSingleAttachmentToInvInternal(sp, itemID); + } + } + + public void UpdateAttachmentPosition(SceneObjectGroup sog, Vector3 pos) + { + if (!Enabled) + return; + + // First we save the + // attachment point information, then we update the relative + // positioning. Then we have to mark the object as NOT an + // attachment. This is necessary in order to correctly save + // and retrieve GroupPosition information for the attachment. + // Finally, we restore the object's attachment status. + uint attachmentPoint = sog.AttachmentPoint; + sog.UpdateGroupPosition(pos); + sog.IsAttachment = false; + sog.AbsolutePosition = sog.RootPart.AttachedPos; + sog.AttachmentPoint = attachmentPoint; + sog.HasGroupChanged = true; + } + + #endregion + + #region AttachmentModule private methods + + // This is public but is not part of the IAttachmentsModule interface. + // RegionCombiner module needs to poke at it to deliver client events. + // This breaks the encapsulation of the module and should get fixed somehow. + public void SubscribeToClientEvents(IClientAPI client) + { + client.OnRezSingleAttachmentFromInv += Client_OnRezSingleAttachmentFromInv; + client.OnRezMultipleAttachmentsFromInv += Client_OnRezMultipleAttachmentsFromInv; + client.OnObjectAttach += Client_OnObjectAttach; + client.OnObjectDetach += Client_OnObjectDetach; + client.OnDetachAttachmentIntoInv += Client_OnDetachAttachmentIntoInv; + client.OnObjectDrop += Client_OnObjectDrop; + } + + // This is public but is not part of the IAttachmentsModule interface. + // RegionCombiner module needs to poke at it to deliver client events. + // This breaks the encapsulation of the module and should get fixed somehow. + public void UnsubscribeFromClientEvents(IClientAPI client) + { + client.OnRezSingleAttachmentFromInv -= Client_OnRezSingleAttachmentFromInv; + client.OnRezMultipleAttachmentsFromInv -= Client_OnRezMultipleAttachmentsFromInv; + client.OnObjectAttach -= Client_OnObjectAttach; + client.OnObjectDetach -= Client_OnObjectDetach; + client.OnDetachAttachmentIntoInv -= Client_OnDetachAttachmentIntoInv; + client.OnObjectDrop -= Client_OnObjectDrop; + } + + /// + /// Update the attachment asset for the new sog details if they have changed. + /// + /// + /// This is essential for preserving attachment attributes such as permission. Unlike normal scene objects, + /// these details are not stored on the region. + /// + /// + /// + private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp) + { + if (grp.HasGroupChanged || grp.ContainsScripts()) + { + m_log.DebugFormat( + "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", + grp.UUID, grp.AttachmentPoint); + + string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); + + InventoryItemBase item = new InventoryItemBase(grp.GetFromItemID(), sp.UUID); + item = m_scene.InventoryService.GetItem(item); + + if (item != null) + { + AssetBase asset = m_scene.CreateAsset( + grp.GetPartName(grp.LocalId), + grp.GetPartDescription(grp.LocalId), + (sbyte)AssetType.Object, + Utils.StringToBytes(sceneObjectXml), + sp.UUID); + m_scene.AssetService.Store(asset); + + item.AssetID = asset.FullID; + item.Description = asset.Description; + item.Name = asset.Name; + item.AssetType = asset.Type; + item.InvType = (int)InventoryType.Object; + + m_scene.InventoryService.UpdateItem(item); + + // this gets called when the agent logs off! + if (sp.ControllingClient != null) + sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0); + } + } + else + { + m_log.DebugFormat( + "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", + grp.UUID, grp.AttachmentPoint); + } + } + + /// + /// Attach this scene object to the given avatar. + /// + /// + /// This isn't publicly available since attachments should always perform the corresponding inventory + /// operation (to show the attach in user inventory and update the asset with positional information). + /// + /// + /// + /// + /// + /// + private void AttachToAgent( + IScenePresence sp, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent) + { + // m_log.DebugFormat( + // "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", + // so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); + + so.DetachFromBackup(); + + // Remove from database and parcel prim count + m_scene.DeleteFromStorage(so.UUID); + m_scene.EventManager.TriggerParcelPrimCountTainted(); + + so.AttachedAvatar = sp.UUID; + + if (so.RootPart.PhysActor != null) + { + m_scene.PhysicsScene.RemovePrim(so.RootPart.PhysActor); + so.RootPart.PhysActor = null; + } + + so.AbsolutePosition = attachOffset; + so.RootPart.AttachedPos = attachOffset; + so.IsAttachment = true; + so.RootPart.SetParentLocalId(sp.LocalId); + so.AttachmentPoint = attachmentpoint; + + sp.AddAttachment(so); + + if (!silent) + { + so.IsSelected = false; // fudge.... + so.ScheduleGroupForFullUpdate(); + } + + // In case it is later dropped again, don't let + // it get cleaned up + so.RootPart.RemFlag(PrimFlags.TemporaryOnRez); + } + + /// + /// Add a scene object as a new attachment in the user inventory. + /// + /// + /// + /// The user inventory item created that holds the attachment. + private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IScenePresence sp, SceneObjectGroup grp) + { + // m_log.DebugFormat( + // "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}", + // grp.Name, grp.LocalId, remoteClient.Name); + + Vector3 inventoryStoredPosition = new Vector3 + (((grp.AbsolutePosition.X > (int)Constants.RegionSize) + ? (float)Constants.RegionSize - 6 + : grp.AbsolutePosition.X) + , + (grp.AbsolutePosition.Y > (int)Constants.RegionSize) + ? (float)Constants.RegionSize - 6 + : grp.AbsolutePosition.Y, + grp.AbsolutePosition.Z); + + Vector3 originalPosition = grp.AbsolutePosition; + + grp.AbsolutePosition = inventoryStoredPosition; + + // If we're being called from a script, then trying to serialize that same script's state will not complete + // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if + // the client/server crashes rather than logging out normally, the attachment's scripts will resume + // without state on relog. Arguably, this is what we want anyway. + string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, false); + + grp.AbsolutePosition = originalPosition; + + AssetBase asset = m_scene.CreateAsset( + grp.GetPartName(grp.LocalId), + grp.GetPartDescription(grp.LocalId), + (sbyte)AssetType.Object, + Utils.StringToBytes(sceneObjectXml), + sp.UUID); + + m_scene.AssetService.Store(asset); + + InventoryItemBase item = new InventoryItemBase(); + item.CreatorId = grp.RootPart.CreatorID.ToString(); + item.CreatorData = grp.RootPart.CreatorData; + item.Owner = sp.UUID; + item.ID = UUID.Random(); + item.AssetID = asset.FullID; + item.Description = asset.Description; + item.Name = asset.Name; + item.AssetType = asset.Type; + item.InvType = (int)InventoryType.Object; + + InventoryFolderBase folder = m_scene.InventoryService.GetFolderForType(sp.UUID, AssetType.Object); + if (folder != null) + item.Folder = folder.ID; + else // oopsies + item.Folder = UUID.Zero; + + if ((sp.UUID != grp.RootPart.OwnerID) && m_scene.Permissions.PropagatePermissions()) + { + item.BasePermissions = grp.RootPart.NextOwnerMask; + item.CurrentPermissions = grp.RootPart.NextOwnerMask; + item.NextPermissions = grp.RootPart.NextOwnerMask; + item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; + item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; + } + else + { + item.BasePermissions = grp.RootPart.BaseMask; + item.CurrentPermissions = grp.RootPart.OwnerMask; + item.NextPermissions = grp.RootPart.NextOwnerMask; + item.EveryOnePermissions = grp.RootPart.EveryoneMask; + item.GroupPermissions = grp.RootPart.GroupMask; + } + item.CreationDate = Util.UnixTimeSinceEpoch(); + + // sets itemID so client can show item as 'attached' in inventory + grp.SetFromItemID(item.ID); + + if (m_scene.AddInventoryItem(item)) + { + sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0); + } + else + { + if (m_dialogModule != null) + m_dialogModule.SendAlertToUser(sp.ControllingClient, "Operation failed"); + } + + return item; + } + + // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. + // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? + private void DetachSingleAttachmentToInvInternal(IScenePresence sp, UUID itemID) + { + // m_log.DebugFormat("[ATTACHMENTS MODULE]: Detaching item {0} to inventory for {1}", itemID, sp.Name); + + if (itemID == UUID.Zero) // If this happened, someone made a mistake.... + return; + + // We can NOT use the dictionries here, as we are looking + // for an entity by the fromAssetID, which is NOT the prim UUID + EntityBase[] detachEntities = m_scene.GetEntities(); + SceneObjectGroup group; + + lock (sp.AttachmentsSyncLock) + { + foreach (EntityBase entity in detachEntities) + { + if (entity is SceneObjectGroup) + { + group = (SceneObjectGroup)entity; + if (group.GetFromItemID() == itemID) + { + m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); + sp.RemoveAttachment(group); + + // Prepare sog for storage + group.AttachedAvatar = UUID.Zero; + group.RootPart.SetParentLocalId(0); + group.IsAttachment = false; + group.AbsolutePosition = group.RootPart.AttachedPos; + + UpdateKnownItem(sp, group); + m_scene.DeleteSceneObject(group, false); + + return; + } + } + } + } + } + protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc) { @@ -519,13 +790,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments /// /// /// - private void ShowAttachInUserInventory( - IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) + private void ShowAttachInUserInventory(IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) { -// m_log.DebugFormat( -// "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", -// att.Name, sp.Name, AttachmentPt, itemID); - + // m_log.DebugFormat( + // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", + // att.Name, sp.Name, AttachmentPt, itemID); + if (UUID.Zero == itemID) { m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment. Error inventory item ID."); @@ -538,383 +808,139 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments return; } - if (null == att.RootPart) - { - m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment for a prim without the rootpart!"); - return; - } InventoryItemBase item = new InventoryItemBase(itemID, sp.UUID); - - - - - - item = m_scene.InventoryService.GetItem(item); bool changed = sp.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID); if (changed && m_scene.AvatarFactory != null) m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID); } - public void DetachObject(uint objectLocalID, IClientAPI remoteClient) - { -// m_log.DebugFormat( -// "[ATTACHMENTS MODULE]: DetachObject() for object {0} on {1}", objectLocalID, remoteClient.Name); + #endregion - SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID); - if (group != null) - { - DetachSingleAttachmentToInv(group.GetFromItemID(), remoteClient); - } - } - - public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) + #region Client Event Handlers + + private ISceneEntity Client_OnRezSingleAttachmentFromInv(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) { - ScenePresence presence; - if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) + if (!Enabled) + return null; + + // m_log.DebugFormat( + // "[ATTACHMENTS MODULE]: Rezzing attachment to point {0} from item {1} for {2}", + // (AttachmentPoint)AttachmentPt, itemID, remoteClient.Name); + + ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); + + if (sp == null) { - lock (presence.AttachmentsSyncLock) + m_log.ErrorFormat( + "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1} in RezSingleAttachmentFromInventory()", + remoteClient.Name, remoteClient.AgentId); + return null; + } + + return RezSingleAttachmentFromInventory(sp, itemID, AttachmentPt); + } + + private void Client_OnRezMultipleAttachmentsFromInv(IClientAPI remoteClient, List> rezlist) + { + if (!Enabled) + return; + + ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); + if (sp != null) + RezMultipleAttachmentsFromInventory(sp, rezlist); + else + m_log.ErrorFormat( + "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1} in RezMultipleAttachmentsFromInventory()", + remoteClient.Name, remoteClient.AgentId); + } + + private void Client_OnObjectAttach(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent) + { + // m_log.DebugFormat( + // "[ATTACHMENTS MODULE]: Attaching object local id {0} to {1} point {2} from ground (silent = {3})", + // objectLocalID, remoteClient.Name, AttachmentPt, silent); + + if (!Enabled) + return; + + try + { + ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); + + if (sp == null) { + m_log.ErrorFormat( + "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1}", remoteClient.Name, remoteClient.AgentId); + return; + } + + // If we can't take it, we can't attach it! + SceneObjectPart part = m_scene.GetSceneObjectPart(objectLocalID); + if (part == null) + return; + + if (!m_scene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId)) + { + remoteClient.SendAgentAlertMessage( + "You don't have sufficient permissions to attach this object", false); + + return; + } + + // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should + // be removed when that functionality is implemented in opensim + AttachmentPt &= 0x7f; + + // Calls attach with a Zero position + if (AttachObject(sp, part.ParentGroup, AttachmentPt, false)) + { + m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); + // Save avatar attachment information - m_log.Debug("[ATTACHMENTS MODULE]: Detaching from UserID: " + remoteClient.AgentId + ", ItemID: " + itemID); + m_log.Debug( + "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + + ", AttachmentPoint: " + AttachmentPt); - bool changed = presence.Appearance.DetachAttachment(itemID); - if (changed && m_scene.AvatarFactory != null) - m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); - - DetachSingleAttachmentToInv(itemID, presence); } } + catch (Exception e) + { + m_log.ErrorFormat("[ATTACHMENTS MODULE]: exception upon Attach Object {0}{1}", e.Message, e.StackTrace); + } } - public void DetachSingleAttachmentToGround(uint soLocalId, IClientAPI remoteClient) + private void Client_OnObjectDetach(uint objectLocalID, IClientAPI remoteClient) { -// m_log.DebugFormat( -// "[ATTACHMENTS MODULE]: DetachSingleAttachmentToGround() for {0}, object {1}", -// remoteClient.Name, soLocalId); - - SceneObjectGroup so = m_scene.GetGroupByPrim(soLocalId); - - if (so == null) + if (!Enabled) return; - if (so.AttachedAvatar != remoteClient.AgentId) + ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); + SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID); + if (sp != null && group != null) + DetachSingleAttachmentToInv(sp, group.GetFromItemID()); + } + + private void Client_OnDetachAttachmentIntoInv(UUID itemID, IClientAPI remoteClient) + { + if (!Enabled) return; - UUID inventoryID = so.GetFromItemID(); - -// m_log.DebugFormat( -// "[ATTACHMENTS MODULE]: In DetachSingleAttachmentToGround(), object is {0} {1}, associated item is {2}", -// so.Name, so.LocalId, inventoryID); - - ScenePresence presence; - if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) - { - lock (presence.AttachmentsSyncLock) - { - if (!m_scene.Permissions.CanRezObject( - so.PrimCount, remoteClient.AgentId, presence.AbsolutePosition)) - return; - - bool changed = presence.Appearance.DetachAttachment(inventoryID); - if (changed && m_scene.AvatarFactory != null) - m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); - - presence.RemoveAttachment(so); - DetachSceneObjectToGround(so, presence); - - List uuids = new List(); - uuids.Add(inventoryID); - m_scene.InventoryService.DeleteItems(remoteClient.AgentId, uuids); - remoteClient.SendRemoveInventoryItem(inventoryID); - } - - m_scene.EventManager.TriggerOnAttach(so.LocalId, so.UUID, UUID.Zero); - } + ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); + if (sp != null) + DetachSingleAttachmentToInv(sp, itemID); } - /// - /// Detach the given scene object to the ground. - /// - /// - /// The caller has to take care of all the other work in updating avatar appearance, inventory, etc. - /// - /// The scene object to detach. - /// The scene presence from which the scene object is being detached. - private void DetachSceneObjectToGround(SceneObjectGroup so, ScenePresence sp) + private void Client_OnObjectDrop(uint soLocalId, IClientAPI remoteClient) { - SceneObjectPart rootPart = so.RootPart; - - rootPart.FromItemID = UUID.Zero; - so.AbsolutePosition = sp.AbsolutePosition; - so.AttachedAvatar = UUID.Zero; - rootPart.SetParentLocalId(0); - so.ClearPartAttachmentData(); - rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive, m_scene.m_physicalPrim); - so.HasGroupChanged = true; - rootPart.Rezzed = DateTime.Now; - rootPart.RemFlag(PrimFlags.TemporaryOnRez); - so.AttachToBackup(); - m_scene.EventManager.TriggerParcelPrimCountTainted(); - rootPart.ScheduleFullUpdate(); - rootPart.ClearUndoState(); - } - - // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. - // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? - private void DetachSingleAttachmentToInv(UUID itemID, IScenePresence sp) - { -// m_log.DebugFormat("[ATTACHMENTS MODULE]: Detaching item {0} to inventory for {1}", itemID, sp.Name); - - if (itemID == UUID.Zero) // If this happened, someone made a mistake.... + if (!Enabled) return; - // We can NOT use the dictionries here, as we are looking - // for an entity by the fromAssetID, which is NOT the prim UUID - EntityBase[] detachEntities = m_scene.GetEntities(); - SceneObjectGroup group; - - lock (sp.AttachmentsSyncLock) - { - foreach (EntityBase entity in detachEntities) - { - if (entity is SceneObjectGroup) - { - group = (SceneObjectGroup)entity; if (group.GetFromItemID() == itemID) { m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); - // CM / XMREngine!!!! Needed to conclude attach event - //SceneObjectSerializer.ToOriginalXmlFormat(group); - group.DetachToInventoryPrep(); - m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); - - // Prepare sog for storage - group.AttachedAvatar = UUID.Zero; - group.RootPart.SetParentLocalId(0); - group.IsAttachment = false; - group.AbsolutePosition = group.RootPart.AttachedPos; - - UpdateKnownItem(sp.ControllingClient, group); - m_scene.DeleteSceneObject(group, false); - - return; - } - } - } - } - } - - public void UpdateAttachmentPosition(SceneObjectGroup sog, Vector3 pos) - { - // First we save the - // attachment point information, then we update the relative - // positioning. Then we have to mark the object as NOT an - // attachment. This is necessary in order to correctly save - // and retrieve GroupPosition information for the attachment. - // Finally, we restore the object's attachment status. - uint attachmentPoint = sog.AttachmentPoint; - sog.UpdateGroupPosition(pos); - sog.IsAttachment = false; - sog.AbsolutePosition = sog.RootPart.AttachedPos; - sog.AttachmentPoint = attachmentPoint; - sog.HasGroupChanged = true; - } - - /// - /// Update the attachment asset for the new sog details if they have changed. - /// - /// - /// This is essential for preserving attachment attributes such as permission. Unlike normal scene objects, - /// these details are not stored on the region. - /// - /// - /// - private void UpdateKnownItem(IClientAPI remoteClient, SceneObjectGroup grp) - { - if (grp.HasGroupChanged || grp.ContainsScripts()) - { - m_log.DebugFormat( - "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", - grp.UUID, grp.AttachmentPoint); - - string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); - - InventoryItemBase item = new InventoryItemBase(grp.GetFromItemID(), remoteClient.AgentId); - item = m_scene.InventoryService.GetItem(item); - - if (item != null) - { - AssetBase asset = m_scene.CreateAsset( - grp.GetPartName(grp.LocalId), - grp.GetPartDescription(grp.LocalId), - (sbyte)AssetType.Object, - Utils.StringToBytes(sceneObjectXml), - remoteClient.AgentId); - m_scene.AssetService.Store(asset); - - item.AssetID = asset.FullID; - item.Description = asset.Description; - item.Name = asset.Name; - item.AssetType = asset.Type; - item.InvType = (int)InventoryType.Object; - - m_scene.InventoryService.UpdateItem(item); - - // this gets called when the agent logs off! - if (remoteClient != null) - remoteClient.SendInventoryItemCreateUpdate(item, 0); - } - } - else - { - m_log.DebugFormat( - "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", - grp.UUID, grp.AttachmentPoint); - } - } - - /// - /// Attach this scene object to the given avatar. - /// - /// - /// This isn't publicly available since attachments should always perform the corresponding inventory - /// operation (to show the attach in user inventory and update the asset with positional information). - /// - /// - /// - /// - /// - /// - private void AttachToAgent( - IScenePresence avatar, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent) - { -// m_log.DebugFormat( -// "[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", -// so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); - - so.DetachFromBackup(); - - // Remove from database and parcel prim count - m_scene.DeleteFromStorage(so.UUID); - m_scene.EventManager.TriggerParcelPrimCountTainted(); - - so.AttachedAvatar = avatar.UUID; - - if (so.RootPart.PhysActor != null) - { - m_scene.PhysicsScene.RemovePrim(so.RootPart.PhysActor); - so.RootPart.PhysActor = null; - } - - so.AbsolutePosition = attachOffset; - so.RootPart.AttachedPos = attachOffset; - so.IsAttachment = true; - so.RootPart.SetParentLocalId(avatar.LocalId); - so.AttachmentPoint = attachmentpoint; - - avatar.AddAttachment(so); - - if (!silent) - { - so.IsSelected = false; // fudge.... - so.ScheduleGroupForFullUpdate(); - } - - // In case it is later dropped again, don't let - // it get cleaned up - so.RootPart.RemFlag(PrimFlags.TemporaryOnRez); + ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); + if (sp != null) + DetachSingleAttachmentToGround(sp, soLocalId); } - /// - /// Add a scene object as a new attachment in the user inventory. - /// - /// - /// - /// The user inventory item created that holds the attachment. - private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IClientAPI remoteClient, SceneObjectGroup grp) - { -// m_log.DebugFormat( -// "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}", -// grp.Name, grp.LocalId, remoteClient.Name); - uint regionSize = Constants.RegionSize; //Avoid VS error "The operation overflows at compile time in checked mode" - Vector3 inventoryStoredPosition = new Vector3 - (((grp.AbsolutePosition.X > (int)Constants.RegionSize) - ? regionSize - 6 - : grp.AbsolutePosition.X) - , - (grp.AbsolutePosition.Y > (int)Constants.RegionSize) - ? regionSize - 6 - : grp.AbsolutePosition.Y, - grp.AbsolutePosition.Z); - - Vector3 originalPosition = grp.AbsolutePosition; - - grp.AbsolutePosition = inventoryStoredPosition; - - // If we're being called from a script, then trying to serialize that same script's state will not complete - // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if - // the client/server crashes rather than logging out normally, the attachment's scripts will resume - // without state on relog. Arguably, this is what we want anyway. - string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, false); - - grp.AbsolutePosition = originalPosition; - - AssetBase asset = m_scene.CreateAsset( - grp.GetPartName(grp.LocalId), - grp.GetPartDescription(grp.LocalId), - (sbyte)AssetType.Object, - Utils.StringToBytes(sceneObjectXml), - remoteClient.AgentId); - - m_scene.AssetService.Store(asset); - - InventoryItemBase item = new InventoryItemBase(); - item.CreatorId = grp.RootPart.CreatorID.ToString(); - item.CreatorData = grp.RootPart.CreatorData; - item.Owner = remoteClient.AgentId; - item.ID = UUID.Random(); - item.AssetID = asset.FullID; - item.Description = asset.Description; - item.Name = asset.Name; - item.AssetType = asset.Type; - item.InvType = (int)InventoryType.Object; - - InventoryFolderBase folder = m_scene.InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.Object); - if (folder != null) - item.Folder = folder.ID; - else // oopsies - item.Folder = UUID.Zero; - - if ((remoteClient.AgentId != grp.RootPart.OwnerID) && m_scene.Permissions.PropagatePermissions()) - { - item.BasePermissions = grp.RootPart.NextOwnerMask; - item.CurrentPermissions = grp.RootPart.NextOwnerMask; - item.NextPermissions = grp.RootPart.NextOwnerMask; - item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; - item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; - } - else - { - item.BasePermissions = grp.RootPart.BaseMask; - item.CurrentPermissions = grp.RootPart.OwnerMask; - item.NextPermissions = grp.RootPart.NextOwnerMask; - item.EveryOnePermissions = grp.RootPart.EveryoneMask; - item.GroupPermissions = grp.RootPart.GroupMask; - } - item.CreationDate = Util.UnixTimeSinceEpoch(); - - // sets itemID so client can show item as 'attached' in inventory - grp.SetFromItemID(item.ID); - - if (m_scene.AddInventoryItem(item)) - { - remoteClient.SendInventoryItemCreateUpdate(item, 0); - } - else - { - if (m_dialogModule != null) - m_dialogModule.SendAlertToUser(remoteClient, "Operation failed"); - } - - return item; - } + #endregion } -} \ No newline at end of file +} diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index ff3358f4fe..86cfb324dc 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs @@ -106,7 +106,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName).ParentGroup; - m_attMod.AttachObject(m_presence.ControllingClient, so, (uint)AttachmentPoint.Chest, false); + m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false); // Check status on scene presence Assert.That(m_presence.HasAttachments(), Is.True); @@ -140,7 +140,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object); m_attMod.RezSingleAttachmentFromInventory( - m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest); + m_presence, attItemId, (uint)AttachmentPoint.Chest); // Check scene presence status Assert.That(m_presence.HasAttachments(), Is.True); @@ -174,8 +174,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object); ISceneEntity so = m_attMod.RezSingleAttachmentFromInventory( - m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest); - m_attMod.DetachSingleAttachmentToGround(so.LocalId, m_presence.ControllingClient); + m_presence, attItemId, (uint)AttachmentPoint.Chest); + m_attMod.DetachSingleAttachmentToGround(m_presence, so.LocalId); // Check scene presence status Assert.That(m_presence.HasAttachments(), Is.False); @@ -208,8 +208,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object); m_attMod.RezSingleAttachmentFromInventory( - m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest); - m_attMod.DetachSingleAttachmentToInv(attItemId, m_presence.ControllingClient); + m_presence, attItemId, (uint)AttachmentPoint.Chest); + m_attMod.DetachSingleAttachmentToInv(m_presence, attItemId); // Check status on scene presence Assert.That(m_presence.HasAttachments(), Is.False); diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs index b6a156462e..d4e173663b 100644 --- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs @@ -64,15 +64,12 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory scene.RegisterModuleInterface(this); scene.EventManager.OnNewClient += NewClient; - if (config != null) + IConfig sconfig = config.Configs["Startup"]; + if (sconfig != null) { - IConfig sconfig = config.Configs["Startup"]; - if (sconfig != null) - { - m_savetime = Convert.ToInt32(sconfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime))); - m_sendtime = Convert.ToInt32(sconfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime))); - // m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime); - } + m_savetime = Convert.ToInt32(sconfig.GetString("DelayBeforeAppearanceSave",Convert.ToString(m_savetime))); + m_sendtime = Convert.ToInt32(sconfig.GetString("DelayBeforeAppearanceSend",Convert.ToString(m_sendtime))); + // m_log.InfoFormat("[AVFACTORY] configured for {0} save and {1} send",m_savetime,m_sendtime); } if (m_scene == null) @@ -211,8 +208,17 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory // Process the visual params, this may change height as well if (visualParams != null) { +// string[] visualParamsStrings = new string[visualParams.Length]; +// for (int i = 0; i < visualParams.Length; i++) +// visualParamsStrings[i] = visualParams[i].ToString(); +// m_log.DebugFormat( +// "[AVFACTORY]: Setting visual params for {0} to {1}", +// client.Name, string.Join(", ", visualParamsStrings)); + + float oldHeight = sp.Appearance.AvatarHeight; changed = sp.Appearance.SetVisualParams(visualParams); - if (sp.Appearance.AvatarHeight > 0) + + if (sp.Appearance.AvatarHeight != oldHeight && sp.Appearance.AvatarHeight > 0) sp.SetHeight(sp.Appearance.AvatarHeight); } @@ -416,6 +422,13 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory // m_log.WarnFormat("[AVFACTORY] avatar {0} save appearance",agentid); + // This could take awhile since it needs to pull inventory + // We need to do it at the point of save so that there is a sufficient delay for any upload of new body part/shape + // assets and item asset id changes to complete. + // I don't think we need to worry about doing this within m_setAppearanceLock since the queueing avoids + // multiple save requests. + SetAppearanceAssets(sp.UUID, sp.Appearance); + m_scene.AvatarService.SetAppearance(agentid, sp.Appearance); } @@ -467,7 +480,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory return; } - // m_log.WarnFormat("[AVFACTORY]: Received request for wearables of {0}", client.AgentId); +// m_log.DebugFormat("[AVFACTORY]: Received request for wearables of {0}", client.Name); client.SendWearables(sp.Appearance.Wearables, sp.Appearance.Serial++); } @@ -502,9 +515,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory avatAppearance.GetAssetsFrom(sp.Appearance); - // This could take awhile since it needs to pull inventory - SetAppearanceAssets(sp.UUID, ref avatAppearance); - lock (m_setAppearanceLock) { // Update only those fields that we have changed. This is important because the viewer @@ -538,7 +548,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory return true; } - private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance) + private void SetAppearanceAssets(UUID userID, AvatarAppearance appearance) { IInventoryService invService = m_scene.InventoryService; diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs index 7753c259b3..d2946922cd 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/HGMessageTransferModule.cs @@ -24,6 +24,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + using System; using System.Collections; using System.Collections.Generic; @@ -145,14 +146,14 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage scene.Entities[toAgentID] is ScenePresence) { // m_log.DebugFormat( -// "[INSTANT MESSAGE]: Looking for root agent {0} in {1}", +// "[HG INSTANT MESSAGE]: Looking for root agent {0} in {1}", // toAgentID.ToString(), scene.RegionInfo.RegionName); ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; if (!user.IsChildAgent) { // Local message -// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID); +// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to root agent {0} {1}", user.Name, toAgentID); user.ControllingClient.SendInstantMessage(im); // Message sent @@ -166,7 +167,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage foreach (Scene scene in m_Scenes) { // m_log.DebugFormat( -// "[INSTANT MESSAGE]: Looking for child of {0} in {1}", toAgentID, scene.RegionInfo.RegionName); +// "[HG INSTANT MESSAGE]: Looking for child of {0} in {1}", toAgentID, scene.RegionInfo.RegionName); if (scene.Entities.ContainsKey(toAgentID) && scene.Entities[toAgentID] is ScenePresence) @@ -174,7 +175,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage // Local message ScenePresence user = (ScenePresence) scene.Entities[toAgentID]; -// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID); +// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to child agent {0} {1}", user.Name, toAgentID); user.ControllingClient.SendInstantMessage(im); // Message sent @@ -183,7 +184,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage } } -// m_log.DebugFormat("[INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); +// m_log.DebugFormat("[HG INSTANT MESSAGE]: Delivering IM to {0} via XMLRPC", im.toAgentID); // Is the user a local user? UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, toAgentID); string url = string.Empty; diff --git a/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs b/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs index d687e6aa01..bc5c1ff2c2 100644 --- a/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Lure/HGLureModule.cs @@ -154,14 +154,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure if (im.dialog == (byte)InstantMessageDialog.RequestTeleport) { UUID sessionID = new UUID(im.imSessionID); - m_log.DebugFormat("[HG LURE MODULE]: RequestTeleport sessionID={0}, regionID={1}, message={2}", im.imSessionID, im.RegionID, im.message); - m_PendingLures.Add(sessionID, im, 7200); // 2 hours + + if (!m_PendingLures.Contains(sessionID)) + { + m_log.DebugFormat("[HG LURE MODULE]: RequestTeleport sessionID={0}, regionID={1}, message={2}", im.imSessionID, im.RegionID, im.message); + m_PendingLures.Add(sessionID, im, 7200); // 2 hours + } // Forward. We do this, because the IM module explicitly rejects // IMs of this type if (m_TransferModule != null) m_TransferModule.SendInstantMessage(im, delegate(bool success) { }); - } } @@ -177,12 +180,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Lure m_log.DebugFormat("[HG LURE MODULE]: TP invite with message {0}", message); + UUID sessionID = UUID.Random(); + GridInstantMessage m = new GridInstantMessage(scene, client.AgentId, client.FirstName+" "+client.LastName, targetid, (byte)InstantMessageDialog.RequestTeleport, false, - message, UUID.Random(), false, presence.AbsolutePosition, + message, sessionID, false, presence.AbsolutePosition, new Byte[0]); m.RegionID = client.Scene.RegionInfo.RegionID.Guid; + + m_log.DebugFormat("[HG LURE MODULE]: RequestTeleport sessionID={0}, regionID={1}, message={2}", m.imSessionID, m.RegionID, m.message); + m_PendingLures.Add(sessionID, m, 7200); // 2 hours if (m_TransferModule != null) { diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index f05b090b1e..dd6bdf7c11 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs @@ -150,7 +150,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess { if (!m_Enabled) return; - } #endregion diff --git a/OpenSim/Region/CoreModules/Scripting/LoadImageURL/LoadImageURLModule.cs b/OpenSim/Region/CoreModules/Scripting/LoadImageURL/LoadImageURLModule.cs index ed3e516631..6f839485ec 100644 --- a/OpenSim/Region/CoreModules/Scripting/LoadImageURL/LoadImageURLModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/LoadImageURL/LoadImageURLModule.cs @@ -112,10 +112,13 @@ namespace OpenSim.Region.CoreModules.Scripting.LoadImageURL public void PostInitialise() { - m_textureManager = m_scene.RequestModuleInterface(); - if (m_textureManager != null) + if (m_scene != null) { - m_textureManager.RegisterRender(GetContentType(), this); + m_textureManager = m_scene.RequestModuleInterface(); + if (m_textureManager != null) + { + m_textureManager.RegisterRender(GetContentType(), this); + } } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/RemoteAuthorizationServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/RemoteAuthorizationServiceConnector.cs index 003324fb14..86c0099c68 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/RemoteAuthorizationServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Authorization/RemoteAuthorizationServiceConnector.cs @@ -141,11 +141,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Authorization if (scene != null) { + string mail = String.Empty; + UserAccount account = scene.UserAccountService.GetUserAccount(UUID.Zero, new UUID(userID)); + //if account not found, we assume its a foreign visitor from HG, else use account data... + if (account != null) + { + mail = account.Email; + firstName = account.FirstName; + lastName = account.LastName; + } + isAuthorized = IsAuthorizedForRegion( - userID, firstName, lastName, account.Email, scene.RegionInfo.RegionName, regionID, out message); + userID, firstName, lastName, mail, scene.RegionInfo.RegionName, regionID, out message); } else { diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs index 1c83f8eb49..097ff1aded 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs @@ -185,15 +185,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public InventoryCollection GetFolderContent(UUID userID, UUID folderID) { InventoryCollection invCol = m_InventoryService.GetFolderContent(userID, folderID); - Util.FireAndForget(delegate + + if (UserManager != null) { - if (UserManager != null) + // Protect ourselves against the caller subsequently modifying the items list + List items = new List(invCol.Items); + + Util.FireAndForget(delegate { - // Protect ourselves against the caller subsequently modifying the items list - foreach (InventoryItemBase item in new List(invCol.Items)) + foreach (InventoryItemBase item in items) UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); - } - }); + }); + } return invCol; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs index c9c716cec7..73ab4e31cc 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs @@ -193,15 +193,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public InventoryCollection GetFolderContent(UUID userID, UUID folderID) { InventoryCollection invCol = m_RemoteConnector.GetFolderContent(userID, folderID); - Util.FireAndForget(delegate + + if (UserManager != null) { - if (UserManager != null) + // Protect ourselves against the caller subsequently modifying the items list + List items = new List(invCol.Items); + + Util.FireAndForget(delegate { - // Protect ourselves against the caller subsequently modifying the items list - foreach (InventoryItemBase item in new List(invCol.Items)) + foreach (InventoryItemBase item in items) UserManager.AddUser(item.CreatorIdAsUuid, item.CreatorData); - } - }); + }); + } return invCol; } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs index 535a63701d..1ffd480ab4 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/UserAccounts/LocalUserAccountServiceConnector.cs @@ -45,7 +45,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); - private IUserAccountService m_UserService; + /// + /// This is not on the IUserAccountService. It's only being used so that standalone scenes can punch through + /// to a local UserAccountService when setting up an estate manager. + /// + public IUserAccountService UserAccountService { get; private set; } + private UserAccountCache m_Cache; private bool m_Enabled = false; @@ -86,9 +91,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts } Object[] args = new Object[] { source }; - m_UserService = ServerUtils.LoadPlugin(serviceDll, args); + UserAccountService = ServerUtils.LoadPlugin(serviceDll, args); - if (m_UserService == null) + if (UserAccountService == null) { m_log.ErrorFormat( "[LOCAL USER ACCOUNT SERVICE CONNECTOR]: Cannot load user account service specified as {0}", serviceDll); @@ -119,7 +124,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts if (!m_Enabled) return; - scene.RegisterModuleInterface(m_UserService); + // FIXME: Why do we bother setting this module and caching up if we just end up registering the inner + // user account service?! + scene.RegisterModuleInterface(UserAccountService); scene.RegisterModuleInterface(m_Cache); } @@ -148,7 +155,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts if (inCache) return account; - account = m_UserService.GetUserAccount(scopeID, userID); + account = UserAccountService.GetUserAccount(scopeID, userID); m_Cache.Cache(userID, account); return account; @@ -161,7 +168,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts if (inCache) return account; - account = m_UserService.GetUserAccount(scopeID, firstName, lastName); + account = UserAccountService.GetUserAccount(scopeID, firstName, lastName); if (account != null) m_Cache.Cache(account.PrincipalID, account); @@ -170,7 +177,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts public UserAccount GetUserAccount(UUID scopeID, string Email) { - return m_UserService.GetUserAccount(scopeID, Email); + return UserAccountService.GetUserAccount(scopeID, Email); } public List GetUserAccountsWhere(UUID scopeID, string query) @@ -180,17 +187,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.UserAccounts public List GetUserAccounts(UUID scopeID, string query) { - return m_UserService.GetUserAccounts(scopeID, query); + return UserAccountService.GetUserAccounts(scopeID, query); } // Update all updatable fields // public bool StoreUserAccount(UserAccount data) { - return m_UserService.StoreUserAccount(data); + return UserAccountService.StoreUserAccount(data); } #endregion - } } diff --git a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs index 49e3236754..eb4731c44c 100644 --- a/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs +++ b/OpenSim/Region/CoreModules/World/Objects/BuySell/BuySellModule.cs @@ -101,7 +101,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell part.ParentGroup.HasGroupChanged = true; - part.GetProperties(client); + part.SendPropertiesToClient(client); } public bool BuyObject(IClientAPI remoteClient, UUID categoryID, uint localID, byte saleType, int salePrice) @@ -142,7 +142,7 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell part.SalePrice = 10; group.HasGroupChanged = true; - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); part.TriggerScriptChangedEvent(Changed.OWNER); group.ResumeScripts(); part.ScheduleFullUpdate(); diff --git a/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs b/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs deleted file mode 100644 index 7a0ce5121a..0000000000 --- a/OpenSim/Region/Examples/SimpleModule/ComplexObject.cs +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Collections.Generic; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.Framework.Scenes; - -namespace OpenSim.Region.Examples.SimpleModule -{ - public class ComplexObject : SceneObjectGroup - { - private readonly Quaternion m_rotationDirection; - - protected override bool InSceneBackup - { - get - { - return false; - } - } - - private class RotatingWheel : SceneObjectPart - { - private readonly Quaternion m_rotationDirection; - - public RotatingWheel() - { - } - - public RotatingWheel( - UUID ownerID, Vector3 groupPosition, Vector3 offsetPosition, Quaternion rotationDirection) - : base(ownerID, PrimitiveBaseShape.Default, groupPosition, Quaternion.Identity, offsetPosition) - { - m_rotationDirection = rotationDirection; - - Flags |= PrimFlags.Touch; - } - - public override void UpdateMovement() - { - UpdateRotation(RotationOffset * m_rotationDirection); - } - } - - public override void UpdateMovement() - { - UpdateGroupRotationR(GroupRotation * m_rotationDirection); - - base.UpdateMovement(); - } - - public ComplexObject() - { - } - - public ComplexObject(Scene scene, ulong regionHandle, UUID ownerID, uint localID, Vector3 pos) - : base(ownerID, pos, PrimitiveBaseShape.Default) - { - m_rotationDirection = new Quaternion(0.05f, 0.1f, 0.15f); - - AddPart( - new RotatingWheel(ownerID, pos, new Vector3(0, 0, 0.75f), - new Quaternion(0.05f, 0, 0))); - AddPart( - new RotatingWheel(ownerID, pos, new Vector3(0, 0, -0.75f), - new Quaternion(-0.05f, 0, 0))); - - AddPart( - new RotatingWheel(ownerID, pos, new Vector3(0, 0.75f, 0), - new Quaternion(0.5f, 0, 0.05f))); - AddPart( - new RotatingWheel(ownerID, pos, new Vector3(0, -0.75f, 0), - new Quaternion(-0.5f, 0, -0.05f))); - - AddPart( - new RotatingWheel(ownerID, pos, new Vector3(0.75f, 0, 0), - new Quaternion(0, 0.5f, 0.05f))); - AddPart( - new RotatingWheel(ownerID, pos, new Vector3(-0.75f, 0, 0), - new Quaternion(0, -0.5f, -0.05f))); - - RootPart.Flags |= PrimFlags.Touch; - } - - public override void OnGrabPart(SceneObjectPart part, Vector3 offsetPos, IClientAPI remoteClient) - { - m_parts.Remove(part.UUID); - - remoteClient.SendKillObject(m_regionHandle, new List() { part.LocalId} ); - remoteClient.AddMoney(1); - remoteClient.SendChatMessage("Poof!", 1, AbsolutePosition, "Party Party", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully); - } - - public override void OnGrabGroup(Vector3 offsetPos, IClientAPI remoteClient) - { - if (m_parts.Count == 1) - { - m_parts.Remove(m_rootPart.UUID); - m_scene.DeleteSceneObject(this, false); - remoteClient.SendKillObject(m_regionHandle, new List() { m_rootPart.LocalId }); - remoteClient.AddMoney(50); - remoteClient.SendChatMessage("KABLAM!!!", 1, AbsolutePosition, "Groupie Groupie", UUID.Zero, (byte)ChatSourceType.Object, (byte)ChatAudibleLevel.Fully); - } - } - } -} diff --git a/OpenSim/Region/Examples/SimpleModule/CpuCounterObject.cs b/OpenSim/Region/Examples/SimpleModule/CpuCounterObject.cs deleted file mode 100644 index 8669139279..0000000000 --- a/OpenSim/Region/Examples/SimpleModule/CpuCounterObject.cs +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Diagnostics; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.Framework.Scenes; - -namespace OpenSim.Region.Examples.SimpleModule -{ - public class CpuCounterObject : SceneObjectGroup - { - protected override bool InSceneBackup - { - get - { - return false; - } - } - - private PerformanceCounter m_counter; - - public CpuCounterObject(UUID ownerID, Vector3 pos) - : base(ownerID, pos, PrimitiveBaseShape.Default) - { - String objectName = "Processor"; - String counterName = "% Processor Time"; - String instanceName = "_Total"; - - m_counter = new PerformanceCounter(objectName, counterName, instanceName); - } - - public override void UpdateMovement() - { - float cpu = m_counter.NextValue()/40f; - Vector3 size = new Vector3(cpu, cpu, cpu); - - RootPart.Resize(size); - - base.UpdateMovement(); - } - } -} diff --git a/OpenSim/Region/Examples/SimpleModule/FileSystemObject.cs b/OpenSim/Region/Examples/SimpleModule/FileSystemObject.cs deleted file mode 100644 index f0f684c479..0000000000 --- a/OpenSim/Region/Examples/SimpleModule/FileSystemObject.cs +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.IO; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.Framework.Scenes; - -namespace OpenSim.Region.Examples.SimpleModule -{ - public class FileSystemObject : SceneObjectGroup - { - public FileSystemObject(FileInfo fileInfo, Vector3 pos) - : base(UUID.Zero, pos, PrimitiveBaseShape.Default) - { - Text = fileInfo.Name; - } - - protected override bool InSceneBackup - { - get - { - return false; - } - } - } -} diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs deleted file mode 100644 index 3b740e24e4..0000000000 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ /dev/null @@ -1,1172 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Net; -using OpenMetaverse; -using OpenMetaverse.Packets; -using OpenSim.Framework; -using OpenSim.Region.Framework.Scenes; - -namespace OpenSim.Region.Examples.SimpleModule -{ - public class MyNpcCharacter : IClientAPI - { - private uint movementFlag = 0; - private short flyState = 0; - private Quaternion bodyDirection = Quaternion.Identity; - private short count = 0; - private short frame = 0; - private Scene m_scene; - -// disable warning: public events, part of the public API -#pragma warning disable 67 - - public event Action OnLogout; - public event ObjectPermissions OnObjectPermissions; - - public event MoneyTransferRequest OnMoneyTransferRequest; - public event ParcelBuy OnParcelBuy; - public event Action OnConnectionClosed; - - public event ImprovedInstantMessage OnInstantMessage; - public event ChatMessage OnChatFromClient; - public event TextureRequest OnRequestTexture; - public event RezObject OnRezObject; - public event ModifyTerrain OnModifyTerrain; - public event BakeTerrain OnBakeTerrain; - public event SetAppearance OnSetAppearance; - public event AvatarNowWearing OnAvatarNowWearing; - public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv; - public event RezMultipleAttachmentsFromInv OnRezMultipleAttachmentsFromInv; - public event UUIDNameRequest OnDetachAttachmentIntoInv; - public event ObjectAttach OnObjectAttach; - public event ObjectDeselect OnObjectDetach; - public event ObjectDrop OnObjectDrop; - public event StartAnim OnStartAnim; - public event StopAnim OnStopAnim; - public event LinkObjects OnLinkObjects; - public event DelinkObjects OnDelinkObjects; - public event RequestMapBlocks OnRequestMapBlocks; - public event RequestMapName OnMapNameRequest; - public event TeleportLocationRequest OnTeleportLocationRequest; - public event TeleportLandmarkRequest OnTeleportLandmarkRequest; - public event DisconnectUser OnDisconnectUser; - public event RequestAvatarProperties OnRequestAvatarProperties; - public event SetAlwaysRun OnSetAlwaysRun; - public event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy; - public event DeRezObject OnDeRezObject; - public event Action OnRegionHandShakeReply; - public event GenericCall1 OnRequestWearables; - public event Action OnCompleteMovementToRegion; - public event UpdateAgent OnPreAgentUpdate; - public event UpdateAgent OnAgentUpdate; - public event AgentRequestSit OnAgentRequestSit; - public event AgentSit OnAgentSit; - public event AvatarPickerRequest OnAvatarPickerRequest; - public event Action OnRequestAvatarsData; - public event AddNewPrim OnAddPrim; - public event RequestGodlikePowers OnRequestGodlikePowers; - public event GodKickUser OnGodKickUser; - public event ObjectDuplicate OnObjectDuplicate; - public event GrabObject OnGrabObject; - public event DeGrabObject OnDeGrabObject; - public event MoveObject OnGrabUpdate; - public event SpinStart OnSpinStart; - public event SpinObject OnSpinUpdate; - public event SpinStop OnSpinStop; - public event ViewerEffectEventHandler OnViewerEffect; - - public event FetchInventory OnAgentDataUpdateRequest; - public event TeleportLocationRequest OnSetStartLocationRequest; - - public event UpdateShape OnUpdatePrimShape; - public event ObjectExtraParams OnUpdateExtraParams; - public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily; - public event ObjectRequest OnObjectRequest; - public event ObjectSelect OnObjectSelect; - public event GenericCall7 OnObjectDescription; - public event GenericCall7 OnObjectName; - public event GenericCall7 OnObjectClickAction; - public event GenericCall7 OnObjectMaterial; - public event UpdatePrimFlags OnUpdatePrimFlags; - public event UpdatePrimTexture OnUpdatePrimTexture; - public event UpdateVector OnUpdatePrimGroupPosition; - public event UpdateVector OnUpdatePrimSinglePosition; - public event UpdatePrimRotation OnUpdatePrimGroupRotation; - public event UpdatePrimSingleRotationPosition OnUpdatePrimSingleRotationPosition; - public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation; - public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation; - public event UpdateVector OnUpdatePrimScale; - public event UpdateVector OnUpdatePrimGroupScale; - public event StatusChange OnChildAgentStatus; - public event GenericCall2 OnStopMovement; - public event Action OnRemoveAvatar; - - public event CreateNewInventoryItem OnCreateNewInventoryItem; - public event LinkInventoryItem OnLinkInventoryItem; - public event CreateInventoryFolder OnCreateNewInventoryFolder; - public event UpdateInventoryFolder OnUpdateInventoryFolder; - public event MoveInventoryFolder OnMoveInventoryFolder; - public event RemoveInventoryFolder OnRemoveInventoryFolder; - public event RemoveInventoryItem OnRemoveInventoryItem; - public event FetchInventoryDescendents OnFetchInventoryDescendents; - public event PurgeInventoryDescendents OnPurgeInventoryDescendents; - public event FetchInventory OnFetchInventory; - public event RequestTaskInventory OnRequestTaskInventory; - public event UpdateInventoryItem OnUpdateInventoryItem; - public event CopyInventoryItem OnCopyInventoryItem; - public event MoveInventoryItem OnMoveInventoryItem; - public event UDPAssetUploadRequest OnAssetUploadRequest; - public event RequestTerrain OnRequestTerrain; - public event RequestTerrain OnUploadTerrain; - public event XferReceive OnXferReceive; - public event RequestXfer OnRequestXfer; - public event ConfirmXfer OnConfirmXfer; - public event AbortXfer OnAbortXfer; - public event RezScript OnRezScript; - public event UpdateTaskInventory OnUpdateTaskInventory; - public event MoveTaskInventory OnMoveTaskItem; - public event RemoveTaskInventory OnRemoveTaskItem; - public event RequestAsset OnRequestAsset; - public event GenericMessage OnGenericMessage; - public event UUIDNameRequest OnNameFromUUIDRequest; - public event UUIDNameRequest OnUUIDGroupNameRequest; - - public event ParcelPropertiesRequest OnParcelPropertiesRequest; - public event ParcelDivideRequest OnParcelDivideRequest; - public event ParcelJoinRequest OnParcelJoinRequest; - public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest; - public event ParcelAbandonRequest OnParcelAbandonRequest; - public event ParcelGodForceOwner OnParcelGodForceOwner; - public event ParcelReclaim OnParcelReclaim; - public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest; - public event ParcelAccessListRequest OnParcelAccessListRequest; - public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest; - public event ParcelSelectObjects OnParcelSelectObjects; - public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest; - public event ParcelDeedToGroup OnParcelDeedToGroup; - public event ObjectDeselect OnObjectDeselect; - public event RegionInfoRequest OnRegionInfoRequest; - public event EstateCovenantRequest OnEstateCovenantRequest; - public event EstateChangeInfo OnEstateChangeInfo; - - public event ObjectDuplicateOnRay OnObjectDuplicateOnRay; - - public event FriendActionDelegate OnApproveFriendRequest; - public event FriendActionDelegate OnDenyFriendRequest; - public event FriendshipTermination OnTerminateFriendship; - public event GrantUserFriendRights OnGrantUserRights; - - public event EconomyDataRequest OnEconomyDataRequest; - public event MoneyBalanceRequest OnMoneyBalanceRequest; - public event UpdateAvatarProperties OnUpdateAvatarProperties; - - public event ObjectIncludeInSearch OnObjectIncludeInSearch; - public event UUIDNameRequest OnTeleportHomeRequest; - - public event ScriptAnswer OnScriptAnswer; - public event RequestPayPrice OnRequestPayPrice; - public event ObjectSaleInfo OnObjectSaleInfo; - public event ObjectBuy OnObjectBuy; - public event BuyObjectInventory OnBuyObjectInventory; - public event AgentSit OnUndo; - public event AgentSit OnRedo; - public event LandUndo OnLandUndo; - - public event ForceReleaseControls OnForceReleaseControls; - - public event GodLandStatRequest OnLandStatRequest; - public event RequestObjectPropertiesFamily OnObjectGroupRequest; - - public event DetailedEstateDataRequest OnDetailedEstateDataRequest; - public event SetEstateFlagsRequest OnSetEstateFlagsRequest; - public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture; - public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture; - public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights; - public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest; - public event SetRegionTerrainSettings OnSetRegionTerrainSettings; - public event EstateRestartSimRequest OnEstateRestartSimRequest; - public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest; - public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest; - public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest; - public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest; - public event EstateDebugRegionRequest OnEstateDebugRegionRequest; - public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; - public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest; - public event ScriptReset OnScriptReset; - public event GetScriptRunning OnGetScriptRunning; - public event SetScriptRunning OnSetScriptRunning; - public event Action OnAutoPilotGo; - - public event TerrainUnacked OnUnackedTerrain; - - public event RegionHandleRequest OnRegionHandleRequest; - public event ParcelInfoRequest OnParcelInfoRequest; - - public event ActivateGesture OnActivateGesture; - public event DeactivateGesture OnDeactivateGesture; - public event ObjectOwner OnObjectOwner; - - public event DirPlacesQuery OnDirPlacesQuery; - public event DirFindQuery OnDirFindQuery; - public event DirLandQuery OnDirLandQuery; - public event DirPopularQuery OnDirPopularQuery; - public event DirClassifiedQuery OnDirClassifiedQuery; - public event EventInfoRequest OnEventInfoRequest; - public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime; - - public event MapItemRequest OnMapItemRequest; - - public event OfferCallingCard OnOfferCallingCard; - public event AcceptCallingCard OnAcceptCallingCard; - public event DeclineCallingCard OnDeclineCallingCard; - public event SoundTrigger OnSoundTrigger; - - public event StartLure OnStartLure; - public event TeleportLureRequest OnTeleportLureRequest; - public event NetworkStats OnNetworkStatsUpdate; - - public event ClassifiedInfoRequest OnClassifiedInfoRequest; - public event ClassifiedInfoUpdate OnClassifiedInfoUpdate; - public event ClassifiedDelete OnClassifiedDelete; - public event ClassifiedGodDelete OnClassifiedGodDelete; - - public event EventNotificationAddRequest OnEventNotificationAddRequest; - public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest; - public event EventGodDelete OnEventGodDelete; - - public event ParcelDwellRequest OnParcelDwellRequest; - public event UserInfoRequest OnUserInfoRequest; - public event UpdateUserInfo OnUpdateUserInfo; - - public event RetrieveInstantMessages OnRetrieveInstantMessages; - - public event PickDelete OnPickDelete; - public event PickGodDelete OnPickGodDelete; - public event PickInfoUpdate OnPickInfoUpdate; - public event AvatarNotesUpdate OnAvatarNotesUpdate; - - public event MuteListRequest OnMuteListRequest; - - public event AvatarInterestUpdate OnAvatarInterestUpdate; - - public event PlacesQuery OnPlacesQuery; - - public event FindAgentUpdate OnFindAgent; - public event TrackAgentUpdate OnTrackAgent; - public event NewUserReport OnUserReport; - public event SaveStateHandler OnSaveState; - public event GroupAccountSummaryRequest OnGroupAccountSummaryRequest; - public event GroupAccountDetailsRequest OnGroupAccountDetailsRequest; - public event GroupAccountTransactionsRequest OnGroupAccountTransactionsRequest; - public event FreezeUserUpdate OnParcelFreezeUser; - public event EjectUserUpdate OnParcelEjectUser; - public event ParcelBuyPass OnParcelBuyPass; - public event ParcelGodMark OnParcelGodMark; - public event GroupActiveProposalsRequest OnGroupActiveProposalsRequest; - public event GroupVoteHistoryRequest OnGroupVoteHistoryRequest; - public event SimWideDeletesDelegate OnSimWideDeletes; - public event SendPostcard OnSendPostcard; - public event MuteListEntryUpdate OnUpdateMuteListEntry; - public event MuteListEntryRemove OnRemoveMuteListEntry; - public event GodlikeMessage onGodlikeMessage; - public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate; - -#pragma warning restore 67 - - private UUID myID = UUID.Random(); - - public MyNpcCharacter(Scene scene) - { - - // startPos = new Vector3(128, (float)(Util.RandomClass.NextDouble()*100), 2); - m_scene = scene; - m_scene.EventManager.OnFrame += Update; - } - - private Vector3 startPos = new Vector3(128, 128, 30); - - public virtual Vector3 StartPos - { - get { return startPos; } - set { } - } - - public virtual UUID AgentId - { - get { return myID; } - } - - public UUID SessionId - { - get { return UUID.Zero; } - } - - public UUID SecureSessionId - { - get { return UUID.Zero; } - } - - public virtual string FirstName - { - get { return "Only"; } - } - - private string lastName = "Today" + Util.RandomClass.Next(1, 1000); - - public virtual string LastName - { - get { return lastName; } - } - - public virtual String Name - { - get { return FirstName + LastName; } - } - - public bool IsActive - { - get { return true; } - set { } - } - public bool IsLoggingOut - { - get { return false; } - set { } - } - public UUID ActiveGroupId - { - get { return UUID.Zero; } - } - - public string ActiveGroupName - { - get { return String.Empty; } - } - - public ulong ActiveGroupPowers - { - get { return 0; } - } - - public bool IsGroupMember(UUID groupID) - { - return false; - } - - public ulong GetGroupPowers(UUID groupID) - { - return 0; - } - - public virtual int NextAnimationSequenceNumber - { - get { return 1; } - } - - public IScene Scene - { - get { return m_scene; } - } - - public bool SendLogoutPacketWhenClosing - { - set { } - } - - public virtual void ActivateGesture(UUID assetId, UUID gestureId) - { - } - - public virtual void SendWearables(AvatarWearable[] wearables, int serial) - { - } - - public virtual void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry) - { - } - - public virtual void Kick(string message) - { - } - - public virtual void SendStartPingCheck(byte seq) - { - } - - public virtual void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List Data) - { - } - - public virtual void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle) - { - - } - - public virtual void SendKillObject(ulong regionHandle, List localID) - { - } - - public virtual void SetChildAgentThrottle(byte[] throttle) - { - } - public byte[] GetThrottlesPacked(float multiplier) - { - return new byte[0]; - } - - - public virtual void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs) - { - } - - public virtual void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName, - UUID fromAgentID, byte source, byte audible) - { - } - - public virtual void SendChatMessage(byte[] message, byte type, Vector3 fromPos, string fromName, - UUID fromAgentID, byte source, byte audible) - { - } - - public void SendInstantMessage(GridInstantMessage im) - { - - } - - public void SendGenericMessage(string method, List message) - { - } - - public void SendGenericMessage(string method, List message) - { - - } - - public virtual void SendLayerData(float[] map) - { - } - - public virtual void SendLayerData(int px, int py, float[] map) - { - } - public virtual void SendLayerData(int px, int py, float[] map, bool track) - { - } - - public virtual void SendWindData(Vector2[] windSpeeds) { } - - public virtual void SendCloudData(float[] cloudCover) { } - - public virtual void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look) - { - } - - public virtual void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint) - { - } - - public virtual AgentCircuitData RequestClientInfo() - { - return new AgentCircuitData(); - } - - public virtual void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, - IPEndPoint newRegionExternalEndPoint, string capsURL) - { - } - - public virtual void SendMapBlock(List mapBlocks, uint flag) - { - } - - public virtual void SendLocalTeleport(Vector3 position, Vector3 lookAt, uint flags) - { - } - - public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, - uint locationID, uint flags, string capsURL) - { - } - - public virtual void SendTeleportFailed(string reason) - { - } - - public virtual void SendTeleportStart(uint flags) - { - } - - public virtual void SendTeleportProgress(uint flags, string message) - { - } - - public virtual void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance) - { - } - - public virtual void SendPayPrice(UUID objectID, int[] payPrice) - { - } - - public virtual void SendCoarseLocationUpdate(List users, List CoarseLocations) - { - } - - public virtual void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels) - { - } - - public void SendAvatarDataImmediate(ISceneEntity avatar) - { - } - - public void SendPrimUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags) - { - } - - public void ReprioritizeUpdates() - { - } - - public void FlushPrimUpdates() - { - } - - public virtual void SendInventoryFolderDetails(UUID ownerID, UUID folderID, - List items, - List folders, - int version, - bool fetchFolders, - bool fetchItems) - { - } - - public virtual void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item) - { - } - - public virtual void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackID) - { - } - - public virtual void SendRemoveInventoryItem(UUID itemID) - { - } - - public virtual void SendBulkUpdateInventory(InventoryNodeBase node) - { - } - - public UUID GetDefaultAnimation(string name) - { - return UUID.Zero; - } - - public void SendTakeControls(int controls, bool passToAgent, bool TakeControls) - { - } - - public virtual void SendTaskInventory(UUID taskID, short serial, byte[] fileName) - { - } - - public virtual void SendXferPacket(ulong xferID, uint packet, byte[] data) - { - } - - public virtual void SendAbortXferPacket(ulong xferID) - { - - } - - - public virtual void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit, - int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor, - int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay, - int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent) - { - - } - public virtual void SendNameReply(UUID profileId, string firstname, string lastname) - { - } - - public virtual void SendPreLoadSound(UUID objectID, UUID ownerID, UUID soundID) - { - } - - public virtual void SendPlayAttachedSound(UUID soundID, UUID objectID, UUID ownerID, float gain, - byte flags) - { - } - - public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain) - { - } - - public void SendAttachedSoundGainChange(UUID objectID, float gain) - { - - } - - public void SendAlertMessage(string message) - { - } - - public void SendAgentAlertMessage(string message, bool modal) - { - } - - public void SendSystemAlertMessage(string message) - { - } - - public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message, - string url) - { - } - - public virtual void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args) - { - if (OnRegionHandShakeReply != null) - { - OnRegionHandShakeReply(this); - } - - if (OnCompleteMovementToRegion != null) - { - OnCompleteMovementToRegion(this, true); - } - } - public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) - { - } - - public void SendConfirmXfer(ulong xferID, uint PacketID) - { - } - - public void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName) - { - } - - public void SendInitiateDownload(string simFileName, string clientFileName) - { - } - - public void SendImageFirstPart(ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec) - { - } - - public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData) - { - } - - public void SendImageNotFound(UUID imageid) - { - } - - public void SendShutdownConnectionNotice() - { - } - - public void SendSimStats(SimStats stats) - { - } - - public void SendObjectPropertiesFamilyData(ISceneEntity Entity, uint RequestFlags) - { - - } - - public void SendObjectPropertiesReply(ISceneEntity entity) - { - } - - public void SendAgentOffline(UUID[] agentIDs) - { - - } - - public void SendAgentOnline(UUID[] agentIDs) - { - - } - - public void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot, - Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook) - { - } - - public void SendAdminResponse(UUID Token, uint AdminLevel) - { - - } - - public void SendGroupMembership(GroupMembershipData[] GroupMembership) - { - - } - - private void Update() - { - frame++; - if (frame > 20) - { - frame = 0; - if (OnAgentUpdate != null) - { - AgentUpdateArgs pack = new AgentUpdateArgs(); - pack.ControlFlags = movementFlag; - pack.BodyRotation = bodyDirection; - - OnAgentUpdate(this, pack); - } - if (flyState == 0) - { - movementFlag = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY | - (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; - flyState = 1; - } - else if (flyState == 1) - { - movementFlag = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY | - (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; - flyState = 2; - } - else - { - movementFlag = (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; - flyState = 0; - } - - if (count >= 10) - { - if (OnChatFromClient != null) - { - OSChatMessage args = new OSChatMessage(); - args.Message = "Hey You! Get out of my Home. This is my Region"; - args.Channel = 0; - args.From = FirstName + " " + LastName; - args.Scene = m_scene; - args.Position = new Vector3(128, 128, 26); - args.Sender = this; - args.Type = ChatTypeEnum.Shout; - - OnChatFromClient(this, args); - } - count = -1; - } - - count++; - } - } - - public bool AddMoney(int debit) - { - return false; - } - - public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong time, uint dlen, uint ylen, float phase) - { - } - - public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks) - { - } - - public void SendViewerTime(int phase) - { - } - - public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember, - string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, - UUID partnerID) - { - } - - public void SetDebugPacketLevel(int newDebug) - { - } - - public void InPacket(object NewPack) - { - } - - public void ProcessInPacket(Packet NewPack) - { - } - - public void Close() - { - Close(true); - } - - public void Close(bool sendStop) - { - } - - public void Start() - { - } - - public void Stop() - { - } - - private uint m_circuitCode; - - public uint CircuitCode - { - get { return m_circuitCode; } - set { m_circuitCode = value; } - } - - public IPEndPoint RemoteEndPoint - { - get { return new IPEndPoint(IPAddress.Loopback, (ushort)m_circuitCode); } - } - - public void SendBlueBoxMessage(UUID FromAvatarID, String FromAvatarName, String Message) - { - - } - public void SendLogoutPacket() - { - } - - public void Terminate() - { - } - - public EndPoint GetClientEP() - { - return null; - } - - public ClientInfo GetClientInfo() - { - return null; - } - - public void SetClientInfo(ClientInfo info) - { - } - - public void SendScriptQuestion(UUID objectID, string taskName, string ownerName, UUID itemID, int question) - { - } - public void SendHealth(float health) - { - } - - public void SendEstateList(UUID invoice, int code, UUID[] Data, uint estateID) - { - } - - public void SendBannedUserList(UUID invoice, EstateBan[] banlist, uint estateID) - { - } - - public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args) - { - } - - public void SendEstateCovenantInformation(UUID covenant) - { - } - - public void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner) - { - } - - public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags) - { - } - - public void SendLandAccessListData(List avatars, uint accessFlag, int localLandID) - { - } - - public void SendForceClientSelectObjects(List objectIDs) - { - } - - public void SendLandObjectOwners(LandData land, List groups, Dictionary ownersAndCount) - { - } - - public void SendCameraConstraint(Vector4 ConstraintPlane) - { - - } - - public void SendLandParcelOverlay(byte[] data, int sequence_id) - { - } - - public void SendParcelMediaCommand(uint flags, ParcelMediaCommandEnum command, float time) - { - } - - public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID, byte autoScale, string mediaType, - string mediaDesc, int mediaWidth, int mediaHeight, byte mediaLoop) - { - } - - public void SendGroupNameReply(UUID groupLLUID, string GroupName) - { - } - - public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia) - { - } - - public void SendScriptRunningReply(UUID objectID, UUID itemID, bool running) - { - } - - public void SendAsset(AssetRequestToClient req) - { - } - - public void SendTexture(AssetBase TextureAsset) - { - - } - - public void SendSetFollowCamProperties (UUID objectID, SortedDictionary parameters) - { - } - - public void SendClearFollowCamProperties (UUID objectID) - { - } - - public void SendRegionHandle (UUID regoinID, ulong handle) - { - } - - public void SendParcelInfo (RegionInfo info, LandData land, UUID parcelID, uint x, uint y) - { - } - - public void SetClientOption(string option, string value) - { - } - - public string GetClientOption(string option) - { - return string.Empty; - } - - public void SendScriptTeleportRequest(string objName, string simName, Vector3 pos, Vector3 lookAt) - { - } - - public void SendDirPlacesReply(UUID queryID, DirPlacesReplyData[] data) - { - } - - public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data) - { - } - - public void SendDirEventsReply(UUID queryID, DirEventsReplyData[] data) - { - } - - public void SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data) - { - } - - public void SendDirClassifiedReply(UUID queryID, DirClassifiedReplyData[] data) - { - } - - public void SendDirLandReply(UUID queryID, DirLandReplyData[] data) - { - } - - public void SendDirPopularReply(UUID queryID, DirPopularReplyData[] data) - { - } - - public void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags) - { - } - - public void KillEndDone() - { - } - - public void SendEventInfoReply (EventData info) - { - } - - public void SendOfferCallingCard (UUID destID, UUID transactionID) - { - } - - public void SendAcceptCallingCard (UUID transactionID) - { - } - - public void SendDeclineCallingCard (UUID transactionID) - { - } - - public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data) - { - } - - public void SendJoinGroupReply(UUID groupID, bool success) - { - } - - public void SendEjectGroupMemberReply(UUID agentID, UUID groupID, bool succss) - { - } - - public void SendLeaveGroupReply(UUID groupID, bool success) - { - } - - public void SendTerminateFriend(UUID exFriendID) - { - } - - #region IClientAPI Members - - - public bool AddGenericPacketHandler(string MethodName, GenericMessage handler) - { - return true; - } - - public void SendAvatarClassifiedReply(UUID targetID, UUID[] classifiedID, string[] name) - { - } - - public void SendClassifiedInfoReply(UUID classifiedID, UUID creatorID, uint creationDate, uint expirationDate, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, string simName, Vector3 globalPos, string parcelName, byte classifiedFlags, int price) - { - } - - public void SendAgentDropGroup(UUID groupID) - { - } - - public void SendAvatarNotesReply(UUID targetID, string text) - { - } - - public void SendAvatarPicksReply(UUID targetID, Dictionary picks) - { - } - - public void SendAvatarClassifiedReply(UUID targetID, Dictionary classifieds) - { - } - - public void SendParcelDwellReply(int localID, UUID parcelID, float dwell) - { - } - - public void SendUserInfoReply(bool imViaEmail, bool visible, string email) - { - } - - public void SendCreateGroupReply(UUID groupID, bool success, string message) - { - } - - public void RefreshGroupMembership() - { - } - - public void SendUseCachedMuteList() - { - } - - public void SendMuteListUpdate(string filename) - { - } - - public void SendPickInfoReply(UUID pickID,UUID creatorID, bool topPick, UUID parcelID, string name, string desc, UUID snapshotID, string user, string originalName, string simName, Vector3 posGlobal, int sortOrder, bool enabled) - { - } - #endregion - - public void SendRebakeAvatarTextures(UUID textureID) - { - } - - public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages) - { - } - - public void SendGroupAccountingDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt) - { - } - - public void SendGroupAccountingSummary(IClientAPI sender,UUID groupID, uint moneyAmt, int totalTier, int usedTier) - { - } - - public void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID,int amt) - { - } - - public void SendGroupVoteHistory(UUID groupID, UUID transactionID, GroupVoteHistory[] Votes) - { - } - - public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals) - { - } - - public void SendChangeUserRights(UUID agentID, UUID friendID, int rights) - { - } - - public void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId) - { - } - - public void StopFlying(ISceneEntity presence) - { - } - - public void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data) - { - } - } -} diff --git a/OpenSim/Region/Examples/SimpleModule/Properties/AssemblyInfo.cs b/OpenSim/Region/Examples/SimpleModule/Properties/AssemblyInfo.cs deleted file mode 100644 index 5e09adb007..0000000000 --- a/OpenSim/Region/Examples/SimpleModule/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Reflection; -using System.Runtime.InteropServices; - -// General information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("OpenSim.Region.Examples.SimpleModule")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("http://opensimulator.org")] -[assembly: AssemblyProduct("OpenSim.Region.Examples.SimpleModule")] -[assembly: AssemblyCopyright("Copyright (c) 2008")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f0caca77-7818-4a43-9200-0a8548009a05")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("0.6.5.*")] -[assembly: AssemblyVersion("0.6.5.*")] -[assembly: AssemblyFileVersion("0.6.5.0")] diff --git a/OpenSim/Region/Examples/SimpleModule/README.txt b/OpenSim/Region/Examples/SimpleModule/README.txt deleted file mode 100644 index 025e33dc7b..0000000000 --- a/OpenSim/Region/Examples/SimpleModule/README.txt +++ /dev/null @@ -1,9 +0,0 @@ -!!!IMPORTANT NOTE!!! - -This code snippet provided as an example of coding functional content with region modules. - -As of 13/3 2008 this module actually renders all regions within the instance unusable if enabled by dragging the dll from ./bin to global /bin. - -So, use at own peril and in dedicated instance. - -Peace. diff --git a/OpenSim/Region/Examples/SimpleModule/RegionModule.cs b/OpenSim/Region/Examples/SimpleModule/RegionModule.cs deleted file mode 100644 index 3b8ce379f0..0000000000 --- a/OpenSim/Region/Examples/SimpleModule/RegionModule.cs +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Collections.Generic; -using Nini.Config; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.Framework.Interfaces; -using OpenSim.Region.Framework.Scenes; - -namespace OpenSim.Region.Examples.SimpleModule -{ - /// - /// Example region module. - /// - /// - /// This is an old and unmaintained region module which uses the old style module interface. It is not loaded into - /// OpenSim by default. If you want to try enabling it, look in the bin folder of this project. - /// Please see the README.txt in this project on the filesystem for some more information. - /// Nonetheless, it may contain some useful example code so has been left here for now. - /// - /// You can see bare bones examples of the more modern region module system in OpenSim/Region/OptionalModules/Example - /// - public class RegionModule : IRegionModule - { - #region IRegionModule Members - - private Scene m_scene; - - public void Initialise(Scene scene, IConfigSource source) - { - m_scene = scene; - } - - public void PostInitialise() - { - // RegionInfo regionInfo = m_scene.RegionInfo; - - // Vector3 pos = new Vector3(110, 129, 27); - - //AddCpuCounter(regionInfo, pos); - // AddComplexObjects(regionInfo, pos); - AddAvatars(); - // AddFileSystemObjects(); - } - - // private void AddFileSystemObjects() - // { - // DirectoryInfo dirInfo = new DirectoryInfo("."); - - // float x = 0; - // float z = 0; - - // foreach (FileInfo fileInfo in dirInfo.GetFiles()) - // { - // Vector3 filePos = new Vector3(100 + x, 129, 27 + z); - // x = x + 2; - // if (x > 50) - // { - // x = 0; - // z = z + 2; - // } - - // FileSystemObject fileObject = new FileSystemObject(m_scene, fileInfo, filePos); - // m_scene.AddNewSceneObject(fileObject, true); - // } - // } - - private void AddAvatars() - { - for (int i = 0; i < 1; i++) - { - MyNpcCharacter m_character = new MyNpcCharacter(m_scene); - m_scene.AddNewClient(m_character, PresenceType.Npc); - m_scene.AgentCrossing(m_character.AgentId, Vector3.Zero, false); - } - - m_scene.ForEachScenePresence(delegate(ScenePresence sp) - { - if (!sp.IsChildAgent) - sp.AbsolutePosition = - new Vector3((float)Util.RandomClass.Next(100, 200), (float)Util.RandomClass.Next(30, 200), 2); - }); - } - - // private void AddComplexObjects(RegionInfo regionInfo, Vector3 pos) - // { - // int objs = 3; - - // for (int i = 0; i < (objs*objs*objs); i++) - // { - // Vector3 posOffset = new Vector3((i % objs) * 4, ((i % (objs*objs)) / (objs)) * 4, (i / (objs*objs)) * 4); - // ComplexObject complexObject = - // new ComplexObject(m_scene, regionInfo.RegionHandle, UUID.Zero, pos + posOffset); - // m_scene.AddNewSceneObject(complexObject, true); - // } - // } - - // private void AddCpuCounter(RegionInfo regionInfo, Vector3 pos) - // { - // SceneObjectGroup sceneObject = - // new CpuCounterObject(m_scene, regionInfo.RegionHandle, UUID.Zero, pos + new Vector3(1f, 1f, 1f)); - // m_scene.AddNewSceneObject(sceneObject, true); - // } - - public void Close() - { - m_scene = null; - } - - public string Name - { - get { return GetType().AssemblyQualifiedName; } - } - - public bool IsSharedModule - { - get { return false; } - } - - #endregion - } -} diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index d1b7dc1b24..a7770add85 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs @@ -27,8 +27,8 @@ using System; using System.Xml; +using System.Collections.Generic; using OpenMetaverse; -using OpenMetaverse.Packets; using OpenSim.Framework; using OpenSim.Region.Framework.Scenes; @@ -40,6 +40,7 @@ namespace OpenSim.Region.Framework.Interfaces /// RezAttachments. This should only be called upon login on the first region. /// Attachment rezzings on crossings and TPs are done in a different way. /// + /// void RezAttachments(IScenePresence sp); /// @@ -50,43 +51,21 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Delete all the presence's attachments from the scene - /// - /// /// This is done when a root agent leaves/is demoted to child (for instance, on logout, teleport or region cross). - /// + /// + /// /// void DeleteAttachmentsFromScene(IScenePresence sp, bool silent); - /// - /// Attach an object to an avatar from the world. - /// - /// - /// - /// - /// - /// - void AttachObject( - IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool silent); - /// /// Attach an object to an avatar /// - /// + /// /// /// /// /// true if the object was successfully attached, false otherwise - bool AttachObject( - IClientAPI remoteClient, SceneObjectGroup grp, uint AttachmentPt, bool silent); - - /// - /// Rez an attachment from user inventory and change inventory status to match. - /// - /// - /// - /// - /// The scene object that was attached. Null if the scene object could not be found - ISceneEntity RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt); + bool AttachObject(IScenePresence sp, SceneObjectGroup grp, uint AttachmentPt, bool silent); /// /// Rez an attachment from user inventory and change inventory status to match. @@ -95,51 +74,32 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// The scene object that was attached. Null if the scene object could not be found - ISceneEntity RezSingleAttachmentFromInventory(ScenePresence sp, UUID itemID, uint AttachmentPt); + ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt); // Same as above, but also load script states from a separate doc ISceneEntity RezSingleAttachmentFromInventory( - IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc); + IScenePresence presence, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc); /// /// Rez multiple attachments from a user's inventory /// - /// - /// - /// - void RezMultipleAttachmentsFromInventory( - IClientAPI remoteClient, - RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, - RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects); - - /// - /// Detach an object from the avatar. - /// - /// - /// This method is called in response to a client's detach request, so we only update the information in - /// inventory - /// - /// - /// - void DetachObject(uint objectLocalID, IClientAPI remoteClient); + /// + /// + void RezMultipleAttachmentsFromInventory(IScenePresence sp,List> rezlist); /// /// Detach the given item to the ground. /// + /// /// - /// - void DetachSingleAttachmentToGround(uint objectLocalID, IClientAPI remoteClient); + void DetachSingleAttachmentToGround(IScenePresence sp, uint objectLocalID); /// /// Detach the given item so that it remains in the user's inventory. /// - /// - /// A - /// - /// - /// A - /// - void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient); + /// /param> + /// + void DetachSingleAttachmentToInv(IScenePresence sp, UUID itemID); /// Update the position of an attachment. /// diff --git a/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs b/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs index 7066cf21e0..35cc220b17 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateDataService.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -48,6 +48,14 @@ namespace OpenSim.Region.Framework.Interfaces /// /// EstateSettings LoadEstateSettings(int estateID); + + /// + /// Create a new estate. + /// + /// + /// A + /// + EstateSettings CreateNewEstate(); /// /// Load/Get all estate settings. diff --git a/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs b/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs index d790a30b8a..8febb13d4d 100644 --- a/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs +++ b/OpenSim/Region/Framework/Interfaces/IEstateDataStore.cs @@ -54,6 +54,14 @@ namespace OpenSim.Region.Framework.Interfaces /// EstateSettings LoadEstateSettings(int estateID); + /// + /// Create a new estate. + /// + /// + /// A + /// + EstateSettings CreateNewEstate(); + /// /// Load/Get all estate settings. /// diff --git a/OpenSim/Region/Framework/Interfaces/IRegionModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionModule.cs index e25a6e86dd..2bb0c75b99 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionModule.cs @@ -35,7 +35,16 @@ namespace OpenSim.Region.Framework.Interfaces /// public interface IRegionModule { + /// + /// Initialize the module. + /// + /// + /// For a shared module this can be called multiple times - once per scene. + /// + /// + /// Configuration information. For a shared module this will be identical on every scene call void Initialise(Scene scene, IConfigSource source); + void PostInitialise(); void Close(); string Name { get; } diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 49251759fd..904a657a4f 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -181,8 +181,8 @@ TrySetMovementAnimation("STAND"); bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); bool heldLeft = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); bool heldRight = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); - //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; - //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; + bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; + bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; @@ -404,7 +404,17 @@ TrySetMovementAnimation("STAND"); else if (m_scenePresence.SetAlwaysRun) return "RUN"; else - return "WALK"; + { + // Not walking + if (move.Z < 0) + return "CROUCH"; + else if (heldTurnLeft) + return "TURNLEFT"; + else if (heldTurnRight) + return "TURNRIGHT"; + else + return "WALK"; + } } // rm for jumping else else if (!m_jumping) // add for jumping diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs index 088839d080..12688bdfae 100644 --- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs +++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs @@ -119,6 +119,11 @@ namespace OpenSim.Region.Framework.Scenes private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e) { m_log.Debug("[ASYNC DELETER]: Starting send to inventory loop"); + + // We must set appearance parameters in the en_US culture in order to avoid issues where values are saved + // in a culture where decimal points are commas and then reloaded in a culture which just treats them as + // number seperators. + Culture.SetCurrentCulture(); while (InventoryDeQueueAndDelete()) { diff --git a/OpenSim/Region/Framework/Scenes/EntityBase.cs b/OpenSim/Region/Framework/Scenes/EntityBase.cs index 213431a7df..680a4a3214 100644 --- a/OpenSim/Region/Framework/Scenes/EntityBase.cs +++ b/OpenSim/Region/Framework/Scenes/EntityBase.cs @@ -26,8 +26,10 @@ */ using System; +using System.Reflection; using System.Runtime.Serialization; using System.Security.Permissions; +using log4net; using OpenSim.Framework; using OpenMetaverse; @@ -35,6 +37,8 @@ namespace OpenSim.Region.Framework.Scenes { public abstract class EntityBase : ISceneEntity { + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + /// /// The scene to which this entity belongs /// @@ -71,12 +75,15 @@ namespace OpenSim.Region.Framework.Scenes protected Vector3 m_pos; /// - /// + /// Absolute position of this entity in a scene. /// public virtual Vector3 AbsolutePosition { get { return m_pos; } - set { m_pos = value; } + set + { + m_pos = value; + } } protected Vector3 m_velocity; @@ -107,11 +114,6 @@ namespace OpenSim.Region.Framework.Scenes m_name = "(basic entity)"; } - /// - /// - /// - public abstract void UpdateMovement(); - /// /// Performs any updates that need to be done at each frame, as opposed to immediately. /// These included scheduled updates and updates that occur due to physics processing. diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index c2ec5d01f6..53f0f2e09a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -261,7 +261,7 @@ namespace OpenSim.Region.Framework.Scenes item.AssetID = asset.FullID; group.UpdateInventoryItem(item); - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); // Trigger rerunning of script (use TriggerRezScript event, see RezScript) ArrayList errors = new ArrayList(); @@ -316,6 +316,10 @@ namespace OpenSim.Region.Framework.Scenes public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, UUID itemID, InventoryItemBase itemUpd) { +// m_log.DebugFormat( +// "[USER INVENTORY]: Updating asset for item {0} {1}, transaction ID {2} for {3}", +// itemID, itemUpd.Name, transactionID, remoteClient.Name); + // This one will let people set next perms on items in agent // inventory. Rut-Roh. Whatever. Make this secure. Yeah. // @@ -368,8 +372,7 @@ namespace OpenSim.Region.Framework.Scenes IAgentAssetTransactions agentTransactions = this.RequestModuleInterface(); if (agentTransactions != null) { - agentTransactions.HandleItemUpdateFromTransaction( - remoteClient, transactionID, item); + agentTransactions.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); } } } @@ -1005,7 +1008,7 @@ namespace OpenSim.Region.Framework.Scenes } group.RemoveInventoryItem(localID, itemID); - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); } } @@ -1283,7 +1286,7 @@ namespace OpenSim.Region.Framework.Scenes if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) { - destPart.GetProperties(avatar.ControllingClient); + destPart.SendPropertiesToClient(avatar.ControllingClient); } } @@ -1446,7 +1449,7 @@ namespace OpenSim.Region.Framework.Scenes m_log.InfoFormat( "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", item.Name, primLocalID, remoteClient.Name); - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); if (!Permissions.BypassPermissions()) { if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) @@ -1534,7 +1537,7 @@ namespace OpenSim.Region.Framework.Scenes if (part.Inventory.UpdateInventoryItem(itemInfo)) { - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); } } } @@ -1586,7 +1589,7 @@ namespace OpenSim.Region.Framework.Scenes // m_log.InfoFormat("[PRIMINVENTORY]: " + // "Rezzed script {0} into prim local ID {1} for user {2}", // item.inventoryName, localID, remoteClient.Name); - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); part.ParentGroup.ResumeScripts(); } else @@ -1644,7 +1647,7 @@ namespace OpenSim.Region.Framework.Scenes taskItem.AssetID = asset.FullID; part.Inventory.AddInventoryItem(taskItem, false); - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); part.ParentGroup.ResumeScripts(); @@ -1758,7 +1761,7 @@ namespace OpenSim.Region.Framework.Scenes if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) { - destPart.GetProperties(avatar.ControllingClient); + destPart.SendPropertiesToClient(avatar.ControllingClient); } } @@ -2217,7 +2220,7 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectPart part = GetSceneObjectPart(localID); if (part == null) continue; - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 9da57a8997..575079f454 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -144,7 +144,7 @@ namespace OpenSim.Region.Framework.Scenes { if (((SceneObjectGroup) ent).LocalId == primLocalID) { - ((SceneObjectGroup) ent).GetProperties(remoteClient); + ((SceneObjectGroup) ent).SendPropertiesToClient(remoteClient); ((SceneObjectGroup) ent).IsSelected = true; // A prim is only tainted if it's allowed to be edited by the person clicking it. if (Permissions.CanEditObject(((SceneObjectGroup)ent).UUID, remoteClient.AgentId) @@ -167,7 +167,7 @@ namespace OpenSim.Region.Framework.Scenes { if (part.LocalId == primLocalID) { - part.GetProperties(remoteClient); + part.SendPropertiesToClient(remoteClient); foundPrim = true; break; } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index c5bb2b285f..b288c8ace9 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -896,6 +896,8 @@ namespace OpenSim.Region.Framework.Scenes if (dm != null) m_eventManager.OnPermissionError += dm.SendAlertToUser; + + m_eventManager.OnSignificantClientMovement += HandleOnSignificantClientMovement; } public override string GetSimulatorVersion() @@ -1198,87 +1200,6 @@ namespace OpenSim.Region.Framework.Scenes m_dialogModule = RequestModuleInterface(); m_capsModule = RequestModuleInterface(); m_teleportModule = RequestModuleInterface(); - - // Shoving this in here for now, because we have the needed - // interfaces at this point - // - // TODO: Find a better place for this - // - while (m_regInfo.EstateSettings.EstateOwner == UUID.Zero && MainConsole.Instance != null) - { - MainConsole.Instance.OutputFormat("Estate {0} has no owner set.", m_regInfo.EstateSettings.EstateName); - List excluded = new List(new char[1]{' '}); - string first = MainConsole.Instance.CmdPrompt("Estate owner first name", "Test", excluded); - string last = MainConsole.Instance.CmdPrompt("Estate owner last name", "User", excluded); - - UserAccount account = UserAccountService.GetUserAccount(m_regInfo.ScopeID, first, last); - - if (account == null) - { - // Create a new account - account = new UserAccount(m_regInfo.ScopeID, first, last, String.Empty); - if (account.ServiceURLs == null || (account.ServiceURLs != null && account.ServiceURLs.Count == 0)) - { - account.ServiceURLs = new Dictionary(); - account.ServiceURLs["HomeURI"] = string.Empty; - account.ServiceURLs["GatekeeperURI"] = string.Empty; - account.ServiceURLs["InventoryServerURI"] = string.Empty; - account.ServiceURLs["AssetServerURI"] = string.Empty; - } - - if (UserAccountService.StoreUserAccount(account)) - { - string password = MainConsole.Instance.PasswdPrompt("Password"); - string email = MainConsole.Instance.CmdPrompt("Email", ""); - - account.Email = email; - UserAccountService.StoreUserAccount(account); - - bool success = false; - success = AuthenticationService.SetPassword(account.PrincipalID, password); - if (!success) - m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set password for account {0} {1}.", - first, last); - - GridRegion home = null; - if (GridService != null) - { - List defaultRegions = GridService.GetDefaultRegions(UUID.Zero); - if (defaultRegions != null && defaultRegions.Count >= 1) - home = defaultRegions[0]; - - if (GridUserService != null && home != null) - GridUserService.SetHome(account.PrincipalID.ToString(), home.RegionID, new Vector3(128, 128, 0), new Vector3(0, 1, 0)); - else - m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to set home for account {0} {1}.", - first, last); - - } - else - m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to retrieve home region for account {0} {1}.", - first, last); - - if (InventoryService != null) - success = InventoryService.CreateUserInventory(account.PrincipalID); - if (!success) - m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to create inventory for account {0} {1}.", - first, last); - - - m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} created successfully", first, last); - - m_regInfo.EstateSettings.EstateOwner = account.PrincipalID; - m_regInfo.EstateSettings.Save(); - } - else - m_log.ErrorFormat("[SCENE]: Unable to store account. If this simulator is connected to a grid, you must create the estate owner account first."); - } - else - { - m_regInfo.EstateSettings.EstateOwner = account.PrincipalID; - m_regInfo.EstateSettings.Save(); - } - } } #endregion @@ -1382,28 +1303,12 @@ namespace OpenSim.Region.Framework.Scenes tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpTempOnRezMS); } - if (RegionStatus != RegionStatus.SlaveScene) + if (Frame % m_update_events == 0) { - if (Frame % m_update_events == 0) - { - int evMS = Util.EnvironmentTickCount(); - UpdateEvents(); - eventMS = Util.EnvironmentTickCountSubtract(evMS); ; - } - - if (Frame % m_update_backup == 0) - { - int backMS = Util.EnvironmentTickCount(); - UpdateStorageBackup(); - backupMS = Util.EnvironmentTickCountSubtract(backMS); - } - - if (Frame % m_update_terrain == 0) - { - int terMS = Util.EnvironmentTickCount(); - UpdateTerrain(); - terrainMS = Util.EnvironmentTickCountSubtract(terMS); - } + int evMS = Util.EnvironmentTickCount(); + UpdateEvents(); + eventMS = Util.EnvironmentTickCountSubtract(evMS); ; + } // if (Frame % m_update_land == 0) // { @@ -1412,26 +1317,46 @@ namespace OpenSim.Region.Framework.Scenes // landMS = Util.EnvironmentTickCountSubtract(ldMS); // } - frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS); - otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; - lastCompletedFrame = Util.EnvironmentTickCount(); - - // if (Frame%m_update_avatars == 0) - // UpdateInWorldTime(); - StatsReporter.AddPhysicsFPS(physicsFPS); - StatsReporter.AddTimeDilation(TimeDilation); - StatsReporter.AddFPS(1); - StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); - StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); - StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); - StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); - StatsReporter.addFrameMS(frameMS); - StatsReporter.addPhysicsMS(physicsMS + physicsMS2); - StatsReporter.addOtherMS(otherMS); - StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); - StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); + if (Frame % m_update_backup == 0) + { + int backMS = Util.EnvironmentTickCount(); + UpdateStorageBackup(); + backupMS = Util.EnvironmentTickCountSubtract(backMS); } + if (Frame % m_update_terrain == 0) + { + int terMS = Util.EnvironmentTickCount(); + UpdateTerrain(); + terrainMS = Util.EnvironmentTickCountSubtract(terMS); + } + + //if (Frame % m_update_land == 0) + //{ + // int ldMS = Util.EnvironmentTickCount(); + // UpdateLand(); + // landMS = Util.EnvironmentTickCountSubtract(ldMS); + //} + + frameMS = Util.EnvironmentTickCountSubtract(tmpFrameMS); + otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; + lastCompletedFrame = Util.EnvironmentTickCount(); + + // if (Frame%m_update_avatars == 0) + // UpdateInWorldTime(); + StatsReporter.AddPhysicsFPS(physicsFPS); + StatsReporter.AddTimeDilation(TimeDilation); + StatsReporter.AddFPS(1); + StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); + StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); + StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); + StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); + StatsReporter.addFrameMS(frameMS); + StatsReporter.addPhysicsMS(physicsMS + physicsMS2); + StatsReporter.addOtherMS(otherMS); + StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); + StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); + if (LoginsDisabled && Frame == 20) { // In 99.9% of cases it is a bad idea to manually force garbage collection. However, @@ -2603,9 +2528,7 @@ namespace OpenSim.Region.Framework.Scenes RootPrim.RemFlag(PrimFlags.TemporaryOnRez); if (AttachmentsModule != null) - AttachmentsModule.AttachObject(sp.ControllingClient, grp, 0, false); - - m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was found, attaching", sceneObject.UUID); + AttachmentsModule.AttachObject(sp, grp, 0, false); } else { @@ -5477,7 +5400,7 @@ namespace OpenSim.Region.Framework.Scenes return true; } - public void StartTimerWatchdog() + public void StartTimerWatchdog() { m_timerWatchdog.Interval = 1000; m_timerWatchdog.Elapsed += TimerWatchdog; @@ -5488,6 +5411,70 @@ namespace OpenSim.Region.Framework.Scenes public void TimerWatchdog(object sender, ElapsedEventArgs e) { CheckHeartbeat(); + } + + /// This method deals with movement when an avatar is automatically moving (but this is distinct from the + /// autopilot that moves an avatar to a sit target!. + /// + /// + /// This is not intended as a permament location for this method. + /// + /// + private void HandleOnSignificantClientMovement(ScenePresence presence) + { + if (presence.MovingToTarget) + { + double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget); +// m_log.DebugFormat( +// "[SCENE]: Abs pos of {0} is {1}, target {2}, distance {3}", +// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget); + + // Check the error term of the current position in relation to the target position + if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT) + { + // We are close enough to the target +// m_log.DebugFormat("[SCENEE]: Stopping autopilot of {0}", presence.Name); + + presence.Velocity = Vector3.Zero; + presence.AbsolutePosition = presence.MoveToPositionTarget; + presence.ResetMoveToTarget(); + + if (presence.PhysicsActor.Flying) + { + // A horrible hack to stop the avatar dead in its tracks rather than having them overshoot + // the target if flying. + // We really need to be more subtle (slow the avatar as it approaches the target) or at + // least be able to set collision status once, rather than 5 times to give it enough + // weighting so that that PhysicsActor thinks it really is colliding. + for (int i = 0; i < 5; i++) + presence.PhysicsActor.IsColliding = true; + + if (presence.LandAtTarget) + presence.PhysicsActor.Flying = false; + +// Vector3 targetPos = presence.MoveToPositionTarget; +// float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y]; +// if (targetPos.Z - terrainHeight < 0.2) +// { +// presence.PhysicsActor.Flying = false; +// } + } + +// m_log.DebugFormat( +// "[SCENE]: AgentControlFlags {0}, MovementFlag {1} for {2}", +// presence.AgentControlFlags, presence.MovementFlag, presence.Name); + } + else + { +// m_log.DebugFormat( +// "[SCENE]: Updating npc {0} at {1} for next movement to {2}", +// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget); + + Vector3 agent_control_v3 = new Vector3(); + presence.HandleMoveToTargetUpdate(ref agent_control_v3); + presence.AddNewMovement(agent_control_v3); + } + } } } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 3e1439dd23..7493368317 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1312,13 +1312,6 @@ namespace OpenSim.Region.Framework.Scenes part.ClearUndoState(); } - public override void UpdateMovement() - { - SceneObjectPart[] parts = m_parts.GetArray(); - for (int i = 0; i < parts.Length; i++) - parts[i].UpdateMovement(); - } - public ushort GetTimeDilation() { return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f); @@ -1486,7 +1479,15 @@ namespace OpenSim.Region.Framework.Scenes avatar.StandUp(); if (!silent) + { part.UpdateFlag = 0; + if (part == m_rootPart) + { + if (!IsAttachment || (AttachedAvatar == avatar.ControllingClient.AgentId) || + (AttachmentPoint < 31) || (AttachmentPoint > 38)) + avatar.ControllingClient.SendKillObject(m_regionHandle, new List() {part.LocalId}); + } + } }); } @@ -1939,7 +1940,7 @@ namespace OpenSim.Region.Framework.Scenes ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar); if (avatar != null) { - avatar.MoveToTarget(target, false); + avatar.MoveToTarget(target, false, false); } } else @@ -2104,8 +2105,6 @@ namespace OpenSim.Region.Framework.Scenes #endregion - #region Scheduling - public override void Update() { // Check that the group was not deleted before the scheduled update @@ -2256,7 +2255,14 @@ namespace OpenSim.Region.Framework.Scenes parts[i].SendTerseUpdateToAllClients(); } - #endregion + /// + /// Send metadata about the root prim (name, description, sale price, etc.) to a client. + /// + /// + public void SendPropertiesToClient(IClientAPI client) + { + m_rootPart.SendPropertiesToClient(client); + } #region SceneGroupPart Methods @@ -2751,15 +2757,6 @@ namespace OpenSim.Region.Framework.Scenes } } - /// - /// Return metadata about a prim (name, description, sale price, etc.) - /// - /// - public void GetProperties(IClientAPI client) - { - m_rootPart.GetProperties(client); - } - /// /// Set the name of a prim /// diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0c3b4044d3..1a96f1ba15 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -804,7 +804,7 @@ namespace OpenSim.Region.Framework.Scenes if (av.LinkedPrim == m_uuid) { Vector3 offset = (m_offsetPosition - oldpos); - av.OffsetPosition += offset; + av.AbsolutePosition += offset; av.SendAvatarDataToAllAgents(); } } @@ -1357,8 +1357,6 @@ namespace OpenSim.Region.Framework.Scenes #endregion Public Properties with only Get - #region Private Methods - private uint ApplyMask(uint val, bool set, uint mask) { if (set) @@ -1371,14 +1369,35 @@ namespace OpenSim.Region.Framework.Scenes } } - private void SendObjectPropertiesToClient(UUID AgentID) + /// + /// Clear all pending updates of parts to clients + /// + private void ClearUpdateSchedule() + { + m_updateFlag = 0; + } + + /// + /// Send this part's properties (name, description, inventory serial, base mask, etc.) to a client + /// + /// + public void SendPropertiesToClient(IClientAPI client) + { + client.SendObjectPropertiesReply(this); + } + + /// + /// For the scene object group to which this part belongs, send that scene object's root part properties to a client. + /// + /// + private void SendRootPartPropertiesToClient(UUID AgentID) { m_parentGroup.Scene.ForEachScenePresence(delegate(ScenePresence avatar) { // Ugly reference :( if (avatar.UUID == AgentID) { - m_parentGroup.GetProperties(avatar.ControllingClient); + m_parentGroup.SendPropertiesToClient(avatar.ControllingClient); } }); } @@ -1407,8 +1426,6 @@ namespace OpenSim.Region.Framework.Scenes // } // } - #endregion Private Methods - #region Public Methods public void ResetExpire() @@ -1752,20 +1769,6 @@ namespace OpenSim.Region.Framework.Scenes Name, LocalId, id); } - public static SceneObjectPart Create() - { - SceneObjectPart part = new SceneObjectPart(); - part.UUID = UUID.Random(); - - PrimitiveBaseShape shape = PrimitiveBaseShape.Create(); - part.Shape = shape; - - part.Name = "Object"; - part._ownerID = UUID.Random(); - - return part; - } - /// /// Do a physics property update for a NINJA joint. /// @@ -2077,11 +2080,6 @@ namespace OpenSim.Region.Framework.Scenes return Vector3.Zero; } - public void GetProperties(IClientAPI client) - { - client.SendObjectPropertiesReply(this); - } - /// /// Method for a prim to get it's world position from the group. /// @@ -3055,6 +3053,10 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup.IsDeleted) return; + if (ParentGroup.IsAttachment && (ParentGroup.AttachedAvatar != remoteClient.AgentId) && + (ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38)) + return; + clientFlags &= ~(uint) PrimFlags.CreateSelected; if (remoteClient.AgentId == _ownerID) @@ -3500,7 +3502,7 @@ namespace OpenSim.Region.Framework.Scenes { _groupID = groupID; if (client != null) - GetProperties(client); + SendPropertiesToClient(client); m_updateFlag = 2; } @@ -4242,10 +4244,6 @@ namespace OpenSim.Region.Framework.Scenes } } - public virtual void UpdateMovement() - { - } - /// /// /// @@ -4320,10 +4318,10 @@ namespace OpenSim.Region.Framework.Scenes break; } + SendFullUpdateToAllClients(); - SendObjectPropertiesToClient(AgentID); - + SendRootPartPropertiesToClient(AgentID); } } @@ -4844,7 +4842,8 @@ namespace OpenSim.Region.Framework.Scenes if (ParentGroup.IsDeleted) return; - if (ParentGroup.IsAttachment && ParentGroup.RootPart != this) + if (ParentGroup.IsAttachment && ((ParentGroup.RootPart != this) || + ((ParentGroup.AttachedAvatar != remoteClient.AgentId) && (ParentGroup.AttachmentPoint >= 31) && (ParentGroup.AttachmentPoint <= 38)))) return; // Causes this thread to dig into the Client Thread Data. diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index f6b690c4a3..4edc22034c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -988,11 +988,16 @@ namespace OpenSim.Region.Framework.Scenes private bool CreateInventoryFileName() { +// m_log.DebugFormat( +// "[PRIM INVENTORY]: Creating inventory file for {0} {1} {2}, serial {3}", +// m_part.Name, m_part.UUID, m_part.LocalId, m_inventorySerial); + if (m_inventoryFileName == String.Empty || m_inventoryFileNameSerial < m_inventorySerial) { m_inventoryFileName = "inventory_" + UUID.Random().ToString() + ".tmp"; m_inventoryFileNameSerial = m_inventorySerial; + return true; } @@ -1025,6 +1030,12 @@ namespace OpenSim.Region.Framework.Scenes return; } + if (m_items.Count == 0) // No inventory + { + client.SendTaskInventory(m_part.UUID, 0, new byte[0]); + return; + } + if (!changed) { if (m_inventoryFileData.Length > 2) @@ -1096,10 +1107,12 @@ namespace OpenSim.Region.Framework.Scenes if (m_inventoryFileData.Length > 2) { xferManager.AddNewFile(m_inventoryFileName, m_inventoryFileData); + client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, + Util.StringToBytes256(m_inventoryFileName)); + return; } - client.SendTaskInventory(m_part.UUID, (short)m_inventorySerial, - Util.StringToBytes256(m_inventoryFileName)); + client.SendTaskInventory(m_part.UUID, 0, new byte[0]); } /// diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index fa6945caf3..dee9bc35e5 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -71,7 +71,7 @@ namespace OpenSim.Region.Framework.Scenes { // ~ScenePresence() // { -// m_log.Debug("[ScenePresence] Destructor called"); +// m_log.Debug("[SCENE PRESENCE] Destructor called"); // } private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -191,8 +191,6 @@ namespace OpenSim.Region.Framework.Scenes private Quaternion m_bodyRot = Quaternion.Identity; - private Quaternion m_bodyRotPrevious = Quaternion.Identity; - private const int LAND_VELOCITYMAG_MAX = 12; public bool IsRestrictedToRegion; @@ -238,6 +236,11 @@ namespace OpenSim.Region.Framework.Scenes public Vector3 MoveToPositionTarget { get; private set; } private Quaternion m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f); + /// + /// Controls whether an avatar automatically moving to a target will land when it gets there (if flying). + /// + public bool LandAtTarget { get; private set; } + private bool m_followCamAuto; private int m_movementUpdateCount; @@ -492,7 +495,13 @@ namespace OpenSim.Region.Framework.Scenes PhysicsActor actor = m_physicsActor; // if (actor != null) if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting! + { m_pos = actor.Position; + +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Set position {0} for {1} in {2} via getting AbsolutePosition!", +// m_pos, Name, Scene.RegionInfo.RegionName); + } else { // Obtain the correct position of a seated avatar. @@ -536,20 +545,28 @@ namespace OpenSim.Region.Framework.Scenes } catch (Exception e) { - m_log.Error("[SCENEPRESENCE]: ABSOLUTE POSITION " + e.Message); + m_log.Error("[SCENE PRESENCE]: ABSOLUTE POSITION " + e.Message); } } - if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting! +// Changed this to update unconditionally to make npose work +// if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting! m_pos = value; m_parentPosition = Vector3.Zero; + +// m_log.DebugFormat( +// "[ENTITY BASE]: In {0} set AbsolutePosition of {1} to {2}", +// Scene.RegionInfo.RegionName, Name, m_pos); } } + /// + /// If sitting, returns the offset position from the prim the avatar is sitting on. + /// Otherwise, returns absolute position in the scene. + /// public Vector3 OffsetPosition { get { return m_pos; } - set { m_pos = value; } } /// @@ -561,8 +578,14 @@ namespace OpenSim.Region.Framework.Scenes { PhysicsActor actor = m_physicsActor; if (actor != null) + { m_velocity = actor.Velocity; +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Set velocity {0} for {1} in {2} via getting Velocity!", +// m_velocity, Name, Scene.RegionInfo.RegionName); + } + return m_velocity; } set @@ -577,11 +600,15 @@ namespace OpenSim.Region.Framework.Scenes } catch (Exception e) { - m_log.Error("[SCENEPRESENCE]: VELOCITY " + e.Message); + m_log.Error("[SCENE PRESENCE]: VELOCITY " + e.Message); } } m_velocity = value; + +// m_log.DebugFormat( +// "[SCENE PRESENCE]: In {0} set velocity of {1} to {2}", +// Scene.RegionInfo.RegionName, Name, m_velocity); } } @@ -620,12 +647,6 @@ namespace OpenSim.Region.Framework.Scenes } } - public Quaternion PreviousRotation - { - get { return m_bodyRotPrevious; } - set { m_bodyRotPrevious = value; } - } - /// /// If this is true, agent doesn't have a representation in this scene. /// this is an agent 'looking into' this scene from a nearby scene(region) @@ -1126,7 +1147,7 @@ namespace OpenSim.Region.Framework.Scenes Animator.ResetAnimations(); // m_log.DebugFormat( -// "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", +// "[SCENE PRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}", // Name, UUID, m_scene.RegionInfo.RegionName); // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing, @@ -1302,7 +1323,7 @@ namespace OpenSim.Region.Framework.Scenes m_callbackURI = null; } - //m_log.DebugFormat("Completed movement"); + //m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); m_controllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); SendInitialData(); @@ -1813,7 +1834,10 @@ namespace OpenSim.Region.Framework.Scenes /// This is to allow movement to targets that are known to be on an elevated platform with a continuous path /// from start to finish. /// - public void MoveToTarget(Vector3 pos, bool noFly) + /// + /// If true and the avatar starts flying during the move then land at the target. + /// + public void MoveToTarget(Vector3 pos, bool noFly, bool landAtTarget) { m_log.DebugFormat( "[SCENE PRESENCE]: Avatar {0} received request to move to position {1} in {2}", @@ -1839,7 +1863,7 @@ namespace OpenSim.Region.Framework.Scenes // Fudge factor. It appears that if one clicks "go here" on a piece of ground, the go here request is // always slightly higher than the actual terrain height. - // FIXME: This constrains NOC movements as well, so should be somewhere else. + // FIXME: This constrains NPC movements as well, so should be somewhere else. if (pos.Z - terrainHeight < 0.2) pos.Z = terrainHeight; @@ -1852,9 +1876,25 @@ namespace OpenSim.Region.Framework.Scenes else if (pos.Z > terrainHeight) PhysicsActor.Flying = true; + LandAtTarget = landAtTarget; MovingToTarget = true; MoveToPositionTarget = pos; + // Rotate presence around the z-axis to point in same direction as movement. + // Ignore z component of vector + Vector3 localVectorToTarget3D = pos - AbsolutePosition; + Vector3 localVectorToTarget2D = new Vector3((float)(localVectorToTarget3D.X), (float)(localVectorToTarget3D.Y), 0f); + +// m_log.DebugFormat("[SCENE PRESENCE]: Local vector to target is {0}", localVectorToTarget2D); + + // Calculate the yaw. + Vector3 angle = new Vector3(0, 0, (float)(Math.Atan2(localVectorToTarget2D.Y, localVectorToTarget2D.X))); + +// m_log.DebugFormat("[SCENE PRESENCE]: Angle is {0}", angle); + + Rotation = Quaternion.CreateFromEulers(angle); +// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, Rotation); + Vector3 agent_control_v3 = new Vector3(); HandleMoveToTargetUpdate(ref agent_control_v3); AddNewMovement(agent_control_v3); @@ -2744,7 +2784,7 @@ namespace OpenSim.Region.Framework.Scenes Vector3 pos = m_pos; pos.Z += m_appearance.HipOffset; - //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); + //m_log.DebugFormat("[SCENE PRESENCE]: " + Name + " sending TerseUpdate to " + remoteClient.Name + " : Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity); remoteClient.SendPrimUpdate( this, @@ -2831,6 +2871,7 @@ namespace OpenSim.Region.Framework.Scenes /// private void SendInitialData() { + //m_log.DebugFormat("[SCENE PRESENCE] SendInitialData: {0} ({1})", Name, UUID); // Moved this into CompleteMovement to ensure that m_appearance is initialized before // the inventory arrives // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); @@ -2875,10 +2916,11 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendAvatarDataToAllAgents() { + //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAllAgents: {0} ({1})", Name, UUID); // only send update from root agents to other clients; children are only "listening posts" if (IsChildAgent) { - m_log.Warn("[SCENEPRESENCE] attempt to send avatar data from a child agent"); + m_log.Warn("[SCENE PRESENCE] attempt to send avatar data from a child agent"); return; } @@ -2928,7 +2970,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendAvatarDataToAgent(ScenePresence avatar) { -// m_log.WarnFormat("[SP] Send avatar data from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId); + //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAgent from {0} ({1}) to {2} ({3})", Name, UUID, avatar.Name, avatar.UUID); avatar.ControllingClient.SendAvatarDataImmediate(this); if (Animator != null) @@ -2941,10 +2983,11 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendAppearanceToAllOtherAgents() { + m_log.DebugFormat("[SCENE PRESENCE] SendAppearanceToAllOtherAgents: {0} ({1})", Name, UUID); // only send update from root agents to other clients; children are only "listening posts" if (IsChildAgent) { - m_log.Warn("[SCENEPRESENCE] attempt to send avatar data from a child agent"); + m_log.Warn("[SCENE PRESENCE] attempt to send avatar data from a child agent"); return; } @@ -2970,6 +3013,7 @@ namespace OpenSim.Region.Framework.Scenes /// public void SendOtherAgentsAppearanceToMe() { + //m_log.DebugFormat("[SCENE PRESENCE] SendOtherAgentsAppearanceToMe: {0} ({1})", Name, UUID); m_perfMonMS = Util.EnvironmentTickCount(); int count = 0; @@ -3618,7 +3662,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Handles part of the PID controller function for moving an avatar. /// - public override void UpdateMovement() + public void UpdateMovement() { if (m_forceToApply.HasValue) { @@ -3637,6 +3681,10 @@ namespace OpenSim.Region.Framework.Scenes /// public void AddToPhysicalScene(bool isFlying) { +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Adding physics actor for {0}, ifFlying = {1} in {2}", +// Name, isFlying, Scene.RegionInfo.RegionName); + if (m_appearance.AvatarHeight == 0) m_appearance.SetHeight(); @@ -4340,4 +4388,4 @@ namespace OpenSim.Region.Framework.Scenes } } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs new file mode 100644 index 0000000000..64c36ffaef --- /dev/null +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceAutopilotTests.cs @@ -0,0 +1,135 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using log4net; +using Nini.Config; +using NUnit.Framework; +using OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Framework.Communications; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Region.Framework.Scenes.Tests +{ + [TestFixture] + public class ScenePresenceAutopilotTests + { + private TestScene m_scene; + + [TestFixtureSetUp] + public void FixtureInit() + { + // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread. + Util.FireAndForgetMethod = FireAndForgetMethod.None; + } + + [TestFixtureTearDown] + public void TearDown() + { + // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple + // threads. Possibly, later tests should be rewritten not to worry about such things. + Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod; + } + + [SetUp] + public void Init() + { + m_scene = SceneHelpers.SetupScene(); + } + + [Test] + public void TestMove() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1)); + + Vector3 startPos = sp.AbsolutePosition; +// Vector3 startPos = new Vector3(128, 128, 30); + + // For now, we'll make the scene presence fly to simplify this test, but this needs to change. + sp.PhysicsActor.Flying = true; + + m_scene.Update(); + Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos)); + + Vector3 targetPos = startPos + new Vector3(0, 10, 0); + sp.MoveToTarget(targetPos, false, false); + + Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos)); + Assert.That( + sp.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001)); + + m_scene.Update(); + + // We should really check the exact figure. + Assert.That(sp.AbsolutePosition.X, Is.EqualTo(startPos.X)); + Assert.That(sp.AbsolutePosition.Y, Is.GreaterThan(startPos.Y)); + Assert.That(sp.AbsolutePosition.Z, Is.EqualTo(startPos.Z)); + Assert.That(sp.AbsolutePosition.Z, Is.LessThan(targetPos.X)); + + for (int i = 0; i < 10; i++) + m_scene.Update(); + + double distanceToTarget = Util.GetDistanceTo(sp.AbsolutePosition, targetPos); + Assert.That(distanceToTarget, Is.LessThan(1), "Avatar not within 1 unit of target position on first move"); + Assert.That(sp.AbsolutePosition, Is.EqualTo(targetPos)); + Assert.That(sp.AgentControlFlags, Is.EqualTo((uint)AgentManager.ControlFlags.NONE)); + + // Try a second movement + startPos = sp.AbsolutePosition; + targetPos = startPos + new Vector3(10, 0, 0); + sp.MoveToTarget(targetPos, false, false); + + Assert.That(sp.AbsolutePosition, Is.EqualTo(startPos)); + Assert.That( + sp.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0, 1), 0.000001)); + + m_scene.Update(); + + // We should really check the exact figure. + Assert.That(sp.AbsolutePosition.X, Is.GreaterThan(startPos.X)); + Assert.That(sp.AbsolutePosition.X, Is.LessThan(targetPos.X)); + Assert.That(sp.AbsolutePosition.Y, Is.EqualTo(startPos.Y)); + Assert.That(sp.AbsolutePosition.Z, Is.EqualTo(startPos.Z)); + + for (int i = 0; i < 10; i++) + m_scene.Update(); + + distanceToTarget = Util.GetDistanceTo(sp.AbsolutePosition, targetPos); + Assert.That(distanceToTarget, Is.LessThan(1), "Avatar not within 1 unit of target position on second move"); + Assert.That(sp.AbsolutePosition, Is.EqualTo(targetPos)); + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index 00b1c1e2ff..c92f121a7a 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -806,7 +806,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server public event ScriptReset OnScriptReset; public event GetScriptRunning OnGetScriptRunning; public event SetScriptRunning OnSetScriptRunning; - public event Action OnAutoPilotGo; + public event Action OnAutoPilotGo; public event TerrainUnacked OnUnackedTerrain; public event ActivateGesture OnActivateGesture; public event DeactivateGesture OnDeactivateGesture; diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 4f831a4889..253fdee0c9 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -37,11 +37,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC { public class NPCAvatar : IClientAPI { - /// - /// Signal whether the avatar should land when it reaches a move target - /// - public bool LandAtTarget { get; set; } - private readonly string m_firstname; private readonly string m_lastname; private readonly Vector3 m_startPos; @@ -333,7 +328,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC public event ScriptReset OnScriptReset; public event GetScriptRunning OnGetScriptRunning; public event SetScriptRunning OnSetScriptRunning; - public event Action OnAutoPilotGo; + public event Action OnAutoPilotGo; public event TerrainUnacked OnUnackedTerrain; diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 2fdeeabe69..bcd9e943ee 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs @@ -53,78 +53,13 @@ namespace OpenSim.Region.OptionalModules.World.NPC if (config != null && config.GetBoolean("Enabled", false)) { scene.RegisterModuleInterface(this); - scene.EventManager.OnSignificantClientMovement += HandleOnSignificantClientMovement; - } - } - - public void HandleOnSignificantClientMovement(ScenePresence presence) - { - lock (m_avatars) - { - if (m_avatars.ContainsKey(presence.UUID) && presence.MovingToTarget) - { - double distanceToTarget = Util.GetDistanceTo(presence.AbsolutePosition, presence.MoveToPositionTarget); -// m_log.DebugFormat( -// "[NPC MODULE]: Abs pos of {0} is {1}, target {2}, distance {3}", -// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget, distanceToTarget); - - // Check the error term of the current position in relation to the target position - if (distanceToTarget <= ScenePresence.SIGNIFICANT_MOVEMENT) - { - // We are close enough to the target - m_log.DebugFormat("[NPC MODULE]: Stopping movement of npc {0}", presence.Name); - - presence.Velocity = Vector3.Zero; - presence.AbsolutePosition = presence.MoveToPositionTarget; - presence.ResetMoveToTarget(); - - if (presence.PhysicsActor.Flying) - { - // A horrible hack to stop the NPC dead in its tracks rather than having them overshoot - // the target if flying. - // We really need to be more subtle (slow the avatar as it approaches the target) or at - // least be able to set collision status once, rather than 5 times to give it enough - // weighting so that that PhysicsActor thinks it really is colliding. - for (int i = 0; i < 5; i++) - presence.PhysicsActor.IsColliding = true; - -// Vector3 targetPos = presence.MoveToPositionTarget; - if (m_avatars[presence.UUID].LandAtTarget) - presence.PhysicsActor.Flying = false; - -// float terrainHeight = (float)presence.Scene.Heightmap[(int)targetPos.X, (int)targetPos.Y]; -// if (targetPos.Z - terrainHeight < 0.2) -// { -// presence.PhysicsActor.Flying = false; -// } - } - -// m_log.DebugFormat( -// "[NPC MODULE]: AgentControlFlags {0}, MovementFlag {1} for {2}", -// presence.AgentControlFlags, presence.MovementFlag, presence.Name); - } - else - { -// m_log.DebugFormat( -// "[NPC MODULE]: Updating npc {0} at {1} for next movement to {2}", -// presence.Name, presence.AbsolutePosition, presence.MoveToPositionTarget); - - Vector3 agent_control_v3 = new Vector3(); - presence.HandleMoveToTargetUpdate(ref agent_control_v3); - presence.AddNewMovement(agent_control_v3); - } -// -//// presence.DoMoveToPositionUpdate((0, presence.MoveToPositionTarget, null); - -// -// - - } } } public bool IsNPC(UUID agentId, Scene scene) { + // FIXME: This implementation could not just use the ScenePresence.PresenceType (and callers could inspect + // that directly). ScenePresence sp = scene.GetScenePresence(agentId); if (sp == null || sp.IsChildAgent) return false; @@ -218,8 +153,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC "[NPC MODULE]: Moving {0} to {1} in {2}, noFly {3}, landAtTarget {4}", sp.Name, pos, scene.RegionInfo.RegionName, noFly, landAtTarget); - m_avatars[agentID].LandAtTarget = landAtTarget; - sp.MoveToTarget(pos, noFly); + sp.MoveToTarget(pos, noFly, landAtTarget); return true; } diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs index 246bc34219..49c06bcfcd 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs @@ -132,11 +132,9 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests UUID attAssetId = TestHelpers.ParseTail(0x3); string attName = "att"; - UserInventoryHelpers.CreateInventoryItem( - scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object); + UserInventoryHelpers.CreateInventoryItem(scene, attName, attItemId, attAssetId, sp.UUID, InventoryType.Object); - am.RezSingleAttachmentFromInventory( - sp.ControllingClient, attItemId, (uint)AttachmentPoint.Chest); + am.RezSingleAttachmentFromInventory(sp, attItemId, (uint)AttachmentPoint.Chest); INPCModule npcModule = scene.RequestModuleInterface(); UUID npcId = npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), scene, sp.Appearance); @@ -182,18 +180,21 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests scene.Update(); Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); - Vector3 targetPos = startPos + new Vector3(0, 0, 10); + Vector3 targetPos = startPos + new Vector3(0, 10, 0); npcModule.MoveToTarget(npc.UUID, scene, targetPos, false, false); Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); + //Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0.7071068f, 0.7071068f))); + Assert.That( + npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0.7071068f, 0.7071068f), 0.000001)); scene.Update(); // We should really check the exact figure. Assert.That(npc.AbsolutePosition.X, Is.EqualTo(startPos.X)); - Assert.That(npc.AbsolutePosition.Y, Is.EqualTo(startPos.Y)); - Assert.That(npc.AbsolutePosition.Z, Is.GreaterThan(startPos.Z)); - Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.Z)); + Assert.That(npc.AbsolutePosition.Y, Is.GreaterThan(startPos.Y)); + Assert.That(npc.AbsolutePosition.Z, Is.EqualTo(startPos.Z)); + Assert.That(npc.AbsolutePosition.Z, Is.LessThan(targetPos.X)); for (int i = 0; i < 10; i++) scene.Update(); @@ -208,6 +209,11 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests targetPos = startPos + new Vector3(10, 0, 0); npcModule.MoveToTarget(npc.UUID, scene, targetPos, false, false); + Assert.That(npc.AbsolutePosition, Is.EqualTo(startPos)); +// Assert.That(npc.Rotation, Is.EqualTo(new Quaternion(0, 0, 0, 1))); + Assert.That( + npc.Rotation, new QuaternionToleranceConstraint(new Quaternion(0, 0, 0, 1), 0.000001)); + scene.Update(); // We should really check the exact figure. diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/AssemblyInfo.cs deleted file mode 100644 index 2830325a3d..0000000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Reflection; -using System.Runtime.InteropServices; - -// Information about this assembly is defined by the following -// attributes. -// -// change them to the information which is associated with the assembly -// you compile. - -[assembly : AssemblyTitle("BulletDotNETPlugin")] -[assembly : AssemblyDescription("")] -[assembly : AssemblyConfiguration("")] -[assembly : AssemblyCompany("http://opensimulator.org")] -[assembly : AssemblyProduct("OdePlugin")] -[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] -[assembly : AssemblyTrademark("")] -[assembly : AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose a type to COM, use [ComVisible(true)] on that type. - -[assembly : ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all values by your own or you can build default build and revision -// numbers with the '*' character (the default): - -[assembly : AssemblyVersion("0.6.3.*")] diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs deleted file mode 100644 index f13c3230ba..0000000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs +++ /dev/null @@ -1,1190 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Reflection; -using BulletDotNET; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.Physics.Manager; -using log4net; - -namespace OpenSim.Region.Physics.BulletDotNETPlugin -{ - public class BulletDotNETCharacter : PhysicsActor - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - public btRigidBody Body; - public btCollisionShape Shell; - public btVector3 tempVector1; - public btVector3 tempVector2; - public btVector3 tempVector3; - public btVector3 tempVector4; - - public btVector3 tempVector5RayCast; - public btVector3 tempVector6RayCast; - public btVector3 tempVector7RayCast; - - public btQuaternion tempQuat1; - public btTransform tempTrans1; - - public ClosestNotMeRayResultCallback ClosestCastResult; - private btTransform m_bodyTransform; - private btVector3 m_bodyPosition; - private btVector3 m_CapsuleOrientationAxis; - private btQuaternion m_bodyOrientation; - private btDefaultMotionState m_bodyMotionState; - private btGeneric6DofConstraint m_aMotor; - // private Vector3 m_movementComparision; - private Vector3 m_position; - private Vector3 m_zeroPosition; - private bool m_zeroFlag = false; - private bool m_lastUpdateSent = false; - private Vector3 m_velocity; - private Vector3 m_target_velocity; - private Vector3 m_acceleration; - private Vector3 m_rotationalVelocity; - private bool m_pidControllerActive = true; - public float PID_D = 80.0f; - public float PID_P = 90.0f; - public float CAPSULE_RADIUS = 0.37f; - public float CAPSULE_LENGTH = 2.140599f; - public float heightFudgeFactor = 0.52f; - public float walkDivisor = 1.3f; - public float runDivisor = 0.8f; - private float m_mass = 80f; - public float m_density = 60f; - private bool m_flying = false; - private bool m_iscolliding = false; - private bool m_iscollidingGround = false; - private bool m_wascolliding = false; - private bool m_wascollidingGround = false; - private bool m_iscollidingObj = false; - private bool m_alwaysRun = false; - private bool m_hackSentFall = false; - private bool m_hackSentFly = false; - public uint m_localID = 0; - public bool m_returnCollisions = false; - // taints and their non-tainted counterparts - public bool m_isPhysical = false; // the current physical status - public bool m_tainted_isPhysical = false; // set when the physical status is tainted (false=not existing in physics engine, true=existing) - private float m_tainted_CAPSULE_LENGTH; // set when the capsule length changes. - private bool m_taintRemove = false; - // private bool m_taintedPosition = false; - // private Vector3 m_taintedPosition_value; - private Vector3 m_taintedForce; - - private float m_buoyancy = 0f; - - // private CollisionLocker ode; - - // private string m_name = String.Empty; - - private bool[] m_colliderarr = new bool[11]; - private bool[] m_colliderGroundarr = new bool[11]; - - private BulletDotNETScene m_parent_scene; - - public int m_eventsubscription = 0; - private CollisionEventUpdate CollisionEventsThisFrame = null; - private int m_requestedUpdateFrequency = 0; - - public BulletDotNETCharacter(string avName, BulletDotNETScene parent_scene, Vector3 pos, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor) - { - m_position = pos; - m_zeroPosition = pos; - m_parent_scene = parent_scene; - PID_D = pid_d; - PID_P = pid_p; - CAPSULE_RADIUS = capsule_radius; - m_density = density; - heightFudgeFactor = height_fudge_factor; - walkDivisor = walk_divisor; - runDivisor = rundivisor; - - for (int i = 0; i < 11; i++) - { - m_colliderarr[i] = false; - } - for (int i = 0; i < 11; i++) - { - m_colliderGroundarr[i] = false; - } - CAPSULE_LENGTH = (size.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; - m_tainted_CAPSULE_LENGTH = CAPSULE_LENGTH; - m_isPhysical = false; // current status: no ODE information exists - m_tainted_isPhysical = true; // new tainted status: need to create ODE information - - m_parent_scene.AddPhysicsActorTaint(this); - - // m_name = avName; - tempVector1 = new btVector3(0, 0, 0); - tempVector2 = new btVector3(0, 0, 0); - tempVector3 = new btVector3(0, 0, 0); - tempVector4 = new btVector3(0, 0, 0); - - tempVector5RayCast = new btVector3(0, 0, 0); - tempVector6RayCast = new btVector3(0, 0, 0); - tempVector7RayCast = new btVector3(0, 0, 0); - - tempQuat1 = new btQuaternion(0, 0, 0, 1); - tempTrans1 = new btTransform(tempQuat1, tempVector1); - // m_movementComparision = new PhysicsVector(0, 0, 0); - m_CapsuleOrientationAxis = new btVector3(1, 0, 1); - } - - /// - /// This creates the Avatar's physical Surrogate at the position supplied - /// - /// - /// - /// - - // WARNING: This MUST NOT be called outside of ProcessTaints, else we can have unsynchronized access - // to ODE internals. ProcessTaints is called from within thread-locked Simulate(), so it is the only - // place that is safe to call this routine AvatarGeomAndBodyCreation. - private void AvatarGeomAndBodyCreation(float npositionX, float npositionY, float npositionZ) - { - - if (CAPSULE_LENGTH <= 0) - { - m_log.Warn("[PHYSICS]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!"); - CAPSULE_LENGTH = 0.01f; - - } - - if (CAPSULE_RADIUS <= 0) - { - m_log.Warn("[PHYSICS]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!"); - CAPSULE_RADIUS = 0.01f; - - } - - Shell = new btCapsuleShape(CAPSULE_RADIUS, CAPSULE_LENGTH); - - if (m_bodyPosition == null) - m_bodyPosition = new btVector3(npositionX, npositionY, npositionZ); - - m_bodyPosition.setValue(npositionX, npositionY, npositionZ); - - if (m_bodyOrientation == null) - m_bodyOrientation = new btQuaternion(m_CapsuleOrientationAxis, (Utils.DEG_TO_RAD * 90)); - - if (m_bodyTransform == null) - m_bodyTransform = new btTransform(m_bodyOrientation, m_bodyPosition); - else - { - m_bodyTransform.Dispose(); - m_bodyTransform = new btTransform(m_bodyOrientation, m_bodyPosition); - } - - if (m_bodyMotionState == null) - m_bodyMotionState = new btDefaultMotionState(m_bodyTransform); - else - m_bodyMotionState.setWorldTransform(m_bodyTransform); - - m_mass = Mass; - - Body = new btRigidBody(m_mass, m_bodyMotionState, Shell); - // this is used for self identification. User localID instead of body handle - Body.setUserPointer(new IntPtr((int)m_localID)); - - if (ClosestCastResult != null) - ClosestCastResult.Dispose(); - ClosestCastResult = new ClosestNotMeRayResultCallback(Body); - - m_parent_scene.AddRigidBody(Body); - Body.setActivationState(4); - if (m_aMotor != null) - { - if (m_aMotor.Handle != IntPtr.Zero) - { - m_parent_scene.getBulletWorld().removeConstraint(m_aMotor); - m_aMotor.Dispose(); - } - m_aMotor = null; - } - - m_aMotor = new btGeneric6DofConstraint(Body, m_parent_scene.TerrainBody, - m_parent_scene.TransZero, - m_parent_scene.TransZero, false); - m_aMotor.setAngularLowerLimit(m_parent_scene.VectorZero); - m_aMotor.setAngularUpperLimit(m_parent_scene.VectorZero); - - - } - public void Remove() - { - m_taintRemove = true; - } - public override bool Stopped - { - get { return m_zeroFlag; } - } - - public override Vector3 Size - { - get { return new Vector3(CAPSULE_RADIUS * 2, CAPSULE_RADIUS * 2, CAPSULE_LENGTH); } - set - { - m_pidControllerActive = true; - - Vector3 SetSize = value; - m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; - //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); - - Velocity = Vector3.Zero; - - m_parent_scene.AddPhysicsActorTaint(this); - } - } - - /// - /// turn the PID controller on or off. - /// The PID Controller will turn on all by itself in many situations - /// - /// - public void SetPidStatus(bool status) - { - m_pidControllerActive = status; - } - - public override PrimitiveBaseShape Shape - { - set { return; } - } - - public override uint LocalID - { - set { m_localID = value; } - } - - public override bool Grabbed - { - set { return; } - } - - public override bool Selected - { - set { return; } - } - - - public override void CrossingFailure() - { - - } - - public override void link(PhysicsActor obj) - { - - } - - public override void delink() - { - - } - - public override void LockAngularMotion(Vector3 axis) - { - - } - - public override Vector3 Position - { - get { return m_position; } - set - { - // m_taintedPosition_value = value; - m_position = value; - // m_taintedPosition = true; - } - } - - public override float Mass - { - get - { - float AVvolume = (float)(Math.PI * Math.Pow(CAPSULE_RADIUS, 2) * CAPSULE_LENGTH); - return m_density * AVvolume; - } - } - - public override Vector3 Force - { - get { return m_target_velocity; } - set { return; } - } - - public override int VehicleType - { - get { return 0; } - set { return; } - } - - public override void VehicleFloatParam(int param, float value) - { - - } - - public override void VehicleVectorParam(int param, Vector3 value) - { - - } - - public override void VehicleRotationParam(int param, Quaternion rotation) - { - - } - - public override void VehicleFlags(int param, bool remove) - { - - } - - public override void SetVolumeDetect(int param) - { - - } - - public override Vector3 GeometricCenter - { - get { return Vector3.Zero; } - } - - public override Vector3 CenterOfMass - { - get { return Vector3.Zero; } - } - - public override Vector3 Velocity - { - get - { - if (m_zeroFlag) - return Vector3.Zero; - m_lastUpdateSent = false; - return m_velocity; - } - set - { - m_pidControllerActive = true; - m_target_velocity = value; - } - } - - public override Vector3 Torque - { - get { return Vector3.Zero; } - set { return; } - } - - public override float CollisionScore - { - get { return 0f; } - set { } - } - - public override Vector3 Acceleration - { - get { return m_acceleration; } - } - - public override Quaternion Orientation - { - get { return Quaternion.Identity; } - set - { - - } - } - - public override int PhysicsActorType - { - get { return (int)ActorTypes.Agent; } - set { return; } - } - - public override bool IsPhysical - { - get { return false; } - set { return; } - } - - public override bool Flying - { - get { return m_flying; } - set { m_flying = value; } - } - - public override bool SetAlwaysRun - { - get { return m_alwaysRun; } - set { m_alwaysRun = value; } - } - - - public override bool ThrottleUpdates - { - get { return false; } - set { return; } - } - - /// - /// Returns if the avatar is colliding in general. - /// This includes the ground and objects and avatar. - /// - public override bool IsColliding - { - get { return m_iscolliding; } - set - { - int i; - int truecount = 0; - int falsecount = 0; - - if (m_colliderarr.Length >= 10) - { - for (i = 0; i < 10; i++) - { - m_colliderarr[i] = m_colliderarr[i + 1]; - } - } - m_colliderarr[10] = value; - - for (i = 0; i < 11; i++) - { - if (m_colliderarr[i]) - { - truecount++; - } - else - { - falsecount++; - } - } - - // Equal truecounts and false counts means we're colliding with something. - m_log.DebugFormat("[PHYSICS]: TrueCount:{0}, FalseCount:{1}",truecount,falsecount); - if (falsecount > 1.2 * truecount) - { - m_iscolliding = false; - } - else - { - m_iscolliding = true; - } - if (m_wascolliding != m_iscolliding) - { - //base.SendCollisionUpdate(new CollisionEventUpdate()); - } - m_wascolliding = m_iscolliding; - } - } - - /// - /// Returns if an avatar is colliding with the ground - /// - public override bool CollidingGround - { - get { return m_iscollidingGround; } - set - { - // Collisions against the ground are not really reliable - // So, to get a consistant value we have to average the current result over time - // Currently we use 1 second = 10 calls to this. - int i; - int truecount = 0; - int falsecount = 0; - - if (m_colliderGroundarr.Length >= 10) - { - for (i = 0; i < 10; i++) - { - m_colliderGroundarr[i] = m_colliderGroundarr[i + 1]; - } - } - m_colliderGroundarr[10] = value; - - for (i = 0; i < 11; i++) - { - if (m_colliderGroundarr[i]) - { - truecount++; - } - else - { - falsecount++; - } - } - - // Equal truecounts and false counts means we're colliding with something. - - if (falsecount > 1.2 * truecount) - { - m_iscollidingGround = false; - } - else - { - m_iscollidingGround = true; - } - if (m_wascollidingGround != m_iscollidingGround) - { - //base.SendCollisionUpdate(new CollisionEventUpdate()); - } - m_wascollidingGround = m_iscollidingGround; - } - } - - /// - /// Returns if the avatar is colliding with an object - /// - public override bool CollidingObj - { - get { return m_iscollidingObj; } - set - { - m_iscollidingObj = value; - if (value) - m_pidControllerActive = false; - else - m_pidControllerActive = true; - } - } - - - public override bool FloatOnWater - { - set { return; } - } - - public override Vector3 RotationalVelocity - { - get { return m_rotationalVelocity; } - set { m_rotationalVelocity = value; } - } - - public override bool Kinematic - { - get { return false; } - set { } - } - - public override float Buoyancy - { - get { return m_buoyancy; } - set { m_buoyancy = value; } - } - - public override Vector3 PIDTarget { set { return; } } - public override bool PIDActive { set { return; } } - public override float PIDTau { set { return; } } - - public override bool PIDHoverActive - { - set { return; } - } - - public override float PIDHoverHeight - { - set { return; } - } - - public override PIDHoverType PIDHoverType - { - set { return; } - } - - public override float PIDHoverTau - { - set { return; } - } - - public override Quaternion APIDTarget - { - set { return; } - } - - public override bool APIDActive - { - set { return; } - } - - public override float APIDStrength - { - set { return; } - } - - public override float APIDDamping - { - set { return; } - } - - /// - /// Adds the force supplied to the Target Velocity - /// The PID controller takes this target velocity and tries to make it a reality - /// - /// - /// Is this a push by a script? - public override void AddForce(Vector3 force, bool pushforce) - { - if (pushforce) - { - m_pidControllerActive = false; - force *= 100f; - doForce(force, false); - //System.Console.WriteLine("Push!"); - //_target_velocity.X += force.X; - // _target_velocity.Y += force.Y; - //_target_velocity.Z += force.Z; - } - else - { - m_pidControllerActive = true; - m_target_velocity.X += force.X; - m_target_velocity.Y += force.Y; - m_target_velocity.Z += force.Z; - } - //m_lastUpdateSent = false; - } - - public void doForce(Vector3 force, bool now) - { - - tempVector3.setValue(force.X, force.Y, force.Z); - if (now) - { - Body.applyCentralForce(tempVector3); - } - else - { - m_taintedForce += force; - m_parent_scene.AddPhysicsActorTaint(this); - } - } - - public void doImpulse(Vector3 force, bool now) - { - - tempVector3.setValue(force.X, force.Y, force.Z); - if (now) - { - Body.applyCentralImpulse(tempVector3); - } - else - { - m_taintedForce += force; - m_parent_scene.AddPhysicsActorTaint(this); - } - } - - public override void AddAngularForce(Vector3 force, bool pushforce) - { - - } - - public override void SetMomentum(Vector3 momentum) - { - - } - - public override void SubscribeEvents(int ms) - { - m_eventsubscription = ms; - m_requestedUpdateFrequency = ms; - m_parent_scene.addCollisionEventReporting(this); - } - - public override void UnSubscribeEvents() - { - m_parent_scene.remCollisionEventReporting(this); - m_eventsubscription = 0; - m_requestedUpdateFrequency = 0; - } - - public override bool SubscribedEvents() - { - if (m_eventsubscription > 0) - return true; - return false; - } - - public void AddCollision(uint collideWith, ContactPoint contact) - { - if (CollisionEventsThisFrame == null) - { - CollisionEventsThisFrame = new CollisionEventUpdate(); - } - CollisionEventsThisFrame.addCollider(collideWith, contact); - } - - public void SendCollisions() - { - if (m_eventsubscription >= m_requestedUpdateFrequency) - { - if (CollisionEventsThisFrame != null) - { - base.SendCollisionUpdate(CollisionEventsThisFrame); - } - CollisionEventsThisFrame = new CollisionEventUpdate(); - m_eventsubscription = 0; - } - return; - } - - internal void Dispose() - { - if (Body.isInWorld()) - m_parent_scene.removeFromWorld(Body); - - if (m_aMotor.Handle != IntPtr.Zero) - m_parent_scene.getBulletWorld().removeConstraint(m_aMotor); - - m_aMotor.Dispose(); m_aMotor = null; - ClosestCastResult.Dispose(); ClosestCastResult = null; - Body.Dispose(); Body = null; - Shell.Dispose(); Shell = null; - tempQuat1.Dispose(); - tempTrans1.Dispose(); - tempVector1.Dispose(); - tempVector2.Dispose(); - tempVector3.Dispose(); - tempVector4.Dispose(); - tempVector5RayCast.Dispose(); - tempVector6RayCast.Dispose(); - - } - - public void ProcessTaints(float timestep) - { - - if (m_tainted_isPhysical != m_isPhysical) - { - if (m_tainted_isPhysical) - { - // Create avatar capsule and related ODE data - if (!(Shell == null && Body == null)) - { - m_log.Warn("[PHYSICS]: re-creating the following avatar ODE data, even though it already exists - " - + (Shell != null ? "Shell " : "") - + (Body != null ? "Body " : "")); - } - AvatarGeomAndBodyCreation(m_position.X, m_position.Y, m_position.Z); - - - } - else - { - // destroy avatar capsule and related ODE data - - Dispose(); - tempVector1 = new btVector3(0, 0, 0); - tempVector2 = new btVector3(0, 0, 0); - tempVector3 = new btVector3(0, 0, 0); - tempVector4 = new btVector3(0, 0, 0); - - tempVector5RayCast = new btVector3(0, 0, 0); - tempVector6RayCast = new btVector3(0, 0, 0); - tempVector7RayCast = new btVector3(0, 0, 0); - - tempQuat1 = new btQuaternion(0, 0, 0, 1); - tempTrans1 = new btTransform(tempQuat1, tempVector1); - // m_movementComparision = new PhysicsVector(0, 0, 0); - m_CapsuleOrientationAxis = new btVector3(1, 0, 1); - } - - m_isPhysical = m_tainted_isPhysical; - } - - if (m_tainted_CAPSULE_LENGTH != CAPSULE_LENGTH) - { - if (Body != null) - { - - m_pidControllerActive = true; - // no lock needed on _parent_scene.OdeLock because we are called from within the thread lock in OdePlugin's simulate() - //d.JointDestroy(Amotor); - float prevCapsule = CAPSULE_LENGTH; - CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH; - //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); - Dispose(); - - tempVector1 = new btVector3(0, 0, 0); - tempVector2 = new btVector3(0, 0, 0); - tempVector3 = new btVector3(0, 0, 0); - tempVector4 = new btVector3(0, 0, 0); - - tempVector5RayCast = new btVector3(0, 0, 0); - tempVector6RayCast = new btVector3(0, 0, 0); - tempVector7RayCast = new btVector3(0, 0, 0); - - tempQuat1 = new btQuaternion(0, 0, 0, 1); - tempTrans1 = new btTransform(tempQuat1, tempVector1); - // m_movementComparision = new PhysicsVector(0, 0, 0); - m_CapsuleOrientationAxis = new btVector3(1, 0, 1); - - AvatarGeomAndBodyCreation(m_position.X, m_position.Y, - m_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2)); - Velocity = Vector3.Zero; - - } - else - { - m_log.Warn("[PHYSICS]: trying to change capsule size, but the following ODE data is missing - " - + (Shell == null ? "Shell " : "") - + (Body == null ? "Body " : "")); - } - } - if (m_taintRemove) - { - Dispose(); - } - } - - /// - /// Called from Simulate - /// This is the avatar's movement control + PID Controller - /// - /// - public void Move(float timeStep) - { - // no lock; for now it's only called from within Simulate() - - // If the PID Controller isn't active then we set our force - // calculating base velocity to the current position - if (Body == null) - return; - tempTrans1.Dispose(); - tempTrans1 = Body.getInterpolationWorldTransform(); - tempVector1.Dispose(); - tempVector1 = tempTrans1.getOrigin(); - tempVector2.Dispose(); - tempVector2 = Body.getInterpolationLinearVelocity(); - - if (m_pidControllerActive == false) - { - m_zeroPosition.X = tempVector1.getX(); - m_zeroPosition.Y = tempVector1.getY(); - m_zeroPosition.Z = tempVector1.getZ(); - } - //PidStatus = true; - - Vector3 vec = Vector3.Zero; - - Vector3 vel = new Vector3(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); - - float movementdivisor = 1f; - - if (!m_alwaysRun) - { - movementdivisor = walkDivisor; - } - else - { - movementdivisor = runDivisor; - } - - // if velocity is zero, use position control; otherwise, velocity control - if (m_target_velocity.X == 0.0f && m_target_velocity.Y == 0.0f && m_target_velocity.Z == 0.0f && m_iscolliding) - { - // keep track of where we stopped. No more slippin' & slidin' - if (!m_zeroFlag) - { - m_zeroFlag = true; - m_zeroPosition.X = tempVector1.getX(); - m_zeroPosition.Y = tempVector1.getY(); - m_zeroPosition.Z = tempVector1.getZ(); - } - if (m_pidControllerActive) - { - // We only want to deactivate the PID Controller if we think we want to have our surrogate - // react to the physics scene by moving it's position. - // Avatar to Avatar collisions - // Prim to avatar collisions - - Vector3 pos = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); - vec.X = (m_target_velocity.X - vel.X) * (PID_D) + (m_zeroPosition.X - pos.X) * (PID_P * 2); - vec.Y = (m_target_velocity.Y - vel.Y) * (PID_D) + (m_zeroPosition.Y - pos.Y) * (PID_P * 2); - if (m_flying) - { - vec.Z = (m_target_velocity.Z - vel.Z) * (PID_D) + (m_zeroPosition.Z - pos.Z) * PID_P; - } - } - //PidStatus = true; - } - else - { - m_pidControllerActive = true; - m_zeroFlag = false; - if (m_iscolliding && !m_flying) - { - // We're standing on something - vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D); - vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D); - } - else if (m_iscolliding && m_flying) - { - // We're flying and colliding with something - vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D / 16); - vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D / 16); - } - else if (!m_iscolliding && m_flying) - { - // we're in mid air suspended - vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D / 6); - vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D / 6); - - // We don't want linear velocity to cause our avatar to bounce, so we check target Z and actual velocity X, Y - // rebound preventing - if (m_target_velocity.Z < 0.025f && m_velocity.X < 0.25f && m_velocity.Y < 0.25f) - m_zeroFlag = true; - } - - if (m_iscolliding && !m_flying && m_target_velocity.Z > 0.0f) - { - // We're colliding with something and we're not flying but we're moving - // This means we're walking or running. - Vector3 pos = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); - vec.Z = (m_target_velocity.Z - vel.Z) * PID_D + (m_zeroPosition.Z - pos.Z) * PID_P; - if (m_target_velocity.X > 0) - { - vec.X = ((m_target_velocity.X - vel.X) / 1.2f) * PID_D; - } - if (m_target_velocity.Y > 0) - { - vec.Y = ((m_target_velocity.Y - vel.Y) / 1.2f) * PID_D; - } - } - else if (!m_iscolliding && !m_flying) - { - // we're not colliding and we're not flying so that means we're falling! - // m_iscolliding includes collisions with the ground. - - // d.Vector3 pos = d.BodyGetPosition(Body); - if (m_target_velocity.X > 0) - { - vec.X = ((m_target_velocity.X - vel.X) / 1.2f) * PID_D; - } - if (m_target_velocity.Y > 0) - { - vec.Y = ((m_target_velocity.Y - vel.Y) / 1.2f) * PID_D; - } - } - - - if (m_flying) - { - vec.Z = (m_target_velocity.Z - vel.Z) * (PID_D); - } - } - if (m_flying) - { - // Slight PID correction - vec.Z += (((-1 * m_parent_scene.gravityz) * m_mass) * 0.06f); - - - //auto fly height. Kitto Flora - //d.Vector3 pos = d.BodyGetPosition(Body); - float target_altitude = m_parent_scene.GetTerrainHeightAtXY(m_position.X, m_position.Y) + 5.0f; - - if (m_position.Z < target_altitude) - { - vec.Z += (target_altitude - m_position.Z) * PID_P * 5.0f; - } - - } - if (Body != null && (((m_target_velocity.X > 0.2f || m_target_velocity.X < -0.2f) || (m_target_velocity.Y > 0.2f || m_target_velocity.Y < -0.2f)))) - { - Body.setFriction(0.001f); - //m_log.DebugFormat("[PHYSICS]: Avatar force applied: {0}, Target:{1}", vec.ToString(), m_target_velocity.ToString()); - } - - if (Body != null) - { - int activationstate = Body.getActivationState(); - if (activationstate == 0) - { - Body.forceActivationState(1); - } - - - } - doImpulse(vec, true); - } - - /// - /// Updates the reported position and velocity. This essentially sends the data up to ScenePresence. - /// - public void UpdatePositionAndVelocity() - { - if (Body == null) - return; - //int val = Environment.TickCount; - CheckIfStandingOnObject(); - //m_log.DebugFormat("time:{0}", Environment.TickCount - val); - - //IsColliding = Body.checkCollideWith(m_parent_scene.TerrainBody); - - tempTrans1.Dispose(); - tempTrans1 = Body.getInterpolationWorldTransform(); - tempVector1.Dispose(); - tempVector1 = tempTrans1.getOrigin(); - tempVector2.Dispose(); - tempVector2 = Body.getInterpolationLinearVelocity(); - - // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! - Vector3 vec = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); - - // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) - if (vec.X < -10.0f) vec.X = 0.0f; - if (vec.Y < -10.0f) vec.Y = 0.0f; - if (vec.X > (int)Constants.RegionSize + 10.2f) vec.X = (int)Constants.RegionSize + 10.2f; - if (vec.Y > (int)Constants.RegionSize + 10.2f) vec.Y = (int)Constants.RegionSize + 10.2f; - - m_position.X = vec.X; - m_position.Y = vec.Y; - m_position.Z = vec.Z; - - // Did we move last? = zeroflag - // This helps keep us from sliding all over - - if (m_zeroFlag) - { - m_velocity.X = 0.0f; - m_velocity.Y = 0.0f; - m_velocity.Z = 0.0f; - - // Did we send out the 'stopped' message? - if (!m_lastUpdateSent) - { - m_lastUpdateSent = true; - //base.RequestPhysicsterseUpdate(); - - } - } - else - { - m_lastUpdateSent = false; - vec = new Vector3(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); - m_velocity.X = (vec.X); - m_velocity.Y = (vec.Y); - - m_velocity.Z = (vec.Z); - //m_log.Debug(m_target_velocity); - if (m_velocity.Z < -6 && !m_hackSentFall) - { - m_hackSentFall = true; - m_pidControllerActive = false; - } - else if (m_flying && !m_hackSentFly) - { - //m_hackSentFly = true; - //base.SendCollisionUpdate(new CollisionEventUpdate()); - } - else - { - m_hackSentFly = false; - m_hackSentFall = false; - } - } - if (Body != null) - { - if (Body.getFriction() < 0.9f) - Body.setFriction(0.9f); - } - //if (Body != null) - // Body.clearForces(); - } - - public void CheckIfStandingOnObject() - { - - float capsuleHalfHeight = ((CAPSULE_LENGTH + 2*CAPSULE_RADIUS)*0.5f); - - tempVector5RayCast.setValue(m_position.X, m_position.Y, m_position.Z); - tempVector6RayCast.setValue(m_position.X, m_position.Y, m_position.Z - 1 * capsuleHalfHeight * 1.1f); - - - ClosestCastResult.Dispose(); - ClosestCastResult = new ClosestNotMeRayResultCallback(Body); - - try - { - m_parent_scene.getBulletWorld().rayTest(tempVector5RayCast, tempVector6RayCast, ClosestCastResult); - } - catch (AccessViolationException) - { - m_log.Debug("BAD!"); - } - if (ClosestCastResult.hasHit()) - { - - if (tempVector7RayCast != null) - tempVector7RayCast.Dispose(); - - //tempVector7RayCast = ClosestCastResult.getHitPointWorld(); - - /*if (tempVector7RayCast == null) // null == no result also - { - CollidingObj = false; - IsColliding = false; - CollidingGround = false; - - return; - } - float zVal = tempVector7RayCast.getZ(); - if (zVal != 0) - m_log.Debug("[PHYSICS]: HAAAA"); - if (zVal < m_position.Z && zVal > ((CAPSULE_LENGTH + 2 * CAPSULE_RADIUS) *0.5f)) - { - CollidingObj = true; - IsColliding = true; - } - else - { - CollidingObj = false; - IsColliding = false; - CollidingGround = false; - }*/ - - //height+2*radius = capsule full length - //CollidingObj = true; - //IsColliding = true; - m_iscolliding = true; - } - else - { - //CollidingObj = false; - //IsColliding = false; - //CollidingGround = false; - m_iscolliding = false; - } - } - } - -} diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPlugin.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPlugin.cs deleted file mode 100644 index cf75c489e3..0000000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPlugin.cs +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using OpenSim.Region.Physics.Manager; - -namespace OpenSim.Region.Physics.BulletDotNETPlugin -{ - public class BulletDotNetPlugin : IPhysicsPlugin - { - private BulletDotNETScene m_scene; - private const string m_pluginName = "BulletDotNETPlugin"; - - #region IPhysicsPlugin Members - - public bool Init() - { - return true; - } - - public PhysicsScene GetScene(string sceneIdentifier) - { - if (m_scene == null) - { - m_scene = new BulletDotNETScene(sceneIdentifier); - } - return m_scene; - } - - public string GetName() - { - return m_pluginName; - } - - public void Dispose() - { - - } - - #endregion - } -} \ No newline at end of file diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPluginStructs.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPluginStructs.cs deleted file mode 100644 index 578c22a69a..0000000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPluginStructs.cs +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; - -public enum StatusIndicators : int -{ - Generic = 0, - Start = 1, - End = 2 -} - -public struct sCollisionData -{ - public uint ColliderLocalId; - public uint CollidedWithLocalId; - public int NumberOfCollisions; - public int CollisionType; - public int StatusIndicator; - public int lastframe; -} - -[Flags] -public enum CollisionCategories : int -{ - Disabled = 0, - Geom = 0x00000001, - Body = 0x00000002, - Space = 0x00000004, - Character = 0x00000008, - Land = 0x00000010, - Water = 0x00000020, - Wind = 0x00000040, - Sensor = 0x00000080, - Selected = 0x00000100 -} \ No newline at end of file diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs deleted file mode 100644 index dc3229a752..0000000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs +++ /dev/null @@ -1,2767 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Threading; -using log4net; -using OpenMetaverse; -using BulletDotNET; -using OpenSim.Framework; -using OpenSim.Region.Physics.Manager; - - -namespace OpenSim.Region.Physics.BulletDotNETPlugin -{ - public class BulletDotNETPrim : PhysicsActor - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private Vector3 _position; - private Vector3 m_zeroPosition; - private Vector3 _velocity; - private Vector3 _torque; - private Vector3 m_lastVelocity; - private Vector3 m_lastposition; - private Quaternion m_lastorientation = Quaternion.Identity; - private Vector3 m_rotationalVelocity; - private Vector3 _size; - private Vector3 _acceleration; - // private d.Vector3 _zeroPosition = new d.Vector3(0.0f, 0.0f, 0.0f); - private Quaternion _orientation; - private Vector3 m_taintposition; - private Vector3 m_taintsize; - private Vector3 m_taintVelocity; - private Vector3 m_taintTorque; - private Quaternion m_taintrot; - private Vector3 m_angularlock = Vector3.One; - private Vector3 m_taintAngularLock = Vector3.One; - // private btGeneric6DofConstraint Amotor; - - private Vector3 m_PIDTarget; - private float m_PIDTau; - private float m_PIDHoverHeight; - private float m_PIDHoverTau; - private bool m_useHoverPID; - private PIDHoverType m_PIDHoverType = PIDHoverType.Ground; - private float m_targetHoverHeight; - private float m_groundHeight; - private float m_waterHeight; - private float PID_D = 35f; - private float PID_G = 25f; - // private float m_tensor = 5f; - // private int body_autodisable_frames = 20; - private IMesh primMesh; - - private bool m_usePID; - - private const CollisionCategories m_default_collisionFlags = (CollisionCategories.Geom - | CollisionCategories.Space - | CollisionCategories.Body - | CollisionCategories.Character - ); - - private bool m_taintshape; - private bool m_taintPhysics; - // private bool m_collidesLand = true; - private bool m_collidesWater; - public bool m_returnCollisions; - - // Default we're a Geometry - // private CollisionCategories m_collisionCategories = (CollisionCategories.Geom); - - // Default, Collide with Other Geometries, spaces and Bodies - // private CollisionCategories m_collisionFlags = m_default_collisionFlags; - - public bool m_taintremove; - public bool m_taintdisable; - public bool m_disabled; - public bool m_taintadd; - public bool m_taintselected; - public bool m_taintCollidesWater; - - public uint m_localID; - - //public GCHandle gc; - // private CollisionLocker ode; - - private bool m_taintforce; - private bool m_taintaddangularforce; - private Vector3 m_force; - private List m_forcelist = new List(); - private List m_angularforcelist = new List(); - - private IMesh _mesh; - private PrimitiveBaseShape _pbs; - private BulletDotNETScene _parent_scene; - public btCollisionShape prim_geom; - public IntPtr _triMeshData; - - private PhysicsActor _parent; - private PhysicsActor m_taintparent; - - private List childrenPrim = new List(); - - private bool iscolliding; - private bool m_isphysical; - private bool m_isSelected; - - internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively - - private bool m_throttleUpdates; - // private int throttleCounter; - public int m_interpenetrationcount; - public float m_collisionscore; - public int m_roundsUnderMotionThreshold; - private int m_crossingfailures; - - public float m_buoyancy; - - public bool outofBounds; - private float m_density = 10.000006836f; // Aluminum g/cm3; - - public bool _zeroFlag; - private bool m_lastUpdateSent; - - - private String m_primName; - private Vector3 _target_velocity; - - public int m_eventsubscription; - private int m_requestedUpdateFrequency = 0; - private CollisionEventUpdate CollisionEventsThisFrame = null; - - public volatile bool childPrim; - - private btVector3 tempPosition1; - private btVector3 tempPosition2; - private btVector3 tempPosition3; - private btVector3 tempSize1; - private btVector3 tempSize2; - private btVector3 tempLinearVelocity1; - private btVector3 tempLinearVelocity2; - private btVector3 tempAngularVelocity1; - private btVector3 tempAngularVelocity2; - private btVector3 tempInertia1; - private btVector3 tempInertia2; - private btVector3 tempAddForce; - private btQuaternion tempOrientation1; - private btQuaternion tempOrientation2; - private btMotionState tempMotionState1; - private btMotionState tempMotionState2; - private btMotionState tempMotionState3; - private btTransform tempTransform1; - private btTransform tempTransform2; - private btTransform tempTransform3; - private btTransform tempTransform4; - private btTriangleIndexVertexArray btshapeArray; - private btVector3 AxisLockAngleHigh; - private btVector3 AxisLockLinearLow; - private btVector3 AxisLockLinearHigh; - private bool forceenable = false; - - private btGeneric6DofConstraint m_aMotor; - - public btRigidBody Body; - - public BulletDotNETPrim(String primName, BulletDotNETScene parent_scene, Vector3 pos, Vector3 size, - Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical) - { - tempPosition1 = new btVector3(0, 0, 0); - tempPosition2 = new btVector3(0, 0, 0); - tempPosition3 = new btVector3(0, 0, 0); - tempSize1 = new btVector3(0, 0, 0); - tempSize2 = new btVector3(0, 0, 0); - tempLinearVelocity1 = new btVector3(0, 0, 0); - tempLinearVelocity2 = new btVector3(0, 0, 0); - tempAngularVelocity1 = new btVector3(0, 0, 0); - tempAngularVelocity2 = new btVector3(0, 0, 0); - tempInertia1 = new btVector3(0, 0, 0); - tempInertia2 = new btVector3(0, 0, 0); - tempOrientation1 = new btQuaternion(0, 0, 0, 1); - tempOrientation2 = new btQuaternion(0, 0, 0, 1); - _parent_scene = parent_scene; - tempTransform1 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); - tempTransform2 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; - tempTransform3 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; - tempTransform4 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; - - tempMotionState1 = new btDefaultMotionState(_parent_scene.TransZero); - tempMotionState2 = new btDefaultMotionState(_parent_scene.TransZero); - tempMotionState3 = new btDefaultMotionState(_parent_scene.TransZero); - - - AxisLockLinearLow = new btVector3(-1 * (int)Constants.RegionSize, -1 * (int)Constants.RegionSize, -1 * (int)Constants.RegionSize); - int regionsize = (int)Constants.RegionSize; - - if (regionsize == 256) - regionsize = 512; - - AxisLockLinearHigh = new btVector3((int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionSize); - - _target_velocity = Vector3.Zero; - _velocity = Vector3.Zero; - _position = pos; - m_taintposition = pos; - PID_D = parent_scene.bodyPIDD; - PID_G = parent_scene.bodyPIDG; - m_density = parent_scene.geomDefaultDensity; - // m_tensor = parent_scene.bodyMotorJointMaxforceTensor; - // body_autodisable_frames = parent_scene.bodyFramesAutoDisable; - - prim_geom = null; - Body = null; - - if (size.X <= 0) size.X = 0.01f; - if (size.Y <= 0) size.Y = 0.01f; - if (size.Z <= 0) size.Z = 0.01f; - - _size = size; - m_taintsize = _size; - _acceleration = Vector3.Zero; - m_rotationalVelocity = Vector3.Zero; - _orientation = rotation; - m_taintrot = _orientation; - _mesh = mesh; - _pbs = pbs; - - _parent_scene = parent_scene; - - if (pos.Z < 0) - m_isphysical = false; - else - { - m_isphysical = pisPhysical; - // If we're physical, we need to be in the master space for now. - // linksets *should* be in a space together.. but are not currently - } - m_primName = primName; - m_taintadd = true; - _parent_scene.AddPhysicsActorTaint(this); - - } - - #region PhysicsActor overrides - - public override bool Stopped - { - get { return _zeroFlag; } - } - - public override Vector3 Size - { - get { return _size; } - set { _size = value; } - } - - public override PrimitiveBaseShape Shape - { - set - { - _pbs = value; - m_taintshape = true; - } - } - - public override uint LocalID - { - set - { - //m_log.Info("[PHYSICS]: Setting TrackerID: " + value); - m_localID = value; - } - } - - public override bool Grabbed - { - set { return; } - } - - public override bool Selected - { - set - { - // This only makes the object not collidable if the object - // is physical or the object is modified somehow *IN THE FUTURE* - // without this, if an avatar selects prim, they can walk right - // through it while it's selected - m_collisionscore = 0; - if ((m_isphysical && !_zeroFlag) || !value) - { - m_taintselected = value; - _parent_scene.AddPhysicsActorTaint(this); - } - else - { - m_taintselected = value; - m_isSelected = value; - } - } - } - - public override void CrossingFailure() - { - m_crossingfailures++; - if (m_crossingfailures > _parent_scene.geomCrossingFailuresBeforeOutofbounds) - { - base.RaiseOutOfBounds(_position); - return; - } - else if (m_crossingfailures == _parent_scene.geomCrossingFailuresBeforeOutofbounds) - { - m_log.Warn("[PHYSICS]: Too many crossing failures for: " + m_primName); - } - } - public override void link(PhysicsActor obj) - { - m_taintparent = obj; - } - - public override void delink() - { - m_taintparent = null; - } - - public override void LockAngularMotion(Vector3 axis) - { - m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); - m_taintAngularLock = axis; - } - - public override Vector3 Position - { - get { return _position; } - - set - { - _position = value; - //m_log.Info("[PHYSICS]: " + _position.ToString()); - } - } - - public override float Mass - { - get { return CalculateMass(); } - } - - public override Vector3 Force - { - //get { return Vector3.Zero; } - get { return m_force; } - set { m_force = value; } - } - - public override int VehicleType - { - get { return 0; } - set { return; } - } - - public override void VehicleFloatParam(int param, float value) - { - //TODO: - } - - public override void VehicleVectorParam(int param, Vector3 value) - { - //TODO: - } - - public override void VehicleRotationParam(int param, Quaternion rotation) - { - //TODO: - } - - public override void VehicleFlags(int param, bool remove) - { - - } - - public override void SetVolumeDetect(int param) - { - //TODO: GhostObject - m_isVolumeDetect = (param != 0); - - } - - public override Vector3 GeometricCenter - { - get { return Vector3.Zero; } - } - - public override Vector3 CenterOfMass - { - get { return Vector3.Zero; } - } - - public override Vector3 Velocity - { - get - { - // Averate previous velocity with the new one so - // client object interpolation works a 'little' better - Vector3 returnVelocity; - returnVelocity.X = (m_lastVelocity.X + _velocity.X) / 2; - returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y) / 2; - returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z) / 2; - return returnVelocity; - } - set - { - _velocity = value; - - m_taintVelocity = value; - _parent_scene.AddPhysicsActorTaint(this); - } - } - - public override Vector3 Torque - { - get - { - if (!m_isphysical || Body.Handle == IntPtr.Zero) - return Vector3.Zero; - - return _torque; - } - - set - { - m_taintTorque = value; - _parent_scene.AddPhysicsActorTaint(this); - } - } - - public override float CollisionScore - { - get { return m_collisionscore; } - set { m_collisionscore = value; } - } - - public override Vector3 Acceleration - { - get { return _acceleration; } - } - - public override Quaternion Orientation - { - get { return _orientation; } - set { _orientation = value; } - } - - public override int PhysicsActorType - { - get { return (int)ActorTypes.Prim; } - set { return; } - } - - public override bool IsPhysical - { - get { return m_isphysical; } - set { m_isphysical = value; } - } - - public override bool Flying - { - // no flying prims for you - get { return false; } - set { } - } - - public override bool SetAlwaysRun - { - get { return false; } - set { return; } - } - - public override bool ThrottleUpdates - { - get { return m_throttleUpdates; } - set { m_throttleUpdates = value; } - } - - public override bool IsColliding - { - get { return iscolliding; } - set { iscolliding = value; } - } - - public override bool CollidingGround - { - get { return false; } - set { return; } - } - - public override bool CollidingObj - { - get { return false; } - set { return; } - } - - public override bool FloatOnWater - { - set - { - m_taintCollidesWater = value; - _parent_scene.AddPhysicsActorTaint(this); - } - } - - public override Vector3 RotationalVelocity - { - get - { - Vector3 pv = Vector3.Zero; - if (_zeroFlag) - return pv; - m_lastUpdateSent = false; - - if (m_rotationalVelocity.ApproxEquals(pv, 0.2f)) - return pv; - - return m_rotationalVelocity; - } - set { m_rotationalVelocity = value; } - } - - public override bool Kinematic - { - get { return false; } - set { } - } - - public override float Buoyancy - { - get { return m_buoyancy; } - set { m_buoyancy = value; } - } - - public override Vector3 PIDTarget { set { m_PIDTarget = value; ; } } - public override bool PIDActive { set { m_usePID = value; } } - public override float PIDTau { set { m_PIDTau = value; } } - - public override float PIDHoverHeight { set { m_PIDHoverHeight = value; ; } } - public override bool PIDHoverActive { set { m_useHoverPID = value; } } - public override PIDHoverType PIDHoverType { set { m_PIDHoverType = value; } } - public override float PIDHoverTau { set { m_PIDHoverTau = value; } } - - public override Quaternion APIDTarget { set { return; } } - public override bool APIDActive { set { return; } } - public override float APIDStrength { set { return; } } - public override float APIDDamping { set { return; } } - - public override void AddForce(Vector3 force, bool pushforce) - { - m_forcelist.Add(force); - m_taintforce = true; - //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); - } - - public override void AddAngularForce(Vector3 force, bool pushforce) - { - m_angularforcelist.Add(force); - m_taintaddangularforce = true; - } - - public override void SetMomentum(Vector3 momentum) - { - } - - public override void SubscribeEvents(int ms) - { - m_eventsubscription = ms; - m_requestedUpdateFrequency = ms; - _parent_scene.addCollisionEventReporting(this); - } - - public override void UnSubscribeEvents() - { - _parent_scene.remCollisionEventReporting(this); - m_eventsubscription = 0; - m_requestedUpdateFrequency = 0; - } - - public override bool SubscribedEvents() - { - return (m_eventsubscription > 0); - } - - #endregion - - public void AddCollision(uint collideWith, ContactPoint contact) - { - if (CollisionEventsThisFrame == null) - { - CollisionEventsThisFrame = new CollisionEventUpdate(); - } - CollisionEventsThisFrame.addCollider(collideWith, contact); - } - - public void SendCollisions() - { - if (m_eventsubscription >= m_requestedUpdateFrequency) - { - if (CollisionEventsThisFrame != null) - { - base.SendCollisionUpdate(CollisionEventsThisFrame); - } - CollisionEventsThisFrame = null; - // m_eventsubscription = 0; - } - return; - } - - internal void Dispose() - { - //TODO: - DisableAxisMotor(); - DisposeOfBody(); - SetCollisionShape(null); - - if (tempMotionState3 != null && tempMotionState3.Handle != IntPtr.Zero) - { - tempMotionState3.Dispose(); - tempMotionState3 = null; - } - - if (tempMotionState2 != null && tempMotionState2.Handle != IntPtr.Zero) - { - tempMotionState2.Dispose(); - tempMotionState2 = null; - } - - if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) - { - tempMotionState1.Dispose(); - tempMotionState1 = null; - } - - if (tempTransform4 != null && tempTransform4.Handle != IntPtr.Zero) - { - tempTransform4.Dispose(); - tempTransform4 = null; - } - - if (tempTransform3 != null && tempTransform3.Handle != IntPtr.Zero) - { - tempTransform3.Dispose(); - tempTransform3 = null; - } - - if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) - { - tempTransform2.Dispose(); - tempTransform2 = null; - } - - if (tempTransform1 != null && tempTransform1.Handle != IntPtr.Zero) - { - tempTransform1.Dispose(); - tempTransform1 = null; - } - - if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) - { - tempOrientation2.Dispose(); - tempOrientation2 = null; - } - - if (tempOrientation1 != null && tempOrientation1.Handle != IntPtr.Zero) - { - tempOrientation1.Dispose(); - tempOrientation1 = null; - } - - if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) - { - tempInertia1.Dispose(); - tempInertia1 = null; - } - - if (tempInertia2 != null && tempInertia2.Handle != IntPtr.Zero) - { - tempInertia2.Dispose(); - tempInertia1 = null; - } - - - if (tempAngularVelocity2 != null && tempAngularVelocity2.Handle != IntPtr.Zero) - { - tempAngularVelocity2.Dispose(); - tempAngularVelocity2 = null; - } - - if (tempAngularVelocity1 != null && tempAngularVelocity1.Handle != IntPtr.Zero) - { - tempAngularVelocity1.Dispose(); - tempAngularVelocity1 = null; - } - - if (tempLinearVelocity2 != null && tempLinearVelocity2.Handle != IntPtr.Zero) - { - tempLinearVelocity2.Dispose(); - tempLinearVelocity2 = null; - } - - if (tempLinearVelocity1 != null && tempLinearVelocity1.Handle != IntPtr.Zero) - { - tempLinearVelocity1.Dispose(); - tempLinearVelocity1 = null; - } - - if (tempSize2 != null && tempSize2.Handle != IntPtr.Zero) - { - tempSize2.Dispose(); - tempSize2 = null; - } - - if (tempSize1 != null && tempSize1.Handle != IntPtr.Zero) - { - tempSize1.Dispose(); - tempSize1 = null; - } - - if (tempPosition3 != null && tempPosition3.Handle != IntPtr.Zero) - { - tempPosition3.Dispose(); - tempPosition3 = null; - } - - if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) - { - tempPosition2.Dispose(); - tempPosition2 = null; - } - - if (tempPosition1 != null && tempPosition1.Handle != IntPtr.Zero) - { - tempPosition1.Dispose(); - tempPosition1 = null; - } - if (AxisLockLinearLow != null && AxisLockLinearLow.Handle != IntPtr.Zero) - { - AxisLockLinearLow.Dispose(); - AxisLockLinearLow = null; - } - if (AxisLockLinearHigh != null && AxisLockLinearHigh.Handle != IntPtr.Zero) - { - AxisLockLinearHigh.Dispose(); - AxisLockLinearHigh = null; - } - - } - - - - public void ProcessTaints(float timestep) - { - if (m_taintadd) - { - // m_log.Debug("[PHYSICS]: TaintAdd"); - changeadd(timestep); - } - - if (prim_geom == null) - { - CreateGeom(IntPtr.Zero, primMesh); - - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - // m_log.Debug("[PHYSICS]: GEOM_DOESNT_EXSIT"); - } - - if (prim_geom.Handle == IntPtr.Zero) - { - CreateGeom(IntPtr.Zero, primMesh); - - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - // m_log.Debug("[PHYSICS]: GEOM_DOESNT_EXSIT"); - - } - - if (!_position.ApproxEquals(m_taintposition, 0f)) - { - // m_log.Debug("[PHYSICS]: TaintMove"); - changemove(timestep); - } - if (m_taintrot != _orientation) - { - // m_log.Debug("[PHYSICS]: TaintRotate"); - rotate(timestep); - } // - - if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent)) - { - // m_log.Debug("[PHYSICS]: TaintPhysics"); - changePhysicsStatus(timestep); - } - // - - if (!_size.ApproxEquals(m_taintsize, 0f)) - { - // m_log.Debug("[PHYSICS]: TaintSize"); - changesize(timestep); - } - - // - - if (m_taintshape) - { - // m_log.Debug("[PHYSICS]: TaintShape"); - changeshape(timestep); - } // - - if (m_taintforce) - { - // m_log.Debug("[PHYSICS]: TaintForce"); - changeAddForce(timestep); - } - if (m_taintaddangularforce) - { - // m_log.Debug("[PHYSICS]: TaintAngularForce"); - changeAddAngularForce(timestep); - } - if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) - { - // m_log.Debug("[PHYSICS]: TaintTorque"); - changeSetTorque(timestep); - } - if (m_taintdisable) - { - // m_log.Debug("[PHYSICS]: TaintDisable"); - changedisable(timestep); - } - if (m_taintselected != m_isSelected) - { - // m_log.Debug("[PHYSICS]: TaintSelected"); - changeSelectedStatus(timestep); - } - if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) - { - // m_log.Debug("[PHYSICS]: TaintVelocity"); - changevelocity(timestep); - } - if (m_taintparent != _parent) - { - // m_log.Debug("[PHYSICS]: TaintLink"); - changelink(timestep); - } - if (m_taintCollidesWater != m_collidesWater) - { - changefloatonwater(timestep); - } - if (!m_angularlock.ApproxEquals(m_taintAngularLock, 0)) - { - // m_log.Debug("[PHYSICS]: TaintAngularLock"); - changeAngularLock(timestep); - } - if (m_taintremove) - { - DisposeOfBody(); - Dispose(); - } - - } - - #region Physics Scene Change Action routines - - private void changeadd(float timestep) - { - //SetCollisionShape(null); - // Construction of new prim - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - if (_parent_scene.needsMeshing(_pbs)) - { - // Don't need to re-enable body.. it's done in SetMesh - float meshlod = _parent_scene.meshSculptLOD; - - if (IsPhysical) - meshlod = _parent_scene.MeshSculptphysicalLOD; - - IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical); - // createmesh returns null when it doesn't mesh. - CreateGeom(IntPtr.Zero, mesh); - } - else - { - _mesh = null; - CreateGeom(IntPtr.Zero, null); - } - - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - //changeSelectedStatus(timestep); - m_taintadd = false; - - } - - private void changemove(float timestep) - { - - // m_log.Debug("[PHYSICS]: _________ChangeMove"); - if (!m_isphysical) - { - tempTransform2 = Body.getWorldTransform(); - btQuaternion quat = tempTransform2.getRotation(); - tempPosition2.setValue(_position.X, _position.Y, _position.Z); - tempTransform2.Dispose(); - tempTransform2 = new btTransform(quat, tempPosition2); - Body.setWorldTransform(tempTransform2); - - changeSelectedStatus(timestep); - - resetCollisionAccounting(); - } - else - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - /* - if (_parent_scene.needsMeshing(_pbs)) - { - // Don't need to re-enable body.. it's done in SetMesh - float meshlod = _parent_scene.meshSculptLOD; - - if (IsPhysical) - meshlod = _parent_scene.MeshSculptphysicalLOD; - - IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical); - // createmesh returns null when it doesn't mesh. - CreateGeom(IntPtr.Zero, mesh); - } - else - { - _mesh = null; - CreateGeom(IntPtr.Zero, null); - } - SetCollisionShape(prim_geom); - */ - if (m_isphysical) - SetBody(Mass); - else - SetBody(0); - changeSelectedStatus(timestep); - - resetCollisionAccounting(); - } - m_taintposition = _position; - } - - private void rotate(float timestep) - { - // m_log.Debug("[PHYSICS]: _________ChangeRotate"); - tempTransform2 = Body.getWorldTransform(); - tempOrientation2 = new btQuaternion(_orientation.X, _orientation.Y, _orientation.Z, _orientation.W); - tempTransform2.setRotation(tempOrientation2); - Body.setWorldTransform(tempTransform2); - - resetCollisionAccounting(); - m_taintrot = _orientation; - } - - private void changePhysicsStatus(float timestep) - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - // m_log.Debug("[PHYSICS]: _________ChangePhysics"); - - ProcessGeomCreation(); - - if (m_isphysical) - SetBody(Mass); - else - SetBody(0); - changeSelectedStatus(timestep); - - resetCollisionAccounting(); - m_taintPhysics = m_isphysical; - } - - - - internal void ProcessGeomCreation() - { - if (_parent_scene.needsMeshing(_pbs)) - { - ProcessGeomCreationAsTriMesh(Vector3.Zero, Quaternion.Identity); - // createmesh returns null when it doesn't mesh. - CreateGeom(IntPtr.Zero, _mesh); - } - else - { - _mesh = null; - CreateGeom(IntPtr.Zero, null); - } - SetCollisionShape(prim_geom); - } - - internal bool NeedsMeshing() - { - return _parent_scene.needsMeshing(_pbs); - } - - internal void ProcessGeomCreationAsTriMesh(Vector3 positionOffset, Quaternion orientation) - { - // Don't need to re-enable body.. it's done in SetMesh - float meshlod = _parent_scene.meshSculptLOD; - - if (IsPhysical) - meshlod = _parent_scene.MeshSculptphysicalLOD; - - IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical); - if (!positionOffset.ApproxEquals(Vector3.Zero, 0.001f) || orientation != Quaternion.Identity) - { - - float[] xyz = new float[3]; - xyz[0] = positionOffset.X; - xyz[1] = positionOffset.Y; - xyz[2] = positionOffset.Z; - - Matrix4 m4 = Matrix4.CreateFromQuaternion(orientation); - - float[,] matrix = new float[3, 3]; - - matrix[0, 0] = m4.M11; - matrix[0, 1] = m4.M12; - matrix[0, 2] = m4.M13; - matrix[1, 0] = m4.M21; - matrix[1, 1] = m4.M22; - matrix[1, 2] = m4.M23; - matrix[2, 0] = m4.M31; - matrix[2, 1] = m4.M32; - matrix[2, 2] = m4.M33; - - - mesh.TransformLinear(matrix, xyz); - - - - } - - _mesh = mesh; - } - - private void changesize(float timestep) - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - - // m_log.Debug("[PHYSICS]: _________ChangeSize"); - SetCollisionShape(null); - // Construction of new prim - ProcessGeomCreation(); - - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - - m_taintsize = _size; - - } - - private void changeshape(float timestep) - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - // Cleanup of old prim geometry and Bodies - if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero) - { - if (childPrim) - { - if (_parent != null) - { - BulletDotNETPrim parent = (BulletDotNETPrim)_parent; - parent.ChildDelink(this); - } - } - else - { - //disableBody(); - } - } - try - { - //SetCollisionShape(null); - } - catch (System.AccessViolationException) - { - //prim_geom = IntPtr.Zero; - m_log.Error("[PHYSICS]: PrimGeom dead"); - } - - // we don't need to do space calculation because the client sends a position update also. - if (_size.X <= 0) _size.X = 0.01f; - if (_size.Y <= 0) _size.Y = 0.01f; - if (_size.Z <= 0) _size.Z = 0.01f; - // Construction of new prim - - ProcessGeomCreation(); - - tempPosition1.setValue(_position.X, _position.Y, _position.Z); - if (tempOrientation1.Handle != IntPtr.Zero) - tempOrientation1.Dispose(); - tempOrientation1 = new btQuaternion(_orientation.X, Orientation.Y, _orientation.Z, _orientation.W); - if (tempTransform1 != null && tempTransform1.Handle != IntPtr.Zero) - tempTransform1.Dispose(); - tempTransform1 = new btTransform(tempOrientation1, tempPosition1); - - - - - //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); - if (IsPhysical) - { - SetBody(Mass); - // Re creates body on size. - // EnableBody also does setMass() - - } - else - { - SetBody(0); - } - - changeSelectedStatus(timestep); - if (childPrim) - { - if (_parent is BulletDotNETPrim) - { - BulletDotNETPrim parent = (BulletDotNETPrim)_parent; - parent.ChildSetGeom(this); - } - } - resetCollisionAccounting(); - - m_taintshape = false; - } - - private void resetCollisionAccounting() - { - m_collisionscore = 0; - } - - private void ChildSetGeom(BulletDotNETPrim bulletDotNETPrim) - { - // TODO: throw new NotImplementedException(); - } - - private void changeAddForce(float timestep) - { - if (!m_isSelected) - { - lock (m_forcelist) - { - //m_log.Info("[PHYSICS]: dequeing forcelist"); - if (IsPhysical) - { - Vector3 iforce = Vector3.Zero; - for (int i = 0; i < m_forcelist.Count; i++) - { - iforce = iforce + m_forcelist[i]; - } - - if (Body != null && Body.Handle != IntPtr.Zero) - { - if (tempAddForce != null && tempAddForce.Handle != IntPtr.Zero) - tempAddForce.Dispose(); - enableBodySoft(); - tempAddForce = new btVector3(iforce.X, iforce.Y, iforce.Z); - Body.applyCentralImpulse(tempAddForce); - } - } - m_forcelist.Clear(); - } - - m_collisionscore = 0; - m_interpenetrationcount = 0; - } - - m_taintforce = false; - - } - - private void changeAddAngularForce(float timestep) - { - if (!m_isSelected) - { - lock (m_angularforcelist) - { - //m_log.Info("[PHYSICS]: dequeing forcelist"); - if (IsPhysical) - { - Vector3 iforce = Vector3.Zero; - for (int i = 0; i < m_angularforcelist.Count; i++) - { - iforce = iforce + m_angularforcelist[i]; - } - - if (Body != null && Body.Handle != IntPtr.Zero) - { - if (tempAddForce != null && tempAddForce.Handle != IntPtr.Zero) - tempAddForce.Dispose(); - enableBodySoft(); - tempAddForce = new btVector3(iforce.X, iforce.Y, iforce.Z); - Body.applyTorqueImpulse(tempAddForce); - } - - } - m_angularforcelist.Clear(); - } - - m_collisionscore = 0; - m_interpenetrationcount = 0; - } - - m_taintaddangularforce = false; - } - - private void changeSetTorque(float timestep) - { - if (!m_isSelected) - { - if (IsPhysical) - { - if (Body != null && Body.Handle != IntPtr.Zero) - { - tempAngularVelocity2.setValue(m_taintTorque.X, m_taintTorque.Y, m_taintTorque.Z); - Body.applyTorque(tempAngularVelocity2); - } - } - } - m_taintTorque = Vector3.Zero; - } - - private void changedisable(float timestep) - { - // TODO: throw new NotImplementedException(); - } - - private void changeSelectedStatus(float timestep) - { - // TODO: throw new NotImplementedException(); - if (m_taintselected) - { - // Body.setCollisionFlags((int)ContactFlags.CF_NO_CONTACT_RESPONSE); - disableBodySoft(); - - } - else - { - // Body.setCollisionFlags(0 | (int)ContactFlags.CF_CUSTOM_MATERIAL_CALLBACK); - enableBodySoft(); - } - m_isSelected = m_taintselected; - - } - - private void changevelocity(float timestep) - { - if (!m_isSelected) - { - if (IsPhysical) - { - if (Body != null && Body.Handle != IntPtr.Zero) - { - tempLinearVelocity2.setValue(m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); - Body.setLinearVelocity(tempLinearVelocity2); - } - } - - //resetCollisionAccounting(); - } - m_taintVelocity = Vector3.Zero; - } - - private void changelink(float timestep) - { - if (IsPhysical) - { - // Construction of new prim - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - - if (_parent == null && m_taintparent != null) - { - - if (m_taintparent is BulletDotNETPrim) - { - BulletDotNETPrim obj = (BulletDotNETPrim)m_taintparent; - obj.ParentPrim(this); - childPrim = true; - - } - } - else if (_parent != null && m_taintparent == null) - { - if (_parent is BulletDotNETPrim) - { - BulletDotNETPrim obj = (BulletDotNETPrim)_parent; - obj.ChildDelink(obj); - - childPrim = false; - } - } - - if (m_taintparent != null) - { - Vector3 taintparentPosition = m_taintparent.Position; - taintparentPosition.Z = m_taintparent.Position.Z + 0.02f; - m_taintparent.Position = taintparentPosition; - _parent_scene.AddPhysicsActorTaint(m_taintparent); - } - } - _parent = m_taintparent; - - m_taintPhysics = m_isphysical; - - } - - private void changefloatonwater(float timestep) - { - // TODO: throw new NotImplementedException(); - } - - private void changeAngularLock(float timestep) - { - if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero) - { - if (_parent == null) - { - if (!m_taintAngularLock.ApproxEquals(Vector3.One, 0f)) - { - //d.BodySetFiniteRotationMode(Body, 0); - //d.BodySetFiniteRotationAxis(Body,m_taintAngularLock.X,m_taintAngularLock.Y,m_taintAngularLock.Z); - EnableAxisMotor(m_taintAngularLock); - } - else - { - DisableAxisMotor(); - } - } - - } - m_angularlock = m_taintAngularLock; - - } - #endregion - - - - - internal void Move(float timestep) - { - //TODO: - float fx = 0; - float fy = 0; - float fz = 0; - - if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero && !m_isSelected) - { - float m_mass = CalculateMass(); - - fz = 0f; - //m_log.Info(m_collisionFlags.ToString()); - - if (m_buoyancy != 0) - { - if (m_buoyancy > 0) - { - fz = (((-1 * _parent_scene.gravityz) * m_buoyancy) * m_mass) * 0.035f; - - //d.Vector3 l_velocity = d.BodyGetLinearVel(Body); - //m_log.Info("Using Buoyancy: " + buoyancy + " G: " + (_parent_scene.gravityz * m_buoyancy) + "mass:" + m_mass + " Pos: " + Position.ToString()); - } - else - { - fz = (-1 * (((-1 * _parent_scene.gravityz) * (-1 * m_buoyancy)) * m_mass) * 0.035f); - } - } - - if (m_usePID) - { - PID_D = 61f; - PID_G = 65f; - //if (!d.BodyIsEnabled(Body)) - //d.BodySetForce(Body, 0f, 0f, 0f); - // If we're using the PID controller, then we have no gravity - fz = ((-1 * _parent_scene.gravityz) * m_mass) * 1.025f; - - // no lock; for now it's only called from within Simulate() - - // If the PID Controller isn't active then we set our force - // calculating base velocity to the current position - - if ((m_PIDTau < 1) && (m_PIDTau != 0)) - { - //PID_G = PID_G / m_PIDTau; - m_PIDTau = 1; - } - - if ((PID_G - m_PIDTau) <= 0) - { - PID_G = m_PIDTau + 1; - } - - // TODO: NEED btVector3 for Linear Velocity - // NEED btVector3 for Position - - Vector3 pos = _position; //TODO: Insert values gotten from bullet - Vector3 vel = _velocity; - - _target_velocity = - new Vector3( - (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), - (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), - (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) - ); - - if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) - { - - /* TODO: Do Bullet equiv - * - d.BodySetPosition(Body, m_PIDTarget.X, m_PIDTarget.Y, m_PIDTarget.Z); - d.BodySetLinearVel(Body, 0, 0, 0); - d.BodyAddForce(Body, 0, 0, fz); - return; - */ - } - else - { - _zeroFlag = false; - - fx = ((_target_velocity.X) - vel.X) * (PID_D); - fy = ((_target_velocity.Y) - vel.Y) * (PID_D); - fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); - - } - - } - - if (m_useHoverPID && !m_usePID) - { - // If we're using the PID controller, then we have no gravity - fz = (-1 * _parent_scene.gravityz) * m_mass; - - // no lock; for now it's only called from within Simulate() - - // If the PID Controller isn't active then we set our force - // calculating base velocity to the current position - - if ((m_PIDTau < 1)) - { - PID_G = PID_G / m_PIDTau; - } - - if ((PID_G - m_PIDTau) <= 0) - { - PID_G = m_PIDTau + 1; - } - Vector3 pos = Vector3.Zero; //TODO: Insert values gotten from bullet - Vector3 vel = Vector3.Zero; - - // determine what our target height really is based on HoverType - switch (m_PIDHoverType) - { - case PIDHoverType.Absolute: - m_targetHoverHeight = m_PIDHoverHeight; - break; - case PIDHoverType.Ground: - m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y); - m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight; - break; - case PIDHoverType.GroundAndWater: - m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y); - m_waterHeight = _parent_scene.GetWaterLevel(); - if (m_groundHeight > m_waterHeight) - { - m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight; - } - else - { - m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight; - } - break; - case PIDHoverType.Water: - m_waterHeight = _parent_scene.GetWaterLevel(); - m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight; - break; - } - - - _target_velocity = - new Vector3(0.0f, 0.0f, - (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep) - ); - - // if velocity is zero, use position control; otherwise, velocity control - - if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) - { - - /* TODO: Do Bullet Equiv - d.BodySetPosition(Body, pos.X, pos.Y, m_targetHoverHeight); - d.BodySetLinearVel(Body, vel.X, vel.Y, 0); - d.BodyAddForce(Body, 0, 0, fz); - */ - if (Body != null && Body.Handle != IntPtr.Zero) - { - Body.setLinearVelocity(_parent_scene.VectorZero); - Body.clearForces(); - } - return; - } - else - { - _zeroFlag = false; - - // We're flying and colliding with something - fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); - } - } - - fx *= m_mass; - fy *= m_mass; - //fz *= m_mass; - - fx += m_force.X; - fy += m_force.Y; - fz += m_force.Z; - - //m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString()); - if (fx != 0 || fy != 0 || fz != 0) - { - /* - * TODO: Do Bullet Equiv - if (!d.BodyIsEnabled(Body)) - { - d.BodySetLinearVel(Body, 0f, 0f, 0f); - d.BodySetForce(Body, 0, 0, 0); - enableBodySoft(); - } - */ - if (!Body.isActive()) - { - Body.clearForces(); - enableBodySoft(); - } - // 35x10 = 350n times the mass per second applied maximum. - - float nmax = 35f * m_mass; - float nmin = -35f * m_mass; - - - if (fx > nmax) - fx = nmax; - if (fx < nmin) - fx = nmin; - if (fy > nmax) - fy = nmax; - if (fy < nmin) - fy = nmin; - - // TODO: Do Bullet Equiv - // d.BodyAddForce(Body, fx, fy, fz); - if (Body != null && Body.Handle != IntPtr.Zero) - { - Body.activate(true); - if (tempAddForce != null && tempAddForce.Handle != IntPtr.Zero) - tempAddForce.Dispose(); - - tempAddForce = new btVector3(fx * 0.01f, fy * 0.01f, fz * 0.01f); - Body.applyCentralImpulse(tempAddForce); - } - } - else - { - // if no forces on the prim, make sure everything is zero - Body.clearForces(); - enableBodySoft(); - } - } - else - { - if (m_zeroPosition == null) - m_zeroPosition = Vector3.Zero; - m_zeroPosition = _position; - return; - } - } - - - - - #region Mass Calculation - - private float CalculateMass() - { - float volume = 0; - - // No material is passed to the physics engines yet.. soo.. - // we're using the m_density constant in the class definition - - float returnMass = 0; - - switch (_pbs.ProfileShape) - { - case ProfileShape.Square: - // Profile Volume - - volume = _size.X * _size.Y * _size.Z; - - // If the user has 'hollowed out' - // ProfileHollow is one of those 0 to 50000 values :P - // we like percentages better.. so turning into a percentage - - if (((float)_pbs.ProfileHollow / 50000f) > 0.0) - { - float hollowAmount = (float)_pbs.ProfileHollow / 50000f; - - // calculate the hollow volume by it's shape compared to the prim shape - float hollowVolume = 0; - switch (_pbs.HollowShape) - { - case HollowShape.Square: - case HollowShape.Same: - // Cube Hollow volume calculation - float hollowsizex = _size.X * hollowAmount; - float hollowsizey = _size.Y * hollowAmount; - float hollowsizez = _size.Z * hollowAmount; - hollowVolume = hollowsizex * hollowsizey * hollowsizez; - break; - - case HollowShape.Circle: - // Hollow shape is a perfect cyllinder in respect to the cube's scale - // Cyllinder hollow volume calculation - float hRadius = _size.X / 2; - float hLength = _size.Z; - - // pi * r2 * h - hollowVolume = ((float)(Math.PI * Math.Pow(hRadius, 2) * hLength) * hollowAmount); - break; - - case HollowShape.Triangle: - // Equilateral Triangular Prism volume hollow calculation - // Triangle is an Equilateral Triangular Prism with aLength = to _size.Y - - float aLength = _size.Y; - // 1/2 abh - hollowVolume = (float)((0.5 * aLength * _size.X * _size.Z) * hollowAmount); - break; - - default: - hollowVolume = 0; - break; - } - volume = volume - hollowVolume; - } - - break; - case ProfileShape.Circle: - if (_pbs.PathCurve == (byte)Extrusion.Straight) - { - // Cylinder - float volume1 = (float)(Math.PI * Math.Pow(_size.X / 2, 2) * _size.Z); - float volume2 = (float)(Math.PI * Math.Pow(_size.Y / 2, 2) * _size.Z); - - // Approximating the cylinder's irregularity. - if (volume1 > volume2) - { - volume = (float)volume1 - (volume1 - volume2); - } - else if (volume2 > volume1) - { - volume = (float)volume2 - (volume2 - volume1); - } - else - { - // Regular cylinder - volume = volume1; - } - } - else - { - // We don't know what the shape is yet, so use default - volume = _size.X * _size.Y * _size.Z; - } - // If the user has 'hollowed out' - // ProfileHollow is one of those 0 to 50000 values :P - // we like percentages better.. so turning into a percentage - - if (((float)_pbs.ProfileHollow / 50000f) > 0.0) - { - float hollowAmount = (float)_pbs.ProfileHollow / 50000f; - - // calculate the hollow volume by it's shape compared to the prim shape - float hollowVolume = 0; - switch (_pbs.HollowShape) - { - case HollowShape.Same: - case HollowShape.Circle: - // Hollow shape is a perfect cyllinder in respect to the cube's scale - // Cyllinder hollow volume calculation - float hRadius = _size.X / 2; - float hLength = _size.Z; - - // pi * r2 * h - hollowVolume = ((float)(Math.PI * Math.Pow(hRadius, 2) * hLength) * hollowAmount); - break; - - case HollowShape.Square: - // Cube Hollow volume calculation - float hollowsizex = _size.X * hollowAmount; - float hollowsizey = _size.Y * hollowAmount; - float hollowsizez = _size.Z * hollowAmount; - hollowVolume = hollowsizex * hollowsizey * hollowsizez; - break; - - case HollowShape.Triangle: - // Equilateral Triangular Prism volume hollow calculation - // Triangle is an Equilateral Triangular Prism with aLength = to _size.Y - - float aLength = _size.Y; - // 1/2 abh - hollowVolume = (float)((0.5 * aLength * _size.X * _size.Z) * hollowAmount); - break; - - default: - hollowVolume = 0; - break; - } - volume = volume - hollowVolume; - } - break; - - case ProfileShape.HalfCircle: - if (_pbs.PathCurve == (byte)Extrusion.Curve1) - { - if (_size.X == _size.Y && _size.Z == _size.X) - { - // regular sphere - // v = 4/3 * pi * r^3 - float sradius3 = (float)Math.Pow((_size.X / 2), 3); - volume = (float)((4 / 3f) * Math.PI * sradius3); - } - else - { - // we treat this as a box currently - volume = _size.X * _size.Y * _size.Z; - } - } - else - { - // We don't know what the shape is yet, so use default - volume = _size.X * _size.Y * _size.Z; - } - break; - - case ProfileShape.EquilateralTriangle: - /* - v = (abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2) * h - - // seed mesh - Vertex MM = new Vertex(-0.25f, -0.45f, 0.0f); - Vertex PM = new Vertex(+0.5f, 0f, 0.0f); - Vertex PP = new Vertex(-0.25f, +0.45f, 0.0f); - */ - float xA = -0.25f * _size.X; - float yA = -0.45f * _size.Y; - - float xB = 0.5f * _size.X; - float yB = 0; - - float xC = -0.25f * _size.X; - float yC = 0.45f * _size.Y; - - volume = (float)((Math.Abs((xB * yA - xA * yB) + (xC * yB - xB * yC) + (xA * yC - xC * yA)) / 2) * _size.Z); - - // If the user has 'hollowed out' - // ProfileHollow is one of those 0 to 50000 values :P - // we like percentages better.. so turning into a percentage - float fhollowFactor = ((float)_pbs.ProfileHollow / 1.9f); - if (((float)fhollowFactor / 50000f) > 0.0) - { - float hollowAmount = (float)fhollowFactor / 50000f; - - // calculate the hollow volume by it's shape compared to the prim shape - float hollowVolume = 0; - switch (_pbs.HollowShape) - { - case HollowShape.Same: - case HollowShape.Triangle: - // Equilateral Triangular Prism volume hollow calculation - // Triangle is an Equilateral Triangular Prism with aLength = to _size.Y - - float aLength = _size.Y; - // 1/2 abh - hollowVolume = (float)((0.5 * aLength * _size.X * _size.Z) * hollowAmount); - break; - - case HollowShape.Square: - // Cube Hollow volume calculation - float hollowsizex = _size.X * hollowAmount; - float hollowsizey = _size.Y * hollowAmount; - float hollowsizez = _size.Z * hollowAmount; - hollowVolume = hollowsizex * hollowsizey * hollowsizez; - break; - - case HollowShape.Circle: - // Hollow shape is a perfect cyllinder in respect to the cube's scale - // Cyllinder hollow volume calculation - float hRadius = _size.X / 2; - float hLength = _size.Z; - - // pi * r2 * h - hollowVolume = ((float)((Math.PI * Math.Pow(hRadius, 2) * hLength) / 2) * hollowAmount); - break; - - default: - hollowVolume = 0; - break; - } - volume = volume - hollowVolume; - } - break; - - default: - // we don't have all of the volume formulas yet so - // use the common volume formula for all - volume = _size.X * _size.Y * _size.Z; - break; - } - - // Calculate Path cut effect on volume - // Not exact, in the triangle hollow example - // They should never be zero or less then zero.. - // we'll ignore it if it's less then zero - - // ProfileEnd and ProfileBegin are values - // from 0 to 50000 - - // Turning them back into percentages so that I can cut that percentage off the volume - - float PathCutEndAmount = _pbs.ProfileEnd; - float PathCutStartAmount = _pbs.ProfileBegin; - if (((PathCutStartAmount + PathCutEndAmount) / 50000f) > 0.0f) - { - float pathCutAmount = ((PathCutStartAmount + PathCutEndAmount) / 50000f); - - // Check the return amount for sanity - if (pathCutAmount >= 0.99f) - pathCutAmount = 0.99f; - - volume = volume - (volume * pathCutAmount); - } - UInt16 taperX = _pbs.PathScaleX; - UInt16 taperY = _pbs.PathScaleY; - float taperFactorX = 0; - float taperFactorY = 0; - - // Mass = density * volume - if (taperX != 100) - { - if (taperX > 100) - { - taperFactorX = 1.0f - ((float)taperX / 200); - //m_log.Warn("taperTopFactorX: " + extr.taperTopFactorX.ToString()); - } - else - { - taperFactorX = 1.0f - ((100 - (float)taperX) / 100); - //m_log.Warn("taperBotFactorX: " + extr.taperBotFactorX.ToString()); - } - volume = (float)volume * ((taperFactorX / 3f) + 0.001f); - } - - if (taperY != 100) - { - if (taperY > 100) - { - taperFactorY = 1.0f - ((float)taperY / 200); - //m_log.Warn("taperTopFactorY: " + extr.taperTopFactorY.ToString()); - } - else - { - taperFactorY = 1.0f - ((100 - (float)taperY) / 100); - //m_log.Warn("taperBotFactorY: " + extr.taperBotFactorY.ToString()); - } - volume = (float)volume * ((taperFactorY / 3f) + 0.001f); - } - returnMass = m_density * volume; - if (returnMass <= 0) returnMass = 0.0001f;//ckrinke: Mass must be greater then zero. - - - - // Recursively calculate mass - bool HasChildPrim = false; - lock (childrenPrim) - { - if (childrenPrim.Count > 0) - { - HasChildPrim = true; - } - - } - if (HasChildPrim) - { - BulletDotNETPrim[] childPrimArr = new BulletDotNETPrim[0]; - - lock (childrenPrim) - childPrimArr = childrenPrim.ToArray(); - - for (int i = 0; i < childPrimArr.Length; i++) - { - if (childPrimArr[i] != null && !childPrimArr[i].m_taintremove) - returnMass += childPrimArr[i].CalculateMass(); - // failsafe, this shouldn't happen but with OpenSim, you never know :) - if (i > 256) - break; - } - } - - - - - - return returnMass; - } - - #endregion - - - public void CreateGeom(IntPtr m_targetSpace, IMesh p_mesh) - { - // m_log.Debug("[PHYSICS]: _________CreateGeom"); - if (p_mesh != null) - { - //_mesh = _parent_scene.mesher.CreateMesh(m_primName, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical); - _mesh = p_mesh; - setMesh(_parent_scene, _mesh); - - } - else - { - if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) - { - if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) - { - if (((_size.X / 2f) > 0f)) - { - //SetGeom to a Regular Sphere - if (tempSize1 == null) - tempSize1 = new btVector3(0, 0, 0); - tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); - SetCollisionShape(new btSphereShape(_size.X * 0.5f)); - } - else - { - // uses halfextents - if (tempSize1 == null) - tempSize1 = new btVector3(0, 0, 0); - tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); - SetCollisionShape(new btBoxShape(tempSize1)); - } - } - else - { - // uses halfextents - if (tempSize1 == null) - tempSize1 = new btVector3(0, 0, 0); - tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); - SetCollisionShape(new btBoxShape(tempSize1)); - } - - } - else - { - if (tempSize1 == null) - tempSize1 = new btVector3(0, 0, 0); - // uses halfextents - tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); - SetCollisionShape(new btBoxShape(tempSize1)); - } - } - } - - private void setMesh(BulletDotNETScene _parent_scene, IMesh mesh) - { - // TODO: Set Collision Body Mesh - // This sleeper is there to moderate how long it takes between - // setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object - // m_log.Debug("_________SetMesh"); - Thread.Sleep(10); - - //Kill Body so that mesh can re-make the geom - if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero) - { - if (childPrim) - { - if (_parent != null) - { - BulletDotNETPrim parent = (BulletDotNETPrim)_parent; - parent.ChildDelink(this); - } - } - else - { - //disableBody(); - } - } - - //IMesh oldMesh = primMesh; - - //primMesh = mesh; - - //float[] vertexList = primMesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory - //int[] indexList = primMesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage - ////Array.Reverse(indexList); - //primMesh.releaseSourceMeshData(); // free up the original mesh data to save memory - - IMesh oldMesh = primMesh; - - primMesh = mesh; - - float[] vertexList = mesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory - int[] indexList = mesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage - //Array.Reverse(indexList); - mesh.releaseSourceMeshData(); // free up the original mesh data to save memory - - - int VertexCount = vertexList.GetLength(0) / 3; - int IndexCount = indexList.GetLength(0); - - if (btshapeArray != null && btshapeArray.Handle != IntPtr.Zero) - btshapeArray.Dispose(); - //Array.Reverse(indexList); - btshapeArray = new btTriangleIndexVertexArray(IndexCount / 3, indexList, (3 * sizeof(int)), - VertexCount, vertexList, 3 * sizeof(float)); - SetCollisionShape(new btGImpactMeshShape(btshapeArray)); - //((btGImpactMeshShape) prim_geom).updateBound(); - ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); - ((btGImpactMeshShape)prim_geom).updateBound(); - _parent_scene.SetUsingGImpact(); - //if (oldMesh != null) - //{ - // oldMesh.releasePinned(); - // oldMesh = null; - //} - - } - - private void SetCollisionShape(btCollisionShape shape) - { - /* - if (shape == null) - m_log.Debug("[PHYSICS]:SetShape!Null"); - else - m_log.Debug("[PHYSICS]:SetShape!"); - - if (Body != null) - { - DisposeOfBody(); - } - - if (prim_geom != null) - { - prim_geom.Dispose(); - prim_geom = null; - } - */ - prim_geom = shape; - - //Body.set - } - - public void SetBody(float mass) - { - - if (!IsPhysical || childrenPrim.Count == 0) - { - if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) - tempMotionState1.Dispose(); - if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) - tempTransform2.Dispose(); - if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) - tempOrientation2.Dispose(); - - if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) - tempPosition2.Dispose(); - - tempOrientation2 = new btQuaternion(_orientation.X, _orientation.Y, _orientation.Z, _orientation.W); - tempPosition2 = new btVector3(_position.X, _position.Y, _position.Z); - tempTransform2 = new btTransform(tempOrientation2, tempPosition2); - tempMotionState1 = new btDefaultMotionState(tempTransform2, _parent_scene.TransZero); - if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) - tempInertia1.Dispose(); - tempInertia1 = new btVector3(0, 0, 0); - - - prim_geom.calculateLocalInertia(mass, tempInertia1); - - if (mass != 0) - _parent_scene.addActivePrim(this); - else - _parent_scene.remActivePrim(this); - - // Body = new btRigidBody(mass, tempMotionState1, prim_geom); - //else - // Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); - if (Body == null) - { - Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); - // add localID so we can later map bullet object back to OpenSim object - Body.setUserPointer(new IntPtr((int)m_localID)); - } - - - if (prim_geom is btGImpactMeshShape) - { - ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); - ((btGImpactMeshShape)prim_geom).updateBound(); - } - //Body.setCollisionFlags(Body.getCollisionFlags() | (int)ContactFlags.CF_CUSTOM_MATERIAL_CALLBACK); - //Body.setUserPointer((IntPtr) (int)m_localID); - _parent_scene.AddPrimToScene(this); - } - else - { - // bool hasTrimesh = false; - lock (childrenPrim) - { - foreach (BulletDotNETPrim chld in childrenPrim) - { - if (chld == null) - continue; - - // if (chld.NeedsMeshing()) - // hasTrimesh = true; - } - } - - //if (hasTrimesh) - //{ - ProcessGeomCreationAsTriMesh(Vector3.Zero, Quaternion.Identity); - // createmesh returns null when it doesn't mesh. - - /* - if (_mesh is Mesh) - { - } - else - { - m_log.Warn("[PHYSICS]: Can't link a OpenSim.Region.Physics.Meshing.Mesh object"); - return; - } - */ - - - - foreach (BulletDotNETPrim chld in childrenPrim) - { - if (chld == null) - continue; - Vector3 offset = chld.Position - Position; - Vector3 pos = new Vector3(offset.X, offset.Y, offset.Z); - pos *= Quaternion.Inverse(Orientation); - //pos *= Orientation; - offset = pos; - chld.ProcessGeomCreationAsTriMesh(offset, chld.Orientation); - - _mesh.Append(chld._mesh); - - - } - setMesh(_parent_scene, _mesh); - - //} - - if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) - tempMotionState1.Dispose(); - if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) - tempTransform2.Dispose(); - if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) - tempOrientation2.Dispose(); - - if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) - tempPosition2.Dispose(); - - tempOrientation2 = new btQuaternion(_orientation.X, _orientation.Y, _orientation.Z, _orientation.W); - tempPosition2 = new btVector3(_position.X, _position.Y, _position.Z); - tempTransform2 = new btTransform(tempOrientation2, tempPosition2); - tempMotionState1 = new btDefaultMotionState(tempTransform2, _parent_scene.TransZero); - if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) - tempInertia1.Dispose(); - tempInertia1 = new btVector3(0, 0, 0); - - - prim_geom.calculateLocalInertia(mass, tempInertia1); - - if (mass != 0) - _parent_scene.addActivePrim(this); - else - _parent_scene.remActivePrim(this); - - // Body = new btRigidBody(mass, tempMotionState1, prim_geom); - //else - // Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); - if (Body == null) - { - Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); - // each body has the localID stored into it so we can identify collision objects - Body.setUserPointer(new IntPtr((int)m_localID)); - } - - if (prim_geom is btGImpactMeshShape) - { - ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); - ((btGImpactMeshShape)prim_geom).updateBound(); - } - _parent_scene.AddPrimToScene(this); - - } - - if (IsPhysical) - changeAngularLock(0); - } - - private void DisposeOfBody() - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - Body.Dispose(); - } - Body = null; - // TODO: dispose parts that make up body - } - } - - private void ChildDelink(BulletDotNETPrim pPrim) - { - // Okay, we have a delinked child.. need to rebuild the body. - lock (childrenPrim) - { - foreach (BulletDotNETPrim prm in childrenPrim) - { - prm.childPrim = true; - prm.disableBody(); - - } - } - disableBody(); - - lock (childrenPrim) - { - childrenPrim.Remove(pPrim); - } - - - - - if (Body != null && Body.Handle != IntPtr.Zero) - { - _parent_scene.remActivePrim(this); - } - - - - lock (childrenPrim) - { - foreach (BulletDotNETPrim prm in childrenPrim) - { - ParentPrim(prm); - } - } - - } - - internal void ParentPrim(BulletDotNETPrim prm) - { - if (prm == null) - return; - - - - lock (childrenPrim) - { - if (!childrenPrim.Contains(prm)) - { - childrenPrim.Add(prm); - } - } - - - } - - public void disableBody() - { - //this kills the body so things like 'mesh' can re-create it. - /* - lock (this) - { - if (!childPrim) - { - if (Body != null && Body.Handle != IntPtr.Zero) - { - _parent_scene.remActivePrim(this); - - m_collisionCategories &= ~CollisionCategories.Body; - m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); - - if (prim_geom != null && prim_geom.Handle != IntPtr.Zero) - { - // TODO: Set Category bits and Flags - } - - // TODO: destroy body - DisposeOfBody(); - - lock (childrenPrim) - { - if (childrenPrim.Count > 0) - { - foreach (BulletDotNETPrim prm in childrenPrim) - { - _parent_scene.remActivePrim(prm); - prm.DisposeOfBody(); - prm.SetCollisionShape(null); - } - } - - } - - DisposeOfBody(); - } - } - else - { - _parent_scene.remActivePrim(this); - m_collisionCategories &= ~CollisionCategories.Body; - m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); - - if (prim_geom != null && prim_geom.Handle != IntPtr.Zero) - { - // TODO: Set Category bits and Flags - } - - DisposeOfBody(); - } - - } - */ - DisableAxisMotor(); - m_disabled = true; - m_collisionscore = 0; - } - - public void disableBodySoft() - { - m_disabled = true; - - if (m_isphysical && Body.Handle != IntPtr.Zero) - { - Body.clearForces(); - Body.forceActivationState(0); - - } - - } - - public void enableBodySoft() - { - if (!childPrim) - { - if (m_isphysical && Body.Handle != IntPtr.Zero) - { - Body.clearForces(); - Body.forceActivationState(4); - forceenable = true; - - } - m_disabled = false; - } - } - - public void enableBody() - { - if (!childPrim) - { - //SetCollisionShape(prim_geom); - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - - // TODO: Set Collision Category Bits and Flags - // TODO: Set Auto Disable data - - m_interpenetrationcount = 0; - m_collisionscore = 0; - m_disabled = false; - // The body doesn't already have a finite rotation mode set here - if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) - { - // TODO: Create Angular Motor on Axis Lock! - } - _parent_scene.addActivePrim(this); - } - } - - public void UpdatePositionAndVelocity() - { - if (!m_isSelected) - { - if (_parent == null) - { - Vector3 pv = Vector3.Zero; - bool lastZeroFlag = _zeroFlag; - if (tempPosition3 != null && tempPosition3.Handle != IntPtr.Zero) - tempPosition3.Dispose(); - if (tempTransform3 != null && tempTransform3.Handle != IntPtr.Zero) - tempTransform3.Dispose(); - - if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) - tempOrientation2.Dispose(); - - if (tempAngularVelocity1 != null && tempAngularVelocity1.Handle != IntPtr.Zero) - tempAngularVelocity1.Dispose(); - - if (tempLinearVelocity1 != null && tempLinearVelocity1.Handle != IntPtr.Zero) - tempLinearVelocity1.Dispose(); - - - - tempTransform3 = Body.getInterpolationWorldTransform(); - tempPosition3 = tempTransform3.getOrigin(); // vec - tempOrientation2 = tempTransform3.getRotation(); // ori - tempAngularVelocity1 = Body.getInterpolationAngularVelocity(); //rotvel - tempLinearVelocity1 = Body.getInterpolationLinearVelocity(); // vel - - _torque = new Vector3(tempAngularVelocity1.getX(), tempAngularVelocity1.getX(), - tempAngularVelocity1.getZ()); - Vector3 l_position = Vector3.Zero; - Quaternion l_orientation = Quaternion.Identity; - m_lastposition = _position; - m_lastorientation = _orientation; - - l_position.X = tempPosition3.getX(); - l_position.Y = tempPosition3.getY(); - l_position.Z = tempPosition3.getZ(); - l_orientation.X = tempOrientation2.getX(); - l_orientation.Y = tempOrientation2.getY(); - l_orientation.Z = tempOrientation2.getZ(); - l_orientation.W = tempOrientation2.getW(); - - if (l_position.X > ((int)Constants.RegionSize - 0.05f) || l_position.X < 0f || l_position.Y > ((int)Constants.RegionSize - 0.05f) || l_position.Y < 0f) - { - //base.RaiseOutOfBounds(l_position); - - if (m_crossingfailures < _parent_scene.geomCrossingFailuresBeforeOutofbounds) - { - _position = l_position; - //_parent_scene.remActivePrim(this); - if (_parent == null) - base.RequestPhysicsterseUpdate(); - return; - } - else - { - if (_parent == null) - base.RaiseOutOfBounds(l_position); - return; - } - } - - if (l_position.Z < -200000f) - { - // This is so prim that get lost underground don't fall forever and suck up - // - // Sim resources and memory. - // Disables the prim's movement physics.... - // It's a hack and will generate a console message if it fails. - - //IsPhysical = false; - //if (_parent == null) - //base.RaiseOutOfBounds(_position); - - _acceleration.X = 0; - _acceleration.Y = 0; - _acceleration.Z = 0; - - _velocity.X = 0; - _velocity.Y = 0; - _velocity.Z = 0; - m_rotationalVelocity.X = 0; - m_rotationalVelocity.Y = 0; - m_rotationalVelocity.Z = 0; - - if (_parent == null) - base.RequestPhysicsterseUpdate(); - - m_throttleUpdates = false; - // throttleCounter = 0; - _zeroFlag = true; - //outofBounds = true; - } - - if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02) - && (Math.Abs(m_lastposition.Y - l_position.Y) < 0.02) - && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02) - && (1.0 - Math.Abs(Quaternion.Dot(m_lastorientation, l_orientation)) < 0.01)) - { - _zeroFlag = true; - m_throttleUpdates = false; - } - else - { - //m_log.Debug(Math.Abs(m_lastposition.X - l_position.X).ToString()); - _zeroFlag = false; - } - - if (_zeroFlag) - { - _velocity.X = 0.0f; - _velocity.Y = 0.0f; - _velocity.Z = 0.0f; - - _acceleration.X = 0; - _acceleration.Y = 0; - _acceleration.Z = 0; - - //_orientation.w = 0f; - //_orientation.X = 0f; - //_orientation.Y = 0f; - //_orientation.Z = 0f; - m_rotationalVelocity.X = 0; - m_rotationalVelocity.Y = 0; - m_rotationalVelocity.Z = 0; - if (!m_lastUpdateSent) - { - m_throttleUpdates = false; - // throttleCounter = 0; - m_rotationalVelocity = pv; - - if (_parent == null) - base.RequestPhysicsterseUpdate(); - - m_lastUpdateSent = true; - } - } - else - { - if (lastZeroFlag != _zeroFlag) - { - if (_parent == null) - base.RequestPhysicsterseUpdate(); - } - - m_lastVelocity = _velocity; - - _position = l_position; - - _velocity.X = tempLinearVelocity1.getX(); - _velocity.Y = tempLinearVelocity1.getY(); - _velocity.Z = tempLinearVelocity1.getZ(); - - _acceleration = ((_velocity - m_lastVelocity) / 0.1f); - _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, - _velocity.Y - m_lastVelocity.Y / 0.1f, - _velocity.Z - m_lastVelocity.Z / 0.1f); - //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); - - if (_velocity.ApproxEquals(pv, 0.5f)) - { - m_rotationalVelocity = pv; - } - else - { - m_rotationalVelocity = new Vector3(tempAngularVelocity1.getX(), tempAngularVelocity1.getY(), tempAngularVelocity1.getZ()); - } - - //m_log.Debug("ODE: " + m_rotationalVelocity.ToString()); - - _orientation.X = l_orientation.X; - _orientation.Y = l_orientation.Y; - _orientation.Z = l_orientation.Z; - _orientation.W = l_orientation.W; - m_lastUpdateSent = false; - - //if (!m_throttleUpdates || throttleCounter > _parent_scene.geomUpdatesPerThrottledUpdate) - //{ - if (_parent == null) - base.RequestPhysicsterseUpdate(); - // } - // else - // { - // throttleCounter++; - //} - - } - m_lastposition = l_position; - if (forceenable) - { - Body.forceActivationState(1); - forceenable = false; - } - } - else - { - // Not a body.. so Make sure the client isn't interpolating - _velocity.X = 0; - _velocity.Y = 0; - _velocity.Z = 0; - - _acceleration.X = 0; - _acceleration.Y = 0; - _acceleration.Z = 0; - - m_rotationalVelocity.X = 0; - m_rotationalVelocity.Y = 0; - m_rotationalVelocity.Z = 0; - _zeroFlag = true; - } - } - } - - - internal void setPrimForRemoval() - { - m_taintremove = true; - } - - internal void EnableAxisMotor(Vector3 axislock) - { - if (m_aMotor != null) - DisableAxisMotor(); - - if (Body == null) - return; - - if (Body.Handle == IntPtr.Zero) - return; - - if (AxisLockAngleHigh != null && AxisLockAngleHigh.Handle != IntPtr.Zero) - AxisLockAngleHigh.Dispose(); - - - - m_aMotor = new btGeneric6DofConstraint(Body, _parent_scene.TerrainBody, _parent_scene.TransZero, - _parent_scene.TransZero, false); - - float endNoLock = (360 * Utils.DEG_TO_RAD); - AxisLockAngleHigh = new btVector3((axislock.X == 0) ? 0 : endNoLock, (axislock.Y == 0) ? 0 : endNoLock, (axislock.Z == 0) ? 0 : endNoLock); - - m_aMotor.setAngularLowerLimit(_parent_scene.VectorZero); - m_aMotor.setAngularUpperLimit(AxisLockAngleHigh); - m_aMotor.setLinearLowerLimit(AxisLockLinearLow); - m_aMotor.setLinearUpperLimit(AxisLockLinearHigh); - _parent_scene.getBulletWorld().addConstraint((btTypedConstraint)m_aMotor); - //m_aMotor. - - - } - internal void DisableAxisMotor() - { - if (m_aMotor != null && m_aMotor.Handle != IntPtr.Zero) - { - _parent_scene.getBulletWorld().removeConstraint(m_aMotor); - m_aMotor.Dispose(); - m_aMotor = null; - } - } - - } -} - diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs deleted file mode 100644 index 0d1bd82741..0000000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs +++ /dev/null @@ -1,776 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; -using System.Collections.Generic; -using System.Reflection; -using System.IO; -using System.Diagnostics; -using System.Threading; -using log4net; -using Nini.Config; -using OpenSim.Framework; -using OpenSim.Region.Physics.Manager; -using OpenMetaverse; -using BulletDotNET; - -namespace OpenSim.Region.Physics.BulletDotNETPlugin -{ - public class BulletDotNETScene : PhysicsScene - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - // private string m_sceneIdentifier = string.Empty; - - private List m_characters = new List(); - private Dictionary m_charactersLocalID = new Dictionary(); - private List m_prims = new List(); - private Dictionary m_primsLocalID = new Dictionary(); - private List m_activePrims = new List(); - private List m_taintedActors = new List(); - private btDiscreteDynamicsWorld m_world; - private btAxisSweep3 m_broadphase; - private btCollisionConfiguration m_collisionConfiguration; - private btConstraintSolver m_solver; - private btCollisionDispatcher m_dispatcher; - private btHeightfieldTerrainShape m_terrainShape; - public btRigidBody TerrainBody; - private btVector3 m_terrainPosition; - private btVector3 m_gravity; - public btMotionState m_terrainMotionState; - public btTransform m_terrainTransform; - public btVector3 VectorZero; - public btQuaternion QuatIdentity; - public btTransform TransZero; - - public float geomDefaultDensity = 10.000006836f; - - private float avPIDD = 65f; - private float avPIDP = 21f; - private float avCapRadius = 0.37f; - private float avStandupTensor = 2000000f; - private float avDensity = 80f; - private float avHeightFudgeFactor = 0.52f; - private float avMovementDivisorWalk = 1.8f; - private float avMovementDivisorRun = 0.8f; - - // private float minimumGroundFlightOffset = 3f; - - public bool meshSculptedPrim = true; - - public float meshSculptLOD = 32; - public float MeshSculptphysicalLOD = 16; - - public float bodyPIDD = 35f; - public float bodyPIDG = 25; - internal int geomCrossingFailuresBeforeOutofbounds = 4; - - public float bodyMotorJointMaxforceTensor = 2; - - public int bodyFramesAutoDisable = 20; - - public float WorldTimeStep = 10f/60f; - public const float WorldTimeComp = 1/60f; - public float gravityz = -9.8f; - - private float[] _origheightmap; // Used for Fly height. Kitto Flora - private bool usingGImpactAlgorithm = false; - - // private IConfigSource m_config; - private readonly btVector3 worldAabbMin = new btVector3(-10f, -10f, 0); - private readonly btVector3 worldAabbMax = new btVector3((int)Constants.RegionSize + 10f, (int)Constants.RegionSize + 10f, 9000); - - public IMesher mesher; - private ContactAddedCallbackHandler m_CollisionInterface; - - public BulletDotNETScene(string sceneIdentifier) - { - // m_sceneIdentifier = sceneIdentifier; - VectorZero = new btVector3(0, 0, 0); - QuatIdentity = new btQuaternion(0, 0, 0, 1); - TransZero = new btTransform(QuatIdentity, VectorZero); - m_gravity = new btVector3(0, 0, gravityz); - _origheightmap = new float[(int)Constants.RegionSize * (int)Constants.RegionSize]; - - } - - public override void Initialise(IMesher meshmerizer, IConfigSource config) - { - mesher = meshmerizer; - // m_config = config; - /* - if (Environment.OSVersion.Platform == PlatformID.Unix) - { - m_log.Fatal("[BulletDotNET]: This configuration is not supported on *nix currently"); - Thread.Sleep(5000); - Environment.Exit(0); - } - */ - m_broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, 16000); - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - m_solver = new btSequentialImpulseConstraintSolver(); - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - m_world = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration); - m_world.setGravity(m_gravity); - EnableCollisionInterface(); - - - } - - public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) - { - BulletDotNETCharacter chr = new BulletDotNETCharacter(avName, this, position, size, avPIDD, avPIDP, - avCapRadius, avStandupTensor, avDensity, - avHeightFudgeFactor, avMovementDivisorWalk, - avMovementDivisorRun); - try - { - m_characters.Add(chr); - m_charactersLocalID.Add(chr.m_localID, chr); - } - catch - { - // noop if it's already there - m_log.Debug("[PHYSICS] BulletDotNet: adding duplicate avatar localID"); - } - AddPhysicsActorTaint(chr); - return chr; - } - - public override void RemoveAvatar(PhysicsActor actor) - { - BulletDotNETCharacter chr = (BulletDotNETCharacter) actor; - - m_charactersLocalID.Remove(chr.m_localID); - m_characters.Remove(chr); - m_world.removeRigidBody(chr.Body); - m_world.removeCollisionObject(chr.Body); - - chr.Remove(); - AddPhysicsActorTaint(chr); - //chr = null; - } - - public override void RemovePrim(PhysicsActor prim) - { - if (prim is BulletDotNETPrim) - { - - BulletDotNETPrim p = (BulletDotNETPrim)prim; - - p.setPrimForRemoval(); - AddPhysicsActorTaint(prim); - //RemovePrimThreadLocked(p); - - } - } - - private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation, - IMesh mesh, PrimitiveBaseShape pbs, bool isphysical) - { - Vector3 pos = position; - //pos.X = position.X; - //pos.Y = position.Y; - //pos.Z = position.Z; - Vector3 siz = Vector3.Zero; - siz.X = size.X; - siz.Y = size.Y; - siz.Z = size.Z; - Quaternion rot = rotation; - - BulletDotNETPrim newPrim; - - newPrim = new BulletDotNETPrim(name, this, pos, siz, rot, mesh, pbs, isphysical); - - //lock (m_prims) - // m_prims.Add(newPrim); - - - return newPrim; - } - - public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, Vector3 size, Quaternion rotation, bool isPhysical, uint localid) - { - PhysicsActor result; - IMesh mesh = null; - - //switch (pbs.ProfileShape) - //{ - // case ProfileShape.Square: - // //support simple box & hollow box now; later, more shapes - // if (needsMeshing(pbs)) - // { - // mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); - // } - - // break; - //} - - if (needsMeshing(pbs)) - mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); - - result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); - - return result; - } - - public override void AddPhysicsActorTaint(PhysicsActor prim) - { - lock (m_taintedActors) - { - if (!m_taintedActors.Contains(prim)) - { - m_taintedActors.Add(prim); - } - } - } - internal void SetUsingGImpact() - { - if (!usingGImpactAlgorithm) - btGImpactCollisionAlgorithm.registerAlgorithm(m_dispatcher); - usingGImpactAlgorithm = true; - } - - public override float Simulate(float timeStep) - { - - lock (m_taintedActors) - { - foreach (PhysicsActor act in m_taintedActors) - { - if (act is BulletDotNETCharacter) - ((BulletDotNETCharacter) act).ProcessTaints(timeStep); - if (act is BulletDotNETPrim) - ((BulletDotNETPrim)act).ProcessTaints(timeStep); - } - m_taintedActors.Clear(); - } - - lock (m_characters) - { - foreach (BulletDotNETCharacter chr in m_characters) - { - chr.Move(timeStep); - } - } - - lock (m_prims) - { - foreach (BulletDotNETPrim prim in m_prims) - { - if (prim != null) - prim.Move(timeStep); - } - } - float steps = m_world.stepSimulation(timeStep, 10, WorldTimeComp); - - foreach (BulletDotNETCharacter chr in m_characters) - { - chr.UpdatePositionAndVelocity(); - } - - foreach (BulletDotNETPrim prm in m_activePrims) - { - /* - if (prm != null) - if (prm.Body != null) - */ - prm.UpdatePositionAndVelocity(); - } - if (m_CollisionInterface != null) - { - List primsWithCollisions = new List(); - List charactersWithCollisions = new List(); - - // get the collisions that happened this tick - List collisions = m_CollisionInterface.GetContactList(); - // passed back the localID of the prim so we can associate the prim - foreach (BulletDotNET.ContactAddedCallbackHandler.ContactInfo ci in collisions) - { - // ContactPoint = { contactPoint, contactNormal, penetrationDepth } - ContactPoint contact = new ContactPoint(new Vector3(ci.pX, ci.pY, ci.pZ), - new Vector3(ci.nX, ci.nY, ci.nZ), ci.depth); - - ProcessContact(ci.contact, ci.contactWith, contact, ref primsWithCollisions, ref charactersWithCollisions); - ProcessContact(ci.contactWith, ci.contact, contact, ref primsWithCollisions, ref charactersWithCollisions); - - } - m_CollisionInterface.Clear(); - // for those prims and characters that had collisions cause collision events - foreach (BulletDotNETPrim bdnp in primsWithCollisions) - { - bdnp.SendCollisions(); - } - foreach (BulletDotNETCharacter bdnc in charactersWithCollisions) - { - bdnc.SendCollisions(); - } - } - return steps; - } - - private void ProcessContact(uint cont, uint contWith, ContactPoint contact, - ref List primsWithCollisions, - ref List charactersWithCollisions) - { - BulletDotNETPrim bdnp; - // collisions with a normal prim? - if (m_primsLocalID.TryGetValue(cont, out bdnp)) - { - // Added collision event to the prim. This creates a pile of events - // that will be sent to any subscribed listeners. - bdnp.AddCollision(contWith, contact); - if (!primsWithCollisions.Contains(bdnp)) - { - primsWithCollisions.Add(bdnp); - } - } - else - { - BulletDotNETCharacter bdnc; - // if not a prim, maybe it's one of the characters - if (m_charactersLocalID.TryGetValue(cont, out bdnc)) - { - bdnc.AddCollision(contWith, contact); - if (!charactersWithCollisions.Contains(bdnc)) - { - charactersWithCollisions.Add(bdnc); - } - } - } - } - - public override void GetResults() - { - - } - - public override void SetTerrain(float[] heightMap) - { - if (m_terrainShape != null) - DeleteTerrain(); - - float hfmax = -9000; - float hfmin = 90000; - - for (int i = 0; i hfmax) ? heightMap[i] : hfmax; - } - // store this for later reference. - // Note, we're storing it after we check it for anomolies above - _origheightmap = heightMap; - - hfmin = 0; - hfmax = 256; - - m_terrainShape = new btHeightfieldTerrainShape((int)Constants.RegionSize, (int)Constants.RegionSize, heightMap, - 1.0f, hfmin, hfmax, (int)btHeightfieldTerrainShape.UPAxis.Z, - (int)btHeightfieldTerrainShape.PHY_ScalarType.PHY_FLOAT, false); - float AabbCenterX = Constants.RegionSize/2f; - float AabbCenterY = Constants.RegionSize/2f; - - float AabbCenterZ = 0; - float temphfmin, temphfmax; - - temphfmin = hfmin; - temphfmax = hfmax; - - if (temphfmin < 0) - { - temphfmax = 0 - temphfmin; - temphfmin = 0 - temphfmin; - } - else if (temphfmin > 0) - { - temphfmax = temphfmax + (0 - temphfmin); - //temphfmin = temphfmin + (0 - temphfmin); - } - AabbCenterZ = temphfmax/2f; - - if (m_terrainPosition == null) - { - m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); - } - else - { - try - { - m_terrainPosition.setValue(AabbCenterX, AabbCenterY, AabbCenterZ); - } - catch (ObjectDisposedException) - { - m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); - } - } - if (m_terrainMotionState != null) - { - m_terrainMotionState.Dispose(); - m_terrainMotionState = null; - } - m_terrainTransform = new btTransform(QuatIdentity, m_terrainPosition); - m_terrainMotionState = new btDefaultMotionState(m_terrainTransform); - TerrainBody = new btRigidBody(0, m_terrainMotionState, m_terrainShape); - TerrainBody.setUserPointer((IntPtr)0); - m_world.addRigidBody(TerrainBody); - - - } - - public override void SetWaterLevel(float baseheight) - { - - } - - public override void DeleteTerrain() - { - if (TerrainBody != null) - { - m_world.removeRigidBody(TerrainBody); - } - - if (m_terrainShape != null) - { - m_terrainShape.Dispose(); - m_terrainShape = null; - } - - if (m_terrainMotionState != null) - { - m_terrainMotionState.Dispose(); - m_terrainMotionState = null; - } - - if (m_terrainTransform != null) - { - m_terrainTransform.Dispose(); - m_terrainTransform = null; - } - - if (m_terrainPosition != null) - { - m_terrainPosition.Dispose(); - m_terrainPosition = null; - } - } - - public override void Dispose() - { - disposeAllBodies(); - m_world.Dispose(); - m_broadphase.Dispose(); - ((btDefaultCollisionConfiguration) m_collisionConfiguration).Dispose(); - ((btSequentialImpulseConstraintSolver) m_solver).Dispose(); - worldAabbMax.Dispose(); - worldAabbMin.Dispose(); - VectorZero.Dispose(); - QuatIdentity.Dispose(); - m_gravity.Dispose(); - VectorZero = null; - QuatIdentity = null; - } - - public override Dictionary GetTopColliders() - { - return new Dictionary(); - } - - public btDiscreteDynamicsWorld getBulletWorld() - { - return m_world; - } - - private void disposeAllBodies() - { - lock (m_prims) - { - m_primsLocalID.Clear(); - foreach (BulletDotNETPrim prim in m_prims) - { - if (prim.Body != null) - m_world.removeRigidBody(prim.Body); - - prim.Dispose(); - } - m_prims.Clear(); - - foreach (BulletDotNETCharacter chr in m_characters) - { - if (chr.Body != null) - m_world.removeRigidBody(chr.Body); - chr.Dispose(); - } - m_characters.Clear(); - } - } - - public override bool IsThreaded - { - get { return false; } - } - - internal void addCollisionEventReporting(PhysicsActor bulletDotNETCharacter) - { - //TODO: FIXME: - } - - internal void remCollisionEventReporting(PhysicsActor bulletDotNETCharacter) - { - //TODO: FIXME: - } - - internal void AddRigidBody(btRigidBody Body) - { - m_world.addRigidBody(Body); - } - [Obsolete("bad!")] - internal void removeFromWorld(btRigidBody body) - { - - m_world.removeRigidBody(body); - } - - internal void removeFromWorld(BulletDotNETPrim prm ,btRigidBody body) - { - lock (m_prims) - { - if (m_prims.Contains(prm)) - { - m_world.removeRigidBody(body); - } - remActivePrim(prm); - m_primsLocalID.Remove(prm.m_localID); - m_prims.Remove(prm); - } - - } - - internal float GetWaterLevel() - { - throw new NotImplementedException(); - } - - // Recovered for use by fly height. Kitto Flora - public float GetTerrainHeightAtXY(float x, float y) - { - // Teravus: Kitto, this code causes recurring errors that stall physics permenantly unless - // the values are checked, so checking below. - // Is there any reason that we don't do this in ScenePresence? - // The only physics engine that benefits from it in the physics plugin is this one - - if (x > (int)Constants.RegionSize || y > (int)Constants.RegionSize || - x < 0.001f || y < 0.001f) - return 0; - - return _origheightmap[(int)y * Constants.RegionSize + (int)x]; - } - // End recovered. Kitto Flora - - /// - /// Routine to figure out if we need to mesh this prim with our mesher - /// - /// - /// - public bool needsMeshing(PrimitiveBaseShape pbs) - { - // most of this is redundant now as the mesher will return null if it cant mesh a prim - // but we still need to check for sculptie meshing being enabled so this is the most - // convenient place to do it for now... - - // //if (pbs.PathCurve == (byte)Primitive.PathCurve.Circle && pbs.ProfileCurve == (byte)Primitive.ProfileCurve.Circle && pbs.PathScaleY <= 0.75f) - // //m_log.Debug("needsMeshing: " + " pathCurve: " + pbs.PathCurve.ToString() + " profileCurve: " + pbs.ProfileCurve.ToString() + " pathScaleY: " + Primitive.UnpackPathScale(pbs.PathScaleY).ToString()); - int iPropertiesNotSupportedDefault = 0; - - if (pbs.SculptEntry && !meshSculptedPrim) - { -#if SPAM - m_log.Warn("NonMesh"); -#endif - return false; - } - - // if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since ODE can use an internal representation for the prim - if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) - || (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 - && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z)) - { - - if (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 - && pbs.ProfileHollow == 0 - && pbs.PathTwist == 0 && pbs.PathTwistBegin == 0 - && pbs.PathBegin == 0 && pbs.PathEnd == 0 - && pbs.PathTaperX == 0 && pbs.PathTaperY == 0 - && pbs.PathScaleX == 100 && pbs.PathScaleY == 100 - && pbs.PathShearX == 0 && pbs.PathShearY == 0) - { -#if SPAM - m_log.Warn("NonMesh"); -#endif - return false; - } - } - - if (pbs.ProfileHollow != 0) - iPropertiesNotSupportedDefault++; - - if ((pbs.PathBegin != 0) || pbs.PathEnd != 0) - iPropertiesNotSupportedDefault++; - - if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0)) - iPropertiesNotSupportedDefault++; - - if ((pbs.ProfileBegin != 0) || pbs.ProfileEnd != 0) - iPropertiesNotSupportedDefault++; - - if ((pbs.PathScaleX != 100) || (pbs.PathScaleY != 100)) - iPropertiesNotSupportedDefault++; - - if ((pbs.PathShearX != 0) || (pbs.PathShearY != 0)) - iPropertiesNotSupportedDefault++; - - if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight) - iPropertiesNotSupportedDefault++; - - if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 && (pbs.Scale.X != pbs.Scale.Y || pbs.Scale.Y != pbs.Scale.Z || pbs.Scale.Z != pbs.Scale.X)) - iPropertiesNotSupportedDefault++; - - if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1) - iPropertiesNotSupportedDefault++; - - // test for torus - if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Square) - { - if (pbs.PathCurve == (byte)Extrusion.Curve1) - { - iPropertiesNotSupportedDefault++; - } - } - else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Circle) - { - if (pbs.PathCurve == (byte)Extrusion.Straight) - { - iPropertiesNotSupportedDefault++; - } - - // ProfileCurve seems to combine hole shape and profile curve so we need to only compare against the lower 3 bits - else if (pbs.PathCurve == (byte)Extrusion.Curve1) - { - iPropertiesNotSupportedDefault++; - } - } - else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle) - { - if (pbs.PathCurve == (byte)Extrusion.Curve1 || pbs.PathCurve == (byte)Extrusion.Curve2) - { - iPropertiesNotSupportedDefault++; - } - } - else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle) - { - if (pbs.PathCurve == (byte)Extrusion.Straight) - { - iPropertiesNotSupportedDefault++; - } - else if (pbs.PathCurve == (byte)Extrusion.Curve1) - { - iPropertiesNotSupportedDefault++; - } - } - - - if (iPropertiesNotSupportedDefault == 0) - { -#if SPAM - m_log.Warn("NonMesh"); -#endif - return false; - } -#if SPAM - m_log.Debug("Mesh"); -#endif - return true; - } - - internal void addActivePrim(BulletDotNETPrim pPrim) - { - lock (m_activePrims) - { - if (!m_activePrims.Contains(pPrim)) - { - m_activePrims.Add(pPrim); - } - } - } - - public void remActivePrim(BulletDotNETPrim pDeactivatePrim) - { - lock (m_activePrims) - { - m_activePrims.Remove(pDeactivatePrim); - } - } - - internal void AddPrimToScene(BulletDotNETPrim pPrim) - { - lock (m_prims) - { - if (!m_prims.Contains(pPrim)) - { - try - { - m_prims.Add(pPrim); - m_primsLocalID.Add(pPrim.m_localID, pPrim); - } - catch - { - // noop if it's already there - m_log.Debug("[PHYSICS] BulletDotNet: adding duplicate prim localID"); - } - m_world.addRigidBody(pPrim.Body); - // m_log.Debug("[PHYSICS] added prim to scene"); - } - } - } - internal void EnableCollisionInterface() - { - if (m_CollisionInterface == null) - { - m_CollisionInterface = new ContactAddedCallbackHandler(m_world); - // m_world.SetCollisionAddedCallback(m_CollisionInterface); - } - } - - - - } -} diff --git a/OpenSim/Region/Physics/BulletXPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/BulletXPlugin/AssemblyInfo.cs deleted file mode 100644 index 6383f2638f..0000000000 --- a/OpenSim/Region/Physics/BulletXPlugin/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System.Reflection; -using System.Runtime.InteropServices; - -// Information about this assembly is defined by the following -// attributes. -// -// change them to the information which is associated with the assembly -// you compile. - -[assembly : AssemblyTitle("BulletXPlugin")] -[assembly : AssemblyDescription("")] -[assembly : AssemblyConfiguration("")] -[assembly : AssemblyCompany("http://opensimulator.org")] -[assembly : AssemblyProduct("BulletXPlugin")] -[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] -[assembly : AssemblyTrademark("")] -[assembly : AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose a type to COM, use [ComVisible(true)] on that type. - -[assembly : ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all values by your own or you can build default build and revision -// numbers with the '*' character (the default): - -[assembly : AssemblyVersion("0.6.5.*")] diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs deleted file mode 100644 index 8e9edac288..0000000000 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ /dev/null @@ -1,1855 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#region References - -using System; -using System.Collections.Generic; -using OpenMetaverse; -using MonoXnaCompactMaths; -using OpenSim.Framework; -using OpenSim.Region.Physics.Manager; -using XnaDevRu.BulletX; -using XnaDevRu.BulletX.Dynamics; -using Nini.Config; -using Vector3 = MonoXnaCompactMaths.Vector3; -using Quaternion = MonoXnaCompactMaths.Quaternion; - -#endregion - -namespace OpenSim.Region.Physics.BulletXPlugin -{ - /// - /// BulletXConversions are called now BulletXMaths - /// This Class converts objects and types for BulletX and give some operations - /// - public class BulletXMaths - { - //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - - //Vector3 - public static Vector3 PhysicsVectorToXnaVector3(OpenMetaverse.Vector3 physicsVector) - { - return new Vector3(physicsVector.X, physicsVector.Y, physicsVector.Z); - } - - public static OpenMetaverse.Vector3 XnaVector3ToPhysicsVector(Vector3 xnaVector3) - { - return new OpenMetaverse.Vector3(xnaVector3.X, xnaVector3.Y, xnaVector3.Z); - } - - //Quaternion - public static Quaternion QuaternionToXnaQuaternion(OpenMetaverse.Quaternion quaternion) - { - return new Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W); - } - - public static OpenMetaverse.Quaternion XnaQuaternionToQuaternion(Quaternion xnaQuaternion) - { - return new OpenMetaverse.Quaternion(xnaQuaternion.W, xnaQuaternion.X, xnaQuaternion.Y, xnaQuaternion.Z); - } - - //Next methods are extracted from XnaDevRu.BulletX(See 3rd party license): - //- SetRotation (class MatrixOperations) - //- GetRotation (class MatrixOperations) - //- GetElement (class MathHelper) - //- SetElement (class MathHelper) - internal static void SetRotation(ref Matrix m, Quaternion q) - { - float d = q.LengthSquared(); - float s = 2f/d; - float xs = q.X*s, ys = q.Y*s, zs = q.Z*s; - float wx = q.W*xs, wy = q.W*ys, wz = q.W*zs; - float xx = q.X*xs, xy = q.X*ys, xz = q.X*zs; - float yy = q.Y*ys, yz = q.Y*zs, zz = q.Z*zs; - m = new Matrix(1 - (yy + zz), xy - wz, xz + wy, 0, - xy + wz, 1 - (xx + zz), yz - wx, 0, - xz - wy, yz + wx, 1 - (xx + yy), 0, - m.M41, m.M42, m.M43, 1); - } - - internal static Quaternion GetRotation(Matrix m) - { - Quaternion q; - - float trace = m.M11 + m.M22 + m.M33; - - if (trace > 0) - { - float s = (float) Math.Sqrt(trace + 1); - q.W = s*0.5f; - s = 0.5f/s; - - q.X = (m.M32 - m.M23)*s; - q.Y = (m.M13 - m.M31)*s; - q.Z = (m.M21 - m.M12)*s; - } - else - { - q.X = q.Y = q.Z = q.W = 0f; - - int i = m.M11 < m.M22 - ? - (m.M22 < m.M33 ? 2 : 1) - : - (m.M11 < m.M33 ? 2 : 0); - int j = (i + 1)%3; - int k = (i + 2)%3; - - float s = (float) Math.Sqrt(GetElement(m, i, i) - GetElement(m, j, j) - GetElement(m, k, k) + 1); - SetElement(ref q, i, s*0.5f); - s = 0.5f/s; - - q.W = (GetElement(m, k, j) - GetElement(m, j, k))*s; - SetElement(ref q, j, (GetElement(m, j, i) + GetElement(m, i, j))*s); - SetElement(ref q, k, (GetElement(m, k, i) + GetElement(m, i, k))*s); - } - - return q; - } - - internal static float SetElement(ref Quaternion q, int index, float value) - { - switch (index) - { - case 0: - q.X = value; - break; - case 1: - q.Y = value; - break; - case 2: - q.Z = value; - break; - case 3: - q.W = value; - break; - } - - return 0; - } - - internal static float GetElement(Matrix mat, int row, int col) - { - switch (row) - { - case 0: - switch (col) - { - case 0: - return mat.M11; - case 1: - return mat.M12; - case 2: - return mat.M13; - } - break; - case 1: - switch (col) - { - case 0: - return mat.M21; - case 1: - return mat.M22; - case 2: - return mat.M23; - } - break; - case 2: - switch (col) - { - case 0: - return mat.M31; - case 1: - return mat.M32; - case 2: - return mat.M33; - } - break; - } - - return 0; - } - } - - /// - /// PhysicsPlugin Class for BulletX - /// - public class BulletXPlugin : IPhysicsPlugin - { - private BulletXScene _mScene; - - public BulletXPlugin() - { - } - - public bool Init() - { - return true; - } - - public PhysicsScene GetScene(string sceneIdentifier) - { - if (_mScene == null) - { - _mScene = new BulletXScene(sceneIdentifier); - } - return (_mScene); - } - - public string GetName() - { - return ("modified_BulletX"); //Changed!! "BulletXEngine" To "modified_BulletX" - } - - public void Dispose() - { - } - } - - - // Class to detect and debug collisions - // Mainly used for debugging purposes - internal class CollisionDispatcherLocal : CollisionDispatcher - { - private BulletXScene relatedScene; - - public CollisionDispatcherLocal(BulletXScene s) - : base() - { - relatedScene = s; - } - - public override bool NeedsCollision(CollisionObject bodyA, CollisionObject bodyB) - { - RigidBody rb; - BulletXCharacter bxcA = null; - BulletXPrim bxpA = null; - Type t = bodyA.GetType(); - if (t == typeof (RigidBody)) - { - rb = (RigidBody) bodyA; - relatedScene._characters.TryGetValue(rb, out bxcA); - relatedScene._prims.TryGetValue(rb, out bxpA); - } -// String nameA; -// if (bxcA != null) -// nameA = bxcA._name; -// else if (bxpA != null) -// nameA = bxpA._name; -// else -// nameA = "null"; - - - - BulletXCharacter bxcB = null; - BulletXPrim bxpB = null; - t = bodyB.GetType(); - if (t == typeof (RigidBody)) - { - rb = (RigidBody) bodyB; - relatedScene._characters.TryGetValue(rb, out bxcB); - relatedScene._prims.TryGetValue(rb, out bxpB); - } - -// String nameB; -// if (bxcB != null) -// nameB = bxcB._name; -// else if (bxpB != null) -// nameB = bxpB._name; -// else - // nameB = "null"; - bool needsCollision;// = base.NeedsCollision(bodyA, bodyB); - int c1 = 3; - int c2 = 3; - - //////////////////////////////////////////////////////// - //BulletX Mesh Collisions - //added by Jed zhu - //data: May 07,2005 - //////////////////////////////////////////////////////// - #region BulletXMeshCollisions Fields - - - if (bxcA != null && bxpB != null) - c1 = Collision(bxcA, bxpB); - if (bxpA != null && bxcB != null) - c2 = Collision(bxcB, bxpA); - if (c1 < 2) - needsCollision = (c1 > 0) ? true : false; - else if (c2 < 2) - needsCollision = (c2 > 0) ? true : false; - else - needsCollision = base.NeedsCollision(bodyA, bodyB); - - - #endregion - - - //m_log.DebugFormat("[BulletX]: A collision was detected between {0} and {1} --> {2}", nameA, nameB, - //needsCollision); - - - return needsCollision; - } - //added by jed zhu - //calculas the collision between the Prim and Actor - // - private int Collision(BulletXCharacter actorA, BulletXPrim primB) - { - int[] indexBase; - Vector3[] vertexBase; - Vector3 vNormal; - // Vector3 vP1; - // Vector3 vP2; - // Vector3 vP3; - IMesh mesh = primB.GetMesh(); - - float fdistance; - if (primB == null) - return 3; - if (mesh == null) - return 2; - if (actorA == null) - return 3; - - int iVertexCount = mesh.getVertexList().Count; - int iIndexCount = mesh.getIndexListAsInt().Length; - if (iVertexCount == 0) - return 3; - if (iIndexCount == 0) - return 3; - lock (BulletXScene.BulletXLock) - { - indexBase = mesh.getIndexListAsInt(); - vertexBase = new Vector3[iVertexCount]; - - for (int i = 0; i < iVertexCount; i++) - { - OpenMetaverse.Vector3 v = mesh.getVertexList()[i]; - if (v != null) // Note, null has special meaning. See meshing code for details - vertexBase[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); - else - vertexBase[i] = Vector3.Zero; - } - - for (int ix = 0; ix < iIndexCount; ix += 3) - { - int ia = indexBase[ix + 0]; - int ib = indexBase[ix + 1]; - int ic = indexBase[ix + 2]; - // - Vector3 v1 = vertexBase[ib] - vertexBase[ia]; - Vector3 v2 = vertexBase[ic] - vertexBase[ia]; - - Vector3.Cross(ref v1, ref v2, out vNormal); - Vector3.Normalize(ref vNormal, out vNormal); - - fdistance = Vector3.Dot(vNormal, vertexBase[ia]) + 0.50f; - if (preCheckCollision(actorA, vNormal, fdistance) == 1) - { - if (CheckCollision(actorA, ia, ib, ic, vNormal, vertexBase) == 1) - { - //PhysicsVector v = actorA.Position; - //Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); - //Vector3 vp = vNormal * (fdistance - Vector3.Dot(vNormal, v3) + 0.2f); - //actorA.Position += BulletXMaths.XnaVector3ToPhysicsVector(vp); - return 1; - } - } - } - } - - - return 0; - } - //added by jed zhu - //return value 1: need second check - //return value 0: no need check - - private int preCheckCollision(BulletXActor actA, Vector3 vNormal, float fDist) - { - float fstartSide; - OpenMetaverse.Vector3 v = actA.Position; - Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); - - fstartSide = Vector3.Dot(vNormal, v3) - fDist; - if (fstartSide > 0) return 0; - else return 1; - } - //added by jed zhu - private int CheckCollision(BulletXActor actA, int ia, int ib, int ic, Vector3 vNormal, Vector3[] vertBase) - { - Vector3 perPlaneNormal; - float fPerPlaneDist; - OpenMetaverse.Vector3 v = actA.Position; - Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); - //check AB - Vector3 v1; - v1 = vertBase[ib] - vertBase[ia]; - Vector3.Cross(ref vNormal, ref v1, out perPlaneNormal); - Vector3.Normalize(ref perPlaneNormal, out perPlaneNormal); - - if (Vector3.Dot((vertBase[ic] - vertBase[ia]), perPlaneNormal) < 0) - perPlaneNormal = -perPlaneNormal; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ia]) - 0.50f; - - - - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) < 0) - return 0; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ic]) + 0.50f; - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) > 0) - return 0; - - //check BC - - v1 = vertBase[ic] - vertBase[ib]; - Vector3.Cross(ref vNormal, ref v1, out perPlaneNormal); - Vector3.Normalize(ref perPlaneNormal, out perPlaneNormal); - - if (Vector3.Dot((vertBase[ia] - vertBase[ib]), perPlaneNormal) < 0) - perPlaneNormal = -perPlaneNormal; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ib]) - 0.50f; - - - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) < 0) - return 0; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ia]) + 0.50f; - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) > 0) - return 0; - //check CA - v1 = vertBase[ia] - vertBase[ic]; - Vector3.Cross(ref vNormal, ref v1, out perPlaneNormal); - Vector3.Normalize(ref perPlaneNormal, out perPlaneNormal); - - if (Vector3.Dot((vertBase[ib] - vertBase[ic]), perPlaneNormal) < 0) - perPlaneNormal = -perPlaneNormal; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ic]) - 0.50f; - - - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) < 0) - return 0; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ib]) + 0.50f; - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) > 0) - return 0; - - return 1; - - } - } - - /// - /// PhysicsScene Class for BulletX - /// - public class BulletXScene : PhysicsScene - { - #region BulletXScene Fields - - public DiscreteDynamicsWorld ddWorld; - private CollisionDispatcher cDispatcher; - private OverlappingPairCache opCache; - private SequentialImpulseConstraintSolver sicSolver; - public static Object BulletXLock = new Object(); - - private const int minXY = 0; - private const int minZ = 0; - private const int maxXY = (int)Constants.RegionSize; - private const int maxZ = 4096; - private const int maxHandles = 32766; //Why? I don't know - private const float gravity = 9.8f; - private const float heightLevel0 = 77.0f; - private const float heightLevel1 = 200.0f; - private const float lowGravityFactor = 0.2f; - //OpenSim calls Simulate 10 times per seconds. So FPS = "Simulate Calls" * simulationSubSteps = 100 FPS - private const int simulationSubSteps = 10; - //private float[] _heightmap; - private BulletXPlanet _simFlatPlanet; - internal Dictionary _characters = new Dictionary(); - internal Dictionary _prims = new Dictionary(); - - public IMesher mesher; - // private IConfigSource m_config; - - // protected internal String identifier; - - public BulletXScene(String sceneIdentifier) - { - //identifier = sceneIdentifier; - cDispatcher = new CollisionDispatcherLocal(this); - Vector3 worldMinDim = new Vector3((float)minXY, (float)minXY, (float)minZ); - Vector3 worldMaxDim = new Vector3((float)maxXY, (float)maxXY, (float)maxZ); - opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles); - sicSolver = new SequentialImpulseConstraintSolver(); - - lock (BulletXLock) - { - ddWorld = new DiscreteDynamicsWorld(cDispatcher, opCache, sicSolver); - ddWorld.Gravity = new Vector3(0, 0, -gravity); - } - //this._heightmap = new float[65536]; - } - - public static float Gravity - { - get { return gravity; } - } - - public static float HeightLevel0 - { - get { return heightLevel0; } - } - - public static float HeightLevel1 - { - get { return heightLevel1; } - } - - public static float LowGravityFactor - { - get { return lowGravityFactor; } - } - - public static int MaxXY - { - get { return maxXY; } - } - - public static int MaxZ - { - get { return maxZ; } - } - - private List _forgottenRigidBodies = new List(); - internal string is_ex_message = "Can't remove rigidBody!: "; - - #endregion - - public BulletXScene() - { - cDispatcher = new CollisionDispatcherLocal(this); - Vector3 worldMinDim = new Vector3((float) minXY, (float) minXY, (float) minZ); - Vector3 worldMaxDim = new Vector3((float) maxXY, (float) maxXY, (float) maxZ); - opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles); - sicSolver = new SequentialImpulseConstraintSolver(); - - lock (BulletXLock) - { - ddWorld = new DiscreteDynamicsWorld(cDispatcher, opCache, sicSolver); - ddWorld.Gravity = new Vector3(0, 0, -gravity); - } - //this._heightmap = new float[65536]; - } - - public override void Initialise(IMesher meshmerizer, IConfigSource config) - { - mesher = meshmerizer; - // m_config = config; - } - - public override void Dispose() - { - - } - - public override Dictionary GetTopColliders() - { - Dictionary returncolliders = new Dictionary(); - return returncolliders; - } - - public override void SetWaterLevel(float baseheight) - { - - } - - public override PhysicsActor AddAvatar(string avName, OpenMetaverse.Vector3 position, OpenMetaverse.Vector3 size, bool isFlying) - { - OpenMetaverse.Vector3 pos = OpenMetaverse.Vector3.Zero; - pos.X = position.X; - pos.Y = position.Y; - pos.Z = position.Z + 20; - BulletXCharacter newAv = null; - lock (BulletXLock) - { - newAv = new BulletXCharacter(avName, this, pos); - _characters.Add(newAv.RigidBody, newAv); - } - newAv.Flying = isFlying; - return newAv; - } - - public override void RemoveAvatar(PhysicsActor actor) - { - if (actor is BulletXCharacter) - { - lock (BulletXLock) - { - try - { - ddWorld.RemoveRigidBody(((BulletXCharacter) actor).RigidBody); - } - catch (Exception ex) - { - BulletXMessage(is_ex_message + ex.Message, true); - ((BulletXCharacter) actor).RigidBody.ActivationState = ActivationState.DisableSimulation; - AddForgottenRigidBody(((BulletXCharacter) actor).RigidBody); - } - _characters.Remove(((BulletXCharacter) actor).RigidBody); - } - GC.Collect(); - } - } - - public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, OpenMetaverse.Vector3 position, - OpenMetaverse.Vector3 size, OpenMetaverse.Quaternion rotation, bool isPhysical, uint localid) - { - PhysicsActor result; - - switch (pbs.ProfileShape) - { - case ProfileShape.Square: - /// support simple box & hollow box now; later, more shapes - if (pbs.ProfileHollow == 0) - { - result = AddPrim(primName, position, size, rotation, null, null, isPhysical); - } - else - { - IMesh mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); - result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); - } - break; - - default: - result = AddPrim(primName, position, size, rotation, null, null, isPhysical); - break; - } - - return result; - } - - public PhysicsActor AddPrim(String name, OpenMetaverse.Vector3 position, OpenMetaverse.Vector3 size, OpenMetaverse.Quaternion rotation, - IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) - { - BulletXPrim newPrim = null; - lock (BulletXLock) - { - newPrim = new BulletXPrim(name, this, position, size, rotation, mesh, pbs, isPhysical); - _prims.Add(newPrim.RigidBody, newPrim); - } - return newPrim; - } - - public override void RemovePrim(PhysicsActor prim) - { - if (prim is BulletXPrim) - { - lock (BulletXLock) - { - try - { - ddWorld.RemoveRigidBody(((BulletXPrim) prim).RigidBody); - } - catch (Exception ex) - { - BulletXMessage(is_ex_message + ex.Message, true); - ((BulletXPrim) prim).RigidBody.ActivationState = ActivationState.DisableSimulation; - AddForgottenRigidBody(((BulletXPrim) prim).RigidBody); - } - _prims.Remove(((BulletXPrim) prim).RigidBody); - } - GC.Collect(); - } - } - - public override void AddPhysicsActorTaint(PhysicsActor prim) - { - } - - public override float Simulate(float timeStep) - { - float fps = 0; - lock (BulletXLock) - { - //Try to remove garbage - RemoveForgottenRigidBodies(); - //End of remove - MoveAPrimitives(timeStep); - - - fps = (timeStep*simulationSubSteps); - - ddWorld.StepSimulation(timeStep, simulationSubSteps, timeStep); - //Extra Heightmap Validation: BulletX's HeightFieldTerrain somestimes doesn't work so fine. - ValidateHeightForAll(); - //End heightmap validation. - UpdateKineticsForAll(); - } - return fps; - } - - private void MoveAPrimitives(float timeStep) - { - foreach (BulletXCharacter actor in _characters.Values) - { - actor.Move(timeStep); - } - } - - private void ValidateHeightForAll() - { - float _height; - foreach (BulletXCharacter actor in _characters.Values) - { - //_height = HeightValue(actor.RigidBodyPosition); - _height = _simFlatPlanet.HeightValue(actor.RigidBodyPosition); - actor.ValidateHeight(_height); - //if (_simFlatPlanet.heightIsNotValid(actor.RigidBodyPosition, out _height)) actor.ValidateHeight(_height); - } - foreach (BulletXPrim prim in _prims.Values) - { - //_height = HeightValue(prim.RigidBodyPosition); - _height = _simFlatPlanet.HeightValue(prim.RigidBodyPosition); - prim.ValidateHeight(_height); - //if (_simFlatPlanet.heightIsNotValid(prim.RigidBodyPosition, out _height)) prim.ValidateHeight(_height); - } - //foreach (BulletXCharacter actor in _characters) - //{ - // actor.ValidateHeight(0); - //} - //foreach (BulletXPrim prim in _prims) - //{ - // prim.ValidateHeight(0); - //} - } - - private void UpdateKineticsForAll() - { - //UpdatePosition > UpdateKinetics. - //Not only position will be updated, also velocity cause acceleration. - foreach (BulletXCharacter actor in _characters.Values) - { - actor.UpdateKinetics(); - } - foreach (BulletXPrim prim in _prims.Values) - { - prim.UpdateKinetics(); - } - //if (this._simFlatPlanet!=null) this._simFlatPlanet.Restore(); - } - - public override void GetResults() - { - } - - public override bool IsThreaded - { - get - { - return (false); // for now we won't be multithreaded - } - } - - public override void SetTerrain(float[] heightMap) - { - ////As the same as ODE, heightmap (x,y) must be swapped for BulletX - //for (int i = 0; i < 65536; i++) - //{ - // // this._heightmap[i] = (double)heightMap[i]; - // // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...) - // int x = i & 0xff; - // int y = i >> 8; - // this._heightmap[i] = heightMap[x * 256 + y]; - //} - - //float[] swappedHeightMap = new float[65536]; - ////As the same as ODE, heightmap (x,y) must be swapped for BulletX - //for (int i = 0; i < 65536; i++) - //{ - // // this._heightmap[i] = (double)heightMap[i]; - // // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...) - // int x = i & 0xff; - // int y = i >> 8; - // swappedHeightMap[i] = heightMap[x * 256 + y]; - //} - DeleteTerrain(); - //There is a BulletXLock inside the constructor of BulletXPlanet - //this._simFlatPlanet = new BulletXPlanet(this, swappedHeightMap); - _simFlatPlanet = new BulletXPlanet(this, heightMap); - //this._heightmap = heightMap; - } - - public override void DeleteTerrain() - { - if (_simFlatPlanet != null) - { - lock (BulletXLock) - { - try - { - ddWorld.RemoveRigidBody(_simFlatPlanet.RigidBody); - } - catch (Exception ex) - { - BulletXMessage(is_ex_message + ex.Message, true); - _simFlatPlanet.RigidBody.ActivationState = ActivationState.DisableSimulation; - AddForgottenRigidBody(_simFlatPlanet.RigidBody); - } - } - _simFlatPlanet = null; - GC.Collect(); - BulletXMessage("Terrain erased!", false); - } - - - - //this._heightmap = null; - } - - - - internal void AddForgottenRigidBody(RigidBody forgottenRigidBody) - { - _forgottenRigidBodies.Add(forgottenRigidBody); - } - - private void RemoveForgottenRigidBodies() - { - RigidBody forgottenRigidBody; - int nRigidBodies = _forgottenRigidBodies.Count; - for (int i = nRigidBodies - 1; i >= 0; i--) - { - forgottenRigidBody = _forgottenRigidBodies[i]; - try - { - ddWorld.RemoveRigidBody(forgottenRigidBody); - _forgottenRigidBodies.Remove(forgottenRigidBody); - BulletXMessage("Forgotten Rigid Body Removed", false); - } - catch (Exception ex) - { - BulletXMessage("Can't remove forgottenRigidBody!: " + ex.Message, false); - } - } - GC.Collect(); - } - - internal static void BulletXMessage(string message, bool isWarning) - { - PhysicsPluginManager.PhysicsPluginMessage("[Modified BulletX]:\t" + message, isWarning); - } - - //temp - //private float HeightValue(MonoXnaCompactMaths.Vector3 position) - //{ - // int li_x, li_y; - // float height; - // li_x = (int)Math.Round(position.X); if (li_x < 0) li_x = 0; - // li_y = (int)Math.Round(position.Y); if (li_y < 0) li_y = 0; - - // height = this._heightmap[li_y * 256 + li_x]; - // if (height < 0) height = 0; - // else if (height > maxZ) height = maxZ; - - // return height; - //} - } - - /// - /// Generic Physics Actor for BulletX inherit from PhysicActor - /// - public class BulletXActor : PhysicsActor - { - protected bool flying = false; - protected bool _physical = false; - protected OpenMetaverse.Vector3 _position; - protected OpenMetaverse.Vector3 _velocity; - protected OpenMetaverse.Vector3 _size; - protected OpenMetaverse.Vector3 _acceleration; - protected OpenMetaverse.Quaternion _orientation; - protected OpenMetaverse.Vector3 m_rotationalVelocity; - protected RigidBody rigidBody; - protected int m_PhysicsActorType; - private Boolean iscolliding = false; - internal string _name; - - public BulletXActor(String name) - { - _name = name; - } - - public override bool Stopped - { - get { return false; } - } - - public override OpenMetaverse.Vector3 Position - { - get { return _position; } - set - { - lock (BulletXScene.BulletXLock) - { - _position = value; - Translate(); - } - } - } - - public override OpenMetaverse.Vector3 RotationalVelocity - { - get { return m_rotationalVelocity; } - set { m_rotationalVelocity = value; } - } - - public override OpenMetaverse.Vector3 Velocity - { - get { return _velocity; } - set - { - lock (BulletXScene.BulletXLock) - { - //Static objects don' have linear velocity - if (_physical) - { - _velocity = value; - Speed(); - } - else - { - _velocity = OpenMetaverse.Vector3.Zero; - } - } - } - } - public override float CollisionScore - { - get { return 0f; } - set { } - } - public override OpenMetaverse.Vector3 Size - { - get { return _size; } - set - { - lock (BulletXScene.BulletXLock) - { - _size = value; - } - } - } - - public override OpenMetaverse.Vector3 Force - { - get { return OpenMetaverse.Vector3.Zero; } - set { return; } - } - - public override int VehicleType - { - get { return 0; } - set { return; } - } - - public override void VehicleFloatParam(int param, float value) - { - - } - - public override void VehicleVectorParam(int param, OpenMetaverse.Vector3 value) - { - - } - - public override void VehicleRotationParam(int param, OpenMetaverse.Quaternion rotation) - { - - } - - public override void VehicleFlags(int param, bool remove) - { - - } - - public override void SetVolumeDetect(int param) - { - - } - - public override OpenMetaverse.Vector3 CenterOfMass - { - get { return OpenMetaverse.Vector3.Zero; } - } - - public override OpenMetaverse.Vector3 GeometricCenter - { - get { return OpenMetaverse.Vector3.Zero; } - } - - public override PrimitiveBaseShape Shape - { - set { return; } - } - - public override bool SetAlwaysRun - { - get { return false; } - set { return; } - } - - public override OpenMetaverse.Vector3 Acceleration - { - get { return _acceleration; } - } - - public override OpenMetaverse.Quaternion Orientation - { - get { return _orientation; } - set - { - lock (BulletXScene.BulletXLock) - { - _orientation = value; - ReOrient(); - } - } - } - public override void link(PhysicsActor obj) - { - - } - - public override void delink() - { - - } - - public override void LockAngularMotion(OpenMetaverse.Vector3 axis) - { - - } - - public override float Mass - { - get { return ActorMass; } - } - - public virtual float ActorMass - { - get { return 0; } - } - - public override int PhysicsActorType - { - get { return (int) m_PhysicsActorType; } - set { m_PhysicsActorType = value; } - } - - public RigidBody RigidBody - { - get { return rigidBody; } - } - - public Vector3 RigidBodyPosition - { - get { return rigidBody.CenterOfMassPosition; } - } - - public override bool IsPhysical - { - get { return _physical; } - set { _physical = value; } - } - - public override bool Flying - { - get { return flying; } - set { flying = value; } - } - - public override bool ThrottleUpdates - { - get { return false; } - set { return; } - } - - public override bool IsColliding - { - get { return iscolliding; } - set { iscolliding = value; } - } - - public override bool CollidingGround - { - get { return false; } - set { return; } - } - - public override bool CollidingObj - { - get { return false; } - set { return; } - } - - public override uint LocalID - { - set { return; } - } - - public override bool Grabbed - { - set { return; } - } - - public override bool Selected - { - set { return; } - } - - public override float Buoyancy - { - get { return 0f; } - set { return; } - } - - public override bool FloatOnWater - { - set { return; } - } - - public virtual void SetAcceleration(OpenMetaverse.Vector3 accel) - { - lock (BulletXScene.BulletXLock) - { - _acceleration = accel; - } - } - - public override bool Kinematic - { - get { return false; } - set { } - } - - public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) - { - } - public override OpenMetaverse.Vector3 Torque - { - get { return OpenMetaverse.Vector3.Zero; } - set { return; } - } - public override void AddAngularForce(OpenMetaverse.Vector3 force, bool pushforce) - { - } - - public override void SetMomentum(OpenMetaverse.Vector3 momentum) - { - } - - internal virtual void ValidateHeight(float heighmapPositionValue) - { - } - - internal virtual void UpdateKinetics() - { - } - - #region Methods for updating values of RigidBody - - protected internal void Translate() - { - Translate(_position); - } - - protected internal void Translate(OpenMetaverse.Vector3 _newPos) - { - Vector3 _translation; - _translation = BulletXMaths.PhysicsVectorToXnaVector3(_newPos) - rigidBody.CenterOfMassPosition; - rigidBody.Translate(_translation); - } - - protected internal void Speed() - { - Speed(_velocity); - } - - protected internal void Speed(OpenMetaverse.Vector3 _newSpeed) - { - Vector3 _speed; - _speed = BulletXMaths.PhysicsVectorToXnaVector3(_newSpeed); - rigidBody.LinearVelocity = _speed; - } - - protected internal void ReOrient() - { - ReOrient(_orientation); - } - - protected internal void ReOrient(OpenMetaverse.Quaternion _newOrient) - { - Quaternion _newOrientation; - _newOrientation = BulletXMaths.QuaternionToXnaQuaternion(_newOrient); - Matrix _comTransform = rigidBody.CenterOfMassTransform; - BulletXMaths.SetRotation(ref _comTransform, _newOrientation); - rigidBody.CenterOfMassTransform = _comTransform; - } - - protected internal void ReSize() - { - ReSize(_size); - } - - protected internal virtual void ReSize(OpenMetaverse.Vector3 _newSize) - { - } - - public virtual void ScheduleTerseUpdate() - { - base.RequestPhysicsterseUpdate(); - } - - #endregion - - public override void CrossingFailure() - { - - } - public override OpenMetaverse.Vector3 PIDTarget { set { return; } } - public override bool PIDActive { set { return; } } - public override float PIDTau { set { return; } } - - public override float PIDHoverHeight { set { return; } } - public override bool PIDHoverActive { set { return; } } - public override PIDHoverType PIDHoverType { set { return; } } - public override float PIDHoverTau { set { return; } } - - public override OpenMetaverse.Quaternion APIDTarget - { - set { return; } - } - - public override bool APIDActive - { - set { return; } - } - - public override float APIDStrength - { - set { return; } - } - - public override float APIDDamping - { - set { return; } - } - - - public override void SubscribeEvents(int ms) - { - - } - public override void UnSubscribeEvents() - { - - } - public override bool SubscribedEvents() - { - return false; - } - } - - /// - /// PhysicsActor Character Class for BulletX - /// - public class BulletXCharacter : BulletXActor - { - public BulletXCharacter(BulletXScene parent_scene, OpenMetaverse.Vector3 pos) - : this(String.Empty, parent_scene, pos) - { - } - - public BulletXCharacter(String avName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos) - : this(avName, parent_scene, pos, OpenMetaverse.Vector3.Zero, OpenMetaverse.Vector3.Zero, OpenMetaverse.Vector3.Zero, - OpenMetaverse.Quaternion.Identity) - { - } - - public BulletXCharacter(String avName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 velocity, - OpenMetaverse.Vector3 size, OpenMetaverse.Vector3 acceleration, OpenMetaverse.Quaternion orientation) - : base(avName) - { - //This fields will be removed. They're temporal - float _sizeX = 0.5f; - float _sizeY = 0.5f; - float _sizeZ = 1.6f; - //. - _position = pos; - _velocity = velocity; - _size = size; - //--- - _size.X = _sizeX; - _size.Y = _sizeY; - _size.Z = _sizeZ; - //. - _acceleration = acceleration; - _orientation = orientation; - _physical = true; - - float _mass = 50.0f; //This depends of avatar's dimensions - //For RigidBody Constructor. The next values might change - float _linearDamping = 0.0f; - float _angularDamping = 0.0f; - float _friction = 0.5f; - float _restitution = 0.0f; - Matrix _startTransform = Matrix.Identity; - Matrix _centerOfMassOffset = Matrix.Identity; - lock (BulletXScene.BulletXLock) - { - _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos); - //CollisionShape _collisionShape = new BoxShape(new MonoXnaCompactMaths.Vector3(1.0f, 1.0f, 1.60f)); - //For now, like ODE, collisionShape = sphere of radious = 1.0 - CollisionShape _collisionShape = new SphereShape(1.0f); - DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); - Vector3 _localInertia = new Vector3(); - _collisionShape.CalculateLocalInertia(_mass, out _localInertia); //Always when mass > 0 - rigidBody = - new RigidBody(_mass, _motionState, _collisionShape, _localInertia, _linearDamping, _angularDamping, - _friction, _restitution); - //rigidBody.ActivationState = ActivationState.DisableDeactivation; - //It's seems that there are a bug with rigidBody constructor and its CenterOfMassPosition - Vector3 _vDebugTranslation; - _vDebugTranslation = _startTransform.Translation - rigidBody.CenterOfMassPosition; - rigidBody.Translate(_vDebugTranslation); - parent_scene.ddWorld.AddRigidBody(rigidBody); - } - } - - public override int PhysicsActorType - { - get { return (int) ActorTypes.Agent; } - set { return; } - } - - public override OpenMetaverse.Vector3 Position - { - get { return base.Position; } - set { base.Position = value; } - } - - public override OpenMetaverse.Vector3 Velocity - { - get { return base.Velocity; } - set { base.Velocity = value; } - } - - public override OpenMetaverse.Vector3 Size - { - get { return base.Size; } - set { base.Size = value; } - } - - public override OpenMetaverse.Vector3 Acceleration - { - get { return base.Acceleration; } - } - - public override OpenMetaverse.Quaternion Orientation - { - get { return base.Orientation; } - set { base.Orientation = value; } - } - - public override bool Flying - { - get { return base.Flying; } - set { base.Flying = value; } - } - - public override bool IsColliding - { - get { return base.IsColliding; } - set { base.IsColliding = value; } - } - - public override bool Kinematic - { - get { return base.Kinematic; } - set { base.Kinematic = value; } - } - - public override void SetAcceleration(OpenMetaverse.Vector3 accel) - { - base.SetAcceleration(accel); - } - - public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) - { - base.AddForce(force, pushforce); - } - - public override void SetMomentum(OpenMetaverse.Vector3 momentum) - { - base.SetMomentum(momentum); - } - - internal void Move(float timeStep) - { - Vector3 vec = new Vector3(); - //At this point it's supossed that: - //_velocity == rigidBody.LinearVelocity - vec.X = _velocity.X; - vec.Y = _velocity.Y; - vec.Z = _velocity.Z; - if ((vec.X != 0.0f) || (vec.Y != 0.0f) || (vec.Z != 0.0f)) rigidBody.Activate(); - if (flying) - { - //Antigravity with movement - if (_position.Z <= BulletXScene.HeightLevel0) - { - vec.Z += BulletXScene.Gravity*timeStep; - } - //Lowgravity with movement - else if ((_position.Z > BulletXScene.HeightLevel0) - && (_position.Z <= BulletXScene.HeightLevel1)) - { - vec.Z += BulletXScene.Gravity*timeStep*(1.0f - BulletXScene.LowGravityFactor); - } - //Lowgravity with... - else if (_position.Z > BulletXScene.HeightLevel1) - { - if (vec.Z > 0) //no movement - vec.Z = BulletXScene.Gravity*timeStep*(1.0f - BulletXScene.LowGravityFactor); - else - vec.Z += BulletXScene.Gravity*timeStep*(1.0f - BulletXScene.LowGravityFactor); - } - } - rigidBody.LinearVelocity = vec; - } - - //This validation is very basic - internal override void ValidateHeight(float heighmapPositionValue) - { - if (rigidBody.CenterOfMassPosition.Z < heighmapPositionValue + _size.Z/2.0f) - { - Matrix m = rigidBody.WorldTransform; - Vector3 v3 = m.Translation; - v3.Z = heighmapPositionValue + _size.Z/2.0f; - m.Translation = v3; - rigidBody.WorldTransform = m; - //When an Avie touch the ground it's vertical velocity it's reduced to ZERO - Speed(new OpenMetaverse.Vector3(rigidBody.LinearVelocity.X, rigidBody.LinearVelocity.Y, 0.0f)); - } - } - - internal override void UpdateKinetics() - { - _position = BulletXMaths.XnaVector3ToPhysicsVector(rigidBody.CenterOfMassPosition); - _velocity = BulletXMaths.XnaVector3ToPhysicsVector(rigidBody.LinearVelocity); - //Orientation it seems that it will be the default. - ReOrient(); - } - } - - /// - /// PhysicsActor Prim Class for BulletX - /// - public class BulletXPrim : BulletXActor - { - //Density it will depends of material. - //For now all prims have the same density, all prims are made of water. Be water my friend! :D - private const float _density = 1000.0f; - private BulletXScene _parent_scene; - private OpenMetaverse.Vector3 m_prev_position; - private bool m_lastUpdateSent = false; - //added by jed zhu - private IMesh _mesh; - public IMesh GetMesh() { return _mesh; } - - - - public BulletXPrim(String primName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 size, - OpenMetaverse.Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) - : this( - primName, parent_scene, pos, OpenMetaverse.Vector3.Zero, size, OpenMetaverse.Vector3.Zero, rotation, mesh, pbs, - isPhysical) - { - } - - public BulletXPrim(String primName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 velocity, - OpenMetaverse.Vector3 size, - OpenMetaverse.Vector3 acceleration, OpenMetaverse.Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, - bool isPhysical) - : base(primName) - { - if ((size.X == 0) || (size.Y == 0) || (size.Z == 0)) - throw new Exception("Size 0"); - if (OpenMetaverse.Quaternion.Normalize(rotation).Length() == 0f) - rotation = OpenMetaverse.Quaternion.Identity; - - _position = pos; - _physical = isPhysical; - _velocity = _physical ? velocity : OpenMetaverse.Vector3.Zero; - _size = size; - _acceleration = acceleration; - _orientation = rotation; - - _parent_scene = parent_scene; - - CreateRigidBody(parent_scene, mesh, pos, size); - } - - public override int PhysicsActorType - { - get { return (int) ActorTypes.Prim; } - set { return; } - } - - public override OpenMetaverse.Vector3 Position - { - get { return base.Position; } - set { base.Position = value; } - } - - public override OpenMetaverse.Vector3 Velocity - { - get { return base.Velocity; } - set { base.Velocity = value; } - } - - public override OpenMetaverse.Vector3 Size - { - get { return _size; } - set - { - lock (BulletXScene.BulletXLock) - { - _size = value; - ReSize(); - } - } - } - - public override OpenMetaverse.Vector3 Acceleration - { - get { return base.Acceleration; } - } - - public override OpenMetaverse.Quaternion Orientation - { - get { return base.Orientation; } - set { base.Orientation = value; } - } - - public override float ActorMass - { - get - { - //For now all prims are boxes - return (_physical ? 1 : 0)*_density*_size.X*_size.Y*_size.Z; - } - } - - public override bool IsPhysical - { - get { return base.IsPhysical; } - set - { - base.IsPhysical = value; - if (value) - { - //--- - PhysicsPluginManager.PhysicsPluginMessage("Physical - Recreate", true); - //--- - ReCreateRigidBody(_size); - } - else - { - //--- - PhysicsPluginManager.PhysicsPluginMessage("Physical - SetMassProps", true); - //--- - rigidBody.SetMassProps(Mass, new Vector3()); - } - } - } - - public override bool Flying - { - get { return base.Flying; } - set { base.Flying = value; } - } - - public override bool IsColliding - { - get { return base.IsColliding; } - set { base.IsColliding = value; } - } - - public override bool Kinematic - { - get { return base.Kinematic; } - set { base.Kinematic = value; } - } - - public override void SetAcceleration(OpenMetaverse.Vector3 accel) - { - lock (BulletXScene.BulletXLock) - { - _acceleration = accel; - } - } - - public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) - { - base.AddForce(force,pushforce); - } - - public override void SetMomentum(OpenMetaverse.Vector3 momentum) - { - base.SetMomentum(momentum); - } - - internal override void ValidateHeight(float heighmapPositionValue) - { - if (rigidBody.CenterOfMassPosition.Z < heighmapPositionValue + _size.Z/2.0f) - { - Matrix m = rigidBody.WorldTransform; - Vector3 v3 = m.Translation; - v3.Z = heighmapPositionValue + _size.Z/2.0f; - m.Translation = v3; - rigidBody.WorldTransform = m; - //When a Prim touch the ground it's vertical velocity it's reduced to ZERO - //Static objects don't have linear velocity - if (_physical) - Speed(new OpenMetaverse.Vector3(rigidBody.LinearVelocity.X, rigidBody.LinearVelocity.Y, 0.0f)); - } - } - - internal override void UpdateKinetics() - { - if (_physical) //Updates properties. Prim updates its properties physically - { - _position = BulletXMaths.XnaVector3ToPhysicsVector(rigidBody.CenterOfMassPosition); - - _velocity = BulletXMaths.XnaVector3ToPhysicsVector(rigidBody.LinearVelocity); - _orientation = BulletXMaths.XnaQuaternionToQuaternion(rigidBody.Orientation); - - if ((Math.Abs(m_prev_position.X - _position.X) < 0.03) - && (Math.Abs(m_prev_position.Y - _position.Y) < 0.03) - && (Math.Abs(m_prev_position.Z - _position.Z) < 0.03)) - { - if (!m_lastUpdateSent) - { - _velocity = OpenMetaverse.Vector3.Zero; - base.ScheduleTerseUpdate(); - m_lastUpdateSent = true; - } - } - else - { - m_lastUpdateSent = false; - base.ScheduleTerseUpdate(); - } - m_prev_position = _position; - } - else //Doesn't updates properties. That's a cancel - { - Translate(); - //Speed(); //<- Static objects don't have linear velocity - ReOrient(); - } - } - - #region Methods for updating values of RigidBody - - protected internal void CreateRigidBody(BulletXScene parent_scene, IMesh mesh, OpenMetaverse.Vector3 pos, - OpenMetaverse.Vector3 size) - { - //For RigidBody Constructor. The next values might change - float _linearDamping = 0.0f; - float _angularDamping = 0.0f; - float _friction = 1.0f; - float _restitution = 0.0f; - Matrix _startTransform = Matrix.Identity; - Matrix _centerOfMassOffset = Matrix.Identity; - //added by jed zhu - _mesh = mesh; - - lock (BulletXScene.BulletXLock) - { - _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos); - //For now all prims are boxes - CollisionShape _collisionShape; - if (mesh == null) - { - _collisionShape = new BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(size)/2.0f); - } - else - { - int iVertexCount = mesh.getVertexList().Count; - int[] indices = mesh.getIndexListAsInt(); - Vector3[] v3Vertices = new Vector3[iVertexCount]; - for (int i = 0; i < iVertexCount; i++) - { - OpenMetaverse.Vector3 v = mesh.getVertexList()[i]; - if (v != null) // Note, null has special meaning. See meshing code for details - v3Vertices[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); - else - v3Vertices[i] = Vector3.Zero; - } - TriangleIndexVertexArray triMesh = new TriangleIndexVertexArray(indices, v3Vertices); - - _collisionShape = new TriangleMeshShape(triMesh); - } - DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); - Vector3 _localInertia = new Vector3(); - if (_physical) _collisionShape.CalculateLocalInertia(Mass, out _localInertia); //Always when mass > 0 - rigidBody = - new RigidBody(Mass, _motionState, _collisionShape, _localInertia, _linearDamping, _angularDamping, - _friction, _restitution); - //rigidBody.ActivationState = ActivationState.DisableDeactivation; - //It's seems that there are a bug with rigidBody constructor and its CenterOfMassPosition - Vector3 _vDebugTranslation; - _vDebugTranslation = _startTransform.Translation - rigidBody.CenterOfMassPosition; - rigidBody.Translate(_vDebugTranslation); - //--- - parent_scene.ddWorld.AddRigidBody(rigidBody); - } - } - - protected internal void ReCreateRigidBody(OpenMetaverse.Vector3 size) - { - //There is a bug when trying to remove a rigidBody that is colliding with something.. - try - { - _parent_scene.ddWorld.RemoveRigidBody(rigidBody); - } - catch (Exception ex) - { - BulletXScene.BulletXMessage(_parent_scene.is_ex_message + ex.Message, true); - rigidBody.ActivationState = ActivationState.DisableSimulation; - _parent_scene.AddForgottenRigidBody(rigidBody); - } - CreateRigidBody(_parent_scene, null, _position, size); - // Note, null for the meshing definitely is wrong. It's here for the moment to apease the compiler - if (_physical) Speed(); //Static objects don't have linear velocity - ReOrient(); - GC.Collect(); - } - - protected internal override void ReSize(OpenMetaverse.Vector3 _newSize) - { - //I wonder to know how to resize with a simple instruction in BulletX. It seems that for now there isn't - //so i have to do it manually. That's recreating rigidbody - ReCreateRigidBody(_newSize); - } - - #endregion - } - - /// - /// This Class manage a HeighField as a RigidBody. This is for to be added in the BulletXScene - /// - internal class BulletXPlanet - { - private OpenMetaverse.Vector3 _staticPosition; -// private Vector3 _staticVelocity; -// private OpenMetaverse.Quaternion _staticOrientation; - private float _mass; - // private BulletXScene _parentscene; - internal float[] _heightField; - private RigidBody _flatPlanet; - - internal RigidBody RigidBody - { - get { return _flatPlanet; } - } - - internal BulletXPlanet(BulletXScene parent_scene, float[] heightField) - { - _staticPosition = new OpenMetaverse.Vector3(BulletXScene.MaxXY / 2, BulletXScene.MaxXY / 2, 0); -// _staticVelocity = new PhysicsVector(); -// _staticOrientation = OpenMetaverse.Quaternion.Identity; - _mass = 0; //No active - // _parentscene = parent_scene; - _heightField = heightField; - - float _linearDamping = 0.0f; - float _angularDamping = 0.0f; - float _friction = 0.5f; - float _restitution = 0.0f; - Matrix _startTransform = Matrix.Identity; - Matrix _centerOfMassOffset = Matrix.Identity; - - lock (BulletXScene.BulletXLock) - { - try - { - _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(_staticPosition); - CollisionShape _collisionShape = - new HeightfieldTerrainShape(BulletXScene.MaxXY, BulletXScene.MaxXY, _heightField, - (float) BulletXScene.MaxZ, 2, true, false); - DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); - Vector3 _localInertia = new Vector3(); - //_collisionShape.CalculateLocalInertia(_mass, out _localInertia); //Always when mass > 0 - _flatPlanet = - new RigidBody(_mass, _motionState, _collisionShape, _localInertia, _linearDamping, - _angularDamping, _friction, _restitution); - //It's seems that there are a bug with rigidBody constructor and its CenterOfMassPosition - Vector3 _vDebugTranslation; - _vDebugTranslation = _startTransform.Translation - _flatPlanet.CenterOfMassPosition; - _flatPlanet.Translate(_vDebugTranslation); - parent_scene.ddWorld.AddRigidBody(_flatPlanet); - } - catch (Exception ex) - { - BulletXScene.BulletXMessage(ex.Message, true); - } - } - BulletXScene.BulletXMessage("BulletXPlanet created.", false); - } - - internal float HeightValue(Vector3 position) - { - int li_x, li_y; - float height; - li_x = (int) Math.Round(position.X); - if (li_x < 0) li_x = 0; - if (li_x >= BulletXScene.MaxXY) li_x = BulletXScene.MaxXY - 1; - li_y = (int) Math.Round(position.Y); - if (li_y < 0) li_y = 0; - if (li_y >= BulletXScene.MaxXY) li_y = BulletXScene.MaxXY - 1; - - height = ((HeightfieldTerrainShape) _flatPlanet.CollisionShape).getHeightFieldValue(li_x, li_y); - if (height < 0) height = 0; - else if (height > BulletXScene.MaxZ) height = BulletXScene.MaxZ; - - return height; - } - } -} diff --git a/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs b/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs deleted file mode 100644 index 637cf6e20c..0000000000 --- a/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs +++ /dev/null @@ -1,197 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - This file contains a class TriangleIndexVertexArray. I tried using the class with the same name - from the BulletX implementation and found it unusable for the purpose of using triangle meshes - within BulletX as the implementation was painfully incomplete. - The attempt to derive from the original class failed as viable members were hidden. - Fiddling around with BulletX itself was not my intention. - So I copied the class to the BulletX-plugin and modified it. - If you want to fiddle around with it it's up to you to move all this to BulletX. - If someone someday implements the missing functionality in BulletX, feel free to remove this class. - It's just an ugly hack. -*/ - -using System; -using System.Collections.Generic; -using MonoXnaCompactMaths; -using XnaDevRu.BulletX; - -namespace OpenSim.Region.Physics.BulletXPlugin -{ - /// - /// IndexedMesh indexes into existing vertex and index arrays, in a similar way OpenGL glDrawElements - /// instead of the number of indices, we pass the number of triangles - /// - public struct IndexedMesh - { - private int _numTriangles; - private int[] _triangleIndexBase; - private int _triangleIndexStride; - private int _numVertices; - private Vector3[] _vertexBase; - private int _vertexStride; - - public IndexedMesh(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, int numVertices, - Vector3[] vertexBase, int vertexStride) - { - _numTriangles = numTriangleIndices; - _triangleIndexBase = triangleIndexBase; - _triangleIndexStride = triangleIndexStride; - _vertexBase = vertexBase; - _numVertices = numVertices; - _vertexStride = vertexStride; - } - - public IndexedMesh(int[] triangleIndexBase, Vector3[] vertexBase) - { - _numTriangles = triangleIndexBase.Length; - _triangleIndexBase = triangleIndexBase; - _triangleIndexStride = 32; - _vertexBase = vertexBase; - _numVertices = vertexBase.Length; - _vertexStride = 24; - } - - public int TriangleCount - { - get { return _numTriangles; } - set { _numTriangles = value; } - } - - public int[] TriangleIndexBase - { - get { return _triangleIndexBase; } - set { _triangleIndexBase = value; } - } - - public int TriangleIndexStride - { - get { return _triangleIndexStride; } - set { _triangleIndexStride = value; } - } - - public int VertexCount - { - get { return _numVertices; } - set { _numVertices = value; } - } - - public Vector3[] VertexBase - { - get { return _vertexBase; } - set { _vertexBase = value; } - } - - public int VertexStride - { - get { return _vertexStride; } - set { _vertexStride = value; } - } - } - - /// - /// TriangleIndexVertexArray allows to use multiple meshes, by indexing into existing triangle/index arrays. - /// Additional meshes can be added using addIndexedMesh - /// - public class TriangleIndexVertexArray : StridingMeshInterface - { - private List _indexedMeshes = new List(); - - public TriangleIndexVertexArray() - { - } - - public TriangleIndexVertexArray(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, - int numVertices, Vector3[] vertexBase, int vertexStride) - { - IndexedMesh mesh = new IndexedMesh(); - mesh.TriangleCount = numTriangleIndices; - mesh.TriangleIndexBase = triangleIndexBase; - mesh.TriangleIndexStride = triangleIndexStride; - mesh.VertexBase = vertexBase; - mesh.VertexCount = numVertices; - mesh.VertexStride = vertexStride; - - AddIndexedMesh(mesh); - } - - public TriangleIndexVertexArray(int[] triangleIndexBase, Vector3[] vertexBase) - : this(triangleIndexBase.Length, triangleIndexBase, 32, vertexBase.Length, vertexBase, 24) - { - } - - public void AddIndexedMesh(IndexedMesh indexedMesh) - { - _indexedMeshes.Add(indexedMesh); - } - - public override void GetLockedVertexIndexBase(out List verts, out List indicies, out int numfaces, - int subpart) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void GetLockedReadOnlyVertexIndexBase(out List verts, out List indicies, - out int numfaces, int subpart) - { - IndexedMesh m = _indexedMeshes[0]; - Vector3[] vertexBase = m.VertexBase; - verts = new List(); - foreach (Vector3 v in vertexBase) - { - verts.Add(v); - } - int[] indexBase = m.TriangleIndexBase; - indicies = new List(); - foreach (int i in indexBase) - { - indicies.Add(i); - } - numfaces = vertexBase.GetLength(0); - } - - public override void UnLockVertexBase(int subpart) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void UnLockReadOnlyVertexBase(int subpart) - { - } - - public override int SubPartsCount() - { - return _indexedMeshes.Count; - } - - public override void PreallocateVertices(int numverts) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void PreallocateIndices(int numindices) - { - throw new Exception("The method or operation is not implemented."); - } - } -} diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index c165a41a9e..c26595c14f 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -464,10 +464,12 @@ namespace OpenSim.Region.Physics.OdePlugin m_pidControllerActive = true; Vector3 SetSize = value; - m_tainted_CAPSULE_LENGTH = (SetSize.Z*1.15f) - CAPSULE_RADIUS*2.0f; - //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); + m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; +// m_log.Info("[SIZE]: " + CAPSULE_LENGTH); - Velocity = Vector3.Zero; + // If we reset velocity here, then an avatar stalls when it crosses a border for the first time + // (as the height of the new root agent is set). +// Velocity = Vector3.Zero; _parent_scene.AddPhysicsActorTaint(this); } @@ -785,6 +787,8 @@ namespace OpenSim.Region.Physics.OdePlugin { m_log.Warn("[PHYSICS]: Got a NaN velocity from Scene in a Character"); } + +// m_log.DebugFormat("[PHYSICS]: Set target velocity of {0}", _target_velocity); } } @@ -1324,7 +1328,8 @@ namespace OpenSim.Region.Physics.OdePlugin { if (Shell != IntPtr.Zero && Body != IntPtr.Zero && Amotor != IntPtr.Zero) { - +// m_log.DebugFormat("[PHYSICS]: Changing capsule size"); + m_pidControllerActive = true; // no lock needed on _parent_scene.OdeLock because we are called from within the thread lock in OdePlugin's simulate() d.JointDestroy(Amotor); @@ -1335,7 +1340,10 @@ namespace OpenSim.Region.Physics.OdePlugin d.GeomDestroy(Shell); AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); - Velocity = Vector3.Zero; + + // As with Size, we reset velocity. However, this isn't strictly necessary since it doesn't + // appear to stall initial region crossings when done here. Being done for consistency. +// Velocity = Vector3.Zero; _parent_scene.geom_name_map[Shell] = m_name; _parent_scene.actor_name_map[Shell] = (PhysicsActor)this; @@ -1360,7 +1368,6 @@ namespace OpenSim.Region.Physics.OdePlugin _position.Z = m_taintPosition.Z; } } - } internal void AddCollisionFrameTime(int p) diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 0a4fc517c9..8ad0b7f11f 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -1526,6 +1526,7 @@ Console.WriteLine("changeadd 1"); { if (Body == IntPtr.Zero) enableBody(); + //Prim auto disable after 20 frames, //if you move it, re-enable the prim manually. if (_parent != null) @@ -1536,6 +1537,7 @@ Console.WriteLine("changeadd 1"); m_linkJoint = IntPtr.Zero; } } + if (Body != IntPtr.Zero) { d.BodySetPosition(Body, _position.X, _position.Y, _position.Z); @@ -1599,7 +1601,6 @@ Console.WriteLine(" JointCreateFixed"); float fy = 0; float fz = 0; - if (IsPhysical && (Body != IntPtr.Zero) && !m_isSelected && !childPrim) // KF: Only move root prims. { if (m_vehicle.Type != Vehicle.TYPE_NONE) @@ -1818,7 +1819,6 @@ Console.WriteLine(" JointCreateFixed"); // 35x10 = 350n times the mass per second applied maximum. float nmax = 35f * m_mass; float nmin = -35f * m_mass; - if (fx > nmax) fx = nmax; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 18c0dd29dc..03c1e12381 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2116,15 +2116,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { face = 0; } + if (face >= 0 && face < GetNumberOfSides(part)) { Primitive.TextureEntryFace texface; texface = tex.GetFace((uint)face); - return texface.TextureID.ToString(); + string texture = texface.TextureID.ToString(); + + lock (part.TaskInventory) + { + foreach (KeyValuePair inv in part.TaskInventory) + { + if (inv.Value.AssetID == texface.TextureID) + { + texture = inv.Value.Name.ToString(); + break; + } + } + } + + return texture; } else { - return String.Empty; + return UUID.Zero.ToString(); } } @@ -3250,10 +3265,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api SceneObjectGroup grp = m_host.ParentGroup; ScenePresence presence = World.GetScenePresence(m_host.OwnerID); - if (presence.Scene.AttachmentsModule != null) - { - presence.Scene.AttachmentsModule.AttachObject(presence.ControllingClient, grp, (uint)attachment, false); - } + + IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; + if (attachmentsModule != null) + attachmentsModule.AttachObject(presence, grp, (uint)attachment, false); } } @@ -3301,7 +3316,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; if (attachmentsModule != null) - attachmentsModule.DetachSingleAttachmentToInv(itemID, presence.ControllingClient); + attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); } public void llTakeCamera(string avatar) @@ -3953,7 +3968,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api parentPrim.ScheduleGroupForFullUpdate(); if (client != null) - parentPrim.GetProperties(client); + parentPrim.SendPropertiesToClient(client); ScriptSleep(1000); } @@ -4104,6 +4119,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llGetLinkKey(int linknum) { m_host.AddScriptLPS(1); + List keytable = new List(); + // parse for sitting avatare-uuids + World.ForEachScenePresence(delegate(ScenePresence presence) + { + if (!presence.IsChildAgent && presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) + keytable.Add(presence.UUID); + }); + + int totalprims = m_host.ParentGroup.PrimCount + keytable.Count; + if (linknum > m_host.ParentGroup.PrimCount && linknum <= totalprims) + { + return keytable[totalprims - linknum].ToString(); + } + + if (linknum == 1 && m_host.ParentGroup.PrimCount == 1 && keytable.Count == 1) + { + return m_host.UUID.ToString(); + } + SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); if (part != null) { @@ -4160,6 +4194,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String llGetLinkName(int linknum) { m_host.AddScriptLPS(1); + // parse for sitting avatare-names + List nametable = new List(); + World.ForEachScenePresence(delegate(ScenePresence presence) + { + if (!presence.IsChildAgent && presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID)) + nametable.Add(presence.ControllingClient.Name); + }); + + int totalprims = m_host.ParentGroup.PrimCount + nametable.Count; + if (totalprims > m_host.ParentGroup.PrimCount) + { + // sitting Avatar-Name with negativ linknum / SinglePrim + if (linknum < 0 && m_host.ParentGroup.PrimCount == 1 && nametable.Count == 1) + return nametable[0]; + // Prim-Name / SinglePrim Sitting Avatar + if (linknum == 1 && m_host.ParentGroup.PrimCount == 1 && nametable.Count == 1) + return m_host.Name; + // LinkNumber > of Real PrimSet = AvatarName + if (linknum > m_host.ParentGroup.PrimCount && linknum <= totalprims) + return nametable[totalprims - linknum]; + } // simplest case, this prims link number if (m_host.LinkNum == linknum) @@ -4173,6 +4228,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api else return UUID.Zero.ToString(); } + // Link set SceneObjectPart part = null; if (m_host.LinkNum == 1) // this is the Root prim @@ -4619,8 +4675,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llCollisionSound(string impact_sound, double impact_volume) { - m_host.AddScriptLPS(1); + // TODO: Parameter check logic required. UUID soundId = UUID.Zero; if (!UUID.TryParse(impact_sound, out soundId)) @@ -6756,6 +6812,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return m_host.GetAvatarOnSitTarget().ToString(); } + // http://wiki.secondlife.com/wiki/LlAvatarOnLinkSitTarget + public LSL_String llAvatarOnLinkSitTarget(int linknum) + { + m_host.AddScriptLPS(1); + if(linknum == ScriptBaseClass.LINK_SET || + linknum == ScriptBaseClass.LINK_ALL_CHILDREN || + linknum == ScriptBaseClass.LINK_ALL_OTHERS) return UUID.Zero.ToString(); + + List parts = GetLinkParts(linknum); + if (parts.Count == 0) return UUID.Zero.ToString(); + return parts[0].SitTargetAvatar.ToString(); + } + + public void llAddToLandPassList(string avatar, double hours) { m_host.AddScriptLPS(1); @@ -7481,7 +7551,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; LSL_Vector v; v = rules.GetVector3Item(idx++); - av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); + av.AbsolutePosition = new Vector3((float)v.x, (float)v.y, (float)v.z); av.SendAvatarDataToAllAgents(); break; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 7c388fe786..4ad4123a24 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -54,6 +54,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_Float llAtan2(double x, double y); void llAttachToAvatar(int attachment); LSL_Key llAvatarOnSitTarget(); + LSL_Key llAvatarOnLinkSitTarget(int linknum); LSL_Rotation llAxes2Rot(LSL_Vector fwd, LSL_Vector left, LSL_Vector up); LSL_Rotation llAxisAngle2Rot(LSL_Vector axis, double angle); LSL_Integer llBase64ToInteger(string str); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index ca54862487..a88a1f43ac 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -130,6 +130,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase return m_LSL_Functions.llAvatarOnSitTarget(); } + public LSL_Key llAvatarOnLinkSitTarget(int linknum) + { + return m_LSL_Functions.llAvatarOnLinkSitTarget(linknum); + } + public LSL_Rotation llAxes2Rot(LSL_Vector fwd, LSL_Vector left, LSL_Vector up) { return m_LSL_Functions.llAxes2Rot(fwd, left, up); diff --git a/OpenSim/Services/Connectors/Simulation/EstateDataService.cs b/OpenSim/Services/Connectors/Simulation/EstateDataService.cs index 7184ba188e..cdcdecf9b1 100644 --- a/OpenSim/Services/Connectors/Simulation/EstateDataService.cs +++ b/OpenSim/Services/Connectors/Simulation/EstateDataService.cs @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) Contributors, http://opensimulator.org/ * See CONTRIBUTORS.TXT for a full list of copyright holders. * @@ -90,6 +90,11 @@ namespace OpenSim.Services.Connectors { return m_database.LoadEstateSettings(estateID); } + + public EstateSettings CreateNewEstate() + { + return m_database.CreateNewEstate(); + } public List LoadEstateSettingsAll() { diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index eeab67a666..1648b51bd8 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs @@ -40,9 +40,9 @@ namespace OpenSim.Services.InventoryService { public class XInventoryService : ServiceBase, IInventoryService { - //private static readonly ILog m_log = - // LogManager.GetLogger( - // MethodBase.GetCurrentMethod().DeclaringType); +// private static readonly ILog m_log = +// LogManager.GetLogger( +// MethodBase.GetCurrentMethod().DeclaringType); protected IXInventoryData m_Database; protected bool m_AllowDelete = true; @@ -385,18 +385,22 @@ namespace OpenSim.Services.InventoryService public virtual bool AddItem(InventoryItemBase item) { - //m_log.DebugFormat( - // "[XINVENTORY SERVICE]: Adding item {0} to folder {1} for {2}", item.ID, item.Folder, item.Owner); +// m_log.DebugFormat( +// "[XINVENTORY SERVICE]: Adding item {0} to folder {1} for {2}", item.ID, item.Folder, item.Owner); return m_Database.StoreItem(ConvertFromOpenSim(item)); } public virtual bool UpdateItem(InventoryItemBase item) { +// throw new Exception("urrgh"); if (!m_AllowDelete) if (item.AssetType == (sbyte)AssetType.Link || item.AssetType == (sbyte)AssetType.LinkFolder) return false; +// m_log.InfoFormat( +// "[XINVENTORY SERVICE]: Updating item {0} {1} in folder {2}", item.Name, item.ID, item.Folder); + return m_Database.StoreItem(ConvertFromOpenSim(item)); } diff --git a/OpenSim/Services/UserAccountService/UserAccountService.cs b/OpenSim/Services/UserAccountService/UserAccountService.cs index 7a46165aa2..4c6122d476 100644 --- a/OpenSim/Services/UserAccountService/UserAccountService.cs +++ b/OpenSim/Services/UserAccountService/UserAccountService.cs @@ -28,15 +28,15 @@ using System; using System.Collections.Generic; using System.Reflection; +using log4net; using Nini.Config; +using OpenMetaverse; using OpenSim.Data; +using OpenSim.Framework; using OpenSim.Services.Interfaces; using OpenSim.Framework.Console; using GridRegion = OpenSim.Services.Interfaces.GridRegion; -using OpenMetaverse; -using log4net; - namespace OpenSim.Services.UserAccountService { public class UserAccountService : UserAccountServiceBase, IUserAccountService @@ -44,10 +44,16 @@ namespace OpenSim.Services.UserAccountService private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static UserAccountService m_RootInstance; + /// + /// Should we create default entries (minimum body parts/clothing, avatar wearable entries) for a new avatar? + /// + private bool m_CreateDefaultAvatarEntries; + protected IGridService m_GridService; protected IAuthenticationService m_AuthenticationService; protected IGridUserService m_GridUserService; protected IInventoryService m_InventoryService; + protected IAvatarService m_AvatarService; public UserAccountService(IConfigSource config) : base(config) @@ -77,6 +83,12 @@ namespace OpenSim.Services.UserAccountService if (invServiceDll != string.Empty) m_InventoryService = LoadPlugin(invServiceDll, new Object[] { config }); + string avatarServiceDll = userConfig.GetString("AvatarService", string.Empty); + if (avatarServiceDll != string.Empty) + m_AvatarService = LoadPlugin(avatarServiceDll, new Object[] { config }); + + m_CreateDefaultAvatarEntries = userConfig.GetBoolean("CreateDefaultAvatarEntries", false); + if (MainConsole.Instance != null) { MainConsole.Instance.Commands.AddCommand("UserService", false, @@ -102,9 +114,7 @@ namespace OpenSim.Services.UserAccountService "show account ", "Show account details for the given user", HandleShowAccount); } - } - } #region IUserAccountService @@ -349,7 +359,7 @@ namespace OpenSim.Services.UserAccountService email = MainConsole.Instance.CmdPrompt("Email", ""); else email = cmdparams[5]; - CreateUser(firstName, lastName, password, email); + CreateUser(UUID.Zero, firstName, lastName, password, email); } protected void HandleShowAccount(string module, string[] cmdparams) @@ -461,11 +471,12 @@ namespace OpenSim.Services.UserAccountService /// /// Create a user /// + /// Allows hosting of multiple grids in a single database. Normally left as UUID.Zero /// /// /// /// - private void CreateUser(string firstName, string lastName, string password, string email) + public UserAccount CreateUser(UUID scopeID, string firstName, string lastName, string password, string email) { UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName); if (null == account) @@ -512,12 +523,20 @@ namespace OpenSim.Services.UserAccountService { success = m_InventoryService.CreateUserInventory(account.PrincipalID); if (!success) + { m_log.WarnFormat("[USER ACCOUNT SERVICE]: Unable to create inventory for account {0} {1}.", firstName, lastName); + } + else if (m_CreateDefaultAvatarEntries) + { + CreateDefaultAppearanceEntries(account.PrincipalID); + } } m_log.InfoFormat("[USER ACCOUNT SERVICE]: Account {0} {1} created successfully", firstName, lastName); - } else { + } + else + { m_log.ErrorFormat("[USER ACCOUNT SERVICE]: Account creation failed for account {0} {1}", firstName, lastName); } } @@ -525,6 +544,128 @@ namespace OpenSim.Services.UserAccountService { m_log.ErrorFormat("[USER ACCOUNT SERVICE]: A user with the name {0} {1} already exists!", firstName, lastName); } + + return account; + } + + private void CreateDefaultAppearanceEntries(UUID principalID) + { + m_log.DebugFormat("[USER ACCOUNT SERVICE]: Creating default appearance items for {0}", principalID); + + InventoryFolderBase bodyPartsFolder = m_InventoryService.GetFolderForType(principalID, AssetType.Bodypart); + + InventoryItemBase eyes = new InventoryItemBase(UUID.Random(), principalID); + eyes.AssetID = new UUID("4bb6fa4d-1cd2-498a-a84c-95c1a0e745a7"); + eyes.Name = "Default Eyes"; + eyes.CreatorId = principalID.ToString(); + eyes.AssetType = (int)AssetType.Bodypart; + eyes.InvType = (int)InventoryType.Wearable; + eyes.Folder = bodyPartsFolder.ID; + eyes.BasePermissions = (uint)PermissionMask.All; + eyes.CurrentPermissions = (uint)PermissionMask.All; + eyes.EveryOnePermissions = (uint)PermissionMask.All; + eyes.GroupPermissions = (uint)PermissionMask.All; + eyes.NextPermissions = (uint)PermissionMask.All; + eyes.Flags = (uint)WearableType.Eyes; + m_InventoryService.AddItem(eyes); + + InventoryItemBase shape = new InventoryItemBase(UUID.Random(), principalID); + shape.AssetID = AvatarWearable.DEFAULT_BODY_ASSET; + shape.Name = "Default Shape"; + shape.CreatorId = principalID.ToString(); + shape.AssetType = (int)AssetType.Bodypart; + shape.InvType = (int)InventoryType.Wearable; + shape.Folder = bodyPartsFolder.ID; + shape.BasePermissions = (uint)PermissionMask.All; + shape.CurrentPermissions = (uint)PermissionMask.All; + shape.EveryOnePermissions = (uint)PermissionMask.All; + shape.GroupPermissions = (uint)PermissionMask.All; + shape.NextPermissions = (uint)PermissionMask.All; + shape.Flags = (uint)WearableType.Shape; + m_InventoryService.AddItem(shape); + + InventoryItemBase skin = new InventoryItemBase(UUID.Random(), principalID); + skin.AssetID = AvatarWearable.DEFAULT_SKIN_ASSET; + skin.Name = "Default Skin"; + skin.CreatorId = principalID.ToString(); + skin.AssetType = (int)AssetType.Bodypart; + skin.InvType = (int)InventoryType.Wearable; + skin.Folder = bodyPartsFolder.ID; + skin.BasePermissions = (uint)PermissionMask.All; + skin.CurrentPermissions = (uint)PermissionMask.All; + skin.EveryOnePermissions = (uint)PermissionMask.All; + skin.GroupPermissions = (uint)PermissionMask.All; + skin.NextPermissions = (uint)PermissionMask.All; + skin.Flags = (uint)WearableType.Skin; + m_InventoryService.AddItem(skin); + + InventoryItemBase hair = new InventoryItemBase(UUID.Random(), principalID); + hair.AssetID = AvatarWearable.DEFAULT_HAIR_ASSET; + hair.Name = "Default Hair"; + hair.CreatorId = principalID.ToString(); + hair.AssetType = (int)AssetType.Bodypart; + hair.InvType = (int)InventoryType.Wearable; + hair.Folder = bodyPartsFolder.ID; + hair.BasePermissions = (uint)PermissionMask.All; + hair.CurrentPermissions = (uint)PermissionMask.All; + hair.EveryOnePermissions = (uint)PermissionMask.All; + hair.GroupPermissions = (uint)PermissionMask.All; + hair.NextPermissions = (uint)PermissionMask.All; + hair.Flags = (uint)WearableType.Hair; + m_InventoryService.AddItem(hair); + + InventoryFolderBase clothingFolder = m_InventoryService.GetFolderForType(principalID, AssetType.Clothing); + + InventoryItemBase shirt = new InventoryItemBase(UUID.Random(), principalID); + shirt.AssetID = AvatarWearable.DEFAULT_SHIRT_ASSET; + shirt.Name = "Default Shirt"; + shirt.CreatorId = principalID.ToString(); + shirt.AssetType = (int)AssetType.Clothing; + shirt.InvType = (int)InventoryType.Wearable; + shirt.Folder = clothingFolder.ID; + shirt.BasePermissions = (uint)PermissionMask.All; + shirt.CurrentPermissions = (uint)PermissionMask.All; + shirt.EveryOnePermissions = (uint)PermissionMask.All; + shirt.GroupPermissions = (uint)PermissionMask.All; + shirt.NextPermissions = (uint)PermissionMask.All; + shirt.Flags = (uint)WearableType.Shirt; + m_InventoryService.AddItem(shirt); + + InventoryItemBase pants = new InventoryItemBase(UUID.Random(), principalID); + pants.AssetID = AvatarWearable.DEFAULT_PANTS_ASSET; + pants.Name = "Default Pants"; + pants.CreatorId = principalID.ToString(); + pants.AssetType = (int)AssetType.Clothing; + pants.InvType = (int)InventoryType.Wearable; + pants.Folder = clothingFolder.ID; + pants.BasePermissions = (uint)PermissionMask.All; + pants.CurrentPermissions = (uint)PermissionMask.All; + pants.EveryOnePermissions = (uint)PermissionMask.All; + pants.GroupPermissions = (uint)PermissionMask.All; + pants.NextPermissions = (uint)PermissionMask.All; + pants.Flags = (uint)WearableType.Pants; + m_InventoryService.AddItem(pants); + + if (m_AvatarService != null) + { + m_log.DebugFormat("[USER ACCOUNT SERVICE]: Creating default avatar entries for {0}", principalID); + + AvatarWearable[] wearables = new AvatarWearable[6]; + wearables[AvatarWearable.EYES] = new AvatarWearable(eyes.ID, eyes.AssetID); + wearables[AvatarWearable.BODY] = new AvatarWearable(shape.ID, shape.AssetID); + wearables[AvatarWearable.SKIN] = new AvatarWearable(skin.ID, skin.AssetID); + wearables[AvatarWearable.HAIR] = new AvatarWearable(hair.ID, hair.AssetID); + wearables[AvatarWearable.SHIRT] = new AvatarWearable(shirt.ID, shirt.AssetID); + wearables[AvatarWearable.PANTS] = new AvatarWearable(pants.ID, pants.AssetID); + + AvatarAppearance ap = new AvatarAppearance(); + for (int i = 0; i < 6; i++) + { + ap.SetWearable(i, wearables[i]); + } + + m_AvatarService.SetAppearance(principalID, ap); + } } } -} +} \ No newline at end of file diff --git a/OpenSim/Tests/Common/Mock/TestClient.cs b/OpenSim/Tests/Common/Mock/TestClient.cs index 014f7f6a81..b4f521fa5c 100644 --- a/OpenSim/Tests/Common/Mock/TestClient.cs +++ b/OpenSim/Tests/Common/Mock/TestClient.cs @@ -234,7 +234,7 @@ namespace OpenSim.Tests.Common.Mock public event ScriptReset OnScriptReset; public event GetScriptRunning OnGetScriptRunning; public event SetScriptRunning OnSetScriptRunning; - public event Action OnAutoPilotGo; + public event Action OnAutoPilotGo; public event TerrainUnacked OnUnackedTerrain; diff --git a/OpenSim/Tests/Common/QuaternionToleranceConstraint.cs b/OpenSim/Tests/Common/QuaternionToleranceConstraint.cs new file mode 100644 index 0000000000..b38c382f53 --- /dev/null +++ b/OpenSim/Tests/Common/QuaternionToleranceConstraint.cs @@ -0,0 +1,82 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using OpenMetaverse; +using NUnit.Framework; +using NUnit.Framework.Constraints; + +namespace OpenSim.Tests.Common +{ + public class QuaternionToleranceConstraint : ANumericalToleranceConstraint + { + private Quaternion _baseValue; + private Quaternion _valueToBeTested; + + public QuaternionToleranceConstraint(Quaternion baseValue, double tolerance) : base(tolerance) + { + _baseValue = baseValue; + } + + /// + /// Test whether the constraint is satisfied by a given value + /// + /// The value to be tested + /// + /// True for success, false for failure + /// + public override bool Matches(object valueToBeTested) + { + if (valueToBeTested == null) + { + throw new ArgumentException("Constraint cannot be used upon null values."); + } + if (valueToBeTested.GetType() != typeof (Quaternion)) + { + throw new ArgumentException("Constraint cannot be used upon non quaternion values."); + } + + _valueToBeTested = (Quaternion)valueToBeTested; + + return (IsWithinDoubleConstraint(_valueToBeTested.X, _baseValue.X) && + IsWithinDoubleConstraint(_valueToBeTested.Y, _baseValue.Y) && + IsWithinDoubleConstraint(_valueToBeTested.Z, _baseValue.Z) && + IsWithinDoubleConstraint(_valueToBeTested.W, _baseValue.W)); + } + + public override void WriteDescriptionTo(MessageWriter writer) + { + writer.WriteExpectedValue( + string.Format("A value {0} within tolerance of plus or minus {1}", _baseValue, _tolerance)); + } + + public override void WriteActualValueTo(MessageWriter writer) + { + writer.WriteActualValue(_valueToBeTested); + } + } +} \ No newline at end of file diff --git a/OpenSim/Tools/Configger/ConfigurationLoader.cs b/OpenSim/Tools/Configger/ConfigurationLoader.cs index 39146527b8..28bcc99ff4 100644 --- a/OpenSim/Tools/Configger/ConfigurationLoader.cs +++ b/OpenSim/Tools/Configger/ConfigurationLoader.cs @@ -233,6 +233,7 @@ namespace OpenSim.Tools.Configger config = defaultConfig.AddConfig("Startup"); config.Set("region_info_source", "filesystem"); + config.Set("allow_regionless", false); config.Set("gridmode", false); config.Set("physics", "OpenDynamicsEngine"); diff --git a/bin/Npgsql.dll b/bin/Npgsql.dll deleted file mode 100755 index 33fe6d3cc1..0000000000 Binary files a/bin/Npgsql.dll and /dev/null differ diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 342bce6b59..c3d32165e6 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -71,6 +71,11 @@ ;; in a tag. ; regionload_webserver_url = "http://example.com/regions.xml"; + ;# {allow_regionless} {} {Allow simulator to start up with no regions configured.} {true false} false + ;; Allow the simulator to start up if there are no region configuration available + ;; from the selected region_info_source. + ; allow_regionless = false + ;# {NonPhysicalPrimMax} {} {Maximum size of nonphysical prims?} {} 256 ;; Maximum size for non-physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonphysicalPrimMax!). ; NonPhysicalPrimMax = 256 @@ -149,14 +154,13 @@ ;; Choose one of the physics engines below ;; OpenDynamicsEngine is by some distance the most developed physics engine - ;; basicphysics effectively does not model physics at all, making all - ;; objects phantom - ;; The Bullet plugins do not work properly right now. A better Bullet plugin is on the way. + ;; BulletSim is incomplete and experimental but in active development + ;; basicphysics effectively does not model physics at all, making all objects phantom ;; Default is OpenDynamicsEngine ; physics = OpenDynamicsEngine + ; physics = BulletSim ; physics = basicphysics ; physics = POS - ; physics = modified_BulletX ;# {permissionmodules} {} {Permission modules to use (may specify multiple modules, separated by space} {} DefaultPermissionsModule ;; Permission modules to use, separated by space. @@ -219,6 +223,13 @@ ;; server to send mail through. ; emailmodule = DefaultEmailModule + ; Controls whether previously compiled scripts are deleted on sim restart. If you disable this + ; then startup will be faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the + ; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used + ; by scripts have changed. + ; Default is false + ; DeleteScriptsOnStartup = true + [SMTP] ;; The SMTP server enabled the email module to send email to external @@ -589,6 +600,25 @@ ;; VeryHigh, Severe OSFunctionThreatLevel = VeryLow + ; OS Functions enable/disable + ; For each function, you can add one line, as shown + ; The default for all functions allows them if below threat level + + ; true allows the use of the function unconditionally + ; Allow_osSetRegionWaterHeight = true + + ; false disables the function completely + ; Allow_osSetRegionWaterHeight = false + + ; Comma separated list of UUIDS allows the function for that list of UUIDS + ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb + + ; You can also use script creators as the uuid + ; Creators_osSetRegionWaterHeight = , ... + + ; If both Allow_ and Creators_ are given, effective permissions + ; are the union of the two. + ;; Time a script can spend in an event handler before it is interrupted ; EventLimit = 30 @@ -740,7 +770,7 @@ ;; "config-include/StandaloneCommon.ini.example" to "config-include/StandaloneCommon.ini" before ;; editing it to set the database and backend services that OpenSim will use. ;; - Include-Architecture = "config-include/Standalone.ini" + ; Include-Architecture = "config-include/Standalone.ini" ; Include-Architecture = "config-include/StandaloneHypergrid.ini" ; Include-Architecture = "config-include/Grid.ini" ; Include-Architecture = "config-include/GridHypergrid.ini" diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index ca4fbfb5b3..cd69e2a16a 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -70,6 +70,10 @@ ; except that everything is also enclosed in a tag. ; regionload_webserver_url = "http://example.com/regions.xml"; + ;; Allow the simulator to start up if there are no region configuration available + ;; from the selected region_info_source. + allow_regionless = false + ; Maximum size of non physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonphysicalPrimMax!). NonPhysicalPrimMax = 256 @@ -511,6 +515,7 @@ ; so it is disabled by default. Cap_WebFetchInventoryDescendents = "" + [Chat] ; Controls whether the chat module is enabled. Default is true. enabled = true; @@ -524,6 +529,7 @@ ; Distance in meters that shouts should travel. Default is 100m shout_distance = 100 + [EntityTransfer] ; The maximum distance in regions that an agent is allowed to teleport along the x or y axis ; This is set to 4095 because current viewers can't handle teleports that are greater than this distance @@ -550,6 +556,12 @@ CoalesceMultipleObjectsToInventory = true +[Attachments] + ; Controls whether avatar attachments are enabled. + ; Defaults to true - only set to false for debugging purposes + Enabled = true + + [Mesh] ; enable / disable Collada mesh support ; default is true @@ -1124,6 +1136,25 @@ ; Threat level to allow, one of None, VeryLow, Low, Moderate, High, VeryHigh, Severe OSFunctionThreatLevel = VeryLow + ; OS Functions enable/disable + ; For each function, you can add one line, as shown + ; The default for all functions allows them if below threat level + + ; true allows the use of the function unconditionally + ; Allow_osSetRegionWaterHeight = true + + ; false disables the function completely + ; Allow_osSetRegionWaterHeight = false + + ; Comma separated list of UUIDS allows the function for that list of UUIDS + ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb + + ; You can also use script creators as the uuid + ; Creators_osSetRegionWaterHeight = , ... + + ; If both Allow_ and Creators_ are given, effective permissions + ; are the union of the two. + ; Interval (s) between background save of script states SaveInterval = 120 @@ -1151,25 +1182,6 @@ SensorMaxRange = 96.0 SensorMaxResults = 16 - ; OS Functions enable/disable - ; For each function, you can add one line, as shown - ; The default for all functions allows them if below threat level - - ; true allows the use of the function unconditionally - ; Allow_osSetRegionWaterHeight = true - - ; false disables the function completely - ; Allow_osSetRegionWaterHeight = false - - ; Comma separated list of UUIDS allows the function for that list of UUIDS - ; Allow_osSetRegionWaterHeight = 888760cb-a3cf-43ac-8ea4-8732fd3ee2bb - - ; You can also use script creators as the uuid - ; Creators_osSetRegionWaterHeight = , ... - - ; If both Allow_ and Creators_ are given, effective permissions - ; are the union of the two. - ; Allow for llCreateLink and llBreakLink to work without asking for permission ; only enable this in a trusted environment otherwise you may be subject to hijacking ; AutomaticLinkPermission = false @@ -1182,11 +1194,12 @@ ;; Path to script assemblies ; ScriptEnginesPath = "ScriptEngines" - ; Whether to delete previously compiled scripts when the sim starts. If you disable this - ; then startup will be faster. However, then it becomes your responsibility to delete the - ; compiled scripts if OpenSim has changed enough that previously compiled scripts are no - ; longer compatible. - DeleteScriptsOnStartup = true + ; Controls whether previously compiled scripts are deleted on sim restart. If you disable this + ; then startup will be faster since scripts won't need to be recompiled. However, then it becomes your responsibility to delete the + ; compiled scripts if you're recompiling OpenSim from source code and internal interfaces used + ; by scripts have changed. + ; Default is false + ; DeleteScriptsOnStartup = true [OpenGridProtocol] diff --git a/bin/Robust.HG.ini.example b/bin/Robust.HG.ini.example index 910ba02f56..7f2636ccad 100644 --- a/bin/Robust.HG.ini.example +++ b/bin/Robust.HG.ini.example @@ -166,6 +166,14 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService" GridService = "OpenSim.Services.GridService.dll:GridService" InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService" + ; AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService" + + ;; This switch creates the minimum set of body parts and avatar entries for a viewer 2 + ;; to show a default "Ruth" avatar rather than a cloud for a newly created user. + ;; Default is false + ;; If you enable this you will also need to uncomment the AvatarService line above + ; CreateDefaultAvatarEntries = false + [GridUserService] ; for the server connector diff --git a/bin/Robust.ini.example b/bin/Robust.ini.example index f7781ab271..a299a73790 100644 --- a/bin/Robust.ini.example +++ b/bin/Robust.ini.example @@ -149,6 +149,14 @@ ServiceConnectors = "8003/OpenSim.Server.Handlers.dll:AssetServiceConnector,8003 PresenceService = "OpenSim.Services.PresenceService.dll:PresenceService" GridService = "OpenSim.Services.GridService.dll:GridService" InventoryService = "OpenSim.Services.InventoryService.dll:XInventoryService" + ; AvatarService = "OpenSim.Services.AvatarService.dll:AvatarService" + + ;; This switch creates the minimum set of body parts and avatar entries for a viewer 2 + ;; to show a default "Ruth" avatar rather than a cloud for a newly created user. + ;; Default is false + ;; If you enable this you will also need to uncomment the AvatarService line above + ; CreateDefaultAvatarEntries = false + [GridUserService] ; for the server connector diff --git a/bin/assets/BodyPartsAssetSet/BodyPartsAssetSet.xml b/bin/assets/BodyPartsAssetSet/BodyPartsAssetSet.xml index 8ef0fe72f7..a3d7ba3a07 100644 --- a/bin/assets/BodyPartsAssetSet/BodyPartsAssetSet.xml +++ b/bin/assets/BodyPartsAssetSet/BodyPartsAssetSet.xml @@ -4,7 +4,7 @@ - +
@@ -34,6 +34,14 @@
+ +
+ + + + +
+ diff --git a/runprebuild2010.bat b/runprebuild2010.bat old mode 100644 new mode 100755