diff options
Diffstat (limited to 'OpenSim/Region')
18 files changed, 644 insertions, 201 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 773baf5..552f64c 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -5255,7 +5255,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5255 | args.Channel = ch; | 5255 | args.Channel = ch; |
5256 | args.From = String.Empty; | 5256 | args.From = String.Empty; |
5257 | args.Message = Utils.BytesToString(msg); | 5257 | args.Message = Utils.BytesToString(msg); |
5258 | args.Type = ChatTypeEnum.Shout; | 5258 | args.Type = ChatTypeEnum.Region; //Behaviour in SL is that the response can be heard from any distance |
5259 | args.Position = new Vector3(); | 5259 | args.Position = new Vector3(); |
5260 | args.Scene = Scene; | 5260 | args.Scene = Scene; |
5261 | args.Sender = this; | 5261 | args.Sender = this; |
@@ -11277,9 +11277,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11277 | 11277 | ||
11278 | m_groupPowers.Clear(); | 11278 | m_groupPowers.Clear(); |
11279 | 11279 | ||
11280 | for (int i = 0; i < GroupMembership.Length; i++) | 11280 | if (GroupMembership != null) |
11281 | { | 11281 | { |
11282 | m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers; | 11282 | for (int i = 0; i < GroupMembership.Length; i++) |
11283 | { | ||
11284 | m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers; | ||
11285 | } | ||
11283 | } | 11286 | } |
11284 | } | 11287 | } |
11285 | } | 11288 | } |
diff --git a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs index 37cdaae..9eaa758 100644 --- a/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs +++ b/OpenSim/Region/CoreModules/Asset/FlotsamAssetCache.cs | |||
@@ -406,6 +406,11 @@ namespace Flotsam.RegionModules.AssetCache | |||
406 | return asset; | 406 | return asset; |
407 | } | 407 | } |
408 | 408 | ||
409 | public AssetBase GetCached(string id) | ||
410 | { | ||
411 | return Get(id); | ||
412 | } | ||
413 | |||
409 | public void Expire(string id) | 414 | public void Expire(string id) |
410 | { | 415 | { |
411 | if (m_LogLevel >= 2) | 416 | if (m_LogLevel >= 2) |
diff --git a/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs new file mode 100644 index 0000000..3b66859 --- /dev/null +++ b/OpenSim/Region/CoreModules/Avatar/Assets/GetTextureModule.cs | |||
@@ -0,0 +1,229 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Specialized; | ||
31 | using System.Reflection; | ||
32 | using System.IO; | ||
33 | using System.Web; | ||
34 | using log4net; | ||
35 | using Nini.Config; | ||
36 | using OpenMetaverse; | ||
37 | using OpenMetaverse.StructuredData; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Servers; | ||
40 | using OpenSim.Framework.Servers.HttpServer; | ||
41 | using OpenSim.Region.Framework.Interfaces; | ||
42 | using OpenSim.Region.Framework.Scenes; | ||
43 | using OpenSim.Services.Interfaces; | ||
44 | using Caps = OpenSim.Framework.Capabilities.Caps; | ||
45 | |||
46 | namespace OpenSim.Region.CoreModules.Avatar.ObjectCaps | ||
47 | { | ||
48 | #region Stream Handler | ||
49 | |||
50 | public delegate byte[] StreamHandlerCallback(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse); | ||
51 | |||
52 | public class StreamHandler : BaseStreamHandler | ||
53 | { | ||
54 | StreamHandlerCallback m_callback; | ||
55 | |||
56 | public StreamHandler(string httpMethod, string path, StreamHandlerCallback callback) | ||
57 | : base(httpMethod, path) | ||
58 | { | ||
59 | m_callback = callback; | ||
60 | } | ||
61 | |||
62 | public override byte[] Handle(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
63 | { | ||
64 | return m_callback(path, request, httpRequest, httpResponse); | ||
65 | } | ||
66 | } | ||
67 | |||
68 | #endregion Stream Handler | ||
69 | |||
70 | public class GetTextureModule : IRegionModule | ||
71 | { | ||
72 | private static readonly ILog m_log = | ||
73 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
74 | private Scene m_scene; | ||
75 | private IAssetService m_assetService; | ||
76 | |||
77 | #region IRegionModule Members | ||
78 | |||
79 | public void Initialise(Scene pScene, IConfigSource pSource) | ||
80 | { | ||
81 | m_scene = pScene; | ||
82 | } | ||
83 | |||
84 | public void PostInitialise() | ||
85 | { | ||
86 | m_assetService = m_scene.RequestModuleInterface<IAssetService>(); | ||
87 | m_scene.EventManager.OnRegisterCaps += RegisterCaps; | ||
88 | } | ||
89 | |||
90 | public void Close() { } | ||
91 | |||
92 | public string Name { get { return "GetTextureModule"; } } | ||
93 | public bool IsSharedModule { get { return false; } } | ||
94 | |||
95 | public void RegisterCaps(UUID agentID, Caps caps) | ||
96 | { | ||
97 | UUID capID = UUID.Random(); | ||
98 | |||
99 | m_log.Info("[GETTEXTURE]: /CAPS/" + capID); | ||
100 | caps.RegisterHandler("GetTexture", new StreamHandler("GET", "/CAPS/" + capID, ProcessGetTexture)); | ||
101 | } | ||
102 | |||
103 | #endregion | ||
104 | |||
105 | private byte[] ProcessGetTexture(string path, Stream request, OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
106 | { | ||
107 | // TODO: Change this to a config option | ||
108 | const string REDIRECT_URL = null; | ||
109 | |||
110 | // Try to parse the texture ID from the request URL | ||
111 | NameValueCollection query = HttpUtility.ParseQueryString(httpRequest.Url.Query); | ||
112 | string textureStr = GetOne(query, "texture_id"); | ||
113 | |||
114 | if (m_assetService == null) | ||
115 | { | ||
116 | m_log.Error("[GETTEXTURE]: Cannot fetch texture " + textureStr + " without an asset service"); | ||
117 | httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound; | ||
118 | return null; | ||
119 | } | ||
120 | |||
121 | UUID textureID; | ||
122 | if (!String.IsNullOrEmpty(textureStr) && UUID.TryParse(textureStr, out textureID)) | ||
123 | { | ||
124 | AssetBase texture; | ||
125 | |||
126 | if (!String.IsNullOrEmpty(REDIRECT_URL)) | ||
127 | { | ||
128 | // Only try to fetch locally cached textures. Misses are redirected | ||
129 | texture = m_assetService.GetCached(textureID.ToString()); | ||
130 | |||
131 | if (texture != null) | ||
132 | { | ||
133 | SendTexture(httpRequest, httpResponse, texture); | ||
134 | } | ||
135 | else | ||
136 | { | ||
137 | string textureUrl = REDIRECT_URL + textureID.ToString(); | ||
138 | m_log.Debug("[GETTEXTURE]: Redirecting texture request to " + textureUrl); | ||
139 | httpResponse.RedirectLocation = textureUrl; | ||
140 | } | ||
141 | } | ||
142 | else | ||
143 | { | ||
144 | // Fetch locally or remotely. Misses return a 404 | ||
145 | texture = m_assetService.Get(textureID.ToString()); | ||
146 | |||
147 | if (texture != null) | ||
148 | { | ||
149 | SendTexture(httpRequest, httpResponse, texture); | ||
150 | } | ||
151 | else | ||
152 | { | ||
153 | m_log.Warn("[GETTEXTURE]: Texture " + textureID + " not found"); | ||
154 | httpResponse.StatusCode = (int)System.Net.HttpStatusCode.NotFound; | ||
155 | } | ||
156 | } | ||
157 | } | ||
158 | else | ||
159 | { | ||
160 | m_log.Warn("[GETTEXTURE]: Failed to parse a texture_id from GetTexture request: " + httpRequest.Url); | ||
161 | } | ||
162 | |||
163 | httpResponse.Send(); | ||
164 | return null; | ||
165 | } | ||
166 | |||
167 | private void SendTexture(OSHttpRequest request, OSHttpResponse response, AssetBase texture) | ||
168 | { | ||
169 | string range = GetOne(request.Headers, "Range"); | ||
170 | if (!String.IsNullOrEmpty(range)) | ||
171 | { | ||
172 | // Range request | ||
173 | int start, end; | ||
174 | if (TryParseRange(range, out start, out end)) | ||
175 | { | ||
176 | end = Utils.Clamp(end, 1, texture.Data.Length); | ||
177 | start = Utils.Clamp(start, 0, end - 1); | ||
178 | |||
179 | m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID); | ||
180 | |||
181 | if (end - start < texture.Data.Length) | ||
182 | response.StatusCode = (int)System.Net.HttpStatusCode.PartialContent; | ||
183 | |||
184 | response.ContentLength = end - start; | ||
185 | response.ContentType = texture.Metadata.ContentType; | ||
186 | |||
187 | response.Body.Write(texture.Data, start, end - start); | ||
188 | } | ||
189 | else | ||
190 | { | ||
191 | m_log.Warn("Malformed Range header: " + range); | ||
192 | response.StatusCode = (int)System.Net.HttpStatusCode.BadRequest; | ||
193 | } | ||
194 | } | ||
195 | else | ||
196 | { | ||
197 | // Full content request | ||
198 | response.ContentLength = texture.Data.Length; | ||
199 | response.ContentType = texture.Metadata.ContentType; | ||
200 | response.Body.Write(texture.Data, 0, texture.Data.Length); | ||
201 | } | ||
202 | } | ||
203 | |||
204 | private bool TryParseRange(string header, out int start, out int end) | ||
205 | { | ||
206 | if (header.StartsWith("bytes=")) | ||
207 | { | ||
208 | string[] rangeValues = header.Substring(6).Split('-'); | ||
209 | if (rangeValues.Length == 2) | ||
210 | { | ||
211 | if (Int32.TryParse(rangeValues[0], out start) && Int32.TryParse(rangeValues[1], out end)) | ||
212 | return true; | ||
213 | } | ||
214 | } | ||
215 | |||
216 | start = end = 0; | ||
217 | return false; | ||
218 | } | ||
219 | |||
220 | private static string GetOne(NameValueCollection collection, string key) | ||
221 | { | ||
222 | string[] values = collection.GetValues(key); | ||
223 | if (values != null && values.Length > 0) | ||
224 | return values[0]; | ||
225 | |||
226 | return null; | ||
227 | } | ||
228 | } | ||
229 | } | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs index af2f3d6..ebd6bbd 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs | |||
@@ -229,6 +229,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset | |||
229 | return asset; | 229 | return asset; |
230 | } | 230 | } |
231 | 231 | ||
232 | public AssetBase GetCached(string id) | ||
233 | { | ||
234 | if (m_Cache != null) | ||
235 | return m_Cache.Get(id); | ||
236 | |||
237 | return null; | ||
238 | } | ||
239 | |||
232 | public AssetMetadata GetMetadata(string id) | 240 | public AssetMetadata GetMetadata(string id) |
233 | { | 241 | { |
234 | AssetBase asset = null; | 242 | AssetBase asset = null; |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs index 50348da..1b3419d 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/LocalAssetServiceConnector.cs | |||
@@ -165,6 +165,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset | |||
165 | return asset; | 165 | return asset; |
166 | } | 166 | } |
167 | 167 | ||
168 | public AssetBase GetCached(string id) | ||
169 | { | ||
170 | if (m_Cache != null) | ||
171 | return m_Cache.Get(id); | ||
172 | |||
173 | return null; | ||
174 | } | ||
175 | |||
168 | public AssetMetadata GetMetadata(string id) | 176 | public AssetMetadata GetMetadata(string id) |
169 | { | 177 | { |
170 | AssetBase asset = null; | 178 | AssetBase asset = null; |
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index f58904f..16ca3f9 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs | |||
@@ -73,8 +73,6 @@ namespace OpenSim.Region.Framework.Interfaces | |||
73 | /// </summary> | 73 | /// </summary> |
74 | void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); | 74 | void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); |
75 | 75 | ||
76 | ArrayList GetScriptErrors(UUID itemID); | ||
77 | |||
78 | /// <summary> | 76 | /// <summary> |
79 | /// Stop all the scripts in this entity. | 77 | /// Stop all the scripts in this entity. |
80 | /// </summary> | 78 | /// </summary> |
@@ -104,6 +102,8 @@ namespace OpenSim.Region.Framework.Interfaces | |||
104 | /// <param name="stateSource"></param> | 102 | /// <param name="stateSource"></param> |
105 | void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource); | 103 | void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource); |
106 | 104 | ||
105 | ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource); | ||
106 | |||
107 | /// <summary> | 107 | /// <summary> |
108 | /// Stop a script which is in this prim's inventory. | 108 | /// Stop a script which is in this prim's inventory. |
109 | /// </summary> | 109 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs b/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs new file mode 100644 index 0000000..6fd6ba7 --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs | |||
@@ -0,0 +1,12 @@ | |||
1 | /////////////////////////////////////////////////////////////////// | ||
2 | // | ||
3 | // (c) Careminster LImited, Melanie Thielker and the Meta7 Team | ||
4 | // | ||
5 | // This file is not open source. All rights reserved | ||
6 | // Mod 2 | ||
7 | public interface ISnmpModule | ||
8 | { | ||
9 | void Alert(string message); | ||
10 | void Trap(int code,string simname,string Message); | ||
11 | void ColdStart(int step , string simname); | ||
12 | } | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 1875c48..357cdc4 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -212,8 +212,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
212 | { | 212 | { |
213 | // Needs to determine which engine was running it and use that | 213 | // Needs to determine which engine was running it and use that |
214 | // | 214 | // |
215 | part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0); | 215 | errors = part.Inventory.CreateScriptInstanceEr(item.ItemID, 0, false, DefaultScriptEngine, 0); |
216 | errors = part.Inventory.GetScriptErrors(item.ItemID); | ||
217 | } | 216 | } |
218 | else | 217 | else |
219 | { | 218 | { |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index e4daa0b..671f8fc 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -156,6 +156,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
156 | 156 | ||
157 | public IXfer XferManager; | 157 | public IXfer XferManager; |
158 | 158 | ||
159 | protected ISnmpModule m_snmpService = null; | ||
160 | public ISnmpModule SnmpService | ||
161 | { | ||
162 | get | ||
163 | { | ||
164 | if (m_snmpService == null) | ||
165 | { | ||
166 | m_snmpService = RequestModuleInterface<ISnmpModule>(); | ||
167 | } | ||
168 | |||
169 | return m_snmpService; | ||
170 | } | ||
171 | } | ||
172 | |||
159 | protected IAssetService m_AssetService; | 173 | protected IAssetService m_AssetService; |
160 | protected IAuthorizationService m_AuthorizationService; | 174 | protected IAuthorizationService m_AuthorizationService; |
161 | 175 | ||
@@ -1727,7 +1741,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1727 | public void SaveTerrain() | 1741 | public void SaveTerrain() |
1728 | { | 1742 | { |
1729 | m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); | 1743 | m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID); |
1730 | } | 1744 | } |
1731 | 1745 | ||
1732 | public void StoreWindlightProfile(RegionLightShareData wl) | 1746 | public void StoreWindlightProfile(RegionLightShareData wl) |
1733 | { | 1747 | { |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 014b007..84c3719 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -104,8 +104,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
104 | /// since the group's last persistent backup | 104 | /// since the group's last persistent backup |
105 | /// </summary> | 105 | /// </summary> |
106 | private bool m_hasGroupChanged = false; | 106 | private bool m_hasGroupChanged = false; |
107 | private long timeFirstChanged; | 107 | private long timeFirstChanged = 0; |
108 | private long timeLastChanged; | 108 | private long timeLastChanged = 0; |
109 | private long m_maxPersistTime = 0; | ||
110 | private long m_minPersistTime = 0; | ||
111 | private Random m_rand; | ||
112 | |||
109 | private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim(); | 113 | private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim(); |
110 | 114 | ||
111 | public void lockPartsForRead(bool locked) | 115 | public void lockPartsForRead(bool locked) |
@@ -182,6 +186,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
182 | timeLastChanged = DateTime.Now.Ticks; | 186 | timeLastChanged = DateTime.Now.Ticks; |
183 | if (!m_hasGroupChanged) | 187 | if (!m_hasGroupChanged) |
184 | timeFirstChanged = DateTime.Now.Ticks; | 188 | timeFirstChanged = DateTime.Now.Ticks; |
189 | if (m_rootPart != null && m_rootPart.UUID != null && m_scene != null) | ||
190 | { | ||
191 | if (m_rand == null) | ||
192 | { | ||
193 | byte[] val = new byte[16]; | ||
194 | m_rootPart.UUID.ToBytes(val, 0); | ||
195 | m_rand = new Random(BitConverter.ToInt32(val, 0)); | ||
196 | } | ||
197 | |||
198 | if (m_scene.GetRootAgentCount() == 0) | ||
199 | { | ||
200 | //If the region is empty, this change has been made by an automated process | ||
201 | //and thus we delay the persist time by a random amount between 1.5 and 2.5. | ||
202 | |||
203 | float factor = 1.5f + (float)(m_rand.NextDouble()); | ||
204 | m_maxPersistTime = (long)((float)m_scene.m_persistAfter * factor); | ||
205 | m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * factor); | ||
206 | } | ||
207 | else | ||
208 | { | ||
209 | //If the region is not empty, we want to obey the minimum and maximum persist times | ||
210 | //but add a random factor so we stagger the object persistance a little | ||
211 | m_maxPersistTime = (long)((float)m_scene.m_persistAfter * (1.0d - (m_rand.NextDouble() / 5.0d))); //Multiply by 1.0-1.5 | ||
212 | m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * (1.0d + (m_rand.NextDouble() / 2.0d))); //Multiply by 0.8-1.0 | ||
213 | } | ||
214 | } | ||
185 | } | 215 | } |
186 | m_hasGroupChanged = value; | 216 | m_hasGroupChanged = value; |
187 | } | 217 | } |
@@ -197,8 +227,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
197 | return false; | 227 | return false; |
198 | if (m_scene.ShuttingDown) | 228 | if (m_scene.ShuttingDown) |
199 | return true; | 229 | return true; |
230 | |||
231 | if (m_minPersistTime == 0 || m_maxPersistTime == 0) | ||
232 | { | ||
233 | m_maxPersistTime = m_scene.m_persistAfter; | ||
234 | m_minPersistTime = m_scene.m_dontPersistBefore; | ||
235 | } | ||
236 | |||
200 | long currentTime = DateTime.Now.Ticks; | 237 | long currentTime = DateTime.Now.Ticks; |
201 | if (currentTime - timeLastChanged > m_scene.m_dontPersistBefore || currentTime - timeFirstChanged > m_scene.m_persistAfter) | 238 | |
239 | if (timeLastChanged == 0) timeLastChanged = currentTime; | ||
240 | if (timeFirstChanged == 0) timeFirstChanged = currentTime; | ||
241 | |||
242 | if (currentTime - timeLastChanged > m_minPersistTime || currentTime - timeFirstChanged > m_maxPersistTime) | ||
202 | return true; | 243 | return true; |
203 | return false; | 244 | return false; |
204 | } | 245 | } |
@@ -530,6 +571,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
530 | /// </summary> | 571 | /// </summary> |
531 | public SceneObjectGroup() | 572 | public SceneObjectGroup() |
532 | { | 573 | { |
574 | |||
533 | } | 575 | } |
534 | 576 | ||
535 | /// <summary> | 577 | /// <summary> |
@@ -546,7 +588,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
546 | /// Constructor. This object is added to the scene later via AttachToScene() | 588 | /// Constructor. This object is added to the scene later via AttachToScene() |
547 | /// </summary> | 589 | /// </summary> |
548 | public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) | 590 | public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) |
549 | { | 591 | { |
550 | SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, Vector3.Zero)); | 592 | SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, Vector3.Zero)); |
551 | } | 593 | } |
552 | 594 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 836622d..07d58a1 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -45,6 +45,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
45 | 45 | ||
46 | private string m_inventoryFileName = String.Empty; | 46 | private string m_inventoryFileName = String.Empty; |
47 | private int m_inventoryFileNameSerial = 0; | 47 | private int m_inventoryFileNameSerial = 0; |
48 | |||
49 | private Dictionary<UUID, ArrayList> m_scriptErrors = new Dictionary<UUID, ArrayList>(); | ||
48 | 50 | ||
49 | /// <value> | 51 | /// <value> |
50 | /// The part to which the inventory belongs. | 52 | /// The part to which the inventory belongs. |
@@ -210,7 +212,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
210 | } | 212 | } |
211 | } | 213 | } |
212 | 214 | ||
213 | public ArrayList GetScriptErrors(UUID itemID) | 215 | private ArrayList GetScriptErrors(UUID itemID) |
214 | { | 216 | { |
215 | ArrayList ret = new ArrayList(); | 217 | ArrayList ret = new ArrayList(); |
216 | 218 | ||
@@ -269,7 +271,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
269 | // item.Name, item.ItemID, Name, UUID); | 271 | // item.Name, item.ItemID, Name, UUID); |
270 | 272 | ||
271 | if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) | 273 | if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) |
274 | { | ||
275 | StoreScriptError(item.ItemID, "no permission"); | ||
272 | return; | 276 | return; |
277 | } | ||
273 | 278 | ||
274 | m_part.AddFlag(PrimFlags.Scripted); | 279 | m_part.AddFlag(PrimFlags.Scripted); |
275 | 280 | ||
@@ -284,6 +289,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
284 | m_items.LockItemsForWrite(false); | 289 | m_items.LockItemsForWrite(false); |
285 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | 290 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( |
286 | m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); | 291 | m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource); |
292 | StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID)); | ||
287 | m_part.ParentGroup.AddActiveScriptCount(1); | 293 | m_part.ParentGroup.AddActiveScriptCount(1); |
288 | m_part.ScheduleFullUpdate(); | 294 | m_part.ScheduleFullUpdate(); |
289 | return; | 295 | return; |
@@ -293,11 +299,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
293 | { | 299 | { |
294 | if (null == asset) | 300 | if (null == asset) |
295 | { | 301 | { |
302 | string msg = String.Format("asset ID {0} could not be found", item.AssetID); | ||
303 | StoreScriptError(item.ItemID, msg); | ||
296 | m_log.ErrorFormat( | 304 | m_log.ErrorFormat( |
297 | "[PRIM INVENTORY]: " + | 305 | "[PRIM INVENTORY]: " + |
298 | "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", | 306 | "Couldn't start script {0}, {1} at {2} in {3} since {4}", |
299 | item.Name, item.ItemID, m_part.AbsolutePosition, | 307 | item.Name, item.ItemID, m_part.AbsolutePosition, |
300 | m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); | 308 | m_part.ParentGroup.Scene.RegionInfo.RegionName, msg); |
301 | } | 309 | } |
302 | else | 310 | else |
303 | { | 311 | { |
@@ -310,11 +318,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
310 | string script = Utils.BytesToString(asset.Data); | 318 | string script = Utils.BytesToString(asset.Data); |
311 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( | 319 | m_part.ParentGroup.Scene.EventManager.TriggerRezScript( |
312 | m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); | 320 | m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource); |
321 | StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID)); | ||
313 | m_part.ParentGroup.AddActiveScriptCount(1); | 322 | m_part.ParentGroup.AddActiveScriptCount(1); |
314 | m_part.ScheduleFullUpdate(); | 323 | m_part.ScheduleFullUpdate(); |
315 | } | 324 | } |
316 | }); | 325 | }); |
317 | } | 326 | } |
327 | else | ||
328 | { | ||
329 | StoreScriptError(item.ItemID, "scripts disabled"); | ||
330 | } | ||
318 | } | 331 | } |
319 | 332 | ||
320 | private void RestoreSavedScriptState(UUID oldID, UUID newID) | 333 | private void RestoreSavedScriptState(UUID oldID, UUID newID) |
@@ -391,24 +404,71 @@ namespace OpenSim.Region.Framework.Scenes | |||
391 | else | 404 | else |
392 | { | 405 | { |
393 | m_items.LockItemsForRead(false); | 406 | m_items.LockItemsForRead(false); |
407 | string msg = String.Format("couldn't be found for prim {0}, {1} at {2} in {3}", m_part.Name, m_part.UUID, | ||
408 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
409 | StoreScriptError(itemId, msg); | ||
394 | m_log.ErrorFormat( | 410 | m_log.ErrorFormat( |
395 | "[PRIM INVENTORY]: " + | 411 | "[PRIM INVENTORY]: " + |
396 | "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}", | 412 | "Couldn't start script with ID {0} since it {1}", itemId, msg); |
397 | itemId, m_part.Name, m_part.UUID, | ||
398 | m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); | ||
399 | } | 413 | } |
400 | } | 414 | } |
401 | else | 415 | else |
402 | { | 416 | { |
403 | m_items.LockItemsForRead(false); | 417 | m_items.LockItemsForRead(false); |
418 | string msg = String.Format("couldn't be found for prim {0}, {1}", m_part.Name, m_part.UUID); | ||
419 | StoreScriptError(itemId, msg); | ||
404 | m_log.ErrorFormat( | 420 | m_log.ErrorFormat( |
405 | "[PRIM INVENTORY]: " + | 421 | "[PRIM INVENTORY]: " + |
406 | "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}", | 422 | "Couldn't start script with ID {0} since it {1}", itemId, msg); |
407 | itemId, m_part.Name, m_part.UUID); | ||
408 | } | 423 | } |
409 | 424 | ||
410 | } | 425 | } |
411 | 426 | ||
427 | public ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) | ||
428 | { | ||
429 | ArrayList errors; | ||
430 | |||
431 | lock (m_scriptErrors) | ||
432 | { | ||
433 | m_scriptErrors.Remove(itemId); | ||
434 | } | ||
435 | CreateScriptInstance(itemId, startParam, postOnRez, engine, stateSource); | ||
436 | lock (m_scriptErrors) | ||
437 | { | ||
438 | while (!m_scriptErrors.TryGetValue(itemId, out errors)) | ||
439 | { | ||
440 | if (!System.Threading.Monitor.Wait(m_scriptErrors, 15000)) | ||
441 | { | ||
442 | m_log.ErrorFormat( | ||
443 | "[PRIM INVENTORY]: " + | ||
444 | "timedout waiting for script {0} errors", itemId); | ||
445 | if (!m_scriptErrors.TryGetValue(itemId, out errors)) | ||
446 | { | ||
447 | errors = new ArrayList(1); | ||
448 | errors.Add("timedout waiting for errors"); | ||
449 | } | ||
450 | break; | ||
451 | } | ||
452 | } | ||
453 | m_scriptErrors.Remove(itemId); | ||
454 | } | ||
455 | return errors; | ||
456 | } | ||
457 | private void StoreScriptErrors(UUID itemId, ArrayList errors) | ||
458 | { | ||
459 | lock (m_scriptErrors) | ||
460 | { | ||
461 | m_scriptErrors[itemId] = errors; | ||
462 | System.Threading.Monitor.PulseAll(m_scriptErrors); | ||
463 | } | ||
464 | } | ||
465 | private void StoreScriptError(UUID itemId, string message) | ||
466 | { | ||
467 | ArrayList errors = new ArrayList(1); | ||
468 | errors.Add(message); | ||
469 | StoreScriptErrors(itemId, errors); | ||
470 | } | ||
471 | |||
412 | /// <summary> | 472 | /// <summary> |
413 | /// Stop a script which is in this prim's inventory. | 473 | /// Stop a script which is in this prim's inventory. |
414 | /// </summary> | 474 | /// </summary> |
diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs index e8894f7..01c3f81 100644 --- a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs | |||
@@ -180,6 +180,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
180 | internal int m_material = (int)Material.Wood; | 180 | internal int m_material = (int)Material.Wood; |
181 | 181 | ||
182 | private int frcount = 0; // Used to limit dynamics debug output to | 182 | private int frcount = 0; // Used to limit dynamics debug output to |
183 | private int revcount = 0; // Reverse motion while > 0 | ||
183 | 184 | ||
184 | private IntPtr m_body = IntPtr.Zero; | 185 | private IntPtr m_body = IntPtr.Zero; |
185 | 186 | ||
@@ -1888,22 +1889,19 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1888 | 1889 | ||
1889 | public void changemove(float timestep) | 1890 | public void changemove(float timestep) |
1890 | { | 1891 | { |
1891 | //Console.WriteLine("changemove for {0}", m_primName ); | 1892 | //Console.WriteLine("changemove sing/root {0} to {1}", m_primName, _position ); |
1892 | |||
1893 | if (m_isphysical) | 1893 | if (m_isphysical) |
1894 | { | 1894 | { |
1895 | //Console.WriteLine("phys {0} {1} {2}", m_disabled, m_taintremove, childPrim); | 1895 | //Console.WriteLine("phys {0} {1} {2}", m_disabled, m_taintremove, childPrim); |
1896 | // if (!m_disabled && !m_taintremove && !childPrim) After one edit m_disabled is sometimes set, disabling further edits! | 1896 | // if (!m_disabled && !m_taintremove && !childPrim) After one edit m_disabled is sometimes set, disabling further edits! |
1897 | if (!m_taintremove && !childPrim) | 1897 | if (!m_taintremove && !childPrim) |
1898 | { | 1898 | { |
1899 | //Console.WriteLine("physOK"); | ||
1900 | if (Body == IntPtr.Zero) | 1899 | if (Body == IntPtr.Zero) |
1901 | enableBody(); | 1900 | enableBody(); |
1902 | //Prim auto disable after 20 frames, | 1901 | //Prim auto disable after 20 frames, |
1903 | //if you move it, re-enable the prim manually. | 1902 | //if you move it, re-enable the prim manually. |
1904 | if (_parent != null) | 1903 | if (_parent != null) |
1905 | { | 1904 | { |
1906 | //Console.WriteLine("physChild"); | ||
1907 | if (m_linkJoint != IntPtr.Zero) | 1905 | if (m_linkJoint != IntPtr.Zero) |
1908 | { | 1906 | { |
1909 | d.JointDestroy(m_linkJoint); | 1907 | d.JointDestroy(m_linkJoint); |
@@ -1912,7 +1910,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1912 | } | 1910 | } |
1913 | if (Body != IntPtr.Zero) | 1911 | if (Body != IntPtr.Zero) |
1914 | { | 1912 | { |
1915 | //Console.WriteLine("physNotIPZ"); | ||
1916 | d.BodySetPosition(Body, _position.X, _position.Y, _position.Z); | 1913 | d.BodySetPosition(Body, _position.X, _position.Y, _position.Z); |
1917 | 1914 | ||
1918 | if (_parent != null) | 1915 | if (_parent != null) |
@@ -1945,7 +1942,6 @@ Console.WriteLine(" JointCreateFixed"); | |||
1945 | } | 1942 | } |
1946 | else | 1943 | else |
1947 | { | 1944 | { |
1948 | //Console.WriteLine("NONphys"); | ||
1949 | // string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); | 1945 | // string primScenAvatarIn = _parent_scene.whichspaceamIin(_position); |
1950 | // int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); | 1946 | // int[] arrayitem = _parent_scene.calculateSpaceArrayItemFromPos(_position); |
1951 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | 1947 | _parent_scene.waitForSpaceUnlock(m_targetSpace); |
@@ -2382,9 +2378,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2382 | if (IsPhysical) | 2378 | if (IsPhysical) |
2383 | { | 2379 | { |
2384 | if (Body != IntPtr.Zero) | 2380 | if (Body != IntPtr.Zero) |
2385 | { | ||
2386 | d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); | 2381 | d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); |
2387 | } | ||
2388 | } | 2382 | } |
2389 | 2383 | ||
2390 | //resetCollisionAccounting(); | 2384 | //resetCollisionAccounting(); |
@@ -2394,31 +2388,9 @@ Console.WriteLine(" JointCreateFixed"); | |||
2394 | 2388 | ||
2395 | public void UpdatePositionAndVelocity() | 2389 | public void UpdatePositionAndVelocity() |
2396 | { | 2390 | { |
2397 | return; // moved to the Move() method | 2391 | return; // moved to the Move () method |
2398 | } | ||
2399 | /* No one uses this? | ||
2400 | public Matrix4 FromDMass(d.Mass pMass) | ||
2401 | { | ||
2402 | Matrix4 obj; | ||
2403 | obj.M11 = pMass.I.M00; | ||
2404 | obj.M12 = pMass.I.M01; | ||
2405 | obj.M13 = pMass.I.M02; | ||
2406 | obj.M14 = 0; | ||
2407 | obj.M21 = pMass.I.M10; | ||
2408 | obj.M22 = pMass.I.M11; | ||
2409 | obj.M23 = pMass.I.M12; | ||
2410 | obj.M24 = 0; | ||
2411 | obj.M31 = pMass.I.M20; | ||
2412 | obj.M32 = pMass.I.M21; | ||
2413 | obj.M33 = pMass.I.M22; | ||
2414 | obj.M34 = 0; | ||
2415 | obj.M41 = 0; | ||
2416 | obj.M42 = 0; | ||
2417 | obj.M43 = 0; | ||
2418 | obj.M44 = 1; | ||
2419 | return obj; | ||
2420 | } | 2392 | } |
2421 | */ | 2393 | |
2422 | public d.Mass FromMatrix4(Matrix4 pMat, ref d.Mass obj) | 2394 | public d.Mass FromMatrix4(Matrix4 pMat, ref d.Mass obj) |
2423 | { | 2395 | { |
2424 | obj.I.M00 = pMat[0, 0]; | 2396 | obj.I.M00 = pMat[0, 0]; |
@@ -2654,15 +2626,15 @@ Console.WriteLine(" JointCreateFixed"); | |||
2654 | // m_angularDeflectionEfficiency = pValue; | 2626 | // m_angularDeflectionEfficiency = pValue; |
2655 | break; | 2627 | break; |
2656 | case Vehicle.ANGULAR_DEFLECTION_TIMESCALE: | 2628 | case Vehicle.ANGULAR_DEFLECTION_TIMESCALE: |
2657 | if (pValue < 0.01f) pValue = 0.01f; | 2629 | if (pValue < 0.1f) pValue = 0.1f; |
2658 | // m_angularDeflectionTimescale = pValue; | 2630 | // m_angularDeflectionTimescale = pValue; |
2659 | break; | 2631 | break; |
2660 | case Vehicle.ANGULAR_MOTOR_DECAY_TIMESCALE: | 2632 | case Vehicle.ANGULAR_MOTOR_DECAY_TIMESCALE: |
2661 | if (pValue < 0.01f) pValue = 0.01f; | 2633 | if (pValue < 0.3f) pValue = 0.3f; |
2662 | m_angularMotorDecayTimescale = pValue; | 2634 | m_angularMotorDecayTimescale = pValue; |
2663 | break; | 2635 | break; |
2664 | case Vehicle.ANGULAR_MOTOR_TIMESCALE: | 2636 | case Vehicle.ANGULAR_MOTOR_TIMESCALE: |
2665 | if (pValue < 0.01f) pValue = 0.01f; | 2637 | if (pValue < 0.3f) pValue = 0.3f; |
2666 | m_angularMotorTimescale = pValue; | 2638 | m_angularMotorTimescale = pValue; |
2667 | break; | 2639 | break; |
2668 | case Vehicle.BANKING_EFFICIENCY: | 2640 | case Vehicle.BANKING_EFFICIENCY: |
@@ -2691,7 +2663,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2691 | m_VhoverHeight = pValue; | 2663 | m_VhoverHeight = pValue; |
2692 | break; | 2664 | break; |
2693 | case Vehicle.HOVER_TIMESCALE: | 2665 | case Vehicle.HOVER_TIMESCALE: |
2694 | if (pValue < 0.01f) pValue = 0.01f; | 2666 | if (pValue < 0.1f) pValue = 0.1f; |
2695 | m_VhoverTimescale = pValue; | 2667 | m_VhoverTimescale = pValue; |
2696 | break; | 2668 | break; |
2697 | case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: | 2669 | case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: |
@@ -2703,11 +2675,11 @@ Console.WriteLine(" JointCreateFixed"); | |||
2703 | // m_linearDeflectionTimescale = pValue; | 2675 | // m_linearDeflectionTimescale = pValue; |
2704 | break; | 2676 | break; |
2705 | case Vehicle.LINEAR_MOTOR_DECAY_TIMESCALE: | 2677 | case Vehicle.LINEAR_MOTOR_DECAY_TIMESCALE: |
2706 | if (pValue < 0.01f) pValue = 0.01f; | 2678 | if (pValue < 0.3f) pValue = 0.3f; |
2707 | m_linearMotorDecayTimescale = pValue; | 2679 | m_linearMotorDecayTimescale = pValue; |
2708 | break; | 2680 | break; |
2709 | case Vehicle.LINEAR_MOTOR_TIMESCALE: | 2681 | case Vehicle.LINEAR_MOTOR_TIMESCALE: |
2710 | if (pValue < 0.01f) pValue = 0.01f; | 2682 | if (pValue < 0.1f) pValue = 0.1f; |
2711 | m_linearMotorTimescale = pValue; | 2683 | m_linearMotorTimescale = pValue; |
2712 | break; | 2684 | break; |
2713 | case Vehicle.VERTICAL_ATTRACTION_EFFICIENCY: | 2685 | case Vehicle.VERTICAL_ATTRACTION_EFFICIENCY: |
@@ -2716,7 +2688,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2716 | m_verticalAttractionEfficiency = pValue; | 2688 | m_verticalAttractionEfficiency = pValue; |
2717 | break; | 2689 | break; |
2718 | case Vehicle.VERTICAL_ATTRACTION_TIMESCALE: | 2690 | case Vehicle.VERTICAL_ATTRACTION_TIMESCALE: |
2719 | if (pValue < 0.01f) pValue = 0.01f; | 2691 | if (pValue < 0.1f) pValue = 0.1f; |
2720 | m_verticalAttractionTimescale = pValue; | 2692 | m_verticalAttractionTimescale = pValue; |
2721 | break; | 2693 | break; |
2722 | 2694 | ||
@@ -2732,6 +2704,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2732 | UpdateAngDecay(); | 2704 | UpdateAngDecay(); |
2733 | break; | 2705 | break; |
2734 | case Vehicle.LINEAR_FRICTION_TIMESCALE: | 2706 | case Vehicle.LINEAR_FRICTION_TIMESCALE: |
2707 | if (pValue < 0.1f) pValue = 0.1f; | ||
2735 | m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue); | 2708 | m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue); |
2736 | break; | 2709 | break; |
2737 | case Vehicle.LINEAR_MOTOR_DIRECTION: | 2710 | case Vehicle.LINEAR_MOTOR_DIRECTION: |
@@ -2771,6 +2744,9 @@ Console.WriteLine(" JointCreateFixed"); | |||
2771 | UpdateAngDecay(); | 2744 | UpdateAngDecay(); |
2772 | break; | 2745 | break; |
2773 | case Vehicle.LINEAR_FRICTION_TIMESCALE: | 2746 | case Vehicle.LINEAR_FRICTION_TIMESCALE: |
2747 | if (pValue.X < 0.1f) pValue.X = 0.1f; | ||
2748 | if (pValue.Y < 0.1f) pValue.Y = 0.1f; | ||
2749 | if (pValue.Z < 0.1f) pValue.Z = 0.1f; | ||
2774 | m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); | 2750 | m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); |
2775 | break; | 2751 | break; |
2776 | case Vehicle.LINEAR_MOTOR_DIRECTION: | 2752 | case Vehicle.LINEAR_MOTOR_DIRECTION: |
@@ -2967,7 +2943,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
2967 | 2943 | ||
2968 | internal void Halt() | 2944 | internal void Halt() |
2969 | { // Kill all motions, when non-physical | 2945 | { // Kill all motions, when non-physical |
2970 | m_linearMotorDirection = Vector3.Zero; | 2946 | // m_linearMotorDirection = Vector3.Zero; |
2971 | m_lLinMotorDVel = Vector3.Zero; | 2947 | m_lLinMotorDVel = Vector3.Zero; |
2972 | m_lLinObjectVel = Vector3.Zero; | 2948 | m_lLinObjectVel = Vector3.Zero; |
2973 | m_wLinObjectVel = Vector3.Zero; | 2949 | m_wLinObjectVel = Vector3.Zero; |
@@ -2979,16 +2955,22 @@ Console.WriteLine(" JointCreateFixed"); | |||
2979 | 2955 | ||
2980 | private void UpdateLinDecay() | 2956 | private void UpdateLinDecay() |
2981 | { | 2957 | { |
2982 | if (Math.Abs(m_linearMotorDirection.X) > Math.Abs(m_lLinMotorDVel.X)) m_lLinMotorDVel.X = m_linearMotorDirection.X; | 2958 | // if (Math.Abs(m_linearMotorDirection.X) > Math.Abs(m_lLinMotorDVel.X)) m_lLinMotorDVel.X = m_linearMotorDirection.X; |
2983 | if (Math.Abs(m_linearMotorDirection.Y) > Math.Abs(m_lLinMotorDVel.Y)) m_lLinMotorDVel.Y = m_linearMotorDirection.Y; | 2959 | // if (Math.Abs(m_linearMotorDirection.Y) > Math.Abs(m_lLinMotorDVel.Y)) m_lLinMotorDVel.Y = m_linearMotorDirection.Y; |
2984 | if (Math.Abs(m_linearMotorDirection.Z) > Math.Abs(m_lLinMotorDVel.Z)) m_lLinMotorDVel.Z = m_linearMotorDirection.Z; | 2960 | // if (Math.Abs(m_linearMotorDirection.Z) > Math.Abs(m_lLinMotorDVel.Z)) m_lLinMotorDVel.Z = m_linearMotorDirection.Z; |
2961 | m_lLinMotorDVel.X = m_linearMotorDirection.X; | ||
2962 | m_lLinMotorDVel.Y = m_linearMotorDirection.Y; | ||
2963 | m_lLinMotorDVel.Z = m_linearMotorDirection.Z; | ||
2985 | } // else let the motor decay on its own | 2964 | } // else let the motor decay on its own |
2986 | 2965 | ||
2987 | private void UpdateAngDecay() | 2966 | private void UpdateAngDecay() |
2988 | { | 2967 | { |
2989 | if (Math.Abs(m_angularMotorDirection.X) > Math.Abs(m_angularMotorDVel.X)) m_angularMotorDVel.X = m_angularMotorDirection.X; | 2968 | // if (Math.Abs(m_angularMotorDirection.X) > Math.Abs(m_angularMotorDVel.X)) m_angularMotorDVel.X = m_angularMotorDirection.X; |
2990 | if (Math.Abs(m_angularMotorDirection.Y) > Math.Abs(m_angularMotorDVel.Y)) m_angularMotorDVel.Y = m_angularMotorDirection.Y; | 2969 | // if (Math.Abs(m_angularMotorDirection.Y) > Math.Abs(m_angularMotorDVel.Y)) m_angularMotorDVel.Y = m_angularMotorDirection.Y; |
2991 | if (Math.Abs(m_angularMotorDirection.Z) > Math.Abs(m_angularMotorDVel.Z)) m_angularMotorDVel.Z = m_angularMotorDirection.Z; | 2970 | // if (Math.Abs(m_angularMotorDirection.Z) > Math.Abs(m_angularMotorDVel.Z)) m_angularMotorDVel.Z = m_angularMotorDirection.Z; |
2971 | m_angularMotorDVel.X = m_angularMotorDirection.X; | ||
2972 | m_angularMotorDVel.Y = m_angularMotorDirection.Y; | ||
2973 | m_angularMotorDVel.Z = m_angularMotorDirection.Z; | ||
2992 | } // else let the motor decay on its own | 2974 | } // else let the motor decay on its own |
2993 | 2975 | ||
2994 | public void Move(float timestep) | 2976 | public void Move(float timestep) |
@@ -2996,44 +2978,114 @@ Console.WriteLine(" JointCreateFixed"); | |||
2996 | float fx = 0; | 2978 | float fx = 0; |
2997 | float fy = 0; | 2979 | float fy = 0; |
2998 | float fz = 0; | 2980 | float fz = 0; |
2981 | Vector3 linvel; // velocity applied, including any reversal | ||
2982 | int outside = 0; | ||
2983 | |||
2984 | // If geomCrossingFailuresBeforeOutofbounds is set to 0 in OpenSim.ini then phys objects bounce off region borders. | ||
2985 | // This is a temp patch until proper region crossing is developed. | ||
2986 | |||
2987 | int failureLimit = _parent_scene.geomCrossingFailuresBeforeOutofbounds; | ||
2988 | int fence = _parent_scene.geomRegionFence; | ||
2989 | |||
2990 | float border_limit = 0.05f; // original limit | ||
2991 | if (fence == 1) border_limit = 0.5f; // bounce point | ||
2999 | 2992 | ||
3000 | frcount++; // used to limit debug comment output | 2993 | frcount++; // used to limit debug comment output |
3001 | if (frcount > 100) | 2994 | if (frcount > 10) |
3002 | frcount = 0; | 2995 | frcount = 0; |
3003 | 2996 | ||
3004 | if (IsPhysical && (Body != IntPtr.Zero) && !m_isSelected && !childPrim) // KF: Only move root prims. | 2997 | if(revcount > 0) revcount--; |
2998 | |||
2999 | if (IsPhysical && (Body != IntPtr.Zero) && !m_isSelected && !childPrim) // Only move root prims. | ||
3005 | { | 3000 | { |
3006 | 3001 | // Old public void UpdatePositionAndVelocity(), more accuratley calculated here | |
3007 | // Old public void UpdatePositionAndVelocity(), more accuratley calculated here | ||
3008 | bool lastZeroFlag = _zeroFlag; // was it stopped | 3002 | bool lastZeroFlag = _zeroFlag; // was it stopped |
3003 | |||
3009 | d.Vector3 vec = d.BodyGetPosition(Body); | 3004 | d.Vector3 vec = d.BodyGetPosition(Body); |
3010 | d.Quaternion ori = d.BodyGetQuaternion(Body); | ||
3011 | d.Vector3 vel = d.BodyGetLinearVel(Body); | ||
3012 | // d.Vector3 rotvel = d.BodyGetAngularVel(Body); | ||
3013 | d.Vector3 torque = d.BodyGetTorque(Body); | ||
3014 | _torque = new Vector3(torque.X, torque.Y, torque.Z); | ||
3015 | Vector3 l_position = Vector3.Zero; | 3005 | Vector3 l_position = Vector3.Zero; |
3016 | Quaternion l_orientation = Quaternion.Identity; | ||
3017 | |||
3018 | m_lastposition = _position; | ||
3019 | m_lastorientation = _orientation; | ||
3020 | |||
3021 | l_position.X = vec.X; | 3006 | l_position.X = vec.X; |
3022 | l_position.Y = vec.Y; | 3007 | l_position.Y = vec.Y; |
3023 | l_position.Z = vec.Z; | 3008 | l_position.Z = vec.Z; |
3024 | l_orientation.X = ori.X; | 3009 | m_lastposition = _position; |
3025 | l_orientation.Y = ori.Y; | 3010 | _position = l_position; |
3026 | l_orientation.Z = ori.Z; | 3011 | |
3027 | l_orientation.W = ori.W; | 3012 | d.Quaternion ori = d.BodyGetQuaternion(Body); |
3013 | // Quaternion l_orientation = Quaternion.Identity; | ||
3014 | _orientation.X = ori.X; | ||
3015 | _orientation.Y = ori.Y; | ||
3016 | _orientation.Z = ori.Z; | ||
3017 | _orientation.W = ori.W; | ||
3018 | m_lastorientation = _orientation; | ||
3019 | |||
3020 | d.Vector3 vel = d.BodyGetLinearVel(Body); | ||
3021 | m_lastVelocity = _velocity; | ||
3022 | _velocity.X = vel.X; | ||
3023 | _velocity.Y = vel.Y; | ||
3024 | _velocity.Z = vel.Z; | ||
3025 | _acceleration = ((_velocity - m_lastVelocity) / timestep); | ||
3026 | |||
3027 | d.Vector3 torque = d.BodyGetTorque(Body); | ||
3028 | _torque = new Vector3(torque.X, torque.Y, torque.Z); | ||
3029 | |||
3030 | base.RequestPhysicsterseUpdate(); | ||
3031 | |||
3028 | //Console.WriteLine("Move {0} at {1}", m_primName, l_position); | 3032 | //Console.WriteLine("Move {0} at {1}", m_primName, l_position); |
3029 | 3033 | ||
3030 | // Check if outside region horizontally | 3034 | // Check if outside region |
3031 | if (l_position.X > ((int)_parent_scene.WorldExtents.X - 0.05f) || | 3035 | // In Scene.cs/CrossPrimGroupIntoNewRegion the object is checked for 0.1M from border! |
3032 | l_position.X < 0f || | 3036 | if (l_position.X > ((float)_parent_scene.WorldExtents.X - border_limit)) |
3033 | l_position.Y > ((int)_parent_scene.WorldExtents.Y - 0.05f) || | 3037 | { |
3034 | l_position.Y < 0f) | 3038 | l_position.X = ((float)_parent_scene.WorldExtents.X - border_limit); |
3039 | outside = 1; | ||
3040 | } | ||
3041 | |||
3042 | if (l_position.X < border_limit) | ||
3043 | { | ||
3044 | l_position.X = border_limit; | ||
3045 | outside = 2; | ||
3046 | } | ||
3047 | if (l_position.Y > ((float)_parent_scene.WorldExtents.Y - border_limit)) | ||
3048 | { | ||
3049 | l_position.Y = ((float)_parent_scene.WorldExtents.Y - border_limit); | ||
3050 | outside = 3; | ||
3051 | } | ||
3052 | |||
3053 | if (l_position.Y < border_limit) | ||
3035 | { | 3054 | { |
3036 | if (m_crossingfailures < _parent_scene.geomCrossingFailuresBeforeOutofbounds) | 3055 | l_position.Y = border_limit; |
3056 | outside = 4; | ||
3057 | } | ||
3058 | |||
3059 | if (outside > 0) | ||
3060 | { | ||
3061 | //Console.WriteLine(" fence = {0}",fence); | ||
3062 | |||
3063 | //Console.WriteLine("Border {0}", l_position); | ||
3064 | if (fence == 1) // bounce object off boundary | ||
3065 | { | ||
3066 | if (revcount == 0) | ||
3067 | { | ||
3068 | if (outside < 3) | ||
3069 | { | ||
3070 | _velocity.X = -_velocity.X; | ||
3071 | } | ||
3072 | else | ||
3073 | { | ||
3074 | _velocity.Y = -_velocity.Y; | ||
3075 | } | ||
3076 | if (m_type != Vehicle.TYPE_NONE) Halt(); | ||
3077 | _position = l_position; | ||
3078 | m_taintposition = _position; | ||
3079 | m_lastVelocity = _velocity; | ||
3080 | _acceleration = Vector3.Zero; | ||
3081 | d.BodySetPosition(Body, _position.X, _position.Y, _position.Z); | ||
3082 | d.BodySetLinearVel(Body, _velocity.X, _velocity.Y, _velocity.Z); | ||
3083 | base.RequestPhysicsterseUpdate(); | ||
3084 | |||
3085 | revcount = 25; // wait for object to move away from border | ||
3086 | } | ||
3087 | } // else old crossing mode | ||
3088 | else if (m_crossingfailures < failureLimit) | ||
3037 | { // keep trying to cross? | 3089 | { // keep trying to cross? |
3038 | _position = l_position; | 3090 | _position = l_position; |
3039 | //_parent_scene.remActivePrim(this); | 3091 | //_parent_scene.remActivePrim(this); |
@@ -3043,9 +3095,12 @@ Console.WriteLine(" JointCreateFixed"); | |||
3043 | else | 3095 | else |
3044 | { // Too many tries | 3096 | { // Too many tries |
3045 | if (_parent == null) base.RaiseOutOfBounds(l_position); | 3097 | if (_parent == null) base.RaiseOutOfBounds(l_position); |
3098 | //Console.WriteLine("ROOB 2"); | ||
3099 | |||
3046 | return; // Dont process any other motion? | 3100 | return; // Dont process any other motion? |
3047 | } | 3101 | } // end various methods |
3048 | } // end outside region horizontally | 3102 | } // end outside region horizontally |
3103 | |||
3049 | 3104 | ||
3050 | if (l_position.Z < 0) | 3105 | if (l_position.Z < 0) |
3051 | { | 3106 | { |
@@ -3057,6 +3112,8 @@ Console.WriteLine(" JointCreateFixed"); | |||
3057 | 3112 | ||
3058 | //IsPhysical = false; | 3113 | //IsPhysical = false; |
3059 | if (_parent == null) base.RaiseOutOfBounds(_position); | 3114 | if (_parent == null) base.RaiseOutOfBounds(_position); |
3115 | //Console.WriteLine("ROOB 3"); | ||
3116 | |||
3060 | 3117 | ||
3061 | _acceleration.X = 0; // This stuff may stop client display but it has no | 3118 | _acceleration.X = 0; // This stuff may stop client display but it has no |
3062 | _acceleration.Y = 0; // effect on the object in phys engine! | 3119 | _acceleration.Y = 0; // effect on the object in phys engine! |
@@ -3081,10 +3138,9 @@ Console.WriteLine(" JointCreateFixed"); | |||
3081 | if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02) | 3138 | if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02) |
3082 | && (Math.Abs(m_lastposition.Y - l_position.Y) < 0.02) | 3139 | && (Math.Abs(m_lastposition.Y - l_position.Y) < 0.02) |
3083 | && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02) | 3140 | && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02) |
3084 | && (1.0 - Math.Abs(Quaternion.Dot(m_lastorientation, l_orientation)) < 0.0001)) // KF 0.01 is far to large | 3141 | && (1.0 - Math.Abs(Quaternion.Dot(m_lastorientation, _orientation)) < 0.0001)) // KF 0.01 is far to large |
3085 | { | 3142 | { |
3086 | _zeroFlag = true; | 3143 | _zeroFlag = true; |
3087 | //Console.WriteLine("ZFT 2"); | ||
3088 | m_throttleUpdates = false; | 3144 | m_throttleUpdates = false; |
3089 | } | 3145 | } |
3090 | else | 3146 | else |
@@ -3104,10 +3160,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
3104 | _acceleration.X = 0; | 3160 | _acceleration.X = 0; |
3105 | _acceleration.Y = 0; | 3161 | _acceleration.Y = 0; |
3106 | _acceleration.Z = 0; | 3162 | _acceleration.Z = 0; |
3107 | //_orientation.w = 0f; | 3163 | |
3108 | //_orientation.X = 0f; | ||
3109 | //_orientation.Y = 0f; | ||
3110 | //_orientation.Z = 0f; | ||
3111 | m_rotationalVelocity.X = 0; | 3164 | m_rotationalVelocity.X = 0; |
3112 | m_rotationalVelocity.Y = 0; | 3165 | m_rotationalVelocity.Y = 0; |
3113 | m_rotationalVelocity.Z = 0; | 3166 | m_rotationalVelocity.Z = 0; |
@@ -3132,26 +3185,6 @@ Console.WriteLine(" JointCreateFixed"); | |||
3132 | base.RequestPhysicsterseUpdate(); | 3185 | base.RequestPhysicsterseUpdate(); |
3133 | } | 3186 | } |
3134 | } | 3187 | } |
3135 | |||
3136 | m_lastVelocity = _velocity; | ||
3137 | |||
3138 | _position = l_position; | ||
3139 | |||
3140 | _velocity.X = vel.X; | ||
3141 | _velocity.Y = vel.Y; | ||
3142 | _velocity.Z = vel.Z; | ||
3143 | // Why 2 calcs??? | ||
3144 | // _acceleration = ((_velocity - m_lastVelocity) / 0.1f); | ||
3145 | // _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, | ||
3146 | // _velocity.Y - m_lastVelocity.Y / 0.1f, | ||
3147 | // _velocity.Z - m_lastVelocity.Z / 0.1f); | ||
3148 | |||
3149 | _acceleration = ((_velocity - m_lastVelocity) / timestep); | ||
3150 | |||
3151 | _orientation.X = ori.X; | ||
3152 | _orientation.Y = ori.Y; | ||
3153 | _orientation.Z = ori.Z; | ||
3154 | _orientation.W = ori.W; | ||
3155 | m_lastUpdateSent = false; | 3188 | m_lastUpdateSent = false; |
3156 | if (!m_throttleUpdates || throttleCounter > _parent_scene.geomUpdatesPerThrottledUpdate) | 3189 | if (!m_throttleUpdates || throttleCounter > _parent_scene.geomUpdatesPerThrottledUpdate) |
3157 | { | 3190 | { |
@@ -3167,11 +3200,8 @@ Console.WriteLine(" JointCreateFixed"); | |||
3167 | } | 3200 | } |
3168 | m_lastposition = l_position; | 3201 | m_lastposition = l_position; |
3169 | 3202 | ||
3170 | /// End of old UpdatePositionAndVelocity insert | 3203 | /// End UpdatePositionAndVelocity insert |
3171 | 3204 | ||
3172 | //if (!Acceleration.ApproxEquals(Vector3.Zero, 0.01f)) Console.WriteLine("Move " + m_primName + " Accel=" + Acceleration); | ||
3173 | // if(frcount == 0) Console.WriteLine("Move " + m_primName + " VTyp " + m_type + | ||
3174 | // " usePID=" + m_usePID + " seHover=" + m_useHoverPID + " useAPID=" + m_useAPID); | ||
3175 | if (m_type != Vehicle.TYPE_NONE) | 3205 | if (m_type != Vehicle.TYPE_NONE) |
3176 | { | 3206 | { |
3177 | // get body attitude | 3207 | // get body attitude |
@@ -3202,12 +3232,13 @@ Console.WriteLine(" JointCreateFixed"); | |||
3202 | { | 3232 | { |
3203 | m_lLinMotorDVel = Vector3.Zero; | 3233 | m_lLinMotorDVel = Vector3.Zero; |
3204 | } | 3234 | } |
3205 | else | 3235 | |
3236 | /* else | ||
3206 | { | 3237 | { |
3207 | if (Math.Abs(m_lLinMotorDVel.X) < Math.Abs(m_lLinObjectVel.X)) m_lLinObjectVel.X = m_lLinMotorDVel.X; | 3238 | if (Math.Abs(m_lLinMotorDVel.X) < Math.Abs(m_lLinObjectVel.X)) m_lLinObjectVel.X = m_lLinMotorDVel.X; |
3208 | if (Math.Abs(m_lLinMotorDVel.Y) < Math.Abs(m_lLinObjectVel.Y)) m_lLinObjectVel.Y = m_lLinMotorDVel.Y; | 3239 | if (Math.Abs(m_lLinMotorDVel.Y) < Math.Abs(m_lLinObjectVel.Y)) m_lLinObjectVel.Y = m_lLinMotorDVel.Y; |
3209 | if (Math.Abs(m_lLinMotorDVel.Z) < Math.Abs(m_lLinObjectVel.Z)) m_lLinObjectVel.Z = m_lLinMotorDVel.Z; | 3240 | if (Math.Abs(m_lLinMotorDVel.Z) < Math.Abs(m_lLinObjectVel.Z)) m_lLinObjectVel.Z = m_lLinMotorDVel.Z; |
3210 | } | 3241 | } */ |
3211 | } // end linear motor decay | 3242 | } // end linear motor decay |
3212 | 3243 | ||
3213 | if ( (! m_lLinMotorDVel.ApproxEquals(Vector3.Zero, 0.01f)) || (! m_lLinObjectVel.ApproxEquals(Vector3.Zero, 0.01f)) ) | 3244 | if ( (! m_lLinMotorDVel.ApproxEquals(Vector3.Zero, 0.01f)) || (! m_lLinObjectVel.ApproxEquals(Vector3.Zero, 0.01f)) ) |
@@ -3235,7 +3266,6 @@ Console.WriteLine(" JointCreateFixed"); | |||
3235 | if (m_linearFrictionTimescale.Z < 300.0f) | 3266 | if (m_linearFrictionTimescale.Z < 300.0f) |
3236 | { | 3267 | { |
3237 | float fricfactor = m_linearFrictionTimescale.Z / timestep; | 3268 | float fricfactor = m_linearFrictionTimescale.Z / timestep; |
3238 | //if(frcount == 0) Console.WriteLine("Zfric={0}", fricfactor); | ||
3239 | float fricZ = m_lLinObjectVel.Z / fricfactor; | 3269 | float fricZ = m_lLinObjectVel.Z / fricfactor; |
3240 | m_lLinObjectVel.Z -= fricZ; | 3270 | m_lLinObjectVel.Z -= fricZ; |
3241 | } | 3271 | } |
@@ -3296,14 +3326,17 @@ Console.WriteLine(" JointCreateFixed"); | |||
3296 | } | 3326 | } |
3297 | } | 3327 | } |
3298 | else | 3328 | else |
3299 | { // not hovering, Gravity rules | 3329 | { // not hovering |
3300 | m_wLinObjectVel.Z = vel_now.Z; | 3330 | if (m_wLinObjectVel.Z == 0f) |
3331 | { // Gravity rules | ||
3332 | m_wLinObjectVel.Z = vel_now.Z; | ||
3333 | } // else the motor has it | ||
3301 | } | 3334 | } |
3302 | 3335 | linvel = m_wLinObjectVel; | |
3303 | 3336 | ||
3304 | // Vehicle Linear Motion done ======================================= | 3337 | // Vehicle Linear Motion done ======================================= |
3305 | // Apply velocity | 3338 | // Apply velocity |
3306 | d.BodySetLinearVel(Body, m_wLinObjectVel.X, m_wLinObjectVel.Y, m_wLinObjectVel.Z); | 3339 | d.BodySetLinearVel(Body, linvel.X, linvel.Y, linvel.Z); |
3307 | // apply gravity force | 3340 | // apply gravity force |
3308 | d.BodyAddForce(Body, grav.X, grav.Y, grav.Z); | 3341 | d.BodyAddForce(Body, grav.X, grav.Y, grav.Z); |
3309 | //if(frcount == 0) Console.WriteLine("Grav {0}", grav); | 3342 | //if(frcount == 0) Console.WriteLine("Grav {0}", grav); |
@@ -3626,9 +3659,10 @@ Console.WriteLine(" JointCreateFixed"); | |||
3626 | // react to the physics scene by moving it's position. | 3659 | // react to the physics scene by moving it's position. |
3627 | // Avatar to Avatar collisions | 3660 | // Avatar to Avatar collisions |
3628 | // Prim to avatar collisions | 3661 | // Prim to avatar collisions |
3662 | d.Vector3 dlinvel = vel; | ||
3629 | 3663 | ||
3630 | d.BodySetPosition(Body, pos.X, pos.Y, m_targetHoverHeight); | 3664 | d.BodySetPosition(Body, pos.X, pos.Y, m_targetHoverHeight); |
3631 | d.BodySetLinearVel(Body, vel.X, vel.Y, 0); | 3665 | d.BodySetLinearVel(Body, dlinvel.X, dlinvel.Y, dlinvel.Z); |
3632 | d.BodyAddForce(Body, 0, 0, fz); | 3666 | d.BodyAddForce(Body, 0, 0, fz); |
3633 | //KF this prevents furthur motions return; | 3667 | //KF this prevents furthur motions return; |
3634 | } | 3668 | } |
diff --git a/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs index deb6164..79e2986 100644 --- a/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs | |||
@@ -224,6 +224,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
224 | public float bodyPIDG = 25; | 224 | public float bodyPIDG = 25; |
225 | 225 | ||
226 | public int geomCrossingFailuresBeforeOutofbounds = 5; | 226 | public int geomCrossingFailuresBeforeOutofbounds = 5; |
227 | public int geomRegionFence = 0; | ||
227 | 228 | ||
228 | public float bodyMotorJointMaxforceTensor = 2; | 229 | public float bodyMotorJointMaxforceTensor = 2; |
229 | 230 | ||
@@ -447,6 +448,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
447 | geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); | 448 | geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); |
448 | geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); | 449 | geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); |
449 | geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); | 450 | geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); |
451 | geomRegionFence = physicsconfig.GetInt("region_border_fence", 0); | ||
450 | 452 | ||
451 | geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); | 453 | geomDefaultDensity = physicsconfig.GetFloat("geometry_default_density", 10.000006836f); |
452 | bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); | 454 | bodyFramesAutoDisable = physicsconfig.GetInt("body_frames_auto_disable", 20); |
@@ -3419,76 +3421,56 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
3419 | 3421 | ||
3420 | public void SetTerrain(float[] heightMap, Vector3 pOffset) | 3422 | public void SetTerrain(float[] heightMap, Vector3 pOffset) |
3421 | { | 3423 | { |
3422 | // this._heightmap[i] = (double)heightMap[i]; | ||
3423 | // dbm (danx0r) -- creating a buffer zone of one extra sample all around | ||
3424 | //_origheightmap = heightMap; | ||
3425 | 3424 | ||
3425 | uint regionsize = (uint) Constants.RegionSize; // visible region size eg. 256(M) | ||
3426 | |||
3427 | uint heightmapWidth = regionsize + 1; // ODE map size 257 x 257 (Meters) (1 extra | ||
3428 | uint heightmapHeight = regionsize + 1; | ||
3429 | |||
3430 | uint heightmapWidthSamples = (uint)regionsize + 2; // Sample file size, 258 x 258 samples | ||
3431 | uint heightmapHeightSamples = (uint)regionsize + 2; | ||
3432 | |||
3433 | // Array of height samples for ODE | ||
3426 | float[] _heightmap; | 3434 | float[] _heightmap; |
3435 | _heightmap = new float[(heightmapWidthSamples * heightmapHeightSamples)]; // loaded samples 258 x 258 | ||
3427 | 3436 | ||
3428 | // zero out a heightmap array float array (single dimension [flattened])) | 3437 | // Other ODE parameters |
3429 | //if ((int)Constants.RegionSize == 256) | ||
3430 | // _heightmap = new float[514 * 514]; | ||
3431 | //else | ||
3432 | |||
3433 | _heightmap = new float[(((int)Constants.RegionSize + 2) * ((int)Constants.RegionSize + 2))]; | ||
3434 | |||
3435 | uint heightmapWidth = Constants.RegionSize + 1; | ||
3436 | uint heightmapHeight = Constants.RegionSize + 1; | ||
3437 | |||
3438 | uint heightmapWidthSamples; | ||
3439 | |||
3440 | uint heightmapHeightSamples; | ||
3441 | |||
3442 | //if (((int)Constants.RegionSize) == 256) | ||
3443 | //{ | ||
3444 | // heightmapWidthSamples = 2 * (uint)Constants.RegionSize + 2; | ||
3445 | // heightmapHeightSamples = 2 * (uint)Constants.RegionSize + 2; | ||
3446 | // heightmapWidth++; | ||
3447 | // heightmapHeight++; | ||
3448 | //} | ||
3449 | //else | ||
3450 | //{ | ||
3451 | |||
3452 | heightmapWidthSamples = (uint)Constants.RegionSize + 1; | ||
3453 | heightmapHeightSamples = (uint)Constants.RegionSize + 1; | ||
3454 | //} | ||
3455 | |||
3456 | const float scale = 1.0f; | 3438 | const float scale = 1.0f; |
3457 | const float offset = 0.0f; | 3439 | const float offset = 0.0f; |
3458 | const float thickness = 0.2f; | 3440 | const float thickness = 2.0f; // Was 0.2f, Larger appears to prevent Av fall-through |
3459 | const int wrap = 0; | 3441 | const int wrap = 0; |
3460 | 3442 | ||
3461 | int regionsize = (int) Constants.RegionSize + 2; | 3443 | float hfmin = 2000f; |
3462 | //Double resolution | 3444 | float hfmax = -2000f; |
3463 | //if (((int)Constants.RegionSize) == 256) | 3445 | float minele = 0.0f; // Dont allow -ve heights |
3464 | // heightMap = ResizeTerrain512Interpolation(heightMap); | ||
3465 | |||
3466 | |||
3467 | // if (((int)Constants.RegionSize) == 256 && (int)Constants.RegionSize == 256) | ||
3468 | // regionsize = 512; | ||
3469 | |||
3470 | float hfmin = 2000; | ||
3471 | float hfmax = -2000; | ||
3472 | 3446 | ||
3473 | for (int x = 0; x < heightmapWidthSamples; x++) | 3447 | uint x = 0; |
3448 | uint y = 0; | ||
3449 | uint xx = 0; | ||
3450 | uint yy = 0; | ||
3451 | |||
3452 | // load the height samples array from the heightMap | ||
3453 | for ( x = 0; x < heightmapWidthSamples; x++) // 0 to 257 | ||
3454 | { | ||
3455 | for ( y = 0; y < heightmapHeightSamples; y++) // 0 to 257 | ||
3474 | { | 3456 | { |
3475 | for (int y = 0; y < heightmapHeightSamples; y++) | 3457 | xx = x - 1; |
3476 | { | 3458 | if (xx < 0) xx = 0; |
3477 | int xx = Util.Clip(x - 1, 0, regionsize - 1); | 3459 | if (xx > (regionsize - 1)) xx = regionsize - 1; |
3478 | int yy = Util.Clip(y - 1, 0, regionsize - 1); | 3460 | |
3479 | 3461 | yy = y - 1; | |
3480 | 3462 | if (yy < 0) yy = 0; | |
3481 | float val= heightMap[yy * (int)Constants.RegionSize + xx]; | 3463 | if (yy > (regionsize - 1)) yy = regionsize - 1; |
3482 | _heightmap[x * ((int)Constants.RegionSize + 2) + y] = val; | 3464 | // Input xx = 0 0 1 2 ..... 254 255 255 256 total in |
3483 | 3465 | // Output x = 0 1 2 3 ..... 255 256 257 258 total out | |
3484 | hfmin = (val < hfmin) ? val : hfmin; | 3466 | float val= heightMap[(yy * regionsize) + xx]; // input from heightMap, <0-255 * 256> <0-255> |
3485 | hfmax = (val > hfmax) ? val : hfmax; | 3467 | if (val < minele) val = minele; |
3486 | } | 3468 | _heightmap[x * (regionsize + 2) + y] = val; // samples output to _heightmap, <0-257 * 258> <0-257> |
3469 | hfmin = (val < hfmin) ? val : hfmin; | ||
3470 | hfmax = (val > hfmax) ? val : hfmax; | ||
3487 | } | 3471 | } |
3472 | } | ||
3488 | 3473 | ||
3489 | |||
3490 | |||
3491 | |||
3492 | lock (OdeLock) | 3474 | lock (OdeLock) |
3493 | { | 3475 | { |
3494 | IntPtr GroundGeom = IntPtr.Zero; | 3476 | IntPtr GroundGeom = IntPtr.Zero; |
@@ -3504,19 +3486,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
3504 | d.SpaceRemove(space, GroundGeom); | 3486 | d.SpaceRemove(space, GroundGeom); |
3505 | d.GeomDestroy(GroundGeom); | 3487 | d.GeomDestroy(GroundGeom); |
3506 | } | 3488 | } |
3507 | |||
3508 | } | 3489 | } |
3509 | IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); | 3490 | IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); |
3510 | d.GeomHeightfieldDataBuildSingle(HeightmapData, _heightmap, 0, heightmapWidth + 1, heightmapHeight + 1, | 3491 | d.GeomHeightfieldDataBuildSingle(HeightmapData, _heightmap, 0, |
3511 | (int)heightmapWidthSamples + 1, (int)heightmapHeightSamples + 1, scale, | 3492 | heightmapWidth, heightmapHeight, (int)heightmapWidthSamples, |
3512 | offset, thickness, wrap); | 3493 | (int)heightmapHeightSamples, scale, offset, thickness, wrap); |
3513 | d.GeomHeightfieldDataSetBounds(HeightmapData, hfmin - 1, hfmax + 1); | 3494 | d.GeomHeightfieldDataSetBounds(HeightmapData, hfmin - 1, hfmax + 1); |
3514 | GroundGeom = d.CreateHeightfield(space, HeightmapData, 1); | 3495 | GroundGeom = d.CreateHeightfield(space, HeightmapData, 1); |
3515 | if (GroundGeom != IntPtr.Zero) | 3496 | if (GroundGeom != IntPtr.Zero) |
3516 | { | 3497 | { |
3517 | d.GeomSetCategoryBits(GroundGeom, (int)(CollisionCategories.Land)); | 3498 | d.GeomSetCategoryBits(GroundGeom, (int)(CollisionCategories.Land)); |
3518 | d.GeomSetCollideBits(GroundGeom, (int)(CollisionCategories.Space)); | 3499 | d.GeomSetCollideBits(GroundGeom, (int)(CollisionCategories.Space)); |
3519 | |||
3520 | } | 3500 | } |
3521 | geom_name_map[GroundGeom] = "Terrain"; | 3501 | geom_name_map[GroundGeom] = "Terrain"; |
3522 | 3502 | ||
@@ -3534,7 +3514,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
3534 | 3514 | ||
3535 | d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle); | 3515 | d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle); |
3536 | d.GeomSetRotation(GroundGeom, ref R); | 3516 | d.GeomSetRotation(GroundGeom, ref R); |
3537 | d.GeomSetPosition(GroundGeom, (pOffset.X + ((int)Constants.RegionSize * 0.5f)) - 1, (pOffset.Y + ((int)Constants.RegionSize * 0.5f)) - 1, 0); | 3517 | d.GeomSetPosition(GroundGeom, (pOffset.X + (regionsize * 0.5f)) - 0.5f, (pOffset.Y + (regionsize * 0.5f)) - 0.5f, 0); |
3538 | IntPtr testGround = IntPtr.Zero; | 3518 | IntPtr testGround = IntPtr.Zero; |
3539 | if (RegionTerrain.TryGetValue(pOffset, out testGround)) | 3519 | if (RegionTerrain.TryGetValue(pOffset, out testGround)) |
3540 | { | 3520 | { |
@@ -3542,7 +3522,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
3542 | } | 3522 | } |
3543 | RegionTerrain.Add(pOffset, GroundGeom, GroundGeom); | 3523 | RegionTerrain.Add(pOffset, GroundGeom, GroundGeom); |
3544 | TerrainHeightFieldHeights.Add(GroundGeom,_heightmap); | 3524 | TerrainHeightFieldHeights.Add(GroundGeom,_heightmap); |
3545 | |||
3546 | } | 3525 | } |
3547 | } | 3526 | } |
3548 | 3527 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs index 880ca1b..07cba60 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs | |||
@@ -113,6 +113,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
113 | } | 113 | } |
114 | 114 | ||
115 | /// <summary> | 115 | /// <summary> |
116 | /// Like osGetAgents but returns enough info for a radar | ||
117 | /// </summary> | ||
118 | /// <returns>Strided list of the UUID, position and name of each avatar in the region</returns> | ||
119 | public LSL_List cmGetAvatarList() | ||
120 | { | ||
121 | LSL_List result = new LSL_List(); | ||
122 | World.ForEachScenePresence(delegate (ScenePresence avatar) | ||
123 | { | ||
124 | if (avatar.UUID != m_host.OwnerID) | ||
125 | { | ||
126 | if (avatar.IsChildAgent == false) | ||
127 | { | ||
128 | result.Add(avatar.UUID); | ||
129 | result.Add(avatar.PhysicsActor.Position); | ||
130 | result.Add(avatar.Name); | ||
131 | } | ||
132 | } | ||
133 | }); | ||
134 | return result; | ||
135 | } | ||
136 | |||
137 | /// <summary> | ||
116 | /// Get the current Windlight scene | 138 | /// Get the current Windlight scene |
117 | /// </summary> | 139 | /// </summary> |
118 | /// <returns>List of windlight parameters</returns> | 140 | /// <returns>List of windlight parameters</returns> |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 3f630f4..228e9b8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2881,6 +2881,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2881 | 2881 | ||
2882 | public void llLookAt(LSL_Vector target, double strength, double damping) | 2882 | public void llLookAt(LSL_Vector target, double strength, double damping) |
2883 | { | 2883 | { |
2884 | /* | ||
2884 | m_host.AddScriptLPS(1); | 2885 | m_host.AddScriptLPS(1); |
2885 | // Determine where we are looking from | 2886 | // Determine where we are looking from |
2886 | LSL_Vector from = llGetPos(); | 2887 | LSL_Vector from = llGetPos(); |
@@ -2900,12 +2901,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2900 | // the angles of rotation in radians into rotation value | 2901 | // the angles of rotation in radians into rotation value |
2901 | 2902 | ||
2902 | LSL_Types.Quaternion rot = llEuler2Rot(angle); | 2903 | LSL_Types.Quaternion rot = llEuler2Rot(angle); |
2903 | /* | 2904 | |
2904 | Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); | 2905 | // This would only work if your physics system contains an APID controller: |
2905 | m_host.startLookAt(rotation, (float)damping, (float)strength); | 2906 | // Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); |
2906 | This would only work if your physics system contains an APID controller */ | 2907 | // m_host.startLookAt(rotation, (float)damping, (float)strength); |
2908 | |||
2907 | // Orient the object to the angle calculated | 2909 | // Orient the object to the angle calculated |
2908 | llSetRot(rot); | 2910 | llSetRot(rot); |
2911 | */ | ||
2912 | |||
2913 | //The above code, while nice, doesn't replicate the behaviour of SL and tends to "roll" the object. | ||
2914 | //There's probably a smarter way of doing this, my rotation math-fu is weak. | ||
2915 | // http://bugs.meta7.com/view.php?id=28 | ||
2916 | // - Tom | ||
2917 | |||
2918 | LSL_Rotation newrot = llGetRot() * llRotBetween(new LSL_Vector(1.0d, 0.0d, 0.0d) * llGetRot(), new LSL_Vector(0.0d, 0.0d, -1.0d)); | ||
2919 | llSetRot(newrot * llRotBetween(new LSL_Vector(0.0d,0.0d,1.0d) * newrot, target - llGetPos())); | ||
2920 | |||
2909 | } | 2921 | } |
2910 | 2922 | ||
2911 | public void llRotLookAt(LSL_Rotation target, double strength, double damping) | 2923 | public void llRotLookAt(LSL_Rotation target, double strength, double damping) |
@@ -6222,6 +6234,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6222 | tempf = (float)rules.GetLSLFloatItem(i + 1); | 6234 | tempf = (float)rules.GetLSLFloatItem(i + 1); |
6223 | prules.OuterAngle = (float)tempf; | 6235 | prules.OuterAngle = (float)tempf; |
6224 | break; | 6236 | break; |
6237 | |||
6238 | case (int)ScriptBaseClass.PSYS_SRC_INNERANGLE: | ||
6239 | tempf = (float)rules.GetLSLFloatItem(i + 1); | ||
6240 | prules.InnerAngle = (float)tempf; | ||
6241 | break; | ||
6242 | |||
6243 | case (int)ScriptBaseClass.PSYS_SRC_OUTERANGLE: | ||
6244 | tempf = (float)rules.GetLSLFloatItem(i + 1); | ||
6245 | prules.OuterAngle = (float)tempf; | ||
6246 | break; | ||
6225 | } | 6247 | } |
6226 | 6248 | ||
6227 | } | 6249 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs index f13b6e5..fba27f9 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs | |||
@@ -44,5 +44,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
44 | LSL_List cmGetWindlightScene(LSL_List rules); | 44 | LSL_List cmGetWindlightScene(LSL_List rules); |
45 | int cmSetWindlightScene(LSL_List rules); | 45 | int cmSetWindlightScene(LSL_List rules); |
46 | int cmSetWindlightSceneTargeted(LSL_List rules, key target); | 46 | int cmSetWindlightSceneTargeted(LSL_List rules, key target); |
47 | LSL_List cmGetAvatarList(); | ||
47 | } | 48 | } |
48 | } | 49 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs index c0edaae..aaffbe4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs | |||
@@ -72,5 +72,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
72 | { | 72 | { |
73 | return m_CM_Functions.cmSetWindlightSceneTargeted(rules, target); | 73 | return m_CM_Functions.cmSetWindlightSceneTargeted(rules, target); |
74 | } | 74 | } |
75 | public LSL_List cmGetAvatarList() | ||
76 | { | ||
77 | return m_CM_Functions.cmGetAvatarList(); | ||
78 | } | ||
75 | } | 79 | } |
76 | } | 80 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index ee35fa4..b3e4740 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | |||
@@ -274,6 +274,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
274 | public const int CHANGED_ALLOWED_DROP = 64; | 274 | public const int CHANGED_ALLOWED_DROP = 64; |
275 | public const int CHANGED_OWNER = 128; | 275 | public const int CHANGED_OWNER = 128; |
276 | public const int CHANGED_REGION_RESTART = 256; | 276 | public const int CHANGED_REGION_RESTART = 256; |
277 | public const int CHANGED_REGION_START = 256; //LL Changed the constant from CHANGED_REGION_RESTART | ||
277 | public const int CHANGED_REGION = 512; | 278 | public const int CHANGED_REGION = 512; |
278 | public const int CHANGED_TELEPORT = 1024; | 279 | public const int CHANGED_TELEPORT = 1024; |
279 | public const int CHANGED_ANIMATION = 16384; | 280 | public const int CHANGED_ANIMATION = 16384; |